]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
try see if this broke gnome-panel
[chaz/openbox] / src / Screen.cc
index 31811fe63d740996b8745d9846e53006d57509cb..6d95edbda59a874c5fa68f2e228bc169acca35e1 100644 (file)
@@ -974,10 +974,19 @@ void BScreen::LoadStyle(void) {
     readDatabaseTexture("window.button.unfocus", "black", style);
   resource.wstyle.b_pressed =
     readDatabaseTexture("window.button.pressed", "black", style);
-  resource.wstyle.f_focus =
-    readDatabaseColor("window.frame.focusColor", "white", style);
-  resource.wstyle.f_unfocus =
-    readDatabaseColor("window.frame.unfocusColor", "black", style);
+
+  // we create the window.frame texture by hand because it exists only to
+  // make the code cleaner and is not actually used for display
+  BColor color = readDatabaseColor("window.frame.focusColor", "white", style);
+  resource.wstyle.f_focus = BTexture("solid flat", getBaseDisplay(),
+                                     getScreenNumber(), image_control);
+  resource.wstyle.f_focus.setColor(color);
+
+  color = readDatabaseColor("window.frame.unfocusColor", "white", style);
+  resource.wstyle.f_unfocus = BTexture("solid flat", getBaseDisplay(),
+                                       getScreenNumber(), image_control);
+  resource.wstyle.f_unfocus.setColor(color);
+
   resource.wstyle.l_text_focus =
     readDatabaseColor("window.label.focus.textColor", "black", style);
   resource.wstyle.l_text_unfocus =
@@ -995,7 +1004,17 @@ void BScreen::LoadStyle(void) {
       resource.wstyle.justify = CenterJustify;
   }
 
-  // load toolbar config
+  // sanity checks
+  if (resource.wstyle.t_focus.texture() == BTexture::Parent_Relative)
+    resource.wstyle.t_focus = resource.wstyle.f_focus;
+  if (resource.wstyle.t_unfocus.texture() == BTexture::Parent_Relative)
+    resource.wstyle.t_unfocus = resource.wstyle.f_unfocus;
+  if (resource.wstyle.h_focus.texture() == BTexture::Parent_Relative)
+    resource.wstyle.h_focus = resource.wstyle.f_focus;
+  if (resource.wstyle.h_unfocus.texture() == BTexture::Parent_Relative)
+    resource.wstyle.h_unfocus = resource.wstyle.f_unfocus;
+
+// load toolbar config
   resource.tstyle.toolbar =
     readDatabaseTexture("toolbar", "black", style);
   resource.tstyle.label =
@@ -1025,6 +1044,14 @@ void BScreen::LoadStyle(void) {
       resource.tstyle.justify = CenterJustify;
   }
 
+  // sanity checks
+  if (resource.tstyle.toolbar.texture() == BTexture::Parent_Relative) {
+    resource.tstyle.toolbar = BTexture("solid flat", getBaseDisplay(),
+                                       getScreenNumber(), image_control);
+    resource.tstyle.toolbar.setColor(BColor("black", getBaseDisplay(),
+                                            getScreenNumber()));
+  }
+
   // load menu config
   resource.mstyle.title =
     readDatabaseTexture("menu.title", "white", style);
@@ -1073,6 +1100,14 @@ void BScreen::LoadStyle(void) {
       resource.mstyle.bullet_pos = Basemenu::Right;
   }
 
+  // sanity checks
+  if (resource.mstyle.frame.texture() == BTexture::Parent_Relative) {
+    resource.mstyle.frame = BTexture("solid flat", getBaseDisplay(),
+                                     getScreenNumber(), image_control);
+    resource.mstyle.frame.setColor(BColor("black", getBaseDisplay(),
+                                          getScreenNumber()));
+  }
+
   resource.border_color =
     readDatabaseColor("borderColor", "black", style);
 
@@ -1197,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);
@@ -1213,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();
 }
 
@@ -1280,15 +1337,22 @@ void BScreen::updateStackingList(void) {
 
 
 void BScreen::addSystrayWindow(Window window) {
+  XGrabServer(blackbox->getXDisplay());
+  
+  XSelectInput(blackbox->getXDisplay(), window, SubstructureRedirectMask);
   systrayWindowList.push_back(window);
   xatom->setValue(getRootWindow(), XAtom::kde_net_system_tray_windows,
                   XAtom::window,
                   &systrayWindowList[0], systrayWindowList.size());
   blackbox->saveSystrayWindowSearch(window, this);
+
+  XUngrabServer(blackbox->getXDisplay());
 }
 
 
 void BScreen::removeSystrayWindow(Window window) {
+  XGrabServer(blackbox->getXDisplay());
+  
   WindowList::iterator it = systrayWindowList.begin();
   const WindowList::iterator end = systrayWindowList.end();
   for (; it != end; ++it)
@@ -1298,8 +1362,13 @@ void BScreen::removeSystrayWindow(Window window) {
                       XAtom::window,
                       &systrayWindowList[0], systrayWindowList.size());
       blackbox->removeSystrayWindowSearch(window);
+      XSelectInput(blackbox->getXDisplay(), window, NoEventMask);
       break;
     }
+
+  assert(it != end);    // not a systray window
+
+  XUngrabServer(blackbox->getXDisplay());
 }
 
 
@@ -1307,7 +1376,7 @@ void BScreen::manageWindow(Window w) {
   // is the window a KDE systray window?
   Window systray;
   if (xatom->getValue(w, XAtom::kde_net_wm_system_tray_window_for,
-                      XAtom::window, systray) && systray) {
+                      XAtom::window, systray) && systray != None) {
     addSystrayWindow(w);
     return;
   }
@@ -1326,18 +1395,17 @@ void BScreen::manageWindow(Window w) {
   if (! win)
     return;
 
-
-  if (win->isNormal()) {
-    // don't list non-normal windows as managed windows
+  if (win->isDesktop()) {
+    desktopWindowList.push_back(win->getFrameWindow());
+  } else if (win->isNormal()) {
+    // don't list desktop windows as managed windows
     windowList.push_back(win);
     updateClientList();
   
     if (win->isTopmost())
       specialWindowList.push_back(win->getFrameWindow());
-  } else if (win->isDesktop()) {
-    desktopWindowList.push_back(win->getFrameWindow());
   }
-
+  
   XMapRequestEvent mre;
   mre.window = w;
   if (blackbox->isStartup() && win->isNormal()) win->restoreAttributes();
@@ -1346,6 +1414,15 @@ void BScreen::manageWindow(Window w) {
 
 
 void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) {
+  // is the window a KDE systray window?
+  Window systray;
+  if (xatom->getValue(w->getClientWindow(),
+                      XAtom::kde_net_wm_system_tray_window_for,
+                      XAtom::window, systray) && systray != None) {
+    removeSystrayWindow(w->getClientWindow());
+    return;
+  }
+
   w->restore(remap);
 
   // Remove the modality so that its parent won't try to re-focus the window
@@ -1362,8 +1439,17 @@ void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) {
   } else if (w->isIconic())
     removeIcon(w);
 
-  if (w->isNormal()) {
-    // we don't list non-normal windows as managed windows
+  if (w->isDesktop()) {
+    WindowList::iterator it = desktopWindowList.begin();
+    const WindowList::iterator end = desktopWindowList.end();
+    for (; it != end; ++it)
+      if (*it == w->getFrameWindow()) {
+        desktopWindowList.erase(it);
+        break;
+      }
+    assert(it != end);  // the window wasnt a desktop window?
+  } else if (w->isNormal()) {
+    // we don't list desktop windows as managed windows
     windowList.remove(w);
     updateClientList();
 
@@ -1377,15 +1463,6 @@ void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) {
         }
       assert(it != end);  // the window wasnt a special window?
     }
-  } else if (w->isDesktop()) {
-    WindowList::iterator it = desktopWindowList.begin();
-    const WindowList::iterator end = desktopWindowList.end();
-    for (; it != end; ++it)
-      if (*it == w->getFrameWindow()) {
-        desktopWindowList.erase(it);
-        break;
-      }
-    assert(it != end);  // the window wasnt a desktop window?
   }
 
   if (blackbox->getFocusedWindow() == w)
@@ -2308,43 +2385,9 @@ void BScreen::buttonPressEvent(const XButtonEvent *xbutton) {
     if (rootmenu->isVisible())
       rootmenu->hide();
   } else if (xbutton->button == 2) {
-    int mx = xbutton->x_root - (workspacemenu->getWidth() / 2);
-    int my = xbutton->y_root - (workspacemenu->getTitleHeight() / 2);
-
-    if (mx < 0) mx = 0;
-    if (my < 0) my = 0;
-
-    if (mx + workspacemenu->getWidth() > getWidth())
-      mx = getWidth() - workspacemenu->getWidth() - getBorderWidth();
-
-    if (my + workspacemenu->getHeight() > getHeight())
-      my = getHeight() - workspacemenu->getHeight() - getBorderWidth();
-
-    workspacemenu->move(mx, my);
-
-    if (! workspacemenu->isVisible()) {
-      workspacemenu->removeParent();
-      workspacemenu->show();
-    }
+    showWorkspaceMenu(xbutton->x_root, xbutton->y_root);
   } else if (xbutton->button == 3) {
-    int mx = xbutton->x_root - (rootmenu->getWidth() / 2);
-    int my = xbutton->y_root - (rootmenu->getTitleHeight() / 2);
-
-    if (mx < 0) mx = 0;
-    if (my < 0) my = 0;
-
-    if (mx + rootmenu->getWidth() > getWidth())
-      mx = getWidth() - rootmenu->getWidth() - getBorderWidth();
-
-    if (my + rootmenu->getHeight() > getHeight())
-      my = getHeight() - rootmenu->getHeight() - getBorderWidth();
-
-    rootmenu->move(mx, my);
-
-    if (! rootmenu->isVisible()) {
-      blackbox->checkMenu();
-      rootmenu->show();
-    }
+    showRootMenu(xbutton->x_root, xbutton->y_root);
   // mouse wheel up
   } else if ((xbutton->button == 4 && resource.root_scroll == NormalScroll) ||
              (xbutton->button == 5 && resource.root_scroll == ReverseScroll)) {
@@ -2363,6 +2406,50 @@ void BScreen::buttonPressEvent(const XButtonEvent *xbutton) {
 }
 
 
+void BScreen::showWorkspaceMenu(int x, int y) {
+  int mx = x - (workspacemenu->getWidth() / 2);
+  int my = y - (workspacemenu->getTitleHeight() / 2);
+
+  if (mx < 0) mx = 0;
+  if (my < 0) my = 0;
+
+  if (mx + workspacemenu->getWidth() > getWidth())
+    mx = getWidth() - workspacemenu->getWidth() - getBorderWidth();
+
+  if (my + workspacemenu->getHeight() > getHeight())
+    my = getHeight() - workspacemenu->getHeight() - getBorderWidth();
+
+  workspacemenu->move(mx, my);
+
+  if (! workspacemenu->isVisible()) {
+    workspacemenu->removeParent();
+    workspacemenu->show();
+  }
+}
+
+
+void BScreen::showRootMenu(int x, int y) {
+  int mx = x - (rootmenu->getWidth() / 2);
+  int my = y - (rootmenu->getTitleHeight() / 2);
+
+  if (mx < 0) mx = 0;
+  if (my < 0) my = 0;
+
+  if (mx + rootmenu->getWidth() > getWidth())
+    mx = getWidth() - rootmenu->getWidth() - getBorderWidth();
+
+  if (my + rootmenu->getHeight() > getHeight())
+    my = getHeight() - rootmenu->getHeight() - getBorderWidth();
+
+  rootmenu->move(mx, my);
+
+  if (! rootmenu->isVisible()) {
+    blackbox->checkMenu();
+    rootmenu->show();
+  }
+}
+
+
 void BScreen::propertyNotifyEvent(const XPropertyEvent *pe) {
   if (pe->atom == xatom->getAtom(XAtom::net_desktop_names)) {
     // _NET_WM_DESKTOP_NAMES
@@ -2412,18 +2499,10 @@ BTexture BScreen::readDatabaseTexture(const string &rname,
   texture.setDisplay(getBaseDisplay(), getScreenNumber());
   texture.setImageControl(image_control);
 
-  if (texture.texture() & BTexture::Solid) {
-    texture.setColor(readDatabaseColor(rname + ".color",
-                                       default_color, style));
-    texture.setColorTo(readDatabaseColor(rname + ".colorTo",
-                                         default_color, style));
-  } else if (texture.texture() & BTexture::Gradient) {
-    texture.setColor(readDatabaseColor(rname + ".color",
-                                       default_color, style));
-    texture.setColorTo(readDatabaseColor(rname + ".colorTo",
-                                         default_color, style));
-  }
-
+  texture.setColor(readDatabaseColor(rname + ".color", default_color, style));
+  texture.setColorTo(readDatabaseColor(rname + ".colorTo", default_color,
+                                       style));
+  
   return texture;
 }
 
This page took 0.029114 seconds and 4 git commands to generate.