YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES
YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES
THANK YOU THANK YOU THANK YOU THANK YOU THANK YOU THANK YOU THANK YOU
THANK YOU THANK YOU THANK YOU THANK YOU THANK YOU THANK YOU THANK YOU
I still had a test case, and this DOES solve the keyboard entry jitter
problem. Laurent, if this also cures Steve's mouse down problem, I
think it is time to make an official distribution. We've fixed a number
of significant bugs and missing features, of which this is the most
significant. So we should make it possible for people to use these
fixes easily, and put out a new version of Win32::GUI.
I guess the biggest issue is what version number to give it, but Aldo
said his next version would be 1.xxx, so any old 0.0.VVV for VVV > 665
would work to allow people to upgrade.
On approximately 12/10/2003 11:32 AM, came the following characters from
the keyboard of Laurent ROCHER:
Glenn Linderman wrote:
But I think if you use Win32::API to call call PeekMessage with the
PM_REMOVE set, that you may not get the repeated behavior... me thinks
the bug is inside DoEvents, somehow.... it just hit me... maybe the
PM_REMOVE constant is wrong? (Pure speculation here, but something is
wrong, and it isn't obvious.)
no, the PM_REMOVE seems to be correct. I also tried to debug this one
really hard, to no avail.
I think problem come from use of PeekMessage return value.
PeekMessage Return Values:
If a message is available, the return value is nonzero.
If no messages are available, the return value is zero.
In current DoEvents code, when PeekMessage return 0, loop exit only
after proceding last MSG.
while(stayhere) {
stayhere = PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE);
#ifdef PERLWIN32GUI_STRONGDEBUG
printf("XS(DoEvents): PeekMessage returned %d\n", stayhere);
#endif
if(msg.message == WM_EXITLOOP) {
stayhere = 0;
msg.wParam = (WPARAM) -1;
} else {
if(stayhere == -1) {
stayhere = 0;
msg.wParam = (WPARAM) -2; // an error occurred...
}
else {
...
}
}
}
I think code below resolve double event call.
Laurent
###########################################################################
# (@)METHOD:DoEvents()
DWORD
DoEvents(hwnd=NULL)
HWND hwnd
PREINIT:
MSG msg;
HWND phwnd;
HWND thwnd;
int stayhere;
BOOL fIsDialog;
HACCEL acc;
LPPERLWIN32GUI_USERDATA perlud;
CODE:
stayhere = 1;
fIsDialog = FALSE;
while(stayhere) {
stayhere = PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE);
#ifdef PERLWIN32GUI_STRONGDEBUG
printf("XS(DoEvents): PeekMessage returned %d\n", stayhere);
#endif
if (stayhere) {
if(msg.message == WM_EXITLOOP) {
stayhere = 0;
msg.wParam = (WPARAM) -1;
} else {
// #### trace back to the window's parent
phwnd = msg.hwnd;
while(thwnd = GetParent(phwnd)) {
phwnd = thwnd;
}
// #### now see if the parent window is a DialogBox
fIsDialog = FALSE;
acc = NULL;
perlud = (LPPERLWIN32GUI_USERDATA) GetWindowLong(phwnd,
GWL_USERDATA);
if( ValidUserData(perlud) ) {
fIsDialog = perlud->dwPlStyle & PERLWIN32GUI_DIALOGUI;
acc = perlud->hAcc;
}
if(acc && TranslateAccelerator(phwnd, acc, &msg))
continue;
if(fIsDialog && IsDialogMessage(phwnd, &msg))
continue;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
msg.wParam = (WPARAM) 0;
}
RETVAL = msg.wParam;
OUTPUT:
RETVAL
--
Glenn -- http://nevcal.com/
===========================
Like almost everyone, I receive a lot of spam every day, much of it
offering to help me get out of debt or get rich quick. It's ridiculous.
-- Bill Gates
And here is why it is ridiculous:
The division that includes Windows posted an operating profit of $2.26
billion on revenue of $2.81 billion.
--from Reuters via
http://biz.yahoo.com/rc/031113/tech_microsoft_msn_1.html
So that's profit of over 400% of investment... with a bit more
investment in Windows technology, particularly in the area of
reliability, the profit percentage might go down, but so might the bugs
and security problems? Seems like it would be a reasonable tradeoff.
WalMart earnings are 3.4% of investment.