]> Dogcows Code - chaz/openbox/blobdiff - src/frame.hh
resizing works and whatnot
[chaz/openbox] / src / frame.hh
index ff6a21ad0becd3ab9db8d8f74fbdc440b6adf4c4..1d7ebd6c29a116def3c71ae98a96f3c2a6d94b0f 100644 (file)
@@ -10,14 +10,14 @@ extern "C" {
 }
 
 #include "client.hh"
+#include "backgroundwidget.hh"
+#include "labelwidget.hh"
+#include "buttonwidget.hh"
 #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>
 
@@ -25,8 +25,18 @@ namespace ob {
 
 //! Holds and decorates a frame around an OBClient (client window)
 /*!
+  The frame is responsible for calling XSelectInput on the client window's new
+  parent with the SubstructureRedirectMask so that structure events for the
+  client are sent to the window manager.
 */
-class OBFrame : public otk::OtkWidget {
+class OBFrame : public otk::OtkWidget, public OBWidget {
+public:
+
+  //! The event mask to grab on frame windows
+  static const long event_mask = EnterWindowMask | LeaveWindowMask |
+                                 ButtonPressMask | ButtonReleaseMask |
+                                 ButtonMotionMask;
+
 private:
   OBClient *_client;
   const otk::ScreenInfo *_screen;
@@ -37,17 +47,20 @@ private:
   //! The size of the frame on each side of the client window
   otk::Strut _size;
 
+  //! The size of the frame on each side of the client window inside the border
+  otk::Strut _innersize;
+
   // decoration windows
-  otk::OtkFocusWidget _plate;   // sits entirely under the client window
-  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;
+  OBBackgroundWidget  _plate;   // sits entirely under the client window
+  OBBackgroundWidget  _titlebar;
+  OBButtonWidget      _button_close;
+  OBButtonWidget      _button_iconify;
+  OBButtonWidget      _button_max;
+  OBButtonWidget      _button_stick;
+  OBLabelWidget       _label;
+  OBBackgroundWidget  _handle;
+  OBButtonWidget      _grip_left;
+  OBButtonWidget      _grip_right;
 
   //! The decorations to display on the window.
   /*!
@@ -64,6 +77,9 @@ private:
   */
   void releaseClient(bool remap);
 
+  //! Shape the frame window to the client window
+  void adjustShape();
+
 public:
   //! Constructs an OBFrame object, and reparents the client to itself
   /*!
@@ -77,14 +93,46 @@ public:
   //! Set the style to decorate the frame with
   virtual void setStyle(otk::Style *style);
 
-  //! Update the frame to match the client
-  void adjust();
-  //! Shape the frame window to the client window
-  void adjustShape();
+  //! Update the frame's size to match the client
+  void adjustSize();
+  //! Update the frame's position to match the client
+  void adjustPosition();
+
+  //! Applies gravity to the client's position to find where the frame should
+  //! be positioned.
+  /*!
+    @return The proper coordinates for the frame, based on the client.
+  */
+  void clientGravity(int &x, int &y);
+
+  //! Reversly applies gravity to the frame's position to find where the client
+  //! should be positioned.
+  /*!
+    @return The proper coordinates for the client, based on the frame.
+  */
+  void frameGravity(int &x, int &y);
+
+  //! Gets the window id of the frame's "plate" subelement
+  inline Window plate() const { return _plate.getWindow(); }
+  //! Gets the window id of the frame's "titlebar" subelement
+  inline Window titlebar() const { return _titlebar.getWindow(); }
+  //! Gets the window id of the frame's "label" subelement
+  inline Window label() const { return _label.getWindow(); }
+  //! Gets the window id of the frame's "close button" subelement
+  inline Window button_close() const { return _button_close.getWindow(); }
+  //! Gets the window id of the frame's "iconify button" subelement
+  inline Window button_iconify() const { return _button_iconify.getWindow(); }
+  //! Gets the window id of the frame's "maximize button" subelement
+  inline Window button_max() const { return _button_max.getWindow(); }
+  //! Gets the window id of the frame's "sticky button" subelement
+  inline Window button_stick() const { return _button_stick.getWindow(); }
+  //! Gets the window id of the frame's "handle" subelement
+  inline Window handle() const { return _handle.getWindow(); }
+  //! Gets the window id of the frame's "left grip" subelement
+  inline Window grip_left() const { return _grip_left.getWindow(); }
+  //! Gets the window id of the frame's "right grip" subelement
+  inline Window grip_right() const { return _grip_right.getWindow(); }
 
-  //! Applies gravity for the client's gravity, moving the frame to the
-  //! appropriate place
-  void applyGravity();
 };
 
 }
This page took 0.027679 seconds and 4 git commands to generate.