]> Dogcows Code - chaz/openbox/blobdiff - src/Toolbar.cc
*** empty log message ***
[chaz/openbox] / src / Toolbar.cc
index 01e210fc376f47350e8ad92432927e76b4825fac..8a3ea6b2828acea09a5d0cbd2394fcc9a9e01513 100644 (file)
 #include "Workspace.h"
 #include "Workspacemenu.h"
 
-#include <X11/Xutil.h>
 #include <X11/keysym.h>
 
-#ifdef    STDC_HEADERS
+#ifdef    HAVE_STRING_H
 #  include <string.h>
-#endif // STDC_HEADERS
+#endif // HAVE_STRING_H
 
 #ifdef    HAVE_STDIO_H
 #  include <stdio.h>
 # endif // HAVE_SYS_TIME_H
 #endif // TIME_WITH_SYS_TIME
 
+#include <strstream>
+#include <string>
+using std::ends;
+
+Toolbar::Toolbar(BScreen &scrn, Resource &conf) : openbox(scrn.getOpenbox()),
+  screen(scrn), 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;
@@ -79,10 +85,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;
@@ -149,15 +152,39 @@ Toolbar::Toolbar(BScreen &scrn) : screen(scrn), openbox(scrn.getOpenbox()) {
     frame.pbutton = None;
 
   reconfigure();
+  mapToolbar();
+}
+
+Rect Toolbar::area() const {
+  int x = ((m_hidden) ? frame.x_hidden : frame.x);
+  int y;
+  if (screen.hideToolbar()) y = screen.size().h();
+  else if (m_hidden) y = frame.y_hidden;
+  else y = frame.y;
+  return Rect(x, y, frame.width, frame.height);
+}
 
-  XMapSubwindows(display, frame.window);
-  XMapWindow(display, frame.window);
+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);
@@ -186,9 +213,116 @@ 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.rdbuf()->freeze(0); rclass.rdbuf()->freeze(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.rdbuf()->freeze(0); rclass.rdbuf()->freeze(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.rdbuf()->freeze(0); rclass.rdbuf()->freeze(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.getWidth() * screen.getToolbarWidthPercent() / 100;
+  frame.width = screen.size().w() * m_width_percent / 100;
   
   if (i18n->multibyte())
     frame.height =
@@ -201,7 +335,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;
@@ -212,15 +346,15 @@ void Toolbar::reconfigure(void) {
 
   case BottomLeft:
     frame.x = 0;
-    frame.y = screen.getHeight() - frame.height
+    frame.y = screen.size().h() - frame.height
       - (screen.getBorderWidth() * 2);
     frame.x_hidden = 0;
-    frame.y_hidden = screen.getHeight() - screen.getBevelWidth()
+    frame.y_hidden = screen.size().h() - screen.getBevelWidth()
                      - screen.getBorderWidth();
     break;
 
   case TopCenter:
-    frame.x = (screen.getWidth() - frame.width) / 2;
+    frame.x = (screen.size().w() - frame.width) / 2;
     frame.y = 0;
     frame.x_hidden = frame.x;
     frame.y_hidden = screen.getBevelWidth() - screen.getBorderWidth()
@@ -229,16 +363,16 @@ void Toolbar::reconfigure(void) {
 
   case BottomCenter:
   default:
-    frame.x = (screen.getWidth() - frame.width) / 2;
-    frame.y = screen.getHeight() - frame.height
+    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.getHeight() - screen.getBevelWidth()
+    frame.y_hidden = screen.size().h() - screen.getBevelWidth()
                      - screen.getBorderWidth();
     break;
 
   case TopRight:
-    frame.x = screen.getWidth() - frame.width
+    frame.x = screen.size().w() - frame.width
       - (screen.getBorderWidth() * 2);
     frame.y = 0;
     frame.x_hidden = frame.x;
@@ -247,12 +381,12 @@ void Toolbar::reconfigure(void) {
     break;
 
   case BottomRight:
-    frame.x = screen.getWidth() - frame.width
+    frame.x = screen.size().w() - frame.width
       - (screen.getBorderWidth() * 2);
-    frame.y = screen.getHeight() - frame.height
+    frame.y = screen.size().h() - frame.height
       - (screen.getBorderWidth() * 2);
     frame.x_hidden = frame.x;
-    frame.y_hidden = screen.getHeight() - screen.getBevelWidth()
+    frame.y_hidden = screen.size().h() - screen.getBevelWidth()
                      - screen.getBorderWidth();
     break;
   }
@@ -265,8 +399,9 @@ void Toolbar::reconfigure(void) {
     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
+      int len = strftime(t, 1024, screen.strftimeFormat(), tt);
+      t[len++] = 'A';   // add size to the string for padding
+      t[len++] = 'A';   // add size to the string for padding
       t[len] = '\0';
 
       if (i18n->multibyte()) {
@@ -340,7 +475,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 {
@@ -468,7 +603,7 @@ void Toolbar::reconfigure(void) {
   XClearWindow(display, frame.nsbutton);
   XClearWindow(display, frame.pwbutton);
   XClearWindow(display, frame.nwbutton);
-
+  
   redrawWindowLabel();
   redrawWorkspaceLabel();
   redrawPrevWorkspaceButton();
@@ -476,7 +611,7 @@ void Toolbar::reconfigure(void) {
   redrawPrevWindowButton();
   redrawNextWindowButton();
   checkClock(True);
-
+  
   toolbarmenu->reconfigure();
 }
 
@@ -502,7 +637,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];
@@ -589,11 +724,13 @@ void Toolbar::checkClock(Bool redraw, Bool date) {
 
 
 void Toolbar::redrawWindowLabel(Bool redraw) {
-  if (screen.getOpenbox().getFocusedWindow()) {
+  OpenboxWindow *foc = screen.getOpenbox().focusedWindow();
+  if (foc == (OpenboxWindow *) 0) {
+    XClearWindow(display, frame.window_label);
+  } else {
     if (redraw)
       XClearWindow(display, frame.window_label);
 
-    OpenboxWindow *foc = screen.getOpenbox().getFocusedWindow();
     if (foc->getScreen() != &screen) return;
 
     int dx = (frame.bevel_w * 2), dlen = strlen(*foc->getTitle());
@@ -645,8 +782,6 @@ void Toolbar::redrawWindowLabel(Bool redraw) {
     else
       XDrawString(display, frame.window_label, style->w_text_gc, dx,
                  (style->font->ascent + 1), *foc->getTitle(), dlen);
-  } else {
-    XClearWindow(display, frame.window_label);
   }
 }
  
@@ -826,24 +961,22 @@ 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 :
-                  RevertToParent),
-                 CurrentTime);
+                 RevertToPointerRoot, CurrentTime);
   XClearWindow(display, frame.workspace_label);
 
   openbox.setNoFocus(True);
-  if (openbox.getFocusedWindow())
-    openbox.getFocusedWindow()->setFocusFlag(False);
+  if (openbox.focusedWindow())
+    openbox.focusedWindow()->setFocusFlag(False);
 
   XDrawRectangle(display, frame.workspace_label,
                  screen.getWindowStyle()->l_text_focus_gc,
@@ -882,11 +1015,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()) {
@@ -897,13 +1030,13 @@ void Toolbar::buttonPressEvent(XButtonEvent *be) {
 
       if (x < 0)
         x = 0;
-      else if (x + toolbarmenu->getWidth() > screen.getWidth())
-        x = screen.getWidth() - toolbarmenu->getWidth();
+      else if (x + toolbarmenu->getWidth() > screen.size().w())
+        x = screen.size().w() - toolbarmenu->getWidth();
 
       if (y < 0)
         y = 0;
-      else if (y + toolbarmenu->getHeight() > screen.getHeight())
-        y = screen.getHeight() - toolbarmenu->getHeight();
+      else if (y + toolbarmenu->getHeight() > screen.size().h())
+        y = screen.size().h() - toolbarmenu->getHeight();
 
       toolbarmenu->move(x, y);
       toolbarmenu->show();
@@ -962,10 +1095,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();
@@ -973,10 +1106,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();
@@ -986,7 +1119,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();
@@ -997,7 +1130,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) {
@@ -1015,15 +1148,15 @@ 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()) {
-        openbox.getFocusedWindow()->setInputFocus();
-        openbox.getFocusedWindow()->setFocusFlag(True);
-      } else {
-        XSetInputFocus(display, PointerRoot, None, CurrentTime);
-      }
+      if (openbox.focusedWindow()) {
+        openbox.focusedWindow()->setInputFocus();
+        openbox.focusedWindow()->setFocusFlag(True);
+      } else
+        openbox.focusWindow((OpenboxWindow *) 0);
+
       // 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.
@@ -1116,7 +1249,7 @@ void Toolbar::keyPressEvent(XKeyEvent *ke) {
 }
 
 
-void Toolbar::timeout(void) {
+void Toolbar::timeout() {
   checkClock(True);
 
   timeval now;
@@ -1125,9 +1258,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
@@ -1150,13 +1283,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;
 }
 
@@ -1170,17 +1307,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
@@ -1199,14 +1336,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();
@@ -1235,7 +1373,6 @@ Toolbarmenu::Placementmenu::Placementmenu(Toolbarmenu &tm)
   update();
 }
 
-
 void Toolbarmenu::Placementmenu::itemSelected(int button, int index) {
   if (button != 1)
     return;
@@ -1243,7 +1380,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();
 
This page took 0.038897 seconds and 4 git commands to generate.