Implemented SendInput().
This commit is contained in:
parent
8d7b7d830c
commit
f9037de2ae
|
@ -298,13 +298,13 @@ rsrc resources/version16.res
|
||||||
286 pascal16 GetDesktopWindow() GetDesktopWindow16
|
286 pascal16 GetDesktopWindow() GetDesktopWindow16
|
||||||
287 pascal16 GetLastActivePopup(word) GetLastActivePopup16
|
287 pascal16 GetLastActivePopup(word) GetLastActivePopup16
|
||||||
288 pascal GetMessageExtraInfo() GetMessageExtraInfo
|
288 pascal GetMessageExtraInfo() GetMessageExtraInfo
|
||||||
289 register keybd_event() WIN16_keybd_event
|
289 register keybd_event() keybd_event16
|
||||||
290 pascal16 RedrawWindow(word ptr word word) RedrawWindow16
|
290 pascal16 RedrawWindow(word ptr word word) RedrawWindow16
|
||||||
291 pascal SetWindowsHookEx(s_word segptr word word) SetWindowsHookEx16
|
291 pascal SetWindowsHookEx(s_word segptr word word) SetWindowsHookEx16
|
||||||
292 pascal16 UnhookWindowsHookEx(segptr) UnhookWindowsHookEx16
|
292 pascal16 UnhookWindowsHookEx(segptr) UnhookWindowsHookEx16
|
||||||
293 pascal CallNextHookEx(segptr s_word word long) CallNextHookEx16
|
293 pascal CallNextHookEx(segptr s_word word long) CallNextHookEx16
|
||||||
294 pascal16 LockWindowUpdate(word) LockWindowUpdate16
|
294 pascal16 LockWindowUpdate(word) LockWindowUpdate16
|
||||||
299 register mouse_event() WIN16_mouse_event
|
299 register mouse_event() mouse_event16
|
||||||
300 stub UnloadInstalledDrivers # W1.1: USER_FARFRAME
|
300 stub UnloadInstalledDrivers # W1.1: USER_FARFRAME
|
||||||
301 stub EDITWNDPROC # BOZOSLIVEHERE :-))
|
301 stub EDITWNDPROC # BOZOSLIVEHERE :-))
|
||||||
302 stub STATICWNDPROC
|
302 stub STATICWNDPROC
|
||||||
|
|
|
@ -662,6 +662,7 @@ debug_channels (accel caret class clipboard combo cursor dc dde ddeml dialog dri
|
||||||
@ stdcall GetWindowModuleFileNameA(long ptr long) GetWindowModuleFileNameA
|
@ stdcall GetWindowModuleFileNameA(long ptr long) GetWindowModuleFileNameA
|
||||||
@ stdcall GetWindowModuleFileNameW(long ptr long) GetWindowModuleFileNameW
|
@ stdcall GetWindowModuleFileNameW(long ptr long) GetWindowModuleFileNameW
|
||||||
@ stdcall LockSetForegroundWindow (long) LockSetForegroundWindow
|
@ stdcall LockSetForegroundWindow (long) LockSetForegroundWindow
|
||||||
|
@ stdcall SendInput(long ptr long) SendInput
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
# Wine extensions: Win16 functions that are needed by other dlls
|
# Wine extensions: Win16 functions that are needed by other dlls
|
||||||
|
|
|
@ -147,6 +147,48 @@ typedef struct
|
||||||
|
|
||||||
#define KL_NAMELENGTH 9
|
#define KL_NAMELENGTH 9
|
||||||
|
|
||||||
|
typedef struct tagMOUSEINPUT
|
||||||
|
{
|
||||||
|
LONG dx;
|
||||||
|
LONG dy;
|
||||||
|
DWORD mouseData;
|
||||||
|
DWORD dwFlags;
|
||||||
|
DWORD time;
|
||||||
|
ULONG_PTR dwExtraInfo;
|
||||||
|
} MOUSEINPUT, *PMOUSEINPUT, *LPMOUSEINPUT;
|
||||||
|
|
||||||
|
typedef struct tagKEYBDINPUT
|
||||||
|
{
|
||||||
|
WORD wVk;
|
||||||
|
WORD wScan;
|
||||||
|
DWORD dwFlags;
|
||||||
|
DWORD time;
|
||||||
|
ULONG_PTR dwExtraInfo;
|
||||||
|
} KEYBDINPUT, *PKEYBDINPUT, *LPKEYBDINPUT;
|
||||||
|
|
||||||
|
typedef struct tagHARDWAREINPUT
|
||||||
|
{
|
||||||
|
DWORD uMsg;
|
||||||
|
WORD wParamL;
|
||||||
|
WORD wParamH;
|
||||||
|
} HARDWAREINPUT, *PHARDWAREINPUT, *LPHARDWAREINPUT;
|
||||||
|
|
||||||
|
#define INPUT_MOUSE 0
|
||||||
|
#define INPUT_KEYBOARD 1
|
||||||
|
#define INPUT_HARDWARE 2
|
||||||
|
|
||||||
|
typedef struct tagINPUT
|
||||||
|
{
|
||||||
|
DWORD type;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
MOUSEINPUT mi;
|
||||||
|
KEYBDINPUT ki;
|
||||||
|
HARDWAREINPUT hi;
|
||||||
|
} DUMMYUNIONNAME;
|
||||||
|
} INPUT, *PINPUT, *LPINPUT;
|
||||||
|
|
||||||
|
|
||||||
/***** Dialogs *****/
|
/***** Dialogs *****/
|
||||||
/* Gcc on Solaris has a version of this that we don't care about */
|
/* Gcc on Solaris has a version of this that we don't care about */
|
||||||
#undef FSHIFT
|
#undef FSHIFT
|
||||||
|
@ -3749,29 +3791,26 @@ BOOL WINAPI RemoveMenu(HMENU,UINT,UINT);
|
||||||
HANDLE WINAPI RemovePropA(HWND,LPCSTR);
|
HANDLE WINAPI RemovePropA(HWND,LPCSTR);
|
||||||
HANDLE WINAPI RemovePropW(HWND,LPCWSTR);
|
HANDLE WINAPI RemovePropW(HWND,LPCWSTR);
|
||||||
#define RemoveProp WINELIB_NAME_AW(RemoveProp)
|
#define RemoveProp WINELIB_NAME_AW(RemoveProp)
|
||||||
BOOL WINAPI ReplyMessage(LRESULT);
|
BOOL WINAPI ReplyMessage(LRESULT);
|
||||||
BOOL WINAPI ScreenToClient(HWND,LPPOINT);
|
BOOL WINAPI ScreenToClient(HWND,LPPOINT);
|
||||||
VOID WINAPI ScrollChildren(HWND,UINT,WPARAM,LPARAM);
|
VOID WINAPI ScrollChildren(HWND,UINT,WPARAM,LPARAM);
|
||||||
BOOL WINAPI ScrollDC(HDC,INT,INT,const RECT*,const RECT*,
|
BOOL WINAPI ScrollDC(HDC,INT,INT,const RECT*,const RECT*,HRGN,LPRECT);
|
||||||
HRGN,LPRECT);
|
BOOL WINAPI ScrollWindow(HWND,INT,INT,const RECT*,const RECT*);
|
||||||
BOOL WINAPI ScrollWindow(HWND,INT,INT,const RECT*,const RECT*);
|
INT WINAPI ScrollWindowEx(HWND,INT,INT,const RECT*,const RECT*,HRGN,LPRECT,UINT);
|
||||||
INT WINAPI ScrollWindowEx(HWND,INT,INT,const RECT*,
|
|
||||||
const RECT*,HRGN,LPRECT,UINT);
|
|
||||||
LRESULT WINAPI SendDlgItemMessageA(HWND,INT,UINT,WPARAM,LPARAM);
|
LRESULT WINAPI SendDlgItemMessageA(HWND,INT,UINT,WPARAM,LPARAM);
|
||||||
LRESULT WINAPI SendDlgItemMessageW(HWND,INT,UINT,WPARAM,LPARAM);
|
LRESULT WINAPI SendDlgItemMessageW(HWND,INT,UINT,WPARAM,LPARAM);
|
||||||
#define SendDlgItemMessage WINELIB_NAME_AW(SendDlgItemMessage)
|
#define SendDlgItemMessage WINELIB_NAME_AW(SendDlgItemMessage)
|
||||||
|
UINT WINAPI SendInput(UINT,LPINPUT,int);
|
||||||
LRESULT WINAPI SendMessageA(HWND,UINT,WPARAM,LPARAM);
|
LRESULT WINAPI SendMessageA(HWND,UINT,WPARAM,LPARAM);
|
||||||
LRESULT WINAPI SendMessageW(HWND,UINT,WPARAM,LPARAM);
|
LRESULT WINAPI SendMessageW(HWND,UINT,WPARAM,LPARAM);
|
||||||
#define SendMessage WINELIB_NAME_AW(SendMessage)
|
#define SendMessage WINELIB_NAME_AW(SendMessage)
|
||||||
LRESULT WINAPI SendMessageTimeoutA(HWND,UINT,WPARAM,LPARAM,UINT,
|
LRESULT WINAPI SendMessageTimeoutA(HWND,UINT,WPARAM,LPARAM,UINT,UINT,LPDWORD);
|
||||||
UINT,LPDWORD);
|
LRESULT WINAPI SendMessageTimeoutW(HWND,UINT,WPARAM,LPARAM,UINT,UINT,LPDWORD);
|
||||||
LRESULT WINAPI SendMessageTimeoutW(HWND,UINT,WPARAM,LPARAM,UINT,
|
|
||||||
UINT,LPDWORD);
|
|
||||||
#define SendMessageTimeout WINELIB_NAME_AW(SendMessageTimeout)
|
#define SendMessageTimeout WINELIB_NAME_AW(SendMessageTimeout)
|
||||||
HWND WINAPI SetActiveWindow(HWND);
|
HWND WINAPI SetActiveWindow(HWND);
|
||||||
HWND WINAPI SetCapture(HWND);
|
HWND WINAPI SetCapture(HWND);
|
||||||
BOOL WINAPI SetCaretBlinkTime(UINT);
|
BOOL WINAPI SetCaretBlinkTime(UINT);
|
||||||
BOOL WINAPI SetCaretPos(INT,INT);
|
BOOL WINAPI SetCaretPos(INT,INT);
|
||||||
LONG WINAPI SetClassLongA(HWND,INT,LONG);
|
LONG WINAPI SetClassLongA(HWND,INT,LONG);
|
||||||
LONG WINAPI SetClassLongW(HWND,INT,LONG);
|
LONG WINAPI SetClassLongW(HWND,INT,LONG);
|
||||||
#define SetClassLong WINELIB_NAME_AW(SetClassLong)
|
#define SetClassLong WINELIB_NAME_AW(SetClassLong)
|
||||||
|
|
|
@ -387,7 +387,7 @@ extern void X11DRV_InitMouse(LPMOUSE_EVENT_PROC);
|
||||||
extern void X11DRV_SetCursor(struct tagCURSORICONINFO *lpCursor);
|
extern void X11DRV_SetCursor(struct tagCURSORICONINFO *lpCursor);
|
||||||
extern void X11DRV_MoveCursor(WORD wAbsX, WORD wAbsY);
|
extern void X11DRV_MoveCursor(WORD wAbsX, WORD wAbsY);
|
||||||
extern void X11DRV_SendEvent( DWORD mouseStatus, DWORD posX, DWORD posY,
|
extern void X11DRV_SendEvent( DWORD mouseStatus, DWORD posX, DWORD posY,
|
||||||
DWORD keyState, DWORD time, HWND hWnd );
|
WORD keyState, DWORD data, DWORD time, HWND hWnd );
|
||||||
|
|
||||||
/* X11 windows driver */
|
/* X11 windows driver */
|
||||||
|
|
||||||
|
|
353
windows/input.c
353
windows/input.c
|
@ -103,18 +103,175 @@ static void queue_raw_hardware_message( UINT message, WPARAM wParam, LPARAM lPar
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* queue_kbd_event
|
||||||
|
*
|
||||||
|
* Put a keyboard event into a thread queue
|
||||||
|
*/
|
||||||
|
static void queue_kbd_event( const KEYBDINPUT *ki )
|
||||||
|
{
|
||||||
|
UINT message;
|
||||||
|
KEYLP keylp;
|
||||||
|
|
||||||
|
keylp.lp2 = 0;
|
||||||
|
keylp.lp1.count = 1;
|
||||||
|
keylp.lp1.code = ki->wScan;
|
||||||
|
keylp.lp1.extended = (ki->dwFlags & KEYEVENTF_EXTENDEDKEY) != 0;
|
||||||
|
keylp.lp1.win_internal = 0; /* this has something to do with dialogs,
|
||||||
|
* don't remember where I read it - AK */
|
||||||
|
/* it's '1' under windows, when a dialog box appears
|
||||||
|
* and you press one of the underlined keys - DF*/
|
||||||
|
|
||||||
|
if (ki->dwFlags & KEYEVENTF_KEYUP )
|
||||||
|
{
|
||||||
|
BOOL sysKey = ((InputKeyStateTable[VK_MENU] & 0x80) &&
|
||||||
|
!(InputKeyStateTable[VK_CONTROL] & 0x80) &&
|
||||||
|
!(ki->dwFlags & KEYEVENTF_WINE_FORCEEXTENDED)); /* for Alt from AltGr */
|
||||||
|
InputKeyStateTable[ki->wVk] &= ~0x80;
|
||||||
|
keylp.lp1.previous = 1;
|
||||||
|
keylp.lp1.transition = 1;
|
||||||
|
message = sysKey ? WM_SYSKEYUP : WM_KEYUP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
keylp.lp1.previous = (InputKeyStateTable[ki->wVk] & 0x80) != 0;
|
||||||
|
keylp.lp1.transition = 0;
|
||||||
|
if (!(InputKeyStateTable[ki->wVk] & 0x80)) InputKeyStateTable[ki->wVk] ^= 0x01;
|
||||||
|
InputKeyStateTable[ki->wVk] |= 0x80;
|
||||||
|
AsyncKeyStateTable[ki->wVk] |= 0x80;
|
||||||
|
|
||||||
|
message = (InputKeyStateTable[VK_MENU] & 0x80) && !(InputKeyStateTable[VK_CONTROL] & 0x80)
|
||||||
|
? WM_SYSKEYDOWN : WM_KEYDOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (message == WM_SYSKEYDOWN || message == WM_SYSKEYUP )
|
||||||
|
keylp.lp1.context = (InputKeyStateTable[VK_MENU] & 0x80) != 0; /* 1 if alt */
|
||||||
|
|
||||||
|
TRACE_(key)(" wParam=%04x, lParam=%08lx, InputKeyState=%x\n",
|
||||||
|
ki->wVk, keylp.lp2, InputKeyStateTable[ki->wVk] );
|
||||||
|
|
||||||
|
queue_raw_hardware_message( message, ki->wVk, keylp.lp2,
|
||||||
|
PosX, PosY, ki->time, ki->dwExtraInfo );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* queue_mouse_event
|
||||||
|
*/
|
||||||
|
static void queue_mouse_event( const MOUSEINPUT *mi, WORD keystate )
|
||||||
|
{
|
||||||
|
if (mi->dwFlags & MOUSEEVENTF_MOVE)
|
||||||
|
{
|
||||||
|
if (mi->dwFlags & MOUSEEVENTF_ABSOLUTE)
|
||||||
|
{
|
||||||
|
PosX = (mi->dx * GetSystemMetrics(SM_CXSCREEN)) >> 16;
|
||||||
|
PosY = (mi->dy * GetSystemMetrics(SM_CYSCREEN)) >> 16;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int width = GetSystemMetrics(SM_CXSCREEN);
|
||||||
|
int height = GetSystemMetrics(SM_CYSCREEN);
|
||||||
|
long posX = (long) PosX, posY = (long) PosY;
|
||||||
|
|
||||||
|
/* dx and dy can be negative numbers for relative movements */
|
||||||
|
posX += (long)mi->dx;
|
||||||
|
posY += (long)mi->dy;
|
||||||
|
|
||||||
|
/* Clip to the current screen size */
|
||||||
|
if (posX < 0) PosX = 0;
|
||||||
|
else if (posX >= width) PosX = width - 1;
|
||||||
|
else PosX = posX;
|
||||||
|
|
||||||
|
if (posY < 0) PosY = 0;
|
||||||
|
else if (posY >= height) PosY = height - 1;
|
||||||
|
else PosY = posY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mi->dwFlags & MOUSEEVENTF_MOVE)
|
||||||
|
{
|
||||||
|
queue_raw_hardware_message( WM_MOUSEMOVE, keystate, 0, PosX, PosY,
|
||||||
|
mi->time, mi->dwExtraInfo );
|
||||||
|
}
|
||||||
|
if (mi->dwFlags & (!SwappedButtons? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_RIGHTDOWN))
|
||||||
|
{
|
||||||
|
MouseButtonsStates[0] = AsyncMouseButtonsStates[0] = TRUE;
|
||||||
|
queue_raw_hardware_message( WM_LBUTTONDOWN, keystate, 0, PosX, PosY,
|
||||||
|
mi->time, mi->dwExtraInfo );
|
||||||
|
}
|
||||||
|
if (mi->dwFlags & (!SwappedButtons? MOUSEEVENTF_LEFTUP : MOUSEEVENTF_RIGHTUP))
|
||||||
|
{
|
||||||
|
MouseButtonsStates[0] = FALSE;
|
||||||
|
queue_raw_hardware_message( WM_LBUTTONUP, keystate, 0, PosX, PosY,
|
||||||
|
mi->time, mi->dwExtraInfo );
|
||||||
|
}
|
||||||
|
if (mi->dwFlags & (!SwappedButtons? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_LEFTDOWN))
|
||||||
|
{
|
||||||
|
MouseButtonsStates[2] = AsyncMouseButtonsStates[2] = TRUE;
|
||||||
|
queue_raw_hardware_message( WM_RBUTTONDOWN, keystate, 0, PosX, PosY,
|
||||||
|
mi->time, mi->dwExtraInfo );
|
||||||
|
}
|
||||||
|
if (mi->dwFlags & (!SwappedButtons? MOUSEEVENTF_RIGHTUP : MOUSEEVENTF_LEFTUP))
|
||||||
|
{
|
||||||
|
MouseButtonsStates[2] = FALSE;
|
||||||
|
queue_raw_hardware_message( WM_RBUTTONUP, keystate, 0, PosX, PosY,
|
||||||
|
mi->time, mi->dwExtraInfo );
|
||||||
|
}
|
||||||
|
if (mi->dwFlags & MOUSEEVENTF_MIDDLEDOWN)
|
||||||
|
{
|
||||||
|
MouseButtonsStates[1] = AsyncMouseButtonsStates[1] = TRUE;
|
||||||
|
queue_raw_hardware_message( WM_MBUTTONDOWN, keystate, 0, PosX, PosY,
|
||||||
|
mi->time, mi->dwExtraInfo );
|
||||||
|
}
|
||||||
|
if (mi->dwFlags & MOUSEEVENTF_MIDDLEUP)
|
||||||
|
{
|
||||||
|
MouseButtonsStates[1] = FALSE;
|
||||||
|
queue_raw_hardware_message( WM_MBUTTONUP, keystate, 0, PosX, PosY,
|
||||||
|
mi->time, mi->dwExtraInfo );
|
||||||
|
}
|
||||||
|
if (mi->dwFlags & MOUSEEVENTF_WHEEL)
|
||||||
|
{
|
||||||
|
queue_raw_hardware_message( WM_MOUSEWHEEL, MAKELONG( keystate, mi->mouseData), 0,
|
||||||
|
PosX, PosY, mi->time, mi->dwExtraInfo );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SendInput (USER32.@)
|
||||||
|
*/
|
||||||
|
UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size )
|
||||||
|
{
|
||||||
|
UINT i;
|
||||||
|
|
||||||
|
if (!InputEnabled) return 0;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++, inputs++)
|
||||||
|
{
|
||||||
|
switch(inputs->type)
|
||||||
|
{
|
||||||
|
case INPUT_MOUSE:
|
||||||
|
queue_mouse_event( &inputs->u.mi, GET_KEYSTATE() );
|
||||||
|
break;
|
||||||
|
case INPUT_KEYBOARD:
|
||||||
|
queue_kbd_event( &inputs->u.ki );
|
||||||
|
break;
|
||||||
|
case INPUT_HARDWARE:
|
||||||
|
FIXME( "INPUT_HARDWARE not supported\n" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* keybd_event (USER32.@)
|
* keybd_event (USER32.@)
|
||||||
*/
|
*/
|
||||||
void WINAPI keybd_event( BYTE bVk, BYTE bScan,
|
void WINAPI keybd_event( BYTE bVk, BYTE bScan,
|
||||||
DWORD dwFlags, DWORD dwExtraInfo )
|
DWORD dwFlags, DWORD dwExtraInfo )
|
||||||
{
|
{
|
||||||
DWORD time, extra;
|
INPUT input;
|
||||||
WORD message;
|
|
||||||
KEYLP keylp;
|
|
||||||
keylp.lp2 = 0;
|
|
||||||
|
|
||||||
if (!InputEnabled) return;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are called by the Wine keyboard driver, use the additional
|
* If we are called by the Wine keyboard driver, use the additional
|
||||||
|
@ -126,64 +283,26 @@ void WINAPI keybd_event( BYTE bVk, BYTE bScan,
|
||||||
&& ((WINE_KEYBDEVENT *)dwExtraInfo)->magic == WINE_KEYBDEVENT_MAGIC )
|
&& ((WINE_KEYBDEVENT *)dwExtraInfo)->magic == WINE_KEYBDEVENT_MAGIC )
|
||||||
{
|
{
|
||||||
WINE_KEYBDEVENT *wke = (WINE_KEYBDEVENT *)dwExtraInfo;
|
WINE_KEYBDEVENT *wke = (WINE_KEYBDEVENT *)dwExtraInfo;
|
||||||
time = wke->time;
|
input.u.ki.time = wke->time;
|
||||||
extra = 0;
|
input.u.ki.dwExtraInfo = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
time = GetTickCount();
|
input.u.ki.time = GetTickCount();
|
||||||
extra = dwExtraInfo;
|
input.u.ki.dwExtraInfo = dwExtraInfo;
|
||||||
}
|
}
|
||||||
|
input.type = INPUT_KEYBOARD;
|
||||||
|
input.u.ki.wVk = bVk;
|
||||||
keylp.lp1.count = 1;
|
input.u.ki.wScan = bScan;
|
||||||
keylp.lp1.code = bScan;
|
input.u.ki.dwFlags = dwFlags;
|
||||||
keylp.lp1.extended = (dwFlags & KEYEVENTF_EXTENDEDKEY) != 0;
|
SendInput( 1, &input, sizeof(input) );
|
||||||
keylp.lp1.win_internal = 0; /* this has something to do with dialogs,
|
|
||||||
* don't remember where I read it - AK */
|
|
||||||
/* it's '1' under windows, when a dialog box appears
|
|
||||||
* and you press one of the underlined keys - DF*/
|
|
||||||
|
|
||||||
if ( dwFlags & KEYEVENTF_KEYUP )
|
|
||||||
{
|
|
||||||
BOOL sysKey = (InputKeyStateTable[VK_MENU] & 0x80)
|
|
||||||
&& !(InputKeyStateTable[VK_CONTROL] & 0x80)
|
|
||||||
&& !(dwFlags & KEYEVENTF_WINE_FORCEEXTENDED); /* for Alt from AltGr */
|
|
||||||
|
|
||||||
InputKeyStateTable[bVk] &= ~0x80;
|
|
||||||
keylp.lp1.previous = 1;
|
|
||||||
keylp.lp1.transition = 1;
|
|
||||||
message = sysKey ? WM_SYSKEYUP : WM_KEYUP;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
keylp.lp1.previous = (InputKeyStateTable[bVk] & 0x80) != 0;
|
|
||||||
keylp.lp1.transition = 0;
|
|
||||||
|
|
||||||
if (!(InputKeyStateTable[bVk] & 0x80))
|
|
||||||
InputKeyStateTable[bVk] ^= 0x01;
|
|
||||||
InputKeyStateTable[bVk] |= 0x80;
|
|
||||||
AsyncKeyStateTable[bVk] |= 0x80;
|
|
||||||
|
|
||||||
message = (InputKeyStateTable[VK_MENU] & 0x80)
|
|
||||||
&& !(InputKeyStateTable[VK_CONTROL] & 0x80)
|
|
||||||
? WM_SYSKEYDOWN : WM_KEYDOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( message == WM_SYSKEYDOWN || message == WM_SYSKEYUP )
|
|
||||||
keylp.lp1.context = (InputKeyStateTable[VK_MENU] & 0x80) != 0; /* 1 if alt */
|
|
||||||
|
|
||||||
|
|
||||||
TRACE_(key)(" wParam=%04X, lParam=%08lX\n", bVk, keylp.lp2 );
|
|
||||||
TRACE_(key)(" InputKeyState=%X\n", InputKeyStateTable[bVk] );
|
|
||||||
|
|
||||||
queue_raw_hardware_message( message, bVk, keylp.lp2, PosX, PosY, time, extra );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* keybd_event (USER.289)
|
* keybd_event (USER.289)
|
||||||
*/
|
*/
|
||||||
void WINAPI WIN16_keybd_event( CONTEXT86 *context )
|
void WINAPI keybd_event16( CONTEXT86 *context )
|
||||||
{
|
{
|
||||||
DWORD dwFlags = 0;
|
DWORD dwFlags = 0;
|
||||||
|
|
||||||
|
@ -194,44 +313,21 @@ void WINAPI WIN16_keybd_event( CONTEXT86 *context )
|
||||||
dwFlags, MAKELONG(SI_reg(context), DI_reg(context)) );
|
dwFlags, MAKELONG(SI_reg(context), DI_reg(context)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* mouse_event (USER32.@)
|
* mouse_event (USER32.@)
|
||||||
*/
|
*/
|
||||||
void WINAPI mouse_event( DWORD dwFlags, DWORD dx, DWORD dy,
|
void WINAPI mouse_event( DWORD dwFlags, DWORD dx, DWORD dy,
|
||||||
DWORD cButtons, DWORD dwExtraInfo )
|
DWORD dwData, DWORD dwExtraInfo )
|
||||||
{
|
{
|
||||||
DWORD time, extra;
|
INPUT input;
|
||||||
DWORD keyState;
|
WORD keyState;
|
||||||
|
|
||||||
if (!InputEnabled) return;
|
|
||||||
|
|
||||||
if ( dwFlags & MOUSEEVENTF_MOVE )
|
input.type = INPUT_MOUSE;
|
||||||
{
|
input.u.mi.dx = dx;
|
||||||
if ( dwFlags & MOUSEEVENTF_ABSOLUTE )
|
input.u.mi.dy = dy;
|
||||||
{
|
input.u.mi.mouseData = dwData;
|
||||||
PosX = (dx * GetSystemMetrics(SM_CXSCREEN)) >> 16;
|
input.u.mi.dwFlags = dwFlags;
|
||||||
PosY = (dy * GetSystemMetrics(SM_CYSCREEN)) >> 16;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int width = GetSystemMetrics(SM_CXSCREEN);
|
|
||||||
int height = GetSystemMetrics(SM_CYSCREEN);
|
|
||||||
long posX = (long) PosX, posY = (long) PosY;
|
|
||||||
|
|
||||||
/* dx and dy can be negative numbers for relative movements */
|
|
||||||
posX += (long) dx;
|
|
||||||
posY += (long) dy;
|
|
||||||
|
|
||||||
/* Clip to the current screen size */
|
|
||||||
if (posX < 0) PosX = 0;
|
|
||||||
else if (posX >= width) PosX = width - 1;
|
|
||||||
else PosX = posX;
|
|
||||||
|
|
||||||
if (posY < 0) PosY = 0;
|
|
||||||
else if (posY >= height) PosY = height - 1;
|
|
||||||
else PosY = posY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are called by the Wine mouse driver, use the additional
|
* If we are called by the Wine mouse driver, use the additional
|
||||||
|
@ -243,77 +339,38 @@ void WINAPI mouse_event( DWORD dwFlags, DWORD dx, DWORD dy,
|
||||||
&& ((WINE_MOUSEEVENT *)dwExtraInfo)->magic == WINE_MOUSEEVENT_MAGIC )
|
&& ((WINE_MOUSEEVENT *)dwExtraInfo)->magic == WINE_MOUSEEVENT_MAGIC )
|
||||||
{
|
{
|
||||||
WINE_MOUSEEVENT *wme = (WINE_MOUSEEVENT *)dwExtraInfo;
|
WINE_MOUSEEVENT *wme = (WINE_MOUSEEVENT *)dwExtraInfo;
|
||||||
time = wme->time;
|
|
||||||
extra = (DWORD)wme->hWnd;
|
keyState = wme->keyState;
|
||||||
keyState = wme->keyState;
|
|
||||||
|
if (keyState != GET_KEYSTATE())
|
||||||
if (keyState != GET_KEYSTATE()) {
|
{
|
||||||
/* We need to update the keystate with what X provides us */
|
/* We need to update the keystate with what X provides us */
|
||||||
MouseButtonsStates[SwappedButtons ? 2 : 0] = (keyState & MK_LBUTTON ? TRUE : FALSE);
|
MouseButtonsStates[SwappedButtons ? 2 : 0] = (keyState & MK_LBUTTON ? TRUE : FALSE);
|
||||||
MouseButtonsStates[SwappedButtons ? 0 : 2] = (keyState & MK_RBUTTON ? TRUE : FALSE);
|
MouseButtonsStates[SwappedButtons ? 0 : 2] = (keyState & MK_RBUTTON ? TRUE : FALSE);
|
||||||
MouseButtonsStates[1] = (keyState & MK_MBUTTON ? TRUE : FALSE);
|
MouseButtonsStates[1] = (keyState & MK_MBUTTON ? TRUE : FALSE);
|
||||||
InputKeyStateTable[VK_SHIFT] = (keyState & MK_SHIFT ? 0x80 : 0);
|
InputKeyStateTable[VK_SHIFT] = (keyState & MK_SHIFT ? 0x80 : 0);
|
||||||
InputKeyStateTable[VK_CONTROL] = (keyState & MK_CONTROL ? 0x80 : 0);
|
InputKeyStateTable[VK_CONTROL] = (keyState & MK_CONTROL ? 0x80 : 0);
|
||||||
}
|
}
|
||||||
|
input.u.mi.time = wme->time;
|
||||||
|
input.u.mi.dwExtraInfo = wme->hWnd;
|
||||||
|
queue_mouse_event( &input.u.mi, keyState );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
time = GetTickCount();
|
if ( dwFlags & MOUSEEVENTF_MOVE ) /* we have to actually move the cursor */
|
||||||
extra = dwExtraInfo;
|
SetCursorPos( PosX, PosY );
|
||||||
keyState = GET_KEYSTATE();
|
|
||||||
|
|
||||||
if ( dwFlags & MOUSEEVENTF_MOVE )
|
|
||||||
{
|
|
||||||
/* We have to actually move the cursor */
|
|
||||||
SetCursorPos( PosX, PosY );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
input.u.mi.time = GetCurrentTime();
|
||||||
if ( dwFlags & MOUSEEVENTF_MOVE )
|
input.u.mi.dwExtraInfo = dwExtraInfo;
|
||||||
{
|
SendInput( 1, &input, sizeof(input) );
|
||||||
queue_raw_hardware_message( WM_MOUSEMOVE, keyState, 0, PosX, PosY, time, extra );
|
|
||||||
}
|
|
||||||
if ( dwFlags & (!SwappedButtons? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_RIGHTDOWN) )
|
|
||||||
{
|
|
||||||
MouseButtonsStates[0] = AsyncMouseButtonsStates[0] = TRUE;
|
|
||||||
queue_raw_hardware_message( WM_LBUTTONDOWN, keyState, 0, PosX, PosY, time, extra );
|
|
||||||
}
|
|
||||||
if ( dwFlags & (!SwappedButtons? MOUSEEVENTF_LEFTUP : MOUSEEVENTF_RIGHTUP) )
|
|
||||||
{
|
|
||||||
MouseButtonsStates[0] = FALSE;
|
|
||||||
queue_raw_hardware_message( WM_LBUTTONUP, keyState, 0, PosX, PosY, time, extra );
|
|
||||||
}
|
|
||||||
if ( dwFlags & (!SwappedButtons? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_LEFTDOWN) )
|
|
||||||
{
|
|
||||||
MouseButtonsStates[2] = AsyncMouseButtonsStates[2] = TRUE;
|
|
||||||
queue_raw_hardware_message( WM_RBUTTONDOWN, keyState, 0, PosX, PosY, time, extra );
|
|
||||||
}
|
|
||||||
if ( dwFlags & (!SwappedButtons? MOUSEEVENTF_RIGHTUP : MOUSEEVENTF_LEFTUP) )
|
|
||||||
{
|
|
||||||
MouseButtonsStates[2] = FALSE;
|
|
||||||
queue_raw_hardware_message( WM_RBUTTONUP, keyState, 0, PosX, PosY, time, extra );
|
|
||||||
}
|
|
||||||
if ( dwFlags & MOUSEEVENTF_MIDDLEDOWN )
|
|
||||||
{
|
|
||||||
MouseButtonsStates[1] = AsyncMouseButtonsStates[1] = TRUE;
|
|
||||||
queue_raw_hardware_message( WM_MBUTTONDOWN, keyState, 0, PosX, PosY, time, extra );
|
|
||||||
}
|
|
||||||
if ( dwFlags & MOUSEEVENTF_MIDDLEUP )
|
|
||||||
{
|
|
||||||
MouseButtonsStates[1] = FALSE;
|
|
||||||
queue_raw_hardware_message( WM_MBUTTONUP, keyState, 0, PosX, PosY, time, extra );
|
|
||||||
}
|
|
||||||
if ( dwFlags & MOUSEEVENTF_WHEEL )
|
|
||||||
{
|
|
||||||
queue_raw_hardware_message( WM_MOUSEWHEEL, keyState, 0, PosX, PosY, time, extra );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* mouse_event (USER.299)
|
* mouse_event (USER.299)
|
||||||
*/
|
*/
|
||||||
void WINAPI WIN16_mouse_event( CONTEXT86 *context )
|
void WINAPI mouse_event16( CONTEXT86 *context )
|
||||||
{
|
{
|
||||||
mouse_event( AX_reg(context), BX_reg(context), CX_reg(context),
|
mouse_event( AX_reg(context), BX_reg(context), CX_reg(context),
|
||||||
DX_reg(context), MAKELONG(SI_reg(context), DI_reg(context)) );
|
DX_reg(context), MAKELONG(SI_reg(context), DI_reg(context)) );
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include "message.h"
|
#include "message.h"
|
||||||
#include "mouse.h"
|
#include "mouse.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "queue.h"
|
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
#include "winpos.h"
|
#include "winpos.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
|
@ -292,21 +291,8 @@ static void EVENT_ProcessEvent( XEvent *event )
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
EVENT_ButtonRelease( hWnd, (XButtonEvent*)event );
|
EVENT_ButtonRelease( hWnd, (XButtonEvent*)event );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MotionNotify:
|
case MotionNotify:
|
||||||
/* Wine between two fast machines across the overloaded campus
|
|
||||||
ethernet gets very boged down in MotionEvents. The following
|
|
||||||
simply finds the last motion event in the queue and drops
|
|
||||||
the rest. On a good link events are servered before they build
|
|
||||||
up so this doesn't take place. On a slow link this may cause
|
|
||||||
problems if the event order is important. I'm not yet seen
|
|
||||||
of any problems. Jon 7/6/96.
|
|
||||||
*/
|
|
||||||
if ((current_input_type == X11DRV_INPUT_ABSOLUTE) &&
|
|
||||||
(in_transition == FALSE))
|
|
||||||
/* Only cumulate events if in absolute mode */
|
|
||||||
while (TSXCheckTypedWindowEvent(display,((XAnyEvent *)event)->window,
|
|
||||||
MotionNotify, event));
|
|
||||||
EVENT_MotionNotify( hWnd, (XMotionEvent*)event );
|
EVENT_MotionNotify( hWnd, (XMotionEvent*)event );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -439,14 +425,14 @@ static void EVENT_MotionNotify( HWND hWnd, XMotionEvent *event )
|
||||||
{
|
{
|
||||||
get_coords( &hWnd, event->window, event->x, event->y, &pt );
|
get_coords( &hWnd, event->window, event->x, event->y, &pt );
|
||||||
X11DRV_SendEvent( MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, pt.x, pt.y,
|
X11DRV_SendEvent( MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, pt.x, pt.y,
|
||||||
X11DRV_EVENT_XStateToKeyState( event->state ),
|
X11DRV_EVENT_XStateToKeyState( event->state ), 0,
|
||||||
event->time - X11DRV_server_startticks, hWnd);
|
event->time - X11DRV_server_startticks, hWnd);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
X11DRV_SendEvent( MOUSEEVENTF_MOVE,
|
X11DRV_SendEvent( MOUSEEVENTF_MOVE,
|
||||||
event->x_root, event->y_root,
|
event->x_root, event->y_root,
|
||||||
X11DRV_EVENT_XStateToKeyState( event->state ),
|
X11DRV_EVENT_XStateToKeyState( event->state ), 0,
|
||||||
event->time - X11DRV_server_startticks, hWnd);
|
event->time - X11DRV_server_startticks, hWnd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -495,8 +481,7 @@ static void EVENT_ButtonPress( HWND hWnd, XButtonEvent *event )
|
||||||
}
|
}
|
||||||
|
|
||||||
X11DRV_SendEvent( statusCodes[buttonNum], pt.x, pt.y,
|
X11DRV_SendEvent( statusCodes[buttonNum], pt.x, pt.y,
|
||||||
MAKEWPARAM(keystate,wData),
|
keystate, wData, event->time - X11DRV_server_startticks, hWnd);
|
||||||
event->time - X11DRV_server_startticks, hWnd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -537,7 +522,7 @@ static void EVENT_ButtonRelease( HWND hWnd, XButtonEvent *event )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
X11DRV_SendEvent( statusCodes[buttonNum], pt.x, pt.y,
|
X11DRV_SendEvent( statusCodes[buttonNum], pt.x, pt.y,
|
||||||
keystate, event->time - X11DRV_server_startticks, hWnd);
|
keystate, 0, event->time - X11DRV_server_startticks, hWnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1523,10 +1508,9 @@ void X11DRV_EVENT_SetDGAStatus(HWND hwnd, int event_base)
|
||||||
/* DGA2 event handlers */
|
/* DGA2 event handlers */
|
||||||
static void EVENT_DGAMotionEvent( XDGAMotionEvent *event )
|
static void EVENT_DGAMotionEvent( XDGAMotionEvent *event )
|
||||||
{
|
{
|
||||||
X11DRV_SendEvent( MOUSEEVENTF_MOVE,
|
X11DRV_SendEvent( MOUSEEVENTF_MOVE, event->dx, event->dy,
|
||||||
event->dx, event->dy,
|
X11DRV_EVENT_XStateToKeyState( event->state ), 0,
|
||||||
X11DRV_EVENT_XStateToKeyState( event->state ),
|
event->time - X11DRV_server_startticks, DGAhwnd );
|
||||||
event->time - X11DRV_server_startticks, DGAhwnd );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void EVENT_DGAButtonPressEvent( XDGAButtonEvent *event )
|
static void EVENT_DGAButtonPressEvent( XDGAButtonEvent *event )
|
||||||
|
@ -1554,7 +1538,8 @@ static void EVENT_DGAButtonPressEvent( XDGAButtonEvent *event )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
X11DRV_SendEvent( statusCodes[buttonNum], 0, 0, keystate, event->time - X11DRV_server_startticks, DGAhwnd );
|
X11DRV_SendEvent( statusCodes[buttonNum], 0, 0, keystate, 0,
|
||||||
|
event->time - X11DRV_server_startticks, DGAhwnd );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void EVENT_DGAButtonReleaseEvent( XDGAButtonEvent *event )
|
static void EVENT_DGAButtonReleaseEvent( XDGAButtonEvent *event )
|
||||||
|
@ -1582,7 +1567,8 @@ static void EVENT_DGAButtonReleaseEvent( XDGAButtonEvent *event )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
X11DRV_SendEvent( statusCodes[buttonNum], 0, 0, keystate, event->time - X11DRV_server_startticks, DGAhwnd );
|
X11DRV_SendEvent( statusCodes[buttonNum], 0, 0, keystate, 0,
|
||||||
|
event->time - X11DRV_server_startticks, DGAhwnd );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -280,8 +280,8 @@ void X11DRV_InitMouse( LPMOUSE_EVENT_PROC proc )
|
||||||
TSXQueryPointer( thread_display(), root_window, &root, &child,
|
TSXQueryPointer( thread_display(), root_window, &root, &child,
|
||||||
&root_x, &root_y, &child_x, &child_y, &KeyState);
|
&root_x, &root_y, &child_x, &child_y, &KeyState);
|
||||||
X11DRV_SendEvent(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE,
|
X11DRV_SendEvent(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE,
|
||||||
root_x, root_y, X11DRV_EVENT_XStateToKeyState(KeyState),
|
root_x, root_y, X11DRV_EVENT_XStateToKeyState(KeyState),
|
||||||
GetTickCount(), 0 );
|
0, GetTickCount(), 0 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,8 +289,8 @@ void X11DRV_InitMouse( LPMOUSE_EVENT_PROC proc )
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* X11DRV_SendEvent (internal)
|
* X11DRV_SendEvent (internal)
|
||||||
*/
|
*/
|
||||||
void X11DRV_SendEvent( DWORD mouseStatus, DWORD posX, DWORD posY,
|
void X11DRV_SendEvent( DWORD mouseStatus, DWORD posX, DWORD posY,
|
||||||
DWORD keyState, DWORD time, HWND hWnd )
|
WORD keyState, DWORD data, DWORD time, HWND hWnd )
|
||||||
{
|
{
|
||||||
int width = GetSystemMetrics( SM_CXSCREEN );
|
int width = GetSystemMetrics( SM_CXSCREEN );
|
||||||
int height = GetSystemMetrics( SM_CYSCREEN );
|
int height = GetSystemMetrics( SM_CYSCREEN );
|
||||||
|
@ -318,7 +318,7 @@ void X11DRV_SendEvent( DWORD mouseStatus, DWORD posX, DWORD posY,
|
||||||
/* To avoid deadlocks, we have to suspend all locks on windows structures
|
/* To avoid deadlocks, we have to suspend all locks on windows structures
|
||||||
before the program control is passed to the mouse driver */
|
before the program control is passed to the mouse driver */
|
||||||
iWndsLocks = WIN_SuspendWndsLock();
|
iWndsLocks = WIN_SuspendWndsLock();
|
||||||
DefMouseEventProc( mouseStatus, posX, posY, 0, (DWORD)&wme );
|
DefMouseEventProc( mouseStatus, posX, posY, data, (DWORD)&wme );
|
||||||
WIN_RestoreWndsLock(iWndsLocks);
|
WIN_RestoreWndsLock(iWndsLocks);
|
||||||
InterlockedIncrement( &X11DRV_MOUSE_WarpPointer );
|
InterlockedIncrement( &X11DRV_MOUSE_WarpPointer );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue