#include "i18n.hh"
#include "blackbox.hh"
#include "Clientmenu.hh"
+#include "Font.hh"
#include "GCCache.hh"
#include "Iconmenu.hh"
#include "Image.hh"
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);
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;
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);
}
-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();
+}
- if (i18n.multibyte())
- height = screen->getToolbarStyle()->fontset_extents->max_ink_extent.height;
- else
- height = screen->getToolbarStyle()->font->ascent +
- screen->getToolbarStyle()->font->descent;
+
+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);
+}
+
+
+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;
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
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
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;
}
// 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();
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);
}
}
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);
}
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);
}
pts[2].x = 0; pts[2].y = -4;
ToolbarStyle *style = screen->getToolbarStyle();
- BPen pen(style->b_pic, style->font);
+ BPen pen(style->b_pic);
XFillPolygon(display, frame.psbutton, pen.gc(),
pts, 3, Convex, CoordModePrevious);
}
pts[2].x = -4; pts[2].y = 2;
ToolbarStyle *style = screen->getToolbarStyle();
- BPen pen(style->b_pic, style->font);
+ BPen pen(style->b_pic);
XFillPolygon(display, frame.nsbutton, pen.gc(),
pts, 3, Convex, CoordModePrevious);
}
pts[2].x = 0; pts[2].y = -4;
ToolbarStyle *style = screen->getToolbarStyle();
- BPen pen(style->b_pic, style->font);
+ BPen pen(style->b_pic);
XFillPolygon(display, frame.pwbutton, pen.gc(),
pts, 3, Convex, CoordModePrevious);
}
pts[2].x = -4; pts[2].y = 2;
ToolbarStyle *style = screen->getToolbarStyle();
- BPen pen(style->b_pic, style->font);
+ BPen pen(style->b_pic);
XFillPolygon(display, frame.nwbutton, pen.gc(), pts, 3, Convex,
CoordModePrevious);
}
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);
}
-void Toolbar::buttonPressEvent(XButtonEvent *be) {
+void Toolbar::buttonPressEvent(const XButtonEvent *be) {
if (be->button == 1) {
if (be->window == frame.psbutton)
redrawPrevWorkspaceButton(True, True);
-void Toolbar::buttonReleaseEvent(XButtonEvent *re) {
+void Toolbar::buttonReleaseEvent(const XButtonEvent *re) {
if (re->button == 1) {
if (re->window == frame.psbutton) {
redrawPrevWorkspaceButton(False, True);
}
-void Toolbar::enterNotifyEvent(XCrossingEvent *) {
+void Toolbar::enterNotifyEvent(const XCrossingEvent *) {
if (! do_auto_hide)
return;
}
}
-void Toolbar::leaveNotifyEvent(XCrossingEvent *) {
+void Toolbar::leaveNotifyEvent(const XCrossingEvent *) {
if (! do_auto_hide)
return;
}
-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();
}
-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;
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) {
}
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);
}
void Toolbar::toggleAutoHide(void) {
- do_auto_hide = (do_auto_hide) ? False : True;
+ saveAutoHide(! doAutoHide());
updateStrut();
screen->getSlit()->reposition();
"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());
}
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;
case 2: { // auto hide
toolbar->toggleAutoHide();
- setItemSelected(2, toolbar->do_auto_hide);
+ setItemSelected(2, toolbar->doAutoHide());
break;
}
void Toolbarmenu::reconfigure(void) {
+ setValues();
placementmenu->reconfigure();
Basemenu::reconfigure();
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);
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();
}
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
}
-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) {
default:
break;
}
-
- return text_len;
}