]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
updated nls to use openbox.cat
[chaz/openbox] / src / Screen.cc
index 2844d874eb8bf1e29c289d776ef51b4d47c85541..e0ea21376cfb7cb919a65d744df0f625b7440d98 100644 (file)
@@ -108,6 +108,8 @@ static int anotherWMRunning(Display *display, XErrorEvent *) {
 
 BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
   blackbox = bb;
+  screenstr = (string)"session.screen" + itostring(scrn) + '.';
+  config = blackbox->getConfig();
 
   event_mask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask |
     SubstructureRedirectMask | ButtonPressMask | ButtonReleaseMask;
@@ -127,7 +129,6 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
           getDepth());
 
   rootmenu = 0;
-  resource.stylerc = 0;
 
   resource.mstyle.t_fontset = resource.mstyle.f_fontset =
     resource.tstyle.fontset = resource.wstyle.fontset = (XFontSet) 0;
@@ -155,10 +156,7 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
   image_control->installRootColormap();
   root_colormap_installed = True;
 
-  blackbox->load_rc(this);
-
-  image_control->setDither(resource.image_dither);
-
+  load_rc();
   LoadStyle();
 
   XGCValues gcv;
@@ -206,6 +204,10 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
 
   BTexture* texture = &(resource.wstyle.l_focus);
   geom_pixmap = texture->render(geom_w, geom_h, geom_pixmap);
+  if (geom_pixmap == ParentRelative) {
+    texture = &(resource.wstyle.t_focus);
+    geom_pixmap = texture->render(geom_w, geom_h, geom_pixmap);
+  }
   if (! geom_pixmap)
     XSetWindowBackground(blackbox->getXDisplay(), geom_window,
                          texture->color().pixel());
@@ -229,6 +231,7 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
     workspacesList.push_back(wkspc);
     workspacemenu->insert(wkspc->getName(), wkspc->getMenu());
   }
+  saveWorkspaceNames();
 
   workspacemenu->insert(i18n(IconSet, IconIcons, "Icons"), iconmenu);
   workspacemenu->update();
@@ -347,9 +350,281 @@ BScreen::~BScreen(void) {
 void BScreen::removeWorkspaceNames(void) {
   workspaceNames.clear();
 }
+  
+void BScreen::saveSloppyFocus(bool s) {
+  resource.sloppy_focus = s;
+
+  string fmodel;
+  if (resource.sloppy_focus) {
+    fmodel = "SloppyFocus";
+    if (resource.auto_raise) fmodel += " AutoRaise";
+    if (resource.click_raise) fmodel += " ClickRaise";
+  } else {
+    fmodel = "ClickToFocus";
+  }
+  config->setValue(screenstr + "focusModel", fmodel);
+}
+
+
+void BScreen::saveAutoRaise(bool a) {
+  resource.auto_raise = a;
+  saveSloppyFocus(resource.sloppy_focus);
+}
+
+
+void BScreen::saveClickRaise(bool c) {
+  resource.click_raise = c;
+  saveSloppyFocus(resource.sloppy_focus);
+}
+
+
+void BScreen::saveImageDither(bool d) {
+  image_control->setDither(d);
+  config->setValue(screenstr + "imageDither", doImageDither());
+}
+
+
+void BScreen::saveOpaqueMove(bool o) {
+  resource.opaque_move = o;
+  config->setValue(screenstr + "opaqueMove", resource.opaque_move);
+}
+
+
+void BScreen::saveFullMax(bool f) {
+  resource.full_max = f;
+  config->setValue(screenstr + "fullMaximization", resource.full_max);
+}
+
+
+void BScreen::saveFocusNew(bool f) {
+  resource.focus_new = f;
+  config->setValue(screenstr + "focusNewWindows", resource.focus_new);
+}
+
+
+void BScreen::saveFocusLast(bool f) {
+  resource.focus_last = f;
+  config->setValue(screenstr + "focusLastWindow", resource.focus_last);
+}
+
+
+void BScreen::saveHideToolbar(bool h) {
+  resource.hide_toolbar = h;
+  if (resource.hide_toolbar)
+    toolbar->unmapToolbar();
+  else
+    toolbar->mapToolbar();
+  config->setValue(screenstr + "hideToolbar", resource.hide_toolbar);
+}
+
+
+void BScreen::saveWorkspaces(unsigned int w) {
+  resource.workspaces = w;
+  config->setValue(screenstr + "workspaces", resource.workspaces);
+}
+
+
+void BScreen::savePlacementPolicy(int p) {
+  resource.placement_policy = p; 
+  const char *placement;
+  switch (resource.placement_policy) {
+  case CascadePlacement: placement = "CascadePlacement"; break;
+  case ColSmartPlacement: placement = "ColSmartPlacement"; break;
+  case RowSmartPlacement: default: placement = "RowSmartPlacement"; break;
+  }
+  config->setValue(screenstr + "windowPlacement", placement);
+}
+
+
+void BScreen::saveEdgeSnapThreshold(int t) {
+  resource.edge_snap_threshold = t;
+  config->setValue(screenstr + "edgeSnapThreshold",
+                   resource.edge_snap_threshold);
+}
+
+
+void BScreen::saveRowPlacementDirection(int d) {
+  resource.row_direction = d;
+  config->setValue(screenstr + "rowPlacementDirection",
+                   resource.row_direction == LeftRight ?
+                   "LeftToRight" : "RightToLeft");
+}
+
+
+void BScreen::saveColPlacementDirection(int d) {
+  resource.col_direction = d;
+  config->setValue(screenstr + "colPlacementDirection",
+                   resource.col_direction == TopBottom ?
+                   "TopToBottom" : "BottomToTop");
+}
+
+
+#ifdef    HAVE_STRFTIME
+void BScreen::saveStrftimeFormat(const std::string& format) {
+  resource.strftime_format = format;
+  config->setValue(screenstr + "strftimeFormat", resource.strftime_format);
+}
+
+#else // !HAVE_STRFTIME
+
+void BScreen::saveDateFormat(int f) {
+  resource.date_format = f;
+  config->setValue(screenstr + "dateFormat",
+                   resource.date_format == B_EuropeanDate ?
+                   "European" : "American");
+}
+
+
+void BScreen::saveClock24Hour(Bool c) {
+  resource.clock24hour = c;
+  config->setValue(screenstr + "clockFormat", resource.clock24hour ? 24 : 12);
+}
+#endif // HAVE_STRFTIME
+
+
+void BScreen::saveWorkspaceNames() {
+  string names;
+  WorkspaceList::iterator it;
+  WorkspaceList::iterator last = workspacesList.end() - 1;
+  for (it = workspacesList.begin(); it != workspacesList.end(); ++it) {
+    names += (*it)->getName();
+    if (it != last)
+      names += ',';
+  }
+  config->setValue(screenstr + "workspaceNames", names);
+}
+
+
+void BScreen::save_rc(void) {
+  saveSloppyFocus(resource.sloppy_focus);
+  saveAutoRaise(resource.auto_raise);
+  saveImageDither(doImageDither());
+  saveOpaqueMove(resource.opaque_move);
+  saveFullMax(resource.full_max);
+  saveFocusNew(resource.focus_new);
+  saveFocusLast(resource.focus_last);
+  saveHideToolbar(resource.hide_toolbar);
+  saveWorkspaces(resource.workspaces);
+  savePlacementPolicy(resource.placement_policy);
+  saveEdgeSnapThreshold(resource.edge_snap_threshold);
+  saveRowPlacementDirection(resource.row_direction);
+  saveColPlacementDirection(resource.col_direction);
+#ifdef    HAVE_STRFTIME
+  saveStrftimeFormat(resource.strftime_format); 
+#else // !HAVE_STRFTIME
+  saveDateFormat(resource.date_format);
+  savwClock24Hour(resource.clock24hour);
+#endif // HAVE_STRFTIME
+
+  toolbar->save_rc();
+  slit->save_rc();
+}
+
+
+void BScreen::load_rc(void) {
+  std::string s;
+  bool b;
+
+  if (! config->getValue(screenstr + "fullMaximization", resource.full_max))
+    resource.full_max = false;
+
+  if (! config->getValue(screenstr + "focusNewWindows", resource.focus_new))
+    resource.focus_new = false;
+
+  if (! config->getValue(screenstr + "focusLastWindow", resource.focus_last))
+    resource.focus_last = false;
+
+  if (! config->getValue(screenstr + "workspaces", resource.workspaces))
+    resource.workspaces = 1;
+
+  if (! config->getValue(screenstr + "opaqueMove", resource.opaque_move))
+    resource.opaque_move = false;
+
+  if (! config->getValue(screenstr + "hideToolbar", resource.hide_toolbar))
+    resource.hide_toolbar = false;
+
+  if (! config->getValue(screenstr + "imageDither", b))
+    b = true;
+  image_control->setDither(b);
+
+  if (! config->getValue(screenstr + "edgeSnapThreshold",
+                        resource.edge_snap_threshold))
+    resource.edge_snap_threshold = 4;
+  
+  if (config->getValue(screenstr + "rowPlacementDirection", s) &&
+      s == "RightToLeft")
+    resource.row_direction = RightLeft;
+  else
+    resource.row_direction = LeftRight;
+
+  if (config->getValue(screenstr + "colPlacementDirection", s) &&
+      s == "BottomToTop")
+    resource.col_direction = BottomTop;
+  else
+    resource.col_direction = TopBottom;
+
+  removeWorkspaceNames();
+  if (config->getValue(screenstr + "workspaceNames", s)) {
+    string::const_iterator it = s.begin(), end = s.end();
+    while(1) {
+      string::const_iterator tmp = it;     // current string.begin()
+      it = std::find(tmp, end, ',');       // look for comma between tmp and end
+      addWorkspaceName(string(tmp, it));   // s[tmp:it]
+      if (it == end)
+        break;
+      ++it;
+    }
+  }
+
+  resource.sloppy_focus = true;
+  resource.auto_raise = false;
+  resource.click_raise = false;
+  if (config->getValue(screenstr + "focusModel", s)) {
+    if (s.find("ClickToFocus") != string::npos) {
+      resource.sloppy_focus = false;
+    } else {
+      // must be sloppy
+      if (s.find("AutoRaise") != string::npos)
+        resource.auto_raise = true;
+      if (s.find("ClickRaise") != string::npos)
+        resource.click_raise = true;
+    }
+  }
+
+  if (config->getValue(screenstr + "windowPlacement", s)) {
+    if (s == "CascadePlacement")
+      resource.placement_policy = CascadePlacement;
+    else if (s == "ColSmartPlacement")
+      resource.placement_policy = ColSmartPlacement;
+    else //if (s == "RowSmartPlacement")
+      resource.placement_policy = RowSmartPlacement;
+  } else
+    resource.placement_policy = RowSmartPlacement;
+
+#ifdef    HAVE_STRFTIME
+  if (config->getValue(screenstr + "strftimeFormat", s))
+    resource.strftime_format = s;
+  else
+    resource.strftime_format = "%I:%M %p";
+#else // !HAVE_STRFTIME
+  long l;
+
+  if (config->getValue(screenstr + "dateFormat", s) && s == "European")
+    resource.date_format = B_EuropeanDate;
+ else
+    resource.date_format = B_AmericanDate;
+
+  if (! config->getValue(screenstr + "clockFormat", l))
+    l = 12;
+  resource.clock24hour = l == 24;
+#endif // HAVE_STRFTIME
+}
 
 
 void BScreen::reconfigure(void) {
+  load_rc();
+  toolbar->load_rc();
+  slit->load_rc();
   LoadStyle();
 
   XGCValues gcv;
@@ -384,6 +659,10 @@ void BScreen::reconfigure(void) {
 
   BTexture* texture = &(resource.wstyle.l_focus);
   geom_pixmap = texture->render(geom_w, geom_h, geom_pixmap);
+  if (geom_pixmap == ParentRelative) {
+    texture = &(resource.wstyle.t_focus);
+    geom_pixmap = texture->render(geom_w, geom_h, geom_pixmap);
+  }
   if (! geom_pixmap)
     XSetWindowBackground(blackbox->getXDisplay(), geom_window,
                          texture->color().pixel());
@@ -434,12 +713,19 @@ void BScreen::rereadMenu(void) {
 
 
 void BScreen::LoadStyle(void) {
-  resource.stylerc = XrmGetFileDatabase(blackbox->getStyleFilename());
-  if (! resource.stylerc)
-    resource.stylerc = XrmGetFileDatabase(DEFAULTSTYLE);
+  Configuration style;
+
+  const char *sfile = blackbox->getStyleFilename();
+  if (sfile != NULL) {
+    style.setFile(sfile);
+    if (! style.load()) {
+      style.setFile(DEFAULTSTYLE);
+      if (! style.load())
+        style.create();  // hardcoded default values will be used.
+    }
+  }
 
-  XrmValue value;
-  char *value_type;
+  string s;
 
   // load fonts/fontsets
   if (resource.wstyle.fontset)
@@ -468,14 +754,10 @@ void BScreen::LoadStyle(void) {
   resource.mstyle.t_font = 0;
 
   if (i18n.multibyte()) {
-    resource.wstyle.fontset =
-      readDatabaseFontSet("window.font", "Window.Font");
-    resource.tstyle.fontset =
-      readDatabaseFontSet("toolbar.font", "Toolbar.Font");
-    resource.mstyle.t_fontset =
-      readDatabaseFontSet("menu.title.font", "Menu.Title.Font");
-    resource.mstyle.f_fontset =
-      readDatabaseFontSet("menu.frame.font", "Menu.Frame.Font");
+    resource.wstyle.fontset = readDatabaseFontSet("window.font", style);
+    resource.tstyle.fontset = readDatabaseFontSet("toolbar.font", style);
+    resource.mstyle.t_fontset = readDatabaseFontSet("menu.title.font", style);
+    resource.mstyle.f_fontset = readDatabaseFontSet("menu.frame.font", style);
 
     resource.mstyle.t_fontset_extents =
       XExtentsOfFontSet(resource.mstyle.t_fontset);
@@ -486,207 +768,155 @@ void BScreen::LoadStyle(void) {
     resource.wstyle.fontset_extents =
       XExtentsOfFontSet(resource.wstyle.fontset);
   } else {
-    resource.wstyle.font =
-      readDatabaseFont("window.font", "Window.Font");
-    resource.tstyle.font =
-      readDatabaseFont("toolbar.font", "Toolbar.Font");
-    resource.mstyle.t_font =
-      readDatabaseFont("menu.title.font", "Menu.Title.Font");
-    resource.mstyle.f_font =
-      readDatabaseFont("menu.frame.font", "Menu.Frame.Font");
+    resource.wstyle.font = readDatabaseFont("window.font", style);
+    resource.tstyle.font = readDatabaseFont("toolbar.font", style);
+    resource.mstyle.t_font = readDatabaseFont("menu.title.font", style);
+    resource.mstyle.f_font = readDatabaseFont("menu.frame.font", style);
   }
 
   // load window config
   resource.wstyle.t_focus =
-    readDatabaseTexture("window.title.focus", "Window.Title.Focus", "white");
+    readDatabaseTexture("window.title.focus", "white", style);
   resource.wstyle.t_unfocus =
-    readDatabaseTexture("window.title.unfocus",
-                        "Window.Title.Unfocus", "black");
+    readDatabaseTexture("window.title.unfocus", "black", style);
   resource.wstyle.l_focus =
-    readDatabaseTexture("window.label.focus", "Window.Label.Focus", "white" );
+    readDatabaseTexture("window.label.focus", "white", style);
   resource.wstyle.l_unfocus =
-    readDatabaseTexture("window.label.unfocus", "Window.Label.Unfocus",
-                        "black");
+    readDatabaseTexture("window.label.unfocus", "black", style);
   resource.wstyle.h_focus =
-    readDatabaseTexture("window.handle.focus", "Window.Handle.Focus", "white");
+    readDatabaseTexture("window.handle.focus", "white", style);
   resource.wstyle.h_unfocus =
-    readDatabaseTexture("window.handle.unfocus",
-                        "Window.Handle.Unfocus", "black");
+    readDatabaseTexture("window.handle.unfocus", "black", style);
   resource.wstyle.g_focus =
-    readDatabaseTexture("window.grip.focus", "Window.Grip.Focus", "white");
+    readDatabaseTexture("window.grip.focus", "white", style);
   resource.wstyle.g_unfocus =
-    readDatabaseTexture("window.grip.unfocus", "Window.Grip.Unfocus", "black");
+    readDatabaseTexture("window.grip.unfocus", "black", style);
   resource.wstyle.b_focus =
-    readDatabaseTexture("window.button.focus", "Window.Button.Focus", "white");
+    readDatabaseTexture("window.button.focus", "white", style);
   resource.wstyle.b_unfocus =
-    readDatabaseTexture("window.button.unfocus",
-                        "Window.Button.Unfocus", "black");
+    readDatabaseTexture("window.button.unfocus", "black", style);
   resource.wstyle.b_pressed =
-    readDatabaseTexture("window.button.pressed",
-                        "Window.Button.Pressed", "black");
+    readDatabaseTexture("window.button.pressed", "black", style);
   resource.wstyle.f_focus =
-    readDatabaseColor("window.frame.focusColor",
-                      "Window.Frame.FocusColor", "white");
+    readDatabaseColor("window.frame.focusColor", "white", style);
   resource.wstyle.f_unfocus =
-    readDatabaseColor("window.frame.unfocusColor",
-                      "Window.Frame.UnfocusColor", "black");
+    readDatabaseColor("window.frame.unfocusColor", "black", style);
   resource.wstyle.l_text_focus =
-    readDatabaseColor("window.label.focus.textColor",
-                      "Window.Label.Focus.TextColor", "black");
+    readDatabaseColor("window.label.focus.textColor", "black", style);
   resource.wstyle.l_text_unfocus =
-    readDatabaseColor("window.label.unfocus.textColor",
-                      "Window.Label.Unfocus.TextColor", "white");
+    readDatabaseColor("window.label.unfocus.textColor", "white", style);
   resource.wstyle.b_pic_focus =
-    readDatabaseColor("window.button.focus.picColor",
-                      "Window.Button.Focus.PicColor", "black");
+    readDatabaseColor("window.button.focus.picColor", "black", style);
   resource.wstyle.b_pic_unfocus =
-    readDatabaseColor("window.button.unfocus.picColor",
-                      "Window.Button.Unfocus.PicColor", "white");
+    readDatabaseColor("window.button.unfocus.picColor", "white", style);
 
   resource.wstyle.justify = LeftJustify;
-  if (XrmGetResource(resource.stylerc, "window.justify", "Window.Justify",
-                     &value_type, &value)) {
-    if (strstr(value.addr, "right") || strstr(value.addr, "Right"))
+  if (style.getValue("window.justify", s)) {
+    if (s == "right" || s == "Right")
       resource.wstyle.justify = RightJustify;
-    else if (strstr(value.addr, "center") || strstr(value.addr, "Center"))
+    else if (s == "center" || s == "Center")
       resource.wstyle.justify = CenterJustify;
   }
 
   // load toolbar config
   resource.tstyle.toolbar =
-    readDatabaseTexture("toolbar", "Toolbar", "black");
+    readDatabaseTexture("toolbar", "black", style);
   resource.tstyle.label =
-    readDatabaseTexture("toolbar.label", "Toolbar.Label", "black");
+    readDatabaseTexture("toolbar.label", "black", style);
   resource.tstyle.window =
-    readDatabaseTexture("toolbar.windowLabel", "Toolbar.WindowLabel", "black");
+    readDatabaseTexture("toolbar.windowLabel", "black", style);
   resource.tstyle.button =
-    readDatabaseTexture("toolbar.button", "Toolbar.Button", "white");
+    readDatabaseTexture("toolbar.button", "white", style);
   resource.tstyle.pressed =
-    readDatabaseTexture("toolbar.button.pressed",
-                        "Toolbar.Button.Pressed", "black");
+    readDatabaseTexture("toolbar.button.pressed", "black", style);
   resource.tstyle.clock =
-    readDatabaseTexture("toolbar.clock", "Toolbar.Clock", "black");
+    readDatabaseTexture("toolbar.clock", "black", style);
   resource.tstyle.l_text =
-    readDatabaseColor("toolbar.label.textColor",
-                      "Toolbar.Label.TextColor", "white");
+    readDatabaseColor("toolbar.label.textColor", "white", style);
   resource.tstyle.w_text =
-    readDatabaseColor("toolbar.windowLabel.textColor",
-                      "Toolbar.WindowLabel.TextColor", "white");
+    readDatabaseColor("toolbar.windowLabel.textColor", "white", style);
   resource.tstyle.c_text =
-    readDatabaseColor("toolbar.clock.textColor",
-                      "Toolbar.Clock.TextColor", "white");
+    readDatabaseColor("toolbar.clock.textColor", "white", style);
   resource.tstyle.b_pic =
-    readDatabaseColor("toolbar.button.picColor",
-                      "Toolbar.Button.PicColor", "black");
+    readDatabaseColor("toolbar.button.picColor", "black", style);
 
   resource.tstyle.justify = LeftJustify;
-  if (XrmGetResource(resource.stylerc, "toolbar.justify",
-                     "Toolbar.Justify", &value_type, &value)) {
-    if (strstr(value.addr, "right") || strstr(value.addr, "Right"))
+  if (style.getValue("toolbar.justify", s)) {
+    if (s == "right" || s == "Right")
       resource.tstyle.justify = RightJustify;
-    else if (strstr(value.addr, "center") || strstr(value.addr, "Center"))
+    else if (s == "center" || s == "Center")
       resource.tstyle.justify = CenterJustify;
   }
 
   // load menu config
   resource.mstyle.title =
-    readDatabaseTexture("menu.title", "Menu.Title", "white");
+    readDatabaseTexture("menu.title", "white", style);
   resource.mstyle.frame =
-    readDatabaseTexture("menu.frame", "Menu.Frame", "black");
+    readDatabaseTexture("menu.frame", "black", style);
   resource.mstyle.hilite =
-    readDatabaseTexture("menu.hilite", "Menu.Hilite", "white");
+    readDatabaseTexture("menu.hilite", "white", style);
   resource.mstyle.t_text =
-    readDatabaseColor("menu.title.textColor", "Menu.Title.TextColor", "black");
+    readDatabaseColor("menu.title.textColor", "black", style);
   resource.mstyle.f_text =
-    readDatabaseColor("menu.frame.textColor", "Menu.Frame.TextColor", "white");
+    readDatabaseColor("menu.frame.textColor", "white", style);
   resource.mstyle.d_text =
-    readDatabaseColor("menu.frame.disableColor",
-                      "Menu.Frame.DisableColor", "black");
+    readDatabaseColor("menu.frame.disableColor", "black", style);
   resource.mstyle.h_text =
-    readDatabaseColor("menu.hilite.textColor",
-                      "Menu.Hilite.TextColor", "black");
+    readDatabaseColor("menu.hilite.textColor", "black", style);
 
   resource.mstyle.t_justify = LeftJustify;
-  if (XrmGetResource(resource.stylerc, "menu.title.justify",
-                     "Menu.Title.Justify",
-                     &value_type, &value)) {
-    if (strstr(value.addr, "right") || strstr(value.addr, "Right"))
+  if (style.getValue("menu.title.justify", s)) {
+    if (s == "right" || s == "Right")
       resource.mstyle.t_justify = RightJustify;
-    else if (strstr(value.addr, "center") || strstr(value.addr, "Center"))
+    else if (s == "center" || s == "Center")
       resource.mstyle.t_justify = CenterJustify;
   }
 
   resource.mstyle.f_justify = LeftJustify;
-  if (XrmGetResource(resource.stylerc, "menu.frame.justify",
-                     "Menu.Frame.Justify",
-                     &value_type, &value)) {
-    if (strstr(value.addr, "right") || strstr(value.addr, "Right"))
+  if (style.getValue("menu.frame.justify", s)) {
+    if (s == "right" || s == "Right")
       resource.mstyle.f_justify = RightJustify;
-    else if (strstr(value.addr, "center") || strstr(value.addr, "Center"))
+    else if (s == "center" || s == "Center")
       resource.mstyle.f_justify = CenterJustify;
   }
 
   resource.mstyle.bullet = Basemenu::Triangle;
-  if (XrmGetResource(resource.stylerc, "menu.bullet", "Menu.Bullet",
-                     &value_type, &value)) {
-    if (! strncasecmp(value.addr, "empty", value.size))
+  if (style.getValue("menu.bullet", s)) {
+    if (s == "empty" || s == "Empty")
       resource.mstyle.bullet = Basemenu::Empty;
-    else if (! strncasecmp(value.addr, "square", value.size))
+    else if (s == "square" || s == "Square")
       resource.mstyle.bullet = Basemenu::Square;
-    else if (! strncasecmp(value.addr, "diamond", value.size))
+    else if (s == "diamond" || s == "Diamond")
       resource.mstyle.bullet = Basemenu::Diamond;
   }
 
   resource.mstyle.bullet_pos = Basemenu::Left;
-  if (XrmGetResource(resource.stylerc, "menu.bullet.position",
-                     "Menu.Bullet.Position", &value_type, &value)) {
-    if (! strncasecmp(value.addr, "right", value.size))
+  if (style.getValue("menu.bullet.position", s)) {
+    if (s == "right" || s == "Right")
       resource.mstyle.bullet_pos = Basemenu::Right;
   }
 
   resource.border_color =
-    readDatabaseColor("borderColor", "BorderColor", "black");
-
-  unsigned int uint_value;
+    readDatabaseColor("borderColor", "black", style);
 
   // load bevel, border and handle widths
-  resource.handle_width = 6;
-  if (XrmGetResource(resource.stylerc, "handleWidth", "HandleWidth",
-                     &value_type, &value) &&
-      sscanf(value.addr, "%u", &uint_value) == 1 &&
-      uint_value <= (getWidth() / 2) && uint_value != 0) {
-    resource.handle_width = uint_value;
-  }
+  if (! style.getValue("handleWidth", resource.handle_width) ||
+      resource.handle_width > (getWidth() / 2) || resource.handle_width == 0)
+    resource.handle_width = 6;
 
-  resource.border_width = 1;
-  if (XrmGetResource(resource.stylerc, "borderWidth", "BorderWidth",
-                     &value_type, &value) &&
-      sscanf(value.addr, "%u", &uint_value) == 1) {
-    resource.border_width = uint_value;
-  }
+  if (! style.getValue("borderWidth", resource.border_width))
+    resource.border_width = 1;
 
-  resource.bevel_width = 3;
-  if (XrmGetResource(resource.stylerc, "bevelWidth", "BevelWidth",
-                     &value_type, &value) &&
-      sscanf(value.addr, "%u", &uint_value) == 1 &&
-      uint_value <= (getWidth() / 2) && uint_value != 0) {
-    resource.bevel_width = uint_value;
-  }
-
-  resource.frame_width = resource.bevel_width;
-  if (XrmGetResource(resource.stylerc, "frameWidth", "FrameWidth",
-                     &value_type, &value) &&
-      sscanf(value.addr, "%u", &uint_value) == 1 &&
-      uint_value <= (getWidth() / 2)) {
-    resource.frame_width = uint_value;
-  }
+  if (! style.getValue("bevelWidth", resource.bevel_width) ||
+      resource.bevel_width > (getWidth() / 2) || resource.bevel_width == 0)
+    resource.bevel_width = 3;
 
-  if (XrmGetResource(resource.stylerc, "rootCommand", "RootCommand",
-                     &value_type, &value)) {
-    bexec(value.addr, displayString());
-  }
+  if (! style.getValue("frameWidth", resource.frame_width) ||
+      resource.frame_width > (getWidth() / 2))
+    resource.frame_width = resource.bevel_width;
 
-  XrmDestroyDatabase(resource.stylerc);
+  if (style.getValue("rootCommand", s))
+    bexec(s, displayString());
 }
 
 
@@ -733,6 +963,8 @@ BlackboxWindow *BScreen::getIcon(unsigned int index) {
 unsigned int BScreen::addWorkspace(void) {
   Workspace *wkspc = new Workspace(this, workspacesList.size());
   workspacesList.push_back(wkspc);
+  saveWorkspaces(getWorkspaceCount() + 1);
+  saveWorkspaceNames();
 
   workspacemenu->insert(wkspc->getName(), wkspc->getMenu(),
                         wkspc->getID() + 2);
@@ -763,6 +995,9 @@ unsigned int BScreen::removeLastWorkspace(void) {
   workspacesList.pop_back();
   delete wkspc;
 
+  saveWorkspaces(getWorkspaceCount() - 1);
+  saveWorkspaceNames();
+
   toolbar->reconfigure();
 
   updateNetizenWorkspaceCount();
@@ -835,6 +1070,13 @@ void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) {
 
   removeNetizen(w->getClientWindow());
 
+  /*
+    some managed windows can also be window group controllers.  when
+    unmanaging such windows, we should also delete the window group.
+  */
+  BWindowGroup *group = blackbox->searchGroup(w->getClientWindow());
+  delete group;
+
   delete w;
 }
 
@@ -973,13 +1215,6 @@ void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) {
 }
 
 
-#ifdef    HAVE_STRFTIME
-void BScreen::saveStrftimeFormat(const string& format) {
-  resource.strftime_format = format;
-}
-#endif // HAVE_STRFTIME
-
-
 void BScreen::addWorkspaceName(const string& name) {
   workspaceNames.push_back(name);
 }
@@ -1052,7 +1287,7 @@ void BScreen::nextFocus(void) {
     do {
       current = next;
       next = current_workspace->getNextWindowInList(current);
-    } while(!next->setInputFocus() && next != focused);
+    } while(! next->setInputFocus() && next != focused);
 
     if (next != focused)
       current_workspace->raiseWindow(next);
@@ -1081,7 +1316,7 @@ void BScreen::prevFocus(void) {
     do {
       current = next;
       next = current_workspace->getPrevWindowInList(current);
-    } while(!next->setInputFocus() && next != focused);
+    } while(! next->setInputFocus() && next != focused);
 
     if (next != focused)
       current_workspace->raiseWindow(next);
@@ -1118,56 +1353,64 @@ void BScreen::InitMenu(void) {
   }
   bool defaultMenu = True;
 
-  if (blackbox->getMenuFilename()) {
-    FILE *menu_file = fopen(blackbox->getMenuFilename(), "r");
-
-    if (!menu_file) {
-      perror(blackbox->getMenuFilename());
+  FILE *menu_file = (FILE *) 0;
+  const char *menu_filename = blackbox->getMenuFilename();
+
+  if (menu_filename) 
+    if (! (menu_file = fopen(menu_filename, "r")))
+      perror(menu_filename);
+  if (! menu_file) {     // opening the menu file failed, try the default menu
+    menu_filename = DEFAULTMENU;
+    if (! (menu_file = fopen(menu_filename, "r")))
+      perror(menu_filename);
+  } 
+
+  if (menu_file) {
+    if (feof(menu_file)) {
+      fprintf(stderr, i18n(ScreenSet, ScreenEmptyMenuFile,
+                           "%s: Empty menu file"),
+              menu_filename);
     } else {
-      if (feof(menu_file)) {
-        fprintf(stderr, i18n(ScreenSet, ScreenEmptyMenuFile,
-                             "%s: Empty menu file"),
-                blackbox->getMenuFilename());
-      } else {
-        char line[1024], label[1024];
-        memset(line, 0, 1024);
-        memset(label, 0, 1024);
-
-        while (fgets(line, 1024, menu_file) && ! feof(menu_file)) {
-          if (line[0] != '#') {
-            int i, key = 0, index = -1, len = strlen(line);
-
-            for (i = 0; i < len; i++) {
-              if (line[i] == '[') index = 0;
-              else if (line[i] == ']') break;
-              else if (line[i] != ' ')
-                if (index++ >= 0)
-                  key += tolower(line[i]);
-            }
+      char line[1024], label[1024];
+      memset(line, 0, 1024);
+      memset(label, 0, 1024);
+
+      while (fgets(line, 1024, menu_file) && ! feof(menu_file)) {
+        if (line[0] != '#') {
+          int i, key = 0, index = -1, len = strlen(line);
+
+          for (i = 0; i < len; i++) {
+            if (line[i] == '[') index = 0;
+            else if (line[i] == ']') break;
+            else if (line[i] != ' ')
+              if (index++ >= 0)
+                key += tolower(line[i]);
+          }
 
-            if (key == 517) { // [begin]
-              index = -1;
-              for (i = index; i < len; i++) {
-                if (line[i] == '(') index = 0;
-                else if (line[i] == ')') break;
-                else if (index++ >= 0) {
-                  if (line[i] == '\\' && i < len - 1) i++;
-                  label[index - 1] = line[i];
-                }
+          if (key == 517) { // [begin]
+            index = -1;
+            for (i = index; i < len; i++) {
+              if (line[i] == '(') index = 0;
+              else if (line[i] == ')') break;
+              else if (index++ >= 0) {
+                if (line[i] == '\\' && i < len - 1) i++;
+                label[index - 1] = line[i];
               }
+            }
 
-              if (index == -1) index = 0;
-              label[index] = '\0';
+            if (index == -1) index = 0;
+            label[index] = '\0';
 
-              rootmenu->setLabel(label);
-              defaultMenu = parseMenuFile(menu_file, rootmenu);
-              break;
-            }
+            rootmenu->setLabel(label);
+            defaultMenu = parseMenuFile(menu_file, rootmenu);
+            if (! defaultMenu)
+              blackbox->addMenuTimestamp(menu_filename);
+            break;
           }
         }
       }
-      fclose(menu_file);
     }
+    fclose(menu_file);
   }
 
   if (defaultMenu) {
@@ -1180,9 +1423,7 @@ void BScreen::InitMenu(void) {
     rootmenu->insert(i18n(ScreenSet, ScreenExit, "Exit"),
                      BScreen::Exit);
     rootmenu->setLabel(i18n(BasemenuSet, BasemenuBlackboxMenu,
-                            "Blackbox Menu"));
-  } else {
-    blackbox->saveMenuFilename(blackbox->getMenuFilename());
+                            "Openbox Menu"));
   }
 }
 
@@ -1339,7 +1580,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
 
               if (! feof(submenufile)) {
                 if (! parseMenuFile(submenufile, menu))
-                  blackbox->saveMenuFilename(newfile);
+                  blackbox->addMenuTimestamp(newfile);
 
                 fclose(submenufile);
               }
@@ -1470,7 +1711,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
                   rootmenuList.push_back(stylesmenu);
                 }
 
-                blackbox->saveMenuFilename(stylesdir);
+                blackbox->addMenuTimestamp(stylesdir);
               } else {
                 fprintf(stderr,
                         i18n(ScreenSet, ScreenSTYLESDIRErrorNotDir,
@@ -1707,6 +1948,18 @@ void BScreen::buttonPressEvent(XButtonEvent *xbutton) {
       blackbox->checkMenu();
       rootmenu->show();
     }
+  // mouse wheel up
+  } else if (xbutton->button == 4) {
+    if (getCurrentWorkspaceID() >= getWorkspaceCount() - 1)
+      changeWorkspaceID(0);
+    else
+      changeWorkspaceID(getCurrentWorkspaceID() + 1);
+  // mouse wheel down
+  } else if (xbutton->button == 5) {
+    if (getCurrentWorkspaceID() == 0)
+      changeWorkspaceID(getWorkspaceCount() - 1);
+    else
+      changeWorkspaceID(getCurrentWorkspaceID() - 1);
   }
 }
 
@@ -1732,15 +1985,13 @@ void BScreen::updateFocusModel()
 
 
 BTexture BScreen::readDatabaseTexture(const string &rname,
-                                      const string &rclass,
-                                      const string &default_color) {
+                                      const string &default_color,
+                                      Configuration &style) {
   BTexture texture;
-  XrmValue value;
-  char *value_type;
+  string s;
 
-  if (XrmGetResource(resource.stylerc, rname.c_str(), rclass.c_str(),
-                     &value_type, &value))
-    texture = BTexture(value.addr);
+  if (style.getValue(rname, s))
+    texture = BTexture(s);
   else
     texture.setTexture(BTexture::Solid | BTexture::Flat);
 
@@ -1750,32 +2001,27 @@ BTexture BScreen::readDatabaseTexture(const string &rname,
 
   if (texture.texture() & BTexture::Solid) {
     texture.setColor(readDatabaseColor(rname + ".color",
-                                       rclass + ".Color",
-                                       default_color));
+                                       default_color, style));
     texture.setColorTo(readDatabaseColor(rname + ".colorTo",
-                                         rclass + ".ColorTo",
-                                         default_color));
+                                         default_color, style));
   } else if (texture.texture() & BTexture::Gradient) {
     texture.setColor(readDatabaseColor(rname + ".color",
-                                       rclass + ".Color",
-                                       default_color));
+                                       default_color, style));
     texture.setColorTo(readDatabaseColor(rname + ".colorTo",
-                                         rclass + ".ColorTo",
-                                         default_color));
+                                         default_color, style));
   }
 
   return texture;
 }
 
 
-BColor BScreen::readDatabaseColor(const string &rname, const string &rclass,
-                                 const string &default_color) {
+BColor BScreen::readDatabaseColor(const string &rname,
+                                 const string &default_color,
+                                  Configuration &style) {
   BColor color;
-  XrmValue value;
-  char *value_type;
-  if (XrmGetResource(resource.stylerc, rname.c_str(), rclass.c_str(),
-                     &value_type, &value))
-    color = BColor(value.addr, getBaseDisplay(), getScreenNumber());
+  string s;
+  if (style.getValue(rname, s))
+    color = BColor(s, getBaseDisplay(), getScreenNumber());
   else
     color = BColor(default_color, getBaseDisplay(), getScreenNumber());
   return color;
@@ -1783,18 +2029,14 @@ BColor BScreen::readDatabaseColor(const string &rname, const string &rclass,
 
 
 XFontSet BScreen::readDatabaseFontSet(const string &rname,
-                                      const string &rclass) {
+                                      Configuration &style) {
   char *defaultFont = "fixed";
 
   bool load_default = True;
-  XrmValue value;
-  char *value_type;
+  string s;
   XFontSet fontset = 0;
-  if (XrmGetResource(resource.stylerc, rname.c_str(), rclass.c_str(),
-                     &value_type, &value) &&
-      (fontset = createFontSet(value.addr))) {
+  if (style.getValue(rname, s) && (fontset = createFontSet(s)))
     load_default = False;
-  }
 
   if (load_default) {
     fontset = createFontSet(defaultFont);
@@ -1812,20 +2054,18 @@ XFontSet BScreen::readDatabaseFontSet(const string &rname,
 
 
 XFontStruct *BScreen::readDatabaseFont(const string &rname,
-                                       const string &rclass) {
+                                       Configuration &style) {
   char *defaultFont = "fixed";
 
   bool load_default = False;
-  XrmValue value;
-  char *value_type;
+  string s;
   XFontStruct *font = 0;
-  if (XrmGetResource(resource.stylerc, rname.c_str(), rclass.c_str(),
-                     &value_type, &value)) {
-    if ((font = XLoadQueryFont(blackbox->getXDisplay(), value.addr)) == NULL) {
+  if (style.getValue(rname, s)) {
+    if ((font = XLoadQueryFont(blackbox->getXDisplay(), s.c_str())) == NULL) {
       fprintf(stderr,
               i18n(ScreenSet, ScreenFontLoadFail,
                    "BScreen::setCurrentStyle(): couldn't load font '%s'\n"),
-              value.addr);
+              s.c_str());
 
       load_default = True;
     }
@@ -1852,7 +2092,7 @@ static const char * strcasestr(const char *str, const char *ptn) {
   const char *s2, *p2;
   for(; *str; str++) {
     for(s2=str,p2=ptn; ; s2++,p2++) {
-      if (!*p2) return str;
+      if (! *p2) return str;
       if (toupper(*s2) != toupper(*p2)) break;
     }
   }
@@ -1892,7 +2132,7 @@ static const char *getFontSize(const char *pattern, int *size) {
   int n=0;
 
   for (p=pattern; 1; p++) {
-    if (!*p) {
+    if (! *p) {
       if (p2!=NULL && n>1 && n<72) {
         *size = n; return p2+1;
       } else {
This page took 0.041782 seconds and 4 git commands to generate.