Alexandre Julliard : server: Return the time of last change along with the current cursor position.

Alexandre Julliard julliard at winehq.org
Fri Apr 1 09:40:59 CDT 2011


Module: wine
Branch: master
Commit: 6576703facc1f42efcbd755308d46382b763d774
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6576703facc1f42efcbd755308d46382b763d774

Author: Alexandre Julliard <julliard at 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




More information about the wine-cvs mailing list