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
{ 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

View file

@ -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);
}

View file

@ -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);
// 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,6 +136,9 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
void Workspace::focusFallback(const BlackboxWindow *old_window) {
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 (old_window && old_window->isTransient()) {
newfocus = old_window->getTransientFor();
@ -166,6 +164,17 @@ void Workspace::focusFallback(const BlackboxWindow *old_window) {
}
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);
}
}
}