]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
sync with bb-cvs
[chaz/openbox] / src / Screen.cc
index 3d51a2d20164d9775021448beedc7e0bdb55ef6f..d92dec3502cb54a66c3e4050600fc6044ed124c8 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);
 
@@ -1186,20 +1221,38 @@ unsigned int BScreen::removeLastWorkspace(void) {
 void BScreen::changeWorkspaceID(unsigned int id) {
   if (! current_workspace || id == current_workspace->getID()) return;
 
-  current_workspace->hide();
+  BlackboxWindow *focused = blackbox->getFocusedWindow();
+  if (focused && focused->getScreen() == this) {
+    assert(focused->isStuck() ||
+           focused->getWorkspaceNumber() == current_workspace->getID());
+
+    current_workspace->setLastFocusedWindow(focused);
+  } else {
+    // if no window had focus, no need to store a last focus
+    current_workspace->setLastFocusedWindow((BlackboxWindow *) 0);
+  }
 
+  // when we switch workspaces, unfocus whatever was focused
+  blackbox->setFocusedWindow((BlackboxWindow *) 0);
+
+  current_workspace->hideAll();
   workspacemenu->setItemSelected(current_workspace->getID() + 2, False);
 
   current_workspace = getWorkspace(id);
 
-  current_workspace->show();
-
   xatom->setValue(getRootWindow(), XAtom::net_current_desktop,
                   XAtom::cardinal, id);
 
   workspacemenu->setItemSelected(current_workspace->getID() + 2, True);
   toolbar->redrawWorkspaceLabel(True);
 
+  current_workspace->showAll();
+
+  if (resource.focus_last && current_workspace->getLastFocusedWindow()) {
+    XSync(blackbox->getXDisplay(), False);
+    current_workspace->getLastFocusedWindow()->setInputFocus();
+  }
+
   updateNetizenCurrentWorkspace();
 }
 
@@ -1313,6 +1366,9 @@ void BScreen::manageWindow(Window w) {
     // don't list non-normal 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());
   }
@@ -1345,6 +1401,17 @@ void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) {
     // we don't list non-normal windows as managed windows
     windowList.remove(w);
     updateClientList();
+
+    if (w->isTopmost()) {
+      WindowList::iterator it = specialWindowList.begin();
+      const WindowList::iterator end = specialWindowList.end();
+      for (; it != end; ++it)
+        if (*it == w->getFrameWindow()) {
+          specialWindowList.erase(it);
+          break;
+        }
+      assert(it != end);  // the window wasnt a special window?
+    }
   } else if (w->isDesktop()) {
     WindowList::iterator it = desktopWindowList.begin();
     const WindowList::iterator end = desktopWindowList.end();
@@ -1495,7 +1562,8 @@ void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) {
 #endif // XINERAMA
 
   Window *session_stack = new
-    Window[(num + workspacesList.size() + rootmenuList.size() + bbwins)];
+    Window[(num + workspacesList.size() + rootmenuList.size() +
+            specialWindowList.size() + bbwins)];
   unsigned int i = 0, k = num;
 
   XRaiseWindow(blackbox->getXDisplay(), iconmenu->getWindowID());
@@ -1536,6 +1604,10 @@ void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) {
   if (slit->isOnTop())
     *(session_stack + i++) = slit->getWindowID();
 
+  WindowList::iterator sit, send = specialWindowList.end();
+  for (sit = specialWindowList.begin(); sit != send; ++sit)
+    *(session_stack + i++) = *sit;
+
   while (k--)
     *(session_stack + i++) = *(workspace_stack + k);
 
@@ -2271,43 +2343,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)) {
@@ -2326,6 +2364,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
@@ -2375,18 +2457,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.025159 seconds and 4 git commands to generate.