[PATCH 1/3] server: expand protocol to store global key state

Rafał Miłecki zajec5 at gmail.com
Sun Sep 6 08:27:27 CDT 2009


server: expand protocol to store global key state

I've added get_global_key_state and set_global_key_state to protocol
for storing global key state in server's data (memory?).

I modified protocol.def and queue.c, rest was generated by
tools/make_requests script.

-- 
Rafał Miłecki
-------------- next part --------------
From b5351f5d757e008b7fa78876caada6c853d3fb48 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5 at gmail.com>
Date: Sun, 6 Sep 2009 15:18:46 +0200
Subject: [PATCH] server: expand protocol to store global key state
To: wine-patches <wine-patches at winehq.org>
Reply-To: wine-devel <wine-devel at winehq.org>

---
 include/wine/server_protocol.h |   36 +++++++++++++++++++++++++++++++++++-
 server/protocol.def            |   15 +++++++++++++++
 server/queue.c                 |   16 ++++++++++++++++
 server/request.h               |   10 ++++++++++
 server/trace.c                 |   22 ++++++++++++++++++++++
 5 files changed, 98 insertions(+), 1 deletions(-)

diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 0b18b50..bb39681 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -3687,6 +3687,34 @@ struct set_key_state_reply
 };
 
 
+
+struct get_global_key_state_request
+{
+    struct request_header __header;
+    int            key;
+};
+struct get_global_key_state_reply
+{
+    struct reply_header __header;
+    unsigned char  state;
+    char __pad_9[7];
+};
+
+
+struct set_global_key_state_request
+{
+    struct request_header __header;
+    int            key;
+    unsigned char  state;
+    char __pad_17[7];
+};
+struct set_global_key_state_reply
+{
+    struct reply_header __header;
+};
+
+
+
 struct set_foreground_window_request
 {
     struct request_header __header;
@@ -4802,6 +4830,8 @@ enum request
     REQ_get_last_input_time,
     REQ_get_key_state,
     REQ_set_key_state,
+    REQ_get_global_key_state,
+    REQ_set_global_key_state,
     REQ_set_foreground_window,
     REQ_set_focus_window,
     REQ_set_active_window,
@@ -5047,6 +5077,8 @@ union generic_request
     struct get_last_input_time_request get_last_input_time_request;
     struct get_key_state_request get_key_state_request;
     struct set_key_state_request set_key_state_request;
+    struct get_global_key_state_request get_global_key_state_request;
+    struct set_global_key_state_request set_global_key_state_request;
     struct set_foreground_window_request set_foreground_window_request;
     struct set_focus_window_request set_focus_window_request;
     struct set_active_window_request set_active_window_request;
@@ -5290,6 +5322,8 @@ union generic_reply
     struct get_last_input_time_reply get_last_input_time_reply;
     struct get_key_state_reply get_key_state_reply;
     struct set_key_state_reply set_key_state_reply;
+    struct get_global_key_state_reply get_global_key_state_reply;
+    struct set_global_key_state_reply set_global_key_state_reply;
     struct set_foreground_window_reply set_foreground_window_reply;
     struct set_focus_window_reply set_focus_window_reply;
     struct set_active_window_reply set_active_window_reply;
@@ -5347,6 +5381,6 @@ union generic_reply
     struct set_window_layered_info_reply set_window_layered_info_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 390
+#define SERVER_PROTOCOL_VERSION 391
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index 9748931..30c48db 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2619,6 +2619,21 @@ enum message_type
     VARARG(keystate,bytes);       /* state array for all the keys */
 @END
 
+
+/* Get global key state */
+ at REQ(get_global_key_state)
+    int            key;           /* key */
+ at REPLY
+    unsigned char  state;         /* state of specified key */
+ at END
+
+/* Set global key state */
+ at REQ(set_global_key_state)
+    int            key;           /* key */
+    unsigned char  state;         /* state of specified key */
+ at END
+
+
 /* Set the system foreground window */
 @REQ(set_foreground_window)
     user_handle_t  handle;        /* handle to the foreground window */
diff --git a/server/queue.c b/server/queue.c
index c5841c9..922d22d 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -131,6 +131,8 @@ struct msg_queue
     timeout_t              last_get_msg;    /* time of last get message call */
 };
 
+unsigned char global_key_state_table[256];
+
 static void msg_queue_dump( struct object *obj, int verbose );
 static int msg_queue_add_queue( struct object *obj, struct wait_queue_entry *entry );
 static void msg_queue_remove_queue( struct object *obj, struct wait_queue_entry *entry );
@@ -2107,6 +2109,20 @@ DECL_HANDLER(set_key_state)
 }
 
 
+/* get global key state */
+DECL_HANDLER(get_global_key_state)
+{
+    reply->state = global_key_state_table[req->key];
+}
+
+
+/* set global key state */
+DECL_HANDLER(set_global_key_state)
+{
+    global_key_state_table[req->key] = req->state;
+}
+
+
 /* set the system foreground window */
 DECL_HANDLER(set_foreground_window)
 {
diff --git a/server/request.h b/server/request.h
index c726130..1515e67 100644
--- a/server/request.h
+++ b/server/request.h
@@ -294,6 +294,8 @@ DECL_HANDLER(get_thread_input);
 DECL_HANDLER(get_last_input_time);
 DECL_HANDLER(get_key_state);
 DECL_HANDLER(set_key_state);
+DECL_HANDLER(get_global_key_state);
+DECL_HANDLER(set_global_key_state);
 DECL_HANDLER(set_foreground_window);
 DECL_HANDLER(set_focus_window);
 DECL_HANDLER(set_active_window);
@@ -538,6 +540,8 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
     (req_handler)req_get_last_input_time,
     (req_handler)req_get_key_state,
     (req_handler)req_set_key_state,
+    (req_handler)req_get_global_key_state,
+    (req_handler)req_set_global_key_state,
     (req_handler)req_set_foreground_window,
     (req_handler)req_set_focus_window,
     (req_handler)req_set_active_window,
@@ -1584,6 +1588,12 @@ C_ASSERT( FIELD_OFFSET(struct get_key_state_reply, state) == 8 );
 C_ASSERT( sizeof(struct get_key_state_reply) == 16 );
 C_ASSERT( FIELD_OFFSET(struct set_key_state_request, tid) == 12 );
 C_ASSERT( sizeof(struct set_key_state_request) == 16 );
+C_ASSERT( FIELD_OFFSET(struct get_global_key_state_request, key) == 12 );
+C_ASSERT( FIELD_OFFSET(struct get_global_key_state_reply, state) == 8 );
+C_ASSERT( sizeof(struct get_global_key_state_reply) == 16 );
+C_ASSERT( FIELD_OFFSET(struct set_global_key_state_request, key) == 12 );
+C_ASSERT( FIELD_OFFSET(struct set_global_key_state_request, state) == 16 );
+C_ASSERT( sizeof(struct set_global_key_state_request) == 24 );
 C_ASSERT( FIELD_OFFSET(struct set_foreground_window_request, handle) == 12 );
 C_ASSERT( FIELD_OFFSET(struct set_foreground_window_reply, previous) == 8 );
 C_ASSERT( FIELD_OFFSET(struct set_foreground_window_reply, send_msg_old) == 12 );
diff --git a/server/trace.c b/server/trace.c
index 511c460..bb6aa87 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -3092,6 +3092,22 @@ static void dump_set_key_state_request( const struct set_key_state_request *req
     dump_varargs_bytes( ", keystate=", cur_size );
 }
 
+static void dump_get_global_key_state_request( const struct get_global_key_state_request *req )
+{
+    fprintf( stderr, " key=%d", req->key );
+}
+
+static void dump_get_global_key_state_reply( const struct get_global_key_state_reply *req )
+{
+    fprintf( stderr, " state=%02x", req->state );
+}
+
+static void dump_set_global_key_state_request( const struct set_global_key_state_request *req )
+{
+    fprintf( stderr, " key=%d", req->key );
+    fprintf( stderr, ", state=%02x", req->state );
+}
+
 static void dump_set_foreground_window_request( const struct set_foreground_window_request *req )
 {
     fprintf( stderr, " handle=%08x", req->handle );
@@ -3966,6 +3982,8 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_get_last_input_time_request,
     (dump_func)dump_get_key_state_request,
     (dump_func)dump_set_key_state_request,
+    (dump_func)dump_get_global_key_state_request,
+    (dump_func)dump_set_global_key_state_request,
     (dump_func)dump_set_foreground_window_request,
     (dump_func)dump_set_focus_window_request,
     (dump_func)dump_set_active_window_request,
@@ -4207,6 +4225,8 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_get_last_input_time_reply,
     (dump_func)dump_get_key_state_reply,
     NULL,
+    (dump_func)dump_get_global_key_state_reply,
+    NULL,
     (dump_func)dump_set_foreground_window_reply,
     (dump_func)dump_set_focus_window_reply,
     (dump_func)dump_set_active_window_reply,
@@ -4448,6 +4468,8 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
     "get_last_input_time",
     "get_key_state",
     "set_key_state",
+    "get_global_key_state",
+    "set_global_key_state",
     "set_foreground_window",
     "set_focus_window",
     "set_active_window",
-- 
1.6.0.2


More information about the wine-patches mailing list