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