all repos — openbox @ a77f0fb344978bb4dafd2ad4639f3de3e090bf7b

openbox fork - make it a bit more like ryudo

handle map requests with the root window class
Dana Jansens danakj@orodu.net
commit

a77f0fb344978bb4dafd2ad4639f3de3e090bf7b

parent

958df7716291a1af680bf9d5432aa99f0b7cf644

6 files changed, 37 insertions(+), 62 deletions(-)

jump to
M src/frame.ccsrc/frame.cc

@@ -24,6 +24,7 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style)

: otk::OtkWidget(Openbox::instance, style), _client(client), _screen(otk::OBDisplay::screenInfo(client->screen())), + _plate(this), _titlebar(this), _button_close(&_titlebar), _button_iconify(&_titlebar),

@@ -48,6 +49,9 @@ _label.unmanaged();

_handle.unmanaged(); _grip_left.unmanaged(); _grip_right.unmanaged(); + _plate.unmanaged(); + + _plate.show(); _button_close.setText("X"); _button_iconify.setText("I");

@@ -90,6 +94,10 @@ }

_style = style; + // XXX: change when focus changes! + XSetWindowBorder(otk::OBDisplay::display, _plate.getWindow(), + _style->getFrameFocus()->color().pixel()); + XSetWindowBorder(otk::OBDisplay::display, getWindow(), _style->getBorderColor()->pixel()); XSetWindowBorder(otk::OBDisplay::display, _titlebar.getWindow(),

@@ -115,17 +123,21 @@ _decorations = 0xffffffff;

int width; // the width of the client window and the border around it int bwidth; // width to make borders + int cbwidth; // width of the inner client border if (_decorations & OBClient::Decor_Border) { bwidth = _style->getBorderWidth(); + cbwidth = _style->getFrameWidth(); _size.left = _size.top = _size.bottom = _size.right = _style->getFrameWidth(); width = _client->area().width() + _style->getFrameWidth() * 2; } else { - bwidth = 0; + bwidth = cbwidth = 0; _size.left = _size.top = _size.bottom = _size.right = 0; width = _client->area().width(); } + XSetWindowBorderWidth(otk::OBDisplay::display, _plate.getWindow(), cbwidth); + XSetWindowBorderWidth(otk::OBDisplay::display, getWindow(), bwidth); XSetWindowBorderWidth(otk::OBDisplay::display, _titlebar.getWindow(), bwidth);

@@ -238,8 +250,8 @@

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); + _plate.setGeometry(_size.left, _size.top, _client->area().width(), + _client->area().height()); // map/unmap all the windows if (_decorations & OBClient::Decor_Titlebar) {

@@ -329,7 +341,8 @@ // 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(), getWindow(), 0, 0); + XReparentWindow(otk::OBDisplay::display, _client->window(), + _plate.getWindow(), 0, 0); _client->ignore_unmaps++; // raise the client above the frame
M src/frame.hhsrc/frame.hh

@@ -38,6 +38,7 @@ //! The size of the frame on each side of the client window

otk::Strut _size; // decoration windows + otk::OtkFocusWidget _plate; // sits entirely under the client window otk::OtkFocusWidget _titlebar; otk::OtkButton _button_close; otk::OtkButton _button_iconify;
M src/openbox.ccsrc/openbox.cc

@@ -121,9 +121,6 @@ sigaction(SIGHUP, &action, (struct sigaction *) 0);

_property = new otk::OBProperty(); - // set this class as the fallback event handler (for map events) - setFallbackHandler(this); - // create the mouse cursors we'll use _cursors.session = XCreateFontCursor(otk::OBDisplay::display, XC_left_ptr); _cursors.move = XCreateFontCursor(otk::OBDisplay::display, XC_fleur);

@@ -283,59 +280,6 @@ else

return (OBClient*) 0; } - -void Openbox::mapRequestHandler(const XMapRequestEvent &e) -{ -#ifdef DEBUG - printf("MapRequest for 0x%lx\n", e.window); -#endif // DEBUG - - otk::OtkEventHandler::mapRequestHandler(e); - - OBClient *client = findClient(e.window); - - if (client) { - // XXX: uniconify and/or unshade the window - } else { - int screen = INT_MAX; - - for (int i = 0; i < ScreenCount(otk::OBDisplay::display); ++i) - if (otk::OBDisplay::screenInfo(i)->getRootWindow() == e.parent) { - screen = i; - break; - } - - if (screen >= ScreenCount(otk::OBDisplay::display)) { - /* - we got a map request for a window who's parent isn't root. this - can happen in only one circumstance: - - a client window unmapped a managed window, and then remapped it - somewhere between unmapping the client window and reparenting it - to root. - - regardless of how it happens, we need to find the screen that - the window is on - */ - XWindowAttributes wattrib; - if (! XGetWindowAttributes(otk::OBDisplay::display, e.window, - &wattrib)) { - // failed to get the window attributes, perhaps the window has - // now been destroyed? - return; - } - - for (int i = 0; i < ScreenCount(otk::OBDisplay::display); ++i) - if (otk::OBDisplay::screenInfo(i)->getRootWindow() == wattrib.root) { - screen = i; - break; - } - } - - assert(screen < static_cast<int>(_screens.size())); - _screens[screen]->manageWindow(e.window); - } -} }
M src/openbox.hhsrc/openbox.hh

@@ -188,8 +188,6 @@ Causes the Openbox::eventLoop function to stop looping, so that the window

manager can be destroyed. */ inline void shutdown() { _doshutdown = true; } - - virtual void mapRequestHandler(const XMapRequestEvent &); }; }
M src/rootwindow.ccsrc/rootwindow.cc

@@ -6,6 +6,7 @@ #endif

#include "rootwindow.hh" #include "openbox.hh" +#include "screen.hh" #include "otk/display.hh" namespace ob {

@@ -90,5 +91,21 @@ property->set(_info->getRootWindow(), otk::OBProperty::net_desktop_names,

otk::OBProperty::utf8, newnames); } + +void OBRootWindow::mapRequestHandler(const XMapRequestEvent &e) +{ +#ifdef DEBUG + printf("MapRequest for 0x%lx\n", e.window); +#endif // DEBUG + + OBClient *client = Openbox::instance->findClient(e.window); + + if (client) { + // XXX: uniconify and/or unshade the window + } else { + Openbox::instance->screen(_info->getScreenNumber())-> + manageWindow(e.window); + } +} }
M src/rootwindow.hhsrc/rootwindow.hh

@@ -56,6 +56,8 @@ virtual void propertyHandler(const XPropertyEvent &e);

virtual void clientMessageHandler(const XClientMessageEvent &e); + virtual void mapRequestHandler(const XMapRequestEvent &); + //! Sets the name of a desktop /*! @param i The index of the desktop to set the name for (base 0)