X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FScreen.cc;h=08b76971b267fed91dffc00f7d60b32f05fb5fc6;hb=a85c9a7c6e88d94a833941d3efc368cf11243579;hp=10c092d3a177514c378a79106a500e8c1f7252da;hpb=874d0ea446daac149e6b4b572f7e7196a855c8b9;p=chaz%2Fopenbox diff --git a/src/Screen.cc b/src/Screen.cc index 10c092d3..08b76971 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 @@ -102,13 +103,15 @@ #include #include #include +#include +using std::ends; static Bool running = True; static int anotherWMRunning(Display *display, XErrorEvent *) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenAnotherWMRunning, - "BScreen::BScreen: an error occured while querying the X server.\n" - " another window manager already running on display %s.\n"), + fprintf(stderr, i18n(ScreenSet, ScreenAnotherWMRunning, + "BScreen::BScreen: an error occured while querying the X server.\n" + " another window manager already running on display %s.\n"), DisplayString(display)); running = False; @@ -166,14 +169,14 @@ static const char *getFontSize(const char *pattern, int *size) { for (p=pattern; 1; p++) { if (!*p) { if (p2!=NULL && n>1 && n<72) { - *size = n; return p2+1; + *size = n; return p2+1; } else { - *size = 16; return NULL; + *size = 16; return NULL; } } else if (*p=='-') { if (n>1 && n<72 && p2!=NULL) { - *size = n; - return p2+1; + *size = n; + return p2+1; } p2=p; n=0; } else if (*p>='0' && *p<='9' && p2!=NULL) { @@ -187,33 +190,11 @@ static const char *getFontSize(const char *pattern, int *size) { BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), - openbox(ob), config(conf) +openbox(ob), config(conf) { - // default values - resource.full_max = false; - resource.focus_new = false; - resource.focus_last = false; - resource.row_direction = LeftRight; - resource.col_direction = TopBottom; - resource.workspaces = 1; - resource.sloppy_focus = true; - resource.auto_raise = false; - resource.zones = 1; - resource.placement_policy = CascadePlacement; -#ifdef HAVE_STRFTIME - resource.strftime_format = bstrdup("%I:%M %p"); -#else // !have_strftime - resource.date_format = B_AmericanDate; - resource.clock24hour = false; -#endif // HAVE_STRFTIME - resource.edge_snap_threshold = 4; - resource.image_dither = true; - resource.root_command = NULL; - resource.opaque_move = false; - event_mask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask | - SubstructureRedirectMask | KeyPressMask | KeyReleaseMask | - ButtonPressMask | ButtonReleaseMask; + SubstructureRedirectMask | KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask; XErrorHandler old = XSetErrorHandler((XErrorHandler) anotherWMRunning); XSelectInput(getBaseDisplay().getXDisplay(), getRootWindow(), event_mask); @@ -223,10 +204,10 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), managed = running; if (! managed) return; - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenManagingScreen, - "BScreen::BScreen: managing screen %d " - "using visual 0x%lx, depth %d\n"), - getScreenNumber(), XVisualIDFromVisual(getVisual()), + fprintf(stderr, i18n(ScreenSet, ScreenManagingScreen, + "BScreen::BScreen: managing screen %d " + "using visual 0x%lx, depth %d\n"), + getScreenNumber(), XVisualIDFromVisual(getVisual()), getDepth()); rootmenu = 0; @@ -235,11 +216,16 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), resource.tstyle.fontset = resource.wstyle.fontset = NULL; resource.mstyle.t_font = resource.mstyle.f_font = resource.tstyle.font = resource.wstyle.font = NULL; + resource.root_command = NULL; +#ifdef HAVE_STRFTIME + resource.strftime_format = NULL; +#endif // HAVE_STRFTIME #ifdef SLIT slit = NULL; #endif // SLIT toolbar = NULL; + current_workspace = (Workspace *) 0; #ifdef HAVE_GETPID pid_t bpid = getpid(); @@ -253,31 +239,23 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), XDefineCursor(getBaseDisplay().getXDisplay(), getRootWindow(), openbox.getSessionCursor()); - workspaceNames = new LinkedList; - workspacesList = new LinkedList; - rootmenuList = new LinkedList; - netizenList = new LinkedList; - iconList = new LinkedList; - image_control = new BImageControl(openbox, *this, True, openbox.getColorsPerChannel(), openbox.getCacheLife(), openbox.getCacheMax()); image_control->installRootColormap(); root_colormap_installed = True; - image_control->setDither(resource.image_dither); - load(); // load config options from Resources LoadStyle(); XGCValues gcv; unsigned long gc_value_mask = GCForeground; - if (! i18n->multibyte()) gc_value_mask |= GCFont; + if (! i18n.multibyte()) gc_value_mask |= GCFont; gcv.foreground = WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber()) - ^ BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber()); + getScreenNumber()) + ^ BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber()); gcv.function = GXxor; gcv.subwindow_mode = IncludeInferiors; opGC = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), @@ -288,81 +266,81 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), gcv.font = resource.wstyle.font->fid; resource.wstyle.l_text_focus_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - gc_value_mask, &gcv); + gc_value_mask, &gcv); gcv.foreground = resource.wstyle.l_text_unfocus.getPixel(); if (resource.wstyle.font) gcv.font = resource.wstyle.font->fid; resource.wstyle.l_text_unfocus_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - gc_value_mask, &gcv); + gc_value_mask, &gcv); gcv.foreground = resource.wstyle.b_pic_focus.getPixel(); resource.wstyle.b_pic_focus_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - GCForeground, &gcv); + GCForeground, &gcv); gcv.foreground = resource.wstyle.b_pic_unfocus.getPixel(); resource.wstyle.b_pic_unfocus_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - GCForeground, &gcv); + GCForeground, &gcv); gcv.foreground = resource.mstyle.t_text.getPixel(); if (resource.mstyle.t_font) gcv.font = resource.mstyle.t_font->fid; resource.mstyle.t_text_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - gc_value_mask, &gcv); + gc_value_mask, &gcv); gcv.foreground = resource.mstyle.f_text.getPixel(); if (resource.mstyle.f_font) gcv.font = resource.mstyle.f_font->fid; resource.mstyle.f_text_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - gc_value_mask, &gcv); + gc_value_mask, &gcv); gcv.foreground = resource.mstyle.h_text.getPixel(); resource.mstyle.h_text_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - gc_value_mask, &gcv); + gc_value_mask, &gcv); gcv.foreground = resource.mstyle.d_text.getPixel(); resource.mstyle.d_text_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - gc_value_mask, &gcv); + gc_value_mask, &gcv); gcv.foreground = resource.mstyle.hilite.getColor()->getPixel(); resource.mstyle.hilite_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - gc_value_mask, &gcv); + gc_value_mask, &gcv); gcv.foreground = resource.tstyle.l_text.getPixel(); if (resource.tstyle.font) gcv.font = resource.tstyle.font->fid; resource.tstyle.l_text_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - gc_value_mask, &gcv); + gc_value_mask, &gcv); gcv.foreground = resource.tstyle.w_text.getPixel(); resource.tstyle.w_text_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - gc_value_mask, &gcv); + gc_value_mask, &gcv); gcv.foreground = resource.tstyle.c_text.getPixel(); resource.tstyle.c_text_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - gc_value_mask, &gcv); + gc_value_mask, &gcv); gcv.foreground = resource.tstyle.b_pic.getPixel(); resource.tstyle.b_pic_gc = XCreateGC(getBaseDisplay().getXDisplay(), getRootWindow(), - gc_value_mask, &gcv); + gc_value_mask, &gcv); - const char *s = i18n->getMessage(ScreenSet, ScreenPositionLength, - "0: 0000 x 0: 0000"); + const char *s = i18n(ScreenSet, ScreenPositionLength, + "0: 0000 x 0: 0000"); int l = strlen(s); - if (i18n->multibyte()) { + if (i18n.multibyte()) { XRectangle ink, logical; XmbTextExtents(resource.wstyle.fontset, s, l, &ink, &logical); geom_w = logical.width; @@ -370,7 +348,7 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), geom_h = resource.wstyle.fontset_extents->max_ink_extent.height; } else { geom_h = resource.wstyle.font->ascent + - resource.wstyle.font->descent; + resource.wstyle.font->descent; geom_w = XTextWidth(resource.wstyle.font, s, l); } @@ -392,27 +370,27 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), if (resource.wstyle.l_focus.getTexture() & BImage_ParentRelative) { if (resource.wstyle.t_focus.getTexture() == - (BImage_Flat | BImage_Solid)) { + (BImage_Flat | BImage_Solid)) { geom_pixmap = None; XSetWindowBackground(getBaseDisplay().getXDisplay(), geom_window, - resource.wstyle.t_focus.getColor()->getPixel()); + resource.wstyle.t_focus.getColor()->getPixel()); } else { geom_pixmap = image_control->renderImage(geom_w, geom_h, - &resource.wstyle.t_focus); + &resource.wstyle.t_focus); XSetWindowBackgroundPixmap(getBaseDisplay().getXDisplay(), - geom_window, geom_pixmap); + geom_window, geom_pixmap); } } else { if (resource.wstyle.l_focus.getTexture() == - (BImage_Flat | BImage_Solid)) { + (BImage_Flat | BImage_Solid)) { geom_pixmap = None; XSetWindowBackground(getBaseDisplay().getXDisplay(), geom_window, - resource.wstyle.l_focus.getColor()->getPixel()); + resource.wstyle.l_focus.getColor()->getPixel()); } else { geom_pixmap = image_control->renderImage(geom_w, geom_h, - &resource.wstyle.l_focus); + &resource.wstyle.l_focus); XSetWindowBackgroundPixmap(getBaseDisplay().getXDisplay(), - geom_window, geom_pixmap); + geom_window, geom_pixmap); } } @@ -423,23 +401,23 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), Workspace *wkspc = NULL; if (resource.workspaces != 0) { for (int i = 0; i < resource.workspaces; ++i) { - wkspc = new Workspace(*this, workspacesList->count()); - workspacesList->insert(wkspc); - saveWorkspaceNames(); + wkspc = new Workspace(*this, workspacesList.size()); + workspacesList.push_back(wkspc); workspacemenu->insert(wkspc->getName(), wkspc->getMenu()); } } else { - wkspc = new Workspace(*this, workspacesList->count()); - workspacesList->insert(wkspc); - saveWorkspaceNames(); + setWorkspaceCount(1); + wkspc = new Workspace(*this, workspacesList.size()); + workspacesList.push_back(wkspc); workspacemenu->insert(wkspc->getName(), wkspc->getMenu()); } + saveWorkspaceNames(); - workspacemenu->insert(i18n->getMessage(IconSet, IconIcons, "Icons"), - iconmenu); + workspacemenu->insert(i18n(IconSet, IconIcons, "Icons"), + iconmenu); workspacemenu->update(); - current_workspace = workspacesList->first(); + current_workspace = workspacesList.front(); workspacemenu->setItemSelected(2, True); toolbar = new Toolbar(*this, config); @@ -459,18 +437,18 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), unsigned int nchild; Window r, p, *children; XQueryTree(getBaseDisplay().getXDisplay(), getRootWindow(), &r, &p, - &children, &nchild); + &children, &nchild); // preen the window list of all icon windows... for better dockapp support for (i = 0; i < (int) nchild; i++) { if (children[i] == None) continue; XWMHints *wmhints = XGetWMHints(getBaseDisplay().getXDisplay(), - children[i]); + children[i]); if (wmhints) { if ((wmhints->flags & IconWindowHint) && - (wmhints->icon_window != children[i])) + (wmhints->icon_window != children[i])) for (int j = 0; j < (int) nchild; j++) if (children[j] == wmhints->icon_window) { children[j] = None; @@ -500,16 +478,12 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), XMapRequestEvent mre; mre.window = children[i]; win->restoreAttributes(); - win->mapRequestEvent(&mre); + win->mapRequestEvent(&mre); } } } } - if (! resource.sloppy_focus) - XSetInputFocus(getBaseDisplay().getXDisplay(), toolbar->getWindowID(), - RevertToParent, CurrentTime); - XFree(children); XFlush(getBaseDisplay().getXDisplay()); } @@ -526,17 +500,10 @@ BScreen::~BScreen(void) { removeWorkspaceNames(); - while (workspacesList->count()) - delete workspacesList->remove(0); - - while (rootmenuList->count()) - rootmenuList->remove(0); - - while (iconList->count()) - delete iconList->remove(0); - - while (netizenList->count()) - delete netizenList->remove(0); + std::for_each(workspacesList.begin(), workspacesList.end(), + PointerAssassin()); + std::for_each(iconList.begin(), iconList.end(), PointerAssassin()); + std::for_each(netizenList.begin(), netizenList.end(), PointerAssassin()); #ifdef HAVE_STRFTIME if (resource.strftime_format) @@ -555,12 +522,6 @@ BScreen::~BScreen(void) { delete toolbar; delete image_control; - delete workspacesList; - delete workspaceNames; - delete rootmenuList; - delete iconList; - delete netizenList; - if (resource.wstyle.fontset) XFreeFontSet(getBaseDisplay().getXDisplay(), resource.wstyle.fontset); if (resource.mstyle.t_fontset) @@ -584,41 +545,143 @@ BScreen::~BScreen(void) { XFreeGC(getBaseDisplay().getXDisplay(), opGC); XFreeGC(getBaseDisplay().getXDisplay(), - resource.wstyle.l_text_focus_gc); + resource.wstyle.l_text_focus_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.wstyle.l_text_unfocus_gc); + resource.wstyle.l_text_unfocus_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.wstyle.b_pic_focus_gc); + resource.wstyle.b_pic_focus_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.wstyle.b_pic_unfocus_gc); + resource.wstyle.b_pic_unfocus_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.mstyle.t_text_gc); + resource.mstyle.t_text_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.mstyle.f_text_gc); + resource.mstyle.f_text_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.mstyle.h_text_gc); + resource.mstyle.h_text_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.mstyle.d_text_gc); + resource.mstyle.d_text_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.mstyle.hilite_gc); + resource.mstyle.hilite_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.tstyle.l_text_gc); + resource.tstyle.l_text_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.tstyle.w_text_gc); + resource.tstyle.w_text_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.tstyle.c_text_gc); + resource.tstyle.c_text_gc); XFreeGC(getBaseDisplay().getXDisplay(), - resource.tstyle.b_pic_gc); + 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(); + unsigned 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) + BTexture *texture, + unsigned long default_pixel) { std::string s; - + if (resource.styleconfig.getValue(rname, rclass, s)) image_control->parseTexture(texture, s.c_str()); else @@ -633,7 +696,7 @@ void BScreen::readDatabaseTexture(const char *rname, const char *rclass, sprintf(colorname, "%s.color", rname); readDatabaseColor(colorname, colorclass, texture->getColor(), - default_pixel); + default_pixel); #ifdef INTERLACE sprintf(colorclass, "%s.ColorTo", rclass); @@ -647,42 +710,42 @@ void BScreen::readDatabaseTexture(const char *rname, const char *rclass, delete [] colorname; if ((! texture->getColor()->isAllocated()) || - (texture->getTexture() & BImage_Flat)) + (texture->getTexture() & BImage_Flat)) return; XColor xcol; xcol.red = (unsigned int) (texture->getColor()->getRed() + - (texture->getColor()->getRed() >> 1)); + (texture->getColor()->getRed() >> 1)); if (xcol.red >= 0xff) xcol.red = 0xffff; else xcol.red *= 0xff; xcol.green = (unsigned int) (texture->getColor()->getGreen() + - (texture->getColor()->getGreen() >> 1)); + (texture->getColor()->getGreen() >> 1)); if (xcol.green >= 0xff) xcol.green = 0xffff; else xcol.green *= 0xff; xcol.blue = (unsigned int) (texture->getColor()->getBlue() + - (texture->getColor()->getBlue() >> 1)); + (texture->getColor()->getBlue() >> 1)); if (xcol.blue >= 0xff) xcol.blue = 0xffff; else xcol.blue *= 0xff; if (! XAllocColor(getBaseDisplay().getXDisplay(), - getColormap(), &xcol)) + getColormap(), &xcol)) xcol.pixel = 0; texture->getHiColor()->setPixel(xcol.pixel); xcol.red = (unsigned int) ((texture->getColor()->getRed() >> 2) + - (texture->getColor()->getRed() >> 1)) * 0xff; + (texture->getColor()->getRed() >> 1)) * 0xff; xcol.green = (unsigned int) ((texture->getColor()->getGreen() >> 2) + - (texture->getColor()->getGreen() >> 1)) * 0xff; + (texture->getColor()->getGreen() >> 1)) * 0xff; xcol.blue = (unsigned int) ((texture->getColor()->getBlue() >> 2) + - (texture->getColor()->getBlue() >> 1)) * 0xff; + (texture->getColor()->getBlue() >> 1)) * 0xff; if (! XAllocColor(getBaseDisplay().getXDisplay(), - getColormap(), &xcol)) + getColormap(), &xcol)) xcol.pixel = 0; texture->getLoColor()->setPixel(xcol.pixel); @@ -690,7 +753,7 @@ void BScreen::readDatabaseTexture(const char *rname, const char *rclass, int clen = strlen(rclass) + 10, nlen = strlen(rname) + 10; char *colorclass = new char[clen], *colorname = new char[nlen], - *colortoclass = new char[clen], *colortoname = new char[nlen]; + *colortoclass = new char[clen], *colortoname = new char[nlen]; sprintf(colorclass, "%s.Color", rclass); sprintf(colorname, "%s.color", rname); @@ -699,9 +762,9 @@ void BScreen::readDatabaseTexture(const char *rname, const char *rclass, sprintf(colortoname, "%s.colorTo", rname); readDatabaseColor(colorname, colorclass, texture->getColor(), - default_pixel); + default_pixel); readDatabaseColor(colortoname, colortoclass, texture->getColorTo(), - default_pixel); + default_pixel); delete [] colorclass; delete [] colorname; @@ -715,11 +778,11 @@ void BScreen::readDatabaseColor(const char *rname, const char *rclass, BColor *color, unsigned long default_pixel) { std::string s; - + 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); @@ -728,7 +791,7 @@ void BScreen::readDatabaseColor(const char *rname, const char *rclass, void BScreen::readDatabaseFontSet(const char *rname, const char *rclass, - XFontSet *fontset) { + XFontSet *fontset) { if (! fontset) return; static char *defaultFont = "fixed"; @@ -748,8 +811,8 @@ void BScreen::readDatabaseFontSet(const char *rname, const char *rclass, *fontset = createFontSet(defaultFont); if (! *fontset) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenDefaultFontLoadFail, - "BScreen::LoadStyle(): couldn't load default font.\n")); + fprintf(stderr, i18n(ScreenSet, ScreenDefaultFontLoadFail, + "BScreen::LoadStyle(): couldn't load default font.\n")); exit(2); } } @@ -769,10 +832,10 @@ void BScreen::readDatabaseFont(const char *rname, const char *rclass, if (resource.styleconfig.getValue(rname, rclass, s)) { if ((*font = XLoadQueryFont(getBaseDisplay().getXDisplay(), - s.c_str())) == NULL) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenFontLoadFail, - "BScreen::LoadStyle(): couldn't load font '%s'\n"), - s.c_str()); + s.c_str())) == NULL) { + fprintf(stderr, i18n(ScreenSet, ScreenFontLoadFail, + "BScreen::LoadStyle(): couldn't load font '%s'\n"), + s.c_str()); load_default = true; } } else @@ -780,9 +843,9 @@ void BScreen::readDatabaseFont(const char *rname, const char *rclass, if (load_default) { if ((*font = XLoadQueryFont(getBaseDisplay().getXDisplay(), - defaultFont)) == NULL) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenDefaultFontLoadFail, - "BScreen::LoadStyle(): couldn't load default font.\n")); + defaultFont)) == NULL) { + fprintf(stderr, i18n(ScreenSet, ScreenDefaultFontLoadFail, + "BScreen::LoadStyle(): couldn't load default font.\n")); exit(2); } } @@ -796,7 +859,7 @@ XFontSet BScreen::createFontSet(const char *fontname) { char weight[FONT_ELEMENT_SIZE], slant[FONT_ELEMENT_SIZE]; fs = XCreateFontSet(getBaseDisplay().getXDisplay(), - fontname, &missing, &nmissing, &def); + fontname, &missing, &nmissing, &def); if (fs && (! nmissing)) return fs; #ifdef HAVE_SETLOCALE @@ -805,7 +868,7 @@ XFontSet BScreen::createFontSet(const char *fontname) { setlocale(LC_CTYPE, "C"); fs = XCreateFontSet(getBaseDisplay().getXDisplay(), fontname, - &missing, &nmissing, &def); + &missing, &nmissing, &def); setlocale(LC_CTYPE, ""); } #endif // HAVE_SETLOCALE @@ -818,9 +881,9 @@ XFontSet BScreen::createFontSet(const char *fontname) { } getFontElement(fontname, weight, FONT_ELEMENT_SIZE, - "-medium-", "-bold-", "-demibold-", "-regular-", NULL); + "-medium-", "-bold-", "-demibold-", "-regular-", NULL); getFontElement(fontname, slant, FONT_ELEMENT_SIZE, - "-r-", "-i-", "-o-", "-ri-", "-ro-", NULL); + "-r-", "-i-", "-o-", "-ri-", "-ro-", NULL); getFontSize(fontname, &pixel_size); if (! strcmp(weight, "*")) strncpy(weight, "medium", FONT_ELEMENT_SIZE); @@ -831,17 +894,17 @@ XFontSet BScreen::createFontSet(const char *fontname) { buf_size = strlen(fontname) + (FONT_ELEMENT_SIZE * 2) + 64; char *pattern2 = new char[buf_size]; snprintf(pattern2, buf_size - 1, - "%s," - "-*-*-%s-%s-*-*-%d-*-*-*-*-*-*-*," - "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,*", - fontname, weight, slant, pixel_size, pixel_size); + "%s," + "-*-*-%s-%s-*-*-%d-*-*-*-*-*-*-*," + "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,*", + fontname, weight, slant, pixel_size, pixel_size); fontname = pattern2; if (nmissing) XFreeStringList(missing); if (fs) XFreeFontSet(getBaseDisplay().getXDisplay(), fs); fs = XCreateFontSet(getBaseDisplay().getXDisplay(), fontname, - &missing, &nmissing, &def); + &missing, &nmissing, &def); delete [] pattern2; return fs; @@ -850,40 +913,42 @@ XFontSet BScreen::createFontSet(const char *fontname) { void BScreen::setSloppyFocus(bool b) { resource.sloppy_focus = b; - ostrstream s; + std::ostrstream s; s << "session.screen" << getScreenNumber() << ".focusModel" << ends; config.setValue(s.str(), (resource.sloppy_focus ? - (resource.auto_raise ? "AutoRaiseSloppyFocus" : "SloppyFocus") - : "ClickToFocus")); + (resource.auto_raise ? "AutoRaiseSloppyFocus" : "SloppyFocus") + : "ClickToFocus")); s.rdbuf()->freeze(0); } void BScreen::setAutoRaise(bool a) { resource.auto_raise = a; - ostrstream s; + std::ostrstream s; s << "session.screen" << getScreenNumber() << ".focusModel" << ends; config.setValue(s.str(), (resource.sloppy_focus ? - (resource.auto_raise ? "AutoRaiseSloppyFocus" : "SloppyFocus") - : "ClickToFocus")); + (resource.auto_raise ? "AutoRaiseSloppyFocus" : "SloppyFocus") + : "ClickToFocus")); s.rdbuf()->freeze(0); } -void BScreen::setImageDither(bool d) { - resource.image_dither = d; - ostrstream s; +void BScreen::setImageDither(bool d, bool reconfig) { + image_control->setDither(d); + std::ostrstream s; s << "session.screen" << getScreenNumber() << ".imageDither" << ends; - config.setValue(s.str(), resource.image_dither); + config.setValue(s.str(), imageDither()); + if (reconfig) + reconfigure(); s.rdbuf()->freeze(0); } void BScreen::setOpaqueMove(bool o) { resource.opaque_move = o; - ostrstream s; + std::ostrstream s; s << "session.screen" << getScreenNumber() << ".opaqueMove" << ends; config.setValue(s.str(), resource.opaque_move); s.rdbuf()->freeze(0); @@ -892,7 +957,7 @@ void BScreen::setOpaqueMove(bool o) { void BScreen::setFullMax(bool f) { resource.full_max = f; - ostrstream s; + std::ostrstream s; s << "session.screen" << getScreenNumber() << ".fullMaximization" << ends; config.setValue(s.str(), resource.full_max); s.rdbuf()->freeze(0); @@ -901,7 +966,7 @@ void BScreen::setFullMax(bool f) { void BScreen::setFocusNew(bool f) { resource.focus_new = f; - ostrstream s; + std::ostrstream s; s << "session.screen" << getScreenNumber() << ".focusNewWindows" << ends; config.setValue(s.str(), resource.focus_new); s.rdbuf()->freeze(0); @@ -910,7 +975,7 @@ void BScreen::setFocusNew(bool f) { void BScreen::setFocusLast(bool f) { resource.focus_last = f; - ostrstream s; + std::ostrstream s; s << "session.screen" << getScreenNumber() << ".focusLastWindow" << ends; config.setValue(s.str(), resource.focus_last); s.rdbuf()->freeze(0); @@ -919,7 +984,7 @@ void BScreen::setFocusLast(bool f) { void BScreen::setWindowZones(int z) { resource.zones = z; - ostrstream s; + std::ostrstream s; s << "session.screen" << getScreenNumber() << ".windowZones" << ends; config.setValue(s.str(), resource.zones); s.rdbuf()->freeze(0); @@ -928,7 +993,7 @@ void BScreen::setWindowZones(int z) { void BScreen::setWorkspaceCount(int w) { resource.workspaces = w; - ostrstream s; + std::ostrstream s; s << "session.screen" << getScreenNumber() << ".workspaces" << ends; config.setValue(s.str(), resource.workspaces); s.rdbuf()->freeze(0); @@ -937,13 +1002,15 @@ void BScreen::setWorkspaceCount(int w) { void BScreen::setPlacementPolicy(int p) { resource.placement_policy = p; - ostrstream s; + std::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; } @@ -954,7 +1021,7 @@ void BScreen::setPlacementPolicy(int p) { void BScreen::setEdgeSnapThreshold(int t) { resource.edge_snap_threshold = t; - ostrstream s; + std::ostrstream s; s << "session.screen" << getScreenNumber() << ".edgeSnapThreshold" << ends; config.setValue(s.str(), resource.edge_snap_threshold); s.rdbuf()->freeze(0); @@ -963,9 +1030,8 @@ void BScreen::setEdgeSnapThreshold(int t) { void BScreen::setRowPlacementDirection(int d) { resource.row_direction = d; - ostrstream s; - s << "session.screen" << getScreenNumber() << ".rowPlacementDirection" << - ends; + std::ostrstream s; + s << "session.screen" << getScreenNumber() << ".rowPlacementDirection" << ends; config.setValue(s.str(), resource.row_direction == LeftRight ? "LeftToRight" : "RightToLeft"); @@ -975,9 +1041,8 @@ void BScreen::setRowPlacementDirection(int d) { void BScreen::setColPlacementDirection(int d) { resource.col_direction = d; - ostrstream s; - s << "session.screen" << getScreenNumber() << ".colPlacementDirection" << - ends; + std::ostrstream s; + s << "session.screen" << getScreenNumber() << ".colPlacementDirection" << ends; config.setValue(s.str(), resource.col_direction == TopBottom ? "TopToBottom" : "BottomToTop"); @@ -986,7 +1051,7 @@ void BScreen::setColPlacementDirection(int d) { void BScreen::setRootCommand(const char *cmd) { -if (resource.root_command != NULL) + if (resource.root_command != NULL) delete [] resource.root_command; if (cmd != NULL) resource.root_command = bstrdup(cmd); @@ -1004,53 +1069,56 @@ void BScreen::setStrftimeFormat(const char *f) { delete [] resource.strftime_format; resource.strftime_format = bstrdup(f); - ostrstream s; + std::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; + std::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; + std::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; + std::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 << ','; - } + std::ostrstream rc, names; + + wkspList::iterator it; + wkspList::iterator last = workspacesList.end() - 1; + for (it = workspacesList.begin(); it != workspacesList.end(); ++it) { + names << (*it)->getName(); + if (it != last) + names << ","; } names << ends; @@ -1063,7 +1131,7 @@ void BScreen::saveWorkspaceNames() { void BScreen::save() { setSloppyFocus(resource.sloppy_focus); setAutoRaise(resource.auto_raise); - setImageDither(resource.image_dither); + setImageDither(imageDither(), false); setOpaqueMove(resource.opaque_move); setFullMax(resource.full_max); setFocusNew(resource.focus_new); @@ -1085,8 +1153,14 @@ void BScreen::save() { setClock24Hour(resource.clock24hour); #endif // HAVE_STRFTIME setHideToolbar(resource.hide_toolbar); + + toolbar->save(); +#ifdef SLIT + slit->save(); +#endif // SLIT } + void BScreen::load() { std::ostrstream rscreen, rname, rclass; std::string s; @@ -1098,6 +1172,8 @@ void BScreen::load() { 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) @@ -1107,51 +1183,68 @@ void BScreen::load() { } 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())) + 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())) + 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)) + 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)) { @@ -1166,8 +1259,9 @@ void BScreen::load() { ++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)) { @@ -1178,1538 +1272,1562 @@ void BScreen::load() { s.length())) { resource.sloppy_focus = true; resource.auto_raise = true; - } else if (0 == strncasecmp(s.c_str(), "SloppyFocus", s.length())) { + } 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 << 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; - rname.seekp(0); rclass.seekp(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(), "CascadePlacement", s.length())) + 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 << rscreen.str() << "strftimeFormat" << ends; - rclass << rscreen.str() << "StrftimeFormat" << ends; + 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; - resource.strftime_format=NULL; - } + if (resource.strftime_format != NULL) + delete [] resource.strftime_format; - if (config.getValue(rname.str(), rclass.str(), s)) { - resource.strftime_format = bstrdup(s.c_str()); - } + 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 << 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())) + 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 << 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) + 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 << rscreen.str() << "edgeSnapThreshold" << ends; - rclass << rscreen.str() << "EdgeSnapThreshold" << ends; - if (config.getValue(rname.str(), rclass.str(), l)) - resource.edge_snap_threshold = l; + 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 << rscreen.str() << "imageDither" << ends; - rclass << rscreen.str() << "ImageDither" << ends; - if (config.getValue(rname.str(), rclass.str(), b)) - resource.image_dither = b; + rname.seekp(0); rclass.seekp(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "rootCommand" << ends; + rclass << rscreen.str() << "RootCommand" << ends; - rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "rootCommand" << ends; - rclass << rscreen.str() << "RootCommand" << ends; + if (resource.root_command != NULL) + delete [] resource.root_command; - if (resource.root_command != NULL){ - delete [] resource.root_command; - resource.root_command=NULL; - } - if (config.getValue(rname.str(), rclass.str(), s)) { - resource.root_command = bstrdup(s.c_str()); - } + 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; - rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "opaqueMove" << ends; - rclass << rscreen.str() << "OpaqueMove" << ends; - if (config.getValue(rname.str(), rclass.str(), b)) - resource.opaque_move = b; - rscreen.rdbuf()->freeze(0); - rname.rdbuf()->freeze(0); - rclass.rdbuf()->freeze(0); -} + rscreen.rdbuf()->freeze(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + } -void BScreen::reconfigure(void) { - load(); - toolbar->load(); + void BScreen::reconfigure(void) { + load(); + toolbar->load(); #ifdef SLIT - slit->load(); + slit->load(); #endif // SLIT - LoadStyle(); - - XGCValues gcv; - unsigned long gc_value_mask = GCForeground; - if (! i18n->multibyte()) gc_value_mask |= GCFont; - - gcv.foreground = WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber()); - gcv.function = GXinvert; - gcv.subwindow_mode = IncludeInferiors; - XChangeGC(getBaseDisplay().getXDisplay(), opGC, - GCForeground | GCFunction | GCSubwindowMode, &gcv); - - gcv.foreground = resource.wstyle.l_text_focus.getPixel(); - if (resource.wstyle.font) - gcv.font = resource.wstyle.font->fid; - XChangeGC(getBaseDisplay().getXDisplay(), resource.wstyle.l_text_focus_gc, - gc_value_mask, &gcv); - - gcv.foreground = resource.wstyle.l_text_unfocus.getPixel(); - XChangeGC(getBaseDisplay().getXDisplay(), resource.wstyle.l_text_unfocus_gc, - gc_value_mask, &gcv); - - gcv.foreground = resource.wstyle.b_pic_focus.getPixel(); - XChangeGC(getBaseDisplay().getXDisplay(), resource.wstyle.b_pic_focus_gc, - GCForeground, &gcv); - - gcv.foreground = resource.wstyle.b_pic_unfocus.getPixel(); - XChangeGC(getBaseDisplay().getXDisplay(), resource.wstyle.b_pic_unfocus_gc, - GCForeground, &gcv); - - gcv.foreground = resource.mstyle.t_text.getPixel(); - if (resource.mstyle.t_font) - gcv.font = resource.mstyle.t_font->fid; - XChangeGC(getBaseDisplay().getXDisplay(), resource.mstyle.t_text_gc, - gc_value_mask, &gcv); - - gcv.foreground = resource.mstyle.f_text.getPixel(); - if (resource.mstyle.f_font) - gcv.font = resource.mstyle.f_font->fid; - XChangeGC(getBaseDisplay().getXDisplay(), resource.mstyle.f_text_gc, - gc_value_mask, &gcv); - - gcv.foreground = resource.mstyle.h_text.getPixel(); - XChangeGC(getBaseDisplay().getXDisplay(), resource.mstyle.h_text_gc, - gc_value_mask, &gcv); - - gcv.foreground = resource.mstyle.d_text.getPixel(); - XChangeGC(getBaseDisplay().getXDisplay(), resource.mstyle.d_text_gc, - gc_value_mask, &gcv); - - gcv.foreground = resource.mstyle.hilite.getColor()->getPixel(); - XChangeGC(getBaseDisplay().getXDisplay(), resource.mstyle.hilite_gc, - gc_value_mask, &gcv); - - gcv.foreground = resource.tstyle.l_text.getPixel(); - if (resource.tstyle.font) - gcv.font = resource.tstyle.font->fid; - XChangeGC(getBaseDisplay().getXDisplay(), resource.tstyle.l_text_gc, - gc_value_mask, &gcv); - - gcv.foreground = resource.tstyle.w_text.getPixel(); - XChangeGC(getBaseDisplay().getXDisplay(), resource.tstyle.w_text_gc, - gc_value_mask, &gcv); - - gcv.foreground = resource.tstyle.c_text.getPixel(); - XChangeGC(getBaseDisplay().getXDisplay(), resource.tstyle.c_text_gc, - gc_value_mask, &gcv); - - gcv.foreground = resource.tstyle.b_pic.getPixel(); - XChangeGC(getBaseDisplay().getXDisplay(), resource.tstyle.b_pic_gc, - gc_value_mask, &gcv); - - const char *s = i18n->getMessage(ScreenSet, ScreenPositionLength, - "0: 0000 x 0: 0000"); - int l = strlen(s); - - if (i18n->multibyte()) { - XRectangle ink, logical; - XmbTextExtents(resource.wstyle.fontset, s, l, &ink, &logical); - geom_w = logical.width; - - geom_h = resource.wstyle.fontset_extents->max_ink_extent.height; - } else { - geom_w = XTextWidth(resource.wstyle.font, s, l); + LoadStyle(); + + XGCValues gcv; + unsigned long gc_value_mask = GCForeground; + if (! i18n.multibyte()) gc_value_mask |= GCFont; + + gcv.foreground = WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber()); + gcv.function = GXinvert; + gcv.subwindow_mode = IncludeInferiors; + XChangeGC(getBaseDisplay().getXDisplay(), opGC, + GCForeground | GCFunction | GCSubwindowMode, &gcv); + + gcv.foreground = resource.wstyle.l_text_focus.getPixel(); + if (resource.wstyle.font) + gcv.font = resource.wstyle.font->fid; + XChangeGC(getBaseDisplay().getXDisplay(), resource.wstyle.l_text_focus_gc, + gc_value_mask, &gcv); + + gcv.foreground = resource.wstyle.l_text_unfocus.getPixel(); + XChangeGC(getBaseDisplay().getXDisplay(), resource.wstyle.l_text_unfocus_gc, + gc_value_mask, &gcv); + + gcv.foreground = resource.wstyle.b_pic_focus.getPixel(); + XChangeGC(getBaseDisplay().getXDisplay(), resource.wstyle.b_pic_focus_gc, + GCForeground, &gcv); + + gcv.foreground = resource.wstyle.b_pic_unfocus.getPixel(); + XChangeGC(getBaseDisplay().getXDisplay(), resource.wstyle.b_pic_unfocus_gc, + GCForeground, &gcv); + + gcv.foreground = resource.mstyle.t_text.getPixel(); + if (resource.mstyle.t_font) + gcv.font = resource.mstyle.t_font->fid; + XChangeGC(getBaseDisplay().getXDisplay(), resource.mstyle.t_text_gc, + gc_value_mask, &gcv); + + gcv.foreground = resource.mstyle.f_text.getPixel(); + if (resource.mstyle.f_font) + gcv.font = resource.mstyle.f_font->fid; + XChangeGC(getBaseDisplay().getXDisplay(), resource.mstyle.f_text_gc, + gc_value_mask, &gcv); + + gcv.foreground = resource.mstyle.h_text.getPixel(); + XChangeGC(getBaseDisplay().getXDisplay(), resource.mstyle.h_text_gc, + gc_value_mask, &gcv); + + gcv.foreground = resource.mstyle.d_text.getPixel(); + XChangeGC(getBaseDisplay().getXDisplay(), resource.mstyle.d_text_gc, + gc_value_mask, &gcv); + + gcv.foreground = resource.mstyle.hilite.getColor()->getPixel(); + XChangeGC(getBaseDisplay().getXDisplay(), resource.mstyle.hilite_gc, + gc_value_mask, &gcv); + + gcv.foreground = resource.tstyle.l_text.getPixel(); + if (resource.tstyle.font) + gcv.font = resource.tstyle.font->fid; + XChangeGC(getBaseDisplay().getXDisplay(), resource.tstyle.l_text_gc, + gc_value_mask, &gcv); + + gcv.foreground = resource.tstyle.w_text.getPixel(); + XChangeGC(getBaseDisplay().getXDisplay(), resource.tstyle.w_text_gc, + gc_value_mask, &gcv); + + gcv.foreground = resource.tstyle.c_text.getPixel(); + XChangeGC(getBaseDisplay().getXDisplay(), resource.tstyle.c_text_gc, + gc_value_mask, &gcv); + + gcv.foreground = resource.tstyle.b_pic.getPixel(); + XChangeGC(getBaseDisplay().getXDisplay(), resource.tstyle.b_pic_gc, + gc_value_mask, &gcv); + + const char *s = i18n(ScreenSet, ScreenPositionLength, + "0: 0000 x 0: 0000"); + int l = strlen(s); + + if (i18n.multibyte()) { + XRectangle ink, logical; + XmbTextExtents(resource.wstyle.fontset, s, l, &ink, &logical); + geom_w = logical.width; + + geom_h = resource.wstyle.fontset_extents->max_ink_extent.height; + } else { + geom_w = XTextWidth(resource.wstyle.font, s, l); - geom_h = resource.wstyle.font->ascent + - resource.wstyle.font->descent; - } + geom_h = resource.wstyle.font->ascent + + resource.wstyle.font->descent; + } - geom_w += (resource.bevel_width * 2); - geom_h += (resource.bevel_width * 2); + geom_w += (resource.bevel_width * 2); + geom_h += (resource.bevel_width * 2); - Pixmap tmp = geom_pixmap; - if (resource.wstyle.l_focus.getTexture() & BImage_ParentRelative) { - if (resource.wstyle.t_focus.getTexture() == - (BImage_Flat | BImage_Solid)) { - geom_pixmap = None; - XSetWindowBackground(getBaseDisplay().getXDisplay(), geom_window, - resource.wstyle.t_focus.getColor()->getPixel()); + Pixmap tmp = geom_pixmap; + if (resource.wstyle.l_focus.getTexture() & BImage_ParentRelative) { + if (resource.wstyle.t_focus.getTexture() == + (BImage_Flat | BImage_Solid)) { + geom_pixmap = None; + XSetWindowBackground(getBaseDisplay().getXDisplay(), geom_window, + resource.wstyle.t_focus.getColor()->getPixel()); + } else { + geom_pixmap = image_control->renderImage(geom_w, geom_h, + &resource.wstyle.t_focus); + XSetWindowBackgroundPixmap(getBaseDisplay().getXDisplay(), + geom_window, geom_pixmap); + } } else { - geom_pixmap = image_control->renderImage(geom_w, geom_h, - &resource.wstyle.t_focus); - XSetWindowBackgroundPixmap(getBaseDisplay().getXDisplay(), - geom_window, geom_pixmap); + if (resource.wstyle.l_focus.getTexture() == + (BImage_Flat | BImage_Solid)) { + geom_pixmap = None; + XSetWindowBackground(getBaseDisplay().getXDisplay(), geom_window, + resource.wstyle.l_focus.getColor()->getPixel()); + } else { + geom_pixmap = image_control->renderImage(geom_w, geom_h, + &resource.wstyle.l_focus); + XSetWindowBackgroundPixmap(getBaseDisplay().getXDisplay(), + geom_window, geom_pixmap); + } } - } else { - if (resource.wstyle.l_focus.getTexture() == - (BImage_Flat | BImage_Solid)) { - geom_pixmap = None; - XSetWindowBackground(getBaseDisplay().getXDisplay(), geom_window, - resource.wstyle.l_focus.getColor()->getPixel()); - } else { - geom_pixmap = image_control->renderImage(geom_w, geom_h, - &resource.wstyle.l_focus); - XSetWindowBackgroundPixmap(getBaseDisplay().getXDisplay(), - geom_window, geom_pixmap); + if (tmp) image_control->removeImage(tmp); + + XSetWindowBorderWidth(getBaseDisplay().getXDisplay(), geom_window, + resource.border_width); + XSetWindowBorder(getBaseDisplay().getXDisplay(), geom_window, + resource.border_color.getPixel()); + + workspacemenu->reconfigure(); + iconmenu->reconfigure(); + + { + int remember_sub = rootmenu->getCurrentSubmenu(); + InitMenu(); + raiseWindows(0, 0); + rootmenu->reconfigure(); + rootmenu->drawSubmenu(remember_sub); } - } - if (tmp) image_control->removeImage(tmp); - - XSetWindowBorderWidth(getBaseDisplay().getXDisplay(), geom_window, - resource.border_width); - XSetWindowBorder(getBaseDisplay().getXDisplay(), geom_window, - resource.border_color.getPixel()); - workspacemenu->reconfigure(); - iconmenu->reconfigure(); + configmenu->reconfigure(); - { - int remember_sub = rootmenu->getCurrentSubmenu(); - InitMenu(); - raiseWindows(0, 0); - rootmenu->reconfigure(); - rootmenu->drawSubmenu(remember_sub); - } - - configmenu->reconfigure(); - - toolbar->reconfigure(); + toolbar->reconfigure(); #ifdef SLIT - slit->reconfigure(); + slit->reconfigure(); #endif // SLIT - LinkedListIterator wit(workspacesList); - for (Workspace *w = wit.current(); w; wit++, w = wit.current()) - w->reconfigure(); + std::for_each(workspacesList.begin(), workspacesList.end(), + std::mem_fun(&Workspace::reconfigure)); - LinkedListIterator iit(iconList); - for (OpenboxWindow *bw = iit.current(); bw; iit++, bw = iit.current()) - if (bw->validateClient()) - bw->reconfigure(); + for (winList::iterator it = iconList.begin(); it != iconList.end(); ++it) + if ((*it)->validateClient()) + (*it)->reconfigure(); - image_control->timeout(); -} + image_control->timeout(); + } -void BScreen::rereadMenu(void) { - InitMenu(); - raiseWindows(0, 0); + void BScreen::rereadMenu(void) { + InitMenu(); + raiseWindows(0, 0); - rootmenu->reconfigure(); -} + rootmenu->reconfigure(); + } -void BScreen::removeWorkspaceNames(void) { - while (workspaceNames->count()) - delete [] workspaceNames->remove(0); -} + void BScreen::removeWorkspaceNames(void) { + workspaceNames.clear(); + } -void BScreen::LoadStyle(void) { - Resource &conf = resource.styleconfig; - - 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, - "BScreen::LoadStyle(): couldn't load " - "default style.\n")); - exit(2); + void BScreen::LoadStyle(void) { + Resource &conf = resource.styleconfig; + + 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(ScreenSet, ScreenDefaultStyleLoadFail, + "BScreen::LoadStyle(): couldn't load " + "default style.\n")); + exit(2); + } } - } - std::string s; - long l; - - // load fonts/fontsets - - if (i18n->multibyte()) { - readDatabaseFontSet("window.font", "Window.Font", - &resource.wstyle.fontset); - readDatabaseFontSet("toolbar.font", "Toolbar.Font", - &resource.tstyle.fontset); - readDatabaseFontSet("menu.title.font", "Menu.Title.Font", - &resource.mstyle.t_fontset); - readDatabaseFontSet("menu.frame.font", "Menu.Frame.Font", - &resource.mstyle.f_fontset); - - resource.mstyle.t_fontset_extents = - XExtentsOfFontSet(resource.mstyle.t_fontset); - resource.mstyle.f_fontset_extents = - XExtentsOfFontSet(resource.mstyle.f_fontset); - resource.tstyle.fontset_extents = - XExtentsOfFontSet(resource.tstyle.fontset); - resource.wstyle.fontset_extents = - XExtentsOfFontSet(resource.wstyle.fontset); - } else { - readDatabaseFont("window.font", "Window.Font", - &resource.wstyle.font); - readDatabaseFont("menu.title.font", "Menu.Title.Font", - &resource.mstyle.t_font); - readDatabaseFont("menu.frame.font", "Menu.Frame.Font", - &resource.mstyle.f_font); - readDatabaseFont("toolbar.font", "Toolbar.Font", - &resource.tstyle.font); - } + std::string s; + long l; + + // load fonts/fontsets + + if (i18n.multibyte()) { + readDatabaseFontSet("window.font", "Window.Font", + &resource.wstyle.fontset); + readDatabaseFontSet("toolbar.font", "Toolbar.Font", + &resource.tstyle.fontset); + readDatabaseFontSet("menu.title.font", "Menu.Title.Font", + &resource.mstyle.t_fontset); + readDatabaseFontSet("menu.frame.font", "Menu.Frame.Font", + &resource.mstyle.f_fontset); + + resource.mstyle.t_fontset_extents = + XExtentsOfFontSet(resource.mstyle.t_fontset); + resource.mstyle.f_fontset_extents = + XExtentsOfFontSet(resource.mstyle.f_fontset); + resource.tstyle.fontset_extents = + XExtentsOfFontSet(resource.tstyle.fontset); + resource.wstyle.fontset_extents = + XExtentsOfFontSet(resource.wstyle.fontset); + } else { + readDatabaseFont("window.font", "Window.Font", + &resource.wstyle.font); + readDatabaseFont("menu.title.font", "Menu.Title.Font", + &resource.mstyle.t_font); + readDatabaseFont("menu.frame.font", "Menu.Frame.Font", + &resource.mstyle.f_font); + readDatabaseFont("toolbar.font", "Toolbar.Font", + &resource.tstyle.font); + } - // load window config - readDatabaseTexture("window.title.focus", "Window.Title.Focus", - &resource.wstyle.t_focus, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("window.title.unfocus", "Window.Title.Unfocus", - &resource.wstyle.t_unfocus, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("window.label.focus", "Window.Label.Focus", - &resource.wstyle.l_focus, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("window.label.unfocus", "Window.Label.Unfocus", - &resource.wstyle.l_unfocus, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("window.handle.focus", "Window.Handle.Focus", - &resource.wstyle.h_focus, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("window.handle.unfocus", "Window.Handle.Unfocus", - &resource.wstyle.h_unfocus, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("window.grip.focus", "Window.Grip.Focus", - &resource.wstyle.g_focus, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("window.grip.unfocus", "Window.Grip.Unfocus", - &resource.wstyle.g_unfocus, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("window.button.focus", "Window.Button.Focus", - &resource.wstyle.b_focus, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("window.button.unfocus", "Window.Button.Unfocus", - &resource.wstyle.b_unfocus, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("window.button.pressed", "Window.Button.Pressed", - &resource.wstyle.b_pressed, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("window.frame.focusColor", - "Window.Frame.FocusColor", - &resource.wstyle.f_focus, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("window.frame.unfocusColor", - "Window.Frame.UnfocusColor", - &resource.wstyle.f_unfocus, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("window.label.focus.textColor", - "Window.Label.Focus.TextColor", - &resource.wstyle.l_text_focus, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("window.label.unfocus.textColor", - "Window.Label.Unfocus.TextColor", - &resource.wstyle.l_text_unfocus, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("window.button.focus.picColor", - "Window.Button.Focus.PicColor", - &resource.wstyle.b_pic_focus, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("window.button.unfocus.picColor", - "Window.Button.Unfocus.PicColor", - &resource.wstyle.b_pic_unfocus, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - - if (conf.getValue("window.justify", "Window.Justify", s)) { - if (0 == strncasecmp(s.c_str(), "right", s.length())) - resource.wstyle.justify = BScreen::RightJustify; - else if (0 == strncasecmp(s.c_str(), "center", s.length())) - resource.wstyle.justify = BScreen::CenterJustify; - else + // load window config + readDatabaseTexture("window.title.focus", "Window.Title.Focus", + &resource.wstyle.t_focus, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("window.title.unfocus", "Window.Title.Unfocus", + &resource.wstyle.t_unfocus, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("window.label.focus", "Window.Label.Focus", + &resource.wstyle.l_focus, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("window.label.unfocus", "Window.Label.Unfocus", + &resource.wstyle.l_unfocus, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("window.handle.focus", "Window.Handle.Focus", + &resource.wstyle.h_focus, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("window.handle.unfocus", "Window.Handle.Unfocus", + &resource.wstyle.h_unfocus, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("window.grip.focus", "Window.Grip.Focus", + &resource.wstyle.g_focus, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("window.grip.unfocus", "Window.Grip.Unfocus", + &resource.wstyle.g_unfocus, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("window.button.focus", "Window.Button.Focus", + &resource.wstyle.b_focus, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("window.button.unfocus", "Window.Button.Unfocus", + &resource.wstyle.b_unfocus, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("window.button.pressed", "Window.Button.Pressed", + &resource.wstyle.b_pressed, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("window.frame.focusColor", + "Window.Frame.FocusColor", + &resource.wstyle.f_focus, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("window.frame.unfocusColor", + "Window.Frame.UnfocusColor", + &resource.wstyle.f_unfocus, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("window.label.focus.textColor", + "Window.Label.Focus.TextColor", + &resource.wstyle.l_text_focus, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("window.label.unfocus.textColor", + "Window.Label.Unfocus.TextColor", + &resource.wstyle.l_text_unfocus, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("window.button.focus.picColor", + "Window.Button.Focus.PicColor", + &resource.wstyle.b_pic_focus, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("window.button.unfocus.picColor", + "Window.Button.Unfocus.PicColor", + &resource.wstyle.b_pic_unfocus, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + + if (conf.getValue("window.justify", "Window.Justify", s)) { + if (0 == strncasecmp(s.c_str(), "right", s.length())) + resource.wstyle.justify = BScreen::RightJustify; + else if (0 == strncasecmp(s.c_str(), "center", s.length())) + resource.wstyle.justify = BScreen::CenterJustify; + else + resource.wstyle.justify = BScreen::LeftJustify; + } else resource.wstyle.justify = BScreen::LeftJustify; - } else - resource.wstyle.justify = BScreen::LeftJustify; - - // load toolbar config - readDatabaseTexture("toolbar", "Toolbar", - &resource.tstyle.toolbar, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("toolbar.label", "Toolbar.Label", - &resource.tstyle.label, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("toolbar.windowLabel", "Toolbar.WindowLabel", - &resource.tstyle.window, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("toolbar.button", "Toolbar.Button", - &resource.tstyle.button, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("toolbar.button.pressed", "Toolbar.Button.Pressed", - &resource.tstyle.pressed, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("toolbar.clock", "Toolbar.Clock", - &resource.tstyle.clock, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("toolbar.label.textColor", "Toolbar.Label.TextColor", - &resource.tstyle.l_text, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("toolbar.windowLabel.textColor", - "Toolbar.WindowLabel.TextColor", - &resource.tstyle.w_text, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("toolbar.clock.textColor", "Toolbar.Clock.TextColor", - &resource.tstyle.c_text, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("toolbar.button.picColor", "Toolbar.Button.PicColor", - &resource.tstyle.b_pic, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - - if (conf.getValue("toolbar.justify", "Toolbar.Justify", s)) { - if (0 == strncasecmp(s.c_str(), "right", s.length())) - resource.tstyle.justify = BScreen::RightJustify; - else if (0 == strncasecmp(s.c_str(), "center", s.length())) - resource.tstyle.justify = BScreen::CenterJustify; - else + + // load toolbar config + readDatabaseTexture("toolbar", "Toolbar", + &resource.tstyle.toolbar, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("toolbar.label", "Toolbar.Label", + &resource.tstyle.label, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("toolbar.windowLabel", "Toolbar.WindowLabel", + &resource.tstyle.window, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("toolbar.button", "Toolbar.Button", + &resource.tstyle.button, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("toolbar.button.pressed", "Toolbar.Button.Pressed", + &resource.tstyle.pressed, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("toolbar.clock", "Toolbar.Clock", + &resource.tstyle.clock, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("toolbar.label.textColor", "Toolbar.Label.TextColor", + &resource.tstyle.l_text, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("toolbar.windowLabel.textColor", + "Toolbar.WindowLabel.TextColor", + &resource.tstyle.w_text, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("toolbar.clock.textColor", "Toolbar.Clock.TextColor", + &resource.tstyle.c_text, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("toolbar.button.picColor", "Toolbar.Button.PicColor", + &resource.tstyle.b_pic, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + + if (conf.getValue("toolbar.justify", "Toolbar.Justify", s)) { + if (0 == strncasecmp(s.c_str(), "right", s.length())) + resource.tstyle.justify = BScreen::RightJustify; + else if (0 == strncasecmp(s.c_str(), "center", s.length())) + resource.tstyle.justify = BScreen::CenterJustify; + else + resource.tstyle.justify = BScreen::LeftJustify; + } else resource.tstyle.justify = BScreen::LeftJustify; - } else - resource.tstyle.justify = BScreen::LeftJustify; - - // load menu config - readDatabaseTexture("menu.title", "Menu.Title", - &resource.mstyle.title, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("menu.frame", "Menu.Frame", - &resource.mstyle.frame, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseTexture("menu.hilite", "Menu.Hilite", - &resource.mstyle.hilite, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("menu.title.textColor", "Menu.Title.TextColor", - &resource.mstyle.t_text, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("menu.frame.textColor", "Menu.Frame.TextColor", - &resource.mstyle.f_text, - WhitePixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("menu.frame.disableColor", "Menu.Frame.DisableColor", - &resource.mstyle.d_text, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - readDatabaseColor("menu.hilite.textColor", "Menu.Hilite.TextColor", - &resource.mstyle.h_text, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - - if (conf.getValue("menu.title.justify", "Menu.Title.Justify", s)) { - if (0 == strncasecmp(s.c_str(), "right", s.length())) - resource.mstyle.t_justify = BScreen::RightJustify; - else if (0 == strncasecmp(s.c_str(), "center", s.length())) - resource.mstyle.t_justify = BScreen::CenterJustify; - else + + // load menu config + readDatabaseTexture("menu.title", "Menu.Title", + &resource.mstyle.title, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("menu.frame", "Menu.Frame", + &resource.mstyle.frame, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseTexture("menu.hilite", "Menu.Hilite", + &resource.mstyle.hilite, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("menu.title.textColor", "Menu.Title.TextColor", + &resource.mstyle.t_text, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("menu.frame.textColor", "Menu.Frame.TextColor", + &resource.mstyle.f_text, + WhitePixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("menu.frame.disableColor", "Menu.Frame.DisableColor", + &resource.mstyle.d_text, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + readDatabaseColor("menu.hilite.textColor", "Menu.Hilite.TextColor", + &resource.mstyle.h_text, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + + if (conf.getValue("menu.title.justify", "Menu.Title.Justify", s)) { + if (0 == strncasecmp(s.c_str(), "right", s.length())) + resource.mstyle.t_justify = BScreen::RightJustify; + else if (0 == strncasecmp(s.c_str(), "center", s.length())) + resource.mstyle.t_justify = BScreen::CenterJustify; + else + resource.mstyle.t_justify = BScreen::LeftJustify; + } else resource.mstyle.t_justify = BScreen::LeftJustify; - } else - resource.mstyle.t_justify = BScreen::LeftJustify; - if (conf.getValue("menu.frame.justify", "Menu.Frame.Justify", s)) { - if (0 == strncasecmp(s.c_str(), "right", s.length())) - resource.mstyle.f_justify = BScreen::RightJustify; - else if (0 == strncasecmp(s.c_str(), "center", s.length())) - resource.mstyle.f_justify = BScreen::CenterJustify; - else + if (conf.getValue("menu.frame.justify", "Menu.Frame.Justify", s)) { + if (0 == strncasecmp(s.c_str(), "right", s.length())) + resource.mstyle.f_justify = BScreen::RightJustify; + else if (0 == strncasecmp(s.c_str(), "center", s.length())) + resource.mstyle.f_justify = BScreen::CenterJustify; + else + resource.mstyle.f_justify = BScreen::LeftJustify; + } else resource.mstyle.f_justify = BScreen::LeftJustify; - } else - resource.mstyle.f_justify = BScreen::LeftJustify; - - if (conf.getValue("menu.bullet", "Menu.Bullet", s)) { - if (0 == strncasecmp(s.c_str(), "empty", s.length())) - resource.mstyle.bullet = Basemenu::Empty; - else if (0 == strncasecmp(s.c_str(), "square", s.length())) - resource.mstyle.bullet = Basemenu::Square; - else if (0 == strncasecmp(s.c_str(), "diamond", s.length())) - resource.mstyle.bullet = Basemenu::Diamond; - else + + if (conf.getValue("menu.bullet", "Menu.Bullet", s)) { + if (0 == strncasecmp(s.c_str(), "empty", s.length())) + resource.mstyle.bullet = Basemenu::Empty; + else if (0 == strncasecmp(s.c_str(), "square", s.length())) + resource.mstyle.bullet = Basemenu::Square; + else if (0 == strncasecmp(s.c_str(), "diamond", s.length())) + resource.mstyle.bullet = Basemenu::Diamond; + else + resource.mstyle.bullet = Basemenu::Triangle; + } else resource.mstyle.bullet = Basemenu::Triangle; - } else - resource.mstyle.bullet = Basemenu::Triangle; - if (conf.getValue("menu.bullet.position", "Menu.Bullet.Position", s)) { - if (0 == strncasecmp(s.c_str(), "right", s.length())) - resource.mstyle.bullet_pos = Basemenu::Right; - else + if (conf.getValue("menu.bullet.position", "Menu.Bullet.Position", s)) { + if (0 == strncasecmp(s.c_str(), "right", s.length())) + resource.mstyle.bullet_pos = Basemenu::Right; + else + resource.mstyle.bullet_pos = Basemenu::Left; + } else resource.mstyle.bullet_pos = Basemenu::Left; - } else - resource.mstyle.bullet_pos = Basemenu::Left; - - readDatabaseColor("borderColor", "BorderColor", &resource.border_color, - BlackPixel(getBaseDisplay().getXDisplay(), - getScreenNumber())); - // load bevel, border and handle widths - if (conf.getValue("handleWidth", "HandleWidth", l)) { - if (l <= size().w() / 2 && l != 0) - resource.handle_width = l; - else + readDatabaseColor("borderColor", "BorderColor", &resource.border_color, + BlackPixel(getBaseDisplay().getXDisplay(), + getScreenNumber())); + + // load bevel, border and handle widths + if (conf.getValue("handleWidth", "HandleWidth", l)) { + if (l <= (signed)size().w() / 2 && l != 0) + resource.handle_width = l; + else + resource.handle_width = 6; + } else resource.handle_width = 6; - } else - resource.handle_width = 6; - if (conf.getValue("borderWidth", "BorderWidth", l)) - resource.border_width = l; - else - resource.border_width = 1; - - if (conf.getValue("bevelWidth", "BevelWidth", l)) { - if (l <= size().w() / 2 && l != 0) - resource.bevel_width = l; + if (conf.getValue("borderWidth", "BorderWidth", l)) + resource.border_width = l; else + resource.border_width = 1; + + if (conf.getValue("bevelWidth", "BevelWidth", l)) { + if (l <= (signed)size().w() / 2 && l != 0) + resource.bevel_width = l; + else + resource.bevel_width = 3; + } else resource.bevel_width = 3; - } else - resource.bevel_width = 3; - if (conf.getValue("frameWidth", "FrameWidth", l)) { - if (l <= size().w() / 2) - resource.frame_width = l; - else + if (conf.getValue("frameWidth", "FrameWidth", l)) { + if (l <= (signed)size().w() / 2) + resource.frame_width = l; + else + resource.frame_width = resource.bevel_width; + } else resource.frame_width = resource.bevel_width; - } else - resource.frame_width = resource.bevel_width; - const char *cmd = resource.root_command; - if (cmd != NULL || conf.getValue("rootCommand", "RootCommand", s)) { - if (cmd == NULL) - cmd = s.c_str(); // not specified by the screen, so use the one from the - // style file + const char *cmd = resource.root_command; + if (cmd != NULL || conf.getValue("rootCommand", "RootCommand", s)) { + if (cmd == NULL) + cmd = s.c_str(); // not specified by the screen, so use the one from the + // style file #ifndef __EMX__ - char displaystring[MAXPATHLEN]; - sprintf(displaystring, "DISPLAY=%s", - DisplayString(getBaseDisplay().getXDisplay())); - sprintf(displaystring + strlen(displaystring) - 1, "%d", - getScreenNumber()); + char displaystring[MAXPATHLEN]; + sprintf(displaystring, "DISPLAY=%s", + DisplayString(getBaseDisplay().getXDisplay())); + sprintf(displaystring + strlen(displaystring) - 1, "%d", + getScreenNumber()); - bexec(cmd, displaystring); + bexec(cmd, displaystring); #else // __EMX__ - spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", cmd, NULL); + spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", cmd, NULL); #endif // !__EMX__ + } } -} -void BScreen::addIcon(OpenboxWindow *w) { - if (! w) return; + void BScreen::addIcon(OpenboxWindow *w) { + if (! w) return; - w->setWorkspace(-1); - w->setWindowNumber(iconList->count()); + w->setWorkspace(-1); + w->setWindowNumber(iconList.size()); - iconList->insert(w); + iconList.push_back(w); - iconmenu->insert((const char **) w->getIconTitle()); - iconmenu->update(); -} + iconmenu->insert((const char **) w->getIconTitle()); + iconmenu->update(); + } -void BScreen::removeIcon(OpenboxWindow *w) { - if (! w) return; + void BScreen::removeIcon(OpenboxWindow *w) { + if (! w) return; - iconList->remove(w->getWindowNumber()); + iconList.remove(w); - iconmenu->remove(w->getWindowNumber()); - iconmenu->update(); + iconmenu->remove(w->getWindowNumber()); + iconmenu->update(); - LinkedListIterator it(iconList); - OpenboxWindow *bw = it.current(); - for (int i = 0; bw; it++, bw = it.current()) - bw->setWindowNumber(i++); -} + winList::iterator it = iconList.begin(); + for (int i = 0; it != iconList.end(); ++it, ++i) + (*it)->setWindowNumber(i); + } -OpenboxWindow *BScreen::getIcon(int index) { - if (index >= 0 && index < iconList->count()) - return iconList->find(index); + OpenboxWindow *BScreen::getIcon(int index) { + if (index < 0 || index >= (signed)iconList.size()) + return (OpenboxWindow *) 0; - return NULL; -} + winList::iterator it = iconList.begin(); + for (; index > 0; --index, ++it); // increment to index + return *it; + } -int BScreen::addWorkspace(void) { - Workspace *wkspc = new Workspace(*this, workspacesList->count()); - workspacesList->insert(wkspc); - saveWorkspaceNames(); + int BScreen::addWorkspace(void) { + Workspace *wkspc = new Workspace(*this, workspacesList.size()); + workspacesList.push_back(wkspc); + setWorkspaceCount(workspaceCount()+1); + saveWorkspaceNames(); - workspacemenu->insert(wkspc->getName(), wkspc->getMenu(), - wkspc->getWorkspaceID() + 2); - workspacemenu->update(); + workspacemenu->insert(wkspc->getName(), wkspc->getMenu(), + wkspc->getWorkspaceID() + 2); + workspacemenu->update(); - toolbar->reconfigure(); + toolbar->reconfigure(); - updateNetizenWorkspaceCount(); + updateNetizenWorkspaceCount(); - return workspacesList->count(); -} + return workspacesList.size(); + } -int BScreen::removeLastWorkspace(void) { - if (workspacesList->count() == 1) - return 0; + int BScreen::removeLastWorkspace(void) { + if (workspacesList.size() == 1) + return 0; - Workspace *wkspc = workspacesList->last(); + Workspace *wkspc = workspacesList.back(); - if (current_workspace->getWorkspaceID() == wkspc->getWorkspaceID()) - changeWorkspaceID(current_workspace->getWorkspaceID() - 1); + if (current_workspace->getWorkspaceID() == wkspc->getWorkspaceID()) + changeWorkspaceID(current_workspace->getWorkspaceID() - 1); - wkspc->removeAll(); + wkspc->removeAll(); - workspacemenu->remove(wkspc->getWorkspaceID() + 2); - workspacemenu->update(); + workspacemenu->remove(wkspc->getWorkspaceID() + 2); + workspacemenu->update(); - workspacesList->remove(wkspc); - delete wkspc; + workspacesList.pop_back(); + delete wkspc; - toolbar->reconfigure(); + setWorkspaceCount(workspaceCount()-1); + saveWorkspaceNames(); - updateNetizenWorkspaceCount(); + toolbar->reconfigure(); - return workspacesList->count(); -} + updateNetizenWorkspaceCount(); + return workspacesList.size(); + } -void BScreen::changeWorkspaceID(int id) { - if (! current_workspace) return; - if (id != current_workspace->getWorkspaceID()) { - current_workspace->hideAll(); + void BScreen::changeWorkspaceID(int id) { + if (! current_workspace) return; - workspacemenu->setItemSelected(current_workspace->getWorkspaceID() + 2, - False); + if (id != current_workspace->getWorkspaceID()) { + current_workspace->hideAll(); - if (openbox.getFocusedWindow() && - openbox.getFocusedWindow()->getScreen() == this && - (! openbox.getFocusedWindow()->isStuck())) { - current_workspace->setLastFocusedWindow(openbox.getFocusedWindow()); - openbox.setFocusedWindow(NULL); - } + workspacemenu->setItemSelected(current_workspace->getWorkspaceID() + 2, + False); - current_workspace = getWorkspace(id); + OpenboxWindow *fw = openbox.focusedWindow(); + if (fw && fw->getScreen() == this) + openbox.focusWindow(0); - workspacemenu->setItemSelected(current_workspace->getWorkspaceID() + 2, - True); - toolbar->redrawWorkspaceLabel(True); + current_workspace = getWorkspace(id); - current_workspace->showAll(); + workspacemenu->setItemSelected(current_workspace->getWorkspaceID() + 2, + True); + toolbar->redrawWorkspaceLabel(True); - if (resource.focus_last && current_workspace->getLastFocusedWindow()) { - XSync(openbox.getXDisplay(), False); - current_workspace->getLastFocusedWindow()->setInputFocus(); + current_workspace->showAll(); + + if (resource.focus_last && current_workspace->lastFocusedWindow()) { + XSync(openbox.getXDisplay(), False); + current_workspace->lastFocusedWindow()->setInputFocus(); + } } + + updateNetizenCurrentWorkspace(); } - updateNetizenCurrentWorkspace(); -} + void BScreen::addNetizen(Netizen *n) { + netizenList.push_back(n); -void BScreen::addNetizen(Netizen *n) { - netizenList->insert(n); + n->sendWorkspaceCount(); + n->sendCurrentWorkspace(); - n->sendWorkspaceCount(); - n->sendCurrentWorkspace(); + wkspList::iterator it; + for (it = workspacesList.begin(); it != workspacesList.end(); ++it) { + for (int i = 0; i < (*it)->getCount(); i++) + n->sendWindowAdd((*it)->getWindow(i)->getClientWindow(), + (*it)->getWorkspaceID()); + } - LinkedListIterator it(workspacesList); - for (Workspace *w = it.current(); w; it++, w = it.current()) { - for (int i = 0; i < w->getCount(); i++) - n->sendWindowAdd(w->getWindow(i)->getClientWindow(), - w->getWorkspaceID()); + Window f = ((openbox.focusedWindow()) ? + openbox.focusedWindow()->getClientWindow() : None); + n->sendWindowFocus(f); } - Window f = ((openbox.getFocusedWindow()) ? - openbox.getFocusedWindow()->getClientWindow() : None); - n->sendWindowFocus(f); -} + void BScreen::removeNetizen(Window w) { + netList::iterator it; -void BScreen::removeNetizen(Window w) { - LinkedListIterator it(netizenList); - int i = 0; - - for (Netizen *n = it.current(); n; it++, i++, n = it.current()) - if (n->getWindowID() == w) { - Netizen *tmp = netizenList->remove(i); - delete tmp; - - break; - } -} + 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(); -} + void BScreen::updateNetizenCurrentWorkspace(void) { + 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(); -} + void BScreen::updateNetizenWorkspaceCount(void) { + 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); -} + void BScreen::updateNetizenWindowFocus(void) { + 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); -} + void BScreen::updateNetizenWindowAdd(Window w, unsigned long 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); -} + void BScreen::updateNetizenWindowDel(Window 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); -} + void BScreen::updateNetizenWindowRaise(Window 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); -} + void BScreen::updateNetizenWindowLower(Window 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); -} + void BScreen::updateNetizenConfigNotify(XEvent *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)]; - int i = 0, k = num; + void BScreen::raiseWindows(Window *workspace_stack, int num) { + Window *session_stack = new + Window[(num + workspacesList.size() + rootmenuList.size() + 13)]; + int i = 0, k = num; - XRaiseWindow(getBaseDisplay().getXDisplay(), iconmenu->getWindowID()); - *(session_stack + i++) = iconmenu->getWindowID(); + XRaiseWindow(getBaseDisplay().getXDisplay(), iconmenu->getWindowID()); + *(session_stack + i++) = iconmenu->getWindowID(); - LinkedListIterator wit(workspacesList); - for (Workspace *tmp = wit.current(); tmp; wit++, tmp = wit.current()) - *(session_stack + i++) = tmp->getMenu()->getWindowID(); + wkspList::iterator it; + for (it = workspacesList.begin(); it != workspacesList.end(); ++it) + *(session_stack + i++) = (*it)->getMenu()->getWindowID(); - *(session_stack + i++) = workspacemenu->getWindowID(); + *(session_stack + i++) = workspacemenu->getWindowID(); - *(session_stack + i++) = configmenu->getFocusmenu()->getWindowID(); - *(session_stack + i++) = configmenu->getPlacementmenu()->getWindowID(); - *(session_stack + i++) = configmenu->getWindowID(); + *(session_stack + i++) = configmenu->getFocusmenu()->getWindowID(); + *(session_stack + i++) = configmenu->getPlacementmenu()->getWindowID(); + *(session_stack + i++) = configmenu->getWindowID(); #ifdef SLIT - *(session_stack + i++) = slit->getMenu()->getDirectionmenu()->getWindowID(); - *(session_stack + i++) = slit->getMenu()->getPlacementmenu()->getWindowID(); - *(session_stack + i++) = slit->getMenu()->getWindowID(); + *(session_stack + i++) = slit->getMenu()->getDirectionmenu()->getWindowID(); + *(session_stack + i++) = slit->getMenu()->getPlacementmenu()->getWindowID(); + *(session_stack + i++) = slit->getMenu()->getWindowID(); #endif // SLIT - *(session_stack + i++) = - toolbar->getMenu()->getPlacementmenu()->getWindowID(); - *(session_stack + i++) = toolbar->getMenu()->getWindowID(); + *(session_stack + i++) = + 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(); - *(session_stack + i++) = rootmenu->getWindowID(); + menuList::iterator rit; + for (rit = rootmenuList.begin(); rit != rootmenuList.end(); ++rit) + *(session_stack + i++) = (*rit)->getWindowID(); + *(session_stack + i++) = rootmenu->getWindowID(); - if (toolbar->onTop()) - *(session_stack + i++) = toolbar->getWindowID(); + if (toolbar->onTop()) + *(session_stack + i++) = toolbar->getWindowID(); #ifdef SLIT - if (slit->onTop()) - *(session_stack + i++) = slit->getWindowID(); + if (slit->onTop()) + *(session_stack + i++) = slit->getWindowID(); #endif // SLIT - while (k--) - *(session_stack + i++) = *(workspace_stack + k); + while (k--) + *(session_stack + i++) = *(workspace_stack + k); - XRestackWindows(getBaseDisplay().getXDisplay(), session_stack, i); - - delete [] session_stack; -} + XRestackWindows(getBaseDisplay().getXDisplay(), session_stack, i); + delete [] session_stack; + } -void BScreen::addWorkspaceName(const char *name) { - workspaceNames->insert(bstrdup(name)); -} -char* BScreen::getNameOfWorkspace(int id) { - char *name = NULL; + void BScreen::addWorkspaceName(const char *name) { + workspaceNames.push_back(name); + } - if (id >= 0 && id < workspaceNames->count()) { - char *wkspc_name = workspaceNames->find(id); - if (wkspc_name) - name = wkspc_name; + const char *BScreen::getNameOfWorkspace(int id) { + if (id < 0 || id >= (signed)workspaceNames.size()) + return (const char *) 0; + return workspaceNames[id].c_str(); } - return name; -} -void BScreen::reassociateWindow(OpenboxWindow *w, int wkspc_id, Bool ignore_sticky) { - if (! w) return; + void BScreen::reassociateWindow(OpenboxWindow *w, int wkspc_id, Bool ignore_sticky) { + if (! w) return; - if (wkspc_id == -1) - wkspc_id = current_workspace->getWorkspaceID(); + if (wkspc_id == -1) + wkspc_id = current_workspace->getWorkspaceID(); - if (w->getWorkspaceNumber() == wkspc_id) - return; + if (w->getWorkspaceNumber() == wkspc_id) + return; - if (w->isIconic()) { - removeIcon(w); - getWorkspace(wkspc_id)->addWindow(w); - } else if (ignore_sticky || ! w->isStuck()) { - getWorkspace(w->getWorkspaceNumber())->removeWindow(w); - getWorkspace(wkspc_id)->addWindow(w); + if (w->isIconic()) { + removeIcon(w); + getWorkspace(wkspc_id)->addWindow(w); + } else if (ignore_sticky || ! w->isStuck()) { + getWorkspace(w->getWorkspaceNumber())->removeWindow(w); + getWorkspace(wkspc_id)->addWindow(w); + } } -} -void BScreen::nextFocus(void) { - Bool have_focused = False; - int focused_window_number = -1; - OpenboxWindow *next; + void BScreen::nextFocus(void) { + Bool have_focused = False; + int focused_window_number = -1; + OpenboxWindow *next; - if (openbox.getFocusedWindow()) { - if (openbox.getFocusedWindow()->getScreen()->getScreenNumber() == - getScreenNumber()) { - have_focused = True; - focused_window_number = openbox.getFocusedWindow()->getWindowNumber(); + if (openbox.focusedWindow()) { + if (openbox.focusedWindow()->getScreen()->getScreenNumber() == + getScreenNumber()) { + have_focused = True; + focused_window_number = openbox.focusedWindow()->getWindowNumber(); + } } - } - if ((getCurrentWorkspace()->getCount() > 1) && have_focused) { - int next_window_number = focused_window_number; - do { - if ((++next_window_number) >= getCurrentWorkspace()->getCount()) - next_window_number = 0; + if ((getCurrentWorkspace()->getCount() > 1) && have_focused) { + int next_window_number = focused_window_number; + do { + if ((++next_window_number) >= getCurrentWorkspace()->getCount()) + next_window_number = 0; - next = getCurrentWorkspace()->getWindow(next_window_number); - } while ((! next->setInputFocus()) && (next_window_number != - focused_window_number)); + next = getCurrentWorkspace()->getWindow(next_window_number); + } while ((! next->setInputFocus()) && (next_window_number != + focused_window_number)); - if (next_window_number != focused_window_number) - getCurrentWorkspace()->raiseWindow(next); - } else if (getCurrentWorkspace()->getCount() >= 1) { - next = current_workspace->getWindow(0); + if (next_window_number != focused_window_number) + getCurrentWorkspace()->raiseWindow(next); + } else if (getCurrentWorkspace()->getCount() >= 1) { + next = current_workspace->getWindow(0); - current_workspace->raiseWindow(next); - next->setInputFocus(); + current_workspace->raiseWindow(next); + next->setInputFocus(); + } } -} -void BScreen::prevFocus(void) { - Bool have_focused = False; - int focused_window_number = -1; - OpenboxWindow *prev; + void BScreen::prevFocus(void) { + Bool have_focused = False; + int focused_window_number = -1; + OpenboxWindow *prev; - if (openbox.getFocusedWindow()) { - if (openbox.getFocusedWindow()->getScreen()->getScreenNumber() == - getScreenNumber()) { - have_focused = True; - focused_window_number = openbox.getFocusedWindow()->getWindowNumber(); + if (openbox.focusedWindow()) { + if (openbox.focusedWindow()->getScreen()->getScreenNumber() == + getScreenNumber()) { + have_focused = True; + focused_window_number = openbox.focusedWindow()->getWindowNumber(); + } } - } - if ((getCurrentWorkspace()->getCount() > 1) && have_focused) { - int prev_window_number = focused_window_number; - do { - if ((--prev_window_number) < 0) - prev_window_number = getCurrentWorkspace()->getCount() - 1; + if ((getCurrentWorkspace()->getCount() > 1) && have_focused) { + int prev_window_number = focused_window_number; + do { + if ((--prev_window_number) < 0) + prev_window_number = getCurrentWorkspace()->getCount() - 1; - prev = getCurrentWorkspace()->getWindow(prev_window_number); - } while ((! prev->setInputFocus()) && (prev_window_number != - focused_window_number)); + prev = getCurrentWorkspace()->getWindow(prev_window_number); + } while ((! prev->setInputFocus()) && (prev_window_number != + focused_window_number)); - if (prev_window_number != focused_window_number) - getCurrentWorkspace()->raiseWindow(prev); - } else if (getCurrentWorkspace()->getCount() >= 1) { - prev = current_workspace->getWindow(0); + if (prev_window_number != focused_window_number) + getCurrentWorkspace()->raiseWindow(prev); + } else if (getCurrentWorkspace()->getCount() >= 1) { + prev = current_workspace->getWindow(0); - current_workspace->raiseWindow(prev); - prev->setInputFocus(); + current_workspace->raiseWindow(prev); + prev->setInputFocus(); + } } -} -void BScreen::raiseFocus(void) { - Bool have_focused = False; - int focused_window_number = -1; + void BScreen::raiseFocus(void) { + Bool have_focused = False; + int focused_window_number = -1; - if (openbox.getFocusedWindow()) { - if (openbox.getFocusedWindow()->getScreen()->getScreenNumber() == - getScreenNumber()) { - have_focused = True; - focused_window_number = openbox.getFocusedWindow()->getWindowNumber(); + if (openbox.focusedWindow()) { + if (openbox.focusedWindow()->getScreen()->getScreenNumber() == + getScreenNumber()) { + have_focused = True; + focused_window_number = openbox.focusedWindow()->getWindowNumber(); + } } - } - if ((getCurrentWorkspace()->getCount() > 1) && have_focused) - getWorkspace(openbox.getFocusedWindow()->getWorkspaceNumber())-> - raiseWindow(openbox.getFocusedWindow()); -} + if ((getCurrentWorkspace()->getCount() > 1) && have_focused) + getWorkspace(openbox.focusedWindow()->getWorkspaceNumber())-> + raiseWindow(openbox.focusedWindow()); + } -void BScreen::InitMenu(void) { - if (rootmenu) { - while (rootmenuList->count()) - rootmenuList->remove(0); + void BScreen::InitMenu(void) { + if (rootmenu) { + rootmenuList.clear(); + while (rootmenu->getCount()) + rootmenu->remove(0); + } else { + rootmenu = new Rootmenu(*this); + } + bool defaultMenu = true; - while (rootmenu->getCount()) - rootmenu->remove(0); - } else { - rootmenu = new Rootmenu(*this); - } - Bool defaultMenu = True; + FILE *menu_file; + const char *menu_filename = openbox.getMenuFilename(); - if (openbox.getMenuFilename()) { - FILE *menu_file = fopen(openbox.getMenuFilename(), "r"); + if (!(menu_file = fopen(menu_filename, "r"))) { + perror(menu_filename); + menu_filename = (char *) 0; + } + if (menu_filename == (char *) 0) { + // opening the menu file failed, try the DEFAULTMENU + menu_filename = DEFAULTMENU; + if (!(menu_file = fopen(menu_filename, "r"))) { + perror(menu_filename); + menu_filename = (char *) 0; + } + } - if (!menu_file) { - perror(openbox.getMenuFilename()); - } else { + if (menu_filename) { if (feof(menu_file)) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenEmptyMenuFile, - "%s: Empty menu file"), - openbox.getMenuFilename()); + fprintf(stderr, i18n(ScreenSet, ScreenEmptyMenuFile, + "%s: Empty menu file"), menu_filename); + menu_filename = (char *) 0; } 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); - - key = 0; - 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) { - 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'; - - rootmenu->setLabel(label); - defaultMenu = parseMenuFile(menu_file, rootmenu); - break; - } - } - } + // successsfully opened a menu file + 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); + + key = 0; + 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) { + 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'; + + rootmenu->setLabel(label); + defaultMenu = parseMenuFile(menu_file, rootmenu); + if (!defaultMenu) + openbox.addMenuTimestamp(menu_filename); + break; + } + } + } } fclose(menu_file); } - } - if (defaultMenu) { - rootmenu->setInternalMenu(); - rootmenu->insert(i18n->getMessage(ScreenSet, Screenxterm, "xterm"), - BScreen::Execute, - i18n->getMessage(ScreenSet, Screenxterm, "xterm")); - rootmenu->insert(i18n->getMessage(ScreenSet, ScreenRestart, "Restart"), - BScreen::Restart); - rootmenu->insert(i18n->getMessage(ScreenSet, ScreenExit, "Exit"), - BScreen::Exit); - } else { - openbox.setMenuFilename(openbox.getMenuFilename()); + if (defaultMenu) { + rootmenu->setInternalMenu(); + rootmenu->insert(i18n(ScreenSet, Screenxterm, "xterm"), + BScreen::Execute, + i18n(ScreenSet, Screenxterm, "xterm")); + rootmenu->insert(i18n(ScreenSet, ScreenRestart, "Restart"), + BScreen::Restart); + rootmenu->insert(i18n(ScreenSet, ScreenExit, "Exit"), + BScreen::Exit); + } } -} -Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) { - char line[1024], label[1024], command[1024]; - - while (! feof(file)) { - memset(line, 0, 1024); - memset(label, 0, 1024); - memset(command, 0, 1024); - - if (fgets(line, 1024, file)) { - if (line[0] != '#') { - register int i, key = 0, parse = 0, index = -1, - line_length = strlen(line), - label_length = 0, command_length = 0; - - // determine the keyword - key = 0; - for (i = 0; i < line_length; i++) { - if (line[i] == '[') parse = 1; - else if (line[i] == ']') break; - else if (line[i] != ' ') - if (parse) - key += tolower(line[i]); - } - - // get the label enclosed in ()'s - parse = 0; - - for (i = 0; i < line_length; i++) { - if (line[i] == '(') { - index = 0; - parse = 1; - } else if (line[i] == ')') break; - else if (index++ >= 0) { - if (line[i] == '\\' && i < line_length - 1) i++; - label[index - 1] = line[i]; - } - } - - if (parse) { - label[index] = '\0'; - label_length = index; - } else { - label[0] = '\0'; - label_length = 0; - } - - // get the command enclosed in {}'s - parse = 0; - index = -1; - for (i = 0; i < line_length; i++) { - if (line[i] == '{') { - index = 0; - parse = 1; - } else if (line[i] == '}') break; - else if (index++ >= 0) { - if (line[i] == '\\' && i < line_length - 1) i++; - command[index - 1] = line[i]; - } - } - - if (parse) { - command[index] = '\0'; - command_length = index; - } else { - command[0] = '\0'; - command_length = 0; - } - - switch (key) { - case 311: //end - return ((menu->getCount() == 0) ? True : False); - - break; - - case 333: // nop - menu->insert(label); - - break; - - case 421: // exec - if ((! *label) && (! *command)) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenEXECError, - "BScreen::parseMenuFile: [exec] error, " - "no menu label and/or command defined\n")); - continue; - } - - menu->insert(label, BScreen::Execute, command); - - break; - - case 442: // exit - if (! *label) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenEXITError, - "BScreen::parseMenuFile: [exit] error, " - "no menu label defined\n")); - continue; - } - - menu->insert(label, BScreen::Exit); - - break; - - case 561: // style - { - if ((! *label) || (! *command)) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenSTYLEError, - "BScreen::parseMenuFile: [style] error, " - "no menu label and/or filename defined\n")); - continue; - } - - char style[MAXPATHLEN]; - - // perform shell style ~ home directory expansion - char *homedir = 0; - int homedir_len = 0; - if (*command == '~' && *(command + 1) == '/') { - homedir = getenv("HOME"); - homedir_len = strlen(homedir); - } - - if (homedir && homedir_len != 0) { - strncpy(style, homedir, homedir_len); - - strncpy(style + homedir_len, command + 1, - command_length - 1); - *(style + command_length + homedir_len - 1) = '\0'; - } else { - strncpy(style, command, command_length); - *(style + command_length) = '\0'; - } - - menu->insert(label, BScreen::SetStyle, style); - } - - break; - - case 630: // config - if (! *label) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenCONFIGError, - "BScreen::parseMenufile: [config] error, " - "no label defined")); - continue; - } - - menu->insert(label, configmenu); - - break; - - case 740: // include - { - if (! *label) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenINCLUDEError, - "BScreen::parseMenuFile: [include] error, " - "no filename defined\n")); - continue; - } - - char newfile[MAXPATHLEN]; - - // perform shell style ~ home directory expansion - char *homedir = 0; - int homedir_len = 0; - if (*label == '~' && *(label + 1) == '/') { - homedir = getenv("HOME"); - homedir_len = strlen(homedir); - } - - if (homedir && homedir_len != 0) { - strncpy(newfile, homedir, homedir_len); - - strncpy(newfile + homedir_len, label + 1, - label_length - 1); - *(newfile + label_length + homedir_len - 1) = '\0'; - } else { - strncpy(newfile, label, label_length); - *(newfile + label_length) = '\0'; - } - - if (newfile) { - FILE *submenufile = fopen(newfile, "r"); - - if (submenufile) { - struct stat buf; - if (fstat(fileno(submenufile), &buf) || - (! S_ISREG(buf.st_mode))) { - fprintf(stderr, - i18n->getMessage(ScreenSet, ScreenINCLUDEErrorReg, - "BScreen::parseMenuFile: [include] error: " - "'%s' is not a regular file\n"), newfile); - break; - } + Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) { + char line[1024], label[1024], command[1024]; + + while (! feof(file)) { + memset(line, 0, 1024); + memset(label, 0, 1024); + memset(command, 0, 1024); + + if (fgets(line, 1024, file)) { + if (line[0] != '#') { + register int i, key = 0, parse = 0, index = -1, + line_length = strlen(line), + label_length = 0, command_length = 0; + + // determine the keyword + key = 0; + for (i = 0; i < line_length; i++) { + if (line[i] == '[') parse = 1; + else if (line[i] == ']') break; + else if (line[i] != ' ') + if (parse) + key += tolower(line[i]); + } - if (! feof(submenufile)) { - if (! parseMenuFile(submenufile, menu)) - openbox.setMenuFilename(newfile); - - fclose(submenufile); - } - } else - perror(newfile); - } - } - - break; - - case 767: // submenu - { - if (! *label) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenSUBMENUError, - "BScreen::parseMenuFile: [submenu] error, " - "no menu label defined\n")); - continue; - } - - Rootmenu *submenu = new Rootmenu(*this); - - if (*command) - submenu->setLabel(command); - else - submenu->setLabel(label); - - parseMenuFile(file, submenu); - submenu->update(); - menu->insert(label, submenu); - rootmenuList->insert(submenu); - } - - break; - - case 773: // restart - { - if (! *label) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenRESTARTError, - "BScreen::parseMenuFile: [restart] error, " - "no menu label defined\n")); - continue; - } - - if (*command) - menu->insert(label, BScreen::RestartOther, command); - else - menu->insert(label, BScreen::Restart); - } - - break; - - case 845: // reconfig - { - if (! *label) { - fprintf(stderr, i18n->getMessage(ScreenSet, ScreenRECONFIGError, - "BScreen::parseMenuFile: [reconfig] error, " - "no menu label defined\n")); - continue; - } - - menu->insert(label, BScreen::Reconfigure); - } - - break; - - case 995: // stylesdir - case 1113: // stylesmenu - { - Bool newmenu = ((key == 1113) ? True : False); - - if ((! *label) || ((! *command) && newmenu)) { - fprintf(stderr, - i18n->getMessage(ScreenSet, ScreenSTYLESDIRError, - "BScreen::parseMenuFile: [stylesdir/stylesmenu]" - " error, no directory defined\n")); - continue; + // get the label enclosed in ()'s + parse = 0; + + for (i = 0; i < line_length; i++) { + if (line[i] == '(') { + index = 0; + parse = 1; + } else if (line[i] == ')') break; + else if (index++ >= 0) { + if (line[i] == '\\' && i < line_length - 1) i++; + label[index - 1] = line[i]; } + } - char stylesdir[MAXPATHLEN]; + if (parse) { + label[index] = '\0'; + label_length = index; + } else { + label[0] = '\0'; + label_length = 0; + } + + // get the command enclosed in {}'s + parse = 0; + index = -1; + for (i = 0; i < line_length; i++) { + if (line[i] == '{') { + index = 0; + parse = 1; + } else if (line[i] == '}') break; + else if (index++ >= 0) { + if (line[i] == '\\' && i < line_length - 1) i++; + command[index - 1] = line[i]; + } + } - char *directory = ((newmenu) ? command : label); - int directory_length = ((newmenu) ? command_length : label_length); + if (parse) { + command[index] = '\0'; + command_length = index; + } else { + command[0] = '\0'; + command_length = 0; + } - // perform shell style ~ home directory expansion - char *homedir = 0; - int homedir_len = 0; + switch (key) { + case 311: //end + return ((menu->getCount() == 0) ? True : False); - if (*directory == '~' && *(directory + 1) == '/') { - homedir = getenv("HOME"); - homedir_len = strlen(homedir); + break; + + case 333: // nop + menu->insert(label); + + break; + + case 421: // exec + if ((! *label) && (! *command)) { + fprintf(stderr, i18n(ScreenSet, ScreenEXECError, + "BScreen::parseMenuFile: [exec] error, " + "no menu label and/or command defined\n")); + continue; } - if (homedir && homedir_len != 0) { - strncpy(stylesdir, homedir, homedir_len); + menu->insert(label, BScreen::Execute, command); + + break; - strncpy(stylesdir + homedir_len, directory + 1, - directory_length - 1); - *(stylesdir + directory_length + homedir_len - 1) = '\0'; - } else { - strncpy(stylesdir, directory, directory_length); - *(stylesdir + directory_length) = '\0'; + case 442: // exit + if (! *label) { + fprintf(stderr, i18n(ScreenSet, ScreenEXITError, + "BScreen::parseMenuFile: [exit] error, " + "no menu label defined\n")); + continue; } - struct stat statbuf; + menu->insert(label, BScreen::Exit); - if (! stat(stylesdir, &statbuf)) { - if (S_ISDIR(statbuf.st_mode)) { - Rootmenu *stylesmenu; + break; - if (newmenu) - stylesmenu = new Rootmenu(*this); - else - stylesmenu = menu; + case 561: // style + { + if ((! *label) || (! *command)) { + fprintf(stderr, i18n(ScreenSet, ScreenSTYLEError, + "BScreen::parseMenuFile: [style] error, " + "no menu label and/or filename defined\n")); + continue; + } - DIR *d = opendir(stylesdir); - int entries = 0; - struct dirent *p; + char style[MAXPATHLEN]; - // get the total number of directory entries - while ((p = readdir(d))) entries++; - rewinddir(d); + // perform shell style ~ home directory expansion + char *homedir = 0; + int homedir_len = 0; + if (*command == '~' && *(command + 1) == '/') { + homedir = getenv("HOME"); + homedir_len = strlen(homedir); + } - char **ls = new char* [entries]; - int index = 0; - while ((p = readdir(d))) - ls[index++] = bstrdup(p->d_name); + if (homedir && homedir_len != 0) { + strncpy(style, homedir, homedir_len); + + strncpy(style + homedir_len, command + 1, + command_length - 1); + *(style + command_length + homedir_len - 1) = '\0'; + } else { + strncpy(style, command, command_length); + *(style + command_length) = '\0'; + } - closedir(d); + menu->insert(label, BScreen::SetStyle, style); + } - std::sort(ls, ls + entries, dcmp()); + break; - int n, slen = strlen(stylesdir); - for (n = 0; n < entries; n++) { - if (ls[n][strlen(ls[n])-1] != '~') { - int nlen = strlen(ls[n]); - char style[MAXPATHLEN + 1]; + case 630: // config + if (! *label) { + fprintf(stderr, i18n(ScreenSet, ScreenCONFIGError, + "BScreen::parseMenufile: [config] error, " + "no label defined")); + continue; + } - strncpy(style, stylesdir, slen); - *(style + slen) = '/'; - strncpy(style + slen + 1, ls[n], nlen + 1); + menu->insert(label, configmenu); - if ((! stat(style, &statbuf)) && S_ISREG(statbuf.st_mode)) - stylesmenu->insert(ls[n], BScreen::SetStyle, style); - } + break; - delete [] ls[n]; - } + case 740: // include + { + if (! *label) { + fprintf(stderr, i18n(ScreenSet, ScreenINCLUDEError, + "BScreen::parseMenuFile: [include] error, " + "no filename defined\n")); + continue; + } - delete [] ls; + char newfile[MAXPATHLEN]; - stylesmenu->update(); + // perform shell style ~ home directory expansion + char *homedir = 0; + int homedir_len = 0; + if (*label == '~' && *(label + 1) == '/') { + homedir = getenv("HOME"); + homedir_len = strlen(homedir); + } - if (newmenu) { - stylesmenu->setLabel(label); - menu->insert(label, stylesmenu); - rootmenuList->insert(stylesmenu); - } + if (homedir && homedir_len != 0) { + strncpy(newfile, homedir, homedir_len); - openbox.setMenuFilename(stylesdir); + strncpy(newfile + homedir_len, label + 1, + label_length - 1); + *(newfile + label_length + homedir_len - 1) = '\0'; } else { - fprintf(stderr, i18n->getMessage(ScreenSet, - ScreenSTYLESDIRErrorNotDir, - "BScreen::parseMenuFile:" - " [stylesdir/stylesmenu] error, %s is not a" - " directory\n"), stylesdir); + strncpy(newfile, label, label_length); + *(newfile + label_length) = '\0'; + } + + if (newfile) { + FILE *submenufile = fopen(newfile, "r"); + + if (submenufile) { + struct stat buf; + if (fstat(fileno(submenufile), &buf) || + (! S_ISREG(buf.st_mode))) { + fprintf(stderr, + i18n(ScreenSet, ScreenINCLUDEErrorReg, + "BScreen::parseMenuFile: [include] error: " + "'%s' is not a regular file\n"), newfile); + break; + } + + if (! feof(submenufile)) { + if (!parseMenuFile(submenufile, menu)) + openbox.addMenuTimestamp(newfile); + fclose(submenufile); + } + } else + perror(newfile); } - } else { - fprintf(stderr, - i18n->getMessage(ScreenSet, ScreenSTYLESDIRErrorNoExist, - "BScreen::parseMenuFile: [stylesdir/stylesmenu]" - " error, %s does not exist\n"), stylesdir); } break; - } - case 1090: // workspaces - { - if (! *label) { - fprintf(stderr, - i18n->getMessage(ScreenSet, ScreenWORKSPACESError, - "BScreen:parseMenuFile: [workspaces] error, " - "no menu label defined\n")); - continue; - } - - menu->insert(label, workspacemenu); - - break; - } - } + case 767: // submenu + { + if (! *label) { + fprintf(stderr, i18n(ScreenSet, ScreenSUBMENUError, + "BScreen::parseMenuFile: [submenu] error, " + "no menu label defined\n")); + continue; + } + + Rootmenu *submenu = new Rootmenu(*this); + + if (*command) + submenu->setLabel(command); + else + submenu->setLabel(label); + + parseMenuFile(file, submenu); + submenu->update(); + menu->insert(label, submenu); + rootmenuList.push_back(submenu); + } + + break; + + case 773: // restart + { + if (! *label) { + fprintf(stderr, i18n(ScreenSet, ScreenRESTARTError, + "BScreen::parseMenuFile: [restart] error, " + "no menu label defined\n")); + continue; + } + + if (*command) + menu->insert(label, BScreen::RestartOther, command); + else + menu->insert(label, BScreen::Restart); + } + + break; + + case 845: // reconfig + { + if (! *label) { + fprintf(stderr, i18n(ScreenSet, ScreenRECONFIGError, + "BScreen::parseMenuFile: [reconfig] error, " + "no menu label defined\n")); + continue; + } + + menu->insert(label, BScreen::Reconfigure); + } + + break; + + case 995: // stylesdir + case 1113: // stylesmenu + { + Bool newmenu = ((key == 1113) ? True : False); + + if ((! *label) || ((! *command) && newmenu)) { + fprintf(stderr, + i18n(ScreenSet, ScreenSTYLESDIRError, + "BScreen::parseMenuFile: [stylesdir/stylesmenu]" + " error, no directory defined\n")); + continue; + } + + char stylesdir[MAXPATHLEN]; + + char *directory = ((newmenu) ? command : label); + int directory_length = ((newmenu) ? command_length : label_length); + + // perform shell style ~ home directory expansion + char *homedir = 0; + int homedir_len = 0; + + if (*directory == '~' && *(directory + 1) == '/') { + homedir = getenv("HOME"); + homedir_len = strlen(homedir); + } + + if (homedir && homedir_len != 0) { + strncpy(stylesdir, homedir, homedir_len); + + strncpy(stylesdir + homedir_len, directory + 1, + directory_length - 1); + *(stylesdir + directory_length + homedir_len - 1) = '\0'; + } else { + strncpy(stylesdir, directory, directory_length); + *(stylesdir + directory_length) = '\0'; + } + + struct stat statbuf; + + if (! stat(stylesdir, &statbuf)) { + if (S_ISDIR(statbuf.st_mode)) { + Rootmenu *stylesmenu; + + if (newmenu) + stylesmenu = new Rootmenu(*this); + else + stylesmenu = menu; + + DIR *d = opendir(stylesdir); + int entries = 0; + struct dirent *p; + + // get the total number of directory entries + while ((p = readdir(d))) entries++; + rewinddir(d); + + char **ls = new char* [entries]; + int index = 0; + while ((p = readdir(d))) + ls[index++] = bstrdup(p->d_name); + + closedir(d); + + std::sort(ls, ls + entries, dcmp()); + + int n, slen = strlen(stylesdir); + for (n = 0; n < entries; n++) { + if (ls[n][strlen(ls[n])-1] != '~') { + int nlen = strlen(ls[n]); + char style[MAXPATHLEN + 1]; + + strncpy(style, stylesdir, slen); + *(style + slen) = '/'; + strncpy(style + slen + 1, ls[n], nlen + 1); + + if ((! stat(style, &statbuf)) && S_ISREG(statbuf.st_mode)) + stylesmenu->insert(ls[n], BScreen::SetStyle, style); + } + + delete [] ls[n]; + } + + delete [] ls; + + stylesmenu->update(); + + if (newmenu) { + stylesmenu->setLabel(label); + menu->insert(label, stylesmenu); + rootmenuList.push_back(stylesmenu); + } + openbox.addMenuTimestamp(stylesdir); + } else { + fprintf(stderr, i18n(ScreenSet, + ScreenSTYLESDIRErrorNotDir, + "BScreen::parseMenuFile:" + " [stylesdir/stylesmenu] error, %s is not a" + " directory\n"), stylesdir); + } + } else { + fprintf(stderr, + i18n(ScreenSet, ScreenSTYLESDIRErrorNoExist, + "BScreen::parseMenuFile: [stylesdir/stylesmenu]" + " error, %s does not exist\n"), stylesdir); + } + + break; + } + + case 1090: // workspaces + { + if (! *label) { + fprintf(stderr, + i18n(ScreenSet, ScreenWORKSPACESError, + "BScreen:parseMenuFile: [workspaces] error, " + "no menu label defined\n")); + continue; + } + + menu->insert(label, workspacemenu); + + break; + } + } + } } } - } - return ((menu->getCount() == 0) ? True : False); -} + return ((menu->getCount() == 0) ? True : False); + } -void BScreen::shutdown(void) { - openbox.grab(); + void BScreen::shutdown(void) { + openbox.grab(); - XSelectInput(getBaseDisplay().getXDisplay(), getRootWindow(), NoEventMask); - XSync(getBaseDisplay().getXDisplay(), False); + XSelectInput(getBaseDisplay().getXDisplay(), getRootWindow(), NoEventMask); + XSync(getBaseDisplay().getXDisplay(), False); - LinkedListIterator it(workspacesList); - for (Workspace *w = it.current(); w; it++, w = it.current()) - w->shutdown(); + std::for_each(workspacesList.begin(), workspacesList.end(), + std::mem_fun(&Workspace::shutdown)); - while (iconList->count()) { - iconList->first()->restore(); - delete iconList->first(); - } + while (!iconList.empty()) + iconList.front()->restore(); #ifdef SLIT - slit->shutdown(); + slit->shutdown(); #endif // SLIT - openbox.ungrab(); -} + openbox.ungrab(); + } -void BScreen::showPosition(int x, int y) { - if (! geom_visible) { - XMoveResizeWindow(getBaseDisplay().getXDisplay(), geom_window, - (size().w() - geom_w) / 2, - (size().h() - geom_h) / 2, geom_w, geom_h); - XMapWindow(getBaseDisplay().getXDisplay(), geom_window); - XRaiseWindow(getBaseDisplay().getXDisplay(), geom_window); + void BScreen::showPosition(int x, int y) { + if (! geom_visible) { + XMoveResizeWindow(getBaseDisplay().getXDisplay(), geom_window, + (size().w() - geom_w) / 2, + (size().h() - geom_h) / 2, geom_w, geom_h); + XMapWindow(getBaseDisplay().getXDisplay(), geom_window); + XRaiseWindow(getBaseDisplay().getXDisplay(), geom_window); - geom_visible = True; - } + geom_visible = True; + } - char label[1024]; + char label[1024]; - sprintf(label, i18n->getMessage(ScreenSet, ScreenPositionFormat, - "X: %4d x Y: %4d"), x, y); + sprintf(label, i18n(ScreenSet, ScreenPositionFormat, + "X: %4d x Y: %4d"), x, y); - XClearWindow(getBaseDisplay().getXDisplay(), geom_window); + XClearWindow(getBaseDisplay().getXDisplay(), geom_window); - if (i18n->multibyte()) { - XmbDrawString(getBaseDisplay().getXDisplay(), geom_window, - resource.wstyle.fontset, resource.wstyle.l_text_focus_gc, - resource.bevel_width, resource.bevel_width - - resource.wstyle.fontset_extents->max_ink_extent.y, - label, strlen(label)); - } else { - XDrawString(getBaseDisplay().getXDisplay(), geom_window, - resource.wstyle.l_text_focus_gc, - resource.bevel_width, - resource.wstyle.font->ascent + - resource.bevel_width, label, strlen(label)); + if (i18n.multibyte()) { + XmbDrawString(getBaseDisplay().getXDisplay(), geom_window, + resource.wstyle.fontset, resource.wstyle.l_text_focus_gc, + resource.bevel_width, resource.bevel_width - + resource.wstyle.fontset_extents->max_ink_extent.y, + label, strlen(label)); + } else { + XDrawString(getBaseDisplay().getXDisplay(), geom_window, + resource.wstyle.l_text_focus_gc, + resource.bevel_width, + resource.wstyle.font->ascent + + resource.bevel_width, label, strlen(label)); + } } -} -void BScreen::showGeometry(unsigned int gx, unsigned int gy) { - if (! geom_visible) { - XMoveResizeWindow(getBaseDisplay().getXDisplay(), geom_window, - (size().w() - geom_w) / 2, - (size().h() - geom_h) / 2, geom_w, geom_h); - XMapWindow(getBaseDisplay().getXDisplay(), geom_window); - XRaiseWindow(getBaseDisplay().getXDisplay(), geom_window); + void BScreen::showGeometry(unsigned int gx, unsigned int gy) { + if (! geom_visible) { + XMoveResizeWindow(getBaseDisplay().getXDisplay(), geom_window, + (size().w() - geom_w) / 2, + (size().h() - geom_h) / 2, geom_w, geom_h); + XMapWindow(getBaseDisplay().getXDisplay(), geom_window); + XRaiseWindow(getBaseDisplay().getXDisplay(), geom_window); - geom_visible = True; - } + geom_visible = True; + } - char label[1024]; + char label[1024]; - sprintf(label, i18n->getMessage(ScreenSet, ScreenGeometryFormat, - "W: %4d x H: %4d"), gx, gy); + sprintf(label, i18n(ScreenSet, ScreenGeometryFormat, + "W: %4d x H: %4d"), gx, gy); - XClearWindow(getBaseDisplay().getXDisplay(), geom_window); + XClearWindow(getBaseDisplay().getXDisplay(), geom_window); - if (i18n->multibyte()) { - XmbDrawString(getBaseDisplay().getXDisplay(), geom_window, - resource.wstyle.fontset, resource.wstyle.l_text_focus_gc, - resource.bevel_width, resource.bevel_width - - resource.wstyle.fontset_extents->max_ink_extent.y, - label, strlen(label)); - } else { - XDrawString(getBaseDisplay().getXDisplay(), geom_window, - resource.wstyle.l_text_focus_gc, - resource.bevel_width, - resource.wstyle.font->ascent + - resource.bevel_width, label, strlen(label)); + if (i18n.multibyte()) { + XmbDrawString(getBaseDisplay().getXDisplay(), geom_window, + resource.wstyle.fontset, resource.wstyle.l_text_focus_gc, + resource.bevel_width, resource.bevel_width - + resource.wstyle.fontset_extents->max_ink_extent.y, + label, strlen(label)); + } else { + XDrawString(getBaseDisplay().getXDisplay(), geom_window, + resource.wstyle.l_text_focus_gc, + resource.bevel_width, + resource.wstyle.font->ascent + + resource.bevel_width, label, strlen(label)); + } } -} -void BScreen::hideGeometry(void) { - if (geom_visible) { - XUnmapWindow(getBaseDisplay().getXDisplay(), geom_window); - geom_visible = False; + void BScreen::hideGeometry(void) { + if (geom_visible) { + XUnmapWindow(getBaseDisplay().getXDisplay(), geom_window); + geom_visible = False; + } } -}