server: Make layered windows transparent for mouse messages.

Dmitry Timoshkov dmitry at codeweavers.com
Fri Jun 11 05:20:41 CDT 2010


---
 dlls/user32/win.c |    5 +++++
 server/queue.c    |    2 +-
 server/user.h     |    1 +
 server/window.c   |    7 +++++++
 4 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 6800abd..d4b7485 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -3384,6 +3384,11 @@ BOOL WINAPI UpdateLayeredWindowIndirect( HWND hwnd, const UPDATELAYEREDWINDOWINF
 {
     BYTE alpha = 0xff;
 
+    TRACE("%p, %p, %s, %s, %p, %s, %#x, %p, %#x\n", hwnd, info->hdcDst,
+        wine_dbgstr_point(info->pptDst), wine_dbgstr_size(info->psize),
+        info->hdcSrc, wine_dbgstr_point(info->pptSrc), info->crKey,
+        info->pblend, info->dwFlags);
+
     if (!(info->dwFlags & ULW_EX_NORESIZE) && (info->pptDst || info->psize))
     {
         int x = 0, y = 0, cx = 0, cy = 0;
diff --git a/server/queue.c b/server/queue.c
index 755d3c1..ae11901 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -1252,7 +1252,7 @@ static user_handle_t find_hardware_message_window( struct thread_input *input, s
     {
         if (!input || !(win = input->capture))
         {
-            if (!(win = msg->win) || !is_window_visible( win ))
+            if (!(win = msg->win) || !is_window_visible( win ) || is_window_transparent( win ))
             {
                 if (input) win = window_from_point( input->desktop, data->x, data->y );
             }
diff --git a/server/user.h b/server/user.h
index e9ad116..1f0d909 100644
--- a/server/user.h
+++ b/server/user.h
@@ -135,6 +135,7 @@ extern void destroy_thread_windows( struct thread *thread );
 extern int is_child_window( user_handle_t parent, user_handle_t child );
 extern int is_top_level_window( user_handle_t window );
 extern int is_window_visible( user_handle_t window );
+extern int is_window_transparent( user_handle_t window );
 extern int make_window_active( user_handle_t window );
 extern struct thread *get_window_thread( user_handle_t handle );
 extern user_handle_t window_from_point( struct desktop *desktop, int x, int y );
diff --git a/server/window.c b/server/window.c
index 5fd6f71..3b912b0 100644
--- a/server/window.c
+++ b/server/window.c
@@ -602,6 +602,13 @@ int is_window_visible( user_handle_t window )
     return is_visible( win );
 }
 
+int is_window_transparent( user_handle_t window )
+{
+    struct window *win = get_user_object( window, USER_WINDOW );
+    if (!win) return 0;
+    return (win->ex_style & (WS_EX_LAYERED|WS_EX_TRANSPARENT)) == (WS_EX_LAYERED|WS_EX_TRANSPARENT);
+}
+
 /* check if point is inside the window */
 static inline int is_point_in_window( struct window *win, int x, int y )
 {
-- 
1.7.0.6




More information about the wine-patches mailing list