Store the keyboard state in the thread input structure on the server
side.

diff --git a/server/trace.c b/server/trace.c
index 322aeb4..fa2be02 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2211,6 +2211,26 @@
     dump_rectangle( &req->rect );
 }
 
+static void dump_get_key_state_request( const struct get_key_state_request *req )
+{
+    fprintf( stderr, " tid=%08x,", req->tid );
+    fprintf( stderr, " key=%d", req->key );
+}
+
+static void dump_get_key_state_reply( const struct get_key_state_reply *req )
+{
+    fprintf( stderr, " state=%02x,", req->state );
+    fprintf( stderr, " keystate=" );
+    dump_varargs_bytes( cur_size );
+}
+
+static void dump_set_key_state_request( const struct set_key_state_request *req )
+{
+    fprintf( stderr, " tid=%08x,", req->tid );
+    fprintf( stderr, " keystate=" );
+    dump_varargs_bytes( cur_size );
+}
+
 static void dump_set_foreground_window_request( const struct set_foreground_window_request *req )
 {
     fprintf( stderr, " handle=%p", req->handle );
@@ -2509,6 +2529,8 @@
     (dump_func)dump_get_window_properties_request,
     (dump_func)dump_attach_thread_input_request,
     (dump_func)dump_get_thread_input_request,
+    (dump_func)dump_get_key_state_request,
+    (dump_func)dump_set_key_state_request,
     (dump_func)dump_set_foreground_window_request,
     (dump_func)dump_set_focus_window_request,
     (dump_func)dump_set_active_window_request,
@@ -2682,6 +2704,8 @@
     (dump_func)dump_get_window_properties_reply,
     (dump_func)0,
     (dump_func)dump_get_thread_input_reply,
+    (dump_func)dump_get_key_state_reply,
+    (dump_func)0,
     (dump_func)dump_set_foreground_window_reply,
     (dump_func)dump_set_focus_window_reply,
     (dump_func)dump_set_active_window_reply,
@@ -2855,6 +2879,8 @@
     "get_window_properties",
     "attach_thread_input",
     "get_thread_input",
+    "get_key_state",
+    "set_key_state",
     "set_foreground_window",
     "set_focus_window",
     "set_active_window",