]> Dogcows Code - chaz/openbox/blobdiff - src/Toolbar.cc
catch button presses on the window's frame window, else they end up passing up the...
[chaz/openbox] / src / Toolbar.cc
index a51f949cffab1e91ce83e2caca7af334aac1a98a..955eb5a05223ed47384a204c2e7a2a2f187fa2de 100644 (file)
@@ -53,15 +53,14 @@ using std::string;
 
 #include "i18n.hh"
 #include "blackbox.hh"
-#include "Clientmenu.hh"
+#include "Font.hh"
 #include "GCCache.hh"
-#include "Iconmenu.hh"
 #include "Image.hh"
-#include "Rootmenu.hh"
 #include "Screen.hh"
 #include "Toolbar.hh"
 #include "Window.hh"
 #include "Workspace.hh"
+#include "Clientmenu.hh"
 #include "Workspacemenu.hh"
 #include "Slit.hh"
 
@@ -76,6 +75,11 @@ static long aMinuteFromNow(void) {
 Toolbar::Toolbar(BScreen *scrn) {
   screen = scrn;
   blackbox = screen->getBlackbox();
+  toolbarstr = "session.screen" + itostring(screen->getScreenNumber()) +
+    ".toolbar.";
+  config = blackbox->getConfig();
+
+  load_rc();
 
   // get the clock updating every minute
   clock_timer = new BTimer(blackbox, this);
@@ -88,12 +92,8 @@ Toolbar::Toolbar(BScreen *scrn) {
   hide_timer = new BTimer(blackbox, &hide_handler);
   hide_timer->setTimeout(blackbox->getAutoRaiseDelay());
 
-  on_top = screen->isToolbarOnTop();
-  hidden = do_auto_hide = screen->doToolbarAutoHide();
-
   editing = False;
   new_name_pos = 0;
-  frame.grab_x = frame.grab_y = 0;
 
   toolbarmenu = new Toolbarmenu(this);
 
@@ -156,17 +156,13 @@ Toolbar::Toolbar(BScreen *scrn) {
   frame.base = frame.label = frame.wlabel = frame.clk = frame.button =
     frame.pbutton = None;
 
-  screen->addStrut(&strut);
-
   reconfigure();
-
-  XMapSubwindows(display, frame.window);
-  XMapWindow(display, frame.window);
+  mapToolbar();
 }
 
 
 Toolbar::~Toolbar(void) {
-  XUnmapWindow(display, frame.window);
+  unmapToolbar();
 
   if (frame.base) screen->getImageControl()->removeImage(frame.base);
   if (frame.label) screen->getImageControl()->removeImage(frame.label);
@@ -196,15 +192,107 @@ Toolbar::~Toolbar(void) {
 }
 
 
-void Toolbar::reconfigure(void) {
-  unsigned int height = 0,
-    width = (screen->getWidth() * screen->getToolbarWidthPercent()) / 100;
+void Toolbar::mapToolbar() {
+  if (!screen->doHideToolbar()) {
+    //not hidden, so windows should not maximize over the toolbar
+    XMapSubwindows(display, frame.window);
+    XMapWindow(display, frame.window);
+  }
+  screen->addStrut(&strut);
+  updateStrut();
+}
+
+
+void Toolbar::unmapToolbar() {
+  if (toolbarmenu->isVisible())
+    toolbarmenu->hide();
+  //hidden so we can maximize over the toolbar
+  screen->removeStrut(&strut);
+  screen->updateAvailableArea();
+
+  XUnmapWindow(display, frame.window);
+  updateStrut();
+}
+
+
+void Toolbar::saveOnTop(bool b) {
+  on_top = b;
+  config->setValue(toolbarstr + "onTop", on_top);
+}
+
+
+void Toolbar::saveAutoHide(bool b) {
+  do_auto_hide = b;
+  config->setValue(toolbarstr + "autoHide", do_auto_hide);
+}
 
-  if (i18n.multibyte())
-    height = screen->getToolbarStyle()->fontset_extents->max_ink_extent.height;
-  else
-    height = screen->getToolbarStyle()->font->ascent +
-      screen->getToolbarStyle()->font->descent;
+
+void Toolbar::saveWidthPercent(unsigned int w) {
+  width_percent = w;
+  config->setValue(toolbarstr + "widthPercent", width_percent);
+}
+
+
+void Toolbar::savePlacement(int p) {
+  placement = p;
+  const char *pname;
+  switch (placement) {
+  case TopLeft: pname = "TopLeft"; break;
+  case BottomLeft: pname = "BottomLeft"; break;
+  case TopCenter: pname = "TopCenter"; break;
+  case TopRight: pname = "TopRight"; break;
+  case BottomRight: pname = "BottomRight"; break;
+  case BottomCenter: default: pname = "BottomCenter"; break;
+  }
+  config->setValue(toolbarstr + "placement", pname);
+}
+
+
+void Toolbar::save_rc(void) {
+  saveOnTop(on_top);
+  saveAutoHide(do_auto_hide);
+  saveWidthPercent(width_percent);
+  savePlacement(placement);
+}
+
+
+void Toolbar::load_rc(void) {
+  string s;
+  
+  if (! config->getValue(toolbarstr + "onTop", on_top))
+    on_top = false;
+
+  if (! config->getValue(toolbarstr + "autoHide", do_auto_hide))
+    do_auto_hide = false;
+  hidden = do_auto_hide;
+
+  if (! config->getValue(toolbarstr + "widthPercent", width_percent) ||
+      width_percent == 0 || width_percent > 100)
+    width_percent = 66;
+
+  if (config->getValue(toolbarstr + "placement", s)) {
+    if (s == "TopLeft")
+      placement = TopLeft;
+    else if (s == "BottomLeft")
+      placement = BottomLeft;
+    else if (s == "TopCenter")
+      placement = TopCenter;
+    else if (s == "TopRight")
+      placement = TopRight;
+    else if (s == "BottomRight")
+      placement = BottomRight;
+    else //if (s == "BottomCenter")
+      placement = BottomCenter;
+  } else
+    placement = BottomCenter;
+}
+
+
+void Toolbar::reconfigure(void) {
+  unsigned int width, height;
+  width = (screen->getWidth() * width_percent) / 100;
+  height = screen->getToolbarStyle()->font->height();
 
   frame.bevel_w = screen->getBevelWidth();
   frame.button_w = height;
@@ -215,13 +303,13 @@ void Toolbar::reconfigure(void) {
   frame.rect.setSize(width, height);
 
   int x, y;
-  switch (screen->getToolbarPlacement()) {
+  switch (placement) {
   case TopLeft:
   case TopRight:
   case TopCenter:
-    if (screen->getToolbarPlacement() == TopLeft)
+    if (placement == TopLeft)
       x = 0;
-    else if (screen->getToolbarPlacement() == TopRight)
+    else if (placement == TopRight)
       x = screen->getWidth() - frame.rect.width()
         - (screen->getBorderWidth() * 2);
     else
@@ -238,9 +326,9 @@ void Toolbar::reconfigure(void) {
   case BottomRight:
   case BottomCenter:
   default:
-    if (screen->getToolbarPlacement() == BottomLeft)
+    if (placement == BottomLeft)
       x = 0;
-    else if (screen->getToolbarPlacement() == BottomRight)
+    else if (placement == BottomRight)
       x = screen->getWidth() - frame.rect.width()
         - (screen->getBorderWidth() * 2);
     else
@@ -270,47 +358,26 @@ void Toolbar::reconfigure(void) {
       int len = strftime(t, 1024, screen->getStrftimeFormat(), tt);
       if (len == 0) { // invalid time format found
         screen->saveStrftimeFormat("%I:%M %p"); // so use the default
-        len = strftime(t, 1024, screen->getStrftimeFormat(), tt);
+        strftime(t, 1024, screen->getStrftimeFormat(), tt);
       }
       // find the length of the rendered string and add room for two extra
       // characters to it.  This allows for variable width output of the fonts
-      if (i18n.multibyte()) {
-        XRectangle ink, logical;
-        XmbTextExtents(screen->getToolbarStyle()->fontset, t, len,
-                       &ink, &logical);
-        XFontSetExtents* extents = screen->getToolbarStyle()->fontset_extents;
-        frame.clock_w = logical.width +
-          (extents->max_logical_extent.width * 2);
-      } else {
-        XFontStruct* font = screen->getToolbarStyle()->font;
-        frame.clock_w = XTextWidth(font, t, len) +
-          ((font->max_bounds.rbearing - font->min_bounds.lbearing) * 2);
-      }
+      BFont *font = screen->getToolbarStyle()->font;
+      frame.clock_w = font->measureString(t) + font->maxCharWidth() * 2;
     }
   }
 #else // !HAVE_STRFTIME
-  frame.clock_w =
-    XTextWidth(screen->getToolbarStyle()->font,
-               i18n(ToolbarSet, ToolbarNoStrftimeLength, "00:00000"),
-               strlen(i18n(ToolbarSet, ToolbarNoStrftimeLength,
-                           "00:00000")));
+  {
+    string s = i18n(ToolbarSet, ToolbarNoStrftimeLength, "00:00000");
+    frame.clock_w = screen->getToolbarStyle()->font->measureString(s);
+  }
 #endif // HAVE_STRFTIME
 
   frame.workspace_label_w = 0;
 
   for (unsigned int i = 0; i < screen->getWorkspaceCount(); i++) {
     const string& workspace_name = screen->getWorkspace(i)->getName();
-    if (i18n.multibyte()) {
-      XRectangle ink, logical;
-      XmbTextExtents(screen->getToolbarStyle()->fontset,
-                     workspace_name.c_str(), workspace_name.length(),
-                     &ink, &logical);
-      width = logical.width;
-    } else {
-      width = XTextWidth(screen->getToolbarStyle()->font,
-                     workspace_name.c_str(), workspace_name.length());
-    }
-
+    width = screen->getToolbarStyle()->font->measureString(workspace_name);
     if (width > frame.workspace_label_w) frame.workspace_label_w = width;
   }
 
@@ -436,14 +503,21 @@ void Toolbar::updateStrut(void) {
   // left and right are always 0
   strut.top = strut.bottom = 0;
 
-  switch(screen->getToolbarPlacement()) {
-  case TopLeft:
-  case TopCenter:
-  case TopRight:
-    strut.top = getExposedHeight() + (screen->getBorderWidth() * 2);
-    break;
-  default:
-    strut.bottom = getExposedHeight() + (screen->getBorderWidth() * 2);
+  // when hidden only one border is visible
+  unsigned int border_width = screen->getBorderWidth();
+  if (! do_auto_hide)
+    border_width *= 2;
+
+  if (! screen->doHideToolbar()) {
+    switch(placement) {
+    case TopLeft:
+    case TopCenter:
+    case TopRight:
+      strut.top = getExposedHeight() + border_width;
+      break;
+    default:
+      strut.bottom = getExposedHeight() + border_width;
+    }
   }
 
   screen->updateAvailableArea();
@@ -505,17 +579,9 @@ void Toolbar::checkClock(bool redraw, bool date) {
 
     ToolbarStyle *style = screen->getToolbarStyle();
 
-    int pos = frame.bevel_w * 2, // this is modified by doJustify()
-      dlen = style->doJustify(t, pos, frame.clock_w,
-                              frame.bevel_w * 4, i18n.multibyte());
-    BPen pen(style->c_text, style->font);
-    if (i18n.multibyte())
-      XmbDrawString(display, frame.clock, style->fontset, pen.gc(),
-                    pos, (1 - style->fontset_extents->max_ink_extent.y),
-                    t, dlen);
-    else
-      XDrawString(display, frame.clock, pen.gc(), pos,
-                  (style->font->ascent + 1), t, dlen);
+    int pos = frame.bevel_w * 2; // this is modified by doJustify()
+    style->doJustify(t, pos, frame.clock_w, frame.bevel_w * 4);
+    style->font->drawString(frame.clock, pos, 1, style->c_text, t);
   }
 }
 
@@ -535,17 +601,9 @@ void Toolbar::redrawWindowLabel(bool redraw) {
   const char *title = foc->getTitle();
   ToolbarStyle *style = screen->getToolbarStyle();
 
-  int pos = frame.bevel_w * 2, // modified by doJustify()
-    dlen = style->doJustify(title, pos, frame.window_label_w,
-                            frame.bevel_w * 4, i18n.multibyte());
-  BPen pen(style->w_text, style->font);
-  if (i18n.multibyte())
-    XmbDrawString(display, frame.window_label, style->fontset, pen.gc(), pos,
-                  (1 - style->fontset_extents->max_ink_extent.y),
-                  title, dlen);
-  else
-    XDrawString(display, frame.window_label, pen.gc(), pos,
-                (style->font->ascent + 1), title, dlen);
+  int pos = frame.bevel_w * 2; // modified by doJustify()
+  style->doJustify(title, pos, frame.window_label_w, frame.bevel_w * 4);
+  style->font->drawString(frame.window_label, pos, 1, style->w_text, title);
 }
 
 
@@ -557,18 +615,36 @@ void Toolbar::redrawWorkspaceLabel(bool redraw) {
 
   ToolbarStyle *style = screen->getToolbarStyle();
 
-  int pos = frame.bevel_w * 2,
-    dlen = style->doJustify(name.c_str(), pos, frame.workspace_label_w,
-                            frame.bevel_w * 4, i18n.multibyte());
-  BPen pen(style->l_text, style->font);
-  if (i18n.multibyte())
-    XmbDrawString(display, frame.workspace_label, style->fontset, pen.gc(),
-                  pos, (1 - style->fontset_extents->max_ink_extent.y),
-                  name.c_str(), dlen);
-  else
-    XDrawString(display, frame.workspace_label, pen.gc(), pos,
-                (style->font->ascent + 1),
-                name.c_str(), dlen);
+  int pos = frame.bevel_w * 2;
+  style->doJustify(name.c_str(), pos, frame.workspace_label_w,
+                   frame.bevel_w * 4);
+  style->font->drawString(frame.workspace_label, pos, 1, style->l_text, name);
+}
+
+
+void Toolbar::drawArrow(Drawable surface, bool left) const {
+  int hh = frame.button_w / 2, hw = frame.button_w / 2;
+  XPoint pts[3];
+  const int bullet_size = 3;
+
+  if (left) {
+    pts[0].x = hw - bullet_size;
+    pts[0].y = hh;
+    pts[1].x = 2 * bullet_size;
+    pts[1].y = bullet_size;
+    pts[2].x = 0;
+    pts[2].y = -(2 * bullet_size);
+  } else {
+    pts[0].x = hw - bullet_size;
+    pts[0].y = hh - bullet_size;
+    pts[1].x = (2 * bullet_size);
+    pts[1].y =  bullet_size;
+    pts[2].x = -(2 * bullet_size);
+    pts[2].y = bullet_size;
+  }
+  
+  BPen pen(screen->getToolbarStyle()->b_pic);
+  XFillPolygon(display, surface, pen.gc(), pts, 3, Convex, CoordModePrevious);
 }
 
 
@@ -588,17 +664,7 @@ void Toolbar::redrawPrevWorkspaceButton(bool pressed, bool redraw) {
     XClearWindow(display, frame.psbutton);
   }
 
-  int hh = frame.button_w / 2, hw = frame.button_w / 2;
-
-  XPoint pts[3];
-  pts[0].x = hw - 2; pts[0].y = hh;
-  pts[1].x = 4; pts[1].y = 2;
-  pts[2].x = 0; pts[2].y = -4;
-
-  ToolbarStyle *style = screen->getToolbarStyle();
-  BPen pen(style->b_pic, style->font);
-  XFillPolygon(display, frame.psbutton, pen.gc(),
-               pts, 3, Convex, CoordModePrevious);
+  drawArrow(frame.psbutton, True);
 }
 
 
@@ -618,17 +684,7 @@ void Toolbar::redrawNextWorkspaceButton(bool pressed, bool redraw) {
     XClearWindow(display, frame.nsbutton);
   }
 
-  int hh = frame.button_w / 2, hw = frame.button_w / 2;
-
-  XPoint pts[3];
-  pts[0].x = hw - 2; pts[0].y = hh - 2;
-  pts[1].x = 4; pts[1].y =  2;
-  pts[2].x = -4; pts[2].y = 2;
-
-  ToolbarStyle *style = screen->getToolbarStyle();
-  BPen pen(style->b_pic, style->font);
-  XFillPolygon(display, frame.nsbutton, pen.gc(),
-               pts, 3, Convex, CoordModePrevious);
+  drawArrow(frame.nsbutton, False);
 }
 
 
@@ -648,17 +704,7 @@ void Toolbar::redrawPrevWindowButton(bool pressed, bool redraw) {
     XClearWindow(display, frame.pwbutton);
   }
 
-  int hh = frame.button_w / 2, hw = frame.button_w / 2;
-
-  XPoint pts[3];
-  pts[0].x = hw - 2; pts[0].y = hh;
-  pts[1].x = 4; pts[1].y = 2;
-  pts[2].x = 0; pts[2].y = -4;
-
-  ToolbarStyle *style = screen->getToolbarStyle();
-  BPen pen(style->b_pic, style->font);
-  XFillPolygon(display, frame.pwbutton, pen.gc(),
-               pts, 3, Convex, CoordModePrevious);
+  drawArrow(frame.pwbutton, True);
 }
 
 
@@ -678,17 +724,7 @@ void Toolbar::redrawNextWindowButton(bool pressed, bool redraw) {
     XClearWindow(display, frame.nwbutton);
   }
 
-  int hh = frame.button_w / 2, hw = frame.button_w / 2;
-
-  XPoint pts[3];
-  pts[0].x = hw - 2; pts[0].y = hh - 2;
-  pts[1].x = 4; pts[1].y =  2;
-  pts[2].x = -4; pts[2].y = 2;
-
-  ToolbarStyle *style = screen->getToolbarStyle();
-  BPen pen(style->b_pic, style->font);
-  XFillPolygon(display, frame.nwbutton, pen.gc(), pts, 3, Convex,
-               CoordModePrevious);
+  drawArrow(frame.nwbutton, False);
 }
 
 
@@ -710,7 +746,7 @@ void Toolbar::edit(void) {
     blackbox->getFocusedWindow()->setFocusFlag(False);
 
   ToolbarStyle *style = screen->getToolbarStyle();
-  BPen pen(style->l_text, style->font);
+  BPen pen(style->l_text);
   XDrawRectangle(display, frame.workspace_label, pen.gc(),
                  frame.workspace_label_w / 2, 0, 1,
                  frame.label_h - 1);
@@ -726,7 +762,7 @@ void Toolbar::edit(void) {
 }
 
 
-void Toolbar::buttonPressEvent(XButtonEvent *be) {
+void Toolbar::buttonPressEvent(const XButtonEvent *be) {
   if (be->button == 1) {
     if (be->window == frame.psbutton)
       redrawPrevWorkspaceButton(True, True);
@@ -775,7 +811,7 @@ void Toolbar::buttonPressEvent(XButtonEvent *be) {
 
 
 
-void Toolbar::buttonReleaseEvent(XButtonEvent *re) {
+void Toolbar::buttonReleaseEvent(const XButtonEvent *re) {
   if (re->button == 1) {
     if (re->window == frame.psbutton) {
       redrawPrevWorkspaceButton(False, True);
@@ -822,7 +858,7 @@ void Toolbar::buttonReleaseEvent(XButtonEvent *re) {
 }
 
 
-void Toolbar::enterNotifyEvent(XCrossingEvent *) {
+void Toolbar::enterNotifyEvent(const XCrossingEvent *) {
   if (! do_auto_hide)
     return;
 
@@ -833,7 +869,7 @@ void Toolbar::enterNotifyEvent(XCrossingEvent *) {
   }
 }
 
-void Toolbar::leaveNotifyEvent(XCrossingEvent *) {
+void Toolbar::leaveNotifyEvent(const XCrossingEvent *) {
   if (! do_auto_hide)
     return;
 
@@ -845,7 +881,7 @@ void Toolbar::leaveNotifyEvent(XCrossingEvent *) {
 }
 
 
-void Toolbar::exposeEvent(XExposeEvent *ee) {
+void Toolbar::exposeEvent(const XExposeEvent *ee) {
   if (ee->window == frame.clock) checkClock(True);
   else if (ee->window == frame.workspace_label && (! editing))
     redrawWorkspaceLabel();
@@ -857,7 +893,7 @@ void Toolbar::exposeEvent(XExposeEvent *ee) {
 }
 
 
-void Toolbar::keyPressEvent(XKeyEvent *ke) {
+void Toolbar::keyPressEvent(const XKeyEvent *ke) {
   if (ke->window == frame.workspace_label && editing) {
     if (new_workspace_name.empty()) {
       new_name_pos = 0;
@@ -865,26 +901,21 @@ void Toolbar::keyPressEvent(XKeyEvent *ke) {
 
     KeySym ks;
     char keychar[1];
-    XLookupString(ke, keychar, 1, &ks, 0);
+    XLookupString(const_cast<XKeyEvent*>(ke), keychar, 1, &ks, 0);
 
     // either we are told to end with a return or we hit 127 chars
     if (ks == XK_Return || new_name_pos == 127) {
       editing = False;
 
       blackbox->setNoFocus(False);
-      if (blackbox->getFocusedWindow()) {
+      if (blackbox->getFocusedWindow())
         blackbox->getFocusedWindow()->setInputFocus();
-      } else {
+      else
         blackbox->setFocusedWindow(0);
-      }
-
-      Workspace *wkspc = screen->getCurrentWorkspace();
-      wkspc->setName(new_workspace_name);
-      wkspc->getMenu()->hide();
 
-      screen->getWorkspacemenu()->changeItemLabel(wkspc->getID() + 2,
-                                                  wkspc->getName());
-      screen->getWorkspacemenu()->update();
+      // the toolbar will be reconfigured when the change to the workspace name
+      // gets caught in the PropertyNotify event handler
+      screen->getCurrentWorkspace()->setName(new_workspace_name);
 
       new_workspace_name.erase();
       new_name_pos = 0;
@@ -900,7 +931,6 @@ void Toolbar::keyPressEvent(XKeyEvent *ke) {
       else
         XSetWindowBackgroundPixmap(display, frame.workspace_label,
                                    frame.wlabel);
-      reconfigure();
     } else if (! (ks == XK_Shift_L || ks == XK_Shift_R ||
                   ks == XK_Control_L || ks == XK_Control_R ||
                   ks == XK_Caps_Lock || ks == XK_Shift_Lock ||
@@ -921,32 +951,17 @@ void Toolbar::keyPressEvent(XKeyEvent *ke) {
       }
 
       XClearWindow(display, frame.workspace_label);
-      unsigned int l = new_workspace_name.length(), tw, x;
+      unsigned int tw, x;
 
-      if (i18n.multibyte()) {
-        XRectangle ink, logical;
-        XmbTextExtents(screen->getToolbarStyle()->fontset,
-                       new_workspace_name.c_str(), l, &ink, &logical);
-        tw = logical.width;
-      } else {
-        tw = XTextWidth(screen->getToolbarStyle()->font,
-                        new_workspace_name.c_str(), l);
-      }
+      tw = screen->getToolbarStyle()->font->measureString(new_workspace_name);
       x = (frame.workspace_label_w - tw) / 2;
 
       if (x < frame.bevel_w) x = frame.bevel_w;
 
       ToolbarStyle *style = screen->getToolbarStyle();
-      BPen pen(style->l_text, style->font);
-      if (i18n.multibyte())
-        XmbDrawString(display, frame.workspace_label, style->fontset,
-                      pen.gc(), x,
-                      (1 - style->fontset_extents->max_ink_extent.y),
-                      new_workspace_name.c_str(), l);
-      else
-        XDrawString(display, frame.workspace_label, pen.gc(), x,
-                    (style->font->ascent + 1),
-                    new_workspace_name.c_str(), l);
+      style->font->drawString(frame.workspace_label, x, 1, style->l_text,
+                              new_workspace_name);
+      BPen pen(style->l_text);
       XDrawRectangle(display, frame.workspace_label, pen.gc(), x + tw, 0, 1,
                      frame.label_h - 1);
     }
@@ -973,7 +988,7 @@ void Toolbar::HideHandler::timeout(void) {
 
 
 void Toolbar::toggleAutoHide(void) {
-  do_auto_hide = (do_auto_hide) ?  False : True;
+  saveAutoHide(! doAutoHide());
 
   updateStrut();
   screen->getSlit()->reposition();
@@ -1002,9 +1017,13 @@ Toolbarmenu::Toolbarmenu(Toolbar *tb) : Basemenu(tb->screen) {
               "Edit current workspace name"), 3);
 
   update();
+  setValues();
+}
 
-  if (toolbar->isOnTop()) setItemSelected(1, True);
-  if (toolbar->doAutoHide()) setItemSelected(2, True);
+
+void Toolbarmenu::setValues() {
+  setItemSelected(1, toolbar->isOnTop());
+  setItemSelected(2, toolbar->doAutoHide());
 }
 
 
@@ -1022,8 +1041,8 @@ void Toolbarmenu::itemSelected(int button, unsigned int index) {
 
   switch (item->function()) {
   case 1: { // always on top
-    toolbar->on_top = ((toolbar->isOnTop()) ? False : True);;
-    setItemSelected(1, toolbar->on_top);
+    toolbar->saveOnTop(! toolbar->isOnTop());
+    setItemSelected(1, toolbar->isOnTop());
 
     if (toolbar->isOnTop()) getScreen()->raiseWindows((Window *) 0, 0);
     break;
@@ -1031,7 +1050,7 @@ void Toolbarmenu::itemSelected(int button, unsigned int index) {
 
   case 2: { // auto hide
     toolbar->toggleAutoHide();
-    setItemSelected(2, toolbar->do_auto_hide);
+    setItemSelected(2, toolbar->doAutoHide());
 
     break;
   }
@@ -1054,6 +1073,7 @@ void Toolbarmenu::internal_hide(void) {
 
 
 void Toolbarmenu::reconfigure(void) {
+  setValues();
   placementmenu->reconfigure();
 
   Basemenu::reconfigure();
@@ -1061,7 +1081,7 @@ void Toolbarmenu::reconfigure(void) {
 
 
 Toolbarmenu::Placementmenu::Placementmenu(Toolbarmenu *tm)
-  : Basemenu(tm->toolbar->screen) {
+  : Basemenu(tm->toolbar->screen), toolbar(tm->toolbar) {
   setLabel(i18n(ToolbarSet, ToolbarToolbarPlacement, "Toolbar Placement"));
   setInternalMenu();
   setMinimumSublevels(3);
@@ -1079,6 +1099,38 @@ Toolbarmenu::Placementmenu::Placementmenu(Toolbarmenu *tm)
   insert(i18n(CommonSet, CommonPlacementBottomRight, "Bottom Right"),
          Toolbar::BottomRight);
   update();
+  setValues();
+}
+
+
+void Toolbarmenu::Placementmenu::setValues(void) {
+  int place = 0;
+  switch (toolbar->getPlacement()) {
+  case Toolbar::BottomRight:
+    place++;
+  case Toolbar::TopRight:
+    place++;
+  case Toolbar::BottomCenter:
+    place++;
+  case Toolbar::TopCenter:
+    place++;
+  case Toolbar::BottomLeft:
+    place++;
+  case Toolbar::TopLeft:
+    break;
+  }
+  setItemSelected(0, 0 == place);
+  setItemSelected(1, 1 == place);
+  setItemSelected(2, 2 == place);
+  setItemSelected(3, 3 == place);
+  setItemSelected(4, 4 == place);
+  setItemSelected(5, 5 == place);
+}
+
+
+void Toolbarmenu::Placementmenu::reconfigure(void) {
+  setValues();
+  Basemenu::reconfigure();
 }
 
 
@@ -1089,9 +1141,9 @@ void Toolbarmenu::Placementmenu::itemSelected(int button, unsigned int index) {
   BasemenuItem *item = find(index);
   if (! item) return;
 
-  getScreen()->saveToolbarPlacement(item->function());
+  toolbar->savePlacement(item->function());
   hide();
-  getScreen()->getToolbar()->reconfigure();
+  toolbar->reconfigure();
 
   // reposition the slit as well to make sure it doesn't intersect the
   // toolbar
@@ -1099,21 +1151,14 @@ void Toolbarmenu::Placementmenu::itemSelected(int button, unsigned int index) {
 }
 
 
-int ToolbarStyle::doJustify(const char *text, int &start_pos,
-                            unsigned int max_length, unsigned int modifier,
-                            bool multibyte) const {
-  size_t text_len = strlen(text);
+void ToolbarStyle::doJustify(const std::string &text, int &start_pos,
+                             unsigned int max_length,
+                             unsigned int modifier) const {
+  size_t text_len = text.size();
   unsigned int length;
 
   do {
-    if (multibyte) {
-      XRectangle ink, logical;
-      XmbTextExtents(fontset, text, text_len, &ink, &logical);
-      length = logical.width;
-    } else {
-      length = XTextWidth(font, text, text_len);
-    }
-    length += modifier;
+    length = font->measureString(string(text, 0, text_len)) + modifier;
   } while (length > max_length && text_len-- > 0);
 
   switch (justify) {
@@ -1129,6 +1174,4 @@ int ToolbarStyle::doJustify(const char *text, int &start_pos,
   default:
     break;
   }
-
-  return text_len;
 }
This page took 0.04465 seconds and 4 git commands to generate.