Alexandre Julliard : winex11: Build the mouse input structure directly in the mouse event handlers.
Alexandre Julliard
julliard at winehq.org
Wed Apr 13 10:49:25 CDT 2011
Module: wine
Branch: master
Commit: b1be3ddbc618a0bacc478090f5552ca50daa0efc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b1be3ddbc618a0bacc478090f5552ca50daa0efc
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Apr 12 21:20:08 2011 +0200
winex11: Build the mouse input structure directly in the mouse event handlers.
---
dlls/winex11.drv/mouse.c | 152 +++++++++++++++++++++++++---------------------
1 files changed, 82 insertions(+), 70 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index eb903cd..1716916 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -92,6 +92,32 @@ static const UINT button_up_flags[NB_BUTTONS] =
MOUSEEVENTF_XUP
};
+static const UINT button_down_data[NB_BUTTONS] =
+{
+ 0,
+ 0,
+ 0,
+ WHEEL_DELTA,
+ -WHEEL_DELTA,
+ XBUTTON1,
+ XBUTTON2,
+ XBUTTON1,
+ XBUTTON2
+};
+
+static const UINT button_up_data[NB_BUTTONS] =
+{
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ XBUTTON1,
+ XBUTTON2,
+ XBUTTON1,
+ XBUTTON2
+};
+
static HWND cursor_window;
static HCURSOR last_cursor;
static DWORD last_cursor_change;
@@ -214,34 +240,35 @@ void sync_window_cursor( Window window )
*
* Update the various window states on a mouse event.
*/
-static void send_mouse_input( HWND hwnd, UINT flags, Window window, int x, int y,
- unsigned int state, DWORD mouse_data, Time time )
+static void send_mouse_input( HWND hwnd, Window window, unsigned int state, INPUT *input )
{
struct x11drv_win_data *data;
POINT pt;
- INPUT input;
+
+ input->type = INPUT_MOUSE;
if (!hwnd && window == clip_window)
{
- pt.x = x + clip_rect.left;
- pt.y = y + clip_rect.top;
- goto done;
+ input->u.mi.dx += clip_rect.left;
+ input->u.mi.dy += clip_rect.top;
+ __wine_send_input( hwnd, input );
+ return;
}
if (!(data = X11DRV_get_win_data( hwnd ))) return;
if (window == data->whole_window)
{
- x += data->whole_rect.left - data->client_rect.left;
- y += data->whole_rect.top - data->client_rect.top;
+ input->u.mi.dx += data->whole_rect.left - data->client_rect.left;
+ input->u.mi.dy += data->whole_rect.top - data->client_rect.top;
}
if (window == root_window)
{
- x += virtual_screen_rect.left;
- y += virtual_screen_rect.top;
+ input->u.mi.dx += virtual_screen_rect.left;
+ input->u.mi.dy += virtual_screen_rect.top;
}
- pt.x = x;
- pt.y = y;
+ pt.x = input->u.mi.dx;
+ pt.y = input->u.mi.dy;
if (GetWindowLongW( data->hwnd, GWL_EXSTYLE ) & WS_EX_LAYOUTRTL)
pt.x = data->client_rect.right - data->client_rect.left - 1 - pt.x;
MapWindowPoints( hwnd, 0, &pt, 1 );
@@ -277,16 +304,9 @@ static void send_mouse_input( HWND hwnd, UINT flags, Window window, int x, int y
SERVER_END_REQ;
}
-done:
- input.type = INPUT_MOUSE;
- input.u.mi.dx = pt.x;
- input.u.mi.dy = pt.y;
- input.u.mi.mouseData = mouse_data;
- input.u.mi.dwFlags = flags;
- input.u.mi.time = EVENT_x11_time_to_win32_time( time );
- input.u.mi.dwExtraInfo = 0;
-
- __wine_send_input( hwnd, &input );
+ input->u.mi.dx = pt.x;
+ input->u.mi.dy = pt.y;
+ __wine_send_input( hwnd, input );
}
#ifdef SONAME_LIBXCURSOR
@@ -983,35 +1003,21 @@ void X11DRV_ButtonPress( HWND hwnd, XEvent *xev )
{
XButtonEvent *event = &xev->xbutton;
int buttonNum = event->button - 1;
- WORD wData = 0;
+ INPUT input;
if (buttonNum >= NB_BUTTONS) return;
- switch (buttonNum)
- {
- case 3:
- wData = WHEEL_DELTA;
- break;
- case 4:
- wData = -WHEEL_DELTA;
- break;
- case 5:
- wData = XBUTTON1;
- break;
- case 6:
- wData = XBUTTON2;
- break;
- case 7:
- wData = XBUTTON1;
- break;
- case 8:
- wData = XBUTTON2;
- break;
- }
+ TRACE( "hwnd %p/%lx button %u pos %d,%d\n", hwnd, event->window, buttonNum, event->x, event->y );
+
+ input.u.mi.dx = event->x;
+ input.u.mi.dy = event->y;
+ input.u.mi.mouseData = button_down_data[buttonNum];
+ input.u.mi.dwFlags = button_down_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
+ input.u.mi.time = EVENT_x11_time_to_win32_time( event->time );
+ input.u.mi.dwExtraInfo = 0;
update_user_time( event->time );
- send_mouse_input( hwnd, button_down_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE,
- event->window, event->x, event->y, event->state, wData, event->time );
+ send_mouse_input( hwnd, event->window, event->state, &input );
}
@@ -1022,28 +1028,20 @@ void X11DRV_ButtonRelease( HWND hwnd, XEvent *xev )
{
XButtonEvent *event = &xev->xbutton;
int buttonNum = event->button - 1;
- WORD wData = 0;
+ INPUT input;
if (buttonNum >= NB_BUTTONS || !button_up_flags[buttonNum]) return;
- switch (buttonNum)
- {
- case 5:
- wData = XBUTTON1;
- break;
- case 6:
- wData = XBUTTON2;
- break;
- case 7:
- wData = XBUTTON1;
- break;
- case 8:
- wData = XBUTTON2;
- break;
- }
+ TRACE( "hwnd %p/%lx button %u pos %d,%d\n", hwnd, event->window, buttonNum, event->x, event->y );
+
+ input.u.mi.dx = event->x;
+ input.u.mi.dy = event->y;
+ input.u.mi.mouseData = button_up_data[buttonNum];
+ input.u.mi.dwFlags = button_up_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
+ input.u.mi.time = EVENT_x11_time_to_win32_time( event->time );
+ input.u.mi.dwExtraInfo = 0;
- send_mouse_input( hwnd, button_up_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE,
- event->window, event->x, event->y, event->state, wData, event->time );
+ send_mouse_input( hwnd, event->window, event->state, &input );
}
@@ -1053,11 +1051,18 @@ void X11DRV_ButtonRelease( HWND hwnd, XEvent *xev )
void X11DRV_MotionNotify( HWND hwnd, XEvent *xev )
{
XMotionEvent *event = &xev->xmotion;
+ INPUT input;
- TRACE("hwnd %p, event->is_hint %d\n", hwnd, event->is_hint);
+ TRACE( "hwnd %p/%lx pos %d,%d is_hint %d\n", hwnd, event->window, event->x, event->y, event->is_hint );
- send_mouse_input( hwnd, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE,
- event->window, event->x, event->y, event->state, 0, event->time );
+ input.u.mi.dx = event->x;
+ input.u.mi.dy = event->y;
+ input.u.mi.mouseData = 0;
+ input.u.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
+ input.u.mi.time = EVENT_x11_time_to_win32_time( event->time );
+ input.u.mi.dwExtraInfo = 0;
+
+ send_mouse_input( hwnd, event->window, event->state, &input );
}
@@ -1067,13 +1072,20 @@ void X11DRV_MotionNotify( HWND hwnd, XEvent *xev )
void X11DRV_EnterNotify( HWND hwnd, XEvent *xev )
{
XCrossingEvent *event = &xev->xcrossing;
+ INPUT input;
- TRACE("hwnd %p, event->detail %d\n", hwnd, event->detail);
+ TRACE( "hwnd %p/%lx pos %d,%d detail %d\n", hwnd, event->window, event->x, event->y, event->detail );
if (event->detail == NotifyVirtual || event->detail == NotifyNonlinearVirtual) return;
if (event->window == x11drv_thread_data()->grab_window) return;
/* simulate a mouse motion event */
- send_mouse_input( hwnd, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE,
- event->window, event->x, event->y, event->state, 0, event->time );
+ input.u.mi.dx = event->x;
+ input.u.mi.dy = event->y;
+ input.u.mi.mouseData = 0;
+ input.u.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
+ input.u.mi.time = EVENT_x11_time_to_win32_time( event->time );
+ input.u.mi.dwExtraInfo = 0;
+
+ send_mouse_input( hwnd, event->window, event->state, &input );
}
More information about the wine-cvs
mailing list