[plt-scheme] Extensibility of MrEd
At Tue, 09 Sep 2008 09:46:58 -0700, Ben Goetter wrote:
> /* mzscheme extension - hocuspocus.c */
> Scheme_Object* register_hocuspocus(whatever-thunks-to-a-HWND h)
> { /* save away existing wndproc of h, install sniffer proc in its stead */ }
> LRESULT CALLBACK SnifferWndProc(HWND h, UINT msg, WPARAM, LPARAM)
> { /* if msg is one of ours, crack the params and queue a hocuspocus
> callback on h's frame%, else invoke previous proc */ }
>
> The callback needs to end up in the context of the frame% corresponding
> to that particular window, as if it had been dispatched via send in
> Scheme, and should arrive with the same priority as other interactive
> events. At present it's not obvious to me how to do either of these.
At the Scheme level, there's a `get-eventspace' method on
`top-level-window<%>', so you should have access to the relevant
eventspace whenever you have access to a frame's HWND.
Meanwhile, `mred/private/kernel' exports `middle-queue-key'. Its value
is recognized specially by `queue-callback' when supplied as the
"boolean" second argument, and it causes a callback to be added with
the same priority as a GUI event. (Of course, the module
`mred/private/kernel' is meant to be private to MrEd, but if you have
enough privileges to load an extension, then it's probably fine also to
access that module.)
Matthew