]> icculus.org git repositories - mikachu/openbox.git/blob - src/frame.hh
enter/leave actions work!
[mikachu/openbox.git] / src / frame.hh
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
2 #ifndef   __frame_hh
3 #define   __frame_hh
4
5 /*! @file frame.hh
6 */
7
8 extern "C" {
9 #include <X11/Xlib.h>
10 }
11
12 #include "client.hh"
13 #include "otk/strut.hh"
14 #include "otk/rect.hh"
15 #include "otk/screeninfo.hh"
16 #include "otk/style.hh"
17 #include "otk/widget.hh"
18 #include "otk/button.hh"
19 #include "otk/focuswidget.hh"
20 #include "otk/focuslabel.hh"
21
22 #include <string>
23
24 namespace ob {
25
26 //! Holds and decorates a frame around an OBClient (client window)
27 /*!
28   The frame is responsible for calling XSelectInput on the client window's new
29   parent with the SubstructureRedirectMask so that structure events for the
30   client are sent to the window manager.
31 */
32 class OBFrame : public otk::OtkWidget {
33 public:
34
35   //! The event mask to grab on frame windows
36   static const long event_mask = EnterWindowMask | LeaveWindowMask;
37
38 private:
39   OBClient *_client;
40   const otk::ScreenInfo *_screen;
41
42   //! The style to use for size and display the decorations
43   otk::Style *_style;
44
45   //! The size of the frame on each side of the client window
46   otk::Strut _size;
47
48   //! The size of the frame on each side of the client window inside the border
49   otk::Strut _innersize;
50
51   // decoration windows
52   otk::OtkFocusWidget _plate;   // sits entirely under the client window
53   otk::OtkFocusWidget _titlebar;
54   otk::OtkButton      _button_close;
55   otk::OtkButton      _button_iconify;
56   otk::OtkButton      _button_max;
57   otk::OtkButton      _button_stick;
58   otk::OtkFocusLabel  _label;
59   otk::OtkFocusWidget _handle;
60   otk::OtkButton      _grip_left;
61   otk::OtkButton      _grip_right;
62
63   //! The decorations to display on the window.
64   /*!
65     This is by default the same value as in the OBClient::decorations, but it
66     is duplicated here so that it can be overridden per-window by the user.
67   */
68   OBClient::DecorationFlags _decorations;
69
70   //! Reparents the client window from the root window onto the frame
71   void grabClient();
72   //! Reparents the client window back to the root window
73   /*!
74     @param remap Re-map the client window when we're done reparenting?
75   */
76   void releaseClient(bool remap);
77
78 public:
79   //! Constructs an OBFrame object, and reparents the client to itself
80   /*!
81     @param client The client window which will be decorated by the new OBFrame
82     @param style The style to use to decorate the frame
83   */
84   OBFrame(OBClient *client, otk::Style *style);
85   //! Destroys the OBFrame object
86   virtual ~OBFrame();
87
88   //! Set the style to decorate the frame with
89   virtual void setStyle(otk::Style *style);
90
91   //! Update the frame to match the client
92   void adjust();
93   //! Shape the frame window to the client window
94   void adjustShape();
95
96   //! Applies gravity for the client's gravity, moving the frame to the
97   //! appropriate place
98   void applyGravity();
99
100   //! Reversely applies gravity for the client's gravity, moving the frame so
101   //! that the client is in its pre-gravity position
102   void reverseGravity();
103 };
104
105 }
106
107 #endif // __frame_hh