[RFC PATCH 5/6] server: Add src field to hw_input_t, replace SEND_HWMSG_INJECTED.

Rémi Bernon rbernon at codeweavers.com
Mon Nov 11 14:23:02 CST 2019


It allows graphics driver to split their input source into separate
sources for raw input or window input events, in order for example
to guarantee the consistency of the raw input message data.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/user32/message.c           |  3 +++
 dlls/wineandroid.drv/keyboard.c |  1 +
 dlls/wineandroid.drv/window.c   |  2 ++
 dlls/winemac.drv/ime.c          |  1 +
 dlls/winemac.drv/keyboard.c     |  1 +
 dlls/winemac.drv/mouse.c        |  1 +
 dlls/winex11.drv/keyboard.c     |  1 +
 dlls/winex11.drv/mouse.c        |  1 +
 server/protocol.def             | 13 +++++++++----
 server/queue.c                  | 12 ++++++++++--
 server/trace.c                  | 17 ++++++++++++-----
 11 files changed, 42 insertions(+), 11 deletions(-)

diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 2327d66cb05..8613fa5f971 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -3344,6 +3344,7 @@ NTSTATUS inject_hardware_message( HWND hwnd, const INPUT *input )
         switch (input->type)
         {
         case INPUT_MOUSE:
+            req->input.mouse.src   = HW_INPUT_SRC_INJECTED|HW_INPUT_SRC_WINDOW|HW_INPUT_SRC_RAWINPUT;
             req->input.mouse.x     = input->u.mi.dx;
             req->input.mouse.y     = input->u.mi.dy;
             req->input.mouse.data  = input->u.mi.mouseData;
@@ -3352,6 +3353,7 @@ NTSTATUS inject_hardware_message( HWND hwnd, const INPUT *input )
             req->input.mouse.info  = input->u.mi.dwExtraInfo;
             break;
         case INPUT_KEYBOARD:
+            req->input.kbd.src   = HW_INPUT_SRC_INJECTED|HW_INPUT_SRC_WINDOW|HW_INPUT_SRC_RAWINPUT;
             req->input.kbd.vkey  = input->u.ki.wVk;
             req->input.kbd.scan  = input->u.ki.wScan;
             req->input.kbd.flags = input->u.ki.dwFlags;
@@ -3359,6 +3361,7 @@ NTSTATUS inject_hardware_message( HWND hwnd, const INPUT *input )
             req->input.kbd.info  = input->u.ki.dwExtraInfo;
             break;
         case INPUT_HARDWARE:
+            req->input.hw.src    = HW_INPUT_SRC_INJECTED|HW_INPUT_SRC_WINDOW|HW_INPUT_SRC_RAWINPUT;
             req->input.hw.msg    = input->u.hi.uMsg;
             req->input.hw.lparam = MAKELONG( input->u.hi.wParamL, input->u.hi.wParamH );
             break;
diff --git a/dlls/wineandroid.drv/keyboard.c b/dlls/wineandroid.drv/keyboard.c
index 5c9ed2442df..a714b38f5e4 100644
--- a/dlls/wineandroid.drv/keyboard.c
+++ b/dlls/wineandroid.drv/keyboard.c
@@ -676,6 +676,7 @@ static void send_keyboard_input( HWND hwnd, WORD vkey, WORD scan, DWORD flags )
         req->win             = wine_server_user_handle( hwnd );
         req->flags           = 0;
         req->input.type      = INPUT_KEYBOARD;
+        req->input.kbd.src   = HW_INPUT_SRC_WINDOW|HW_INPUT_SRC_RAWINPUT;
         req->input.kbd.vkey  = vkey;
         req->input.kbd.scan  = scan;
         req->input.kbd.flags = flags;
diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c
index 2b757636847..2d88c1f9816 100644
--- a/dlls/wineandroid.drv/window.c
+++ b/dlls/wineandroid.drv/window.c
@@ -527,6 +527,7 @@ static int process_events( DWORD mask )
                     req->win               = wine_server_user_handle( capture ? capture : event->data.motion.hwnd );
                     req->flags             = 0;
                     req->input.type        = INPUT_MOUSE;
+                    req->input.mouse.src   = HW_INPUT_SRC_WINDOW|HW_INPUT_SRC_RAWINPUT;
                     req->input.mouse.x     = event->data.motion.input.u.mi.dx;
                     req->input.mouse.y     = event->data.motion.input.u.mi.dy;
                     req->input.mouse.data  = event->data.motion.input.u.mi.mouseData;
@@ -555,6 +556,7 @@ static int process_events( DWORD mask )
                 req->win             = wine_server_user_handle( 0 );
                 req->flags           = 0;
                 req->input.type      = INPUT_KEYBOARD;
+                req->input.kbd.src   = HW_INPUT_SRC_WINDOW|HW_INPUT_SRC_RAWINPUT;
                 req->input.kbd.vkey  = event->data.kbd.input.u.ki.wVk;
                 req->input.kbd.scan  = event->data.kbd.input.u.ki.wScan;
                 req->input.kbd.flags = event->data.kbd.input.u.ki.dwFlags;
diff --git a/dlls/winemac.drv/ime.c b/dlls/winemac.drv/ime.c
index a8e114457ad..ebbb1e8ccb4 100644
--- a/dlls/winemac.drv/ime.c
+++ b/dlls/winemac.drv/ime.c
@@ -1391,6 +1391,7 @@ static void send_keyboard_char(HWND hwnd, int scan, int flags)
         req->win             = wine_server_user_handle(hwnd);
         req->flags           = 0;
         req->input.type      = INPUT_KEYBOARD;
+        req->input.kbd.src   = HW_INPUT_SRC_WINDOW|HW_INPUT_SRC_RAWINPUT;
         req->input.kbd.vkey  = 0;
         req->input.kbd.scan  = scan;
         req->input.kbd.flags = flags;
diff --git a/dlls/winemac.drv/keyboard.c b/dlls/winemac.drv/keyboard.c
index 45848c3b28e..bb09d1de1e0 100644
--- a/dlls/winemac.drv/keyboard.c
+++ b/dlls/winemac.drv/keyboard.c
@@ -925,6 +925,7 @@ static void macdrv_send_keyboard_input(HWND hwnd, WORD vkey, WORD scan, DWORD fl
         req->win             = wine_server_user_handle(hwnd);
         req->flags           = 0;
         req->input.type      = INPUT_KEYBOARD;
+        req->input.kbd.src   = HW_INPUT_SRC_WINDOW|HW_INPUT_SRC_RAWINPUT;
         req->input.kbd.vkey  = vkey;
         req->input.kbd.scan  = scan;
         req->input.kbd.flags = flags;
diff --git a/dlls/winemac.drv/mouse.c b/dlls/winemac.drv/mouse.c
index 2d7a0b592a9..388b5d8e460 100644
--- a/dlls/winemac.drv/mouse.c
+++ b/dlls/winemac.drv/mouse.c
@@ -162,6 +162,7 @@ static void send_mouse_input(HWND hwnd, macdrv_window cocoa_window, UINT flags,
         req->win               = wine_server_user_handle(top_level_hwnd);
         req->flags             = 0;
         req->input.type        = INPUT_MOUSE;
+        req->input.mouse.src   = HW_INPUT_SRC_WINDOW|HW_INPUT_SRC_RAWINPUT;
         req->input.mouse.x     = x;
         req->input.mouse.y     = y;
         req->input.mouse.data  = mouse_data;
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
index ad7f1266860..2725266f4b3 100644
--- a/dlls/winex11.drv/keyboard.c
+++ b/dlls/winex11.drv/keyboard.c
@@ -1144,6 +1144,7 @@ static void X11DRV_send_keyboard_input( HWND hwnd, WORD vkey, WORD scan, DWORD f
         req->win             = wine_server_user_handle( hwnd );
         req->flags           = 0;
         req->input.type      = INPUT_KEYBOARD;
+        req->input.kbd.src   = HW_INPUT_SRC_WINDOW|HW_INPUT_SRC_RAWINPUT;
         req->input.kbd.vkey  = vkey;
         req->input.kbd.scan  = scan;
         req->input.kbd.flags = flags;
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 7528588d0c4..f98e6804dea 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -600,6 +600,7 @@ static void send_mouse_input( HWND hwnd, LONG dx, LONG dy, DWORD data, DWORD fla
         req->win               = wine_server_user_handle( hwnd );
         req->flags             = 0;
         req->input.type        = INPUT_MOUSE;
+        req->input.mouse.src   = HW_INPUT_SRC_WINDOW|HW_INPUT_SRC_RAWINPUT;
         req->input.mouse.x     = dx;
         req->input.mouse.y     = dy;
         req->input.mouse.data  = data;
diff --git a/server/protocol.def b/server/protocol.def
index 6af0ae0cff8..0e302235ca1 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -329,10 +329,11 @@ struct winevent_msg_data
 
 typedef union
 {
-    int type;
+    short type;
     struct
     {
-        int            type;    /* INPUT_KEYBOARD */
+        short          type;    /* INPUT_KEYBOARD */
+        short          src;     /* input source (see below) */
         unsigned short vkey;    /* virtual key code */
         unsigned short scan;    /* scan code */
         unsigned int   flags;   /* event flags */
@@ -341,7 +342,8 @@ typedef union
     } kbd;
     struct
     {
-        int            type;    /* INPUT_MOUSE */
+        short          type;    /* INPUT_MOUSE */
+        short          src;     /* input source (see below) */
         int            x;       /* coordinates */
         int            y;
         unsigned int   data;    /* mouse data */
@@ -351,11 +353,14 @@ typedef union
     } mouse;
     struct
     {
-        int            type;    /* INPUT_HARDWARE */
+        short          type;    /* INPUT_HARDWARE */
+        short          src;     /* input source (see below) */
         unsigned int   msg;     /* message code */
         lparam_t       lparam;  /* message param */
     } hw;
 } hw_input_t;
+#define HW_INPUT_SRC_WINDOW   1
+#define HW_INPUT_SRC_RAWINPUT 2
 
 typedef union
 {
diff --git a/server/queue.c b/server/queue.c
index b5e17be18fb..19da1f34c74 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -1651,7 +1651,8 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons
         y = desktop->cursor.y;
     }
 
-    if ((device = current->process->rawinput_mouse))
+    if ((device = current->process->rawinput_mouse) &&
+        (input->mouse.src & HW_INPUT_SRC_RAWINPUT))
     {
         if (!(msg = alloc_hardware_message( input->mouse.info, source, time ))) return 0;
         msg_data = msg->data;
@@ -1670,6 +1671,9 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons
         queue_hardware_message( desktop, msg, 0 );
     }
 
+    if (!(input->mouse.src & HW_INPUT_SRC_WINDOW))
+        return 0;
+
     for (i = 0; i < ARRAY_SIZE( messages ); i++)
     {
         if (!messages[i]) continue;
@@ -1777,7 +1781,8 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c
         break;
     }
 
-    if ((device = current->process->rawinput_kbd))
+    if ((device = current->process->rawinput_kbd) &&
+        (input->kbd.src & HW_INPUT_SRC_RAWINPUT))
     {
         if (!(msg = alloc_hardware_message( input->kbd.info, source, time ))) return 0;
         msg_data = msg->data;
@@ -1795,6 +1800,9 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c
         queue_hardware_message( desktop, msg, 0 );
     }
 
+    if (!(input->kbd.src & HW_INPUT_SRC_WINDOW))
+        return 0;
+
     if (!(msg = alloc_hardware_message( input->kbd.info, source, time ))) return 0;
     msg_data = msg->data;
 
diff --git a/server/trace.c b/server/trace.c
index 615542cff52..6674505bc1c 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -379,23 +379,30 @@ static void dump_irp_params( const char *prefix, const irp_params_t *data )
 
 static void dump_hw_input( const char *prefix, const hw_input_t *input )
 {
+    char src[] = "--";
     switch (input->type)
     {
     case INPUT_MOUSE:
-        fprintf( stderr, "%s{type=MOUSE,x=%d,y=%d,data=%08x,flags=%08x,time=%u",
-                 prefix, input->mouse.x, input->mouse.y, input->mouse.data, input->mouse.flags,
+        if (input->mouse.src & HW_INPUT_SRC_WINDOW) src[0] = 'w';
+        if (input->mouse.src & HW_INPUT_SRC_RAWINPUT) src[1] = 'r';
+        fprintf( stderr, "%s{type=MOUSE,src=%s,x=%d,y=%d,data=%08x,flags=%08x,time=%u",
+                 prefix, src, input->mouse.x, input->mouse.y, input->mouse.data, input->mouse.flags,
                  input->mouse.time );
         dump_uint64( ",info=", &input->mouse.info );
         fputc( '}', stderr );
         break;
     case INPUT_KEYBOARD:
-        fprintf( stderr, "%s{type=KEYBOARD,vkey=%04hx,scan=%04hx,flags=%08x,time=%u",
-                 prefix, input->kbd.vkey, input->kbd.scan, input->kbd.flags, input->kbd.time );
+        if (input->kbd.src & HW_INPUT_SRC_WINDOW) src[0] = 'w';
+        if (input->kbd.src & HW_INPUT_SRC_RAWINPUT) src[1] = 'r';
+        fprintf( stderr, "%s{type=KEYBOARD,src=%s,vkey=%04hx,scan=%04hx,flags=%08x,time=%u",
+                 prefix, src, input->kbd.vkey, input->kbd.scan, input->kbd.flags, input->kbd.time );
         dump_uint64( ",info=", &input->kbd.info );
         fputc( '}', stderr );
         break;
     case INPUT_HARDWARE:
-        fprintf( stderr, "%s{type=HARDWARE,msg=%04x", prefix, input->hw.msg );
+        if (input->hw.src & HW_INPUT_SRC_WINDOW) src[0] = 'w';
+        if (input->hw.src & HW_INPUT_SRC_RAWINPUT) src[1] = 'r';
+        fprintf( stderr, "%s{type=HARDWARE,src=%s,msg=%04x", prefix, src, input->hw.msg );
         dump_uint64( ",lparam=", &input->hw.lparam );
         fputc( '}', stderr );
         break;
-- 
2.24.0.rc2




More information about the wine-devel mailing list