XQuartz: Make application switching work better for the no-spaces case
We still have the issue with not raising the frontmost window for the case when spaces is enabled, and the AppleSpacesSwitchOnActivate preference is disabled. Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
This commit is contained in:
parent
e5bc62a032
commit
4fc4cab98d
|
@ -337,7 +337,7 @@ static void message_kit_thread (SEL selector, NSObject *arg) {
|
||||||
case NSApplicationActivatedEventType:
|
case NSApplicationActivatedEventType:
|
||||||
for_x = NO;
|
for_x = NO;
|
||||||
if ([self modalWindow] == nil) {
|
if ([self modalWindow] == nil) {
|
||||||
BOOL switch_on_activate, ok;
|
BOOL order_all_windows = YES, workspaces, ok;
|
||||||
for_appkit = NO;
|
for_appkit = NO;
|
||||||
|
|
||||||
/* FIXME: hack to avoid having to pass the event to appkit,
|
/* FIXME: hack to avoid having to pass the event to appkit,
|
||||||
|
@ -347,13 +347,27 @@ static void message_kit_thread (SEL selector, NSObject *arg) {
|
||||||
[self activateX:YES];
|
[self activateX:YES];
|
||||||
|
|
||||||
/* Get the Spaces preference for SwitchOnActivate */
|
/* Get the Spaces preference for SwitchOnActivate */
|
||||||
(void)CFPreferencesAppSynchronize(CFSTR(".GlobalPreferences"));
|
(void)CFPreferencesAppSynchronize(CFSTR("com.apple.dock"));
|
||||||
switch_on_activate = CFPreferencesGetAppBooleanValue(CFSTR("AppleSpacesSwitchOnActivate"), CFSTR(".GlobalPreferences"), &ok);
|
workspaces = CFPreferencesGetAppBooleanValue(CFSTR("workspaces"), CFSTR("com.apple.dock"), &ok);
|
||||||
if (!ok)
|
if (!ok)
|
||||||
switch_on_activate = YES;
|
workspaces = NO;
|
||||||
|
|
||||||
if ([e data2] & 0x10 && switch_on_activate) // 0x10 is set when we use cmd-tab or the dock icon
|
if (workspaces) {
|
||||||
DarwinSendDDXEvent(kXquartzBringAllToFront, 0);
|
(void)CFPreferencesAppSynchronize(CFSTR(".GlobalPreferences"));
|
||||||
|
order_all_windows = CFPreferencesGetAppBooleanValue(CFSTR("AppleSpacesSwitchOnActivate"), CFSTR(".GlobalPreferences"), &ok);
|
||||||
|
if (!ok)
|
||||||
|
order_all_windows = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: In the workspaces && !AppleSpacesSwitchOnActivate case, the windows are ordered
|
||||||
|
* correctly, but we need to activate the top window on this space if there is
|
||||||
|
* none active.
|
||||||
|
*
|
||||||
|
* If there are no active windows, and there are minimized windows, we should
|
||||||
|
* be restoring one of them.
|
||||||
|
*/
|
||||||
|
if ([e data2] & 0x10) // 0x10 is set when we use cmd-tab or the dock icon
|
||||||
|
DarwinSendDDXEvent(kXquartzBringAllToFront, 1, order_all_windows);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ Bool QuartzModeEventHandler(int screenNum, XQuartzEvent *e, DeviceIntPtr dev) {
|
||||||
|
|
||||||
case kXquartzBringAllToFront:
|
case kXquartzBringAllToFront:
|
||||||
DEBUG_LOG("kXquartzBringAllToFront\n");
|
DEBUG_LOG("kXquartzBringAllToFront\n");
|
||||||
RootlessOrderAllWindows();
|
RootlessOrderAllWindows(e->data[0]);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -444,7 +444,7 @@ void RootlessUpdateScreenPixmap(ScreenPtr pScreen);
|
||||||
void RootlessRepositionWindows(ScreenPtr pScreen);
|
void RootlessRepositionWindows(ScreenPtr pScreen);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Bring all windows to the front of the Aqua stack
|
* Bring all windows to the front of the native stack
|
||||||
*/
|
*/
|
||||||
void RootlessOrderAllWindows (void);
|
void RootlessOrderAllWindows (Bool include_unhitable);
|
||||||
#endif /* _ROOTLESS_H */
|
#endif /* _ROOTLESS_H */
|
||||||
|
|
|
@ -581,10 +581,15 @@ RootlessReorderWindow(WindowPtr pWin)
|
||||||
|
|
||||||
RootlessStopDrawing(pWin, FALSE);
|
RootlessStopDrawing(pWin, FALSE);
|
||||||
|
|
||||||
/* Find the next window above this one that has a mapped frame. */
|
/* Find the next window above this one that has a mapped frame.
|
||||||
|
* Only include cases where the windows are in the same category of
|
||||||
|
* hittability to ensure offscreen windows dont get restacked
|
||||||
|
* relative to onscreen ones (but that the offscreen ones maintain
|
||||||
|
* their stacking order if they are explicitly asked to Reorder
|
||||||
|
*/
|
||||||
|
|
||||||
newPrevW = pWin->prevSib;
|
newPrevW = pWin->prevSib;
|
||||||
while (newPrevW && (WINREC(newPrevW) == NULL || !newPrevW->realized))
|
while (newPrevW && (WINREC(newPrevW) == NULL || !newPrevW->realized || newPrevW->rootlessUnhittable != pWin->rootlessUnhittable))
|
||||||
newPrevW = newPrevW->prevSib;
|
newPrevW = newPrevW->prevSib;
|
||||||
|
|
||||||
newPrev = newPrevW != NULL ? WINREC(newPrevW) : NULL;
|
newPrev = newPrevW != NULL ? WINREC(newPrevW) : NULL;
|
||||||
|
@ -1502,7 +1507,7 @@ RootlessChangeBorderWidth(WindowPtr pWin, unsigned int width)
|
||||||
* (i.e in front of Aqua windows) -- called when X11.app is given focus
|
* (i.e in front of Aqua windows) -- called when X11.app is given focus
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
RootlessOrderAllWindows (void)
|
RootlessOrderAllWindows (Bool include_unhitable)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
WindowPtr pWin;
|
WindowPtr pWin;
|
||||||
|
@ -1519,6 +1524,7 @@ RootlessOrderAllWindows (void)
|
||||||
for (pWin = pWin->firstChild; pWin != NULL; pWin = pWin->nextSib) {
|
for (pWin = pWin->firstChild; pWin != NULL; pWin = pWin->nextSib) {
|
||||||
if (!pWin->realized) continue;
|
if (!pWin->realized) continue;
|
||||||
if (RootlessEnsureFrame(pWin) == NULL) continue;
|
if (RootlessEnsureFrame(pWin) == NULL) continue;
|
||||||
|
if (!include_unhitable && pWin->rootlessUnhittable) continue;
|
||||||
RootlessReorderWindow (pWin);
|
RootlessReorderWindow (pWin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue