From f4767f142449c15a027b3dc55a10c8e57aba787d Mon Sep 17 00:00:00 2001 From: Kevin Koltzau Date: Thu, 24 Mar 2005 19:15:41 +0000 Subject: [PATCH] Added full support for xbuttons (side mouse buttons). --- dlls/user/message.c | 9 +++++--- dlls/x11drv/mouse.c | 52 ++++++++++++++++++++++++++++++++++++++++----- include/winuser.h | 5 +++++ 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/dlls/user/message.c b/dlls/user/message.c index aa5b4b30f58..f4d3694510f 100644 --- a/dlls/user/message.c +++ b/dlls/user/message.c @@ -47,7 +47,7 @@ WINE_DECLARE_DEBUG_CHANNEL(relay); WINE_DECLARE_DEBUG_CHANNEL(key); #define WM_NCMOUSEFIRST WM_NCMOUSEMOVE -#define WM_NCMOUSELAST WM_NCMBUTTONDBLCLK +#define WM_NCMOUSELAST (WM_NCMOUSEFIRST+(WM_MOUSELAST-WM_MOUSEFIRST)) #define MAX_PACK_COUNT 4 @@ -1704,7 +1704,8 @@ static BOOL process_mouse_message( MSG *msg, ULONG_PTR extra_info, HWND hwnd_fil if ((msg->message == WM_LBUTTONDOWN) || (msg->message == WM_RBUTTONDOWN) || - (msg->message == WM_MBUTTONDOWN)) + (msg->message == WM_MBUTTONDOWN) || + (msg->message == WM_XBUTTONDOWN)) { BOOL update = remove; @@ -1718,6 +1719,7 @@ static BOOL process_mouse_message( MSG *msg, ULONG_PTR extra_info, HWND hwnd_fil { if ((msg->message == clk_msg.message) && (msg->hwnd == clk_msg.hwnd) && + (msg->wParam == clk_msg.wParam) && (msg->time - clk_msg.time < GetDoubleClickTime()) && (abs(msg->pt.x - clk_msg.pt.x) < GetSystemMetrics(SM_CXDOUBLECLK)/2) && (abs(msg->pt.y - clk_msg.pt.y) < GetSystemMetrics(SM_CYDOUBLECLK)/2)) @@ -1774,7 +1776,8 @@ static BOOL process_mouse_message( MSG *msg, ULONG_PTR extra_info, HWND hwnd_fil if ((msg->message == WM_LBUTTONDOWN) || (msg->message == WM_RBUTTONDOWN) || - (msg->message == WM_MBUTTONDOWN)) + (msg->message == WM_MBUTTONDOWN) || + (msg->message == WM_XBUTTONDOWN)) { /* Send the WM_PARENTNOTIFY, * note that even for double/nonclient clicks diff --git a/dlls/x11drv/mouse.c b/dlls/x11drv/mouse.c index 6a0c264dd20..3379ee94250 100644 --- a/dlls/x11drv/mouse.c +++ b/dlls/x11drv/mouse.c @@ -41,7 +41,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(cursor); /**********************************************************************/ -#define NB_BUTTONS 5 /* Windows can handle 3 buttons and the wheel too */ +#ifndef Button6Mask +#define Button6Mask (1<<13) +#endif +#ifndef Button7Mask +#define Button7Mask (1<<14) +#endif + +#define NB_BUTTONS 7 /* Windows can handle 5 buttons and the wheel too */ static const UINT button_down_flags[NB_BUTTONS] = { @@ -49,7 +56,9 @@ static const UINT button_down_flags[NB_BUTTONS] = MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_RIGHTDOWN, MOUSEEVENTF_WHEEL, - MOUSEEVENTF_WHEEL + MOUSEEVENTF_WHEEL, + MOUSEEVENTF_XDOWN, + MOUSEEVENTF_XDOWN }; static const UINT button_up_flags[NB_BUTTONS] = @@ -58,7 +67,9 @@ static const UINT button_up_flags[NB_BUTTONS] = MOUSEEVENTF_MIDDLEUP, MOUSEEVENTF_RIGHTUP, 0, - 0 + 0, + MOUSEEVENTF_XUP, + MOUSEEVENTF_XUP }; POINT cursor_pos; @@ -89,6 +100,8 @@ static inline void update_button_state( unsigned int state ) key_state_table[VK_LBUTTON] = (state & Button1Mask ? 0x80 : 0); key_state_table[VK_MBUTTON] = (state & Button2Mask ? 0x80 : 0); key_state_table[VK_RBUTTON] = (state & Button3Mask ? 0x80 : 0); + key_state_table[VK_XBUTTON1]= (state & Button6Mask ? 0x80 : 0); + key_state_table[VK_XBUTTON2]= (state & Button7Mask ? 0x80 : 0); } @@ -130,7 +143,7 @@ static void update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned if (window != data->grab_window && /* ignore event if a button is pressed, since the mouse is then grabbed too */ - !(state & (Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask))) + !(state & (Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask|Button6Mask|Button7Mask))) { SERVER_START_REQ( update_window_zorder ) { @@ -325,6 +338,18 @@ void X11DRV_send_mouse_input( HWND hwnd, DWORD flags, DWORD x, DWORD y, queue_raw_mouse_message( WM_MOUSEWHEEL, hwnd, pt.x, pt.y, data, time, extra_info, injected_flags ); } + if (flags & MOUSEEVENTF_XDOWN) + { + key_state_table[VK_XBUTTON1 + data - 1] |= 0xc0; + queue_raw_mouse_message( WM_XBUTTONDOWN, hwnd, pt.x, pt.y, data, time, + extra_info, injected_flags ); + } + if (flags & MOUSEEVENTF_XUP) + { + key_state_table[VK_XBUTTON1 + data - 1] &= ~0x80; + queue_raw_mouse_message( WM_XBUTTONUP, hwnd, pt.x, pt.y, data, time, + extra_info, injected_flags ); + } } @@ -724,6 +749,12 @@ void X11DRV_ButtonPress( HWND hwnd, XEvent *xev ) case 4: wData = -WHEEL_DELTA; break; + case 5: + wData = XBUTTON1; + break; + case 6: + wData = XBUTTON2; + break; } update_mouse_state( hwnd, event->window, event->x, event->y, event->state, &pt ); @@ -740,15 +771,26 @@ void X11DRV_ButtonRelease( HWND hwnd, XEvent *xev ) { XButtonEvent *event = &xev->xbutton; int buttonNum = event->button - 1; + WORD wData = 0; POINT pt; if (buttonNum >= NB_BUTTONS || !button_up_flags[buttonNum]) return; if (!hwnd) return; + switch (buttonNum) + { + case 5: + wData = XBUTTON1; + break; + case 6: + wData = XBUTTON2; + break; + } + update_mouse_state( hwnd, event->window, event->x, event->y, event->state, &pt ); X11DRV_send_mouse_input( hwnd, button_up_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE, - pt.x, pt.y, 0, EVENT_x11_time_to_win32_time(event->time), 0, 0 ); + pt.x, pt.y, wData, EVENT_x11_time_to_win32_time(event->time), 0, 0 ); } diff --git a/include/winuser.h b/include/winuser.h index 331e5379828..e6356a03695 100644 --- a/include/winuser.h +++ b/include/winuser.h @@ -1115,6 +1115,9 @@ BOOL WINAPI SetSysColors(INT,const INT*,const COLORREF*); #define WM_XBUTTONUP 0x020C #define WM_XBUTTONDBLCLK 0x020D +#define XBUTTON1 0x0001 +#define XBUTTON2 0x0002 + #define WM_MOUSEFIRST 0x0200 #define WM_MOUSELAST 0x020D @@ -2558,6 +2561,8 @@ typedef struct tagCBTACTIVATESTRUCT #define MOUSEEVENTF_RIGHTUP 0x0010 #define MOUSEEVENTF_MIDDLEDOWN 0x0020 #define MOUSEEVENTF_MIDDLEUP 0x0040 +#define MOUSEEVENTF_XDOWN 0x0080 +#define MOUSEEVENTF_XUP 0x0100 #define MOUSEEVENTF_WHEEL 0x0800 #define MOUSEEVENTF_ABSOLUTE 0x8000