]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
merged bitmap buttons
[chaz/openbox] / src / Screen.cc
index b24c514a4815609072dd8474da7cc369f0d82020..5d860bd70c21afd564c9d5cebec714c37334bf53 100644 (file)
@@ -339,6 +339,31 @@ BScreen::~BScreen(void) {
   if (resource.tstyle.font)
     delete resource.tstyle.font;
 
+  if (resource.wstyle.close_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.wstyle.close_button.mask);
+  if (resource.wstyle.max_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.wstyle.max_button.mask);
+  if (resource.wstyle.icon_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.wstyle.icon_button.mask);
+  if (resource.wstyle.stick_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.wstyle.stick_button.mask);
+
+  if (resource.tstyle.left_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.tstyle.left_button.mask);
+  if (resource.tstyle.right_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.tstyle.right_button.mask);
+
+  if (resource.mstyle.bullet_image.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.mstyle.bullet_image.mask);
+  if (resource.mstyle.tick_image.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.mstyle.tick_image.mask);
+    
+  resource.wstyle.max_button.mask = resource.wstyle.close_button.mask =
+    resource.wstyle.icon_button.mask =
+    resource.wstyle.stick_button.mask = None;
+  resource.tstyle.left_button.mask = resource.tstyle.right_button.mask = None;
+  resource.mstyle.bullet_image.mask = resource.mstyle.tick_image.mask = None;
+  
   XFreeGC(blackbox->getXDisplay(), opGC);
 }
 
@@ -407,6 +432,13 @@ void BScreen::saveAAFonts(bool f) {
 }
 
 
+void BScreen::saveShadowFonts(bool f) {
+  resource.shadow_fonts = f;
+  reconfigure();
+  config->setValue(screenstr + "dropShadowFonts", resource.shadow_fonts);
+}
+
+
 void BScreen::saveHideToolbar(bool h) {
   resource.hide_toolbar = h;
   if (resource.hide_toolbar)
@@ -589,10 +621,37 @@ void BScreen::saveRootScrollDirection(int d) {
 }
 
 
+void BScreen::saveRootMenuButton(unsigned int b) {
+  resource.root_menu_button = b;
+  const char *but;
+  switch (resource.root_menu_button) {
+  case 0: but = "None"; break;
+  case 1: but = "Left"; break;
+  case 2: but = "Middle"; break;
+  case 3: default: but = "Right"; break;
+  }
+  config->setValue(screenstr + "rootMenuButton", but);
+}
+
+
+void BScreen::saveWorkspaceMenuButton(unsigned int b) {
+  resource.workspace_menu_button = b;
+  const char *but;
+  switch (resource.workspace_menu_button) {
+  case 0: but = "None"; break;
+  case 1: but = "Left"; break;
+  case 2: default: but = "Middle"; break;
+  case 3: but = "Right"; break;
+  }
+  config->setValue(screenstr + "workspaceMenuButton", but);
+}
+
+
 void BScreen::save_rc(void) {
   saveSloppyFocus(resource.sloppy_focus);
   saveAutoRaise(resource.auto_raise);
   saveImageDither(doImageDither());
+  saveShadowFonts(resource.shadow_fonts);
   saveAAFonts(resource.aa_fonts);
   saveResizeZones(resource.resize_zones);
   saveOpaqueMove(resource.opaque_move);
@@ -621,6 +680,8 @@ void BScreen::save_rc(void) {
   saveAllowScrollLock(resource.allow_scroll_lock);
   saveWorkspaceWarping(resource.workspace_warping);
   saveRootScrollDirection(resource.root_scroll);
+  saveRootMenuButton(resource.root_menu_button);
+  saveWorkspaceMenuButton(resource.workspace_menu_button);
 
   toolbar->save_rc();
   slit->save_rc();
@@ -646,6 +707,9 @@ void BScreen::load_rc(void) {
   if (! config->getValue(screenstr + "opaqueMove", resource.opaque_move))
     resource.opaque_move = false;
 
+  if (! config->getValue(screenstr + "dropShadowFonts", resource.shadow_fonts))
+    resource.shadow_fonts = false;
+
   if (! config->getValue(screenstr + "antialiasFonts", resource.aa_fonts))
     resource.aa_fonts = true;
 
@@ -793,6 +857,29 @@ void BScreen::load_rc(void) {
     else if (s == "Reverse")
       resource.root_scroll = ReverseScroll;
   }
+
+  resource.root_menu_button = 3;
+  if (config->getValue(screenstr + "rootMenuButton", s)) {
+    if (s == "None")
+      resource.root_menu_button = 0;
+    else if (s == "Left")
+      resource.root_menu_button = 1;
+    else if (s == "Middle")
+      resource.root_menu_button = 2;
+  }
+
+  resource.workspace_menu_button = 2;
+  if (config->getValue(screenstr + "workspaceMenuButton", s)) {
+    if (s == "None")
+      resource.workspace_menu_button = 0;
+    else if (s == "Left")
+      resource.workspace_menu_button = 1;
+    else if (s == "Right")
+      resource.workspace_menu_button = 3;
+  }
+  // cant both be the same
+  if (resource.workspace_menu_button == resource.root_menu_button)
+    resource.workspace_menu_button = 0;
 }
 
 
@@ -974,10 +1061,41 @@ 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);
+
+  if (resource.wstyle.close_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.wstyle.close_button.mask);
+  if (resource.wstyle.max_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.wstyle.max_button.mask);
+  if (resource.wstyle.icon_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.wstyle.icon_button.mask);
+  if (resource.wstyle.stick_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.wstyle.stick_button.mask);
+
+  resource.wstyle.close_button.mask = resource.wstyle.max_button.mask =
+    resource.wstyle.icon_button.mask =
+    resource.wstyle.icon_button.mask = None;
+  
+  readDatabaseMask("window.button.close_mask", resource.wstyle.close_button,
+                   style);
+  readDatabaseMask("window.button.max_mask", resource.wstyle.max_button,
+                   style);
+  readDatabaseMask("window.button.icon_mask", resource.wstyle.icon_button,
+                   style);
+  readDatabaseMask("window.button.stick_mask", resource.wstyle.stick_button,
+                   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 +1113,22 @@ void BScreen::LoadStyle(void) {
       resource.wstyle.justify = CenterJustify;
   }
 
+  // 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
+  if (resource.tstyle.left_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.tstyle.left_button.mask);
+  if (resource.tstyle.right_button.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.tstyle.right_button.mask);
+  
   resource.tstyle.toolbar =
     readDatabaseTexture("toolbar", "black", style);
   resource.tstyle.label =
@@ -1016,7 +1149,11 @@ void BScreen::LoadStyle(void) {
     readDatabaseColor("toolbar.clock.textColor", "white", style);
   resource.tstyle.b_pic =
     readDatabaseColor("toolbar.button.picColor", "black", style);
-
+  readDatabaseMask("toolbar.button.left_mask", resource.tstyle.left_button,
+                   style);
+  readDatabaseMask("toolbar.button.right_mask", resource.tstyle.right_button,
+                   style);
+  
   resource.tstyle.justify = LeftJustify;
   if (style.getValue("toolbar.justify", s)) {
     if (s == "right" || s == "Right")
@@ -1025,7 +1162,20 @@ 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
+  if (resource.mstyle.bullet_image.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.mstyle.bullet_image.mask);
+  if (resource.mstyle.tick_image.mask != None)
+    XFreePixmap(blackbox->getXDisplay(), resource.mstyle.tick_image.mask);
+  
   resource.mstyle.title =
     readDatabaseTexture("menu.title", "white", style);
   resource.mstyle.frame =
@@ -1040,7 +1190,9 @@ void BScreen::LoadStyle(void) {
     readDatabaseColor("menu.frame.disableColor", "black", style);
   resource.mstyle.h_text =
     readDatabaseColor("menu.hilite.textColor", "black", style);
-
+  readDatabaseMask("menu.bullet.mask", resource.mstyle.bullet_image, style);
+  readDatabaseMask("menu.selected.mask", resource.mstyle.tick_image, style);
+    
   resource.mstyle.t_justify = LeftJustify;
   if (style.getValue("menu.title.justify", s)) {
     if (s == "right" || s == "Right")
@@ -1073,6 +1225,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);
 
@@ -1129,7 +1289,8 @@ void BScreen::removeIcon(BlackboxWindow *w) {
 BlackboxWindow *BScreen::getIcon(unsigned int index) {
   if (index < iconList.size()) {
     BlackboxWindowList::iterator it = iconList.begin();
-    for (; index > 0; --index, ++it) ; /* increment to index */
+    while (index-- > 0) // increment to index
+      ++it;
     return *it;
   }
 
@@ -1196,9 +1357,11 @@ 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);
 
@@ -1212,11 +1375,43 @@ 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 &&
+      (win = current_workspace->getLastFocusedWindow()))
+    f = win->setInputFocus();
+
+  /*
+    if we found a focus target, then we set the focused window explicitly
+    because it is possible to switch off this workspace before the x server
+    generates the FocusIn event for the window. if that happens, openbox would
+    lose track of what window was the 'LastFocused' window on the workspace.
+
+    if we did not find a focus target, then set the current focused window to
+    nothing.
+  */
+  if (f)
+    blackbox->setFocusedWindow(win);
+  else
+    blackbox->setFocusedWindow((BlackboxWindow *) 0);
+
   updateNetizenCurrentWorkspace();
 }
 
@@ -1279,15 +1474,22 @@ void BScreen::updateStackingList(void) {
 
 
 void BScreen::addSystrayWindow(Window window) {
+  XGrabServer(blackbox->getXDisplay());
+  
+  XSelectInput(blackbox->getXDisplay(), window, StructureNotifyMask);
   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)
@@ -1297,8 +1499,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());
 }
 
 
@@ -1306,7 +1513,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;
   }
@@ -1325,15 +1532,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();
-  } else if (win->isDesktop()) {
-    desktopWindowList.push_back(win->getFrameWindow());
+  
+    if (win->isTopmost())
+      specialWindowList.push_back(win->getFrameWindow());
   }
-
+  
   XMapRequestEvent mre;
   mre.window = w;
   if (blackbox->isStartup() && win->isNormal()) win->restoreAttributes();
@@ -1342,6 +1551,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
@@ -1358,11 +1576,7 @@ 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
-    windowList.remove(w);
-    updateClientList();
-  } else if (w->isDesktop()) {
+  if (w->isDesktop()) {
     WindowList::iterator it = desktopWindowList.begin();
     const WindowList::iterator end = desktopWindowList.end();
     for (; it != end; ++it)
@@ -1371,6 +1585,21 @@ void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) {
         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();
+
+    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?
+    }
   }
 
   if (blackbox->getFocusedWindow() == w)
@@ -1512,7 +1741,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());
@@ -1553,6 +1783,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);
 
@@ -1790,12 +2024,13 @@ void BScreen::InitMenu(void) {
 
 
 static
-void string_within(char begin, char end, const char *input, size_t length,
-                   char *output) {
+size_t string_within(char begin, char end,
+                     const char *input, size_t start_at, size_t length,
+                     char *output) {
   bool parse = False;
   size_t index = 0;
-
-  for (size_t i = 0; i < length; ++i) {
+  size_t i = start_at;
+  for (; i < length; ++i) {
     if (input[i] == begin) {
       parse = True;
     } else if (input[i] == end) {
@@ -1810,6 +2045,8 @@ void string_within(char begin, char end, const char *input, size_t length,
     output[index] = '\0';
   else
     output[0] = '\0';
+
+  return i;
 }
 
 
@@ -1832,7 +2069,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
     unsigned int key = 0;
 
     // get the keyword enclosed in []'s
-    string_within('[', ']', line, line_length, keyword);
+    size_t pos = string_within('[', ']', line, 0, line_length, keyword);
 
     if (keyword[0] == '\0') {  // no keyword, no menu entry
       continue;
@@ -1845,10 +2082,10 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
     }
 
     // get the label enclosed in ()'s
-    string_within('(', ')', line, line_length, label);
+    pos = string_within('(', ')', line, pos, line_length, label);
 
     // get the command enclosed in {}'s
-    string_within('{', '}', line, line_length, command);
+    pos = string_within('{', '}', line, pos, line_length, command);
 
     switch (key) {
     case 311: // end
@@ -2109,6 +2346,12 @@ void BScreen::shutdown(void) {
   while(! windowList.empty())
     unmanageWindow(windowList.front(), True);
 
+  while(! desktopWindowList.empty()) {
+    BlackboxWindow *win = blackbox->searchWindow(desktopWindowList.front());
+    assert(win);
+    unmanageWindow(win, True);
+  }
+
   slit->shutdown();
 }
 
@@ -2284,44 +2527,6 @@ 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();
-    }
-  } 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();
-    }
   // mouse wheel up
   } else if ((xbutton->button == 4 && resource.root_scroll == NormalScroll) ||
              (xbutton->button == 5 && resource.root_scroll == ReverseScroll)) {
@@ -2337,6 +2542,57 @@ void BScreen::buttonPressEvent(const XButtonEvent *xbutton) {
     else
       changeWorkspaceID(getCurrentWorkspaceID() - 1);
   }
+
+  if (resource.root_menu_button > 0 &&
+      xbutton->button == resource.root_menu_button)
+    showRootMenu(xbutton->x_root, xbutton->y_root);
+  else if (resource.workspace_menu_button > 0 &&
+           xbutton->button == resource.workspace_menu_button)
+    showWorkspaceMenu(xbutton->x_root, xbutton->y_root);
+}
+
+
+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();
+  }
 }
 
 
@@ -2373,6 +2629,32 @@ void BScreen::toggleFocusModel(FocusModel model) {
                 std::mem_fun(&BlackboxWindow::grabButtons));
 }
 
+void BScreen::readDatabaseMask(const string &rname, PixmapMask &pixmapMask,
+                               const Configuration &style) {
+  string s;
+  int hx, hy; //ignored
+  int ret = BitmapOpenFailed; //default to failure.
+  
+  if (style.getValue(rname, s))
+  {
+    if (s[0] != '/' && s[0] != '~')
+    {
+      std::string xbmFile = std::string("~/.openbox/buttons/") + s;
+      ret = XReadBitmapFile(blackbox->getXDisplay(), getRootWindow(),
+                            expandTilde(xbmFile).c_str(), &pixmapMask.w,
+                            &pixmapMask.h, &pixmapMask.mask, &hx, &hy);
+    } else
+      ret = XReadBitmapFile(blackbox->getXDisplay(), getRootWindow(),
+                            expandTilde(s).c_str(), &pixmapMask.w,
+                            &pixmapMask.h, &pixmapMask.mask, &hx, &hy);
+    
+    if (ret == BitmapSuccess)
+      return;
+  }
+
+  pixmapMask.mask = None;
+  pixmapMask.w = pixmapMask.h = 0;
+}
 
 BTexture BScreen::readDatabaseTexture(const string &rname,
                                       const string &default_color,
@@ -2389,18 +2671,12 @@ 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));
+  texture.setBorderColor(readDatabaseColor(rname + ".borderColor",
+                                           default_color, style));
+  
   return texture;
 }
 
@@ -2439,7 +2715,7 @@ BFont *BScreen::readDatabaseFont(const string &rbasename,
     }
     
     BFont *b = new BFont(blackbox->getXDisplay(), this, family, i, bold,
-                         italic, resource.aa_fonts);
+                         italic, resource.shadow_fonts, resource.aa_fonts);
     if (b->valid())
       return b;
     else
This page took 0.035352 seconds and 4 git commands to generate.