#include "Slit.h"
#include "Toolbar.h"
-#include <string>
#include <strstream>
+#include <string>
+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)
{
- // default values
- m_placement = CenterRight;
- m_direction = Vertical;
- m_ontop = false;
- m_hidden = m_autohide = false;
-
+ 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);
- clientList = new LinkedList<SlitClient>;
-
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);
if (timer->isTiming()) timer->stop();
delete timer;
- delete clientList;
+ clientList.clear();
+
delete slitmenu;
screen.getImageControl()->removeImage(frame.pixmap);
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);
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);
- clientList->insert(client);
+ clientList.push_back(client);
openbox.saveSlitSearch(client->client_window, this);
openbox.saveSlitSearch(client->icon_window, this);
void Slit::removeClient(SlitClient *client, Bool remap) {
openbox.removeSlitSearch(client->client_window);
openbox.removeSlitSearch(client->icon_window);
- clientList->remove(client);
+
+ clientList.remove(client);
screen.removeNetizen(client->window);
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);
}
Bool reconf = False;
- LinkedListIterator<SlitClient> it(clientList);
- for (SlitClient *tmp = it.current(); tmp; it++, tmp = it.current()) {
- if (tmp->window == w) {
- removeClient(tmp, remap);
+ slitClientList::iterator it;
+ for (it = clientList.begin(); it != clientList.end(); it++)
+ if ((*it)->window == w) {
+ removeClient(*it, remap);
reconf = True;
-
break;
}
- }
- if (reconf) reconfigure();
+ if (reconf)
+ reconfigure();
openbox.ungrab();
}
void Slit::setOnTop(bool b) {
m_ontop = b;
- ostrstream s;
+ 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;
- ostrstream s;
+ 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;
- ostrstream s;
- s << "session.screen" << screen.getScreenNumber() << ".slit.placement" <<
- ends;
+ std::ostrstream s;
+ s << "session.screen" << screen.getScreenNumber() << ".slit.placement"
+ << ends;
const char *placement;
switch (m_placement) {
case TopLeft: placement = "TopLeft"; break;
case CenterRight: default: placement = "CenterRight"; break;
}
config.setValue(s.str(), placement);
+ s.rdbuf()->freeze(0);
}
void Slit::setDirection(int d) {
m_direction = d;
- ostrstream s;
- s << "session.screen" << screen.getScreenNumber() << ".slit.direction" <<
- ends;
+ 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() {
m_placement = BottomRight;
else if (0 == strncasecmp(s.c_str(), "CenterRight", s.length()))
m_placement = CenterRight;
- }
+ } else
+ m_placement = CenterRight;
rname.seekp(0); rclass.seekp(0);
+ 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)) {
m_direction = Horizontal;
else if (0 == strncasecmp(s.c_str(), "Vertical", s.length()))
m_direction = Vertical;
- }
-
+ } else
+ m_direction = Vertical;
+
rname.seekp(0); rclass.seekp(0);
+ 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.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) {
- load();
-
+ timer->setTimeout(openbox.getAutoRaiseDelay());
+
frame.area.setSize(0, 0);
- LinkedListIterator<SlitClient> it(clientList);
- SlitClient *client;
+ slitClientList::const_iterator it;
switch (m_direction) {
case Vertical:
- for (client = it.current(); client; it++, client = it.current()) {
- frame.area.setH(frame.area.h() + client->height + screen.getBevelWidth());
+ for (it = clientList.begin(); it != clientList.end(); it++) {
+ frame.area.setH(frame.area.h() + (*it)->height + screen.getBevelWidth());
- if (frame.area.w() < client->width)
- frame.area.setW(client->width);
+ if (frame.area.w() < (*it)->width)
+ frame.area.setW((*it)->width);
}
if (frame.area.w() < 1)
break;
case Horizontal:
- for (client = it.current(); client; it++, client = it.current()) {
- frame.area.setW(frame.area.w() + client->width + screen.getBevelWidth());
+ for (it = clientList.begin(); it != clientList.end(); it++) {
+ frame.area.setW(frame.area.w() + (*it)->width + screen.getBevelWidth());
- if (frame.area.h() < client->height)
- frame.area.setH(client->height);
+ if (frame.area.h() < (*it)->height)
+ frame.area.setH((*it)->height);
}
if (frame.area.w() < 1)
XSetWindowBorder(display, frame.window,
screen.getBorderColor()->getPixel());
- if (! clientList->count())
+ if (! clientList.size())
XUnmapWindow(display, frame.window);
else
XMapWindow(display, frame.window);
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);
XClearWindow(display, frame.window);
int x, y;
- it.reset();
switch (m_direction) {
case Vertical:
x = 0;
y = screen.getBevelWidth();
- for (client = it.current(); client; it++, client = it.current()) {
- x = (frame.area.w() - client->width) / 2;
+ for (it = clientList.begin(); it != clientList.end(); it++) {
+ x = (frame.area.w() - (*it)->width) / 2;
- XMoveResizeWindow(display, client->window, x, y,
- client->width, client->height);
- XMapWindow(display, client->window);
+ XMoveResizeWindow(display, (*it)->window, x, y,
+ (*it)->width, (*it)->height);
+ XMapWindow(display, (*it)->window);
// for ICCCM compliance
- client->x = x;
- client->y = y;
+ (*it)->x = x;
+ (*it)->y = y;
XEvent event;
event.type = ConfigureNotify;
event.xconfigure.display = display;
- event.xconfigure.event = client->window;
- event.xconfigure.window = client->window;
+ event.xconfigure.event = (*it)->window;
+ event.xconfigure.window = (*it)->window;
event.xconfigure.x = x;
event.xconfigure.y = y;
- event.xconfigure.width = client->width;
- event.xconfigure.height = client->height;
+ event.xconfigure.width = (*it)->width;
+ event.xconfigure.height = (*it)->height;
event.xconfigure.border_width = 0;
event.xconfigure.above = frame.window;
event.xconfigure.override_redirect = False;
- XSendEvent(display, client->window, False, StructureNotifyMask, &event);
+ XSendEvent(display, (*it)->window, False, StructureNotifyMask, &event);
- y += client->height + screen.getBevelWidth();
+ y += (*it)->height + screen.getBevelWidth();
}
break;
x = screen.getBevelWidth();
y = 0;
- for (client = it.current(); client; it++, client = it.current()) {
- y = (frame.area.h() - client->height) / 2;
+ for (it = clientList.begin(); it != clientList.end(); it++) {
+ y = (frame.area.h() - (*it)->height) / 2;
- XMoveResizeWindow(display, client->window, x, y,
- client->width, client->height);
- XMapWindow(display, client->window);
+ XMoveResizeWindow(display, (*it)->window, x, y,
+ (*it)->width, (*it)->height);
+ XMapWindow(display, (*it)->window);
// for ICCCM compliance
- client->x = x;
- client->y = y;
+ (*it)->x = x;
+ (*it)->y = y;
XEvent event;
event.type = ConfigureNotify;
event.xconfigure.display = display;
- event.xconfigure.event = client->window;
- event.xconfigure.window = client->window;
+ event.xconfigure.event = (*it)->window;
+ event.xconfigure.window = (*it)->window;
event.xconfigure.x = x;
event.xconfigure.y = y;
- event.xconfigure.width = client->width;
- event.xconfigure.height = client->height;
+ event.xconfigure.width = (*it)->width;
+ event.xconfigure.height = (*it)->height;
event.xconfigure.border_width = 0;
event.xconfigure.above = frame.window;
event.xconfigure.override_redirect = False;
- XSendEvent(display, client->window, False, StructureNotifyMask, &event);
+ XSendEvent(display, (*it)->window, False, StructureNotifyMask, &event);
- x += client->width + screen.getBevelWidth();
+ x += (*it)->width + screen.getBevelWidth();
}
break;
Toolbar *tbar = screen.getToolbar();
int sw = frame.area.w() + (screen.getBorderWidth() * 2),
- sh = frame.area.h() + (screen.getBorderWidth() * 2),
- tw = tbar->getWidth() + screen.getBorderWidth(),
- th = tbar->getHeight() + screen.getBorderWidth();
-
- if (tbar->getX() < frame.area.x() + sw &&
- tbar->getX() + tw > frame.area.x() &&
- tbar->getY() < frame.area.y() + sh &&
- tbar->getY() + th > frame.area.y()) {
+ 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() &&
+ tbar->area().y() < frame.area.y() + sh &&
+ tbar->area().y() + th > frame.area.y()) {
if (frame.area.y() < th) {
frame.area.setY(frame.area.y() + tbar->getExposedHeight());
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());
}
void Slit::shutdown(void) {
- while (clientList->count())
- removeClient(clientList->first());
+ while (clientList.size())
+ removeClient(clientList.front());
}
XConfigureWindow(display, e->window, e->value_mask, &xwc);
- LinkedListIterator<SlitClient> it(clientList);
- SlitClient *client = it.current();
- for (; client; it++, client = it.current())
+ slitClientList::iterator it = clientList.begin();
+ for (; it != clientList.end(); it++) {
+ SlitClient *client = *it;
if (client->window == e->window)
if (client->width != ((unsigned) e->width) ||
client->height != ((unsigned) e->height)) {
client->width = (unsigned) e->width;
client->height = (unsigned) e->height;
-
reconf = True;
-
break;
}
+ }
- if (reconf) reconfigure();
-
+ if (reconf)
+ reconfigure();
}
-
openbox.ungrab();
}
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();
- if (slit.onTop()) setItemSelected(2, True);
- if (slit.autoHide()) setItemSelected(3, True);
+ setValues();
+}
+
+void Slitmenu::setValues() {
+ setItemSelected(2, slit.onTop());
+ setItemSelected(3, slit.autoHide());
}
void Slitmenu::reconfigure(void) {
+ setValues();
directionmenu->reconfigure();
placementmenu->reconfigure();
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();
+ }
- if (sm.slit.direction() == Slit::Horizontal)
+
+void Slitmenu::Directionmenu::setValues() {
+ if (slitmenu.slit.direction() == Slit::Horizontal)
setItemSelected(0, True);
else
setItemSelected(1, True);
}
+void Slitmenu::Directionmenu::reconfigure() {
+ setValues();
+ Basemenu::reconfigure();
+}
+
void Slitmenu::Directionmenu::itemSelected(int button, int index) {
if (button != 1)
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) {