From: Rémi Bernon <rbernon(a)codeweavers.com>
As _WINE_HWND_STYLE and _WINE_HWND_EXSTYLE respectively.
Gamescope parses these to make smarter decisions about what window
to primary focus, or to treat as a dropdown/overlay.
This was originally a Proton commit by Remi Bernon, however,
it would definitely be nice to have support for Gamescope focusing
correctly under upstream Wine as well.
Fixes a bunch of games/launchers run with Wine under Gamescope.
Signed-off-by: Joshua Ashton <joshua(a)froggi.es>
---
dlls/winex11.drv/window.c | 17 +++++++++++++++++
dlls/winex11.drv/x11drv.h | 2 ++
dlls/winex11.drv/x11drv_main.c | 2 ++
3 files changed, 21 insertions(+)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 3b49b7e1d08..728f2417206 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -1601,6 +1601,19 @@ Window create_client_window( HWND hwnd, const XVisualInfo *visual
)
}
+void set_hwnd_style_props( Display *display, Window window, HWND hwnd )
+{
+ DWORD style = NtUserGetWindowLongW( hwnd, GWL_STYLE ), exstyle =
NtUserGetWindowLongW( hwnd, GWL_EXSTYLE );
+
+ TRACE( "display %p, window %lx, hwnd %p\n", display, window, hwnd );
+
+ XChangeProperty( display, window, x11drv_atom(_WINE_HWND_STYLE), XA_CARDINAL, 32,
+ PropModeReplace, (unsigned char *)&style, sizeof(style) / 4 );
+ XChangeProperty( display, window, x11drv_atom(_WINE_HWND_EXSTYLE), XA_CARDINAL, 32,
+ PropModeReplace, (unsigned char *)&exstyle, sizeof(exstyle) / 4
);
+}
+
+
/**********************************************************************
* create_whole_window
*
@@ -1653,6 +1666,8 @@ static void create_whole_window( struct x11drv_win_data *data )
XSaveContext( data->display, data->whole_window, winContext, (char
*)data->hwnd );
NtUserSetProp( data->hwnd, whole_window_prop, (HANDLE)data->whole_window );
+ set_hwnd_style_props( data->display, data->whole_window, data->hwnd );
+
/* set the window text */
if (!NtUserInternalGetWindowText( data->hwnd, text, ARRAY_SIZE( text ))) text[0] =
0;
sync_window_text( data->display, data->whole_window, text );
@@ -2647,6 +2662,8 @@ void X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, UINT
swp_flags,
return;
}
+ set_hwnd_style_props( data->display, data->whole_window, data->hwnd );
+
/* check if we are currently processing an event relevant to this window */
event_type = 0;
if (thread_data &&
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index b8b134357d6..75763eb9a0c 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -517,6 +517,8 @@ enum x11drv_atoms
XATOM__GTK_WORKAREAS_D0,
XATOM__XEMBED,
XATOM__XEMBED_INFO,
+ XATOM__WINE_HWND_STYLE,
+ XATOM__WINE_HWND_EXSTYLE,
XATOM_XdndAware,
XATOM_XdndEnter,
XATOM_XdndPosition,
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 3fd6dcab254..4d764b2a47a 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -185,6 +185,8 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
"_GTK_WORKAREAS_D0",
"_XEMBED",
"_XEMBED_INFO",
+ "_WINE_HWND_STYLE",
+ "_WINE_HWND_EXSTYLE",
"XdndAware",
"XdndEnter",
"XdndPosition",
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/2902