From fb3848450e649a05c0bed84a02bc9ab4e563b5d9 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 1 Dec 2002 11:45:55 +0000 Subject: [PATCH] window decorations use "unmanaged" widgets now. --- otk/widget.cc | 1 + otk/widget.hh | 4 + src/frame.cc | 355 ++++++++++++++++++++----------------------------- src/frame.hh | 69 +++------- src/openbox.cc | 12 +- src/openbox.hh | 8 +- src/screen.cc | 31 +---- 7 files changed, 179 insertions(+), 301 deletions(-) diff --git a/otk/widget.cc b/otk/widget.cc index 61d65fbe..fa729a6f 100644 --- a/otk/widget.cc +++ b/otk/widget.cc @@ -371,6 +371,7 @@ void OtkWidget::adjustVert(void) void OtkWidget::update(void) { if (_dirty) { + if (! _unmanaged) adjust(); render(); XClearWindow(OBDisplay::display, _window); diff --git a/otk/widget.hh b/otk/widget.hh index 6c122a1d..80d269da 100644 --- a/otk/widget.hh +++ b/otk/widget.hh @@ -103,6 +103,8 @@ public: { return _event_dispatcher; } void setEventDispatcher(OtkEventDispatcher *disp); + void unmanaged(void) { _unmanaged = true; } + protected: bool _dirty; @@ -146,6 +148,8 @@ private: bool _fixed_width; bool _fixed_height; + bool _unmanaged; + OtkEventDispatcher *_event_dispatcher; OtkApplication *_application; }; diff --git a/src/frame.cc b/src/frame.cc index 20e81ebd..bb8a74f5 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -10,52 +10,53 @@ extern "C" { #endif // SHAPE } +#include "openbox.hh" #include "frame.hh" #include "client.hh" #include "otk/display.hh" #include +#include // 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); - - _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); - + + 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(); + + _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(OBClient *client, const otk::Style *style) 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 @@ void OBFrame::update() // 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 @@ void OBFrame::updateShape() ++num; }*/ - XShapeCombineRectangles(otk::OBDisplay::display, _window, + XShapeCombineRectangles(otk::OBDisplay::display, getWindow(), ShapeBounding, 0, 0, xrect, num, ShapeUnion, Unsorted); } @@ -396,7 +331,7 @@ void OBFrame::grabClient() //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 @@ void OBFrame::grabClient() // map the client so it maps when the frame does XMapWindow(otk::OBDisplay::display, _client->window()); - update(); + adjust(); } diff --git a/src/frame.hh b/src/frame.hh index 0c3a93f2..9e3f3822 100644 --- a/src/frame.hh +++ b/src/frame.hh @@ -14,6 +14,10 @@ extern "C" { #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 @@ -22,46 +26,27 @@ namespace ob { //! 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 @@ public: @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(); }; } diff --git a/src/openbox.cc b/src/openbox.cc index 93570c8c..0c534a0f 100644 --- a/src/openbox.cc +++ b/src/openbox.cc @@ -74,6 +74,8 @@ void Openbox::signalHandler(int signal) Openbox::Openbox(int argc, char **argv) + : otk::OtkEventDispatcher(), + otk::OtkEventHandler() { struct sigaction action; @@ -244,14 +246,8 @@ void Openbox::showHelp() 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(); } } diff --git a/src/openbox.hh b/src/openbox.hh index 18c0e85c..c810057f 100644 --- a/src/openbox.hh +++ b/src/openbox.hh @@ -22,7 +22,8 @@ extern "C" { #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 @@ class OBScreen; 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. @@ -102,9 +103,6 @@ private: */ otk::OBTimerQueueManager _timermanager; - //! The class which will handle raw XEvents - OBXEventHandler _xeventhandler; - //! Cached atoms on the display /*! This is a pointer because the OBProperty class uses otk::OBDisplay::display diff --git a/src/screen.cc b/src/screen.cc index e3217cca..4457096b 100644 --- a/src/screen.cc +++ b/src/screen.cc @@ -365,25 +365,12 @@ void OBScreen::manageWindow(Window 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); // update the root properties @@ -403,26 +390,12 @@ void OBScreen::unmanageWindow(OBClient *client) // 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; -- 2.39.2