X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FScreen.cc;h=c5378d4ffebdfb5f27d4e839e7cdbd45ad35ef2d;hb=89563281384c34886fb12b169d1bdf8d293f0b48;hp=1de7c0bfb837958bee3a67ba6f73f5aa5842b9e2;hpb=3001cec7901b119ec8cdfb87a78142be264f8039;p=chaz%2Fopenbox diff --git a/src/Screen.cc b/src/Screen.cc index 1de7c0bf..c5378d4f 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -49,6 +49,7 @@ #include "Window.h" #include "Workspace.h" #include "Workspacemenu.h" +#include "Util.h" #ifdef HAVE_STDLIB_H # include @@ -99,7 +100,9 @@ #define FONT_ELEMENT_SIZE 50 #endif // FONT_ELEMENT_SIZE -#include +#ifdef HAVE_SSTREAM +# include +#endif // HAVE_SSTREAM #include #include @@ -213,6 +216,7 @@ 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 SLIT slit = NULL; @@ -589,6 +593,108 @@ BScreen::~BScreen(void) { resource.tstyle.b_pic_gc); } + +Rect BScreen::availableArea() const { + // the following code is temporary and will be taken care of by Screen in the + // future (with the NETWM 'strut') + Rect space(0, 0, size().w(), size().h()); + if (!resource.full_max) { +#ifdef SLIT + int slit_x = slit->autoHide() ? slit->hiddenOrigin().x() : slit->area().x(), + slit_y = slit->autoHide() ? slit->hiddenOrigin().y() : slit->area().y(); + int tbarh = resource.hide_toolbar ? 0 : + toolbar->getExposedHeight() + resource.border_width * 2; + bool tbartop; + switch (toolbar->placement()) { + case Toolbar::TopLeft: + case Toolbar::TopCenter: + case Toolbar::TopRight: + tbartop = true; + break; + case Toolbar::BottomLeft: + case Toolbar::BottomCenter: + case Toolbar::BottomRight: + tbartop = false; + break; + default: + ASSERT(false); // unhandled placement + } + if ((slit->direction() == Slit::Horizontal && + (slit->placement() == Slit::TopLeft || + slit->placement() == Slit::TopRight)) || + slit->placement() == Slit::TopCenter) { + // exclude top + if (tbartop && slit_y + slit->area().h() < tbarh) { + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } else { + space.setY(space.y() + (slit_y + slit->area().h() + + resource.border_width * 2)); + space.setH(space.h() - (slit_y + slit->area().h() + + resource.border_width * 2)); + if (!tbartop) + space.setH(space.h() - tbarh); + } + } else if ((slit->direction() == Slit::Vertical && + (slit->placement() == Slit::TopRight || + slit->placement() == Slit::BottomRight)) || + slit->placement() == Slit::CenterRight) { + // exclude right + space.setW(space.w() - (size().w() - slit_x)); + if (tbartop) + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } else if ((slit->direction() == Slit::Horizontal && + (slit->placement() == Slit::BottomLeft || + slit->placement() == Slit::BottomRight)) || + slit->placement() == Slit::BottomCenter) { + // exclude bottom + if (!tbartop && (size().h() - slit_y) < tbarh) { + space.setH(space.h() - tbarh); + } else { + space.setH(space.h() - (size().h() - slit_y)); + if (tbartop) { + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } + } + } else {// if ((slit->direction() == Slit::Vertical && + // (slit->placement() == Slit::TopLeft || + // slit->placement() == Slit::BottomLeft)) || + // slit->placement() == Slit::CenterLeft) + // exclude left + space.setX(slit_x + slit->area().w() + + resource.border_width * 2); + space.setW(space.w() - (slit_x + slit->area().w() + + resource.border_width * 2)); + if (tbartop) + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } +#else // !SLIT + int tbarh = resource.hide_toolbar() ? 0 : + toolbar->getExposedHeight() + resource.border_width * 2; + switch (toolbar->placement()) { + case Toolbar::TopLeft: + case Toolbar::TopCenter: + case Toolbar::TopRight: + space.setY(toolbar->getExposedHeight()); + space.setH(space.h() - toolbar->getExposedHeight()); + break; + case Toolbar::BottomLeft: + case Toolbar::BottomCenter: + case Toolbar::BottomRight: + space.setH(space.h() - tbarh); + break; + default: + ASSERT(false); // unhandled placement + } +#endif // SLIT + } + return space; +} + + void BScreen::readDatabaseTexture(const char *rname, const char *rclass, BTexture *texture, unsigned long default_pixel) @@ -826,35 +932,32 @@ XFontSet BScreen::createFontSet(const char *fontname) { void BScreen::setSloppyFocus(bool b) { resource.sloppy_focus = b; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".focusModel" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".focusModel"; config.setValue(s.str(), (resource.sloppy_focus ? (resource.auto_raise ? "AutoRaiseSloppyFocus" : "SloppyFocus") : "ClickToFocus")); - s.rdbuf()->freeze(0); } void BScreen::setAutoRaise(bool a) { resource.auto_raise = a; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".focusModel" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".focusModel"; config.setValue(s.str(), (resource.sloppy_focus ? (resource.auto_raise ? "AutoRaiseSloppyFocus" : "SloppyFocus") : "ClickToFocus")); - s.rdbuf()->freeze(0); } void BScreen::setImageDither(bool d, bool reconfig) { resource.image_dither = d; image_control->setDither(d); - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".imageDither" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".imageDither"; config.setValue(s.str(), resource.image_dither); - s.rdbuf()->freeze(0); if (reconfig) reconfigure(); } @@ -862,105 +965,98 @@ void BScreen::setImageDither(bool d, bool reconfig) { void BScreen::setOpaqueMove(bool o) { resource.opaque_move = o; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".opaqueMove" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".opaqueMove"; config.setValue(s.str(), resource.opaque_move); - s.rdbuf()->freeze(0); } void BScreen::setFullMax(bool f) { resource.full_max = f; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".fullMaximization" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".fullMaximization"; config.setValue(s.str(), resource.full_max); +#ifndef HAVE_SSTREAM s.rdbuf()->freeze(0); +#endif // HAVE_SSTREAM } void BScreen::setFocusNew(bool f) { resource.focus_new = f; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".focusNewWindows" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".focusNewWindows"; config.setValue(s.str(), resource.focus_new); - s.rdbuf()->freeze(0); } void BScreen::setFocusLast(bool f) { resource.focus_last = f; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".focusLastWindow" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".focusLastWindow"; config.setValue(s.str(), resource.focus_last); - s.rdbuf()->freeze(0); } void BScreen::setWindowZones(int z) { resource.zones = z; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".windowZones" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".windowZones"; config.setValue(s.str(), resource.zones); - s.rdbuf()->freeze(0); } void BScreen::setWorkspaceCount(int w) { resource.workspaces = w; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".workspaces" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".workspaces"; config.setValue(s.str(), resource.workspaces); - s.rdbuf()->freeze(0); } void BScreen::setPlacementPolicy(int p) { resource.placement_policy = p; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".windowPlacement" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".windowPlacement"; const char *placement; switch (resource.placement_policy) { case CascadePlacement: placement = "CascadePlacement"; break; case BestFitPlacement: placement = "BestFitPlacement"; break; case ColSmartPlacement: placement = "ColSmartPlacement"; break; + case UnderMousePlacement: placement = "UnderMousePlacement"; break; + case ClickMousePlacement: placement = "ClickMousePlacement"; break; default: case RowSmartPlacement: placement = "RowSmartPlacement"; break; } config.setValue(s.str(), placement); - s.rdbuf()->freeze(0); } void BScreen::setEdgeSnapThreshold(int t) { resource.edge_snap_threshold = t; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".edgeSnapThreshold" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".edgeSnapThreshold"; config.setValue(s.str(), resource.edge_snap_threshold); - s.rdbuf()->freeze(0); } void BScreen::setRowPlacementDirection(int d) { resource.row_direction = d; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".rowPlacementDirection" << - ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".rowPlacementDirection"; config.setValue(s.str(), resource.row_direction == LeftRight ? "LeftToRight" : "RightToLeft"); - s.rdbuf()->freeze(0); } void BScreen::setColPlacementDirection(int d) { resource.col_direction = d; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".colPlacementDirection" << - ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".colPlacementDirection"; config.setValue(s.str(), resource.col_direction == TopBottom ? "TopToBottom" : "BottomToTop"); - s.rdbuf()->freeze(0); } @@ -983,28 +1079,25 @@ void BScreen::setStrftimeFormat(const char *f) { delete [] resource.strftime_format; resource.strftime_format = bstrdup(f); - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".strftimeFormat" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".strftimeFormat"; config.setValue(s.str(), resource.strftime_format); - s.rdbuf()->freeze(0); } #else // !HAVE_STRFTIME void BScreen::setDateFormat(int f) { resource.date_format = f; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".dateFormat" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".dateFormat"; config.setValue(s.str(), resource.date_format == B_EuropeanDate ? "European" : "American"); - s.rdbuf()->freeze(0); } void BScreen::setClock24Hour(Bool c) { resource.clock24hour = c; - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".clockFormat" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".clockFormat"; config.setValue(s.str(), resource.clock24hour ? 24 : 12); - s.rdbuf()->freeze(0); } #endif // HAVE_STRFTIME @@ -1014,14 +1107,13 @@ void BScreen::setHideToolbar(bool b) { getToolbar()->unMapToolbar(); else getToolbar()->mapToolbar(); - std::ostrstream s; - s << "session.screen" << getScreenNumber() << ".hideToolbar" << ends; + std::ostringstream s; + s << "session.screen" << getScreenNumber() << ".hideToolbar"; config.setValue(s.str(), resource.hide_toolbar ? "True" : "False"); - s.rdbuf()->freeze(0); } void BScreen::saveWorkspaceNames() { - std::ostrstream rc, names; + std::ostringstream rc, names; for (int i = 0; i < resource.workspaces; i++) { Workspace *w = getWorkspace(i); @@ -1031,12 +1123,10 @@ void BScreen::saveWorkspaceNames() { names << ','; } } - names << ends; + names; - rc << "session.screen" << getScreenNumber() << ".workspaceNames" << ends; + rc << "session.screen" << getScreenNumber() << ".workspaceNames"; config.setValue(rc.str(), names.str()); - rc.rdbuf()->freeze(0); - names.rdbuf()->freeze(0); } void BScreen::save() { @@ -1067,14 +1157,14 @@ void BScreen::save() { } void BScreen::load() { - std::ostrstream rscreen, rname, rclass; + std::ostringstream rscreen, rname, rclass; std::string s; bool b; long l; - rscreen << "session.screen" << getScreenNumber() << '.' << ends; + rscreen << "session.screen" << getScreenNumber() << '.'; - rname << rscreen.str() << "hideToolbar" << ends; - rclass << rscreen.str() << "HideToolbar" << ends; + rname << rscreen.str() << "hideToolbar"; + rclass << rscreen.str() << "HideToolbar"; if (config.getValue(rname.str(), rclass.str(), b)) resource.hide_toolbar = b; else @@ -1088,54 +1178,54 @@ void BScreen::load() { } rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "fullMaximization" << ends; - rclass << rscreen.str() << "FullMaximization" << ends; + rname << rscreen.str() << "fullMaximization"; + rclass << rscreen.str() << "FullMaximization"; if (config.getValue(rname.str(), rclass.str(), b)) resource.full_max = b; else resource.full_max = false; rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "focusNewWindows" << ends; - rclass << rscreen.str() << "FocusNewWindows" << ends; + rname << rscreen.str() << "focusNewWindows"; + rclass << rscreen.str() << "FocusNewWindows"; if (config.getValue(rname.str(), rclass.str(), b)) resource.focus_new = b; else resource.focus_new = false; rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "focusLastWindow" << ends; - rclass << rscreen.str() << "FocusLastWindow" << ends; + rname << rscreen.str() << "focusLastWindow"; + rclass << rscreen.str() << "FocusLastWindow"; if (config.getValue(rname.str(), rclass.str(), b)) resource.focus_last = b; else resource.focus_last = false; rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "rowPlacementDirection" << ends; - rclass << rscreen.str() << "RowPlacementDirection" << ends; + rname << rscreen.str() << "rowPlacementDirection"; + rclass << rscreen.str() << "RowPlacementDirection"; 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 << rscreen.str() << "colPlacementDirection" << ends; - rclass << rscreen.str() << "ColPlacementDirection" << ends; + rname << rscreen.str() << "colPlacementDirection"; + rclass << rscreen.str() << "ColPlacementDirection"; 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 << rscreen.str() << "workspaces" << ends; - rclass << rscreen.str() << "Workspaces" << ends; + rname << rscreen.str() << "workspaces"; + rclass << rscreen.str() << "Workspaces"; if (config.getValue(rname.str(), rclass.str(), l)) resource.workspaces = l; else @@ -1143,8 +1233,8 @@ void BScreen::load() { removeWorkspaceNames(); rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "workspaceNames" << ends; - rclass << rscreen.str() << "WorkspaceNames" << ends; + rname << rscreen.str() << "workspaceNames"; + rclass << rscreen.str() << "WorkspaceNames"; if (config.getValue(rname.str(), rclass.str(), s)) { std::string::const_iterator it = s.begin(), end = s.end(); while(1) { @@ -1159,8 +1249,8 @@ void BScreen::load() { } rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "focusModel" << ends; - rclass << rscreen.str() << "FocusModel" << ends; + rname << rscreen.str() << "focusModel"; + rclass << rscreen.str() << "FocusModel"; if (config.getValue(rname.str(), rclass.str(), s)) { if (0 == strncasecmp(s.c_str(), "ClickToFocus", s.length())) { resource.auto_raise = false; @@ -1169,7 +1259,7 @@ 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; } @@ -1179,16 +1269,16 @@ void BScreen::load() { } rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "windowZones" << ends; - rclass << rscreen.str() << "WindowZones" << ends; + rname << rscreen.str() << "windowZones"; + rclass << rscreen.str() << "WindowZones"; 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 << rscreen.str() << "windowPlacement" << ends; - rclass << rscreen.str() << "WindowPlacement" << ends; + rname << rscreen.str() << "windowPlacement"; + rclass << rscreen.str() << "WindowPlacement"; if (config.getValue(rname.str(), rclass.str(), s)) { if (0 == strncasecmp(s.c_str(), "RowSmartPlacement", s.length())) resource.placement_policy = RowSmartPlacement; @@ -1196,15 +1286,19 @@ void BScreen::load() { 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())) + 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 << rscreen.str() << "strftimeFormat"; + rclass << rscreen.str() << "StrftimeFormat"; if (resource.strftime_format != NULL) delete [] resource.strftime_format; @@ -1215,19 +1309,19 @@ void BScreen::load() { 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; + rname << rscreen.str() << "dateFormat"; + rclass << rscreen.str() << "DateFormat"; 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())) + 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; + rname << rscreen.str() << "clockFormat"; + rclass << rscreen.str() << "ClockFormat"; if (config.getValue(rname.str(), rclass.str(), l)) { if (clock == 24) resource.clock24hour = true; @@ -1238,24 +1332,24 @@ void BScreen::load() { #endif // HAVE_STRFTIME rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "edgeSnapThreshold" << ends; - rclass << rscreen.str() << "EdgeSnapThreshold" << ends; + rname << rscreen.str() << "edgeSnapThreshold"; + rclass << rscreen.str() << "EdgeSnapThreshold"; 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 << rscreen.str() << "imageDither" << ends; - rclass << rscreen.str() << "ImageDither" << ends; + rname << rscreen.str() << "imageDither"; + rclass << rscreen.str() << "ImageDither"; if (config.getValue(rname.str(), rclass.str(), b)) resource.image_dither = b; else resource.image_dither = true; rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "rootCommand" << ends; - rclass << rscreen.str() << "RootCommand" << ends; + rname << rscreen.str() << "rootCommand"; + rclass << rscreen.str() << "RootCommand"; if (resource.root_command != NULL) delete [] resource.root_command; @@ -1266,16 +1360,12 @@ void BScreen::load() { resource.root_command = NULL; rname.seekp(0); rclass.seekp(0); - rname << rscreen.str() << "opaqueMove" << ends; - rclass << rscreen.str() << "OpaqueMove" << ends; + rname << rscreen.str() << "opaqueMove"; + rclass << rscreen.str() << "OpaqueMove"; if (config.getValue(rname.str(), rclass.str(), b)) resource.opaque_move = b; else resource.opaque_move = false; - - rscreen.rdbuf()->freeze(0); - rname.rdbuf()->freeze(0); - rclass.rdbuf()->freeze(0); } void BScreen::reconfigure(void) {