all repos — openbox @ fb3848450e649a05c0bed84a02bc9ab4e563b5d9

openbox fork - make it a bit more like ryudo

window decorations use "unmanaged" widgets now.
Dana Jansens danakj@orodu.net
commit

fb3848450e649a05c0bed84a02bc9ab4e563b5d9

parent

fac1a6581b65b91eba3024d813a393e04007e197

7 files changed, 177 insertions(+), 299 deletions(-)

jump to
M otk/widget.ccotk/widget.cc

@@ -371,6 +371,7 @@

void OtkWidget::update(void) { if (_dirty) { + if (! _unmanaged) adjust(); render(); XClearWindow(OBDisplay::display, _window);
M otk/widget.hhotk/widget.hh

@@ -103,6 +103,8 @@ inline OtkEventDispatcher *getEventDispatcher(void)

{ return _event_dispatcher; } void setEventDispatcher(OtkEventDispatcher *disp); + void unmanaged(void) { _unmanaged = true; } + protected: bool _dirty;

@@ -145,6 +147,8 @@ unsigned int _screen;

bool _fixed_width; bool _fixed_height; + + bool _unmanaged; OtkEventDispatcher *_event_dispatcher; OtkApplication *_application;
M src/frame.ccsrc/frame.cc

@@ -10,52 +10,53 @@ #include <X11/extensions/shape.h>

#endif // SHAPE } +#include "openbox.hh" #include "frame.hh" #include "client.hh" #include "otk/display.hh" #include <string> +#include <iostream> // TEMP namespace ob { -OBFrame::OBFrame(OBClient *client, const otk::Style *style) - : _client(client), - _screen(otk::OBDisplay::screenInfo(client->screen())) +OBFrame::OBFrame(OBClient *client, otk::Style *style) + : otk::OtkWidget(Openbox::instance, style), + _client(client), + _screen(otk::OBDisplay::screenInfo(client->screen())), + _titlebar(this), + _button_close(&_titlebar), + _button_iconify(&_titlebar), + _button_max(&_titlebar), + _button_stick(&_titlebar), + _label(&_titlebar), + _handle(this), + _grip_left(&_handle), + _grip_right(&_handle), + _decorations(client->decorations()) { assert(client); assert(style); - - _decorations = client->decorations(); - - // create the base frame parent window - _window = createFrame(); - assert(_window); - // create all of the style element child windows - _titlebar = createChild(_window, 0); - assert(_titlebar); - _button_iconify = createChild(_titlebar, 0); - assert(_button_iconify); - _button_max = createChild(_titlebar, 0); - assert(_button_max); - _button_stick = createChild(_titlebar, 0); - assert(_button_stick); - _button_close = createChild(_titlebar, 0); - assert(_button_close); - _label = createChild(_titlebar, 0); - assert(_label); - XMapSubwindows(otk::OBDisplay::display, _titlebar); + unmanaged(); + _titlebar.unmanaged(); + _button_close.unmanaged(); + _button_iconify.unmanaged(); + _button_max.unmanaged(); + _button_stick.unmanaged(); + _label.unmanaged(); + _handle.unmanaged(); + _grip_left.unmanaged(); + _grip_right.unmanaged(); - _handle = createChild(_window, 0); - assert(_handle); - _grip_left = createChild(_handle, 0); - assert(_grip_left); - _grip_right = createChild(_handle, 0); - assert(_grip_right); - XMapSubwindows(otk::OBDisplay::display, _handle); - + _button_close.setText("X"); + _button_iconify.setText("I"); + _button_max.setText("M"); + _button_stick.setText("C"); + _label.setText(_client->title()); + _style = 0; - loadStyle(style); + setStyle(style); grabClient(); }

@@ -63,123 +64,113 @@

OBFrame::~OBFrame() { - XDestroyWindow(otk::OBDisplay::display, _button_iconify); - XDestroyWindow(otk::OBDisplay::display, _button_max); - XDestroyWindow(otk::OBDisplay::display, _button_stick); - XDestroyWindow(otk::OBDisplay::display, _button_close); - XDestroyWindow(otk::OBDisplay::display, _label); - XDestroyWindow(otk::OBDisplay::display, _titlebar); - XDestroyWindow(otk::OBDisplay::display, _grip_left); - XDestroyWindow(otk::OBDisplay::display, _grip_right); - XDestroyWindow(otk::OBDisplay::display, _handle); - releaseClient(false); - - XDestroyWindow(otk::OBDisplay::display, _window); } -void OBFrame::loadStyle(const otk::Style *style) +void OBFrame::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); if (replace) { // XXX: do shit here whatever + // XXX: save the position based on gravity } _style = style; - XSetWindowBorderWidth(otk::OBDisplay::display, _window, - _style->getBorderWidth()); - XSetWindowBorder(otk::OBDisplay::display, _window, - _style->getBorderColor().pixel()); - XSetWindowBorderWidth(otk::OBDisplay::display, _titlebar, - _style->getBorderWidth()); - XSetWindowBorder(otk::OBDisplay::display, _titlebar, - _style->getBorderColor().pixel()); - XSetWindowBorderWidth(otk::OBDisplay::display, _grip_left, - _style->getBorderWidth()); - XSetWindowBorder(otk::OBDisplay::display, _grip_left, - _style->getBorderColor().pixel()); - XSetWindowBorderWidth(otk::OBDisplay::display, _grip_right, - _style->getBorderWidth()); - XSetWindowBorder(otk::OBDisplay::display, _grip_right, - _style->getBorderColor().pixel()); - XSetWindowBorderWidth(otk::OBDisplay::display, _handle, - _style->getBorderWidth()); - XSetWindowBorder(otk::OBDisplay::display, _handle, - _style->getBorderColor().pixel()); + XSetWindowBorder(otk::OBDisplay::display, getWindow(), + _style->getBorderColor()->pixel()); + XSetWindowBorder(otk::OBDisplay::display, _titlebar.getWindow(), + _style->getBorderColor()->pixel()); + XSetWindowBorder(otk::OBDisplay::display, _grip_left.getWindow(), + _style->getBorderColor()->pixel()); + XSetWindowBorder(otk::OBDisplay::display, _grip_right.getWindow(), + _style->getBorderColor()->pixel()); + XSetWindowBorder(otk::OBDisplay::display, _handle.getWindow(), + _style->getBorderColor()->pixel()); // XXX: if (focused) - XSetWindowBackground(otk::OBDisplay::display, _window, - _style->getFrameFocus().color().pixel()); + XSetWindowBackground(otk::OBDisplay::display, getWindow(), + _style->getFrameFocus()->color().pixel()); // XXX: else // XXX: XSetWindowBackground(otk::OBDisplay::display, _window, // XXX: _style->getFrameUnfocus().color().pixel()); - // if !replace, then update() will get called after the client is grabbed! - if (replace) { - update(); - - // XXX: make everything redraw - } + // if !replace, then adjust() will get called after the client is grabbed! + if (replace) + adjust(); // size/position everything } -void OBFrame::update() +void OBFrame::adjust() { // XXX: only if not overridden or something!!! MORE LOGIC HERE!! _decorations = _client->decorations(); - + _decorations = 0xffffffff; + int width; // the width of the client window and the border around it + int bwidth; // width to make borders if (_decorations & OBClient::Decor_Border) { + bwidth = _style->getBorderWidth(); _size.left = _size.top = _size.bottom = _size.right = _style->getFrameWidth(); width = _client->area().width() + _style->getFrameWidth() * 2; } else { + bwidth = 0; _size.left = _size.top = _size.bottom = _size.right = 0; width = _client->area().width(); } + XSetWindowBorderWidth(otk::OBDisplay::display, getWindow(), bwidth); + XSetWindowBorderWidth(otk::OBDisplay::display, _titlebar.getWindow(), + bwidth); + XSetWindowBorderWidth(otk::OBDisplay::display, _grip_left.getWindow(), + bwidth); + XSetWindowBorderWidth(otk::OBDisplay::display, _grip_right.getWindow(), + bwidth); + XSetWindowBorderWidth(otk::OBDisplay::display, _handle.getWindow(), bwidth); if (_decorations & OBClient::Decor_Titlebar) { // set the titlebar size - _titlebar_area.setRect(-_style->getBorderWidth(), - -_style->getBorderWidth(), - width, - (_style->getFont().height() + - _style->getBevelWidth() * 2)); - _size.top += _titlebar_area.height() + _style->getBorderWidth(); + _titlebar.setGeometry(-bwidth, + -bwidth, + width, + (_style->getFont().height() + + _style->getBevelWidth() * 2)); + _size.top += _titlebar.height() + bwidth; // set the label size - _label_area.setRect(0, _style->getBevelWidth(), - width, _style->getFont().height()); + _label.setGeometry(0, _style->getBevelWidth(), + width, _style->getFont().height()); // set the buttons sizes if (_decorations & OBClient::Decor_Iconify) - _button_iconify_area.setRect(0, _style->getBevelWidth() + 1, - _label_area.height() - 2, - _label_area.height() - 2); + _button_iconify.setGeometry(0, _style->getBevelWidth() + 1, + _label.height() - 2, + _label.height() - 2); if (_decorations & OBClient::Decor_Maximize) - _button_max_area.setRect(0, _style->getBevelWidth() + 1, - _label_area.height() - 2, - _label_area.height() - 2); + _button_max.setGeometry(0, _style->getBevelWidth() + 1, + _label.height() - 2, + _label.height() - 2); if (_decorations & OBClient::Decor_Sticky) - _button_stick_area.setRect(0, _style->getBevelWidth() + 1, - _label_area.height() - 2, - _label_area.height() - 2); + _button_stick.setGeometry(0, _style->getBevelWidth() + 1, + _label.height() - 2, + _label.height() - 2); if (_decorations & OBClient::Decor_Close) - _button_close_area.setRect(0, _style->getBevelWidth() + 1, - _label_area.height() - 2, - _label_area.height() - 2); + _button_close.setGeometry(0, _style->getBevelWidth() + 1, + _label.height() - 2, + _label.height() - 2); // separation between titlebar elements const int sep = _style->getBevelWidth() + 1; - std::string layout = "ILMC"; // XXX: get this from somewhere + std::string layout = "SLIMC"; // XXX: get this from somewhere // XXX: it is REQUIRED that by this point, the string only has one of each // possible letter, all of the letters are valid, and L exists somewhere in // the string!

@@ -188,175 +179,119 @@ // the size of the label. this ASSUMES the layout has only buttons other

// that the ONE LABEL!! // adds an extra sep so that there's a space on either side of the // titlebar.. note: x = sep, below. - _label_area.setWidth(_label_area.width() - - ((_button_iconify_area.width() + sep) * - (layout.size() - 1) + sep)); + _label.setWidth(_label.width() - + ((_button_iconify.width() + sep) * + (layout.size() - 1) + sep * 2)); int x = sep; for (int i = 0, len = layout.size(); i < len; ++i) { - otk::Rect *area; switch (layout[i]) { case 'I': - if (!(_decorations & OBClient::Decor_Iconify)) - continue; // skip it - area = &_button_iconify_area; + _button_iconify.move(x, _button_iconify.getRect().y()); + x += _button_iconify.width(); break; case 'L': - area = &_label_area; + _label.move(x, _label.getRect().y()); + x += _label.width(); break; case 'M': - if (!(_decorations & OBClient::Decor_Maximize)) - continue; // skip it - area = &_button_max_area; + _button_max.move(x, _button_max.getRect().y()); + x += _button_max.width(); break; case 'S': - if (!(_decorations & OBClient::Decor_Sticky)) - continue; // skip it - area = &_button_stick_area; + _button_stick.move(x, _button_stick.getRect().y()); + x += _button_stick.width(); break; case 'C': - if (!(_decorations & OBClient::Decor_Close)) - continue; // skip it - area = &_button_close_area; + _button_close.move(x, _button_close.getRect().y()); + x += _button_close.width(); break; default: assert(false); // the layout string is invalid! - continue; // just to fuck with g++ } - area->setX(x); - x += sep + area->width(); + x += sep; } } if (_decorations & OBClient::Decor_Handle) { - _handle_area.setRect(-_style->getBorderWidth(), - _size.top + _client->area().height() + - _style->getFrameWidth(), - width, _style->getHandleWidth()); - _grip_left_area.setRect(-_style->getBorderWidth(), - -_style->getBorderWidth(), + _handle.setGeometry(-bwidth, + _size.top + _client->area().height() + + _style->getFrameWidth(), + width, _style->getHandleWidth()); + _grip_left.setGeometry(-bwidth, + -bwidth, + // XXX: get a Point class in otk and use that for + // the 'buttons size' since theyre all the same + _button_iconify.width() * 2, + _handle.height()); + _grip_right.setGeometry(((_handle.getRect().right() + 1) - + _button_iconify.width() * 2), + -bwidth, // XXX: get a Point class in otk and use that for // the 'buttons size' since theyre all the same - _button_iconify_area.width() * 2, - _handle_area.height()); - _grip_right_area.setRect(((_handle_area.right() + 1) - - _button_iconify_area.width() * 2), - -_style->getBorderWidth(), - // XXX: get a Point class in otk and use that for - // the 'buttons size' since theyre all the same - _button_iconify_area.width() * 2, - _handle_area.height()); - _size.bottom += _handle_area.height() + _style->getBorderWidth(); + _button_iconify.width() * 2, + _handle.height()); + _size.bottom += _handle.height() + bwidth; } // position/size all the windows - XResizeWindow(otk::OBDisplay::display, _window, - _size.left + _size.right + _client->area().width(), - _size.top + _size.bottom + _client->area().height()); + resize(_size.left + _size.right + _client->area().width(), + _size.top + _size.bottom + _client->area().height()); XMoveWindow(otk::OBDisplay::display, _client->window(), _size.left, _size.top); - if (_decorations & OBClient::Decor_Titlebar) { - XMoveResizeWindow(otk::OBDisplay::display, _titlebar, - _titlebar_area.x(), _titlebar_area.y(), - _titlebar_area.width(), _titlebar_area.height()); - XMoveResizeWindow(otk::OBDisplay::display, _label, - _label_area.x(), _label_area.y(), - _label_area.width(), _label_area.height()); - if (_decorations & OBClient::Decor_Iconify) - XMoveResizeWindow(otk::OBDisplay::display, _button_iconify, - _button_iconify_area.x(), _button_iconify_area.y(), - _button_iconify_area.width(), - _button_iconify_area.height()); - if (_decorations & OBClient::Decor_Maximize) - XMoveResizeWindow(otk::OBDisplay::display, _button_max, - _button_max_area.x(), _button_max_area.y(), - _button_max_area.width(), - _button_max_area.height()); - if (_decorations & OBClient::Decor_Sticky) - XMoveResizeWindow(otk::OBDisplay::display, _button_stick, - _button_stick_area.x(), _button_stick_area.y(), - _button_stick_area.width(), - _button_stick_area.height()); - if (_decorations & OBClient::Decor_Close) - XMoveResizeWindow(otk::OBDisplay::display, _button_close, - _button_close_area.x(), _button_close_area.y(), - _button_close_area.width(), - _button_close_area.height()); - } - - if (_decorations & OBClient::Decor_Handle) { - XMoveResizeWindow(otk::OBDisplay::display, _handle, - _handle_area.x(), _handle_area.y(), - _handle_area.width(), _handle_area.height()); - XMoveResizeWindow(otk::OBDisplay::display, _grip_left, - _grip_left_area.x(), _grip_left_area.y(), - _grip_left_area.width(), _grip_left_area.height()); - XMoveResizeWindow(otk::OBDisplay::display, _grip_right, - _grip_right_area.x(), _grip_right_area.y(), - _grip_right_area.width(), _grip_right_area.height()); - } - // map/unmap all the windows if (_decorations & OBClient::Decor_Titlebar) { - XMapWindow(otk::OBDisplay::display, _label); + _label.show(); if (_decorations & OBClient::Decor_Iconify) - XMapWindow(otk::OBDisplay::display, _button_iconify); + _button_iconify.show(); else - XUnmapWindow(otk::OBDisplay::display, _button_iconify); + _button_iconify.hide(); if (_decorations & OBClient::Decor_Maximize) - XMapWindow(otk::OBDisplay::display, _button_max); + _button_max.show(); else - XUnmapWindow(otk::OBDisplay::display, _button_max); + _button_max.hide(); if (_decorations & OBClient::Decor_Sticky) - XMapWindow(otk::OBDisplay::display, _button_stick); + _button_stick.show(); else - XUnmapWindow(otk::OBDisplay::display, _button_stick); + _button_stick.hide(); if (_decorations & OBClient::Decor_Close) - XMapWindow(otk::OBDisplay::display, _button_close); + _button_close.show(); else - XUnmapWindow(otk::OBDisplay::display, _button_close); - XMapWindow(otk::OBDisplay::display, _titlebar); + _button_close.hide(); + _titlebar.show(); } else { - XUnmapWindow(otk::OBDisplay::display, _titlebar); - XUnmapWindow(otk::OBDisplay::display, _label); - XUnmapWindow(otk::OBDisplay::display, _button_iconify); - XUnmapWindow(otk::OBDisplay::display, _button_max); - XUnmapWindow(otk::OBDisplay::display, _button_stick); - XUnmapWindow(otk::OBDisplay::display, _button_close); + _titlebar.hide(true); } - if (_decorations & OBClient::Decor_Handle) { - XMapWindow(otk::OBDisplay::display, _grip_left); - XMapWindow(otk::OBDisplay::display, _grip_right); - XMapWindow(otk::OBDisplay::display, _handle); - } else { - XUnmapWindow(otk::OBDisplay::display, _handle); - XUnmapWindow(otk::OBDisplay::display, _grip_left); - XUnmapWindow(otk::OBDisplay::display, _grip_right); - } + if (_decorations & OBClient::Decor_Handle) + _handle.show(true); + else + _handle.hide(true); // XXX: more is gunna have to happen here - updateShape(); + adjustShape(); + + update(); } -void OBFrame::updateShape() +void OBFrame::adjustShape() { #ifdef SHAPE if (!_client->shaped()) { // clear the shape on the frame window - XShapeCombineMask(otk::OBDisplay::display, _window, ShapeBounding, + XShapeCombineMask(otk::OBDisplay::display, getWindow(), ShapeBounding, _size.left, _size.top, None, ShapeSet); } else { // make the frame's shape match the clients - XShapeCombineShape(otk::OBDisplay::display, _window, ShapeBounding, + XShapeCombineShape(otk::OBDisplay::display, getWindow(), ShapeBounding, _size.left, _size.top, _client->window(), ShapeBounding, ShapeSet);

@@ -381,7 +316,7 @@ xrect[1].height = frame.handle_h + (frame.border_w * 2);

++num; }*/ - XShapeCombineRectangles(otk::OBDisplay::display, _window, + XShapeCombineRectangles(otk::OBDisplay::display, getWindow(), ShapeBounding, 0, 0, xrect, num, ShapeUnion, Unsorted); }

@@ -396,7 +331,7 @@ // select the event mask on the frame

//XSelectInput(otk::OBDisplay::display, _window, SubstructureRedirectMask); // reparent the client to the frame - XReparentWindow(otk::OBDisplay::display, _client->window(), _window, 0, 0); + XReparentWindow(otk::OBDisplay::display, _client->window(), getWindow(), 0, 0); _client->ignore_unmaps++; // raise the client above the frame

@@ -404,7 +339,7 @@ //XRaiseWindow(otk::OBDisplay::display, _client->window());

// map the client so it maps when the frame does XMapWindow(otk::OBDisplay::display, _client->window()); - update(); + adjust(); }
M src/frame.hhsrc/frame.hh

@@ -14,6 +14,10 @@ #include "otk/strut.hh"

#include "otk/rect.hh" #include "otk/screeninfo.hh" #include "otk/style.hh" +#include "otk/widget.hh" +#include "otk/button.hh" +#include "otk/focuswidget.hh" +#include "otk/focuslabel.hh" #include <string>

@@ -22,46 +26,27 @@

//! Holds and decorates a frame around an OBClient (client window) /*! */ -class OBFrame { +class OBFrame : public otk::OtkWidget { private: OBClient *_client; const otk::ScreenInfo *_screen; //! The style to use for size and display the decorations - const otk::Style *_style; + otk::Style *_style; - //! The window id of the base frame window - Window _window; //! The size of the frame on each side of the client window otk::Strut _size; // decoration windows - Window _titlebar; - otk::Rect _titlebar_area; - - Window _button_close; - otk::Rect _button_close_area; - - Window _button_iconify; - otk::Rect _button_iconify_area; - - Window _button_max; - otk::Rect _button_max_area; - - Window _button_stick; - otk::Rect _button_stick_area; - - Window _label; - otk::Rect _label_area; - - Window _handle; - otk::Rect _handle_area; - - Window _grip_left; - otk::Rect _grip_left_area; - - Window _grip_right; - otk::Rect _grip_right_area; + otk::OtkFocusWidget _titlebar; + otk::OtkButton _button_close; + otk::OtkButton _button_iconify; + otk::OtkButton _button_max; + otk::OtkButton _button_stick; + otk::OtkFocusLabel _label; + otk::OtkFocusWidget _handle; + otk::OtkButton _grip_left; + otk::OtkButton _grip_right; //! The decorations to display on the window. /*!

@@ -89,31 +74,17 @@ /*!

@param client The client window which will be decorated by the new OBFrame @param style The style to use to decorate the frame */ - OBFrame(OBClient *client, const otk::Style *style); + OBFrame(OBClient *client, otk::Style *style); //! Destroys the OBFrame object virtual ~OBFrame(); - //! Load a style to decorate the frame with - void loadStyle(const otk::Style *style); + //! Set the style to decorate the frame with + virtual void setStyle(otk::Style *style); //! Update the frame to match the client - void update(); + void adjust(); //! Shape the frame window to the client window - void updateShape(); - - //! Returns the frame's most-parent window, which is a child of the root - //! window - inline Window window() const { return _window; } - - inline Window titlebar() const { return _titlebar; } - inline Window label() const { return _label; } - inline Window buttonIconify() const { return _button_iconify; } - inline Window buttonMax() const { return _button_max; } - inline Window buttonStick() const { return _button_stick; } - inline Window buttonClose() const { return _button_close; } - inline Window handle() const { return _handle; } - inline Window gripLeft() const { return _grip_left; } - inline Window gripRight() const { return _grip_right; } + void adjustShape(); }; }
M src/openbox.ccsrc/openbox.cc

@@ -74,6 +74,8 @@ }

Openbox::Openbox(int argc, char **argv) + : otk::OtkEventDispatcher(), + otk::OtkEventHandler() { struct sigaction action;

@@ -244,14 +246,8 @@

void Openbox::eventLoop() { while (!_doshutdown) { - if (XPending(otk::OBDisplay::display)) { - XEvent e; - XNextEvent(otk::OBDisplay::display, &e); - //process_event(&e); - _xeventhandler.handle(e); - } else { - _timermanager.fire(); - } + dispatchEvents(); // from OtkEventDispatcher + _timermanager.fire(); } }
M src/openbox.hhsrc/openbox.hh

@@ -22,7 +22,8 @@ #include "otk/screeninfo.hh"

#include "otk/timerqueuemanager.hh" #include "otk/property.hh" #include "otk/configuration.hh" -#include "xeventhandler.hh" +#include "otk/eventdispatcher.hh" +#include "otk/eventhandler.hh" #include "client.hh" namespace ob {

@@ -39,7 +40,7 @@ the Openbox::eventLoop function should be called. The eventLoop method does

not exit until the window manager is ready to be destroyed. Destruction of the Openbox class instance will shutdown the window manager. */ -class Openbox +class Openbox : public otk::OtkEventDispatcher, public otk::OtkEventHandler { public: //! The single instance of the Openbox class for the application.

@@ -101,9 +102,6 @@ Use of the otk::OBTimerQueueManager::fire funtion in this object ensures

that all timers fire when their times elapse. */ otk::OBTimerQueueManager _timermanager; - - //! The class which will handle raw XEvents - OBXEventHandler _xeventhandler; //! Cached atoms on the display /*!
M src/screen.ccsrc/screen.cc

@@ -365,24 +365,11 @@ // create the decoration frame for the client window

client->frame = new OBFrame(client, &_style); // XXX: if on the current desktop.. - XMapWindow(otk::OBDisplay::display, client->frame->window()); + client->frame->show(); // XXX: handle any requested states such as shaded/maximized otk::OBDisplay::ungrab(); - - // add all the client's windows as event handlers for the client - Openbox::instance->addClient(window, client); - Openbox::instance->addClient(client->frame->window(), client); - Openbox::instance->addClient(client->frame->titlebar(), client); - Openbox::instance->addClient(client->frame->buttonIconify(), client); - Openbox::instance->addClient(client->frame->buttonMax(), client); - Openbox::instance->addClient(client->frame->buttonStick(), client); - Openbox::instance->addClient(client->frame->buttonClose(), client); - Openbox::instance->addClient(client->frame->label(), client); - Openbox::instance->addClient(client->frame->handle(), client); - Openbox::instance->addClient(client->frame->gripLeft(), client); - Openbox::instance->addClient(client->frame->gripRight(), client); // add to the screen's list _clients.push_back(client);

@@ -403,25 +390,11 @@

// we dont want events no more XSelectInput(otk::OBDisplay::display, client->window(), NoEventMask); - XUnmapWindow(otk::OBDisplay::display, frame->window()); + frame->hide(); // we dont want a border on the client XSetWindowBorderWidth(otk::OBDisplay::display, client->window(), client->borderWidth()); - - // remove the client class from the search list - Openbox::instance->removeClient(client->window()); - // remove the frame's decor elements as event handlers for the client - Openbox::instance->removeClient(frame->window()); - Openbox::instance->removeClient(frame->titlebar()); - Openbox::instance->removeClient(frame->buttonIconify()); - Openbox::instance->removeClient(frame->buttonMax()); - Openbox::instance->removeClient(frame->buttonStick()); - Openbox::instance->removeClient(frame->buttonClose()); - Openbox::instance->removeClient(frame->label()); - Openbox::instance->removeClient(frame->handle()); - Openbox::instance->removeClient(frame->gripLeft()); - Openbox::instance->removeClient(frame->gripRight()); delete client->frame; client->frame = 0;