[rdnzl-devel] attaching handler / Tablet PC ink/ stroke/ not working
Edi Weitz
edi at agharta.de
Thu Dec 22 21:28:26 UTC 2005
On Thu, 22 Dec 2005 18:47:39 +0100, Edi Weitz <edi at agharta.de> wrote:
> My guess is that this doesn't work because of threading issues -
> .NET is trying to call into Lisp from a thread which wasn't created
> by Lisp.
And I was right. Here's a solution that avoids these problems and
works for me. Files are at the end of this message.
1. Build a DLL (they don't have the threading problems I mentioned -
see link in my earlier email) using LispWorks as usual, something
like (from a console window):
"\Program Files\LispWorks\lispworks-4460.exe" -init deliver.lisp
2. Make sure RDNZL.dll can be found - put it into c:\Windows\System32
for example.
3. Start the DLL as a program:
rundll32 demo.dll,demo
You should now see a window on which you can "draw" using the mouse.
After every fifth stroke a message should come up telling you how many
strokes the app has counted so far.
If you don't have a LispWorks license to deliver executables you can
download the DLL to play with from
<http://nanook.agharta.de/InkDemo.zip>
and start with #2 above.
I don't know how to do that with AllegroCL but I guess Franz' support
will help you. If they come up with a solution it'd be nice if you
could post it here.
Cheers,
Edi.
-------------------- deliver.lisp --------------------
(load-all-patches)
;; modify to match the location of RDNZL on your PC
(load "/home/lisp/RDNZL/load.lisp")
(use-package :rdnzl)
(load (compile-file "tablet.lisp"))
(shutdown-rdnzl)
(deliver 'init "demo" 1
:dll-exports '("demo"))
(quit)
-------------------- tablet.lisp --------------------
(enable-rdnzl-syntax)
(import-types "Microsoft.Ink" "InkOverlay" "InkCollectorStrokeEventHandler")
(import-types "System.Windows.Forms" "Form" "Application" "MessageBox")
(import-type "System.EventHandler")
(use-namespace "Microsoft.Ink")
(use-namespace "System.Windows.Forms")
(use-namespace "System")
(defparameter *stroke-counter* 0)
(defun handle-stroke (object event)
(declare (ignore object event))
(when (zerop (mod (incf *stroke-counter*) 5))
[MessageBox.Show (format nil "~A strokes so far..." *stroke-counter*)]))
(defun demo ()
(let ((window (new "Form"))
(ink-overlay))
(flet ((on-load (object event)
(declare (ignore object event))
(setf ink-overlay (new "InkOverlay" [%Handle window])
[%Enabled ink-overlay] t)
[+Stroke ink-overlay (new "InkCollectorStrokeEventHandler" #'handle-stroke)]))
[+Load window (new "EventHandler" #'on-load)]
[Application.Run window])))
(disable-rdnzl-syntax)
(fli:define-foreign-callable ("demo" :calling-convention :stdcall)
((hwnd w:hwnd)
(hinst w:hinstance)
(string :pointer)
(cmd-show :int))
(declare (ignore hwnd hinst string cmd-show))
(demo))
(defun init ()
(init-rdnzl))
More information about the rdnzl-devel
mailing list