]> Dogcows Code - chaz/openbox/commitdiff
don't unmap/remap sticky windows on a workspace change, but still make sloppy focus...
authorDana Jansens <danakj@orodu.net>
Sat, 24 Aug 2002 08:09:35 +0000 (08:09 +0000)
committerDana Jansens <danakj@orodu.net>
Sat, 24 Aug 2002 08:09:35 +0000 (08:09 +0000)
src/Screen.cc
src/Workspace.cc

index 0290150d027fbba395f9e1a1972a6e0cd7b2246f..bdae4dac369dc15c9c81ad2b5073e6a13c12ec70 100644 (file)
@@ -1232,8 +1232,10 @@ void BScreen::changeWorkspaceID(unsigned int id) {
     current_workspace->setLastFocusedWindow((BlackboxWindow *) 0);
   }
 
-  // when we switch workspaces, unfocus whatever was focused
-  blackbox->setFocusedWindow((BlackboxWindow *) 0);
+  // when we switch workspaces, unfocus whatever was focused if it is going
+  // to be unmapped
+  if (focused && ! focused->isStuck())
+    blackbox->setFocusedWindow((BlackboxWindow *) 0);
 
   current_workspace->hideAll();
   workspacemenu->setItemSelected(current_workspace->getID() + 2, False);
@@ -1248,11 +1250,31 @@ void BScreen::changeWorkspaceID(unsigned int id) {
 
   current_workspace->showAll();
 
-  if (resource.focus_last && current_workspace->getLastFocusedWindow()) {
-    XSync(blackbox->getXDisplay(), False);
-    current_workspace->getLastFocusedWindow()->setInputFocus();
+  int x, y, rx, ry;
+  Window c, r;
+  unsigned int m;
+  BlackboxWindow *win = (BlackboxWindow *) 0;
+  bool f = False;
+
+  XSync(blackbox->getXDisplay(), False);
+
+  // If sloppy focus and we can find the client window under the pointer,
+  // try to focus it.  
+  if (resource.sloppy_focus &&
+      XQueryPointer(blackbox->getXDisplay(), getRootWindow(), &r, &c,
+                    &rx, &ry, &x, &y, &m) &&
+      c != None) {
+    if ( (win = blackbox->searchWindow(c)) )
+      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, then set focus to nothing.
+  if (! f) blackbox->setFocusedWindow((BlackboxWindow *) 0);
+
   updateNetizenCurrentWorkspace();
 }
 
index f4fab1cdf6b58b290208dbb5f189808c0785f29c..b943bc3ae21efbc7450657ae24bc962a0cf3ea95 100644 (file)
@@ -237,9 +237,10 @@ void Workspace::showAll(void) {
   const BlackboxWindowList::iterator end = stackingList.end();
   for (; it != end; ++it) {
     BlackboxWindow *bw = *it;
-    // not normal windows cant focus from mouse enters anyways, so we dont
-    // need to unmap/remap them on workspace changes
-    if (! bw->isStuck() || bw->isNormal())
+    // sticky windows arent unmapped on a workspace change so we don't have ot
+    // map them, but sometimes on a restart, another app can unmap our sticky
+    // windows, so we map on startup always
+    if (! bw->isStuck() || screen->getBlackbox()->isStartup())
       bw->show();
   }
 }
@@ -254,9 +255,9 @@ void Workspace::hideAll(void) {
   const BlackboxWindowList::iterator end = lst.end();
   for (; it != end; ++it) {
     BlackboxWindow *bw = *it;
-    // not normal windows cant focus from mouse enters anyways, so we dont
-    // need to unmap/remap them on workspace changes
-    if (! bw->isStuck() || bw->isNormal())
+    // don't hide sticky windows, or they'll end up flickering on a workspace
+    // change
+    if (! bw->isStuck())
       bw->withdraw();
   }
 }
This page took 0.03032 seconds and 4 git commands to generate.