sych with blackbox
This commit is contained in:
parent
1525520dd1
commit
3312a209d7
3 changed files with 64 additions and 55 deletions
|
@ -245,11 +245,11 @@ public:
|
|||
inline unsigned int getResizeZones(void) const
|
||||
{ return resource.resize_zones; }
|
||||
|
||||
inline unsigned int getCurrentWorkspaceID(void)
|
||||
inline unsigned int getCurrentWorkspaceID(void) const
|
||||
{ return current_workspace->getID(); }
|
||||
inline unsigned int getWorkspaceCount(void)
|
||||
inline unsigned int getWorkspaceCount(void) const
|
||||
{ return workspacesList.size(); }
|
||||
inline unsigned int getIconCount(void) { return iconList.size(); }
|
||||
inline unsigned int getIconCount(void) const { return iconList.size(); }
|
||||
inline unsigned int getNumberOfWorkspaces(void) const
|
||||
{ return resource.workspaces; }
|
||||
inline int getPlacementPolicy(void) const
|
||||
|
|
|
@ -422,7 +422,7 @@ Window BlackboxWindow::createToplevelWindow(void) {
|
|||
ButtonMotionMask | EnterWindowMask;
|
||||
|
||||
return XCreateWindow(blackbox->getXDisplay(), screen->getRootWindow(),
|
||||
-1, -1, 1, 1, frame.border_w, screen->getDepth(),
|
||||
0, 0, 1, 1, frame.border_w, screen->getDepth(),
|
||||
InputOutput, screen->getVisual(), create_mask,
|
||||
&attrib_create);
|
||||
}
|
||||
|
@ -462,10 +462,14 @@ void BlackboxWindow::associateClientWindow(void) {
|
|||
XSelectInput(blackbox->getXDisplay(), frame.plate, SubstructureRedirectMask);
|
||||
|
||||
XGrabServer(blackbox->getXDisplay());
|
||||
XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask);
|
||||
XReparentWindow(blackbox->getXDisplay(), client.window, frame.plate, 0, 0);
|
||||
|
||||
unsigned long event_mask = PropertyChangeMask | FocusChangeMask |
|
||||
StructureNotifyMask;
|
||||
XSelectInput(blackbox->getXDisplay(), client.window,
|
||||
PropertyChangeMask | FocusChangeMask | StructureNotifyMask);
|
||||
event_mask & ~StructureNotifyMask);
|
||||
XReparentWindow(blackbox->getXDisplay(), client.window, frame.plate, 0, 0);
|
||||
XSelectInput(blackbox->getXDisplay(), client.window, event_mask);
|
||||
|
||||
XUngrabServer(blackbox->getXDisplay());
|
||||
|
||||
XRaiseWindow(blackbox->getXDisplay(), frame.plate);
|
||||
|
@ -1636,11 +1640,13 @@ void BlackboxWindow::iconify(void) {
|
|||
* split second, leaving us with a ghost window... so, we need to do this
|
||||
* while the X server is grabbed
|
||||
*/
|
||||
unsigned long event_mask = PropertyChangeMask | FocusChangeMask |
|
||||
StructureNotifyMask;
|
||||
XGrabServer(blackbox->getXDisplay());
|
||||
XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask);
|
||||
XUnmapWindow(blackbox->getXDisplay(), client.window);
|
||||
XSelectInput(blackbox->getXDisplay(), client.window,
|
||||
PropertyChangeMask | FocusChangeMask | StructureNotifyMask);
|
||||
event_mask & ~StructureNotifyMask);
|
||||
XUnmapWindow(blackbox->getXDisplay(), client.window);
|
||||
XSelectInput(blackbox->getXDisplay(), client.window, event_mask);
|
||||
XUngrabServer(blackbox->getXDisplay());
|
||||
|
||||
XUnmapWindow(blackbox->getXDisplay(), frame.window);
|
||||
|
@ -1749,10 +1755,12 @@ void BlackboxWindow::withdraw(void) {
|
|||
|
||||
XGrabServer(blackbox->getXDisplay());
|
||||
|
||||
XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask);
|
||||
XUnmapWindow(blackbox->getXDisplay(), client.window);
|
||||
unsigned long event_mask = PropertyChangeMask | FocusChangeMask |
|
||||
StructureNotifyMask;
|
||||
XSelectInput(blackbox->getXDisplay(), client.window,
|
||||
PropertyChangeMask | FocusChangeMask | StructureNotifyMask);
|
||||
event_mask & ~StructureNotifyMask);
|
||||
XUnmapWindow(blackbox->getXDisplay(), client.window);
|
||||
XSelectInput(blackbox->getXDisplay(), client.window, event_mask);
|
||||
|
||||
XUngrabServer(blackbox->getXDisplay());
|
||||
|
||||
|
@ -3679,16 +3687,8 @@ BWindowGroup::BWindowGroup(Blackbox *b, Window _group)
|
|||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
watch for destroy notify on the group window (in addition to
|
||||
any other events we are looking for)
|
||||
|
||||
since some managed windows can also be window group controllers,
|
||||
we need to make sure that we don't clobber the event mask for the
|
||||
managed window
|
||||
*/
|
||||
XSelectInput(blackbox->getXDisplay(), group,
|
||||
wattrib.your_event_mask | StructureNotifyMask);
|
||||
PropertyChangeMask | FocusChangeMask | StructureNotifyMask);
|
||||
|
||||
blackbox->saveGroupSearch(group, this);
|
||||
}
|
||||
|
|
|
@ -103,19 +103,14 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
|
|||
// pass focus to the next appropriate window
|
||||
if ((w->isFocused() || w == lastfocus) &&
|
||||
! screen->getBlackbox()->doShutdown()) {
|
||||
if (id == screen->getCurrentWorkspaceID()) {
|
||||
// The window is on the visible workspace
|
||||
focusFallback(w);
|
||||
} else {
|
||||
// The window is not on the visible workspace.
|
||||
if (lastfocus == w) {
|
||||
// The window was the last-focus target, so we need to replace it.
|
||||
setLastFocusedWindow(stackingList.front());
|
||||
}
|
||||
// if the window focused on the current workspace, then reapply that
|
||||
// workspace's focus too
|
||||
if (w->isFocused())
|
||||
screen->getCurrentWorkspace()->focusFallback(w);
|
||||
focusFallback(w);
|
||||
|
||||
// if the window is sticky, then it needs to be removed on all other
|
||||
// workspaces too!
|
||||
if (w->isStuck()) {
|
||||
for (unsigned int i = 0; i < screen->getWorkspaceCount(); ++i)
|
||||
if (i != id)
|
||||
screen->getWorkspace(i)->focusFallback(w);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -141,31 +136,45 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
|
|||
void Workspace::focusFallback(const BlackboxWindow *old_window) {
|
||||
BlackboxWindow *newfocus = 0;
|
||||
|
||||
// if it's a transient, then try to focus its parent
|
||||
if (old_window && old_window->isTransient()) {
|
||||
newfocus = old_window->getTransientFor();
|
||||
if (id == screen->getCurrentWorkspaceID()) {
|
||||
// The window is on the visible workspace.
|
||||
|
||||
if (! newfocus ||
|
||||
newfocus->isIconic() || // do not focus icons
|
||||
newfocus->getWorkspaceNumber() != id || // or other workspaces
|
||||
! newfocus->setInputFocus())
|
||||
newfocus = 0;
|
||||
}
|
||||
// if it's a transient, then try to focus its parent
|
||||
if (old_window && old_window->isTransient()) {
|
||||
newfocus = old_window->getTransientFor();
|
||||
|
||||
if (! newfocus) {
|
||||
BlackboxWindowList::iterator it = stackingList.begin(),
|
||||
end = stackingList.end();
|
||||
for (; it != end; ++it) {
|
||||
BlackboxWindow *tmp = *it;
|
||||
if (tmp && tmp->setInputFocus()) {
|
||||
// we found our new focus target
|
||||
newfocus = tmp;
|
||||
break;
|
||||
if (! newfocus ||
|
||||
newfocus->isIconic() || // do not focus icons
|
||||
newfocus->getWorkspaceNumber() != id || // or other workspaces
|
||||
! newfocus->setInputFocus())
|
||||
newfocus = 0;
|
||||
}
|
||||
|
||||
if (! newfocus) {
|
||||
BlackboxWindowList::iterator it = stackingList.begin(),
|
||||
end = stackingList.end();
|
||||
for (; it != end; ++it) {
|
||||
BlackboxWindow *tmp = *it;
|
||||
if (tmp && tmp->setInputFocus()) {
|
||||
// we found our new focus target
|
||||
newfocus = tmp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
screen->getBlackbox()->setFocusedWindow(newfocus);
|
||||
screen->getBlackbox()->setFocusedWindow(newfocus);
|
||||
} else {
|
||||
// The window is not on the visible workspace.
|
||||
|
||||
if (old_window && lastfocus == old_window) {
|
||||
// The window was the last-focus target, so we need to replace it.
|
||||
BlackboxWindow *win = (BlackboxWindow*) 0;
|
||||
if (! stackingList.empty())
|
||||
win = stackingList.front();
|
||||
setLastFocusedWindow(win);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue