X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FToolbar.cc;h=587d3fd430269c444c93dc39010347368c4fdb75;hb=87e63d53af67d5ea98f55a27007663d4c9c8fc6c;hp=3d3f867fef696a39b382369a21408c771f417417;hpb=251dd4034f3a3f11a190c06d7b69670dc87d219d;p=chaz%2Fopenbox diff --git a/src/Toolbar.cc b/src/Toolbar.cc index 3d3f867f..587d3fd4 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc @@ -1,5 +1,6 @@ -// Toolbar.cc for Openbox -// Copyright (c) 2001 Sean 'Shaleh' Perry +// -*- mode: C++; indent-tabs-mode: nil; -*- +// Toolbar.cc for Blackbox - an X11 Window manager +// Copyright (c) 2001 - 2002 Sean 'Shaleh' Perry // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) // // Permission is hereby granted, free of charge, to any person obtaining a @@ -20,31 +21,14 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// stupid macros needed to access some functions in version 2 of the GNU C -// library -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif // _GNU_SOURCE - #ifdef HAVE_CONFIG_H # include "../config.h" #endif // HAVE_CONFIG_H -#include "i18n.h" -#include "openbox.h" -#include "Clientmenu.h" -#include "Iconmenu.h" -#include "Rootmenu.h" -#include "Screen.h" -#include "Toolbar.h" -#include "Window.h" -#include "Workspace.h" -#include "Workspacemenu.h" - -#include +extern "C" { #include -#ifdef HAVE_STRING_H +#ifdef HAVE_STRING_H # include #endif // HAVE_STRING_H @@ -62,117 +46,139 @@ # include # endif // HAVE_SYS_TIME_H #endif // TIME_WITH_SYS_TIME +} +#include +using std::string; -Toolbar::Toolbar(BScreen &scrn) : screen(scrn), openbox(scrn.getOpenbox()) { - // get the clock updating every minute - clock_timer = new BTimer(openbox, *this); +#include "i18n.hh" +#include "blackbox.hh" +#include "Font.hh" +#include "GCCache.hh" +#include "Image.hh" +#include "Screen.hh" +#include "Toolbar.hh" +#include "Window.hh" +#include "Workspace.hh" +#include "Clientmenu.hh" +#include "Workspacemenu.hh" +#include "Slit.hh" + + +static long aMinuteFromNow(void) { timeval now; gettimeofday(&now, 0); - clock_timer->setTimeout((60 - (now.tv_sec % 60)) * 1000); - clock_timer->start(); + return ((60 - (now.tv_sec % 60)) * 1000); +} - hide_handler.toolbar = this; - hide_timer = new BTimer(openbox, hide_handler); - hide_timer->setTimeout(openbox.getAutoRaiseDelay()); - hide_timer->fireOnce(True); - image_ctrl = screen.getImageControl(); +Toolbar::Toolbar(BScreen *scrn) { + screen = scrn; + blackbox = screen->getBlackbox(); + toolbarstr = "session.screen" + itostring(screen->getScreenNumber()) + + ".toolbar."; + config = blackbox->getConfig(); - on_top = screen.isToolbarOnTop(); - hidden = do_auto_hide = screen.doToolbarAutoHide(); + load_rc(); + + // get the clock updating every minute + clock_timer = new BTimer(blackbox, this); + clock_timer->setTimeout(aMinuteFromNow()); + clock_timer->recurring(True); + clock_timer->start(); + frame.minute = frame.hour = -1; + + hide_handler.toolbar = this; + hide_timer = new BTimer(blackbox, &hide_handler); + hide_timer->setTimeout(blackbox->getAutoRaiseDelay()); editing = False; - new_workspace_name = (char *) 0; new_name_pos = 0; - frame.grab_x = frame.grab_y = 0; - toolbarmenu = new Toolbarmenu(*this); + toolbarmenu = new Toolbarmenu(this); - display = openbox.getXDisplay(); + display = blackbox->getXDisplay(); XSetWindowAttributes attrib; unsigned long create_mask = CWBackPixmap | CWBackPixel | CWBorderPixel | CWColormap | CWOverrideRedirect | CWEventMask; attrib.background_pixmap = None; attrib.background_pixel = attrib.border_pixel = - screen.getBorderColor()->getPixel(); - attrib.colormap = screen.getColormap(); + screen->getBorderColor()->pixel(); + attrib.colormap = screen->getColormap(); attrib.override_redirect = True; attrib.event_mask = ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask; frame.window = - XCreateWindow(display, screen.getRootWindow(), 0, 0, 1, 1, 0, - screen.getDepth(), InputOutput, screen.getVisual(), - create_mask, &attrib); - openbox.saveToolbarSearch(frame.window, this); + XCreateWindow(display, screen->getRootWindow(), 0, 0, 1, 1, 0, + screen->getDepth(), InputOutput, screen->getVisual(), + create_mask, &attrib); + blackbox->saveToolbarSearch(frame.window, this); attrib.event_mask = ButtonPressMask | ButtonReleaseMask | ExposureMask | KeyPressMask | EnterWindowMask; frame.workspace_label = - XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, screen.getDepth(), - InputOutput, screen.getVisual(), create_mask, &attrib); - openbox.saveToolbarSearch(frame.workspace_label, this); + XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, screen->getDepth(), + InputOutput, screen->getVisual(), create_mask, &attrib); + blackbox->saveToolbarSearch(frame.workspace_label, this); frame.window_label = - XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, screen.getDepth(), - InputOutput, screen.getVisual(), create_mask, &attrib); - openbox.saveToolbarSearch(frame.window_label, this); + XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, screen->getDepth(), + InputOutput, screen->getVisual(), create_mask, &attrib); + blackbox->saveToolbarSearch(frame.window_label, this); frame.clock = - XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, screen.getDepth(), - InputOutput, screen.getVisual(), create_mask, &attrib); - openbox.saveToolbarSearch(frame.clock, this); + XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, screen->getDepth(), + InputOutput, screen->getVisual(), create_mask, &attrib); + blackbox->saveToolbarSearch(frame.clock, this); frame.psbutton = - XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen.getDepth(), - InputOutput, screen.getVisual(), create_mask, &attrib); - openbox.saveToolbarSearch(frame.psbutton, this); + XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen->getDepth(), + InputOutput, screen->getVisual(), create_mask, &attrib); + blackbox->saveToolbarSearch(frame.psbutton, this); frame.nsbutton = - XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen.getDepth(), - InputOutput, screen.getVisual(), create_mask, &attrib); - openbox.saveToolbarSearch(frame.nsbutton, this); + XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen->getDepth(), + InputOutput, screen->getVisual(), create_mask, &attrib); + blackbox->saveToolbarSearch(frame.nsbutton, this); frame.pwbutton = - XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen.getDepth(), - InputOutput, screen.getVisual(), create_mask, &attrib); - openbox.saveToolbarSearch(frame.pwbutton, this); + XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen->getDepth(), + InputOutput, screen->getVisual(), create_mask, &attrib); + blackbox->saveToolbarSearch(frame.pwbutton, this); frame.nwbutton = - XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen.getDepth(), - InputOutput, screen.getVisual(), create_mask, &attrib); - openbox.saveToolbarSearch(frame.nwbutton, this); + XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, screen->getDepth(), + InputOutput, screen->getVisual(), create_mask, &attrib); + blackbox->saveToolbarSearch(frame.nwbutton, this); frame.base = frame.label = frame.wlabel = frame.clk = frame.button = frame.pbutton = None; reconfigure(); - - XMapSubwindows(display, frame.window); - XMapWindow(display, frame.window); + mapToolbar(); } Toolbar::~Toolbar(void) { - XUnmapWindow(display, frame.window); - - if (frame.base) image_ctrl->removeImage(frame.base); - if (frame.label) image_ctrl->removeImage(frame.label); - if (frame.wlabel) image_ctrl->removeImage(frame.wlabel); - if (frame.clk) image_ctrl->removeImage(frame.clk); - if (frame.button) image_ctrl->removeImage(frame.button); - if (frame.pbutton) image_ctrl->removeImage(frame.pbutton); - - openbox.removeToolbarSearch(frame.window); - openbox.removeToolbarSearch(frame.workspace_label); - openbox.removeToolbarSearch(frame.window_label); - openbox.removeToolbarSearch(frame.clock); - openbox.removeToolbarSearch(frame.psbutton); - openbox.removeToolbarSearch(frame.nsbutton); - openbox.removeToolbarSearch(frame.pwbutton); - openbox.removeToolbarSearch(frame.nwbutton); + unmapToolbar(); + + if (frame.base) screen->getImageControl()->removeImage(frame.base); + if (frame.label) screen->getImageControl()->removeImage(frame.label); + if (frame.wlabel) screen->getImageControl()->removeImage(frame.wlabel); + if (frame.clk) screen->getImageControl()->removeImage(frame.clk); + if (frame.button) screen->getImageControl()->removeImage(frame.button); + if (frame.pbutton) screen->getImageControl()->removeImage(frame.pbutton); + + blackbox->removeToolbarSearch(frame.window); + blackbox->removeToolbarSearch(frame.workspace_label); + blackbox->removeToolbarSearch(frame.window_label); + blackbox->removeToolbarSearch(frame.clock); + blackbox->removeToolbarSearch(frame.psbutton); + blackbox->removeToolbarSearch(frame.nsbutton); + blackbox->removeToolbarSearch(frame.pwbutton); + blackbox->removeToolbarSearch(frame.nwbutton); XDestroyWindow(display, frame.workspace_label); XDestroyWindow(display, frame.window_label); @@ -186,279 +192,291 @@ Toolbar::~Toolbar(void) { } -void Toolbar::reconfigure(void) { - frame.bevel_w = screen.getBevelWidth(); - frame.width = screen.size().w() * screen.getToolbarWidthPercent() / 100; - - if (i18n->multibyte()) - frame.height = - screen.getToolbarStyle()->fontset_extents->max_ink_extent.height; - else - frame.height = screen.getToolbarStyle()->font->ascent + - screen.getToolbarStyle()->font->descent; - frame.button_w = frame.height; - frame.height += 2; - frame.label_h = frame.height; - frame.height += (frame.bevel_w * 2); +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); +} + + +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; - switch (screen.getToolbarPlacement()) { - case TopLeft: - frame.x = 0; - frame.y = 0; - frame.x_hidden = 0; - frame.y_hidden = screen.getBevelWidth() - screen.getBorderWidth() - - frame.height; - break; + 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; +} - case BottomLeft: - frame.x = 0; - frame.y = screen.size().h() - frame.height - - (screen.getBorderWidth() * 2); - frame.x_hidden = 0; - frame.y_hidden = screen.size().h() - screen.getBevelWidth() - - screen.getBorderWidth(); - break; +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; + height += 2; + frame.label_h = height; + height += (frame.bevel_w * 2); + + frame.rect.setSize(width, height); + + int x, y; + switch (placement) { + case TopLeft: + case TopRight: case TopCenter: - frame.x = (screen.size().w() - frame.width) / 2; - frame.y = 0; - frame.x_hidden = frame.x; - frame.y_hidden = screen.getBevelWidth() - screen.getBorderWidth() - - frame.height; + if (placement == TopLeft) + x = 0; + else if (placement == TopRight) + x = screen->getWidth() - frame.rect.width() + - (screen->getBorderWidth() * 2); + else + x = (screen->getWidth() - frame.rect.width()) / 2; + + y = 0; + + frame.x_hidden = x; + frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth() + - frame.rect.height(); break; + case BottomLeft: + case BottomRight: case BottomCenter: default: - frame.x = (screen.size().w() - frame.width) / 2; - frame.y = screen.size().h() - frame.height - - (screen.getBorderWidth() * 2); - frame.x_hidden = frame.x; - frame.y_hidden = screen.size().h() - screen.getBevelWidth() - - screen.getBorderWidth(); - break; + if (placement == BottomLeft) + x = 0; + else if (placement == BottomRight) + x = screen->getWidth() - frame.rect.width() + - (screen->getBorderWidth() * 2); + else + x = (screen->getWidth() - frame.rect.width()) / 2; - case TopRight: - frame.x = screen.size().w() - frame.width - - (screen.getBorderWidth() * 2); - frame.y = 0; - frame.x_hidden = frame.x; - frame.y_hidden = screen.getBevelWidth() - screen.getBorderWidth() - - frame.height; - break; + y = screen->getHeight() - frame.rect.height() + - (screen->getBorderWidth() * 2); - case BottomRight: - frame.x = screen.size().w() - frame.width - - (screen.getBorderWidth() * 2); - frame.y = screen.size().h() - frame.height - - (screen.getBorderWidth() * 2); - frame.x_hidden = frame.x; - frame.y_hidden = screen.size().h() - screen.getBevelWidth() - - screen.getBorderWidth(); + frame.x_hidden = x; + frame.y_hidden = screen->getHeight() - screen->getBevelWidth() + - screen->getBorderWidth(); break; } + frame.rect.setPos(x, y); + + updateStrut(); + #ifdef HAVE_STRFTIME time_t ttmp = time(NULL); - struct tm *tt = 0; + frame.clock_w = 0; if (ttmp != -1) { - tt = localtime(&ttmp); + struct tm *tt = localtime(&ttmp); if (tt) { - char t[1025], *time_string = (char *) 0; - int len = strftime(t, 1024, screen.getStrftimeFormat(), tt); - t[len++-1] = ' '; // add a space to the string for padding - t[len] = '\0'; - - if (i18n->multibyte()) { - XRectangle ink, logical; - XmbTextExtents(screen.getToolbarStyle()->fontset, t, len, &ink, - &logical); - frame.clock_w = logical.width; - - // ben's additional solution to pad some space beside the numbers - //frame.clock_w += - // screen.getToolbarStyle()->fontset_extents->max_logical_extent.width * - // 4; - - // brad's solution, which is currently buggy, too big - //frame.clock_w = - // screen.getToolbarStyle()->fontset_extents->max_logical_extent.width - // * len; - } else { - frame.clock_w = XTextWidth(screen.getToolbarStyle()->font, t, len); - // ben's additional solution to pad some space beside the numbers - //frame.clock_w += screen.getToolbarStyle()->font->max_bounds.width * 4; - // brad's solution again, too big - //frame.clock_w = screen.getToolbarStyle()->font->max_bounds.width * len; + char t[1024]; + int len = strftime(t, 1024, screen->getStrftimeFormat(), tt); + if (len == 0) { // invalid time format found + screen->saveStrftimeFormat("%I:%M %p"); // so use the default + strftime(t, 1024, screen->getStrftimeFormat(), tt); } - frame.clock_w += (frame.bevel_w * 4); - - delete [] time_string; - } else { - frame.clock_w = 0; + // 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 + BFont *font = screen->getToolbarStyle()->font; + frame.clock_w = font->measureString(t) + font->maxCharWidth() * 2; } - } else { - frame.clock_w = 0; } #else // !HAVE_STRFTIME - frame.clock_w = - XTextWidth(screen.getToolbarStyle()->font, - i18n->getMessage(ToolbarSet, ToolbarNoStrftimeLength, - "00:00000"), - strlen(i18n->getMessage(ToolbarSet, ToolbarNoStrftimeLength, - "00:00000"))) + (frame.bevel_w * 4); + { + string s = i18n(ToolbarSet, ToolbarNoStrftimeLength, "00:00000"); + frame.clock_w = screen->getToolbarStyle()->font->measureString(s); + } #endif // HAVE_STRFTIME - int i; - unsigned int w = 0; frame.workspace_label_w = 0; - for (i = 0; i < screen.getWorkspaceCount(); i++) { - if (i18n->multibyte()) { - XRectangle ink, logical; - XmbTextExtents(screen.getToolbarStyle()->fontset, - screen.getWorkspace(i)->getName(), - strlen(screen.getWorkspace(i)->getName()), - &ink, &logical); - w = logical.width; - } else { - w = XTextWidth(screen.getToolbarStyle()->font, - screen.getWorkspace(i)->getName(), - strlen(screen.getWorkspace(i)->getName())); - } - w += (frame.bevel_w * 4); - - if (w > frame.workspace_label_w) frame.workspace_label_w = w; + for (unsigned int i = 0; i < screen->getWorkspaceCount(); i++) { + const string& workspace_name = screen->getWorkspace(i)->getName(); + width = screen->getToolbarStyle()->font->measureString(workspace_name); + if (width > frame.workspace_label_w) frame.workspace_label_w = width; } - if (frame.workspace_label_w < frame.clock_w) - frame.workspace_label_w = frame.clock_w; - else if (frame.workspace_label_w > frame.clock_w) - frame.clock_w = frame.workspace_label_w; + frame.workspace_label_w = frame.clock_w = + std::max(frame.workspace_label_w, frame.clock_w) + (frame.bevel_w * 4); + // XXX: where'd the +6 come from? frame.window_label_w = - (frame.width - (frame.clock_w + (frame.button_w * 4) + - frame.workspace_label_w + (frame.bevel_w * 8) + 6)); + (frame.rect.width() - (frame.clock_w + (frame.button_w * 4) + + frame.workspace_label_w + (frame.bevel_w * 8) + 6)); if (hidden) { XMoveResizeWindow(display, frame.window, frame.x_hidden, frame.y_hidden, - frame.width, frame.height); + frame.rect.width(), frame.rect.height()); } else { - XMoveResizeWindow(display, frame.window, frame.x, frame.y, - frame.width, frame.height); + XMoveResizeWindow(display, frame.window, frame.rect.x(), frame.rect.y(), + frame.rect.width(), frame.rect.height()); } XMoveResizeWindow(display, frame.workspace_label, frame.bevel_w, - frame.bevel_w, frame.workspace_label_w, + frame.bevel_w, frame.workspace_label_w, frame.label_h); - XMoveResizeWindow(display, frame.psbutton, (frame.bevel_w * 2) + - frame.workspace_label_w + 1, frame.bevel_w + 1, - frame.button_w, frame.button_w); - XMoveResizeWindow(display ,frame.nsbutton, (frame.bevel_w * 3) + - frame.workspace_label_w + frame.button_w + 2, + XMoveResizeWindow(display, frame.psbutton, + ((frame.bevel_w * 2) + frame.workspace_label_w + 1), + frame.bevel_w + 1, frame.button_w, frame.button_w); + XMoveResizeWindow(display, frame.nsbutton, + ((frame.bevel_w * 3) + frame.workspace_label_w + + frame.button_w + 2), frame.bevel_w + 1, frame.button_w, + frame.button_w); + XMoveResizeWindow(display, frame.window_label, + ((frame.bevel_w * 4) + (frame.button_w * 2) + + frame.workspace_label_w + 3), frame.bevel_w, + frame.window_label_w, frame.label_h); + XMoveResizeWindow(display, frame.pwbutton, + ((frame.bevel_w * 5) + (frame.button_w * 2) + + frame.workspace_label_w + frame.window_label_w + 4), frame.bevel_w + 1, frame.button_w, frame.button_w); - XMoveResizeWindow(display, frame.window_label, (frame.bevel_w * 4) + - (frame.button_w * 2) + frame.workspace_label_w + 3, - frame.bevel_w, frame.window_label_w, frame.label_h); - XMoveResizeWindow(display, frame.pwbutton, (frame.bevel_w * 5) + - (frame.button_w * 2) + frame.workspace_label_w + - frame.window_label_w + 4, frame.bevel_w + 1, - frame.button_w, frame.button_w); - XMoveResizeWindow(display, frame.nwbutton, (frame.bevel_w * 6) + - (frame.button_w * 3) + frame.workspace_label_w + - frame.window_label_w + 5, frame.bevel_w + 1, - frame.button_w, frame.button_w); - XMoveResizeWindow(display, frame.clock, frame.width - frame.clock_w - - frame.bevel_w, frame.bevel_w, frame.clock_w, - frame.label_h); - - Pixmap tmp = frame.base; - BTexture *texture = &(screen.getToolbarStyle()->toolbar); - if (texture->getTexture() == (BImage_Flat | BImage_Solid)) { - frame.base = None; + XMoveResizeWindow(display, frame.nwbutton, + ((frame.bevel_w * 6) + (frame.button_w * 3) + + frame.workspace_label_w + frame.window_label_w + 5), + frame.bevel_w + 1, frame.button_w, frame.button_w); + XMoveResizeWindow(display, frame.clock, + frame.rect.width() - frame.clock_w - (frame.bevel_w * 2), + frame.bevel_w, frame.clock_w, frame.label_h); + + ToolbarStyle *style = screen->getToolbarStyle(); + frame.base = style->toolbar.render(frame.rect.width(), frame.rect.height(), + frame.base); + if (! frame.base) XSetWindowBackground(display, frame.window, - texture->getColor()->getPixel()); - } else { - frame.base = - image_ctrl->renderImage(frame.width, frame.height, texture); + style->toolbar.color().pixel()); + else XSetWindowBackgroundPixmap(display, frame.window, frame.base); - } - if (tmp) image_ctrl->removeImage(tmp); - tmp = frame.label; - texture = &(screen.getToolbarStyle()->window); - if (texture->getTexture() == (BImage_Flat | BImage_Solid)) { - frame.label = None; + frame.label = style->window.render(frame.window_label_w, frame.label_h, + frame.label); + if (! frame.label) XSetWindowBackground(display, frame.window_label, - texture->getColor()->getPixel()); - } else { - frame.label = - image_ctrl->renderImage(frame.window_label_w, frame.label_h, texture); + style->window.color().pixel()); + else XSetWindowBackgroundPixmap(display, frame.window_label, frame.label); - } - if (tmp) image_ctrl->removeImage(tmp); - tmp = frame.wlabel; - texture = &(screen.getToolbarStyle()->label); - if (texture->getTexture() == (BImage_Flat | BImage_Solid)) { - frame.wlabel = None; + frame.wlabel = style->label.render(frame.workspace_label_w, frame.label_h, + frame.wlabel); + if (! frame.wlabel) XSetWindowBackground(display, frame.workspace_label, - texture->getColor()->getPixel()); - } else { - frame.wlabel = - image_ctrl->renderImage(frame.workspace_label_w, frame.label_h, texture); + style->label.color().pixel()); + else XSetWindowBackgroundPixmap(display, frame.workspace_label, frame.wlabel); - } - if (tmp) image_ctrl->removeImage(tmp); - - tmp = frame.clk; - texture = &(screen.getToolbarStyle()->clock); - if (texture->getTexture() == (BImage_Flat | BImage_Solid)) { - frame.clk = None; - XSetWindowBackground(display, frame.clock, - texture->getColor()->getPixel()); - } else { - frame.clk = - image_ctrl->renderImage(frame.clock_w, frame.label_h, texture); - XSetWindowBackgroundPixmap(display, frame.clock, frame.clk); - } - if (tmp) image_ctrl->removeImage(tmp); - tmp = frame.button; - texture = &(screen.getToolbarStyle()->button); - if (texture->getTexture() == (BImage_Flat | BImage_Solid)) { - frame.button = None; + frame.clk = style->clock.render(frame.clock_w, frame.label_h, frame.clk); + if (! frame.clk) + XSetWindowBackground(display, frame.clock, style->clock.color().pixel()); + else + XSetWindowBackgroundPixmap(display, frame.clock, frame.clk); - frame.button_pixel = texture->getColor()->getPixel(); + frame.button = style->button.render(frame.button_w, frame.button_w, + frame.button); + if (! frame.button) { + frame.button_pixel = style->button.color().pixel(); XSetWindowBackground(display, frame.psbutton, frame.button_pixel); XSetWindowBackground(display, frame.nsbutton, frame.button_pixel); XSetWindowBackground(display, frame.pwbutton, frame.button_pixel); XSetWindowBackground(display, frame.nwbutton, frame.button_pixel); } else { - frame.button = - image_ctrl->renderImage(frame.button_w, frame.button_w, texture); - XSetWindowBackgroundPixmap(display, frame.psbutton, frame.button); XSetWindowBackgroundPixmap(display, frame.nsbutton, frame.button); XSetWindowBackgroundPixmap(display, frame.pwbutton, frame.button); XSetWindowBackgroundPixmap(display, frame.nwbutton, frame.button); } - if (tmp) image_ctrl->removeImage(tmp); - tmp = frame.pbutton; - texture = &(screen.getToolbarStyle()->pressed); - if (texture->getTexture() == (BImage_Flat | BImage_Solid)) { - frame.pbutton = None; - frame.pbutton_pixel = texture->getColor()->getPixel(); - } else { - frame.pbutton = - image_ctrl->renderImage(frame.button_w, frame.button_w, texture); - } - if (tmp) image_ctrl->removeImage(tmp); + frame.pbutton = style->pressed.render(frame.button_w, frame.button_w, + frame.pbutton); + if (! frame.pbutton) + frame.pbutton_pixel = style->pressed.color().pixel(); XSetWindowBorder(display, frame.window, - screen.getBorderColor()->getPixel()); - XSetWindowBorderWidth(display, frame.window, screen.getBorderWidth()); + screen->getBorderColor()->pixel()); + XSetWindowBorderWidth(display, frame.window, screen->getBorderWidth()); XClearWindow(display, frame.window); XClearWindow(display, frame.workspace_label); @@ -481,10 +499,35 @@ void Toolbar::reconfigure(void) { } +void Toolbar::updateStrut(void) { + // left and right are always 0 + strut.top = strut.bottom = 0; + + // 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(); +} + + #ifdef HAVE_STRFTIME -void Toolbar::checkClock(Bool redraw) { +void Toolbar::checkClock(bool redraw) { #else // !HAVE_STRFTIME -void Toolbar::checkClock(Bool redraw, Bool date) { +void Toolbar::checkClock(bool redraw, bool date) { #endif // HAVE_STRFTIME time_t tmp = 0; struct tm *tt = 0; @@ -502,327 +545,245 @@ void Toolbar::checkClock(Bool redraw, Bool date) { if (redraw) { #ifdef HAVE_STRFTIME char t[1024]; - if (! strftime(t, 1024, screen.getStrftimeFormat(), tt)) + if (! strftime(t, 1024, screen->getStrftimeFormat(), tt)) return; #else // !HAVE_STRFTIME char t[9]; if (date) { // format the date... with special consideration for y2k ;) - if (screen.getDateFormat() == Openbox::B_EuropeanDate) - sprintf(t, 18n->getMessage(ToolbarSet, ToolbarNoStrftimeDateFormatEu, - "%02d.%02d.%02d"), - tt->tm_mday, tt->tm_mon + 1, + if (screen->getDateFormat() == Blackbox::B_EuropeanDate) + sprintf(t, 18n(ToolbarSet, ToolbarNoStrftimeDateFormatEu, + "%02d.%02d.%02d"), + tt->tm_mday, tt->tm_mon + 1, (tt->tm_year >= 100) ? tt->tm_year - 100 : tt->tm_year); else - sprintf(t, i18n->getMessage(ToolbarSet, ToolbarNoStrftimeDateFormat, - "%02d/%02d/%02d"), - tt->tm_mon + 1, tt->tm_mday, + sprintf(t, i18n(ToolbarSet, ToolbarNoStrftimeDateFormat, + "%02d/%02d/%02d"), + tt->tm_mon + 1, tt->tm_mday, (tt->tm_year >= 100) ? tt->tm_year - 100 : tt->tm_year); } else { - if (screen.isClock24Hour()) - sprintf(t, i18n->getMessage(ToolbarSet, ToolbarNoStrftimeTimeFormat24, - " %02d:%02d "), - frame.hour, frame.minute); + if (screen->isClock24Hour()) + sprintf(t, i18n(ToolbarSet, ToolbarNoStrftimeTimeFormat24, + " %02d:%02d "), + frame.hour, frame.minute); else - sprintf(t, i18n->getMessage(ToolbarSet, ToolbarNoStrftimeTimeFormat12, - "%02d:%02d %sm"), - ((frame.hour > 12) ? frame.hour - 12 : - ((frame.hour == 0) ? 12 : frame.hour)), frame.minute, - ((frame.hour >= 12) ? - i18n->getMessage(ToolbarSet, - ToolbarNoStrftimeTimeFormatP, "p") : - i18n->getMessage(ToolbarSet, - ToolbarNoStrftimeTimeFormatA, "a"))); + sprintf(t, i18n(ToolbarSet, ToolbarNoStrftimeTimeFormat12, + "%02d:%02d %sm"), + ((frame.hour > 12) ? frame.hour - 12 : + ((frame.hour == 0) ? 12 : frame.hour)), frame.minute, + ((frame.hour >= 12) ? + i18n(ToolbarSet, ToolbarNoStrftimeTimeFormatP, "p") : + i18n(ToolbarSet, ToolbarNoStrftimeTimeFormatA, "a"))); } #endif // HAVE_STRFTIME - int dx = (frame.bevel_w * 2), dlen = strlen(t); - unsigned int l; + ToolbarStyle *style = screen->getToolbarStyle(); - if (i18n->multibyte()) { - XRectangle ink, logical; - XmbTextExtents(screen.getToolbarStyle()->fontset, - t, dlen, &ink, &logical); - l = logical.width; - } else { - l = XTextWidth(screen.getToolbarStyle()->font, t, dlen); - } - - l += (frame.bevel_w * 4); - - if (l > frame.clock_w) { - for (; dlen >= 0; dlen--) { - if (i18n->multibyte()) { - XRectangle ink, logical; - XmbTextExtents(screen.getToolbarStyle()->fontset, - t, dlen, &ink, &logical); - l = logical.width; - } else { - l = XTextWidth(screen.getToolbarStyle()->font, t, dlen); - } - l+= (frame.bevel_w * 4); - - if (l < frame.clock_w) - break; - } - } - switch (screen.getToolbarStyle()->justify) { - case BScreen::RightJustify: - dx += frame.clock_w - l; - break; + int pos = frame.bevel_w * 2; // this is modified by doJustify() + style->doJustify(t, pos, frame.clock_w, frame.bevel_w * 4); - case BScreen::CenterJustify: - dx += (frame.clock_w - l) / 2; - break; - } +#ifdef XFT + XClearWindow(display, frame.clock); +#endif // XFT - ToolbarStyle *style = screen.getToolbarStyle(); - if (i18n->multibyte()) - XmbDrawString(display, frame.clock, style->fontset, style->c_text_gc, - dx, (1 - style->fontset_extents->max_ink_extent.y), - t, dlen); - else - XDrawString(display, frame.clock, style->c_text_gc, dx, - (style->font->ascent + 1), t, dlen); + style->font->drawString(frame.clock, pos, 1, style->c_text, t); } } -void Toolbar::redrawWindowLabel(Bool redraw) { - if (screen.getOpenbox().getFocusedWindow()) { - if (redraw) - XClearWindow(display, frame.window_label); +void Toolbar::redrawWindowLabel(bool redraw) { + BlackboxWindow *foc = screen->getBlackbox()->getFocusedWindow(); + if (! foc) { + XClearWindow(display, frame.window_label); + return; + } - OpenboxWindow *foc = screen.getOpenbox().getFocusedWindow(); - if (foc->getScreen() != &screen) return; +#ifdef XFT + redraw = true; +#endif // XFT - int dx = (frame.bevel_w * 2), dlen = strlen(*foc->getTitle()); - unsigned int l; + if (redraw) + XClearWindow(display, frame.window_label); - if (i18n->multibyte()) { - XRectangle ink, logical; - XmbTextExtents(screen.getToolbarStyle()->fontset, *foc->getTitle(), - dlen, &ink, &logical); - l = logical.width; - } else { - l = XTextWidth(screen.getToolbarStyle()->font, *foc->getTitle(), dlen); - } - l += (frame.bevel_w * 4); - - if (l > frame.window_label_w) { - for (; dlen >= 0; dlen--) { - if (i18n->multibyte()) { - XRectangle ink, logical; - XmbTextExtents(screen.getToolbarStyle()->fontset, - *foc->getTitle(), dlen, &ink, &logical); - l = logical.width; - } else { - l = XTextWidth(screen.getToolbarStyle()->font, - *foc->getTitle(), dlen); - } - l += (frame.bevel_w * 4); - - if (l < frame.window_label_w) - break; - } - } - switch (screen.getToolbarStyle()->justify) { - case BScreen::RightJustify: - dx += frame.window_label_w - l; - break; + if (foc->getScreen() != screen) return; - case BScreen::CenterJustify: - dx += (frame.window_label_w - l) / 2; - break; - } + const char *title = foc->getTitle(); + ToolbarStyle *style = screen->getToolbarStyle(); - ToolbarStyle *style = screen.getToolbarStyle(); - if (i18n->multibyte()) - XmbDrawString(display, frame.window_label, style->fontset, - style->w_text_gc, dx, - (1 - style->fontset_extents->max_ink_extent.y), - *foc->getTitle(), dlen); - else - XDrawString(display, frame.window_label, style->w_text_gc, dx, - (style->font->ascent + 1), *foc->getTitle(), dlen); - } else { - XClearWindow(display, frame.window_label); - } + 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); } - - -void Toolbar::redrawWorkspaceLabel(Bool redraw) { - if (screen.getCurrentWorkspace()->getName()) { - if (redraw) - XClearWindow(display, frame.workspace_label); - - int dx = (frame.bevel_w * 2), dlen = - strlen(screen.getCurrentWorkspace()->getName()); - unsigned int l; - - if (i18n->multibyte()) { - XRectangle ink, logical; - XmbTextExtents(screen.getToolbarStyle()->fontset, - screen.getCurrentWorkspace()->getName(), dlen, - &ink, &logical); - l = logical.width; + + +void Toolbar::redrawWorkspaceLabel(bool redraw) { + const string& name = screen->getCurrentWorkspace()->getName(); + +#ifdef XFT + redraw = true; +#endif // XFT + + if (redraw) + XClearWindow(display, frame.workspace_label); + + ToolbarStyle *style = screen->getToolbarStyle(); + + 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 { + ToolbarStyle *style = screen->getToolbarStyle(); + + BPen pen(style->b_pic); + + int hh = frame.button_w / 2, hw = frame.button_w / 2; + XPoint pts[3]; + const int bullet_size = 3; + + + if (left) { +#ifdef BITMAPBUTTONS + if (style->left_button.mask != None) { + XSetClipMask(blackbox->getXDisplay(), pen.gc(), style->left_button.mask); + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), + (frame.button_w - style->left_button.w)/2, + (frame.button_w - style->left_button.h)/2); + + XFillRectangle(blackbox->getXDisplay(), surface, pen.gc(), + (frame.button_w - style->left_button.w)/2, + (frame.button_w - style->left_button.h)/2, + style->left_button.w, style->left_button.h); + + XSetClipMask(blackbox->getXDisplay(), pen.gc(), None); + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), 0, 0); } else { - l = XTextWidth(screen.getToolbarStyle()->font, - screen.getCurrentWorkspace()->getName(), dlen); +#endif // BITMAPBUTTONS + 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); + XFillPolygon(display, surface, pen.gc(), pts, 3, Convex, + CoordModePrevious); +#ifdef BITMAPBUTTONS } - l += (frame.bevel_w * 4); - - if (l > frame.workspace_label_w) { - for (; dlen >= 0; dlen--) { - if (i18n->multibyte()) { - XRectangle ink, logical; - XmbTextExtents(screen.getToolbarStyle()->fontset, - screen.getCurrentWorkspace()->getName(), dlen, - &ink, &logical); - l = logical.width; - } else { - l = XTextWidth(screen.getWindowStyle()->font, - screen.getCurrentWorkspace()->getName(), dlen); - } - l += (frame.bevel_w * 4); - - if (l < frame.workspace_label_w) - break; - } - } - switch (screen.getToolbarStyle()->justify) { - case BScreen::RightJustify: - dx += frame.workspace_label_w - l; - break; - - case BScreen::CenterJustify: - dx += (frame.workspace_label_w - l) / 2; - break; +#endif // BITMAPBUTTONS + } else { +#ifdef BITMAPBUTTONS + if (style->right_button.mask != None) { + XSetClipMask(blackbox->getXDisplay(), pen.gc(), + style->right_button.mask); + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), + (frame.button_w - style->right_button.w)/2, + (frame.button_w - style->right_button.h)/2); + + XFillRectangle(blackbox->getXDisplay(), surface, pen.gc(), + (frame.button_w - style->right_button.w)/2, + (frame.button_w - style->right_button.h)/2, + (frame.button_w + style->right_button.w)/2, + (frame.button_w + style->right_button.h)/2); + + XSetClipMask(blackbox->getXDisplay(), pen.gc(), None); + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), 0, 0); + } else { +#endif // BITMAPBUTTONS + 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; + XFillPolygon(display, surface, pen.gc(), pts, 3, Convex, + CoordModePrevious); +#ifdef BITMAPBUTTONS } - - ToolbarStyle *style = screen.getToolbarStyle(); - if (i18n->multibyte()) - XmbDrawString(display, frame.workspace_label, style->fontset, - style->l_text_gc, dx, - (1 - style->fontset_extents->max_ink_extent.y), - (char *) screen.getCurrentWorkspace()->getName(), dlen); - else - XDrawString(display, frame.workspace_label, style->l_text_gc, dx, - (style->font->ascent + 1), - (char *) screen.getCurrentWorkspace()->getName(), dlen); +#endif } } -void Toolbar::redrawPrevWorkspaceButton(Bool pressed, Bool redraw) { +void Toolbar::redrawPrevWorkspaceButton(bool pressed, bool redraw) { if (redraw) { if (pressed) { if (frame.pbutton) - XSetWindowBackgroundPixmap(display, frame.psbutton, frame.pbutton); + XSetWindowBackgroundPixmap(display, frame.psbutton, frame.pbutton); else - XSetWindowBackground(display, frame.psbutton, frame.pbutton_pixel); + XSetWindowBackground(display, frame.psbutton, frame.pbutton_pixel); } else { if (frame.button) XSetWindowBackgroundPixmap(display, frame.psbutton, frame.button); else - XSetWindowBackground(display, frame.psbutton, frame.button_pixel); + XSetWindowBackground(display, frame.psbutton, frame.button_pixel); } 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; - - XFillPolygon(display, frame.psbutton, screen.getToolbarStyle()->b_pic_gc, - pts, 3, Convex, CoordModePrevious); + drawArrow(frame.psbutton, True); } -void Toolbar::redrawNextWorkspaceButton(Bool pressed, Bool redraw) { +void Toolbar::redrawNextWorkspaceButton(bool pressed, bool redraw) { if (redraw) { if (pressed) { if (frame.pbutton) - XSetWindowBackgroundPixmap(display, frame.nsbutton, frame.pbutton); + XSetWindowBackgroundPixmap(display, frame.nsbutton, frame.pbutton); else - XSetWindowBackground(display, frame.nsbutton, frame.pbutton_pixel); + XSetWindowBackground(display, frame.nsbutton, frame.pbutton_pixel); } else { if (frame.button) XSetWindowBackgroundPixmap(display, frame.nsbutton, frame.button); else - XSetWindowBackground(display, frame.nsbutton, frame.button_pixel); + XSetWindowBackground(display, frame.nsbutton, frame.button_pixel); } 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; - - XFillPolygon(display, frame.nsbutton, screen.getToolbarStyle()->b_pic_gc, - pts, 3, Convex, CoordModePrevious); + drawArrow(frame.nsbutton, False); } -void Toolbar::redrawPrevWindowButton(Bool pressed, Bool redraw) { +void Toolbar::redrawPrevWindowButton(bool pressed, bool redraw) { if (redraw) { if (pressed) { if (frame.pbutton) - XSetWindowBackgroundPixmap(display, frame.pwbutton, frame.pbutton); + XSetWindowBackgroundPixmap(display, frame.pwbutton, frame.pbutton); else - XSetWindowBackground(display, frame.pwbutton, frame.pbutton_pixel); + XSetWindowBackground(display, frame.pwbutton, frame.pbutton_pixel); } else { if (frame.button) XSetWindowBackgroundPixmap(display, frame.pwbutton, frame.button); else - XSetWindowBackground(display, frame.pwbutton, frame.button_pixel); + XSetWindowBackground(display, frame.pwbutton, frame.button_pixel); } 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; - - XFillPolygon(display, frame.pwbutton, screen.getToolbarStyle()->b_pic_gc, - pts, 3, Convex, CoordModePrevious); + drawArrow(frame.pwbutton, True); } -void Toolbar::redrawNextWindowButton(Bool pressed, Bool redraw) { +void Toolbar::redrawNextWindowButton(bool pressed, bool redraw) { if (redraw) { if (pressed) { if (frame.pbutton) - XSetWindowBackgroundPixmap(display, frame.nwbutton, frame.pbutton); + XSetWindowBackgroundPixmap(display, frame.nwbutton, frame.pbutton); else - XSetWindowBackground(display, frame.nwbutton, frame.pbutton_pixel); + XSetWindowBackground(display, frame.nwbutton, frame.pbutton_pixel); } else { if (frame.button) XSetWindowBackgroundPixmap(display, frame.nwbutton, frame.button); else - XSetWindowBackground(display, frame.nwbutton, frame.button_pixel); + XSetWindowBackground(display, frame.nwbutton, frame.button_pixel); } 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; - - XFillPolygon(display, frame.nwbutton, screen.getToolbarStyle()->b_pic_gc, - pts, 3, Convex, CoordModePrevious); + drawArrow(frame.nwbutton, False); } @@ -831,42 +792,36 @@ void Toolbar::edit(void) { int foo; editing = True; - if (XGetInputFocus(display, &window, &foo) && - window == frame.workspace_label) + XGetInputFocus(display, &window, &foo); + if (window == frame.workspace_label) return; XSetInputFocus(display, frame.workspace_label, - ((screen.isSloppyFocus()) ? RevertToPointerRoot : - RevertToParent), - CurrentTime); + RevertToPointerRoot, CurrentTime); XClearWindow(display, frame.workspace_label); - openbox.setNoFocus(True); - if (openbox.getFocusedWindow()) - openbox.getFocusedWindow()->setFocusFlag(False); + blackbox->setNoFocus(True); + if (blackbox->getFocusedWindow()) + blackbox->getFocusedWindow()->setFocusFlag(False); - XDrawRectangle(display, frame.workspace_label, - screen.getWindowStyle()->l_text_focus_gc, + ToolbarStyle *style = screen->getToolbarStyle(); + BPen pen(style->l_text); + XDrawRectangle(display, frame.workspace_label, pen.gc(), frame.workspace_label_w / 2, 0, 1, frame.label_h - 1); - // change the background of the window to that of an active window label - Pixmap tmp = frame.wlabel; - BTexture *texture = &(screen.getWindowStyle()->l_focus); - if (texture->getTexture() == (BImage_Flat | BImage_Solid)) { - frame.wlabel = None; + BTexture *texture = &(screen->getWindowStyle()->l_focus); + frame.wlabel = texture->render(frame.workspace_label_w, frame.label_h, + frame.wlabel); + if (! frame.wlabel) XSetWindowBackground(display, frame.workspace_label, - texture->getColor()->getPixel()); - } else { - frame.wlabel = - image_ctrl->renderImage(frame.workspace_label_w, frame.label_h, texture); + texture->color().pixel()); + else XSetWindowBackgroundPixmap(display, frame.workspace_label, frame.wlabel); - } - if (tmp) image_ctrl->removeImage(tmp); } -void Toolbar::buttonPressEvent(XButtonEvent *be) { +void Toolbar::buttonPressEvent(const XButtonEvent *be) { if (be->button == 1) { if (be->window == frame.psbutton) redrawPrevWorkspaceButton(True, True); @@ -884,12 +839,14 @@ void Toolbar::buttonPressEvent(XButtonEvent *be) { #endif // HAVE_STRFTIME else if (! on_top) { Window w[1] = { frame.window }; - screen.raiseWindows(w, 1); + screen->raiseWindows(w, 1); } } else if (be->button == 2 && (! on_top)) { XLowerWindow(display, frame.window); } else if (be->button == 3) { - if (! toolbarmenu->isVisible()) { + if (toolbarmenu->isVisible()) { + toolbarmenu->hide(); + } else { int x, y; x = be->x_root - (toolbarmenu->getWidth() / 2); @@ -897,60 +854,59 @@ void Toolbar::buttonPressEvent(XButtonEvent *be) { if (x < 0) x = 0; - else if (x + toolbarmenu->getWidth() > screen.size().w()) - x = screen.size().w() - toolbarmenu->getWidth(); + else if (x + toolbarmenu->getWidth() > screen->getWidth()) + x = screen->getWidth() - toolbarmenu->getWidth(); if (y < 0) y = 0; - else if (y + toolbarmenu->getHeight() > screen.size().h()) - y = screen.size().h() - toolbarmenu->getHeight(); + else if (y + toolbarmenu->getHeight() > screen->getHeight()) + y = screen->getHeight() - toolbarmenu->getHeight(); toolbarmenu->move(x, y); toolbarmenu->show(); - } else - toolbarmenu->hide(); + } } } -void Toolbar::buttonReleaseEvent(XButtonEvent *re) { +void Toolbar::buttonReleaseEvent(const XButtonEvent *re) { if (re->button == 1) { if (re->window == frame.psbutton) { redrawPrevWorkspaceButton(False, True); - if (re->x >= 0 && re->x < (signed) frame.button_w && - re->y >= 0 && re->y < (signed) frame.button_w) - if (screen.getCurrentWorkspace()->getWorkspaceID() > 0) - screen.changeWorkspaceID(screen.getCurrentWorkspace()-> - getWorkspaceID() - 1); + if (re->x >= 0 && re->x < static_cast(frame.button_w) && + re->y >= 0 && re->y < static_cast(frame.button_w)) + if (screen->getCurrentWorkspace()->getID() > 0) + screen->changeWorkspaceID(screen->getCurrentWorkspace()-> + getID() - 1); else - screen.changeWorkspaceID(screen.getWorkspaceCount() - 1); + screen->changeWorkspaceID(screen->getWorkspaceCount() - 1); } else if (re->window == frame.nsbutton) { redrawNextWorkspaceButton(False, True); - if (re->x >= 0 && re->x < (signed) frame.button_w && - re->y >= 0 && re->y < (signed) frame.button_w) - if (screen.getCurrentWorkspace()->getWorkspaceID() < - screen.getWorkspaceCount() - 1) - screen.changeWorkspaceID(screen.getCurrentWorkspace()-> - getWorkspaceID() + 1); + if (re->x >= 0 && re->x < static_cast(frame.button_w) && + re->y >= 0 && re->y < static_cast(frame.button_w)) + if (screen->getCurrentWorkspace()->getID() < + (screen->getWorkspaceCount() - 1)) + screen->changeWorkspaceID(screen->getCurrentWorkspace()-> + getID() + 1); else - screen.changeWorkspaceID(0); + screen->changeWorkspaceID(0); } else if (re->window == frame.pwbutton) { redrawPrevWindowButton(False, True); - if (re->x >= 0 && re->x < (signed) frame.button_w && - re->y >= 0 && re->y < (signed) frame.button_w) - screen.prevFocus(); + if (re->x >= 0 && re->x < static_cast(frame.button_w) && + re->y >= 0 && re->y < static_cast(frame.button_w)) + screen->prevFocus(); } else if (re->window == frame.nwbutton) { redrawNextWindowButton(False, True); - if (re->x >= 0 && re->x < (signed) frame.button_w && - re->y >= 0 && re->y < (signed) frame.button_w) - screen.nextFocus(); + if (re->x >= 0 && re->x < static_cast(frame.button_w) && + re->y >= 0 && re->y < static_cast(frame.button_w)) + screen->nextFocus(); } else if (re->window == frame.window_label) - screen.raiseFocus(); + screen->raiseFocus(); #ifndef HAVE_STRFTIME else if (re->window == frame.clock) { XClearWindow(display, frame.clock); @@ -961,7 +917,7 @@ void Toolbar::buttonReleaseEvent(XButtonEvent *re) { } -void Toolbar::enterNotifyEvent(XCrossingEvent *) { +void Toolbar::enterNotifyEvent(const XCrossingEvent *) { if (! do_auto_hide) return; @@ -972,7 +928,7 @@ void Toolbar::enterNotifyEvent(XCrossingEvent *) { } } -void Toolbar::leaveNotifyEvent(XCrossingEvent *) { +void Toolbar::leaveNotifyEvent(const XCrossingEvent *) { if (! do_auto_hide) return; @@ -984,7 +940,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(); @@ -996,122 +952,78 @@ void Toolbar::exposeEvent(XExposeEvent *ee) { } -void Toolbar::keyPressEvent(XKeyEvent *ke) { +void Toolbar::keyPressEvent(const XKeyEvent *ke) { if (ke->window == frame.workspace_label && editing) { - openbox.grab(); - - if (! new_workspace_name) { - new_workspace_name = new char[128]; + if (new_workspace_name.empty()) { new_name_pos = 0; - - if (! new_workspace_name) return; } 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 the end of the buffer + // either we are told to end with a return or we hit 127 chars if (ks == XK_Return || new_name_pos == 127) { - *(new_workspace_name + new_name_pos) = 0; - editing = False; - openbox.setNoFocus(False); - if (openbox.getFocusedWindow()) { - openbox.getFocusedWindow()->setInputFocus(); - openbox.getFocusedWindow()->setFocusFlag(True); - } else { - XSetInputFocus(display, PointerRoot, None, CurrentTime); - } - // check to make sure that new_name[0] != 0... otherwise we have a null - // workspace name which causes serious problems, especially for the - // Openbox::LoadRC() method. - if (*new_workspace_name) { - screen.getCurrentWorkspace()->setName(new_workspace_name); - screen.getCurrentWorkspace()->getMenu()->hide(); - screen.getWorkspacemenu()-> - remove(screen.getCurrentWorkspace()->getWorkspaceID() + 2); - screen.getWorkspacemenu()-> - insert(screen.getCurrentWorkspace()->getName(), - screen.getCurrentWorkspace()->getMenu(), - screen.getCurrentWorkspace()->getWorkspaceID() + 2); - screen.getWorkspacemenu()->update(); - } + blackbox->setNoFocus(False); + if (blackbox->getFocusedWindow()) + blackbox->getFocusedWindow()->setInputFocus(); + else + blackbox->setFocusedWindow(0); + + // 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); - delete [] new_workspace_name; - new_workspace_name = (char *) 0; + new_workspace_name.erase(); new_name_pos = 0; // reset the background to that of the workspace label (its normal // setting) - Pixmap tmp = frame.wlabel; - BTexture *texture = &(screen.getToolbarStyle()->label); - if (texture->getTexture() == (BImage_Flat | BImage_Solid)) { - frame.wlabel = None; + BTexture *texture = &(screen->getToolbarStyle()->label); + frame.wlabel = texture->render(frame.workspace_label_w, frame.label_h, + frame.wlabel); + if (! frame.wlabel) XSetWindowBackground(display, frame.workspace_label, - texture->getColor()->getPixel()); - } else { - frame.wlabel = - image_ctrl->renderImage(frame.workspace_label_w, frame.label_h, texture); - XSetWindowBackgroundPixmap(display, frame.workspace_label, frame.wlabel); - } - if (tmp) image_ctrl->removeImage(tmp); - - reconfigure(); + texture->color().pixel()); + else + XSetWindowBackgroundPixmap(display, frame.workspace_label, + frame.wlabel); } 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 || - ks == XK_Meta_L || ks == XK_Meta_R || - ks == XK_Alt_L || ks == XK_Alt_R || - ks == XK_Super_L || ks == XK_Super_R || - ks == XK_Hyper_L || ks == XK_Hyper_R)) { + ks == XK_Control_L || ks == XK_Control_R || + ks == XK_Caps_Lock || ks == XK_Shift_Lock || + ks == XK_Meta_L || ks == XK_Meta_R || + ks == XK_Alt_L || ks == XK_Alt_R || + ks == XK_Super_L || ks == XK_Super_R || + ks == XK_Hyper_L || ks == XK_Hyper_R)) { if (ks == XK_BackSpace) { - if (new_name_pos > 0) { - --new_name_pos; - *(new_workspace_name + new_name_pos) = '\0'; - } else { - *new_workspace_name = '\0'; - } + if (new_name_pos > 0) { + --new_name_pos; + new_workspace_name.erase(new_name_pos); + } else { + new_workspace_name.resize(0); + } } else { - *(new_workspace_name + new_name_pos) = *keychar; - ++new_name_pos; - *(new_workspace_name + new_name_pos) = '\0'; + new_workspace_name += (*keychar); + ++new_name_pos; } XClearWindow(display, frame.workspace_label); - int l = strlen(new_workspace_name), tw, x; + unsigned int tw, x; - if (i18n->multibyte()) { - XRectangle ink, logical; - XmbTextExtents(screen.getToolbarStyle()->fontset, - new_workspace_name, l, &ink, &logical); - tw = logical.width; - } else { - tw = XTextWidth(screen.getToolbarStyle()->font, - new_workspace_name, l); - } + tw = screen->getToolbarStyle()->font->measureString(new_workspace_name); x = (frame.workspace_label_w - tw) / 2; - if (x < (signed) frame.bevel_w) x = frame.bevel_w; + if (x < frame.bevel_w) x = frame.bevel_w; - WindowStyle *style = screen.getWindowStyle(); - if (i18n->multibyte()) - XmbDrawString(display, frame.workspace_label, style->fontset, - style->l_text_focus_gc, x, - (1 - style->fontset_extents->max_ink_extent.y), - new_workspace_name, l); - else - XDrawString(display, frame.workspace_label, style->l_text_focus_gc, x, - (style->font->ascent + 1), - new_workspace_name, l); - - XDrawRectangle(display, frame.workspace_label, - screen.getWindowStyle()->l_text_focus_gc, x + tw, 0, 1, - frame.label_h - 1); + ToolbarStyle *style = screen->getToolbarStyle(); + 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); } - - openbox.ungrab(); } } @@ -1119,9 +1031,7 @@ void Toolbar::keyPressEvent(XKeyEvent *ke) { void Toolbar::timeout(void) { checkClock(True); - timeval now; - gettimeofday(&now, 0); - clock_timer->setTimeout((60 - (now.tv_sec % 60)) * 1000); + clock_timer->setTimeout(aMinuteFromNow()); } @@ -1129,30 +1039,50 @@ void Toolbar::HideHandler::timeout(void) { toolbar->hidden = ! toolbar->hidden; if (toolbar->hidden) XMoveWindow(toolbar->display, toolbar->frame.window, - toolbar->frame.x_hidden, toolbar->frame.y_hidden); + toolbar->frame.x_hidden, toolbar->frame.y_hidden); else XMoveWindow(toolbar->display, toolbar->frame.window, - toolbar->frame.x, toolbar->frame.y); + toolbar->frame.rect.x(), toolbar->frame.rect.y()); } -Toolbarmenu::Toolbarmenu(Toolbar &tb) : Basemenu(tb.screen), toolbar(tb) { - setLabel(i18n->getMessage(ToolbarSet, ToolbarToolbarTitle, "Toolbar")); +void Toolbar::toggleAutoHide(void) { + saveAutoHide(! doAutoHide()); + + updateStrut(); + screen->getSlit()->reposition(); + + if (do_auto_hide == False && hidden) { + // force the slit to be visible + if (hide_timer->isTiming()) hide_timer->stop(); + hide_handler.timeout(); + } +} + + +Toolbarmenu::Toolbarmenu(Toolbar *tb) : Basemenu(tb->screen) { + toolbar = tb; + + setLabel(i18n(ToolbarSet, ToolbarToolbarTitle, "Toolbar")); setInternalMenu(); - placementmenu = new Placementmenu(*this); + placementmenu = new Placementmenu(this); - insert(i18n->getMessage(CommonSet, CommonPlacementTitle, "Placement"), - placementmenu); - insert(i18n->getMessage(CommonSet, CommonAlwaysOnTop, "Always on top"), 1); - insert(i18n->getMessage(CommonSet, CommonAutoHide, "Auto hide"), 2); - insert(i18n->getMessage(ToolbarSet, ToolbarEditWkspcName, - "Edit current workspace name"), 3); + insert(i18n(CommonSet, CommonPlacementTitle, "Placement"), + placementmenu); + insert(i18n(CommonSet, CommonAlwaysOnTop, "Always on top"), 1); + insert(i18n(CommonSet, CommonAutoHide, "Auto hide"), 2); + insert(i18n(ToolbarSet, ToolbarEditWkspcName, + "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()); } @@ -1161,7 +1091,7 @@ Toolbarmenu::~Toolbarmenu(void) { } -void Toolbarmenu::itemSelected(int button, int index) { +void Toolbarmenu::itemSelected(int button, unsigned int index) { if (button != 1) return; @@ -1170,27 +1100,22 @@ void Toolbarmenu::itemSelected(int button, int index) { switch (item->function()) { case 1: { // always on top - Bool change = ((toolbar.isOnTop()) ? False : True); - toolbar.on_top = change; - setItemSelected(1, change); + toolbar->saveOnTop(! toolbar->isOnTop()); + setItemSelected(1, toolbar->isOnTop()); - if (toolbar.isOnTop()) toolbar.screen.raiseWindows((Window *) 0, 0); + if (toolbar->isOnTop()) getScreen()->raiseWindows((Window *) 0, 0); break; } case 2: { // auto hide - Bool change = ((toolbar.doAutoHide()) ? False : True); - toolbar.do_auto_hide = change; - setItemSelected(2, change); + toolbar->toggleAutoHide(); + setItemSelected(2, toolbar->doAutoHide()); -#ifdef SLIT - toolbar.screen.getSlit()->reposition(); -#endif // SLIT break; } case 3: { // edit current workspace name - toolbar.edit(); + toolbar->edit(); hide(); break; @@ -1201,55 +1126,111 @@ void Toolbarmenu::itemSelected(int button, int index) { void Toolbarmenu::internal_hide(void) { Basemenu::internal_hide(); - if (toolbar.doAutoHide() && ! toolbar.isEditing()) - toolbar.hide_handler.timeout(); + if (toolbar->doAutoHide() && ! toolbar->isEditing()) + toolbar->hide_handler.timeout(); } void Toolbarmenu::reconfigure(void) { + setValues(); placementmenu->reconfigure(); Basemenu::reconfigure(); } -Toolbarmenu::Placementmenu::Placementmenu(Toolbarmenu &tm) - : Basemenu(tm.toolbar.screen), toolbarmenu(tm) { - setLabel(i18n->getMessage(ToolbarSet, ToolbarToolbarPlacement, - "Toolbar Placement")); +Toolbarmenu::Placementmenu::Placementmenu(Toolbarmenu *tm) + : Basemenu(tm->toolbar->screen), toolbar(tm->toolbar) { + setLabel(i18n(ToolbarSet, ToolbarToolbarPlacement, "Toolbar Placement")); setInternalMenu(); setMinimumSublevels(3); - insert(i18n->getMessage(CommonSet, CommonPlacementTopLeft, - "Top Left"), Toolbar::TopLeft); - insert(i18n->getMessage(CommonSet, CommonPlacementBottomLeft, - "Bottom Left"), Toolbar::BottomLeft); - insert(i18n->getMessage(CommonSet, CommonPlacementTopCenter, - "Top Center"), Toolbar::TopCenter); - insert(i18n->getMessage(CommonSet, CommonPlacementBottomCenter, - "Bottom Center"), Toolbar::BottomCenter); - insert(i18n->getMessage(CommonSet, CommonPlacementTopRight, - "Top Right"), Toolbar::TopRight); - insert(i18n->getMessage(CommonSet, CommonPlacementBottomRight, - "Bottom Right"), Toolbar::BottomRight); + insert(i18n(CommonSet, CommonPlacementTopLeft, "Top Left"), + Toolbar::TopLeft); + insert(i18n(CommonSet, CommonPlacementBottomLeft, "Bottom Left"), + Toolbar::BottomLeft); + insert(i18n(CommonSet, CommonPlacementTopCenter, "Top Center"), + Toolbar::TopCenter); + insert(i18n(CommonSet, CommonPlacementBottomCenter, "Bottom Center"), + Toolbar::BottomCenter); + insert(i18n(CommonSet, CommonPlacementTopRight, "Top Right"), + Toolbar::TopRight); + 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(); } -void Toolbarmenu::Placementmenu::itemSelected(int button, int index) { +void Toolbarmenu::Placementmenu::itemSelected(int button, unsigned int index) { if (button != 1) return; BasemenuItem *item = find(index); if (! item) return; - toolbarmenu.toolbar.screen.saveToolbarPlacement(item->function()); + toolbar->savePlacement(item->function()); hide(); - toolbarmenu.toolbar.reconfigure(); + toolbar->reconfigure(); -#ifdef SLIT // reposition the slit as well to make sure it doesn't intersect the // toolbar - toolbarmenu.toolbar.screen.getSlit()->reposition(); -#endif // SLIT + getScreen()->getSlit()->reposition(); +} + + +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 { + length = font->measureString(string(text, 0, text_len)) + modifier; + } while (length > max_length && text_len-- > 0); + + switch (justify) { + case RightJustify: + start_pos += max_length - length; + break; + + case CenterJustify: + start_pos += (max_length - length) / 2; + break; + + case LeftJustify: + default: + break; + } }