Re-post to the win32-gui-users list, without the zip attachment, so that it goes through.
Rob.
On 30/07/07, Robert May <[EMAIL PROTECTED]> wrote:
> > On 29/07/07, Jan Dubois <[EMAIL PROTECTED]> wrote:
> > > The whole reason for *not* running a message pump is to allow an
> > > embedding application to use PostThreadMessage() too. If we ran a
> > > message pump, we wouldn't know what to do with messages sent to hwnd
> > > NULL that we are not expecting.
>
> On 29/07/07, Robert May <[EMAIL PROTECTED]> wrote:
> > Right. But there are good reasons not to run a full message pump.
> > For example, from a Win32::GUI point of view I really don't want
> > win32_async_check to be dispatching keyboard messages for me - first,
> > I may want to be using a message pump with more complexity that simply
> > doing a TranslateMessage/DispatchMessage - I may want to dela with
> > dialog messages (IsDialogMessage()) and accelerators
> > (IsAcceleleratorMessage()). I think it would be very confusing if,
> > for example, sleep() started behaving like this.
>
> Thinking about this further it would be worse than confusing - it
> would potentially result in incorrect ordering of messages:
>
> Imagine I write XS with thin wrappers to GetMessage, TranslateMessage
> and DispatchMessage, such that I could write perl code somthing like
> this:
>
> while(my $msg = GetMessage()) {
> TranslateMessage($msg);
> DispatchMessage($msg);
> }
>
> Now I can end up in win32_async check between any 2 perl calls, and
> say I had just pulled a WM_KEYDOWN message. TranslateMessage pushes a
> WM_CHAR message onto the top of the queue. If I end up in
> win32_async_check between the TranslateMessage and DispatchMessage
> calls, and it pumps keyboard messages, then the WM_CHAR will be
> delivered before the WM_KEYDOWN. This would at best be confusing, and
> more likely break applications.
>
> I think the approach that win32_async_check takes currently is almost OK.
>
> Attached is a patch to win32.c (against AS build 819). It implements
> most of what I've talked about, plus a few other bits.
>
> Highlights:
>
> - QS_SENDMESSAGE added to wim32_msgwait to solve the DDE problem.
>
> - I've left QS_ALLMESSAGES in win32_msgwait, rather than using the
> QS_POSTMESSAGE|QS_TIMER that we did in build 820 and blead, I think
> it's better.
>
> - I've wrapped the PostMessage(.... PM_NOREMOVE) in win32_async check
> in a while() loop, to ensure that all messages get marked read - I can
> see occasions when there are multiple messages in the queue, and
> win32_msgwait/win32_async_check spin a couple of time to mark them all
> read, we now only get one loop. I've re-factored the function to move
> the PeekMessage loop to the end, so that I don't have to have it and
> the signal dispatch code twice.
> added another PostMessage loop (this is now very similar to the patch
> I proposed to solve the bug that caused use to change the QS_* flags
> for build 820/bleed.
>
> - the message pump part of win32_async_check now re-posts WM_QUIT
> messages (needed to play nicely with other message loops)
>
> - I've moved the message handling from win32_async_check to it's own
> function: win32_process_messages(), which can process either thread or
> window messages.
>
> - I've created a windows class for our message window, and made it's
> window procedure call win32_process_messages(). win32_async_check() now
> does a Translate/Dispatch message if we have a message window. This
> means that if we have a message window we won't lose messages from
> someone else's message loop.
>
> - I've added a hook procedure to handle the thread messages, if we
> don't have a message window. win32_async_check calls it using
> CallMsgFilter if it ever retrieves a thread message. This now means
> that we won't lose any thread messages in other modal loops, so long
> as those loops do a CallMsgFilter() - All Win32 OS modal loops do
> this (including message boxes, menus, window-resizing/moving etc.);
> we should encourage all other GUI packages (e.g. Tk,
> Win32::GUI) to make this call at appropriate times.
>
> - The hook procedure passes thread messages that we might be
> interested in to win32_process_message, and returns true if we process it;
> it passes it along the hook chain if we don't process it. This allows someone
> else using thread messages, in the case where we don't have a message
> window, to call SetWindowsHookEx to install their own handler to catch
> thread messages that we pull off the message queue.
>
> I think I've covered most bases. I can't run the test suite, as it
> throws too many errors on Win98. I'll try to do it on Win2K in the
> next couple of days.
>
> I also attach a couple of scripts that exhibit some of the
> problems I was trying to eliminate. They are documented in the
> scripts themselves.
>
> Still TODO:
> - I need help getting some of the
> PERL_IMPLICIT_CONTEXT/MULTIPLICITY/whatever ifdefs right. The context
> passing is a bit complex, as we can't change the signature for the
> window procedure callback to include a context, but I've coded a way
> round this.
> - I'd like to see us using registered messages rather than WM_USER_*
> macros. This would avoid us ever clashing with someone else's message
> numbers (this is only a potential problem for thread messages, not
> when we have a message window)
>
> A lot of the complexity of the context passing could be removed if we
> were to agree to take the hit of doing a dTHX; in
> win32_process_message. We don't go in there very often (only for
> alarms, kills and forks (and thread creation?). Perhaps the overhead
> is worth the reduction in complexity?
>
> I will re-iterate: all that is actually needed to solve the original
> DDE initialisation problem that started this discussion is to add
> QS_SENDMESSAGE to the MsgWaitForMultipleObjects line in
> win32_msgwait(). All the rest of this stuff would be 'nice to have'
> so that Win32::GUI, Tk and other gui tookits can play nicely with perl
> on Win32.
>
> I hope this is useful,
> Regards,
> Rob.
>
>
--
Please update your address book with my new email address:
[EMAIL PROTECTED]
win32.c.patch
Description: Binary data
------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________ Perl-Win32-GUI-Users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users http://perl-win32-gui.sourceforge.net/

