summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2002-07-14 18:45:46 +0000
committerDana Jansens <danakj@orodu.net>2002-07-14 18:45:46 +0000
commit3312a209d7882a32253d715ee24bcaa717af75c2 (patch)
tree28ecae01580faf1cf4be3d41e27b25ac0b903936 /src
parent1525520dd177f7274ac5e2d2e95c5fa9027e0f48 (diff)
sych with blackbox
Diffstat (limited to 'src')
-rw-r--r--src/Screen.hh6
-rw-r--r--src/Window.cc38
-rw-r--r--src/Workspace.cc75
3 files changed, 64 insertions, 55 deletions
diff --git a/src/Screen.hh b/src/Screen.hh
index 8986803b..d2175ce4 100644
--- a/src/Screen.hh
+++ b/src/Screen.hh
@@ -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
diff --git a/src/Window.cc b/src/Window.cc
index 18662450..c32acbdf 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -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);
}
diff --git a/src/Workspace.cc b/src/Workspace.cc
index d2a43f44..65f323f1 100644
--- a/src/Workspace.cc
+++ b/src/Workspace.cc
@@ -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 ||
+ 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;
+ 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);
+ }
+ }
}