Slit::Slit(BScreen *scr) {
screen = scr;
blackbox = screen->getBlackbox();
+ slitstr = "session.screen" + itostring(screen->getScreenNumber()) + ".slit.";
+ config = blackbox->getConfig();
- on_top = screen->isSlitOnTop();
- hidden = do_auto_hide = screen->doSlitAutoHide();
+ load_rc();
display = screen->getBaseDisplay()->getXDisplay();
frame.window = frame.pixmap = None;
delete slitmenu;
+ screen->removeStrut(&strut);
+ screen->updateAvailableArea();
+
screen->getImageControl()->removeImage(frame.pixmap);
blackbox->removeSlitSearch(frame.window);
}
+void Slit::saveOnTop(bool b) {
+ on_top = b;
+ config->setValue(slitstr + "onTop", on_top);
+}
+
+void Slit::saveAutoHide(bool b) {
+ do_auto_hide = b;
+ config->setValue(slitstr + "autoHide", do_auto_hide);
+}
+
+void Slit::savePlacement(int p) {
+ placement = p;
+ const char *pname;
+ switch (placement) {
+ case TopLeft: pname = "TopLeft"; break;
+ case CenterLeft: pname = "CenterLeft"; break;
+ case BottomLeft: pname = "BottomLeft"; break;
+ case TopCenter: pname = "TopCenter"; break;
+ case BottomCenter: pname = "BottomCenter"; break;
+ case TopRight: pname = "TopRight"; break;
+ case BottomRight: pname = "BottomRight"; break;
+ case CenterRight: default: pname = "CenterRight"; break;
+ }
+ config->setValue(slitstr + "placement", pname);
+}
+
+void Slit::saveDirection(int d) {
+ direction = d;
+ config->setValue(slitstr + "direction", (direction == Horizontal ?
+ "Horizontal" : "Vertical"));
+}
+
+void Slit::save_rc(void) {
+ saveOnTop(on_top);
+ saveAutoHide(do_auto_hide);
+ savePlacement(placement);
+ saveDirection(direction);
+}
+
+void Slit::load_rc(void) {
+ std::string s;
+
+ if (! config->getValue(slitstr + "onTop", on_top))
+ on_top = false;
+
+ if (! config->getValue(slitstr + "autoHide", do_auto_hide))
+ do_auto_hide = false;
+ hidden = do_auto_hide;
+
+ if (config->getValue(slitstr + "direction", s) && s == "Horizontal")
+ direction = Horizontal;
+ else
+ direction = Vertical;
+
+ if (config->getValue(slitstr + "placement", s)) {
+ if (s == "TopLeft")
+ placement = TopLeft;
+ else if (s == "CenterLeft")
+ placement = CenterLeft;
+ else if (s == "BottomLeft")
+ placement = BottomLeft;
+ else if (s == "TopCenter")
+ placement = TopCenter;
+ else if (s == "BottomCenter")
+ placement = BottomCenter;
+ else if (s == "TopRight")
+ placement = TopRight;
+ else if (s == "BottomRight")
+ placement = BottomRight;
+ else //if (s == "CenterRight")
+ placement = CenterRight;
+ } else
+ placement = CenterRight;
+}
+
+
void Slit::reconfigure(void) {
SlitClientList::iterator it = clientList.begin();
const SlitClientList::iterator end = clientList.end();
unsigned int width = 0, height = 0;
- switch (screen->getSlitDirection()) {
+ switch (direction) {
case Vertical:
for (; it != end; ++it) {
client = *it;
int x, y;
- switch (screen->getSlitDirection()) {
+ switch (direction) {
case Vertical:
x = 0;
y = screen->getBevelWidth();
strut.top = strut.bottom = strut.left = strut.right = 0;
if (! clientList.empty()) {
- switch (screen->getSlitDirection()) {
+ // when not hidden both borders are in use, when hidden only one is
+ unsigned int border_width = screen->getBorderWidth();
+ if (! do_auto_hide)
+ border_width *= 2;
+
+ switch (direction) {
case Vertical:
- switch (screen->getSlitPlacement()) {
+ switch (placement) {
case TopCenter:
- strut.top = getY() + getExposedHeight() +
- (screen->getBorderWidth() * 2);
+ strut.top = getExposedHeight() + border_width;
break;
case BottomCenter:
- strut.bottom = screen->getHeight() - getY();
+ strut.bottom = getExposedHeight() + border_width;
break;
case TopLeft:
case CenterLeft:
case BottomLeft:
- strut.left = getExposedWidth() + (screen->getBorderWidth() * 2);
+ strut.left = getExposedWidth() + border_width;
break;
case TopRight:
case CenterRight:
case BottomRight:
- strut.right = getExposedWidth() + (screen->getBorderWidth() * 2);
+ strut.right = getExposedWidth() + border_width;
break;
}
break;
case Horizontal:
- switch (screen->getSlitPlacement()) {
+ switch (placement) {
case TopCenter:
case TopLeft:
case TopRight:
- strut.top = getY() + getExposedHeight() +
- (screen->getBorderWidth() * 2);
+ strut.top = getExposedHeight() + border_width;
break;
case BottomCenter:
case BottomLeft:
case BottomRight:
- strut.bottom = screen->getHeight() - getY();
+ strut.bottom = getExposedHeight() + border_width;
break;
case CenterLeft:
- strut.left = getExposedWidth() + (screen->getBorderWidth() * 2);
+ strut.left = getExposedWidth() + border_width;
break;
case CenterRight:
- strut.right = getExposedWidth() + (screen->getBorderWidth() * 2);
+ strut.right = getExposedWidth() + border_width;
break;
}
break;
void Slit::reposition(void) {
// place the slit in the appropriate place
- switch (screen->getSlitPlacement()) {
+ switch (placement) {
case TopLeft:
frame.rect.setPos(0, 0);
- if (screen->getSlitDirection() == Vertical) {
+ if (direction == Vertical) {
frame.x_hidden = screen->getBevelWidth() - screen->getBorderWidth()
- frame.rect.width();
frame.y_hidden = 0;
frame.rect.setPos(0, (screen->getHeight() - frame.rect.height()
- (screen->getBorderWidth() * 2)));
- if (screen->getSlitDirection() == Vertical) {
+ if (direction == Vertical) {
frame.x_hidden = screen->getBevelWidth() - screen->getBorderWidth()
- frame.rect.width();
frame.y_hidden = frame.rect.y();
frame.rect.setPos((screen->getWidth() - frame.rect.width()
- (screen->getBorderWidth() * 2)), 0);
- if (screen->getSlitDirection() == Vertical) {
+ if (direction == Vertical) {
frame.x_hidden = screen->getWidth() - screen->getBevelWidth()
- screen->getBorderWidth();
frame.y_hidden = 0;
(screen->getHeight() - frame.rect.height()
- (screen->getBorderWidth() * 2)));
- if (screen->getSlitDirection() == Vertical) {
+ if (direction == Vertical) {
frame.x_hidden = screen->getWidth() - screen->getBevelWidth()
- screen->getBorderWidth();
frame.y_hidden = frame.rect.y();
delta = -delta;
}
frame.rect.setY(frame.rect.y() + delta);
- if (screen->getSlitDirection() == Vertical)
+ if (direction == Vertical)
frame.y_hidden += delta;
}
}
-void Slit::buttonPressEvent(XButtonEvent *e) {
+void Slit::buttonPressEvent(const XButtonEvent *e) {
if (e->window != frame.window) return;
if (e->button == Button1 && (! on_top)) {
}
-void Slit::enterNotifyEvent(XCrossingEvent *) {
+void Slit::enterNotifyEvent(const XCrossingEvent *) {
if (! do_auto_hide)
return;
}
-void Slit::leaveNotifyEvent(XCrossingEvent *) {
+void Slit::leaveNotifyEvent(const XCrossingEvent *) {
if (! do_auto_hide)
return;
}
-void Slit::configureRequestEvent(XConfigureRequestEvent *e) {
+void Slit::configureRequestEvent(const XConfigureRequestEvent *e) {
if (! blackbox->validateWindow(e->window))
return;
void Slit::toggleAutoHide(void) {
- do_auto_hide = (do_auto_hide) ? False : True;
+ saveAutoHide(do_auto_hide ? False : True);
updateStrut();
}
-void Slit::unmapNotifyEvent(XUnmapEvent *e) {
+void Slit::unmapNotifyEvent(const XUnmapEvent *e) {
removeClient(e->window);
}
switch (item->function()) {
case 1: { // always on top
- slit->on_top = ((slit->isOnTop()) ? False : True);
- setItemSelected(2, slit->on_top);
+ slit->saveOnTop(! slit->isOnTop());
+ setItemSelected(2, slit->isOnTop());
if (slit->isOnTop()) slit->screen->raiseWindows((Window *) 0, 0);
break;
case 2: { // auto hide
slit->toggleAutoHide();
- setItemSelected(3, slit->do_auto_hide);
+ setItemSelected(3, slit->doAutoHide());
break;
}
Slitmenu::Directionmenu::Directionmenu(Slitmenu *sm)
- : Basemenu(sm->slit->screen) {
+ : Basemenu(sm->slit->screen), slit(sm->slit) {
setLabel(i18n(SlitSet, SlitSlitDirection, "Slit Direction"));
setInternalMenu();
Slit::Vertical);
update();
+ setValues();
+}
- if (getScreen()->getSlitDirection() == Slit::Horizontal)
- setItemSelected(0, True);
- else
- setItemSelected(1, True);
+
+void Slitmenu::Directionmenu::reconfigure(void) {
+ setValues();
+ Basemenu::reconfigure();
+}
+
+
+void Slitmenu::Directionmenu::setValues(void) {
+ const bool horiz = slit->getDirection() == Slit::Horizontal;
+ setItemSelected(0, horiz);
+ setItemSelected(1, ! horiz);
}
BasemenuItem *item = find(index);
if (! item) return;
- getScreen()->saveSlitDirection(item->function());
-
- if (item->function() == Slit::Horizontal) {
- setItemSelected(0, True);
- setItemSelected(1, False);
- } else {
- setItemSelected(0, False);
- setItemSelected(1, True);
- }
-
+ slit->saveDirection(item->function());
hide();
- getScreen()->getSlit()->reconfigure();
+ slit->reconfigure();
}
Slitmenu::Placementmenu::Placementmenu(Slitmenu *sm)
- : Basemenu(sm->slit->screen) {
+ : Basemenu(sm->slit->screen), slit(sm->slit) {
setLabel(i18n(SlitSet, SlitSlitPlacement, "Slit Placement"));
setMinimumSublevels(3);
Slit::BottomRight);
update();
+
+ setValues();
+}
+
+
+void Slitmenu::Placementmenu::reconfigure(void) {
+ setValues();
+ Basemenu::reconfigure();
+}
+
+
+void Slitmenu::Placementmenu::setValues(void) {
+ int place = 0;
+ switch (slit->getPlacement()) {
+ case Slit::BottomRight:
+ place++;
+ case Slit::CenterRight:
+ place++;
+ case Slit::TopRight:
+ place++;
+ case Slit::BottomCenter:
+ place++;
+ case Slit::TopCenter:
+ place++;
+ case Slit::BottomLeft:
+ place++;
+ case Slit::CenterLeft:
+ place++;
+ case Slit::TopLeft:
+ break;
+ }
+ setItemSelected(0, 0 == place);
+ setItemSelected(1, 1 == place);
+ setItemSelected(2, 2 == place);
+ setItemSelected(3, 3 == place);
+ setItemSelected(5, 4 == place);
+ setItemSelected(6, 5 == place);
+ setItemSelected(7, 6 == place);
+ setItemSelected(8, 7 == place);
}
BasemenuItem *item = find(index);
if (! (item && item->function())) return;
- getScreen()->saveSlitPlacement(item->function());
+ slit->savePlacement(item->function());
hide();
- getScreen()->getSlit()->reconfigure();
+ slit->reconfigure();
}