Alexandre Julliard : server: Return the cursor information for a thread input, and use it for GetCursorInfo.

Alexandre Julliard julliard at winehq.org
Tue May 11 12:09:37 CDT 2010


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue May 11 11:21:03 2010 +0200

server: Return the cursor information for a thread input, and use it for GetCursorInfo.

---

 dlls/user32/input.c            |   17 ++++++++++++++---
 include/wine/server_protocol.h |    6 ++++--
 server/protocol.def            |    2 ++
 server/queue.c                 |   13 +++----------
 server/request.h               |    6 ++++--
 server/trace.c                 |    2 ++
 6 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index f14590d..0dccf21 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -207,11 +207,22 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetCursorPos( POINT *pt )
  */
 BOOL WINAPI GetCursorInfo( PCURSORINFO pci )
 {
+    BOOL ret;
+
     if (!pci) return 0;
-    pci->hCursor = LoadCursorW( 0, (LPCWSTR)IDC_ARROW );
-    pci->flags = CURSOR_SHOWING;
+
+    SERVER_START_REQ( get_thread_input )
+    {
+        req->tid = 0;
+        if ((ret = !wine_server_call( req )))
+        {
+            pci->hCursor = wine_server_ptr_handle( reply->cursor );
+            pci->flags = (reply->show_count >= 0) ? CURSOR_SHOWING : 0;
+        }
+    }
+    SERVER_END_REQ;
     GetCursorPos(&pci->ptScreenPos);
-    return 1;
+    return ret;
 }
 
 
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 24790a5..20bb4a2 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -3697,8 +3697,10 @@ struct get_thread_input_reply
     user_handle_t  menu_owner;
     user_handle_t  move_size;
     user_handle_t  caret;
+    user_handle_t  cursor;
+    int            show_count;
     rectangle_t    rect;
-    char __pad_52[4];
+    char __pad_60[4];
 };
 
 
@@ -5483,6 +5485,6 @@ union generic_reply
     struct set_cursor_reply set_cursor_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 400
+#define SERVER_PROTOCOL_VERSION 401
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index 5015e97..e4e8ec3 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2604,6 +2604,8 @@ enum message_type
     user_handle_t  menu_owner;    /* handle to the menu owner */
     user_handle_t  move_size;     /* handle to the moving/resizing window */
     user_handle_t  caret;         /* handle to the caret window */
+    user_handle_t  cursor;        /* handle to the cursor */
+    int            show_count;    /* cursor show count */
     rectangle_t    rect;          /* caret rectangle */
 @END
 
diff --git a/server/queue.c b/server/queue.c
index 4a06a73..d2090cd 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -2055,18 +2055,11 @@ DECL_HANDLER(get_thread_input)
         reply->menu_owner = input->menu_owner;
         reply->move_size  = input->move_size;
         reply->caret      = input->caret;
+        reply->cursor     = input->cursor;
+        reply->show_count = input->cursor_count;
         reply->rect       = input->caret_rect;
     }
-    else
-    {
-        reply->focus      = 0;
-        reply->capture    = 0;
-        reply->active     = 0;
-        reply->menu_owner = 0;
-        reply->move_size  = 0;
-        reply->caret      = 0;
-        reply->rect.left = reply->rect.top = reply->rect.right = reply->rect.bottom = 0;
-    }
+
     /* foreground window is active window of foreground thread */
     reply->foreground = foreground_input ? foreground_input->active : 0;
     if (thread) release_object( thread );
diff --git a/server/request.h b/server/request.h
index 604d115..ef6adea 100644
--- a/server/request.h
+++ b/server/request.h
@@ -1712,8 +1712,10 @@ C_ASSERT( FIELD_OFFSET(struct get_thread_input_reply, foreground) == 20 );
 C_ASSERT( FIELD_OFFSET(struct get_thread_input_reply, menu_owner) == 24 );
 C_ASSERT( FIELD_OFFSET(struct get_thread_input_reply, move_size) == 28 );
 C_ASSERT( FIELD_OFFSET(struct get_thread_input_reply, caret) == 32 );
-C_ASSERT( FIELD_OFFSET(struct get_thread_input_reply, rect) == 36 );
-C_ASSERT( sizeof(struct get_thread_input_reply) == 56 );
+C_ASSERT( FIELD_OFFSET(struct get_thread_input_reply, cursor) == 36 );
+C_ASSERT( FIELD_OFFSET(struct get_thread_input_reply, show_count) == 40 );
+C_ASSERT( FIELD_OFFSET(struct get_thread_input_reply, rect) == 44 );
+C_ASSERT( sizeof(struct get_thread_input_reply) == 64 );
 C_ASSERT( sizeof(struct get_last_input_time_request) == 16 );
 C_ASSERT( FIELD_OFFSET(struct get_last_input_time_reply, time) == 8 );
 C_ASSERT( sizeof(struct get_last_input_time_reply) == 16 );
diff --git a/server/trace.c b/server/trace.c
index c97bd70..ec87dab 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -3076,6 +3076,8 @@ static void dump_get_thread_input_reply( const struct get_thread_input_reply *re
     fprintf( stderr, ", menu_owner=%08x", req->menu_owner );
     fprintf( stderr, ", move_size=%08x", req->move_size );
     fprintf( stderr, ", caret=%08x", req->caret );
+    fprintf( stderr, ", cursor=%08x", req->cursor );
+    fprintf( stderr, ", show_count=%d", req->show_count );
     dump_rectangle( ", rect=", &req->rect );
 }
 




More information about the wine-cvs mailing list