]> Dogcows Code - chaz/openbox/blobdiff - src/blackbox.cc
properly scope thse stl stuff please!
[chaz/openbox] / src / blackbox.cc
index 36828f7e5e3ce2927e24bebe5521c2a3731a0a49..8dc7db838ff04656c43e2f3060176a055ec47347 100644 (file)
@@ -111,7 +111,6 @@ using std::string;
 #include "Workspace.hh"
 #include "Workspacemenu.hh"
 #include "XAtom.hh"
-#include "Input.hh"
 
 // X event scanner for enter/leave notifies - adapted from twm
 struct scanargs {
@@ -146,6 +145,12 @@ Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu)
 
   ::blackbox = this;
   argv = m_argv;
+
+  // try to make sure the ~/.openbox directory exists
+  mkdir(expandTilde("~/.openbox").c_str(), S_IREAD | S_IWRITE | S_IEXEC |
+                                           S_IRGRP | S_IWGRP | S_IXGRP |
+                                           S_IROTH | S_IWOTH | S_IXOTH);
+  
   if (! rc) rc = "~/.openbox/rc";
   rc_file = expandTilde(rc);
   config.setFile(rc_file);  
@@ -159,11 +164,9 @@ Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu)
   active_screen = 0;
   focused_window = changing_window = (BlackboxWindow *) 0;
 
-  XrmInitialize();
   load_rc();
 
   xatom = new XAtom(getXDisplay());
-  input = new BInput(this);
 
   cursor.session = XCreateFontCursor(getXDisplay(), XC_left_ptr);
   cursor.move = XCreateFontCursor(getXDisplay(), XC_fleur);
@@ -324,7 +327,20 @@ void Blackbox::process_event(XEvent *e) {
 
     BlackboxWindow *win = searchWindow(e->xmaprequest.window);
 
-    if (! win) {
+    if (win) {
+      bool focus = False;
+      if (win->isIconic()) {
+        win->deiconify();
+        focus = True;
+      }
+      if (win->isShaded()) {
+        win->shade();
+        focus = True;
+      }
+
+      if (focus && (win->isTransient() || win->getScreen()->doFocusNew()))
+        win->setInputFocus();
+    } else {
       BScreen *screen = searchScreen(e->xmaprequest.parent);
 
       if (! screen) {
@@ -368,8 +384,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;
@@ -389,8 +403,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;
@@ -446,13 +458,13 @@ void Blackbox::process_event(XEvent *e) {
   case PropertyNotify: {
     last_time = e->xproperty.time;
 
-    if (e->xproperty.state != PropertyDelete) {
-      BlackboxWindow *win = searchWindow(e->xproperty.window);
-
-      if (win)
-        win->propertyNotifyEvent(e->xproperty.atom);
-    }
+    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;
   }
 
@@ -478,7 +490,8 @@ void Blackbox::process_event(XEvent *e) {
       screen->getImageControl()->installRootColormap();
     } else if ((win = searchWindow(e->xcrossing.window))) {
       if (win->getScreen()->isSloppyFocus() &&
-          (! win->isFocused()) && (! no_focus)) {
+          (! win->isFocused()) && (! no_focus) &&
+          win->isNormal()) {  // don't focus non-normal windows with mouseover
         if (((! sa.leave) || sa.inferior) && win->isVisible()) {
           if (win->setInputFocus())
             win->installColormap(True); // XXX: shouldnt we honour no install?
@@ -689,18 +702,29 @@ 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);
+          if (win->isShaded())
+            win->shade();
+          if (win->getWorkspaceNumber() != screen->getCurrentWorkspaceID())
+            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);
           }
         }
@@ -731,7 +755,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();
@@ -757,22 +782,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
@@ -960,10 +971,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;
@@ -1008,15 +1022,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())
@@ -1071,11 +1076,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));
 }
@@ -1106,11 +1106,6 @@ void Blackbox::saveSlitSearch(Window window, Slit *data) {
 }
 
 
-void Blackbox::removeDesktopWindowSearch(Window window) {
-  desktopSearchList.erase(window);
-}
-
-
 void Blackbox::removeSystrayWindowSearch(Window window) {
   systraySearchList.erase(window);
 }
@@ -1145,6 +1140,7 @@ void Blackbox::restart(const char *prog) {
   shutdown();
 
   if (prog) {
+    putenv(const_cast<char *>(screenList.front()->displayString().c_str()));
     execlp(prog, prog, NULL);
     perror(prog);
   }
@@ -1196,7 +1192,7 @@ void Blackbox::save_rc(void) {
 
 void Blackbox::load_rc(void) {
   if (! config.load())
-        config.create();
+    config.create();
   
   string s;
 
This page took 0.025252 seconds and 4 git commands to generate.