X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FSlit.cc;h=0b1993943a4be9f160204c90dac310550d38deca;hb=bbbe226ccc7086721ba5e652fa89e6e8190adb56;hp=9e9073d640bdef78ec78311d74289f013fb74fdd;hpb=89563281384c34886fb12b169d1bdf8d293f0b48;p=chaz%2Fopenbox diff --git a/src/Slit.cc b/src/Slit.cc index 9e9073d6..0b199394 100644 --- a/src/Slit.cc +++ b/src/Slit.cc @@ -41,43 +41,41 @@ #include "Slit.h" #include "Toolbar.h" -#ifdef HAVE_SSTREAM -# include -#endif // HAVE_SSTREAM - +#include #include +using std::ends; -Slit::Slit(BScreen &scr, Resource &conf) : screen(scr), - openbox(scr.getOpenbox()), config(conf) +Slit::Slit(BScreen &scr, Resource &conf) : openbox(scr.getOpenbox()), +screen(scr), config(conf) { load(); - + display = screen.getBaseDisplay().getXDisplay(); frame.window = frame.pixmap = None; timer = new BTimer(openbox, *this); - timer->setTimeout(openbox.getAutoRaiseDelay()); + // the time out is set in ::reconfigure() timer->fireOnce(True); slitmenu = new Slitmenu(*this); XSetWindowAttributes attrib; unsigned long create_mask = CWBackPixmap | CWBackPixel | CWBorderPixel | - CWColormap | CWOverrideRedirect | CWEventMask; + CWColormap | CWOverrideRedirect | CWEventMask; attrib.background_pixmap = None; attrib.background_pixel = attrib.border_pixel = screen.getBorderColor()->getPixel(); attrib.colormap = screen.getColormap(); attrib.override_redirect = True; attrib.event_mask = SubstructureRedirectMask | ButtonPressMask | - EnterWindowMask | LeaveWindowMask; + EnterWindowMask | LeaveWindowMask; frame.area = Rect(0, 0, 1, 1); - + frame.window = XCreateWindow(display, screen.getRootWindow(), frame.area.x(), frame.area.y(), - frame.area.w(), frame.area.h(), screen.getBorderWidth(), + frame.area.w(), frame.area.h(), screen.getBorderWidth(), screen.getDepth(), InputOutput, screen.getVisual(), create_mask, &attrib); openbox.saveSlitSearch(frame.window, this); @@ -93,7 +91,7 @@ Slit::~Slit() { delete timer; clientList.clear(); - + delete slitmenu; screen.getImageControl()->removeImage(frame.pixmap); @@ -117,16 +115,16 @@ void Slit::addClient(Window w) { if (wmhints) { if ((wmhints->flags & IconWindowHint) && - (wmhints->icon_window != None)) { - XMoveWindow(display, client->client_window, screen.size().w() + 10, - screen.size().h() + 10); - XMapWindow(display, client->client_window); + (wmhints->icon_window != None)) { + XMoveWindow(display, client->client_window, screen.size().w() + 10, + screen.size().h() + 10); + XMapWindow(display, client->client_window); - client->icon_window = wmhints->icon_window; - client->window = client->icon_window; + client->icon_window = wmhints->icon_window; + client->window = client->icon_window; } else { - client->icon_window = None; - client->window = client->client_window; + client->icon_window = None; + client->window = client->client_window; } XFree(wmhints); @@ -153,7 +151,7 @@ void Slit::addClient(Window w) { XChangeSaveSet(display, client->window, SetModeInsert); XSelectInput(display, frame.window, SubstructureRedirectMask | - ButtonPressMask | EnterWindowMask | LeaveWindowMask); + ButtonPressMask | EnterWindowMask | LeaveWindowMask); XSelectInput(display, client->window, StructureNotifyMask | SubstructureNotifyMask | EnterWindowMask); XFlush(display); @@ -181,10 +179,10 @@ void Slit::removeClient(SlitClient *client, Bool remap) { XSelectInput(display, frame.window, NoEventMask); XSelectInput(display, client->window, NoEventMask); XReparentWindow(display, client->window, screen.getRootWindow(), - client->x, client->y); + client->x, client->y); XChangeSaveSet(display, client->window, SetModeDelete); XSelectInput(display, frame.window, SubstructureRedirectMask | - ButtonPressMask | EnterWindowMask | LeaveWindowMask); + ButtonPressMask | EnterWindowMask | LeaveWindowMask); XFlush(display); } @@ -214,22 +212,25 @@ void Slit::removeClient(Window w, Bool remap) { void Slit::setOnTop(bool b) { m_ontop = b; - std::ostringstream s; - s << "session.screen" << screen.getScreenNumber() << ".slit.onTop"; + std::ostrstream s; + s << "session.screen" << screen.getScreenNumber() << ".slit.onTop" << ends; config.setValue(s.str(), m_ontop ? "True" : "False"); + s.rdbuf()->freeze(0); } void Slit::setAutoHide(bool b) { m_autohide = b; - std::ostringstream s; - s << "session.screen" << screen.getScreenNumber() << ".slit.autoHide"; + std::ostrstream s; + s << "session.screen" << screen.getScreenNumber() << ".slit.autoHide" << ends; config.setValue(s.str(), m_autohide ? "True" : "False"); + s.rdbuf()->freeze(0); } void Slit::setPlacement(int p) { m_placement = p; - std::ostringstream s; - s << "session.screen" << screen.getScreenNumber() << ".slit.placement"; + std::ostrstream s; + s << "session.screen" << screen.getScreenNumber() << ".slit.placement" + << ends; const char *placement; switch (m_placement) { case TopLeft: placement = "TopLeft"; break; @@ -242,14 +243,17 @@ void Slit::setPlacement(int p) { case CenterRight: default: placement = "CenterRight"; break; } config.setValue(s.str(), placement); + s.rdbuf()->freeze(0); } void Slit::setDirection(int d) { m_direction = d; - std::ostringstream s; - s << "session.screen" << screen.getScreenNumber() << ".slit.direction"; + std::ostrstream s; + s << "session.screen" << screen.getScreenNumber() << ".slit.direction" + << ends; config.setValue(s.str(), m_direction == Horizontal ? "Horizontal" : "Vertical"); + s.rdbuf()->freeze(0); } void Slit::save() { @@ -260,13 +264,13 @@ void Slit::save() { } void Slit::load() { - std::ostringstream rscreen, rname, rclass; + std::ostrstream rscreen, rname, rclass; std::string s; bool b; - rscreen << "session.screen" << screen.getScreenNumber() << '.'; + rscreen << "session.screen" << screen.getScreenNumber() << '.' << ends; - rname << rscreen.str() << "slit.placement"; - rclass << rscreen.str() << "Slit.Placement"; + rname << rscreen.str() << "slit.placement" << ends; + rclass << rscreen.str() << "Slit.Placement" << ends; if (config.getValue(rname.str(), rclass.str(), s)) { if (0 == strncasecmp(s.c_str(), "TopLeft", s.length())) m_placement = TopLeft; @@ -288,8 +292,9 @@ void Slit::load() { m_placement = CenterRight; rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "slit.direction"; - rclass << rscreen.str() << "Slit.Direction"; + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "slit.direction" << ends; + rclass << rscreen.str() << "Slit.Direction" << ends; if (config.getValue(rname.str(), rclass.str(), s)) { if (0 == strncasecmp(s.c_str(), "Horizontal", s.length())) m_direction = Horizontal; @@ -297,25 +302,32 @@ void Slit::load() { m_direction = Vertical; } else m_direction = Vertical; - + rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "slit.onTop"; - rclass << rscreen.str() << "Slit.OnTop"; + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "slit.onTop" << ends; + rclass << rscreen.str() << "Slit.OnTop" << ends; if (config.getValue(rname.str(), rclass.str(), b)) m_ontop = b; else m_ontop = false; rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "slit.autoHide"; - rclass << rscreen.str() << "Slit.AutoHide"; + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); + rname << rscreen.str() << "slit.autoHide" << ends; + rclass << rscreen.str() << "Slit.AutoHide" << ends; if (config.getValue(rname.str(), rclass.str(), b)) m_hidden = m_autohide = b; else m_hidden = m_autohide = false; + + rscreen.rdbuf()->freeze(0); + rname.rdbuf()->freeze(0); rclass.rdbuf()->freeze(0); } void Slit::reconfigure(void) { + timer->setTimeout(openbox.getAutoRaiseDelay()); + frame.area.setSize(0, 0); slitClientList::const_iterator it; @@ -378,10 +390,10 @@ void Slit::reconfigure(void) { if (texture->getTexture() == (BImage_Flat | BImage_Solid)) { frame.pixmap = None; XSetWindowBackground(display, frame.window, - texture->getColor()->getPixel()); + texture->getColor()->getPixel()); } else { frame.pixmap = image_ctrl->renderImage(frame.area.w(), frame.area.h(), - texture); + texture); XSetWindowBackgroundPixmap(display, frame.window, frame.pixmap); } if (tmp) image_ctrl->removeImage(tmp); @@ -548,9 +560,9 @@ void Slit::reposition(void) { Toolbar *tbar = screen.getToolbar(); int sw = frame.area.w() + (screen.getBorderWidth() * 2), - sh = frame.area.h() + (screen.getBorderWidth() * 2), - tw = tbar->area().w() + screen.getBorderWidth(), - th = tbar->area().h() + screen.getBorderWidth(); + sh = frame.area.h() + (screen.getBorderWidth() * 2), + tw = tbar->area().w() + screen.getBorderWidth(), + th = tbar->area().h() + screen.getBorderWidth(); if (tbar->area().x() < frame.area.x() + sw && tbar->area().x() + tw > frame.area.x() && @@ -561,22 +573,22 @@ void Slit::reposition(void) { if (m_direction == Vertical) frame.hidden.setY(frame.hidden.y() + tbar->getExposedHeight()); else - frame.hidden.setY(frame.area.y()); + frame.hidden.setY(frame.area.y()); } else { frame.area.setY(frame.area.y() - tbar->getExposedHeight()); if (m_direction == Vertical) frame.hidden.setY(frame.area.y() - tbar->getExposedHeight()); else - frame.hidden.setY(frame.area.y()); + frame.hidden.setY(frame.area.y()); } } if (m_hidden) XMoveResizeWindow(display, frame.window, frame.hidden.x(), - frame.hidden.y(), frame.area.w(), frame.area.h()); + frame.hidden.y(), frame.area.w(), frame.area.h()); else XMoveResizeWindow(display, frame.window, frame.area.x(), - frame.area.y(), frame.area.w(), frame.area.h()); + frame.area.y(), frame.area.w(), frame.area.h()); } @@ -691,18 +703,18 @@ void Slit::timeout(void) { Slitmenu::Slitmenu(Slit &sl) : Basemenu(sl.screen), slit(sl) { - setLabel(i18n->getMessage(SlitSet, SlitSlitTitle, "Slit")); + setLabel(i18n(SlitSet, SlitSlitTitle, "Slit")); setInternalMenu(); directionmenu = new Directionmenu(*this); placementmenu = new Placementmenu(*this); - insert(i18n->getMessage(CommonSet, CommonDirectionTitle, "Direction"), - directionmenu); - insert(i18n->getMessage(CommonSet, CommonPlacementTitle, "Placement"), - placementmenu); - insert(i18n->getMessage(CommonSet, CommonAlwaysOnTop, "Always on top"), 1); - insert(i18n->getMessage(CommonSet, CommonAutoHide, "Auto hide"), 2); + insert(i18n(CommonSet, CommonDirectionTitle, "Direction"), + directionmenu); + insert(i18n(CommonSet, CommonPlacementTitle, "Placement"), + placementmenu); + insert(i18n(CommonSet, CommonAlwaysOnTop, "Always on top"), 1); + insert(i18n(CommonSet, CommonAutoHide, "Auto hide"), 2); update(); @@ -767,18 +779,18 @@ void Slitmenu::reconfigure(void) { Slitmenu::Directionmenu::Directionmenu(Slitmenu &sm) : Basemenu(sm.slit.screen), slitmenu(sm) { - setLabel(i18n->getMessage(SlitSet, SlitSlitDirection, "Slit Direction")); - setInternalMenu(); + setLabel(i18n(SlitSet, SlitSlitDirection, "Slit Direction")); + setInternalMenu(); - insert(i18n->getMessage(CommonSet, CommonDirectionHoriz, "Horizontal"), - Slit::Horizontal); - insert(i18n->getMessage(CommonSet, CommonDirectionVert, "Vertical"), - Slit::Vertical); + insert(i18n(CommonSet, CommonDirectionHoriz, "Horizontal"), + Slit::Horizontal); + insert(i18n(CommonSet, CommonDirectionVert, "Vertical"), + Slit::Vertical); - update(); + update(); - setValues(); -} + setValues(); + } void Slitmenu::Directionmenu::setValues() { @@ -790,6 +802,7 @@ void Slitmenu::Directionmenu::setValues() { void Slitmenu::Directionmenu::reconfigure() { setValues(); + Basemenu::reconfigure(); } @@ -818,33 +831,33 @@ void Slitmenu::Directionmenu::itemSelected(int button, int index) { Slitmenu::Placementmenu::Placementmenu(Slitmenu &sm) : Basemenu(sm.slit.screen), slitmenu(sm) { - setLabel(i18n->getMessage(SlitSet, SlitSlitPlacement, "Slit Placement")); - setMinimumSublevels(3); - setInternalMenu(); - - insert(i18n->getMessage(CommonSet, CommonPlacementTopLeft, "Top Left"), - Slit::TopLeft); - insert(i18n->getMessage(CommonSet, CommonPlacementCenterLeft, "Center Left"), - Slit::CenterLeft); - insert(i18n->getMessage(CommonSet, CommonPlacementBottomLeft, "Bottom Left"), - Slit::BottomLeft); - insert(i18n->getMessage(CommonSet, CommonPlacementTopCenter, "Top Center"), - Slit::TopCenter); - insert(""); - insert(i18n->getMessage(CommonSet, CommonPlacementBottomCenter, - "Bottom Center"), - Slit::BottomCenter); - insert(i18n->getMessage(CommonSet, CommonPlacementTopRight, "Top Right"), - Slit::TopRight); - insert(i18n->getMessage(CommonSet, CommonPlacementCenterRight, - "Center Right"), - Slit::CenterRight); - insert(i18n->getMessage(CommonSet, CommonPlacementBottomRight, - "Bottom Right"), - Slit::BottomRight); - - update(); -} + setLabel(i18n(SlitSet, SlitSlitPlacement, "Slit Placement")); + setMinimumSublevels(3); + setInternalMenu(); + + insert(i18n(CommonSet, CommonPlacementTopLeft, "Top Left"), + Slit::TopLeft); + insert(i18n(CommonSet, CommonPlacementCenterLeft, "Center Left"), + Slit::CenterLeft); + insert(i18n(CommonSet, CommonPlacementBottomLeft, "Bottom Left"), + Slit::BottomLeft); + insert(i18n(CommonSet, CommonPlacementTopCenter, "Top Center"), + Slit::TopCenter); + insert(""); + insert(i18n(CommonSet, CommonPlacementBottomCenter, + "Bottom Center"), + Slit::BottomCenter); + insert(i18n(CommonSet, CommonPlacementTopRight, "Top Right"), + Slit::TopRight); + insert(i18n(CommonSet, CommonPlacementCenterRight, + "Center Right"), + Slit::CenterRight); + insert(i18n(CommonSet, CommonPlacementBottomRight, + "Bottom Right"), + Slit::BottomRight); + + update(); + } void Slitmenu::Placementmenu::itemSelected(int button, int index) {