]> Dogcows Code - chaz/openbox/commitdiff
handle map requests with the root window class
authorDana Jansens <danakj@orodu.net>
Mon, 2 Dec 2002 23:03:41 +0000 (23:03 +0000)
committerDana Jansens <danakj@orodu.net>
Mon, 2 Dec 2002 23:03:41 +0000 (23:03 +0000)
src/frame.cc
src/frame.hh
src/openbox.cc
src/openbox.hh
src/rootwindow.cc
src/rootwindow.hh

index 2a42327ad1dde5722a33e0620bbb63bc24e22b80..40b9b9c635c7f1e57784ade090cda3b28db7397a 100644 (file)
@@ -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
index 9e3f3822b93f172874e73e8d09a4e0de517a45ba..74b1ba6488b09244218696e32747594d0fed3d2d 100644 (file)
@@ -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;
index d2213ec40b016a5daa6152059a1436c2cdb52e4d..80622c1c426aee4bc80796c818994dea3b081ff7 100644 (file)
@@ -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<int>(_screens.size()));
-    _screens[screen]->manageWindow(e.window);
-  }
-}
-
 }
 
index 8c2015f95870af95005b39bc65525f048762b1e4..c810057f83fe9b097bde749742efa11533782fd8 100644 (file)
@@ -188,8 +188,6 @@ public:
     manager can be destroyed.
   */
   inline void shutdown() { _doshutdown = true; }
-
-  virtual void mapRequestHandler(const XMapRequestEvent &);
 };
 
 }
index 4891b4fe01591b11730e9abceb9764574ba9dddf..3fccc44a12418f5a3b3b2ef630fc4f758eee2522 100644 (file)
@@ -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);
+  }
+}
+
 }
index 7879244dabdf25d84f10241cb80092ece1899ae0..7d0a9c825042b86c75a92ce6657b33e7b8ba0d54 100644 (file)
@@ -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)
This page took 0.032198 seconds and 4 git commands to generate.