diff -ru blackbox.orig/src/ScreenResource.cc blackbox.patched/src/ScreenResource.cc --- blackbox.orig/src/ScreenResource.cc 2005-04-13 01:54:08.000000000 -0400 +++ blackbox.patched/src/ScreenResource.cc 2006-03-09 09:42:44.281269164 -0500 @@ -170,6 +170,10 @@ sprintf(class_lookup, "Session.screen%u.Toolbar.autoHide", screen); _toolbarOptions.auto_hide = res.read(name_lookup, class_lookup, false); + sprintf(name_lookup, "session.screen%u.toolbar.layout", screen); + sprintf(class_lookup, "Session.screen%u.toolbar.Layout", screen); + _toolbarOptions.layout = res.read(name_lookup, class_lookup, "3W1<1>9T1-1+3C"); + sprintf(name_lookup, "session.screen%u.strftimeFormat", screen); sprintf(class_lookup, "Session.screen%u.StrftimeFormat", screen); _toolbarOptions.strftime_format = Only in blackbox.patched/src: .#ScreenResource.cc.1.13 Only in blackbox.patched/src: ScreenResource.cc.orig diff -ru blackbox.orig/src/ScreenResource.hh blackbox.patched/src/ScreenResource.hh --- blackbox.orig/src/ScreenResource.hh 2005-02-23 01:01:15.000000000 -0500 +++ blackbox.patched/src/ScreenResource.hh 2006-03-09 09:51:07.390124606 -0500 @@ -41,6 +41,7 @@ bool always_on_top, auto_hide; int width_percent; std::string strftime_format; + std::string layout; }; struct SlitOptions { diff -ru blackbox.orig/src/Toolbar.cc blackbox.patched/src/Toolbar.cc --- blackbox.orig/src/Toolbar.cc 2005-04-12 03:38:00.000000000 -0400 +++ blackbox.patched/src/Toolbar.cc 2006-03-09 09:57:30.953377403 -0500 @@ -23,13 +23,13 @@ // DEALINGS IN THE SOFTWARE. #include "Toolbar.hh" +#include "Workspace.hh" #include "Iconmenu.hh" #include "Screen.hh" #include "Slit.hh" #include "Toolbarmenu.hh" #include "Window.hh" #include "Windowmenu.hh" -#include "Workspacemenu.hh" #include #include @@ -40,6 +40,8 @@ #include +#include + long nextTimeout(int resolution) { timeval now; @@ -149,8 +151,9 @@ create_mask, &attrib); blackbox->insertEventHandler(frame.nwbutton, this); - frame.base = frame.slabel = frame.wlabel = frame.clk = frame.button = - frame.pbutton = None; + frame.base = frame.slabel = frame.wlabel = frame.clk = None; + frame.pw_button = frame.pw_button_p = frame.nw_button = frame.nw_button_p = None; + frame.ps_button = frame.ps_button_p = frame.ns_button = frame.ns_button_p = None; _screen->addStrut(&strut); @@ -173,8 +176,14 @@ bt::PixmapCache::release(frame.slabel); bt::PixmapCache::release(frame.wlabel); bt::PixmapCache::release(frame.clk); - bt::PixmapCache::release(frame.button); - bt::PixmapCache::release(frame.pbutton); + bt::PixmapCache::release(frame.pw_button); + bt::PixmapCache::release(frame.pw_button_p); + bt::PixmapCache::release(frame.nw_button); + bt::PixmapCache::release(frame.nw_button_p); + bt::PixmapCache::release(frame.ps_button); + bt::PixmapCache::release(frame.ps_button_p); + bt::PixmapCache::release(frame.ns_button); + bt::PixmapCache::release(frame.ns_button_p); blackbox->removeEventHandler(frame.window); blackbox->removeEventHandler(frame.workspace_label); @@ -200,6 +209,121 @@ } +void Toolbar::calculateElementWidths(unsigned int frameWidth, unsigned int &slabel_rect_w, unsigned int &wlabel_rect_w, unsigned int &clock_rect_w, unsigned int &ps_rect_w, unsigned int &ns_rect_w, unsigned int &pw_rect_w, unsigned int &nw_rect_w){ + ScreenResource &resource = _screen->resource(); + const ToolbarOptions &options = resource.toolbarOptions(); + const ToolbarStyle &style = resource.toolbarStyle(); + unsigned int width=0; + + slabel_rect_w = 0, wlabel_rect_w=0, clock_rect_w=0, ps_rect_w=0, ns_rect_w=0, pw_rect_w=0, nw_rect_w=0; + unsigned int slabel_rect_flex = 0, wlabel_rect_flex=0, clock_rect_flex=0, ps_rect_flex=0, ns_rect_flex=0, pw_rect_flex=0, nw_rect_flex=0; + + + //Parse the format string to set widths. + //The part identifier can have a number in front of it from 0-9 to indicate it's flex. the lower the number, the less space the element gets. + //0 being no space at all. + //1 being default. + int totalVisibleElements=0; + int flex = 1; + for (int i=0; i= '0' && ch <= '9'){ + flex = ch - '0'; + } + else if (ch == 'W' && flex > 0){ + slabel_rect_flex=flex; + totalVisibleElements++; + flex=1; + } + else if (ch == '+' && flex > 0){ + nw_rect_flex=flex; + totalVisibleElements++; + flex=1; + } + else if (ch == '-' && flex > 0){ + pw_rect_flex=flex; + totalVisibleElements++; + flex=1; + } + else if (ch == '<' && flex > 0){ + ps_rect_flex=flex; + totalVisibleElements++; + flex=1; + } + else if (ch == '>' && flex > 0){ + ns_rect_flex=flex; + totalVisibleElements++; + flex=1; + } + else if (ch == 'T' && flex > 0){ + wlabel_rect_flex=flex; + totalVisibleElements++; + flex=1; + } + else if (ch == 'C' && flex > 0){ + clock_rect_flex=flex; + totalVisibleElements++; + flex=1; + } + } + + //Make the lowest flex be 1. + unsigned int minFlex = std::min(std::min(std::min(std::min(std::min(std::min(slabel_rect_flex, wlabel_rect_flex), + clock_rect_flex), + ps_rect_flex), + ns_rect_flex), + pw_rect_flex), + nw_rect_flex); + while (minFlex > 1){ + --slabel_rect_flex; + --nw_rect_flex; + --pw_rect_flex; + --ps_rect_flex; + --ns_rect_flex; + --wlabel_rect_flex; + --clock_rect_flex; + --minFlex; + } + + unsigned int totalWidthUsed=0; + frameWidth -= style.frame_margin*(totalVisibleElements+1); + + while (totalWidthUsed <= frameWidth){ + slabel_rect_w += slabel_rect_flex; + nw_rect_w += nw_rect_flex; + pw_rect_w += pw_rect_flex; + ps_rect_w += ps_rect_flex; + ns_rect_w += ns_rect_flex; + wlabel_rect_w += wlabel_rect_flex; + clock_rect_w += clock_rect_flex; + totalWidthUsed = slabel_rect_w+nw_rect_w+pw_rect_w+ps_rect_w+ns_rect_w+wlabel_rect_w+clock_rect_w; + } + + //Subtract any excess width off the element with the highest flex. + unsigned int *highElement = &ps_rect_w; + unsigned int highFlex = ps_rect_flex; + if (highFlex <= nw_rect_w){ + highElement = &nw_rect_w; + } + if (highFlex <= pw_rect_w){ + highElement = &pw_rect_w; + } + if (highFlex <= ns_rect_w){ + highElement = &ns_rect_w; + } + if (highFlex <= slabel_rect_w){ + highElement = &slabel_rect_w; + } + if (highFlex <= clock_rect_w){ + highElement = &clock_rect_w; + } + if (highFlex <= wlabel_rect_w){ + highElement = &wlabel_rect_w; + } + *highElement -= totalWidthUsed-frameWidth; + +} + void Toolbar::reconfigure(void) { ScreenResource &resource = _screen->resource(); const ToolbarOptions &options = resource.toolbarOptions(); @@ -257,165 +381,174 @@ updateStrut(); - time_t ttmp = time(NULL); - - unsigned int clock_w = 0u, label_w = 0u; - - if (ttmp != -1) { - struct tm *tt = localtime(&ttmp); - if (tt) { - char t[1024]; - int len = strftime(t, 1024, options.strftime_format.c_str(), tt); - if (len == 0) { // invalid time format found - // so use the default - const_cast(options.strftime_format) = "%I:%M %p"; - len = strftime(t, 1024, options.strftime_format.c_str(), 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. - * two 'w' are used to get the widest possible width - */ - clock_w = - bt::textRect(_screen->screenNumber(), style.font, - bt::toUnicode(t)).width() + - bt::textRect(_screen->screenNumber(), style.font, - bt::toUnicode("ww")).width(); - } - } - - for (unsigned int i = 0; i < _screen->workspaceCount(); i++) { - width = - bt::textRect(_screen->screenNumber(), style.font, - _screen->resource().workspaceName(i)).width(); - label_w = std::max(label_w, width); - } - - label_w = clock_w = std::max(label_w, clock_w) + (style.label_margin * 2); - - unsigned int window_label_w = - (frame.rect.width() - (border_width * 2) - - (clock_w + (style.button_width * 4) + label_w - + (style.frame_margin * 8)) - + extra*6); + unsigned int slabel_rect_w = 0, wlabel_rect_w=0, clock_rect_w=0, ps_rect_w=0, ns_rect_w=0, pw_rect_w=0, nw_rect_w=0; + calculateElementWidths(frame.rect.width(), slabel_rect_w, wlabel_rect_w, clock_rect_w, ps_rect_w, ns_rect_w, pw_rect_w, nw_rect_w); XMoveResizeWindow(display, frame.window, frame.rect.x(), hidden ? frame.y_hidden : frame.rect.y(), frame.rect.width(), frame.rect.height()); - // workspace label - frame.slabel_rect.setRect(border_width + style.frame_margin, - border_width + style.frame_margin, - label_w, - style.label_height); - // previous workspace button - frame.ps_rect.setRect(border_width + (style.frame_margin * 2) + label_w - - extra, - border_width + style.frame_margin, - style.button_width, - style.button_width); - // next workspace button - frame.ns_rect.setRect(border_width + (style.frame_margin * 3) - + label_w + style.button_width - (extra * 2), - border_width + style.frame_margin, - style.button_width, - style.button_width); - // window label - frame.wlabel_rect.setRect(border_width + (style.frame_margin * 4) - + (style.button_width * 2) + label_w - (extra * 3), - border_width + style.frame_margin, - window_label_w, - style.label_height); - // previous window button - frame.pw_rect.setRect(border_width + (style.frame_margin * 5) - + (style.button_width * 2) + label_w - + window_label_w - (extra * 4), - border_width + style.frame_margin, - style.button_width, - style.button_width); - // next window button - frame.nw_rect.setRect(border_width + (style.frame_margin * 6) - + (style.button_width * 3) + label_w - + window_label_w - (extra * 5), - border_width + style.frame_margin, - style.button_width, - style.button_width); - // clock - frame.clock_rect.setRect(frame.rect.width() - clock_w - style.frame_margin - - border_width, - border_width + style.frame_margin, - clock_w, - style.label_height); - - XMoveResizeWindow(display, frame.workspace_label, - frame.slabel_rect.x(), frame.slabel_rect.y(), - frame.slabel_rect.width(), frame.slabel_rect.height()); - XMoveResizeWindow(display, frame.psbutton, - frame.ps_rect.x(), frame.ps_rect.y(), - frame.ps_rect.width(), frame.ps_rect.height()); - XMoveResizeWindow(display, frame.nsbutton, - frame.ns_rect.x(), frame.ns_rect.y(), - frame.ns_rect.width(), frame.ns_rect.height()); - XMoveResizeWindow(display, frame.window_label, - frame.wlabel_rect.x(), frame.wlabel_rect.y(), - frame.wlabel_rect.width(), frame.wlabel_rect.height()); - XMoveResizeWindow(display, frame.pwbutton, - frame.pw_rect.x(), frame.pw_rect.y(), - frame.pw_rect.width(), frame.pw_rect.height()); - XMoveResizeWindow(display, frame.nwbutton, - frame.nw_rect.x(), frame.nw_rect.y(), - frame.nw_rect.width(), frame.nw_rect.height()); - XMoveResizeWindow(display, frame.clock, - frame.clock_rect.x(), frame.clock_rect.y(), - frame.clock_rect.width(), frame.clock_rect.height()); - frame.base = - bt::PixmapCache::find(_screen->screenNumber(), style.toolbar, - frame.rect.width(), frame.rect.height(), - frame.base); - frame.slabel = + unsigned int xpos = style.frame_margin; + unsigned int ypos = style.frame_margin; + + + for (unsigned int i=0; i 0) xpos += slabel_rect_w + style.frame_margin; + break; + case '<': //Previous Workspace + frame.ps_rect.setRect(xpos, ypos, + ps_rect_w, style.button_width); + if (ps_rect_w > 0) xpos += ps_rect_w + style.frame_margin; + break; + case '>': //Next Workspace + frame.ns_rect.setRect(xpos, ypos, + ns_rect_w, style.button_width); + if (ns_rect_w > 0) xpos += ns_rect_w + style.frame_margin; + break; + case 'T': //Window Title + frame.wlabel_rect.setRect(xpos, ypos, + wlabel_rect_w, style.label_height); + if (wlabel_rect_w > 0) xpos += wlabel_rect_w + style.frame_margin; + break; + case '-': //Previous Window + frame.pw_rect.setRect(xpos, ypos, + pw_rect_w, style.button_width); + if (pw_rect_w > 0) xpos += pw_rect_w + style.frame_margin; + break; + case '+': //Next Window + frame.nw_rect.setRect(xpos, ypos, + nw_rect_w, style.button_width); + if (nw_rect_w > 0) xpos += nw_rect_w + style.frame_margin; + break; + case 'C': //Clock + frame.clock_rect.setRect(xpos, ypos, + clock_rect_w, style.label_height); + if (clock_rect_w > 0) xpos += clock_rect_w + style.frame_margin; + default: + break; + } + } + + if (frame.slabel_rect.width() > 0){ + XMoveResizeWindow(display, frame.workspace_label, + frame.slabel_rect.x(), frame.slabel_rect.y(), + frame.slabel_rect.width(), frame.slabel_rect.height()); + frame.slabel = bt::PixmapCache::find(_screen->screenNumber(), style.slabel, frame.slabel_rect.width(), frame.slabel_rect.height(), frame.slabel); - frame.wlabel = - bt::PixmapCache::find(_screen->screenNumber(), style.wlabel, + XClearArea(display, frame.workspace_label, 0, 0, + slabel_rect_w, style.label_height, True); + } + + if (frame.ps_rect.width() > 0){ + XMoveResizeWindow(display, frame.psbutton, + frame.ps_rect.x(), frame.ps_rect.y(), + frame.ps_rect.width(), frame.ps_rect.height()); + XClearArea(display, frame.psbutton, 0, 0, + ps_rect_w, style.button_width, True); + frame.ps_button = + bt::PixmapCache::find(_screen->screenNumber(), style.button, + frame.ps_rect.width(), frame.ps_rect.height(), + frame.ps_button); + frame.ps_button_p = + bt::PixmapCache::find(_screen->screenNumber(), + style.pressed, + frame.ps_rect.width(), frame.ps_rect.height(), + frame.ps_button_p); + } + + if (frame.ns_rect.width() > 0){ + XMoveResizeWindow(display, frame.nsbutton, + frame.ns_rect.x(), frame.ns_rect.y(), + frame.ns_rect.width(), frame.ns_rect.height()); + XClearArea(display, frame.nsbutton, 0, 0, + ns_rect_w, style.button_width, True); + frame.ns_button = + bt::PixmapCache::find(_screen->screenNumber(), style.button, + frame.ns_rect.width(), frame.ns_rect.height(), + frame.ns_button); + frame.ns_button_p = + bt::PixmapCache::find(_screen->screenNumber(), + style.pressed, + frame.ns_rect.width(), frame.ns_rect.height(), + frame.ns_button_p); + } + + if (frame.wlabel_rect.width() > 0){ + XMoveResizeWindow(display, frame.window_label, + frame.wlabel_rect.x(), frame.wlabel_rect.y(), + frame.wlabel_rect.width(), frame.wlabel_rect.height()); + frame.wlabel = + bt::PixmapCache::find(_screen->screenNumber(), style.wlabel, frame.wlabel_rect.width(), frame.wlabel_rect.height(), frame.wlabel); - frame.clk = - bt::PixmapCache::find(_screen->screenNumber(), style.clock, - frame.clock_rect.width(), - frame.clock_rect.height(), - frame.clk); - frame.button = - bt::PixmapCache::find(_screen->screenNumber(), style.button, - style.button_width, style.button_width, - frame.button); - frame.pbutton = - bt::PixmapCache::find(_screen->screenNumber(), - style.pressed, - style.button_width, style.button_width, - frame.pbutton); + XClearArea(display, frame.window_label, 0, 0, + wlabel_rect_w, style.label_height, True); + } + + if (frame.pw_rect.width() > 0){ + XMoveResizeWindow(display, frame.pwbutton, + frame.pw_rect.x(), frame.pw_rect.y(), + frame.pw_rect.width(), frame.pw_rect.height()); + XClearArea(display, frame.pwbutton, 0, 0, + pw_rect_w, style.button_width, True); + frame.pw_button = + bt::PixmapCache::find(_screen->screenNumber(), style.button, + frame.pw_rect.width(), frame.pw_rect.height(), + frame.pw_button); + frame.pw_button_p = + bt::PixmapCache::find(_screen->screenNumber(), + style.pressed, + frame.pw_rect.width(), frame.pw_rect.height(), + frame.pw_button_p); + } + + if (frame.nw_rect.width() > 0){ + XMoveResizeWindow(display, frame.nwbutton, + frame.nw_rect.x(), frame.nw_rect.y(), + frame.nw_rect.width(), frame.nw_rect.height()); + XClearArea(display, frame.nwbutton, 0, 0, + nw_rect_w, style.button_width, True); + frame.nw_button = + bt::PixmapCache::find(_screen->screenNumber(), style.button, + frame.nw_rect.width(), frame.nw_rect.height(), + frame.nw_button); + frame.nw_button_p = + bt::PixmapCache::find(_screen->screenNumber(), + style.pressed, + frame.nw_rect.width(), frame.nw_rect.height(), + frame.nw_button_p); + } + + if (frame.clock_rect.width() > 0){ + XMoveResizeWindow(display, frame.clock, + frame.clock_rect.x(), frame.clock_rect.y(), + frame.clock_rect.width(), frame.clock_rect.height()); + + frame.clk = + bt::PixmapCache::find(_screen->screenNumber(), style.clock, + frame.clock_rect.width(), + frame.clock_rect.height(), + frame.clk); + XClearArea(display, frame.clock, 0, 0, + clock_rect_w, style.label_height, True); + } + + frame.base = + bt::PixmapCache::find(_screen->screenNumber(), style.toolbar, + frame.rect.width(), frame.rect.height(), + frame.base); XClearArea(display, frame.window, 0, 0, frame.rect.width(), frame.rect.height(), True); - - XClearArea(display, frame.workspace_label, 0, 0, - label_w, style.label_height, True); - XClearArea(display, frame.window_label, 0, 0, - window_label_w, style.label_height, True); - XClearArea(display, frame.clock, 0, 0, - clock_w, style.label_height, True); - - XClearArea(display, frame.psbutton, 0, 0, - style.button_width, style.button_width, True); - XClearArea(display, frame.nsbutton, 0, 0, - style.button_width, style.button_width, True); - XClearArea(display, frame.pwbutton, 0, 0, - style.button_width, style.button_width, True); - XClearArea(display, frame.nwbutton, 0, 0, - style.button_width, style.button_width, True); } @@ -441,57 +574,62 @@ const ToolbarOptions &options = _screen->resource().toolbarOptions(); const ToolbarStyle &style = _screen->resource().toolbarStyle(); - bt::Rect u(0, 0, frame.clock_rect.width(), frame.clock_rect.height()); - if (frame.clk == ParentRelative) { - bt::Rect t(-frame.clock_rect.x(), -frame.clock_rect.y(), - frame.rect.width(), frame.rect.height()); - bt::drawTexture(_screen->screenNumber(), style.toolbar, - frame.clock, t, u, frame.base); - } else { - bt::drawTexture(_screen->screenNumber(), style.clock, - frame.clock, u, u, frame.clk); - } + if (options.layout.find('C') != std::string::npos){ + bt::Rect u(0, 0, frame.clock_rect.width(), frame.clock_rect.height()); + if (frame.clk == ParentRelative) { + bt::Rect t(-frame.clock_rect.x(), -frame.clock_rect.y(), + frame.rect.width(), frame.rect.height()); + bt::drawTexture(_screen->screenNumber(), style.toolbar, + frame.clock, t, u, frame.base); + } else { + bt::drawTexture(_screen->screenNumber(), style.clock, + frame.clock, u, u, frame.clk); + } - time_t tmp = 0; - struct tm *tt = 0; - char str[1024]; - if ((tmp = time(NULL)) == -1) - return; // should not happen - tt = localtime(&tmp); - if (! tt) - return; // ditto - if (! strftime(str, sizeof(str), options.strftime_format.c_str(), tt)) - return; // ditto - - bt::Pen pen(_screen->screenNumber(), style.clock_text); - bt::drawText(style.font, pen, frame.clock, u, style.alignment, - bt::toUnicode(str)); + time_t tmp = 0; + struct tm *tt = 0; + char str[1024]; + if ((tmp = time(NULL)) == -1) + return; // should not happen + tt = localtime(&tmp); + if (! tt) + return; // ditto + if (! strftime(str, sizeof(str), options.strftime_format.c_str(), tt)) + return; // ditto + + bt::Pen pen(_screen->screenNumber(), style.clock_text); + bt::drawText(style.font, pen, frame.clock, u, style.alignment, + bt::toUnicode(str)); + } } void Toolbar::redrawWindowLabel(void) { const ToolbarStyle &style = _screen->resource().toolbarStyle(); + const ToolbarOptions &options = _screen->resource().toolbarOptions(); - bt::Rect u(0, 0, frame.wlabel_rect.width(), frame.wlabel_rect.height()); - if (frame.wlabel == ParentRelative) { - bt::Rect t(-frame.wlabel_rect.x(), -frame.wlabel_rect.y(), - frame.rect.width(), frame.rect.height()); - bt::drawTexture(_screen->screenNumber(), style.toolbar, - frame.window_label, t, u, frame.base); - } else { - bt::drawTexture(_screen->screenNumber(), style.wlabel, - frame.window_label, u, u, frame.wlabel); - } - - BlackboxWindow *foc = _screen->blackbox()->focusedWindow(); - if (! foc || foc->screen() != _screen) - return; + if (options.layout.find('T') != std::string::npos){ + bt::Rect u(0, 0, frame.wlabel_rect.width(), frame.wlabel_rect.height()); + if (frame.wlabel == ParentRelative) { + bt::Rect t(-frame.wlabel_rect.x(), -frame.wlabel_rect.y(), + frame.rect.width(), frame.rect.height()); + bt::drawTexture(_screen->screenNumber(), style.toolbar, + frame.window_label, t, u, frame.base); + } else { + bt::drawTexture(_screen->screenNumber(), style.wlabel, + frame.window_label, u, u, frame.wlabel); + } - bt::Pen pen(_screen->screenNumber(), style.wlabel_text); - bt::drawText(style.font, pen, frame.window_label, u, - style.alignment, - bt::ellideText(foc->title(), u.width(), bt::toUnicode("..."), - _screen->screenNumber(), style.font)); + BlackboxWindow *foc = _screen->blackbox()->focusedWindow(); + if (! foc || foc->screen() != _screen) + return; + + bt::Pen pen(_screen->screenNumber(), style.wlabel_text); + bt::drawText(style.font, pen, frame.window_label, u, + style.alignment, + bt::ellideText(foc->title(), u.width(), bt::toUnicode("..."), + _screen->screenNumber(), style.font)); + } } @@ -500,66 +638,76 @@ _screen->resource().workspaceName(_screen->currentWorkspace()); const ToolbarStyle &style = _screen->resource().toolbarStyle(); - bt::Rect u(0, 0, frame.slabel_rect.width(), frame.slabel_rect.height()); - if (frame.slabel == ParentRelative) { - bt::Rect t(-frame.slabel_rect.x(), -frame.slabel_rect.y(), - frame.rect.width(), frame.rect.height()); - bt::drawTexture(_screen->screenNumber(), style.toolbar, - frame.workspace_label, t, u, frame.base); - } else { - bt::drawTexture(_screen->screenNumber(), style.slabel, - frame.workspace_label, u, u, frame.slabel); - } + const ToolbarOptions &options = _screen->resource().toolbarOptions(); + + if (options.layout.find('W') != std::string::npos){ + bt::Rect u(0, 0, frame.slabel_rect.width(), frame.slabel_rect.height()); + if (frame.slabel == ParentRelative) { + bt::Rect t(-frame.slabel_rect.x(), -frame.slabel_rect.y(), + frame.rect.width(), frame.rect.height()); + bt::drawTexture(_screen->screenNumber(), style.toolbar, + frame.workspace_label, t, u, frame.base); + } else { + bt::drawTexture(_screen->screenNumber(), style.slabel, + frame.workspace_label, u, u, frame.slabel); + } - bt::Pen pen(_screen->screenNumber(), style.slabel_text); - bt::drawText(style.font, pen, frame.workspace_label, u, - style.alignment, name); + bt::Pen pen(_screen->screenNumber(), style.slabel_text); + bt::drawText(style.font, pen, frame.workspace_label, u, + style.alignment, name); + } } void Toolbar::redrawPrevWorkspaceButton(bool pressed) { const ToolbarStyle &style = _screen->resource().toolbarStyle(); + const ToolbarOptions &options = _screen->resource().toolbarOptions(); - Pixmap p = pressed ? frame.pbutton : frame.button; - bt::Rect u(0, 0, style.button_width, style.button_width); - if (p == ParentRelative) { - bt::Rect t(-frame.ps_rect.x(), -frame.ps_rect.y(), - frame.rect.width(), frame.rect.height()); - bt::drawTexture(_screen->screenNumber(), style.toolbar, - frame.psbutton, t, u, frame.base); - } else { - bt::drawTexture(_screen->screenNumber(), - pressed ? style.pressed : style.button, - frame.psbutton, u, u, p); - } + if (options.layout.find('<') != std::string::npos){ + Pixmap p = pressed ? frame.ps_button_p : frame.ps_button; + bt::Rect u(0, 0, frame.ps_rect.width(), frame.ps_rect.height()); + if (p == ParentRelative) { + bt::Rect t(-frame.ps_rect.x(), -frame.ps_rect.y(), + frame.rect.width(), frame.rect.height()); + bt::drawTexture(_screen->screenNumber(), style.toolbar, + frame.psbutton, t, u, frame.base); + } else { + bt::drawTexture(_screen->screenNumber(), + pressed ? style.pressed : style.button, + frame.psbutton, u, u, p); + } - const bt::Pen pen(_screen->screenNumber(), style.foreground); - bt::drawBitmap(bt::Bitmap::leftArrow(_screen->screenNumber()), - pen, frame.psbutton, u); + const bt::Pen pen(_screen->screenNumber(), style.foreground); + bt::drawBitmap(bt::Bitmap::leftArrow(_screen->screenNumber()), + pen, frame.psbutton, u); + } } void Toolbar::redrawNextWorkspaceButton(bool pressed) { const ToolbarStyle &style = _screen->resource().toolbarStyle(); + const ToolbarOptions &options = _screen->resource().toolbarOptions(); - Pixmap p = pressed ? frame.pbutton : frame.button; - bt::Rect u(0, 0, style.button_width, style.button_width); - if (p == ParentRelative) { - bt::Rect t(-frame.ns_rect.x(), -frame.ns_rect.y(), - frame.rect.width(), frame.rect.height()); - bt::drawTexture(_screen->screenNumber(), style.toolbar, - frame.nsbutton, t, u, frame.base); - } else { - bt::drawTexture(_screen->screenNumber(), - pressed ? style.pressed : style.button, - frame.nsbutton, u, u, p); - } + if (options.layout.find('>') != std::string::npos){ + Pixmap p = pressed ? frame.ns_button_p : frame.ns_button; + bt::Rect u(0, 0, frame.ns_rect.width(), frame.ns_rect.height()); + if (p == ParentRelative) { + bt::Rect t(-frame.ns_rect.x(), -frame.ns_rect.y(), + frame.rect.width(), frame.rect.height()); + bt::drawTexture(_screen->screenNumber(), style.toolbar, + frame.nsbutton, t, u, frame.base); + } else { + bt::drawTexture(_screen->screenNumber(), + pressed ? style.pressed : style.button, + frame.nsbutton, u, u, p); + } - const bt::Pen pen(_screen->screenNumber(), style.foreground); - bt::drawBitmap(bt::Bitmap::rightArrow(_screen->screenNumber()), - pen, frame.nsbutton, u); + const bt::Pen pen(_screen->screenNumber(), style.foreground); + bt::drawBitmap(bt::Bitmap::rightArrow(_screen->screenNumber()), + pen, frame.nsbutton, u); + } } @@ -567,22 +715,26 @@ const ToolbarStyle &style = _screen->resource().toolbarStyle(); - Pixmap p = pressed ? frame.pbutton : frame.button; - bt::Rect u(0, 0, style.button_width, style.button_width); - if (p == ParentRelative) { - bt::Rect t(-frame.pw_rect.x(), -frame.pw_rect.y(), - frame.rect.width(), frame.rect.height()); - bt::drawTexture(_screen->screenNumber(), style.toolbar, - frame.pwbutton, t, u, frame.base); - } else { - bt::drawTexture(_screen->screenNumber(), - pressed ? style.pressed : style.button, - frame.pwbutton, u, u, p); - } + const ToolbarOptions &options = _screen->resource().toolbarOptions(); - const bt::Pen pen(_screen->screenNumber(), style.foreground); - bt::drawBitmap(bt::Bitmap::leftArrow(_screen->screenNumber()), - pen, frame.pwbutton, u); + if (options.layout.find('-') != std::string::npos){ + Pixmap p = pressed ? frame.pw_button_p : frame.pw_button; + bt::Rect u(0, 0, frame.pw_rect.width(), frame.pw_rect.height()); + if (p == ParentRelative) { + bt::Rect t(-frame.pw_rect.x(), -frame.pw_rect.y(), + frame.rect.width(), frame.rect.height()); + bt::drawTexture(_screen->screenNumber(), style.toolbar, + frame.pwbutton, t, u, frame.base); + } else { + bt::drawTexture(_screen->screenNumber(), + pressed ? style.pressed : style.button, + frame.pwbutton, u, u, p); + } + + const bt::Pen pen(_screen->screenNumber(), style.foreground); + bt::drawBitmap(bt::Bitmap::leftArrow(_screen->screenNumber()), + pen, frame.pwbutton, u); + } } @@ -590,25 +742,30 @@ const ToolbarStyle &style = _screen->resource().toolbarStyle(); - Pixmap p = pressed ? frame.pbutton : frame.button; - bt::Rect u(0, 0, style.button_width, style.button_width); - if (p == ParentRelative) { - bt::Rect t(-frame.nw_rect.x(), -frame.nw_rect.y(), - frame.rect.width(), frame.rect.height()); - bt::drawTexture(_screen->screenNumber(), style.toolbar, - frame.nwbutton, t, u, frame.base); - } else { - bt::drawTexture(_screen->screenNumber(), - pressed ? style.pressed : style.button, - frame.nwbutton, u, u, p); - } + const ToolbarOptions &options = _screen->resource().toolbarOptions(); + + if (options.layout.find('+') != std::string::npos){ + Pixmap p = pressed ? frame.nw_button_p : frame.nw_button; + bt::Rect u(0, 0, frame.nw_rect.width(), frame.nw_rect.height()); + if (p == ParentRelative) { + bt::Rect t(-frame.nw_rect.x(), -frame.nw_rect.y(), + frame.rect.width(), frame.rect.height()); + bt::drawTexture(_screen->screenNumber(), style.toolbar, + frame.nwbutton, t, u, frame.base); + } else { + bt::drawTexture(_screen->screenNumber(), + pressed ? style.pressed : style.button, + frame.nwbutton, u, u, p); + } - const bt::Pen pen(_screen->screenNumber(), style.foreground); - bt::drawBitmap(bt::Bitmap::rightArrow(_screen->screenNumber()), - pen, frame.nwbutton, u); + const bt::Pen pen(_screen->screenNumber(), style.foreground); + bt::drawBitmap(bt::Bitmap::rightArrow(_screen->screenNumber()), + pen, frame.nwbutton, u); + } } + void Toolbar::buttonPressEvent(const XButtonEvent * const event) { if (event->state == Mod1Mask) { if (event->button == 1) @@ -631,6 +788,7 @@ } if (event->window == frame.window_label) { + printf("Window label was clicked w/ button %d\n", event->button); BlackboxWindow *focus = blackbox->focusedWindow(); if (focus && focus->screen() == _screen) { if (event->button == 2) { @@ -690,27 +848,27 @@ redrawPrevWorkspaceButton(False); if (bt::within(event->x, event->y, - style.button_width, style.button_width)) { + frame.ps_rect.width(), frame.ps_rect.height())) { _screen->prevWorkspace(); } } else if (event->window == frame.nsbutton) { redrawNextWorkspaceButton(False); if (bt::within(event->x, event->y, - style.button_width, style.button_width)) { + frame.ns_rect.width(), frame.ns_rect.height())) { _screen->nextWorkspace(); } } else if (event->window == frame.pwbutton) { redrawPrevWindowButton(False); if (bt::within(event->x, event->y, - style.button_width, style.button_width)) + frame.pw_rect.width(), frame.pw_rect.height())) _screen->prevFocus(); } else if (event->window == frame.nwbutton) { redrawNextWindowButton(False); if (bt::within(event->x, event->y, - style.button_width, style.button_width)) + frame.nw_rect.width(), frame.nw_rect.height())) _screen->nextFocus(); } else if (event->window == frame.window_label) _screen->raiseFocus(); diff -ru blackbox.orig/src/Toolbar.hh blackbox.patched/src/Toolbar.hh --- blackbox.orig/src/Toolbar.hh 2005-01-04 07:58:34.000000000 -0500 +++ blackbox.patched/src/Toolbar.hh 2006-03-09 09:42:44.280269828 -0500 @@ -39,7 +39,11 @@ struct ToolbarFrame { unsigned long button_pixel, pbutton_pixel; - Pixmap base, slabel, wlabel, clk, button, pbutton; + Pixmap base, slabel, wlabel, clk; + Pixmap pw_button, pw_button_p; + Pixmap nw_button, nw_button_p; + Pixmap ps_button, ps_button_p; + Pixmap ns_button, ns_button_p; Window window, workspace_label, window_label, clock, psbutton, nsbutton, pwbutton, nwbutton; @@ -58,6 +62,7 @@ std::string new_workspace_name; size_t new_name_pos; + void Toolbar::calculateElementWidths(unsigned int frameWidth, unsigned int &slabel_rect_w, unsigned int &wlabel_rect_w, unsigned int &clock_rect_w, unsigned int &ps_rect_w, unsigned int &ns_rect_w, unsigned int &pw_rect_w, unsigned int &nw_rect_w); void redrawPrevWorkspaceButton(bool pressed = False); void redrawNextWorkspaceButton(bool pressed = False); void redrawPrevWindowButton(bool preseed = False);