sych with blackbox

This commit is contained in:
Dana Jansens 2002-07-14 18:45:46 +00:00
parent 1525520dd1
commit 3312a209d7
3 changed files with 64 additions and 55 deletions

View file

@ -245,11 +245,11 @@ public:
inline unsigned int getResizeZones(void) const inline unsigned int getResizeZones(void) const
{ return resource.resize_zones; } { return resource.resize_zones; }
inline unsigned int getCurrentWorkspaceID(void) inline unsigned int getCurrentWorkspaceID(void) const
{ return current_workspace->getID(); } { return current_workspace->getID(); }
inline unsigned int getWorkspaceCount(void) inline unsigned int getWorkspaceCount(void) const
{ return workspacesList.size(); } { 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 inline unsigned int getNumberOfWorkspaces(void) const
{ return resource.workspaces; } { return resource.workspaces; }
inline int getPlacementPolicy(void) const inline int getPlacementPolicy(void) const

View file

@ -422,7 +422,7 @@ Window BlackboxWindow::createToplevelWindow(void) {
ButtonMotionMask | EnterWindowMask; ButtonMotionMask | EnterWindowMask;
return XCreateWindow(blackbox->getXDisplay(), screen->getRootWindow(), 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, InputOutput, screen->getVisual(), create_mask,
&attrib_create); &attrib_create);
} }
@ -462,10 +462,14 @@ void BlackboxWindow::associateClientWindow(void) {
XSelectInput(blackbox->getXDisplay(), frame.plate, SubstructureRedirectMask); XSelectInput(blackbox->getXDisplay(), frame.plate, SubstructureRedirectMask);
XGrabServer(blackbox->getXDisplay()); 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, 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()); XUngrabServer(blackbox->getXDisplay());
XRaiseWindow(blackbox->getXDisplay(), frame.plate); 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 * split second, leaving us with a ghost window... so, we need to do this
* while the X server is grabbed * while the X server is grabbed
*/ */
unsigned long event_mask = PropertyChangeMask | FocusChangeMask |
StructureNotifyMask;
XGrabServer(blackbox->getXDisplay()); XGrabServer(blackbox->getXDisplay());
XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask);
XUnmapWindow(blackbox->getXDisplay(), client.window);
XSelectInput(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()); XUngrabServer(blackbox->getXDisplay());
XUnmapWindow(blackbox->getXDisplay(), frame.window); XUnmapWindow(blackbox->getXDisplay(), frame.window);
@ -1749,10 +1755,12 @@ void BlackboxWindow::withdraw(void) {
XGrabServer(blackbox->getXDisplay()); XGrabServer(blackbox->getXDisplay());
XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask); unsigned long event_mask = PropertyChangeMask | FocusChangeMask |
XUnmapWindow(blackbox->getXDisplay(), client.window); StructureNotifyMask;
XSelectInput(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()); XUngrabServer(blackbox->getXDisplay());
@ -3679,16 +3687,8 @@ BWindowGroup::BWindowGroup(Blackbox *b, Window _group)
return; 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, XSelectInput(blackbox->getXDisplay(), group,
wattrib.your_event_mask | StructureNotifyMask); PropertyChangeMask | FocusChangeMask | StructureNotifyMask);
blackbox->saveGroupSearch(group, this); blackbox->saveGroupSearch(group, this);
} }

View file

@ -103,19 +103,14 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
// pass focus to the next appropriate window // pass focus to the next appropriate window
if ((w->isFocused() || w == lastfocus) && if ((w->isFocused() || w == lastfocus) &&
! screen->getBlackbox()->doShutdown()) { ! screen->getBlackbox()->doShutdown()) {
if (id == screen->getCurrentWorkspaceID()) {
// The window is on the visible workspace
focusFallback(w); focusFallback(w);
} else {
// The window is not on the visible workspace. // if the window is sticky, then it needs to be removed on all other
if (lastfocus == w) { // workspaces too!
// The window was the last-focus target, so we need to replace it. if (w->isStuck()) {
setLastFocusedWindow(stackingList.front()); for (unsigned int i = 0; i < screen->getWorkspaceCount(); ++i)
} if (i != id)
// if the window focused on the current workspace, then reapply that screen->getWorkspace(i)->focusFallback(w);
// workspace's focus too
if (w->isFocused())
screen->getCurrentWorkspace()->focusFallback(w);
} }
} }
@ -141,6 +136,9 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
void Workspace::focusFallback(const BlackboxWindow *old_window) { void Workspace::focusFallback(const BlackboxWindow *old_window) {
BlackboxWindow *newfocus = 0; BlackboxWindow *newfocus = 0;
if (id == screen->getCurrentWorkspaceID()) {
// The window is on the visible workspace.
// if it's a transient, then try to focus its parent // if it's a transient, then try to focus its parent
if (old_window && old_window->isTransient()) { if (old_window && old_window->isTransient()) {
newfocus = old_window->getTransientFor(); newfocus = old_window->getTransientFor();
@ -166,6 +164,17 @@ void Workspace::focusFallback(const BlackboxWindow *old_window) {
} }
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);
}
}
} }