namespace ob {
-const long OBFrame::event_mask;
+const long Frame::event_mask;
-OBFrame::OBFrame(OBClient *client, otk::Style *style)
- : otk::OtkWidget(Openbox::instance, style, Horizontal, 0, 1, true),
- OBWidget(Type_Frame),
+Frame::Frame(Client *client, otk::Style *style)
+ : otk::Widget(openbox, style, Horizontal, 0, 1, true),
+ WidgetBase(WidgetBase::Type_Frame),
_client(client),
- _screen(otk::OBDisplay::screenInfo(client->screen())),
- _plate(this, OBWidget::Type_Plate),
- _titlebar(this, OBWidget::Type_Titlebar),
- _button_close(&_titlebar, OBWidget::Type_CloseButton),
- _button_iconify(&_titlebar, OBWidget::Type_IconifyButton),
- _button_max(&_titlebar, OBWidget::Type_MaximizeButton),
- _button_stick(&_titlebar, OBWidget::Type_StickyButton),
- _label(&_titlebar, OBWidget::Type_Label),
- _handle(this, OBWidget::Type_Handle),
- _grip_left(&_handle, OBWidget::Type_LeftGrip),
- _grip_right(&_handle, OBWidget::Type_RightGrip),
+ _screen(otk::display->screenInfo(client->screen())),
+ _plate(this, WidgetBase::Type_Plate),
+ _titlebar(this, WidgetBase::Type_Titlebar),
+ _button_close(&_titlebar, WidgetBase::Type_CloseButton),
+ _button_iconify(&_titlebar, WidgetBase::Type_IconifyButton),
+ _button_max(&_titlebar, WidgetBase::Type_MaximizeButton),
+ _button_stick(&_titlebar, WidgetBase::Type_StickyButton),
+ _label(&_titlebar, WidgetBase::Type_Label),
+ _handle(this, WidgetBase::Type_Handle),
+ _grip_left(&_handle, WidgetBase::Type_LeftGrip),
+ _grip_right(&_handle, WidgetBase::Type_RightGrip),
_decorations(client->decorations())
{
assert(client);
assert(style);
- XSelectInput(otk::OBDisplay::display, _window, OBFrame::event_mask);
+ XSelectInput(**otk::display, _window, Frame::event_mask);
- _grip_left.setCursor(Openbox::instance->cursors().ll_angle);
- _grip_right.setCursor(Openbox::instance->cursors().lr_angle);
+ _grip_left.setCursor(openbox->cursors().ll_angle);
+ _grip_right.setCursor(openbox->cursors().lr_angle);
_label.setText(_client->title());
_style = 0;
setStyle(style);
- otk::OtkWidget::unfocus(); // stuff starts out appearing focused in otk
+ otk::Widget::unfocus(); // stuff starts out appearing focused in otk
_plate.show(); // the other stuff is shown based on decor settings
-
- grabClient();
}
-OBFrame::~OBFrame()
+Frame::~Frame()
{
- releaseClient();
}
-void OBFrame::setTitle(const std::string &text)
+void Frame::setTitle(const otk::ustring &text)
{
_label.setText(text);
_label.update();
}
-void OBFrame::setStyle(otk::Style *style)
+void Frame::setStyle(otk::Style *style)
{
assert(style);
- otk::OtkWidget::setStyle(style);
-
// if a style was previously set, then 'replace' is true, cause we're
// replacing a style
bool replace = (_style);
+ otk::Widget::setStyle(style);
+
if (replace) {
// XXX: do shit here whatever
}
}
-void OBFrame::focus()
+void Frame::focus()
{
- otk::OtkWidget::focus();
+ otk::Widget::focus();
update();
}
-void OBFrame::unfocus()
+void Frame::unfocus()
{
- otk::OtkWidget::unfocus();
+ otk::Widget::unfocus();
update();
}
-void OBFrame::adjust()
+void Frame::adjust()
{
// the party all happens in adjustSize
}
-void OBFrame::adjustSize()
+void Frame::adjustSize()
{
// XXX: only if not overridden or something!!! MORE LOGIC HERE!!
_decorations = _client->decorations();
int butsize=0; // width and height of the titlebar buttons
const int bevel = _style->getBevelWidth();
- if (_decorations & OBClient::Decor_Border) {
+ if (_decorations & Client::Decor_Border) {
bwidth = _style->getBorderWidth();
cbwidth = _style->getFrameWidth();
} else
_grip_right.setBorderWidth(bwidth);
_handle.setBorderWidth(bwidth);
- if (_decorations & OBClient::Decor_Titlebar) {
+ if (_decorations & Client::Decor_Titlebar) {
// set the titlebar size
_titlebar.setGeometry(-bwidth,
-bwidth,
_label.setGeometry(0, bevel, width, _style->getFont()->height());
// set the buttons sizes
butsize = _label.height() - 2;
- if (_decorations & OBClient::Decor_Iconify)
+ if (_decorations & Client::Decor_Iconify)
_button_iconify.setGeometry(0, bevel + 1, butsize, butsize);
- if (_decorations & OBClient::Decor_Maximize)
+ if (_decorations & Client::Decor_Maximize)
_button_max.setGeometry(0, bevel + 1, butsize, butsize);
- if (_decorations & OBClient::Decor_Sticky)
+ if (_decorations & Client::Decor_Sticky)
_button_stick.setGeometry(0, bevel + 1, butsize, butsize);
- if (_decorations & OBClient::Decor_Close)
+ if (_decorations & Client::Decor_Close)
_button_close.setGeometry(0, bevel + 1, butsize, butsize);
// separation between titlebar elements
const int sep = bevel + 1;
- std::string layout;
+ otk::ustring layout;
if (!python_get_string("titlebar_layout", &layout))
layout = "ILMC";
switch (layout[i]) {
case 'i':
case 'I':
- if (!tit_i && (_decorations & OBClient::Decor_Iconify)) {
+ if (!tit_i && (_decorations & Client::Decor_Iconify)) {
tit_i = true;
continue;
}
break;
case 'm':
case 'M':
- if (!tit_m && (_decorations & OBClient::Decor_Maximize)) {
+ if (!tit_m && (_decorations & Client::Decor_Maximize)) {
tit_m = true;
continue;
}
break;
case 's':
case 'S':
- if (!tit_s && (_decorations & OBClient::Decor_Sticky)) {
+ if (!tit_s && (_decorations & Client::Decor_Sticky)) {
tit_s = true;
continue;
}
break;
case 'c':
case 'C':
- if (!tit_c && (_decorations & OBClient::Decor_Close)) {
+ if (!tit_c && (_decorations & Client::Decor_Close)) {
tit_c = true;
continue;
}
layout.erase(i--, 1);
}
if (!tit_l)
- layout.append(1, 'L');
+ layout += "L";
// the size of the label. this ASSUMES the layout has only buttons other
// that the ONE LABEL!!
}
}
- if (_decorations & OBClient::Decor_Handle) {
+ if (_decorations & Client::Decor_Handle) {
_handle.setGeometry(-bwidth,
_innersize.top + _client->area().height() + cbwidth,
width, _style->getHandleWidth());
_client->area().width(), _client->area().height());
// map/unmap all the windows
- if (_decorations & OBClient::Decor_Titlebar) {
+ if (_decorations & Client::Decor_Titlebar) {
_label.show();
if (tit_i)
_button_iconify.show();
_titlebar.hide(true);
}
- if (_decorations & OBClient::Decor_Handle)
+ if (_decorations & Client::Decor_Handle)
_handle.show(true);
else
_handle.hide(true);
}
-void OBFrame::adjustPosition()
+void Frame::adjustPosition()
{
int x, y;
clientGravity(x, y);
}
-void OBFrame::adjustShape()
+void Frame::adjustShape()
{
#ifdef SHAPE
- int bwidth = (_decorations & OBClient::Decor_Border) ?
+ int bwidth = (_decorations & Client::Decor_Border) ?
_style->getBorderWidth() : 0;
if (!_client->shaped()) {
// clear the shape on the frame window
- XShapeCombineMask(otk::OBDisplay::display, _window, ShapeBounding,
+ XShapeCombineMask(**otk::display, _window, ShapeBounding,
_innersize.left,
_innersize.top,
None, ShapeSet);
} else {
// make the frame's shape match the clients
- XShapeCombineShape(otk::OBDisplay::display, _window, ShapeBounding,
+ XShapeCombineShape(**otk::display, _window, ShapeBounding,
_innersize.left,
_innersize.top,
_client->window(), ShapeBounding, ShapeSet);
int num = 0;
XRectangle xrect[2];
- if (_decorations & OBClient::Decor_Titlebar) {
+ if (_decorations & Client::Decor_Titlebar) {
xrect[0].x = _titlebar.rect().x();
xrect[0].y = _titlebar.rect().y();
xrect[0].width = _titlebar.width() + bwidth * 2; // XXX: this is useless once the widget handles borders!
++num;
}
- if (_decorations & OBClient::Decor_Handle) {
+ if (_decorations & Client::Decor_Handle) {
xrect[1].x = _handle.rect().x();
xrect[1].y = _handle.rect().y();
xrect[1].width = _handle.width() + bwidth * 2; // XXX: this is useless once the widget handles borders!
++num;
}
- XShapeCombineRectangles(otk::OBDisplay::display, window(),
+ XShapeCombineRectangles(**otk::display, window(),
ShapeBounding, 0, 0, xrect, num,
ShapeUnion, Unsorted);
}
}
-void OBFrame::grabClient()
+void Frame::grabClient()
{
// reparent the client to the frame
- XReparentWindow(otk::OBDisplay::display, _client->window(),
+ XReparentWindow(**otk::display, _client->window(),
_plate.window(), 0, 0);
/*
When reparenting the client window, it is usually not mapped yet, since
member set the root window, and one set to the client, but both get handled
and need to be ignored.
*/
- if (Openbox::instance->state() == Openbox::State_Starting)
+ if (openbox->state() == Openbox::State_Starting)
_client->ignore_unmaps += 2;
// select the event mask on the client's parent (to receive config req's)
- XSelectInput(otk::OBDisplay::display, _plate.window(),
+ XSelectInput(**otk::display, _plate.window(),
SubstructureRedirectMask);
// map the client so it maps when the frame does
- XMapWindow(otk::OBDisplay::display, _client->window());
+ XMapWindow(**otk::display, _client->window());
adjustSize();
adjustPosition();
}
-void OBFrame::releaseClient()
+void Frame::releaseClient()
{
- // check if the app has already reparented its window to the root window
XEvent ev;
- if (XCheckTypedWindowEvent(otk::OBDisplay::display, _client->window(),
+
+ // check if the app has already reparented its window away
+ if (XCheckTypedWindowEvent(**otk::display, _client->window(),
ReparentNotify, &ev)) {
- /*
- If the app reparented itself, then we unmanage the window. This causes
- the window to be unmapped, so to be nice to it, we remap the window
- here. We don't put the event back onto the stack because we put it there
- in the first place.
- */
- XMapWindow(otk::OBDisplay::display, _client->window());
+ XPutBackEvent(**otk::display, &ev);
+ // re-map the window since the unmanaging process unmaps it
+ XMapWindow(**otk::display, _client->window());
} else {
- // according to the ICCCM - if the client doesn't reparent to
- // root, then we have to do it for them
- XReparentWindow(otk::OBDisplay::display, _client->window(),
+ // according to the ICCCM - if the client doesn't reparent itself, then we
+ // will reparent the window to root for them
+ XReparentWindow(**otk::display, _client->window(),
_screen->rootWindow(),
_client->area().x(), _client->area().y());
}
-
- // do an extra map here .. ? XXX
-// XMapWindow(otk::OBDisplay::display, _client->window());
}
-void OBFrame::clientGravity(int &x, int &y)
+void Frame::clientGravity(int &x, int &y)
{
x = _client->area().x();
y = _client->area().y();
}
-void OBFrame::frameGravity(int &x, int &y)
+void Frame::frameGravity(int &x, int &y)
{
x = rect().x();
y = rect().y();