forked from AuroraMiddleware/gtk
GDK W32: Only use owner windows for popups
GTK4 doesn't have WS_CHILD windows anymore, so hWndParent argument to CreateWindowEx() is always interpreted as the owner window, not the parent window. A window with an owner: * is above the owner in Z-order * is destroyed when the owner is destroyed * is hidden when the owner is minimized This is enforced by the OS. GTK can only allow this for popup windows. Desktop window must never[0] be an owner. [0]: https://devblogs.microsoft.com/oldnewthing/20040224-00/?p=40493
This commit is contained in:
parent
493b30c2a8
commit
b12d521bce
@ -473,7 +473,7 @@ _gdk_win32_display_create_surface (GdkDisplay *display,
|
||||
int height)
|
||||
{
|
||||
HWND hwndNew;
|
||||
HANDLE hparent;
|
||||
HANDLE owner;
|
||||
ATOM klass = 0;
|
||||
DWORD dwStyle = 0, dwExStyle;
|
||||
RECT rect;
|
||||
@ -494,8 +494,6 @@ _gdk_win32_display_create_surface (GdkDisplay *display,
|
||||
g_print ("_gdk_surface_new: %s\n", (surface_type == GDK_SURFACE_TOPLEVEL ? "TOPLEVEL" :
|
||||
(surface_type == GDK_SURFACE_TEMP ? "TEMP" : "???"))));
|
||||
|
||||
hparent = (parent != NULL) ? GDK_SURFACE_HWND (parent) : NULL;
|
||||
|
||||
display_win32 = GDK_WIN32_DISPLAY (display);
|
||||
|
||||
if (parent)
|
||||
@ -524,36 +522,28 @@ _gdk_win32_display_create_surface (GdkDisplay *display,
|
||||
impl->unscaled_height = height * impl->surface_scale;
|
||||
|
||||
dwExStyle = 0;
|
||||
owner = NULL;
|
||||
|
||||
offset_x = _gdk_offset_x;
|
||||
offset_y = _gdk_offset_y;
|
||||
/* MSDN: We need WS_CLIPCHILDREN and WS_CLIPSIBLINGS for GL Context Creation */
|
||||
dwStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
|
||||
|
||||
switch (surface_type)
|
||||
{
|
||||
case GDK_SURFACE_TOPLEVEL:
|
||||
if (parent)
|
||||
{
|
||||
/* The common code warns for this case. */
|
||||
hparent = GetDesktopWindow ();
|
||||
}
|
||||
/* MSDN: We need WS_CLIPCHILDREN and WS_CLIPSIBLINGS for GL Context Creation */
|
||||
dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
|
||||
|
||||
offset_x = _gdk_offset_x;
|
||||
offset_y = _gdk_offset_y;
|
||||
break;
|
||||
|
||||
case GDK_SURFACE_POPUP:
|
||||
dwStyle = WS_POPUP;
|
||||
dwStyle |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
|
||||
offset_x = _gdk_offset_x;
|
||||
offset_y = _gdk_offset_y;
|
||||
dwStyle |= WS_OVERLAPPEDWINDOW;
|
||||
break;
|
||||
|
||||
case GDK_SURFACE_TEMP:
|
||||
/* A temp window is not necessarily a top level window */
|
||||
dwStyle = WS_POPUP;
|
||||
dwStyle |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
|
||||
dwExStyle |= WS_EX_TOOLWINDOW | WS_EX_TOPMOST;
|
||||
offset_x = _gdk_offset_x;
|
||||
offset_y = _gdk_offset_y;
|
||||
/* fall through */
|
||||
case GDK_SURFACE_POPUP:
|
||||
dwStyle |= WS_POPUP;
|
||||
|
||||
/* Only popup and temp windows are fit to use the Owner Window mechanism */
|
||||
if (parent != NULL)
|
||||
owner = GDK_SURFACE_HWND (parent);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -611,7 +601,7 @@ _gdk_win32_display_create_surface (GdkDisplay *display,
|
||||
dwStyle,
|
||||
window_x, window_y,
|
||||
window_width, window_height,
|
||||
hparent,
|
||||
owner,
|
||||
NULL,
|
||||
_gdk_dll_hinstance,
|
||||
surface);
|
||||
@ -646,7 +636,7 @@ _gdk_win32_display_create_surface (GdkDisplay *display,
|
||||
window_width, window_height,
|
||||
surface->x - offset_x,
|
||||
surface->y - offset_y,
|
||||
hparent,
|
||||
owner,
|
||||
hwndNew));
|
||||
|
||||
g_free (wtitle);
|
||||
|
Loading…
Reference in New Issue
Block a user