X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FToolbar.cc;h=955eb5a05223ed47384a204c2e7a2a2f187fa2de;hb=bb9a37ec3d10d529f4043ba76e149f0bd510c111;hp=a51f949cffab1e91ce83e2caca7af334aac1a98a;hpb=8794d357e67abddf9fda9db77b235e294d0ec590;p=chaz%2Fopenbox diff --git a/src/Toolbar.cc b/src/Toolbar.cc index a51f949c..955eb5a0 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc @@ -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(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; }