From a77f0fb344978bb4dafd2ad4639f3de3e090bf7b Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 2 Dec 2002 23:03:41 +0000 Subject: [PATCH] handle map requests with the root window class --- src/frame.cc | 21 ++++++++++++++---- src/frame.hh | 1 + src/openbox.cc | 56 ----------------------------------------------- src/openbox.hh | 2 -- src/rootwindow.cc | 17 ++++++++++++++ src/rootwindow.hh | 2 ++ 6 files changed, 37 insertions(+), 62 deletions(-) diff --git a/src/frame.cc b/src/frame.cc index 2a42327a..40b9b9c6 100644 --- a/src/frame.cc +++ b/src/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 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style) _handle.unmanaged(); _grip_left.unmanaged(); _grip_right.unmanaged(); + _plate.unmanaged(); + + _plate.show(); _button_close.setText("X"); _button_iconify.setText("I"); @@ -90,6 +94,10 @@ void OBFrame::setStyle(otk::Style *style) _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 @@ void OBFrame::adjust() 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 @@ void OBFrame::adjust() 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 @@ void OBFrame::grabClient() //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 diff --git a/src/frame.hh b/src/frame.hh index 9e3f3822..74b1ba64 100644 --- a/src/frame.hh +++ b/src/frame.hh @@ -38,6 +38,7 @@ private: 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; diff --git a/src/openbox.cc b/src/openbox.cc index d2213ec4..80622c1c 100644 --- a/src/openbox.cc +++ b/src/openbox.cc @@ -121,9 +121,6 @@ Openbox::Openbox(int argc, char **argv) _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); @@ -284,58 +281,5 @@ OBClient *Openbox::findClient(Window window) } -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(_screens.size())); - _screens[screen]->manageWindow(e.window); - } -} - } diff --git a/src/openbox.hh b/src/openbox.hh index 8c2015f9..c810057f 100644 --- a/src/openbox.hh +++ b/src/openbox.hh @@ -188,8 +188,6 @@ public: manager can be destroyed. */ inline void shutdown() { _doshutdown = true; } - - virtual void mapRequestHandler(const XMapRequestEvent &); }; } diff --git a/src/rootwindow.cc b/src/rootwindow.cc index 4891b4fe..3fccc44a 100644 --- a/src/rootwindow.cc +++ b/src/rootwindow.cc @@ -6,6 +6,7 @@ #include "rootwindow.hh" #include "openbox.hh" +#include "screen.hh" #include "otk/display.hh" namespace ob { @@ -91,4 +92,20 @@ void OBRootWindow::setDesktopName(int i, const std::string &name) } +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); + } +} + } diff --git a/src/rootwindow.hh b/src/rootwindow.hh index 7879244d..7d0a9c82 100644 --- a/src/rootwindow.hh +++ b/src/rootwindow.hh @@ -56,6 +56,8 @@ public: 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) -- 2.39.2