]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
proper mask t catch the unmap events on systray windows
[chaz/openbox] / src / Screen.cc
index 1c9c347b7e44396f9a571aef0b04b1eb8cb8fa5b..2722fe4bd28310f1336109fda1ddec2569e830ad 100644 (file)
@@ -1268,12 +1268,24 @@ void BScreen::changeWorkspaceID(unsigned int id) {
       f = win->setInputFocus();
   }
 
-  // If that fails, and we're doing focus_last, try to focus the last window.  
-  if (! f && resource.focus_last && current_workspace->getLastFocusedWindow())
-    f = current_workspace->getLastFocusedWindow()->setInputFocus();
+  // If that fails, and we're doing focus_last, try to focus the last window.
+  if (! f && resource.focus_last &&
+      (win = current_workspace->getLastFocusedWindow()))
+    f = win->setInputFocus();
 
-  // If that fails, then set focus to nothing.
-  if (! f) blackbox->setFocusedWindow((BlackboxWindow *) 0);
+  /*
+    if we found a focus target, then we set the focused window explicitly
+    because it is possible to switch off this workspace before the x server
+    generates the FocusIn event for the window. if that happens, openbox would
+    lose track of what window was the 'LastFocused' window on the workspace.
+
+    if we did not find a focus target, then set the current focused window to
+    nothing.
+  */
+  if (f)
+    blackbox->setFocusedWindow(win);
+  else
+    blackbox->setFocusedWindow((BlackboxWindow *) 0);
 
   updateNetizenCurrentWorkspace();
 }
@@ -1339,7 +1351,7 @@ void BScreen::updateStackingList(void) {
 void BScreen::addSystrayWindow(Window window) {
   XGrabServer(blackbox->getXDisplay());
   
-  XSelectInput(blackbox->getXDisplay(), window, SubstructureRedirectMask);
+  XSelectInput(blackbox->getXDisplay(), window, StructureNotifyMask);
   systrayWindowList.push_back(window);
   xatom->setValue(getRootWindow(), XAtom::kde_net_system_tray_windows,
                   XAtom::window,
@@ -2209,6 +2221,12 @@ void BScreen::shutdown(void) {
   while(! windowList.empty())
     unmanageWindow(windowList.front(), True);
 
+  while(! desktopWindowList.empty()) {
+    BlackboxWindow *win = blackbox->searchWindow(desktopWindowList.front());
+    assert(win);
+    unmanageWindow(win, True);
+  }
+
   slit->shutdown();
 }
 
This page took 0.02504 seconds and 4 git commands to generate.