Attached a patch to NSApplication, to minimize all windows when the user
hide the app (or when is deactivated) if the AppIcon is suppressed. I
know this is not the most elegant solution but avoid loss the app. I
think the idea of have a miniaturized AppIcon is good, but for some
reason, this AppIcon don't miniaturize after call -miniaturize:. Of
course the user can minimize that AppIcon, but isn't the idea. Also I
added "#ifdef _MINGW32_ [self miniaturizeAll: self]; #else...." in
method deactivate:, just for be consistently.
Index: Source/NSApplication.m
===================================================================
--- Source/NSApplication.m (revision 32715)
+++ Source/NSApplication.m (working copy)
@@ -1376,93 +1376,108 @@
*/
- (void) deactivate
{
+#ifdef __MINGW32__
+ [self miniaturizeAll: self];
+#else
if (_app_is_active == YES)
{
- NSArray *windows_list;
- NSDictionary *info;
- NSWindow *win;
- NSEnumerator *iter;
+ if (![[NSUserDefaults standardUserDefaults]
+ boolForKey: @"GSSuppressAppIcon"])
+ {
+ NSArray *windows_list;
+ NSDictionary *info;
+ NSWindow *win;
+ NSEnumerator *iter;
- [nc postNotificationName: NSApplicationWillResignActiveNotification
- object: self];
-
- _app_is_active = NO;
-
- if ([self keyWindow] != nil)
- {
- _hidden_key = [self keyWindow];
- [_hidden_key resignKeyWindow];
- }
- // The main window is saved for when the app is activated again.
- // This is necessary for menu in window.
- if ([self mainWindow] != nil)
- {
- _hidden_main = [self mainWindow];
- [_hidden_main resignMainWindow];
- }
-
- windows_list = GSOrderedWindows();
- iter = [windows_list reverseObjectEnumerator];
-
- while ((win = [iter nextObject]))
- {
- NSModalSession theSession;
-
- if ([win isVisible] == NO)
- {
- continue; /* Already invisible */
- }
- if ([win canHide] == NO)
- {
- continue; /* Can't be hidden */
- }
- if (win == _app_icon_window)
- {
- continue; /* can't hide the app icon. */
- }
- /* Don't order out modal windows */
- theSession = _session;
- while (theSession != 0)
- {
- if (win == theSession->window)
- break;
- theSession = theSession->previous;
- }
- if (theSession)
- continue;
-
- if ([win hidesOnDeactivate] == YES)
- {
- [_inactive addObject: win];
- [win orderOut: self];
- }
- }
-
- if (YES == [[NSUserDefaults standardUserDefaults]
- boolForKey: @"GSSuppressAppIcon"])
- {
+ [nc postNotificationName: NSApplicationWillResignActiveNotification
+ object: self];
+
+ _app_is_active = NO;
+
+ if ([self keyWindow] != nil)
+ {
+ _hidden_key = [self keyWindow];
+ [_hidden_key resignKeyWindow];
+ }
+ // The main window is saved for when the app is activated again.
+ // This is necessary for menu in window.
+ if ([self mainWindow] != nil)
+ {
+ _hidden_main = [self mainWindow];
+ [_hidden_main resignMainWindow];
+ }
+
+ windows_list = GSOrderedWindows();
+ iter = [windows_list reverseObjectEnumerator];
+
+ while ((win = [iter nextObject]))
+ {
+ NSModalSession theSession;
+
+ if ([win isVisible] == NO)
+ {
+ continue; /* Already invisible */
+ }
+ if ([win canHide] == NO)
+ {
+ continue; /* Can't be hidden */
+ }
+ if (win == _app_icon_window)
+ {
+ continue; /* can't hide the app icon. */
+ }
+ /* Don't order out modal windows */
+ theSession = _session;
+ while (theSession != 0)
+ {
+ if (win == theSession->window)
+ break;
+ theSession = theSession->previous;
+ }
+ if (theSession)
+ continue;
+
+ if ([win hidesOnDeactivate] == YES)
+ {
+ [_inactive addObject: win];
+ [win orderOut: self];
+ }
+ }
+
+ if (YES == [[NSUserDefaults standardUserDefaults]
+ boolForKey: @"GSSuppressAppIcon"])
+ {
#if MINI_ICON
- NSRect f = [[[self mainMenu] window] frame];
- NSPoint p = f.origin;
-
- p.y += f.size.height;
- [_app_icon_window setFrameTopLeftPoint: p];
- [_app_icon_window orderFrontRegardless];
- [_app_icon_window miniaturize: self];
+ NSRect f = [[[self mainMenu] window] frame];
+ NSPoint p = f.origin;
+
+ p.y += f.size.height;
+ [_app_icon_window setFrameTopLeftPoint: p];
+ [_app_icon_window orderFrontRegardless];
+ [_app_icon_window miniaturize: self];
#else
- [_app_icon_window orderFrontRegardless];
+ [_app_icon_window orderFrontRegardless];
#endif
+ }
+
+ info = [self _notificationUserInfo];
+ [nc postNotificationName: NSApplicationDidResignActiveNotification
+ object: self
+ userInfo: info];
+ [[[NSWorkspace sharedWorkspace] notificationCenter]
+ postNotificationName: NSApplicationDidResignActiveNotification
+ object: [NSWorkspace sharedWorkspace]
+ userInfo: info];
}
-
- info = [self _notificationUserInfo];
- [nc postNotificationName: NSApplicationDidResignActiveNotification
- object: self
- userInfo: info];
- [[[NSWorkspace sharedWorkspace] notificationCenter]
- postNotificationName: NSApplicationDidResignActiveNotification
- object: [NSWorkspace sharedWorkspace]
- userInfo: info];
+ else
+ {
+ /*Minimize all windows if there isn't an AppIcon. This isn't the
+ most elegant solution, but avoids to loss the app if it is
+ deactivated. */
+ [self miniaturizeAll: self];
+ }
}
+#endif
}
/**
@@ -2429,89 +2444,100 @@
#else
if (_app_is_hidden == NO)
{
- NSArray *windows_list;
- NSDictionary *info;
- NSWindow *win;
- NSEnumerator *iter;
+ if (![[NSUserDefaults standardUserDefaults]
+ boolForKey: @"GSSuppressAppIcon"])
+ {
+ NSArray *windows_list;
+ NSDictionary *info;
+ NSWindow *win;
+ NSEnumerator *iter;
- [nc postNotificationName: NSApplicationWillHideNotification
- object: self];
+ [nc postNotificationName: NSApplicationWillHideNotification
+ object: self];
- if ([self keyWindow] != nil)
- {
- _hidden_key = [self keyWindow];
- [_hidden_key resignKeyWindow];
- }
-
- // The main window is saved for when the app is activated again.
- // This is necessary for menu in window.
- if ([self mainWindow] != nil)
- {
- _hidden_main = [self mainWindow];
- [_hidden_main resignMainWindow];
- }
-
- windows_list = GSOrderedWindows();
- iter = [windows_list reverseObjectEnumerator];
-
- while ((win = [iter nextObject]))
- {
- if ([win isVisible] == NO && ![win isMiniaturized])
- {
- continue; /* Already invisible */
- }
- if ([win canHide] == NO)
- {
- continue; /* Not hideable */
- }
- if (win == _app_icon_window)
- {
- continue; /* can't hide the app icon. */
- }
- if (_app_is_active == YES && [win hidesOnDeactivate] == YES)
- {
- continue; /* Will be hidden by deactivation */
- }
- [_hidden addObject: win];
- [win orderOut: self];
- }
- _app_is_hidden = YES;
-
- if (YES == [[NSUserDefaults standardUserDefaults]
- boolForKey: @"GSSuppressAppIcon"])
- {
+ if ([self keyWindow] != nil)
+ {
+ _hidden_key = [self keyWindow];
+ [_hidden_key resignKeyWindow];
+ }
+
+ // The main window is saved for when the app is activated again.
+ // This is necessary for menu in window.
+ if ([self mainWindow] != nil)
+ {
+ _hidden_main = [self mainWindow];
+ [_hidden_main resignMainWindow];
+ }
+
+ windows_list = GSOrderedWindows();
+ iter = [windows_list reverseObjectEnumerator];
+
+ while ((win = [iter nextObject]))
+ {
+ if ([win isVisible] == NO && ![win isMiniaturized])
+ {
+ continue; /* Already invisible */
+ }
+ if ([win canHide] == NO)
+ {
+ continue; /* Not hideable */
+ }
+ if (win == _app_icon_window)
+ {
+ continue; /* can't hide the app icon. */
+ }
+ if (_app_is_active == YES && [win hidesOnDeactivate] == YES)
+ {
+ continue; /* Will be hidden by deactivation */
+ }
+ [_hidden addObject: win];
+ [win orderOut: self];
+ }
+ _app_is_hidden = YES;
+
+ if (YES == [[NSUserDefaults standardUserDefaults]
+ boolForKey: @"GSSuppressAppIcon"])
+ {
#if MINI_ICON
- NSRect f = [[[self mainMenu] window] frame];
- NSPoint p = f.origin;
-
- p.y += f.size.height;
- [_app_icon_window setFrameTopLeftPoint: p];
- [_app_icon_window orderFrontRegardless];
- [_app_icon_window miniaturize: self];
+ NSRect f = [[[self mainMenu] window] frame];
+ NSPoint p = f.origin;
+
+ p.y += f.size.height;
+ [_app_icon_window setFrameTopLeftPoint: p];
+ [_app_icon_window orderFrontRegardless];
+ [_app_icon_window miniaturize: self];
#else
- [_app_icon_window orderFrontRegardless];
+ [_app_icon_window orderFrontRegardless];
#endif
+ }
+ else
+ {
+ [[_app_icon_window contentView] setNeedsDisplay: YES];
+ }
+
+ /*
+ * On hiding we also deactivate the application which will make the menus
+ * go away too.
+ */
+ [self deactivate];
+ _unhide_on_activation = YES;
+
+ info = [self _notificationUserInfo];
+ [nc postNotificationName: NSApplicationDidHideNotification
+ object: self
+ userInfo: info];
+ [[[NSWorkspace sharedWorkspace] notificationCenter]
+ postNotificationName: NSApplicationDidHideNotification
+ object: [NSWorkspace sharedWorkspace]
+ userInfo: info];
}
else
{
- [[_app_icon_window contentView] setNeedsDisplay: YES];
+ /*Minimize all windows if there isn't an AppIcon. This isn't the
+ most elegant solution, but avoids to loss the app if the user
+ hide it. */
+ [self miniaturizeAll: sender];
}
-
- /*
- * On hiding we also deactivate the application which will make the menus
- * go away too.
- */
- [self deactivate];
- _unhide_on_activation = YES;
-
- info = [self _notificationUserInfo];
- [nc postNotificationName: NSApplicationDidHideNotification
- object: self
- userInfo: info];
- [[[NSWorkspace sharedWorkspace] notificationCenter]
- postNotificationName: NSApplicationDidHideNotification
- object: [NSWorkspace sharedWorkspace]
- userInfo: info];
}
#endif
}
_______________________________________________
Gnustep-dev mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/gnustep-dev