From 1e1185abb364f2ffcb5f06f62c1241d419b8b697 Mon Sep 17 00:00:00 2001 From: Wolfgang Lux Date: Fri, 13 Nov 2015 15:30:15 +0000 Subject: [PATCH] Create an empty app icon window before eventually checking the window frame offsets when using WindowMaker. This fixes the issue that the first GNUstep application started under WindowMaker did not get a proper application menu. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@39171 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 8 ++++++++ Source/x11/XGServerWindow.m | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/ChangeLog b/ChangeLog index 9dcfca0..fcac137 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2015-11-13 Wolfgang Lux + + * Source/x11/XGServerWindow.m (_setupRootWindow, window::::): + Create an empty app icon window before eventually checking the + window frame offsets when using WindowMaker. This fixes the issue + that the first GNUstep application started under WindowMaker did + not get a proper application menu. + 2015-11-03 Fred Kiefer * Source/x11/XGServerEvent.m (-processEvent:): For repeated keys diff --git a/Source/x11/XGServerWindow.m b/Source/x11/XGServerWindow.m index ceb27e6..851fb21 100644 --- a/Source/x11/XGServerWindow.m +++ b/Source/x11/XGServerWindow.m @@ -74,6 +74,7 @@ static BOOL handlesWindowDecorations = YES; +static int _wmAppIcon = -1; /* @@ -1708,6 +1709,24 @@ _get_next_prop_new_event(Display *display, XEvent *event, char *arg) // FIXME: Need to set WM_CLIENT_MACHINE as well. } + /* WindowMaker hack: We want to display our own app icon window in the + * icon window provided by WindowMaker. However, this only works when + * the icon window is the first window being mapped. For that reason, + * we create an empty icon window here before the code below eventually + * generates some temporary windows to determine the window frame offsets + * and reuse the icon window once the real app icon window is allocated. + */ + if ((generic.wm & XGWM_WINDOWMAKER) == XGWM_WINDOWMAKER + && generic.flags.useWindowMakerIcons == 1) + { + NSDebugLLog(@"XGTrace", @"WindowMaker hack: Preparing app icon window"); + _wmAppIcon = + [self window: NSZeroRect : NSBackingStoreBuffered + : NSIconWindowMask : defScreen]; + [self orderwindow: NSWindowAbove : -1 : _wmAppIcon]; + NSDebugLLog(@"XGTrace", @"WindowMaker hack: icon window = %d", _wmAppIcon); + } + /* We need to determine the offsets between the actual decorated window * and the window we draw into. */ @@ -1996,6 +2015,19 @@ _get_next_prop_new_event(Display *display, XEvent *event, char *arg) RContext *context; NSDebugLLog(@"XGTrace", @"DPSwindow: %@ %d", NSStringFromRect(frame), (int)type); + /* WindowMaker hack: Reuse the empty app icon allocated in _setupRootWindow + * for the real app icon. + */ + if ((generic.wm & XGWM_WINDOWMAKER) == XGWM_WINDOWMAKER + && generic.flags.useWindowMakerIcons == 1 + && (style & NSIconWindowMask) == NSIconWindowMask + && _wmAppIcon != -1) + { + int win = _wmAppIcon; + NSDebugLLog(@"XGTrace", @"WindowMaker hack: Returning window %d as app icon window", win); + _wmAppIcon = -1; + return win; + } root = [self _rootWindowForScreen: screen]; context = [self xrContextForScreen: screen];