Release 960902 Sun Sep 1 19:22:46 1996 Alexandre Julliard <julliard@lrc.epfl.ch> * [misc/commdlg.c] [if1632/commdlg.spec] Fixed some SEGPTR problems. * [windows/winproc.c] Added message translation for WM_COMPAREITEM, WM_DELETEITEM and WM_MEASUREITEM Fixed 16-to-32 translation for WM_HSCROLL/WM_VSCROLL. Fri Aug 30 13:39:00 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [files/drive.c] GetDriveType16 should report CDROMs as DRIVE_REMOTE (ACME setup). * [multimedia/audio.c] The minimum audiobuffer size shrunk somewhere in linux 1.3.xx below 4096 bytes. * [multimedia/mcistring.c] Segptr string handling fixed & enhanced. * [if1632/crtdll.spec][misc/crtdll.c] malloc,free,_strupr,_stricmp,_strcmpi added. * [if1632/wsock32.spec][misc/winsock.c] More direct thunks into unix libc and WsControl-stub added. Thu Aug 29 23:54:25 1996 Huw D. M. Davies <h.davies1@physics.oxford.ac.uk> * [objects/metafile.c] Bug fixes to both recording and playback of ExtTextOut(). Tue Aug 27 15:43:21 1996 Slaven Rezic <eserte@cs.tu-berlin.de> * [multimedia/audio.c] [multimedia/mcianim.c] [multimedia/mcicda.c] [multimedia/midi.c] Made cdaudio, audio and midi work for FreeBSD. Sun Aug 25 20:18:56 1996 Jukka Iivonen <iivonen@cc.helsinki.fi> * [misc/crtdll.c] [if1632/crtdll.spec] Added a lot of functions. * [misc/ole2nls.c] Added ID values for all languages in GetUserDefaultLCID(). Fri Aug 24 21:02:28 1996 Albrecht Kleine <kleine@ak.sax.de> * [windows/event.c] [windows/message.c] First attempt at hook WH_JOURNALPLAYBACK.
diff --git a/windows/message.c b/windows/message.c index 4624478..b61ecb3 100644 --- a/windows/message.c +++ b/windows/message.c
@@ -6,6 +6,7 @@ #include <stdlib.h> #include <string.h> +#include <ctype.h> #include <sys/time.h> #include <sys/types.h> @@ -31,8 +32,13 @@ #define HWND_BROADCAST16 ((HWND16)0xffff) #define HWND_BROADCAST32 ((HWND32)0xffffffff) -extern BYTE* KeyStateTable; /* event.c */ +#define ASCII_CHAR_HACK 0x0800 + extern WPARAM lastEventChar; /* event.c */ +extern BOOL MouseButtonsStates[3]; +extern BOOL AsyncMouseButtonsStates[3]; +extern BYTE KeyStateTable[256]; +extern BYTE AsyncKeyStateTable[256]; DWORD MSG_WineStartTicks; /* Ticks at Wine startup */ @@ -263,8 +269,8 @@ HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)SEGPTR_GET(event) ); } - else if ((msg->message >= WM_NCMOUSEMOVE) && - (msg->message <= WM_NCMBUTTONDBLCLK)) + else if ((msg->message >= WM_NCMOUSEFIRST) && + (msg->message <= WM_NCMOUSELAST)) { event->paramL = LOWORD(msg->lParam); /* X pos */ event->paramH = HIWORD(msg->lParam); /* Y pos */ @@ -275,6 +281,108 @@ SEGPTR_FREE(event); } +/***************************************************************** + * MSG_JournalPlayBackIsAscii + */ +static BOOL MSG_JournalPlayBackIsAscii(WPARAM wParam) +{ + return ((wParam>VK_HELP && wParam<VK_F1) || + wParam == VK_SPACE || + wParam == VK_ESCAPE || + wParam == VK_RETURN || + wParam == VK_TAB || + wParam == VK_BACK); +} + + +/*********************************************************************** + * MSG_JournalPlayBackMsg + * + * Get an EVENTMSG struct via call JOURNALPAYBACK hook function + */ +static int MSG_JournalPlayBackMsg(void) +{ + EVENTMSG16 *tmpMsg; + long wtime,lParam; + WORD keyDown,i,wParam,result=0; + + if ( HOOK_GetHook(WH_JOURNALPLAYBACK, 0) ) + { + tmpMsg = SEGPTR_NEW(EVENTMSG16); + wtime=HOOK_CallHooks( WH_JOURNALPLAYBACK, HC_GETNEXT, 0, (LPARAM)SEGPTR_GET(tmpMsg)); + /* dprintf_msg(stddeb,"Playback wait time =%ld\n",wtime); */ + if (wtime<=0) + { + wtime=0; + if ((tmpMsg->message>= WM_KEYFIRST) && (tmpMsg->message <= WM_KEYLAST)) + { + wParam=tmpMsg->paramL & 0xFF; + lParam=MAKELONG(tmpMsg->paramH&0x7ffff,tmpMsg->paramL>>8); + if (tmpMsg->message == WM_KEYDOWN || tmpMsg->message == WM_SYSKEYDOWN) + { + for (keyDown=i=0; i<256 && !keyDown; i++) + if (KeyStateTable[i] & 0x80) + keyDown++; + if (!keyDown) + lParam |= 0x40000000; + AsyncKeyStateTable[wParam]=KeyStateTable[wParam] |= 0x80; + if (MSG_JournalPlayBackIsAscii(wParam)) + { + lastEventChar= wParam; /* control TranslateMessage() */ + lParam |= (LONG)((LONG)ASCII_CHAR_HACK*0x10000L); + + if (!(KeyStateTable[VK_SHIFT] & 0x80) && + !(KeyStateTable[VK_CAPITAL] & 0x80)) + lastEventChar= tolower(lastEventChar); + if (KeyStateTable[VK_CONTROL] & 0x80) + lastEventChar&=0x1f; + } + } + else /* WM_KEYUP, WM_SYSKEYUP */ + { + lParam |= 0xC0000000; + AsyncKeyStateTable[wParam]=KeyStateTable[wParam] &= ~0x80; + } + if (KeyStateTable[VK_MENU] & 0x80) + lParam |= 0x20000000; + if (tmpMsg->paramH & 0x8000) /*special_key bit*/ + lParam |= 0x01000000; + hardware_event( tmpMsg->message, wParam, lParam,0, 0, tmpMsg->time, 0 ); + } + else + { + if ((tmpMsg->message>= WM_MOUSEFIRST) && (tmpMsg->message <= WM_MOUSELAST)) + { + switch (tmpMsg->message) + { + case WM_LBUTTONDOWN:MouseButtonsStates[0]=AsyncMouseButtonsStates[0]=1;break; + case WM_LBUTTONUP: MouseButtonsStates[0]=AsyncMouseButtonsStates[0]=0;break; + case WM_MBUTTONDOWN:MouseButtonsStates[1]=AsyncMouseButtonsStates[1]=1;break; + case WM_MBUTTONUP: MouseButtonsStates[1]=AsyncMouseButtonsStates[1]=0;break; + case WM_RBUTTONDOWN:MouseButtonsStates[2]=AsyncMouseButtonsStates[2]=1;break; + case WM_RBUTTONUP: MouseButtonsStates[2]=AsyncMouseButtonsStates[2]=0;break; + } + AsyncKeyStateTable[VK_LBUTTON]= KeyStateTable[VK_LBUTTON] = MouseButtonsStates[0] << 8; + AsyncKeyStateTable[VK_MBUTTON]= KeyStateTable[VK_MBUTTON] = MouseButtonsStates[1] << 8; + AsyncKeyStateTable[VK_RBUTTON]= KeyStateTable[VK_RBUTTON] = MouseButtonsStates[2] << 8; + SetCursorPos(tmpMsg->paramL,tmpMsg->paramH); + lParam=MAKELONG(tmpMsg->paramL,tmpMsg->paramH); + wParam=0; + if (MouseButtonsStates[0]) wParam |= MK_LBUTTON; + if (MouseButtonsStates[1]) wParam |= MK_MBUTTON; + if (MouseButtonsStates[2]) wParam |= MK_RBUTTON; + hardware_event( tmpMsg->message, wParam, lParam, + tmpMsg->paramL, tmpMsg->paramH, tmpMsg->time, 0 ); + } + } + HOOK_CallHooks( WH_JOURNALPLAYBACK, HC_SKIP, 0, (LPARAM)SEGPTR_GET(tmpMsg)); + } + else + result= QS_MOUSE | QS_KEY; + SEGPTR_FREE(tmpMsg); + } + return result; +} /*********************************************************************** * MSG_PeekHardwareMsg @@ -490,6 +598,8 @@ break; } + msgQueue->changeBits |= MSG_JournalPlayBackMsg(); + /* Now find a hardware event */ if (((msgQueue->wakeBits & mask) & (QS_MOUSE | QS_KEY)) && @@ -909,7 +1019,6 @@ * This should call ToAscii but it is currently broken */ -#define ASCII_CHAR_HACK 0x0800 BOOL TranslateMessage( LPMSG16 msg ) {