]> Dogcows Code - chaz/openbox/blobdiff - src/blackbox.cc
Added missing header for clearShape, which was breaking compilation
[chaz/openbox] / src / blackbox.cc
index dafc6bdfa8d8ce610008dfee93a13b12b3dcb177..e8b8dcaaf5210b4985acda63be926f2d3075a5b9 100644 (file)
@@ -112,26 +112,6 @@ using std::string;
 #include "Workspacemenu.hh"
 #include "XAtom.hh"
 
-// X event scanner for enter/leave notifies - adapted from twm
-struct scanargs {
-  Window w;
-  bool leave, inferior, enter;
-};
-
-static Bool queueScanner(Display *, XEvent *e, char *args) {
-  scanargs *scan = (scanargs *) args;
-  if ((e->type == LeaveNotify) &&
-      (e->xcrossing.window == scan->w) &&
-      (e->xcrossing.mode == NotifyNormal)) {
-    scan->leave = True;
-    scan->inferior = (e->xcrossing.detail == NotifyInferior);
-  } else if ((e->type == EnterNotify) && (e->xcrossing.mode == NotifyUngrab)) {
-    scan->enter = True;
-  }
-
-  return False;
-}
-
 Blackbox *blackbox;
 
 
@@ -282,16 +262,6 @@ void Blackbox::process_event(XEvent *e) {
   }
 
   case ConfigureRequest: {
-    // compress configure requests...
-    XEvent realevent;
-    unsigned int i = 0;
-    while(XCheckTypedWindowEvent(getXDisplay(), e->xconfigurerequest.window,
-                                 ConfigureRequest, &realevent)) {
-      i++;
-    }
-    if ( i > 0 )
-      e = &realevent;
-
     BlackboxWindow *win = (BlackboxWindow *) 0;
     Slit *slit = (Slit *) 0;
 
@@ -328,10 +298,19 @@ void Blackbox::process_event(XEvent *e) {
     BlackboxWindow *win = searchWindow(e->xmaprequest.window);
 
     if (win) {
+      bool focus = False;
       if (win->isIconic()) {
         win->deiconify();
-        win->setInputFocus();
+        focus = True;
       }
+      if (win->isShaded()) {
+        win->shade();
+        focus = True;
+      }
+
+      if (focus && (win->isTransient() || win->getScreen()->doFocusNew()) &&
+          win->isVisible())
+        win->setInputFocus();
     } else {
       BScreen *screen = searchScreen(e->xmaprequest.parent);
 
@@ -376,8 +355,6 @@ void Blackbox::process_event(XEvent *e) {
       slit->unmapNotifyEvent(&e->xunmap);
     } else if ((screen = searchSystrayWindow(e->xunmap.window))) {
       screen->removeSystrayWindow(e->xunmap.window);
-    } else if ((screen = searchDesktopWindow(e->xunmap.window))) {
-      screen->removeDesktopWindow(e->xunmap.window);
     }
 
     break;
@@ -397,8 +374,6 @@ void Blackbox::process_event(XEvent *e) {
       delete group;
     } else if ((screen = searchSystrayWindow(e->xunmap.window))) {
       screen->removeSystrayWindow(e->xunmap.window);
-    } else if ((screen = searchDesktopWindow(e->xunmap.window))) {
-      screen->removeDesktopWindow(e->xunmap.window);
     }
 
     break;
@@ -435,8 +410,12 @@ void Blackbox::process_event(XEvent *e) {
     if ( i > 0 )
       e = &realevent;
 
+    // the pointer is on the wrong screen
+    if (! e->xmotion.same_screen)
+      break;
+
     // strip the lock key modifiers
-    e->xbutton.state &= ~(NumLockMask | ScrollLockMask | LockMask);
+    e->xmotion.state &= ~(NumLockMask | ScrollLockMask | LockMask);
 
     last_time = e->xmotion.time;
 
@@ -454,9 +433,13 @@ void Blackbox::process_event(XEvent *e) {
   case PropertyNotify: {
     last_time = e->xproperty.time;
 
-    BlackboxWindow *win = searchWindow(e->xproperty.window);
-    if (win)
+    BlackboxWindow *win = (BlackboxWindow *) 0;
+    BScreen *screen = (BScreen *) 0;
+
+    if ((win = searchWindow(e->xproperty.window)))
       win->propertyNotifyEvent(&e->xproperty);
+    else if ((screen = searchScreen(e->xproperty.window)))
+      screen->propertyNotifyEvent(&e->xproperty);
     break;
   }
 
@@ -471,23 +454,12 @@ void Blackbox::process_event(XEvent *e) {
 
     if (e->xcrossing.mode == NotifyGrab) break;
 
-    XEvent dummy;
-    scanargs sa;
-    sa.w = e->xcrossing.window;
-    sa.enter = sa.leave = False;
-    XCheckIfEvent(getXDisplay(), &dummy, queueScanner, (char *) &sa);
-
     if ((e->xcrossing.window == e->xcrossing.root) &&
         (screen = searchScreen(e->xcrossing.window))) {
       screen->getImageControl()->installRootColormap();
     } else if ((win = searchWindow(e->xcrossing.window))) {
-      if (win->getScreen()->isSloppyFocus() &&
-          (! win->isFocused()) && (! no_focus)) {
-        if (((! sa.leave) || sa.inferior) && win->isVisible()) {
-          if (win->setInputFocus())
-            win->installColormap(True); // XXX: shouldnt we honour no install?
-        }
-      }
+      if (! no_focus)
+        win->enterNotifyEvent(&e->xcrossing);
     } else if ((menu = searchMenu(e->xcrossing.window))) {
       menu->enterNotifyEvent(&e->xcrossing);
     } else if ((tbar = searchToolbar(e->xcrossing.window))) {
@@ -509,7 +481,7 @@ void Blackbox::process_event(XEvent *e) {
     if ((menu = searchMenu(e->xcrossing.window)))
       menu->leaveNotifyEvent(&e->xcrossing);
     else if ((win = searchWindow(e->xcrossing.window)))
-      win->installColormap(False);
+      win->leaveNotifyEvent(&e->xcrossing);
     else if ((tbar = searchToolbar(e->xcrossing.window)))
       tbar->leaveNotifyEvent(&e->xcrossing);
     else if ((slit = searchSlit(e->xcrossing.window)))
@@ -602,6 +574,8 @@ void Blackbox::process_event(XEvent *e) {
         has moved to a known window.
       */
       e->xfocus.window = None;
+
+      no_focus = False;   // focusing is back on
     }
 
     break;
@@ -693,18 +667,30 @@ void Blackbox::process_event(XEvent *e) {
         if (screen && workspace < screen->getWorkspaceCount())
           screen->changeWorkspaceID(workspace);
       } else if (e->xclient.message_type == 
-                 xatom->getAtom(XAtom::blackbox_change_window_focus) ||
-                 e->xclient.message_type == 
+                 xatom->getAtom(XAtom::blackbox_change_window_focus)) {
+        // TEMP HACK TO KEEP BBKEYS WORKING
+        BlackboxWindow *win = searchWindow(e->xclient.window);
+
+        if (win && win->isVisible() && win->setInputFocus())
+          win->installColormap(True);
+      } else if (e->xclient.message_type == 
                  xatom->getAtom(XAtom::net_active_window)) {
         // NET_ACTIVE_WINDOW
         BlackboxWindow *win = searchWindow(e->xclient.window);
 
         if (win) {
+          BScreen *screen = win->getScreen();
+
           if (win->isIconic())
-            win->deiconify(False, True);
+            win->deiconify(False, False);
+          if (! win->isStuck() &&
+              (win->getWorkspaceNumber() != screen->getCurrentWorkspaceID())) {
+            no_focus = True;
+            screen->changeWorkspaceID(win->getWorkspaceNumber());
+          }
           if (win->isVisible() && win->setInputFocus()) {
-            //win->getScreen()->getWorkspace(win->getWorkspaceNumber())->
-            //  raiseWindow(win);
+            win->getScreen()->getWorkspace(win->getWorkspaceNumber())->
+              raiseWindow(win);
             win->installColormap(True);
           }
         }
@@ -735,7 +721,8 @@ void Blackbox::process_event(XEvent *e) {
             else
               win->show();
             screen->reassociateWindow(win, wksp, True);
-          } else if (wksp == 0xfffffffe) { // XXX: BUG, BUT DOING THIS SO KDE WORKS FOR NOW!!
+          } else if (wksp == 0xfffffffe || // XXX: BUG, BUT DOING THIS SO KDE WORKS FOR NOW!!
+                     wksp == 0xffffffff) {
             if (win->isIconic()) win->deiconify(False, True);
             if (! win->isStuck()) win->stick();
             if (! win->isVisible()) win->show();
@@ -761,22 +748,8 @@ void Blackbox::process_event(XEvent *e) {
         // NET_NUMBER_OF_DESKTOPS
         BScreen *screen = searchScreen(e->xclient.window);
         
-        if (e->xclient.data.l[0] > 0) {
-          if ((unsigned) e->xclient.data.l[0] < screen->getWorkspaceCount()) {
-            // shrink
-            for (int i = screen->getWorkspaceCount();
-                 i > e->xclient.data.l[0]; --i)
-              screen->removeLastWorkspace();
-            // removeLast already sets the current workspace to the 
-            // last available one.
-          } else if ((unsigned) e->xclient.data.l[0] >
-                     screen->getWorkspaceCount()) {
-            // grow
-            for(int i = screen->getWorkspaceCount(); 
-                i < e->xclient.data.l[0]; ++i)
-              screen->addWorkspace();
-          }
-        }
+        if (e->xclient.data.l[0] > 0)
+          screen->changeWorkspaceCount((unsigned) e->xclient.data.l[0]);
       } else if (e->xclient.message_type ==
                  xatom->getAtom(XAtom::net_close_window)) {
         // NET_CLOSE_WINDOW
@@ -935,6 +908,28 @@ void Blackbox::process_event(XEvent *e) {
             }
           }
         }
+      } else if (e->xclient.message_type ==
+                 xatom->getAtom(XAtom::openbox_show_root_menu) ||
+                 e->xclient.message_type ==
+                 xatom->getAtom(XAtom::openbox_show_workspace_menu)) {
+        // find the screen the mouse is on
+        int x, y;
+        ScreenList::iterator it, end = screenList.end();
+        for (it = screenList.begin(); it != end; ++it) {
+          Window w;
+          int i;
+          unsigned int m;
+          if (XQueryPointer(getXDisplay(), (*it)->getRootWindow(),
+                            &w, &w, &x, &y, &i, &i, &m))
+            break;
+        }
+        if (it != end) {
+          if (e->xclient.message_type ==
+              xatom->getAtom(XAtom::openbox_show_root_menu))
+            (*it)->showRootMenu(x, y);
+          else
+            (*it)->showWorkspaceMenu(x, y);
+        }
       }
     }
 
@@ -964,10 +959,13 @@ void Blackbox::process_event(XEvent *e) {
 bool Blackbox::handleSignal(int sig) {
   switch (sig) {
   case SIGHUP:
-  case SIGUSR1:
     reconfigure();
     break;
 
+  case SIGUSR1:
+    restart();
+    break;
+
   case SIGUSR2:
     rereadMenu();
     break;
@@ -1012,15 +1010,6 @@ BScreen *Blackbox::searchScreen(Window window) {
 }
 
 
-BScreen *Blackbox::searchDesktopWindow(Window window) {
-  WindowScreenLookup::iterator it = desktopSearchList.find(window);
-  if (it != desktopSearchList.end())
-    return it->second;
-
-  return (BScreen*) 0;
-}
-
-
 BScreen *Blackbox::searchSystrayWindow(Window window) {
   WindowScreenLookup::iterator it = systraySearchList.find(window);
   if (it != systraySearchList.end())
@@ -1075,11 +1064,6 @@ Slit *Blackbox::searchSlit(Window window) {
 }
 
 
-void Blackbox::saveDesktopWindowSearch(Window window, BScreen *screen) {
-  desktopSearchList.insert(WindowScreenLookupPair(window, screen));
-}
-
-
 void Blackbox::saveSystrayWindowSearch(Window window, BScreen *screen) {
   systraySearchList.insert(WindowScreenLookupPair(window, screen));
 }
@@ -1110,11 +1094,6 @@ void Blackbox::saveSlitSearch(Window window, Slit *data) {
 }
 
 
-void Blackbox::removeDesktopWindowSearch(Window window) {
-  desktopSearchList.erase(window);
-}
-
-
 void Blackbox::removeSystrayWindowSearch(Window window) {
   systraySearchList.erase(window);
 }
@@ -1173,6 +1152,32 @@ void Blackbox::shutdown(void) {
 }
 
 
+#ifdef    XINERAMA
+void Blackbox::saveXineramaPlacement(bool x) {
+  resource.xinerama_placement = x;
+  config.setValue("session.xineramaSupport.windowPlacement",
+                  resource.xinerama_placement);
+  reconfigure();  // make sure all screens get this change
+}
+
+
+void Blackbox::saveXineramaMaximizing(bool x) {
+  resource.xinerama_maximize = x;
+  config.setValue("session.xineramaSupport.windowMaximizing",
+                  resource.xinerama_maximize);
+  reconfigure();  // make sure all screens get this change
+}
+
+
+void Blackbox::saveXineramaSnapping(bool x) {
+  resource.xinerama_snap = x;
+  config.setValue("session.xineramaSupport.windowSnapping",
+                  resource.xinerama_snap);
+  reconfigure();  // make sure all screens get this change
+}
+#endif // XINERAMA
+
+  
 /*
  * Save all values as they are so that the defaults will be written to the rc
  * file
@@ -1190,7 +1195,24 @@ void Blackbox::save_rc(void) {
   config.setValue("session.cacheMax", resource.cache_max);
   config.setValue("session.styleFile", resource.style_file);
   config.setValue("session.titlebarLayout", resource.titlebar_layout);
+
+  string s;
+  if (resource.mod_mask & Mod1Mask) s += "Mod1-";
+  if (resource.mod_mask & Mod2Mask) s += "Mod2-";
+  if (resource.mod_mask & Mod3Mask) s += "Mod3-";
+  if (resource.mod_mask & Mod4Mask) s += "Mod4-";
+  if (resource.mod_mask & Mod5Mask) s += "Mod5-";
+  if (resource.mod_mask & ShiftMask) s += "Shift-";
+  if (resource.mod_mask & ControlMask) s += "Control-";
+  s.resize(s.size() - 1); // drop the last '-'
+  config.setValue("session.modifierMask", s);
   
+#ifdef    XINERAMA
+  saveXineramaPlacement(resource.xinerama_placement);
+  saveXineramaMaximizing(resource.xinerama_maximize);
+  saveXineramaSnapping(resource.xinerama_snap);
+#endif // XINERAMA
+
   std::for_each(screenList.begin(), screenList.end(),
                 std::mem_fun(&BScreen::save_rc));
  
@@ -1237,10 +1259,48 @@ void Blackbox::load_rc(void) {
   
   if (! config.getValue("session.titlebarLayout", resource.titlebar_layout))
     resource.titlebar_layout = "ILMC";
+
+#ifdef    XINERAMA
+  if (! config.getValue("session.xineramaSupport.windowPlacement",
+                        resource.xinerama_placement))
+    resource.xinerama_placement = false;
+
+  if (! config.getValue("session.xineramaSupport.windowMaximizing",
+                        resource.xinerama_maximize))
+    resource.xinerama_maximize = false;
+
+  if (! config.getValue("session.xineramaSupport.windowSnapping",
+                        resource.xinerama_snap))
+    resource.xinerama_snap = false;
+#endif // XINERAMA
+  
+  resource.mod_mask = 0;
+  if (config.getValue("session.modifierMask", s)) {
+    if (s.find("Mod1") != string::npos)
+      resource.mod_mask |= Mod1Mask;
+    if (s.find("Mod2") != string::npos)
+      resource.mod_mask |= Mod2Mask;
+    if (s.find("Mod3") != string::npos)
+      resource.mod_mask |= Mod3Mask;
+    if (s.find("Mod4") != string::npos)
+      resource.mod_mask |= Mod4Mask;
+    if (s.find("Mod5") != string::npos)
+      resource.mod_mask |= Mod5Mask;
+    if (s.find("Shift") != string::npos)
+      resource.mod_mask |= ShiftMask;
+    if (s.find("Control") != string::npos)
+      resource.mod_mask |= ControlMask;
+  }
+  if (! resource.mod_mask)
+    resource.mod_mask = Mod1Mask;
 }
 
 
 void Blackbox::reconfigure(void) {
+  // don't reconfigure while saving the initial rc file, it's a waste and it
+  // breaks somethings (workspace names)
+  if (isStartup()) return;
+
   reconfigure_wait = True;
 
   if (! timer->isTiming()) timer->start();
This page took 0.032178 seconds and 4 git commands to generate.