Module: wine Branch: master Commit: 6576703facc1f42efcbd755308d46382b763d774 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6576703facc1f42efcbd755308...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Mar 31 20:15:56 2011 +0200
server: Return the time of last change along with the current cursor position.
---
dlls/user32/input.c | 23 +++++++---------------- include/wine/server_protocol.h | 4 +++- server/protocol.def | 1 + server/queue.c | 11 +++++++---- server/request.h | 3 ++- server/trace.c | 1 + server/user.h | 1 + 7 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/dlls/user32/input.c b/dlls/user32/input.c index 06553a4..9b22021 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -52,7 +52,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(win); WINE_DECLARE_DEBUG_CHANNEL(keyboard);
-static DWORD last_mouse_event;
/*********************************************************************** * get_key_state @@ -124,10 +123,7 @@ BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret ) */ BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input ) { - NTSTATUS status; - - if (input->type == INPUT_MOUSE) last_mouse_event = GetTickCount(); - status = send_hardware_message( hwnd, input, 0 ); + NTSTATUS status = send_hardware_message( hwnd, input, 0 ); if (status) SetLastError( RtlNtStatusToDosError(status) ); return !status; } @@ -183,7 +179,6 @@ UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size ) { /* we need to update the coordinates to what the server expects */ INPUT input = inputs[i]; - last_mouse_event = GetTickCount(); update_mouse_coords( &input ); if (!(status = send_hardware_message( 0, &input, SEND_HWMSG_INJECTED ))) { @@ -254,28 +249,24 @@ void WINAPI mouse_event( DWORD dwFlags, DWORD dx, DWORD dy, */ BOOL WINAPI DECLSPEC_HOTPATCH GetCursorPos( POINT *pt ) { - BOOL ret = FALSE; + BOOL ret; + DWORD last_change;
if (!pt) return FALSE;
- /* query new position from graphics driver if we haven't updated recently */ - if (GetTickCount() - last_mouse_event > 100) ret = USER_Driver->pGetCursorPos( pt ); - SERVER_START_REQ( set_cursor ) { - if (ret) /* update it */ - { - req->flags = SET_CURSOR_POS; - req->x = pt->x; - req->y = pt->y; - } if ((ret = !wine_server_call( req ))) { pt->x = reply->new_x; pt->y = reply->new_y; + last_change = reply->last_change; } } SERVER_END_REQ; + + /* query new position from graphics driver if we haven't updated recently */ + if (ret && GetTickCount() - last_change > 100) ret = USER_Driver->pGetCursorPos( pt ); return ret; }
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 82e95be..70e539b 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -4807,6 +4807,8 @@ struct set_cursor_reply int new_x; int new_y; rectangle_t new_clip; + unsigned int last_change; + char __pad_44[4]; }; #define SET_CURSOR_HANDLE 0x01 #define SET_CURSOR_COUNT 0x02 @@ -5559,6 +5561,6 @@ union generic_reply struct set_cursor_reply set_cursor_reply; };
-#define SERVER_PROTOCOL_VERSION 417 +#define SERVER_PROTOCOL_VERSION 418
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/protocol.def b/server/protocol.def index aaaebc0..f8fc82b 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3324,6 +3324,7 @@ enum coords_relative int new_x; /* new position */ int new_y; rectangle_t new_clip; /* new clip rectangle */ + unsigned int last_change; /* time of last position change */ @END #define SET_CURSOR_HANDLE 0x01 #define SET_CURSOR_COUNT 0x02 diff --git a/server/queue.c b/server/queue.c index f6ac303..35448e5 100644 --- a/server/queue.c +++ b/server/queue.c @@ -1281,6 +1281,7 @@ static void set_cursor_pos( struct desktop *desktop, int x, int y ) { desktop->cursor.x = min( max( x, desktop->cursor.clip.left ), desktop->cursor.clip.right - 1 ); desktop->cursor.y = min( max( y, desktop->cursor.clip.top ), desktop->cursor.clip.bottom - 1 ); + desktop->cursor.last_change = get_tick_count(); }
/* queue a hardware message into a given thread input */ @@ -1411,9 +1412,10 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons WM_MOUSEHWHEEL /* 0x1000 = MOUSEEVENTF_HWHEEL */ };
+ desktop->cursor.last_change = get_tick_count(); flags = input->mouse.flags; time = input->mouse.time; - if (!time) time = get_tick_count(); + if (!time) time = desktop->cursor.last_change;
if (flags & MOUSEEVENTF_MOVE) { @@ -2624,7 +2626,8 @@ DECL_HANDLER(set_cursor) input->desktop->cursor.clip = top_rect; }
- reply->new_x = input->desktop->cursor.x; - reply->new_y = input->desktop->cursor.y; - reply->new_clip = input->desktop->cursor.clip; + reply->new_x = input->desktop->cursor.x; + reply->new_y = input->desktop->cursor.y; + reply->new_clip = input->desktop->cursor.clip; + reply->last_change = input->desktop->cursor.last_change; } diff --git a/server/request.h b/server/request.h index 47733a5..c2104e9 100644 --- a/server/request.h +++ b/server/request.h @@ -2103,7 +2103,8 @@ C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, prev_count) == 12 ); C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, new_x) == 16 ); C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, new_y) == 20 ); C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, new_clip) == 24 ); -C_ASSERT( sizeof(struct set_cursor_reply) == 40 ); +C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, last_change) == 40 ); +C_ASSERT( sizeof(struct set_cursor_reply) == 48 );
#endif /* WANT_REQUEST_HANDLERS */
diff --git a/server/trace.c b/server/trace.c index 0933cf1..553ba4d 100644 --- a/server/trace.c +++ b/server/trace.c @@ -3905,6 +3905,7 @@ static void dump_set_cursor_reply( const struct set_cursor_reply *req ) fprintf( stderr, ", new_x=%d", req->new_x ); fprintf( stderr, ", new_y=%d", req->new_y ); dump_rectangle( ", new_clip=", &req->new_clip ); + fprintf( stderr, ", last_change=%08x", req->last_change ); }
static const dump_func req_dumpers[REQ_NB_REQUESTS] = { diff --git a/server/user.h b/server/user.h index 52a44a6..cc603cf 100644 --- a/server/user.h +++ b/server/user.h @@ -56,6 +56,7 @@ struct global_cursor int x; /* cursor position */ int y; rectangle_t clip; /* cursor clip rectangle */ + unsigned int last_change; /* time of last position change */ };
struct desktop