server: Return the time of last change along with the current cursor position.
authorAlexandre Julliard <julliard@winehq.org>
Thu, 31 Mar 2011 18:15:56 +0000 (20:15 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 31 Mar 2011 18:15:56 +0000 (20:15 +0200)
dlls/user32/input.c
include/wine/server_protocol.h
server/protocol.def
server/queue.c
server/request.h
server/trace.c
server/user.h

index 06553a45d20e1d0840efcc2f7bc83c0bb762ab53..9b220217b0a91d5a15c42d18edbf695bf6292e48 100644 (file)
@@ -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;
 }
 
index 82e95be41f9c8ccd696c89f61de9f38e49f07af5..70e539be8d7ea232bd2bde508a59ac87a4efa07b 100644 (file)
@@ -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 */
index aaaebc0080a3ad7174550d49a6671e7cd7cf4ad0..f8fc82b1494c367d8103930d6f10fdc906de90c5 100644 (file)
@@ -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
index f6ac30328b7ead28d1f55ca455522d5771f328a2..35448e5c033d43a9de6b642ef328ff98b3181895 100644 (file)
@@ -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;
 }
index 47733a53b472a207bcba4e965861cffd8dafa04a..c2104e93d30f58810d3f80f89176416ff139c0fd 100644 (file)
@@ -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 */
 
index 0933cf17259a755eb7445de9a78453235965919e..553ba4d1ceb306d0a8ad484b0f6f88fedfac3d23 100644 (file)
@@ -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] = {
index 52a44a66e30a0e8cd01875fdc862a4f2e292e947..cc603cfe29f74406854b15ce728478f23d86dd25 100644 (file)
@@ -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