]> Dogcows Code - chaz/openbox/blobdiff - src/frame.hh
make the 'toggle all desktops' button work
[chaz/openbox] / src / frame.hh
index 5e7ba927c14daf4e448b775f28f387629ad6b350..40c08199d012620160c25048524fb944a620f85a 100644 (file)
@@ -9,111 +9,138 @@ extern "C" {
 #include <X11/Xlib.h>
 }
 
-#include <string>
-
 #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/renderstyle.hh"
+#include "otk/widget.hh"
+#include "otk/ustring.hh"
+
+#include <string>
 
 namespace ob {
 
-//! Holds and decorates a frame around an OBClient (client window)
+//! Holds and decorates a frame around an Client (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 {
+class Frame : public otk::Widget, public WidgetBase {
+public:
+
+  //! The event mask to grab on frame windows
+  static const long event_mask = EnterWindowMask | LeaveWindowMask;
+   
 private:
-  const OBClient *_client;
+  Client *_client;
   const otk::ScreenInfo *_screen;
 
-  //! The style to use for size and display the decorations
-  const 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;
+  //! The size of the frame on each side of the client window inside the border
+  otk::Strut _innersize;
 
-  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;
+  // decoration windows
+  BackgroundWidget  _plate;   // sits entirely under the client window
+  BackgroundWidget  _titlebar;
+  ButtonWidget      _button_close;
+  ButtonWidget      _button_iconify;
+  ButtonWidget      _button_max;
+  ButtonWidget      _button_stick;
+  LabelWidget       _label;
+  BackgroundWidget  _handle;
+  ButtonWidget      _grip_left;
+  ButtonWidget      _grip_right;
 
   //! The decorations to display on the window.
   /*!
-    This is by default the same value as in the OBClient::decorations, but it
+    This is by default the same value as in the Client::decorations, but it
     is duplicated here so that it can be overridden per-window by the user.
   */
-  OBClient::DecorationFlags _decorations;
+  Client::DecorationFlags _decorations;
 
-  //! Creates the base frame window
-  Window createFrame();
-  //! Creates a child frame decoration element window
-  Window createChild(Window parent, Cursor cursor);
+public:
+  //! Constructs an Frame object, and reparents the client to itself
+  /*!
+    @param client The client window which will be decorated by the new Frame
+    @param style The style to use to decorate the frame
+  */
+  Frame(Client *client, otk::RenderStyle *style);
+  //! Destroys the Frame object
+  virtual ~Frame();
+
+  //! Returns the size of the frame on each side of the client
+  const otk::Strut& size() const { return _size; }
+  
+  //! Set the style to decorate the frame with
+  virtual void setStyle(otk::RenderStyle *style);
+
+  //! Empty overridden method to prevent automatic alignment of children
+  virtual void adjust();
+  
+  //! Displays focused decorations
+  virtual void focus();
+  //! Displays unfocused decorations
+  virtual void unfocus();
 
+  void setTitle(const otk::ustring &text);
   //! Reparents the client window from the root window onto the frame
   void grabClient();
   //! Reparents the client window back to the root window
+  void releaseClient();
+
+  //! Update the frame's size to match the client
+  void adjustSize();
+  //! Update the frame's position to match the client
+  void adjustPosition();
+  //! Shape the frame window to the client window
+  void adjustShape();
+  //! Update the frame to match the client's new state (for things like toggle
+  //! buttons)
+  void adjustState();
+
+  //! Applies gravity to the client's position to find where the frame should
+  //! be positioned.
   /*!
-    @param remap Re-map the client window when we're done reparenting?
+    @return The proper coordinates for the frame, based on the client.
   */
-  void releaseClient(bool remap);
+  void clientGravity(int &x, int &y);
 
-public:
-  //! Constructs an OBFrame object, and reparents the client to itself
+  //! Reversly applies gravity to the frame's position to find where the client
+  //! should be positioned.
   /*!
-    @param client The client window which will be decorated by the new OBFrame
-    @param style The style to use to decorate the frame
+    @return The proper coordinates for the client, based on the frame.
   */
-  OBFrame(const OBClient *client, const otk::Style *style);
-  //! Destroys the OBFrame object
-  virtual ~OBFrame();
-
-  //! Load a style to decorate the frame with
-  void loadStyle(const otk::Style *style);
+  void frameGravity(int &x, int &y);
+
+  //! Gets the window id of the frame's "plate" subelement
+  inline Window plate() const { return _plate.window(); }
+  //! Gets the window id of the frame's "titlebar" subelement
+  inline Window titlebar() const { return _titlebar.window(); }
+  //! Gets the window id of the frame's "label" subelement
+  inline Window label() const { return _label.window(); }
+  //! Gets the window id of the frame's "close button" subelement
+  inline Window button_close() const { return _button_close.window(); }
+  //! Gets the window id of the frame's "iconify button" subelement
+  inline Window button_iconify() const { return _button_iconify.window(); }
+  //! Gets the window id of the frame's "maximize button" subelement
+  inline Window button_max() const { return _button_max.window(); }
+  //! Gets the window id of the frame's "sticky button" subelement
+  inline Window button_stick() const { return _button_stick.window(); }
+  //! Gets the window id of the frame's "handle" subelement
+  inline Window handle() const { return _handle.window(); }
+  //! Gets the window id of the frame's "left grip" subelement
+  inline Window grip_left() const { return _grip_left.window(); }
+  //! Gets the window id of the frame's "right grip" subelement
+  inline Window grip_right() const { return _grip_right.window(); }
 
-  //! Update the frame to match the client
-  void update();
-  //! 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; }
 };
 
 }
This page took 0.024264 seconds and 4 git commands to generate.