X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FScreen.cc;h=29a7a69d5f95309793913084a9de53b85a38078c;hb=a0dbb0e13f19ac4cc2dddf3d94723174971df6d2;hp=7a3b9d7ba0f673377df0d8f01f1bf145bf78b2ff;hpb=73a3c979b39ae0b51298d16bc5e76b61d31c89d5;p=chaz%2Fopenbox diff --git a/src/Screen.cc b/src/Screen.cc index 7a3b9d7b..29a7a69d 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -49,6 +49,7 @@ #include "Window.h" #include "Workspace.h" #include "Workspacemenu.h" +#include "Util.h" #ifdef HAVE_STDLIB_H # include @@ -99,8 +100,10 @@ #define FONT_ELEMENT_SIZE 50 #endif // FONT_ELEMENT_SIZE +#include #include #include +using namespace std; static Bool running = True; @@ -209,14 +212,15 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), rootmenu = 0; resource.mstyle.t_fontset = resource.mstyle.f_fontset = - resource.tstyle.fontset = resource.wstyle.fontset = (XFontSet) 0; + resource.tstyle.fontset = resource.wstyle.fontset = NULL; resource.mstyle.t_font = resource.mstyle.f_font = resource.tstyle.font = - resource.wstyle.font = (XFontStruct *) 0; + resource.wstyle.font = NULL; resource.root_command = NULL; -#ifdef HAVE_STRFTIME - resource.strftime_format = 0; -#endif // HAVE_STRFTIME +#ifdef SLIT + slit = NULL; +#endif // SLIT + toolbar = NULL; #ifdef HAVE_GETPID pid_t bpid = getpid(); @@ -232,8 +236,6 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), workspaceNames = new LinkedList; workspacesList = new LinkedList; - rootmenuList = new LinkedList; - netizenList = new LinkedList; iconList = new LinkedList; image_control = @@ -242,10 +244,7 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), image_control->installRootColormap(); root_colormap_installed = True; - openbox.load_rc(this); - - image_control->setDither(resource.image_dither); - + load(); // load config options from Resources LoadStyle(); XGCValues gcv; @@ -398,7 +397,7 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), iconmenu = new Iconmenu(*this); configmenu = new Configmenu(*this); - Workspace *wkspc = (Workspace *) 0; + Workspace *wkspc = NULL; if (resource.workspaces != 0) { for (int i = 0; i < resource.workspaces; ++i) { wkspc = new Workspace(*this, workspacesList->count()); @@ -410,6 +409,7 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), workspacesList->insert(wkspc); workspacemenu->insert(wkspc->getName(), wkspc->getMenu()); } + saveWorkspaceNames(); workspacemenu->insert(i18n->getMessage(IconSet, IconIcons, "Icons"), iconmenu); @@ -418,7 +418,7 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), current_workspace = workspacesList->first(); workspacemenu->setItemSelected(2, True); - toolbar = new Toolbar(*this); + toolbar = new Toolbar(*this, config); #ifdef SLIT slit = new Slit(*this, config); @@ -482,9 +482,8 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), } } - if (! resource.sloppy_focus) - XSetInputFocus(getBaseDisplay().getXDisplay(), toolbar->getWindowID(), - RevertToParent, CurrentTime); + XSetInputFocus(getBaseDisplay().getXDisplay(), + PointerRoot, None, CurrentTime); XFree(children); XFlush(getBaseDisplay().getXDisplay()); @@ -505,14 +504,14 @@ BScreen::~BScreen(void) { while (workspacesList->count()) delete workspacesList->remove(0); - while (rootmenuList->count()) - rootmenuList->remove(0); + while (!rootmenuList.empty()) + rootmenuList.erase(rootmenuList.begin()); while (iconList->count()) delete iconList->remove(0); - while (netizenList->count()) - delete netizenList->remove(0); + while (!netizenList.empty()) + netizenList.erase(netizenList.begin()); #ifdef HAVE_STRFTIME if (resource.strftime_format) @@ -533,9 +532,7 @@ BScreen::~BScreen(void) { delete workspacesList; delete workspaceNames; - delete rootmenuList; delete iconList; - delete netizenList; if (resource.wstyle.fontset) XFreeFontSet(getBaseDisplay().getXDisplay(), resource.wstyle.fontset); @@ -589,6 +586,108 @@ BScreen::~BScreen(void) { resource.tstyle.b_pic_gc); } + +Rect BScreen::availableArea() const { + // the following code is temporary and will be taken care of by Screen in the + // future (with the NETWM 'strut') + Rect space(0, 0, size().w(), size().h()); + if (!resource.full_max) { +#ifdef SLIT + int slit_x = slit->autoHide() ? slit->hiddenOrigin().x() : slit->area().x(), + slit_y = slit->autoHide() ? slit->hiddenOrigin().y() : slit->area().y(); + int tbarh = resource.hide_toolbar ? 0 : + toolbar->getExposedHeight() + resource.border_width * 2; + bool tbartop; + switch (toolbar->placement()) { + case Toolbar::TopLeft: + case Toolbar::TopCenter: + case Toolbar::TopRight: + tbartop = true; + break; + case Toolbar::BottomLeft: + case Toolbar::BottomCenter: + case Toolbar::BottomRight: + tbartop = false; + break; + default: + ASSERT(false); // unhandled placement + } + if ((slit->direction() == Slit::Horizontal && + (slit->placement() == Slit::TopLeft || + slit->placement() == Slit::TopRight)) || + slit->placement() == Slit::TopCenter) { + // exclude top + if (tbartop && slit_y + slit->area().h() < tbarh) { + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } else { + space.setY(space.y() + (slit_y + slit->area().h() + + resource.border_width * 2)); + space.setH(space.h() - (slit_y + slit->area().h() + + resource.border_width * 2)); + if (!tbartop) + space.setH(space.h() - tbarh); + } + } else if ((slit->direction() == Slit::Vertical && + (slit->placement() == Slit::TopRight || + slit->placement() == Slit::BottomRight)) || + slit->placement() == Slit::CenterRight) { + // exclude right + space.setW(space.w() - (size().w() - slit_x)); + if (tbartop) + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } else if ((slit->direction() == Slit::Horizontal && + (slit->placement() == Slit::BottomLeft || + slit->placement() == Slit::BottomRight)) || + slit->placement() == Slit::BottomCenter) { + // exclude bottom + if (!tbartop && (size().h() - slit_y) < tbarh) { + space.setH(space.h() - tbarh); + } else { + space.setH(space.h() - (size().h() - slit_y)); + if (tbartop) { + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } + } + } else {// if ((slit->direction() == Slit::Vertical && + // (slit->placement() == Slit::TopLeft || + // slit->placement() == Slit::BottomLeft)) || + // slit->placement() == Slit::CenterLeft) + // exclude left + space.setX(slit_x + slit->area().w() + + resource.border_width * 2); + space.setW(space.w() - (slit_x + slit->area().w() + + resource.border_width * 2)); + if (tbartop) + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } +#else // !SLIT + int tbarh = resource.hide_toolbar() ? 0 : + toolbar->getExposedHeight() + resource.border_width * 2; + switch (toolbar->placement()) { + case Toolbar::TopLeft: + case Toolbar::TopCenter: + case Toolbar::TopRight: + space.setY(toolbar->getExposedHeight()); + space.setH(space.h() - toolbar->getExposedHeight()); + break; + case Toolbar::BottomLeft: + case Toolbar::BottomCenter: + case Toolbar::BottomRight: + space.setH(space.h() - tbarh); + break; + default: + ASSERT(false); // unhandled placement + } +#endif // SLIT + } + return space; +} + + void BScreen::readDatabaseTexture(const char *rname, const char *rclass, BTexture *texture, unsigned long default_pixel) @@ -695,7 +794,7 @@ void BScreen::readDatabaseColor(const char *rname, const char *rclass, if (resource.styleconfig.getValue(rname, rclass, s)) image_control->parseColor(color, s.c_str()); else { - // parsing with no color string just deallocates the color, if it has + // parsing with no color std::string just deallocates the color, if it has // been previously allocated image_control->parseColor(color); color->setPixel(default_pixel); @@ -824,7 +923,486 @@ XFontSet BScreen::createFontSet(const char *fontname) { } +void BScreen::setSloppyFocus(bool b) { + resource.sloppy_focus = b; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".focusModel" << ends; + config.setValue(s.str(), + (resource.sloppy_focus ? + (resource.auto_raise ? "AutoRaiseSloppyFocus" : "SloppyFocus") + : "ClickToFocus")); + s.rdbuf()->freeze(0); +} + + +void BScreen::setAutoRaise(bool a) { + resource.auto_raise = a; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".focusModel" << ends; + config.setValue(s.str(), + (resource.sloppy_focus ? + (resource.auto_raise ? "AutoRaiseSloppyFocus" : "SloppyFocus") + : "ClickToFocus")); + s.rdbuf()->freeze(0); +} + + +void BScreen::setImageDither(bool d, bool reconfig) { + image_control->setDither(d); + ostrstream s; + s << "session.screen" << getScreenNumber() << ".imageDither" << ends; + config.setValue(s.str(), imageDither()); + if (reconfig) + reconfigure(); + s.rdbuf()->freeze(0); +} + + +void BScreen::setOpaqueMove(bool o) { + resource.opaque_move = o; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".opaqueMove" << ends; + config.setValue(s.str(), resource.opaque_move); + s.rdbuf()->freeze(0); +} + + +void BScreen::setFullMax(bool f) { + resource.full_max = f; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".fullMaximization" << ends; + config.setValue(s.str(), resource.full_max); + s.rdbuf()->freeze(0); +} + + +void BScreen::setFocusNew(bool f) { + resource.focus_new = f; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".focusNewWindows" << ends; + config.setValue(s.str(), resource.focus_new); + s.rdbuf()->freeze(0); +} + + +void BScreen::setFocusLast(bool f) { + resource.focus_last = f; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".focusLastWindow" << ends; + config.setValue(s.str(), resource.focus_last); + s.rdbuf()->freeze(0); +} + + +void BScreen::setWindowZones(int z) { + resource.zones = z; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".windowZones" << ends; + config.setValue(s.str(), resource.zones); + s.rdbuf()->freeze(0); +} + + +void BScreen::setWorkspaceCount(int w) { + resource.workspaces = w; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".workspaces" << ends; + config.setValue(s.str(), resource.workspaces); + s.rdbuf()->freeze(0); +} + + +void BScreen::setPlacementPolicy(int p) { + resource.placement_policy = p; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".windowPlacement" << ends; + const char *placement; + switch (resource.placement_policy) { + case CascadePlacement: placement = "CascadePlacement"; break; + case BestFitPlacement: placement = "BestFitPlacement"; break; + case ColSmartPlacement: placement = "ColSmartPlacement"; break; + case UnderMousePlacement: placement = "UnderMousePlacement"; break; + case ClickMousePlacement: placement = "ClickMousePlacement"; break; + default: + case RowSmartPlacement: placement = "RowSmartPlacement"; break; + } + config.setValue(s.str(), placement); + s.rdbuf()->freeze(0); +} + + +void BScreen::setEdgeSnapThreshold(int t) { + resource.edge_snap_threshold = t; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".edgeSnapThreshold" << ends; + config.setValue(s.str(), resource.edge_snap_threshold); + s.rdbuf()->freeze(0); +} + + +void BScreen::setRowPlacementDirection(int d) { + resource.row_direction = d; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".rowPlacementDirection" << ends; + config.setValue(s.str(), + resource.row_direction == LeftRight ? + "LeftToRight" : "RightToLeft"); + s.rdbuf()->freeze(0); +} + + +void BScreen::setColPlacementDirection(int d) { + resource.col_direction = d; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".colPlacementDirection" << ends; + config.setValue(s.str(), + resource.col_direction == TopBottom ? + "TopToBottom" : "BottomToTop"); + s.rdbuf()->freeze(0); +} + + +void BScreen::setRootCommand(const char *cmd) { +if (resource.root_command != NULL) + delete [] resource.root_command; + if (cmd != NULL) + resource.root_command = bstrdup(cmd); + else + resource.root_command = NULL; + // this doesn't save to the Resources config because it can't be changed + // inside Openbox, and this way we dont add an empty command which would over- + // ride the styles command when none has been specified +} + + +#ifdef HAVE_STRFTIME +void BScreen::setStrftimeFormat(const char *f) { + if (resource.strftime_format != NULL) + delete [] resource.strftime_format; + + resource.strftime_format = bstrdup(f); + ostrstream s; + s << "session.screen" << getScreenNumber() << ".strftimeFormat" << ends; + config.setValue(s.str(), resource.strftime_format); + s.rdbuf()->freeze(0); +} + +#else // !HAVE_STRFTIME +void BScreen::setDateFormat(int f) { + resource.date_format = f; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".dateFormat" << ends; + config.setValue(s.str(), resource.date_format == B_EuropeanDate ? + "European" : "American"); + s.rdbuf()->freeze(0); +} + +void BScreen::setClock24Hour(Bool c) { + resource.clock24hour = c; + ostrstream s; + s << "session.screen" << getScreenNumber() << ".clockFormat" << ends; + config.setValue(s.str(), resource.clock24hour ? 24 : 12); + s.rdbuf()->freeze(0); +} +#endif // HAVE_STRFTIME + +void BScreen::setHideToolbar(bool b) { + resource.hide_toolbar = b; + if (resource.hide_toolbar) + getToolbar()->unMapToolbar(); + else + getToolbar()->mapToolbar(); + ostrstream s; + s << "session.screen" << getScreenNumber() << ".hideToolbar" << ends; + config.setValue(s.str(), resource.hide_toolbar ? "True" : "False"); + s.rdbuf()->freeze(0); +} + +void BScreen::saveWorkspaceNames() { + ostrstream rc, names; + + for (int i = 0; i < resource.workspaces; i++) { + Workspace *w = getWorkspace(i); + if (w != NULL) { + names << w->getName(); + if (i < resource.workspaces-1) + names << ","; + } + } + names << ends; + + rc << "session.screen" << getScreenNumber() << ".workspaceNames" << ends; + config.setValue(rc.str(), names.str()); + rc.rdbuf()->freeze(0); + names.rdbuf()->freeze(0); +} + +void BScreen::save() { + setSloppyFocus(resource.sloppy_focus); + setAutoRaise(resource.auto_raise); + setImageDither(imageDither(), false); + setOpaqueMove(resource.opaque_move); + setFullMax(resource.full_max); + setFocusNew(resource.focus_new); + setFocusLast(resource.focus_last); + setWindowZones(resource.zones); + setWorkspaceCount(resource.workspaces); + setPlacementPolicy(resource.placement_policy); + setEdgeSnapThreshold(resource.edge_snap_threshold); + setRowPlacementDirection(resource.row_direction); + setColPlacementDirection(resource.col_direction); + setRootCommand(resource.root_command); +#ifdef HAVE_STRFTIME + // it deletes the current value before setting the new one, so we have to + // duplicate the current value. + std::string s = resource.strftime_format; + setStrftimeFormat(s.c_str()); +#else // !HAVE_STRFTIME + setDateFormat(resource.date_format); + setClock24Hour(resource.clock24hour); +#endif // HAVE_STRFTIME + setHideToolbar(resource.hide_toolbar); +} + + +void BScreen::load() { + ostrstream rscreen, rname, rclass; + std::string s; + bool b; + long l; + rscreen << "session.screen" << getScreenNumber() << '.' << ends; + + rname << rscreen.str() << "hideToolbar" << ends; + rclass << rscreen.str() << "HideToolbar" << ends; + if (config.getValue(rname.str(), rclass.str(), b)) + resource.hide_toolbar = b; + else + resource.hide_toolbar = false; + Toolbar *t = getToolbar(); + if (t != NULL) { + if (resource.hide_toolbar) + t->unMapToolbar(); + else + t->mapToolbar(); + } + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "fullMaximization" << ends; + rclass << rscreen.str() << "FullMaximization" << ends; + if (config.getValue(rname.str(), rclass.str(), b)) + resource.full_max = b; + else + resource.full_max = false; + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "focusNewWindows" << ends; + rclass << rscreen.str() << "FocusNewWindows" << ends; + if (config.getValue(rname.str(), rclass.str(), b)) + resource.focus_new = b; + else + resource.focus_new = false; + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "focusLastWindow" << ends; + rclass << rscreen.str() << "FocusLastWindow" << ends; + if (config.getValue(rname.str(), rclass.str(), b)) + resource.focus_last = b; + else + resource.focus_last = false; + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "rowPlacementDirection" << ends; + rclass << rscreen.str() << "RowPlacementDirection" << ends; + if (config.getValue(rname.str(), rclass.str(), s)) { + if (0 == strncasecmp(s.c_str(), "RightToLeft", s.length())) + resource.row_direction = RightLeft; + else //if (0 == strncasecmp(s.c_str(), "LeftToRight", s.length())) + resource.row_direction = LeftRight; + } else + resource.row_direction = LeftRight; + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "colPlacementDirection" << ends; + rclass << rscreen.str() << "ColPlacementDirection" << ends; + if (config.getValue(rname.str(), rclass.str(), s)) { + if (0 == strncasecmp(s.c_str(), "BottomToTop", s.length())) + resource.col_direction = BottomTop; + else //if (0 == strncasecmp(s.c_str(), "TopToBottom", s.length())) + resource.col_direction = TopBottom; + } else + resource.col_direction = TopBottom; + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "workspaces" << ends; + rclass << rscreen.str() << "Workspaces" << ends; + if (config.getValue(rname.str(), rclass.str(), l)) { + resource.workspaces = l; + } else + resource.workspaces = 1; + + removeWorkspaceNames(); + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "workspaceNames" << ends; + rclass << rscreen.str() << "WorkspaceNames" << ends; + if (config.getValue(rname.str(), rclass.str(), 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 + std::string name(tmp, it); // name = s[tmp:it] + addWorkspaceName(name.c_str()); + if (it == end) + break; + ++it; + } + } + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "focusModel" << ends; + rclass << rscreen.str() << "FocusModel" << ends; + if (config.getValue(rname.str(), rclass.str(), s)) { + if (0 == strncasecmp(s.c_str(), "ClickToFocus", s.length())) { + resource.auto_raise = false; + resource.sloppy_focus = false; + } else if (0 == strncasecmp(s.c_str(), "AutoRaiseSloppyFocus", + s.length())) { + resource.sloppy_focus = true; + resource.auto_raise = true; + } else { //if (0 == strncasecmp(s.c_str(), "SloppyFocus", s.length())) { + resource.sloppy_focus = true; + resource.auto_raise = false; + } + } else { + resource.sloppy_focus = true; + resource.auto_raise = false; + } + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "windowZones" << ends; + rclass << rscreen.str() << "WindowZones" << ends; + if (config.getValue(rname.str(), rclass.str(), l)) + resource.zones = (l == 1 || l == 2 || l == 4) ? l : 1; + else + resource.zones = 4; + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "windowPlacement" << ends; + rclass << rscreen.str() << "WindowPlacement" << ends; + if (config.getValue(rname.str(), rclass.str(), s)) { + if (0 == strncasecmp(s.c_str(), "RowSmartPlacement", s.length())) + resource.placement_policy = RowSmartPlacement; + else if (0 == strncasecmp(s.c_str(), "ColSmartPlacement", s.length())) + resource.placement_policy = ColSmartPlacement; + else if (0 == strncasecmp(s.c_str(), "BestFitPlacement", s.length())) + resource.placement_policy = BestFitPlacement; + else if (0 == strncasecmp(s.c_str(), "UnderMousePlacement", s.length())) + resource.placement_policy = UnderMousePlacement; + else if (0 == strncasecmp(s.c_str(), "ClickMousePlacement", s.length())) + resource.placement_policy = ClickMousePlacement; + else //if (0 == strncasecmp(s.c_str(), "CascadePlacement", s.length())) + resource.placement_policy = CascadePlacement; + } else + resource.placement_policy = CascadePlacement; + +#ifdef HAVE_STRFTIME + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "strftimeFormat" << ends; + rclass << rscreen.str() << "StrftimeFormat" << ends; + + if (resource.strftime_format != NULL) + delete [] resource.strftime_format; + + if (config.getValue(rname.str(), rclass.str(), s)) + resource.strftime_format = bstrdup(s.c_str()); + else + resource.strftime_format = bstrdup("%I:%M %p"); +#else // !HAVE_STRFTIME + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "dateFormat" << ends; + rclass << rscreen.str() << "DateFormat" << ends; + if (config.getValue(rname.str(), rclass.str(), s)) { + if (strncasecmp(s.c_str(), "European", s.length())) + resource.date_format = B_EuropeanDate; + else //if (strncasecmp(s.c_str(), "American", s.length())) + resource.date_format = B_AmericanDate; + } else + resource.date_format = B_AmericanDate; + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "clockFormat" << ends; + rclass << rscreen.str() << "ClockFormat" << ends; + if (config.getValue(rname.str(), rclass.str(), l)) { + if (clock == 24) + resource.clock24hour = true; + else if (clock == 12) + resource.clock24hour = false; + } else + resource.clock24hour = false; +#endif // HAVE_STRFTIME + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "edgeSnapThreshold" << ends; + rclass << rscreen.str() << "EdgeSnapThreshold" << ends; + if (config.getValue(rname.str(), rclass.str(), l)) + resource.edge_snap_threshold = l; + else + resource.edge_snap_threshold = 4; + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "imageDither" << ends; + rclass << rscreen.str() << "ImageDither" << ends; + if (config.getValue(rname.str(), rclass.str(), b)) + image_control->setDither(b); + else + image_control->setDither(true); + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "rootCommand" << ends; + rclass << rscreen.str() << "RootCommand" << ends; + + if (resource.root_command != NULL) + delete [] resource.root_command; + + if (config.getValue(rname.str(), rclass.str(), s)) + resource.root_command = bstrdup(s.c_str()); + else + resource.root_command = NULL; + + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "opaqueMove" << ends; + rclass << rscreen.str() << "OpaqueMove" << ends; + if (config.getValue(rname.str(), rclass.str(), b)) + resource.opaque_move = b; + else + resource.opaque_move = false; + + rscreen.rdbuf()->freeze(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); +} + void BScreen::reconfigure(void) { + load(); + toolbar->load(); +#ifdef SLIT + slit->load(); +#endif // SLIT LoadStyle(); XGCValues gcv; @@ -993,15 +1571,20 @@ void BScreen::rereadMenu(void) { void BScreen::removeWorkspaceNames(void) { while (workspaceNames->count()) - delete [] workspaceNames->remove(0); + delete [] workspaceNames->remove(0); } void BScreen::LoadStyle(void) { Resource &conf = resource.styleconfig; - conf.setFile(openbox.getStyleFilename()); - if (!conf.load()) { + const char *sfile = openbox.getStyleFilename(); + bool loaded = false; + if (sfile != NULL) { + conf.setFile(sfile); + loaded = conf.load(); + } + if (!loaded) { conf.setFile(DEFAULTSTYLE); if (!conf.load()) { fprintf(stderr, i18n->getMessage(ScreenSet, ScreenDefaultStyleLoadFail, @@ -1340,13 +1923,15 @@ OpenboxWindow *BScreen::getIcon(int index) { if (index >= 0 && index < iconList->count()) return iconList->find(index); - return (OpenboxWindow *) 0; + return NULL; } int BScreen::addWorkspace(void) { Workspace *wkspc = new Workspace(*this, workspacesList->count()); workspacesList->insert(wkspc); + setWorkspaceCount(workspaceCount()+1); + saveWorkspaceNames(); workspacemenu->insert(wkspc->getName(), wkspc->getMenu(), wkspc->getWorkspaceID() + 2); @@ -1376,6 +1961,8 @@ int BScreen::removeLastWorkspace(void) { workspacesList->remove(wkspc); delete wkspc; + setWorkspaceCount(workspaceCount()-1); + saveWorkspaceNames(); toolbar->reconfigure(); @@ -1394,11 +1981,11 @@ void BScreen::changeWorkspaceID(int id) { workspacemenu->setItemSelected(current_workspace->getWorkspaceID() + 2, False); - if (openbox.getFocusedWindow() && - openbox.getFocusedWindow()->getScreen() == this && - (! openbox.getFocusedWindow()->isStuck())) { - current_workspace->setLastFocusedWindow(openbox.getFocusedWindow()); - openbox.setFocusedWindow((OpenboxWindow *) 0); + if (openbox.focusedWindow() && + openbox.focusedWindow()->getScreen() == this && + (! openbox.focusedWindow()->isStuck())) { + current_workspace->setLastFocusedWindow(openbox.focusedWindow()); + openbox.focusWindow((OpenboxWindow *) 0); } current_workspace = getWorkspace(id); @@ -1420,7 +2007,7 @@ void BScreen::changeWorkspaceID(int id) { void BScreen::addNetizen(Netizen *n) { - netizenList->insert(n); + netizenList.push_back(n); n->sendWorkspaceCount(); n->sendCurrentWorkspace(); @@ -1432,87 +2019,86 @@ void BScreen::addNetizen(Netizen *n) { w->getWorkspaceID()); } - Window f = ((openbox.getFocusedWindow()) ? - openbox.getFocusedWindow()->getClientWindow() : None); + Window f = ((openbox.focusedWindow()) ? + openbox.focusedWindow()->getClientWindow() : None); n->sendWindowFocus(f); } void BScreen::removeNetizen(Window w) { - LinkedListIterator it(netizenList); + netList::iterator it; int i = 0; - for (Netizen *n = it.current(); n; it++, i++, n = it.current()) - if (n->getWindowID() == w) { - Netizen *tmp = netizenList->remove(i); + for (it = netizenList.begin(); it != netizenList.end(); ++it) + if ((*it)->getWindowID() == w) { + Netizen *tmp = *it; + netizenList.erase(it); delete tmp; - break; } } void BScreen::updateNetizenCurrentWorkspace(void) { - LinkedListIterator it(netizenList); - for (Netizen *n = it.current(); n; it++, n = it.current()) - n->sendCurrentWorkspace(); + netList::iterator it; + for (it = netizenList.begin(); it != netizenList.end(); ++it) + (*it)->sendCurrentWorkspace(); } void BScreen::updateNetizenWorkspaceCount(void) { - LinkedListIterator it(netizenList); - for (Netizen *n = it.current(); n; it++, n = it.current()) - n->sendWorkspaceCount(); + netList::iterator it; + for (it = netizenList.begin(); it != netizenList.end(); ++it) + (*it)->sendWorkspaceCount(); } void BScreen::updateNetizenWindowFocus(void) { - Window f = ((openbox.getFocusedWindow()) ? - openbox.getFocusedWindow()->getClientWindow() : None); - LinkedListIterator it(netizenList); - for (Netizen *n = it.current(); n; it++, n = it.current()) - n->sendWindowFocus(f); + Window f = ((openbox.focusedWindow()) ? + openbox.focusedWindow()->getClientWindow() : None); + netList::iterator it; + for (it = netizenList.begin(); it != netizenList.end(); ++it) + (*it)->sendWindowFocus(f); } - void BScreen::updateNetizenWindowAdd(Window w, unsigned long p) { - LinkedListIterator it(netizenList); - for (Netizen *n = it.current(); n; it++, n = it.current()) - n->sendWindowAdd(w, p); + netList::iterator it; + for (it = netizenList.begin(); it != netizenList.end(); ++it) + (*it)->sendWindowAdd(w, p); } void BScreen::updateNetizenWindowDel(Window w) { - LinkedListIterator it(netizenList); - for (Netizen *n = it.current(); n; it++, n = it.current()) - n->sendWindowDel(w); + netList::iterator it; + for (it = netizenList.begin(); it != netizenList.end(); ++it) + (*it)->sendWindowDel(w); } void BScreen::updateNetizenWindowRaise(Window w) { - LinkedListIterator it(netizenList); - for (Netizen *n = it.current(); n; it++, n = it.current()) - n->sendWindowRaise(w); + netList::iterator it; + for (it = netizenList.begin(); it != netizenList.end(); ++it) + (*it)->sendWindowRaise(w); } void BScreen::updateNetizenWindowLower(Window w) { - LinkedListIterator it(netizenList); - for (Netizen *n = it.current(); n; it++, n = it.current()) - n->sendWindowLower(w); + netList::iterator it; + for (it = netizenList.begin(); it != netizenList.end(); ++it) + (*it)->sendWindowLower(w); } void BScreen::updateNetizenConfigNotify(XEvent *e) { - LinkedListIterator it(netizenList); - for (Netizen *n = it.current(); n; it++, n = it.current()) - n->sendConfigNotify(e); + netList::iterator it; + for (it = netizenList.begin(); it != netizenList.end(); ++it) + (*it)->sendConfigNotify(e); } void BScreen::raiseWindows(Window *workspace_stack, int num) { Window *session_stack = new - Window[(num + workspacesList->count() + rootmenuList->count() + 13)]; + Window[(num + workspacesList->count() + rootmenuList.size() + 13)]; int i = 0, k = num; XRaiseWindow(getBaseDisplay().getXDisplay(), iconmenu->getWindowID()); @@ -1538,12 +2124,12 @@ void BScreen::raiseWindows(Window *workspace_stack, int num) { toolbar->getMenu()->getPlacementmenu()->getWindowID(); *(session_stack + i++) = toolbar->getMenu()->getWindowID(); - LinkedListIterator rit(rootmenuList); - for (Rootmenu *tmp = rit.current(); tmp; rit++, tmp = rit.current()) - *(session_stack + i++) = tmp->getWindowID(); + menuList::iterator rit; + for (rit = rootmenuList.begin(); rit != rootmenuList.end(); ++rit) + *(session_stack + i++) = (*rit)->getWindowID(); *(session_stack + i++) = rootmenu->getWindowID(); - if (toolbar->isOnTop()) + if (toolbar->onTop()) *(session_stack + i++) = toolbar->getWindowID(); #ifdef SLIT @@ -1560,23 +2146,12 @@ void BScreen::raiseWindows(Window *workspace_stack, int num) { } -#ifdef HAVE_STRFTIME -void BScreen::saveStrftimeFormat(const char *format) { - if (resource.strftime_format) - delete [] resource.strftime_format; - - resource.strftime_format = bstrdup(format); -} -#endif // HAVE_STRFTIME - - void BScreen::addWorkspaceName(const char *name) { workspaceNames->insert(bstrdup(name)); } - char* BScreen::getNameOfWorkspace(int id) { - char *name = (char *) 0; + char *name = NULL; if (id >= 0 && id < workspaceNames->count()) { char *wkspc_name = workspaceNames->find(id); @@ -1612,11 +2187,11 @@ void BScreen::nextFocus(void) { int focused_window_number = -1; OpenboxWindow *next; - if (openbox.getFocusedWindow()) { - if (openbox.getFocusedWindow()->getScreen()->getScreenNumber() == + if (openbox.focusedWindow()) { + if (openbox.focusedWindow()->getScreen()->getScreenNumber() == getScreenNumber()) { have_focused = True; - focused_window_number = openbox.getFocusedWindow()->getWindowNumber(); + focused_window_number = openbox.focusedWindow()->getWindowNumber(); } } @@ -1646,11 +2221,11 @@ void BScreen::prevFocus(void) { int focused_window_number = -1; OpenboxWindow *prev; - if (openbox.getFocusedWindow()) { - if (openbox.getFocusedWindow()->getScreen()->getScreenNumber() == + if (openbox.focusedWindow()) { + if (openbox.focusedWindow()->getScreen()->getScreenNumber() == getScreenNumber()) { have_focused = True; - focused_window_number = openbox.getFocusedWindow()->getWindowNumber(); + focused_window_number = openbox.focusedWindow()->getWindowNumber(); } } @@ -1679,24 +2254,24 @@ void BScreen::raiseFocus(void) { Bool have_focused = False; int focused_window_number = -1; - if (openbox.getFocusedWindow()) { - if (openbox.getFocusedWindow()->getScreen()->getScreenNumber() == + if (openbox.focusedWindow()) { + if (openbox.focusedWindow()->getScreen()->getScreenNumber() == getScreenNumber()) { have_focused = True; - focused_window_number = openbox.getFocusedWindow()->getWindowNumber(); + focused_window_number = openbox.focusedWindow()->getWindowNumber(); } } if ((getCurrentWorkspace()->getCount() > 1) && have_focused) - getWorkspace(openbox.getFocusedWindow()->getWorkspaceNumber())-> - raiseWindow(openbox.getFocusedWindow()); + getWorkspace(openbox.focusedWindow()->getWorkspaceNumber())-> + raiseWindow(openbox.focusedWindow()); } void BScreen::InitMenu(void) { if (rootmenu) { - while (rootmenuList->count()) - rootmenuList->remove(0); + while (!rootmenuList.empty()) + rootmenuList.erase(rootmenuList.begin()); while (rootmenu->getCount()) rootmenu->remove(0); @@ -1768,7 +2343,7 @@ void BScreen::InitMenu(void) { rootmenu->insert(i18n->getMessage(ScreenSet, ScreenExit, "Exit"), BScreen::Exit); } else { - openbox.saveMenuFilename(openbox.getMenuFilename()); + openbox.setMenuFilename(openbox.getMenuFilename()); } } @@ -1969,7 +2544,7 @@ Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) { if (! feof(submenufile)) { if (! parseMenuFile(submenufile, menu)) - openbox.saveMenuFilename(newfile); + openbox.setMenuFilename(newfile); fclose(submenufile); } @@ -1999,7 +2574,7 @@ Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) { parseMenuFile(file, submenu); submenu->update(); menu->insert(label, submenu); - rootmenuList->insert(submenu); + rootmenuList.push_back(submenu); } break; @@ -2099,7 +2674,7 @@ Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) { closedir(d); - std::sort(ls, ls + entries, dcmp()); + std::sort(ls, ls + entries, dcmp()); int n, slen = strlen(stylesdir); for (n = 0; n < entries; n++) { @@ -2125,10 +2700,10 @@ Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) { if (newmenu) { stylesmenu->setLabel(label); menu->insert(label, stylesmenu); - rootmenuList->insert(stylesmenu); + rootmenuList.push_back(stylesmenu); } - openbox.saveMenuFilename(stylesdir); + openbox.setMenuFilename(stylesdir); } else { fprintf(stderr, i18n->getMessage(ScreenSet, ScreenSTYLESDIRErrorNotDir, @@ -2265,14 +2840,3 @@ void BScreen::hideGeometry(void) { geom_visible = False; } } - -void BScreen::saveToolbarHide(Bool b){ - resource.toolbar_total_hide = b; - if (toolbar != NULL){ - if (b) - toolbar->unMapToolbar(); - else - toolbar->mapToolbar(); - } - -}