X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FToolbar.cc;h=12f778eba542523c8ebc4304e9e0bced9553ab9a;hb=18499a6920309d6ddfe70767f8a90e2778a96ba7;hp=9f7c3b8098be9c209dfc8d90fa8e3dc04377646c;hpb=509c88f501aaf4c54b236070dfeb00595fa4d4a8;p=chaz%2Fopenbox diff --git a/src/Toolbar.cc b/src/Toolbar.cc index 9f7c3b80..12f778eb 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc @@ -62,8 +62,14 @@ # endif // HAVE_SYS_TIME_H #endif // TIME_WITH_SYS_TIME +#include +#include + +Toolbar::Toolbar(BScreen &scrn, Resource &conf) : screen(scrn), + openbox(scrn.getOpenbox()), config(conf) +{ + load(); -Toolbar::Toolbar(BScreen &scrn) : screen(scrn), openbox(scrn.getOpenbox()) { // get the clock updating every minute clock_timer = new BTimer(openbox, *this); timeval now; @@ -78,10 +84,7 @@ Toolbar::Toolbar(BScreen &scrn) : screen(scrn), openbox(scrn.getOpenbox()) { image_ctrl = screen.getImageControl(); - on_top = screen.isToolbarOnTop(); - hidden = do_auto_hide = screen.doToolbarAutoHide(); - - editing = False; + m_editing = False; new_workspace_name = (char *) 0; new_name_pos = 0; frame.grab_x = frame.grab_y = 0; @@ -148,15 +151,40 @@ Toolbar::Toolbar(BScreen &scrn) : screen(scrn), openbox(scrn.getOpenbox()) { frame.pbutton = None; reconfigure(); + mapToolbar(); +} + +int Toolbar::getX() const { + return ((m_hidden) ? frame.x_hidden : frame.x); +} - XMapSubwindows(display, frame.window); - XMapWindow(display, frame.window); +int Toolbar::getY() const { + if (screen.hideToolbar()) return screen.size().h(); + else if (m_hidden) return frame.y_hidden; + else return frame.y; } +unsigned int Toolbar::getExposedHeight() const { + if (screen.hideToolbar()) return 0; + else if (m_autohide) return frame.bevel_w; + else return frame.height; +} + +void Toolbar::mapToolbar(){ + if (!screen.hideToolbar()) { + //not hidden, so windows should not maximize over the toolbar + XMapSubwindows(display, frame.window); + XMapWindow(display, frame.window); + } +} -Toolbar::~Toolbar(void) { +void Toolbar::unMapToolbar(){ + //hidden so we can maximize over the toolbar XUnmapWindow(display, frame.window); +} +Toolbar::~Toolbar() { + unMapToolbar(); if (frame.base) image_ctrl->removeImage(frame.base); if (frame.label) image_ctrl->removeImage(frame.label); if (frame.wlabel) image_ctrl->removeImage(frame.wlabel); @@ -185,9 +213,114 @@ Toolbar::~Toolbar(void) { } -void Toolbar::reconfigure(void) { +void Toolbar::setOnTop(bool b) { + m_ontop = b; + std::ostrstream s; + s << "session.screen" << screen.getScreenNumber() << ".toolbar.onTop" << ends; + config.setValue(s.str(), m_ontop ? "True" : "False"); + s.rdbuf()->freeze(0); +} + +void Toolbar::setAutoHide(bool b) { + m_autohide = b; + std::ostrstream s; + s << "session.screen" << screen.getScreenNumber() << ".toolbar.autoHide" << + ends; + config.setValue(s.str(), m_autohide ? "True" : "False"); + s.rdbuf()->freeze(0); +} + +void Toolbar::setWidthPercent(int w) { + m_width_percent = w; + std::ostrstream s; + s << "session.screen" << screen.getScreenNumber() << ".toolbar.widthPercent" + << ends; + config.setValue(s.str(), m_width_percent); + s.rdbuf()->freeze(0); +} + +void Toolbar::setPlacement(int p) { + m_placement = p; + std::ostrstream s; + s << "session.screen" << screen.getScreenNumber() << ".toolbar.placement" << + ends; + const char *placement; + switch (m_placement) { + case TopLeft: placement = "TopLeft"; break; + case BottomLeft: placement = "BottomLeft"; break; + case TopCenter: placement = "TopCenter"; break; + case TopRight: placement = "TopRight"; break; + case BottomRight: placement = "BottomRight"; break; + case BottomCenter: default: placement = "BottomCenter"; break; + } + config.setValue(s.str(), placement); + s.rdbuf()->freeze(0); +} + +void Toolbar::save() { + setOnTop(m_ontop); + setAutoHide(m_autohide); + setWidthPercent(m_width_percent); + setPlacement(m_placement); +} + +void Toolbar::load() { + std::ostrstream rscreen, rname, rclass; + std::string s; + bool b; + long l; + rscreen << "session.screen" << screen.getScreenNumber() << '.' << ends; + + rname << rscreen.str() << "toolbar.widthPercent" << ends; + rclass << rscreen.str() << "Toolbar.WidthPercent" << ends; + if (config.getValue(rname.str(), rclass.str(), l) && (l > 0 && l <= 100)) + m_width_percent = l; + else + m_width_percent =66; + + rname.seekp(0); rclass.seekp(0); + rname << rscreen.str() << "toolbar.placement" << ends; + rclass << rscreen.str() << "Toolbar.Placement" << ends; + if (config.getValue(rname.str(), rclass.str(), s)) { + if (0 == strncasecmp(s.c_str(), "TopLeft", s.length())) + m_placement = TopLeft; + else if (0 == strncasecmp(s.c_str(), "BottomLeft", s.length())) + m_placement = BottomLeft; + else if (0 == strncasecmp(s.c_str(), "TopCenter", s.length())) + m_placement = TopCenter; + else if (0 == strncasecmp(s.c_str(), "TopRight", s.length())) + m_placement = TopRight; + else if ( 0 == strncasecmp(s.c_str(), "BottomRight", s.length())) + m_placement = BottomRight; + else if ( 0 == strncasecmp(s.c_str(), "BottomCenter", s.length())) + m_placement = BottomCenter; + } else + m_placement = BottomCenter; + + rname.seekp(0); rclass.seekp(0); + rname << rscreen.str() << "toolbar.onTop" << ends; + rclass << rscreen.str() << "Toolbar.OnTop" << ends; + if (config.getValue(rname.str(), rclass.str(), b)) + m_ontop = b; + else + m_ontop = false; + + rname.seekp(0); rclass.seekp(0); + rname << rscreen.str() << "toolbar.autoHide" << ends; + rclass << rscreen.str() << "Toolbar.AutoHide" << ends; + if (config.getValue(rname.str(), rclass.str(), b)) + m_hidden = m_autohide = b; + else + m_hidden = m_autohide = false; + + rscreen.rdbuf()->freeze(0); + rname.rdbuf()->freeze(0); + rclass.rdbuf()->freeze(0); +} + +void Toolbar::reconfigure() { frame.bevel_w = screen.getBevelWidth(); - frame.width = screen.size().w() * screen.getToolbarWidthPercent() / 100; + frame.width = screen.size().w() * m_width_percent / 100; if (i18n->multibyte()) frame.height = @@ -200,7 +333,7 @@ void Toolbar::reconfigure(void) { frame.label_h = frame.height; frame.height += (frame.bevel_w * 2); - switch (screen.getToolbarPlacement()) { + switch (m_placement) { case TopLeft: frame.x = 0; frame.y = 0; @@ -264,7 +397,7 @@ void Toolbar::reconfigure(void) { tt = localtime(&ttmp); if (tt) { char t[1025], *time_string = (char *) 0; - int len = strftime(t, 1024, screen.getStrftimeFormat(), tt); + int len = strftime(t, 1024, screen.strftimeFormat(), tt); t[len++-1] = ' '; // add a space to the string for padding t[len] = '\0'; @@ -339,7 +472,7 @@ void Toolbar::reconfigure(void) { (frame.width - (frame.clock_w + (frame.button_w * 4) + frame.workspace_label_w + (frame.bevel_w * 8) + 6)); - if (hidden) { + if (m_hidden) { XMoveResizeWindow(display, frame.window, frame.x_hidden, frame.y_hidden, frame.width, frame.height); } else { @@ -467,7 +600,7 @@ void Toolbar::reconfigure(void) { XClearWindow(display, frame.nsbutton); XClearWindow(display, frame.pwbutton); XClearWindow(display, frame.nwbutton); - + redrawWindowLabel(); redrawWorkspaceLabel(); redrawPrevWorkspaceButton(); @@ -475,7 +608,7 @@ void Toolbar::reconfigure(void) { redrawPrevWindowButton(); redrawNextWindowButton(); checkClock(True); - + toolbarmenu->reconfigure(); } @@ -501,7 +634,7 @@ 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.strftimeFormat(), tt)) return; #else // !HAVE_STRFTIME char t[9]; @@ -825,17 +958,17 @@ void Toolbar::redrawNextWindowButton(Bool pressed, Bool redraw) { } -void Toolbar::edit(void) { +void Toolbar::edit() { Window window; int foo; - editing = True; + m_editing = True; if (XGetInputFocus(display, &window, &foo) && window == frame.workspace_label) return; XSetInputFocus(display, frame.workspace_label, - ((screen.isSloppyFocus()) ? RevertToPointerRoot : + ((screen.sloppyFocus()) ? RevertToPointerRoot : RevertToParent), CurrentTime); XClearWindow(display, frame.workspace_label); @@ -881,11 +1014,11 @@ void Toolbar::buttonPressEvent(XButtonEvent *be) { checkClock(True, True); } #endif // HAVE_STRFTIME - else if (! on_top) { + else if (! m_ontop) { Window w[1] = { frame.window }; screen.raiseWindows(w, 1); } - } else if (be->button == 2 && (! on_top)) { + } else if (be->button == 2 && (! m_ontop)) { XLowerWindow(display, frame.window); } else if (be->button == 3) { if (! toolbarmenu->isVisible()) { @@ -961,10 +1094,10 @@ void Toolbar::buttonReleaseEvent(XButtonEvent *re) { void Toolbar::enterNotifyEvent(XCrossingEvent *) { - if (! do_auto_hide) + if (! m_autohide) return; - if (hidden) { + if (m_hidden) { if (! hide_timer->isTiming()) hide_timer->start(); } else { if (hide_timer->isTiming()) hide_timer->stop(); @@ -972,10 +1105,10 @@ void Toolbar::enterNotifyEvent(XCrossingEvent *) { } void Toolbar::leaveNotifyEvent(XCrossingEvent *) { - if (! do_auto_hide) + if (! m_autohide) return; - if (hidden) { + if (m_hidden) { if (hide_timer->isTiming()) hide_timer->stop(); } else if (! toolbarmenu->isVisible()) { if (! hide_timer->isTiming()) hide_timer->start(); @@ -985,7 +1118,7 @@ void Toolbar::leaveNotifyEvent(XCrossingEvent *) { void Toolbar::exposeEvent(XExposeEvent *ee) { if (ee->window == frame.clock) checkClock(True); - else if (ee->window == frame.workspace_label && (! editing)) + else if (ee->window == frame.workspace_label && (! m_editing)) redrawWorkspaceLabel(); else if (ee->window == frame.window_label) redrawWindowLabel(); else if (ee->window == frame.psbutton) redrawPrevWorkspaceButton(); @@ -996,7 +1129,7 @@ void Toolbar::exposeEvent(XExposeEvent *ee) { void Toolbar::keyPressEvent(XKeyEvent *ke) { - if (ke->window == frame.workspace_label && editing) { + if (ke->window == frame.workspace_label && m_editing) { openbox.grab(); if (! new_workspace_name) { @@ -1014,7 +1147,7 @@ void Toolbar::keyPressEvent(XKeyEvent *ke) { if (ks == XK_Return || new_name_pos == 127) { *(new_workspace_name + new_name_pos) = 0; - editing = False; + m_editing = False; openbox.setNoFocus(False); if (openbox.getFocusedWindow()) { @@ -1115,7 +1248,7 @@ void Toolbar::keyPressEvent(XKeyEvent *ke) { } -void Toolbar::timeout(void) { +void Toolbar::timeout() { checkClock(True); timeval now; @@ -1124,9 +1257,9 @@ void Toolbar::timeout(void) { } -void Toolbar::HideHandler::timeout(void) { - toolbar->hidden = ! toolbar->hidden; - if (toolbar->hidden) +void Toolbar::HideHandler::timeout() { + toolbar->m_hidden = !toolbar->m_hidden; + if (toolbar->m_hidden) XMoveWindow(toolbar->display, toolbar->frame.window, toolbar->frame.x_hidden, toolbar->frame.y_hidden); else @@ -1149,13 +1282,17 @@ Toolbarmenu::Toolbarmenu(Toolbar &tb) : Basemenu(tb.screen), toolbar(tb) { "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.onTop()); + setItemSelected(2, toolbar.autoHide()); } -Toolbarmenu::~Toolbarmenu(void) { +Toolbarmenu::~Toolbarmenu() { delete placementmenu; } @@ -1169,17 +1306,17 @@ 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; + Bool change = ((toolbar.onTop()) ? False : True); + toolbar.setOnTop(change); setItemSelected(1, change); - if (toolbar.isOnTop()) toolbar.screen.raiseWindows((Window *) 0, 0); + if (toolbar.onTop()) toolbar.screen.raiseWindows((Window *) 0, 0); break; } case 2: { // auto hide - Bool change = ((toolbar.doAutoHide()) ? False : True); - toolbar.do_auto_hide = change; + Bool change = ((toolbar.autoHide()) ? False : True); + toolbar.setAutoHide(change); setItemSelected(2, change); #ifdef SLIT @@ -1198,14 +1335,15 @@ void Toolbarmenu::itemSelected(int button, int index) { } -void Toolbarmenu::internal_hide(void) { +void Toolbarmenu::internal_hide() { Basemenu::internal_hide(); - if (toolbar.doAutoHide() && ! toolbar.isEditing()) + if (toolbar.autoHide() && ! toolbar.isEditing()) toolbar.hide_handler.timeout(); } -void Toolbarmenu::reconfigure(void) { +void Toolbarmenu::reconfigure() { + setValues(); placementmenu->reconfigure(); Basemenu::reconfigure(); @@ -1234,7 +1372,6 @@ Toolbarmenu::Placementmenu::Placementmenu(Toolbarmenu &tm) update(); } - void Toolbarmenu::Placementmenu::itemSelected(int button, int index) { if (button != 1) return; @@ -1242,7 +1379,7 @@ void Toolbarmenu::Placementmenu::itemSelected(int button, int index) { BasemenuItem *item = find(index); if (! item) return; - toolbarmenu.toolbar.screen.saveToolbarPlacement(item->function()); + toolbarmenu.toolbar.setPlacement(item->function()); hide(); toolbarmenu.toolbar.reconfigure();