]> icculus.org git repositories - dana/openbox.git/blob - src/client.hh
set the client's desired decoration and function flags
[dana/openbox.git] / src / client.hh
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
2 #ifndef   __client_hh
3 #define   __client_hh
4
5 extern "C" {
6 #include <X11/Xlib.h>
7 }
8
9 #include <string>
10
11 #include "otk/strut.hh"
12 #include "otk/rect.hh"
13
14 namespace ob {
15
16 class OBClient {
17 public:
18   enum Max { Max_None,
19              Max_Horz,
20              Max_Vert,
21              Max_Full };
22
23   enum WindowType { Type_Desktop,
24                     Type_Dock,
25                     Type_Toolbar,
26                     Type_Menu,
27                     Type_Utility,
28                     Type_Splash,
29                     Type_Dialog,
30                     Type_Normal };
31
32   enum MwmFlags { MwmFlag_Functions   = 1 << 0,
33                   MwmFlag_Decorations = 1 << 1 };
34
35   enum MwmFunctions { MwmFunc_All      = 1 << 0,
36                       MwmFunc_Resize   = 1 << 1,
37                       MwmFunc_Move     = 1 << 2,
38                       MwmFunc_Iconify  = 1 << 3,
39                       MwmFunc_Maximize = 1 << 4
40                       //MwmFunc_Close    = 1 << 5
41   };
42
43   enum MemDecorations { MwmDecor_All      = 1 << 0,
44                         MwmDecor_Border   = 1 << 1,
45                         MwmDecor_Handle   = 1 << 2,
46                         MwmDecor_Title    = 1 << 3,
47                         //MwmDecor_Menu     = 1 << 4,
48                         MwmDecor_Iconify  = 1 << 5,
49                         MwmDecor_Maximize = 1 << 6 };
50
51   // the things the user can do to the client window
52   enum Function { Func_Resize   = 1 << 0,
53                   Func_Move     = 1 << 1,
54                   Func_Iconify  = 1 << 2,
55                   Func_Maximize = 1 << 3,
56                   Func_Close    = 1 << 4 };
57   typedef unsigned char FunctionFlags;
58
59   // the decorations the client window wants to be displayed on it
60   enum Decoration { Decor_Titlebar = 1 << 0,
61                     Decor_Handle   = 1 << 1,
62                     Decor_Border   = 1 << 2,
63                     Decor_Iconify  = 1 << 3,
64                     Decor_Maximize = 1 << 4,
65                     Decor_Close    = 1 << 5 };
66   typedef unsigned char DecorationFlags;
67
68   // this structure only contains 3 elements... the Motif 2.0 structure
69   // contains 5... we only need the first 3... so that is all we will define
70   typedef struct MwmHints {
71     static const unsigned int elements = 3;
72     unsigned long flags;
73     unsigned long functions;
74     unsigned long decorations;
75   };
76
77   enum StateAction { State_Remove = 0, // _NET_WM_STATE_REMOVE
78                      State_Add,        // _NET_WM_STATE_ADD
79                      State_Toggle      // _NET_WM_STATE_TOGGLE
80   };
81
82 private:
83   //! The actual window that this class is wrapping up
84   Window   _window;
85
86   //! The id of the group the window belongs to
87   Window   _group;
88
89   // XXX: transient_for, transients
90
91   //! The desktop on which the window resides (0xffffffff for all desktops)
92   unsigned long _desktop;
93
94   //! Normal window title
95   std::string  _title; // XXX: Have to keep track if this string is Utf8 or not
96   //! Window title when iconifiged
97   std::string  _icon_title;
98
99   //! The application that created the window
100   std::string  _app_name;
101   //! The class of the window, can used for grouping
102   std::string  _app_class;
103
104   //! The type of window (what its function is)
105   WindowType   _type;
106
107   //! Position and size of the window (relative to the root window)
108   otk::Rect    _area;
109
110   //! Width of the border on the window.
111   /*!
112     The window manager will set this to 0 while the window is being managed,
113     but needs to restore it afterwards, so it is saved here.
114   */
115   int _border_width;
116
117   // size bounds
118   // if min > max, then the window is not resizable
119   int _min_x, _min_y; // minumum size
120   int _max_x, _max_y; // maximum size
121   int _inc_x, _inc_y; // resize increments
122   int _base_x, _base_y; // base size
123
124   //! Where to place the decorated window in relation to the undecorated window
125   int _gravity;
126
127   //! The state of the window, one of WithdrawnState, IconicState, or
128   //! NormalState
129   long _wmstate;
130
131   //! Was the window's position requested by the application? if not, we should
132   //! place the window ourselves when it first appears
133   bool _positioned;
134   
135   //! Can the window receive input focus?
136   bool _can_focus;
137   //! Urgency flag
138   bool _urgent;
139   //! Notify the window when it receives focus?
140   bool _focus_notify;
141
142   //! The window uses shape extension to be non-rectangular?
143   bool _shaped;
144
145   //! The window is modal, so it must be processed before any windows it is
146   //! related to can be focused
147   bool _modal;
148   //! Only the window's titlebar is displayed
149   bool _shaded;
150   //! The window is iconified
151   bool _iconic;
152   //! The window is maximized to fill the screen vertically
153   bool _max_vert;
154   //! The window is maximized to fill the screen horizontally
155   bool _max_horz;
156   //! The window is a 'fullscreen' window, and should be on top of all others
157   bool _fullscreen;
158   //! The window should be on top of other windows of the same type
159   bool _floating;
160
161   //! A bitmask of values in the OBClient::Decoration enum
162   /*!
163     The values in the variable are the decorations that the client wants to be
164     displayed around it.
165   */
166   DecorationFlags _decorations;
167
168   //! A bitmask of values in the OBClient::Function enum
169   /*!
170     The values in the variable specify the ways in which the user is allowed to
171     modify this window.
172   */
173   FunctionFlags _functions;
174
175   void getDesktop();
176   void getType();
177   void getMwmHints();
178   void getArea();
179   void getState();
180   void getShaped();
181
182   void setWMState(long state);
183   void setDesktop(long desktop);
184   void setState(StateAction action, long data1, long data2);
185
186   void updateProtocols();
187   void updateNormalHints();
188   void updateWMHints();
189   // XXX: updateTransientFor();
190   void updateTitle();
191   void updateClass();
192
193 public:
194   OBClient(Window window);
195   virtual ~OBClient();
196
197   inline Window window() const { return _window; }
198
199   inline WindowType type() const { return _type; }
200   inline unsigned long desktop() const { return _desktop; }
201   inline const std::string &title() const { return _title; }
202   inline const std::string &iconTitle() const { return _title; }
203   inline const std::string &appName() const { return _app_name; }
204   inline const std::string &appClass() const { return _app_class; }
205   inline bool canFocus() const { return _can_focus; }
206   inline bool urgent() const { return _urgent; }
207   inline bool focusNotify() const { return _focus_notify; }
208   inline bool shaped() const { return _shaped; }
209   inline int gravity() const { return _gravity; }
210   inline bool positionRequested() const { return _positioned; }
211   inline DecorationFlags decorations() const { return _decorations; }
212   inline FunctionFlags funtions() const { return _functions; }
213
214   // states
215   inline bool modal() const { return _modal; }
216   inline bool shaded() const { return _shaded; }
217   inline bool iconic() const { return _iconic; }
218   inline bool maxVert() const { return _max_vert; }
219   inline bool maxHorz() const { return _max_horz; }
220   inline bool fullscreen() const { return _fullscreen; }
221   inline bool floating() const { return _floating; }
222
223   inline int borderWidth() const { return _border_width; }
224   inline int minX() const { return _min_x; }
225   inline int minY() const { return _min_y; }
226   inline int maxX() const { return _max_x; }
227   inline int maxY() const { return _max_y; }
228   inline int incrementX() const { return _inc_x; }
229   inline int incrementY() const { return _inc_y; }
230   inline int baseX() const { return _base_x; }
231   inline int baseY() const { return _base_y; }
232
233   inline const otk::Rect &area() const { return _area; }
234
235   void update(const XPropertyEvent &e);
236   void update(const XClientMessageEvent &e);
237
238   void setArea(const otk::Rect &area);
239 };
240
241 }
242
243 #endif // __client_hh