]> Dogcows Code - chaz/openbox/blob - src/client.hh
799ff70337670178805f63a106240e7f2318396a
[chaz/openbox] / 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 { Functions = 1 << 0,
33 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 enum MemDecorations { MemDecor_All = 1 << 0,
43 MemDecor_Border = 1 << 1,
44 MemDecor_Handle = 1 << 2,
45 MemDecor_Title = 1 << 3,
46 //MemDecor_Menu = 1 << 4,
47 MemDecor_Iconify = 1 << 5,
48 MemDecor_Maximize = 1 << 6 };
49
50 // this structure only contains 3 elements... the Motif 2.0 structure
51 // contains 5... we only need the first 3... so that is all we will define
52 typedef struct MwmHints {
53 static const int elements = 3;
54 unsigned long flags;
55 unsigned long functions;
56 unsigned long decorations;
57 };
58
59 enum StateAction { State_Remove = 0, // _NET_WM_STATE_REMOVE
60 State_Add, // _NET_WM_STATE_ADD
61 State_Toggle // _NET_WM_STATE_TOGGLE
62 };
63
64 private:
65 //! The actual window that this class is wrapping up
66 Window _window;
67
68 //! The id of the group the window belongs to
69 Window _group;
70
71 // XXX: transient_for, transients
72
73 //! The desktop on which the window resides (0xffffffff for all desktops)
74 unsigned long _desktop;
75
76 //! Normal window title
77 std::string _title; // XXX: Have to keep track if this string is Utf8 or not
78 //! Window title when iconifiged
79 std::string _icon_title;
80
81 //! The application that created the window
82 std::string _app_name;
83 //! The class of the window, can used for grouping
84 std::string _app_class;
85
86 //! The type of window (what its function is)
87 WindowType _type;
88
89 //! Position and size of the window (relative to the root window)
90 otk::Rect _area;
91
92 // size bounds
93 // if min > max, then the window is not resizable
94 int _min_x, _min_y; // minumum size
95 int _max_x, _max_y; // maximum size
96 int _inc_x, _inc_y; // resize increments
97 int _base_x, _base_y; // base size
98
99 //! Where to place the decorated window in relation to the undecorated window
100 int _gravity;
101
102 //! The state of the window, one of WithdrawnState, IconicState, or
103 //! NormalState
104 long _wmstate;
105
106 //! Was the window's position requested by the application? if not, we should
107 //! place the window ourselves when it first appears
108 bool _positioned;
109
110 //! Can the window receive input focus?
111 bool _can_focus;
112 //! Urgency flag
113 bool _urgent;
114 //! Notify the window when it receives focus?
115 bool _focus_notify;
116
117 //! The window uses shape extension to be non-rectangular?
118 bool _shaped;
119
120 //! The window is modal, so it must be processed before any windows it is
121 //! related to can be focused
122 bool _modal;
123 //! Only the window's titlebar is displayed
124 bool _shaded;
125 //! The window is iconified
126 bool _iconic;
127 //! The window is maximized to fill the screen vertically
128 bool _max_vert;
129 //! The window is maximized to fill the screen horizontally
130 bool _max_horz;
131 //! The window is a 'fullscreen' window, and should be on top of all others
132 bool _fullscreen;
133 //! The window should be on top of other windows of the same type
134 bool _floating;
135
136 // XXX: motif decoration hints!
137
138 void getDesktop();
139 void getType();
140 void getArea();
141 void getState();
142 void getShaped();
143
144 void setWMState(long state);
145 void setDesktop(long desktop);
146 void setState(StateAction action, long data1, long data2);
147
148 void updateNormalHints();
149 void updateWMHints();
150 // XXX: updateTransientFor();
151 void updateTitle();
152 void updateClass();
153
154 public:
155 OBClient(Window window);
156 virtual ~OBClient();
157
158 inline Window window() const { return _window; }
159
160 inline WindowType type() const { return _type; }
161 inline unsigned long desktop() const { return _desktop; }
162 inline const std::string &title() const { return _title; }
163 inline const std::string &iconTitle() const { return _title; }
164 inline const std::string &appName() const { return _app_name; }
165 inline const std::string &appClass() const { return _app_class; }
166 inline bool canFocus() const { return _can_focus; }
167 inline bool urgent() const { return _urgent; }
168 inline bool focusNotify() const { return _focus_notify; }
169 inline bool shaped() const { return _shaped; }
170 inline int gravity() const { return _gravity; }
171
172 // states
173 inline bool modal() const { return _modal; }
174 inline bool shaded() const { return _shaded; }
175 inline bool iconic() const { return _iconic; }
176 inline bool maxVert() const { return _max_vert; }
177 inline bool maxHorz() const { return _max_horz; }
178 inline bool fullscreen() const { return _fullscreen; }
179 inline bool floating() const { return _floating; }
180
181 inline int minX() const { return _min_x; }
182 inline int minY() const { return _min_y; }
183 inline int maxX() const { return _max_x; }
184 inline int maxY() const { return _max_y; }
185 inline int incrementX() const { return _inc_x; }
186 inline int incrementY() const { return _inc_y; }
187 inline int baseX() const { return _base_x; }
188 inline int baseY() const { return _base_y; }
189
190 inline const otk::Rect &area() const { return _area; }
191
192 void update(const XPropertyEvent &e);
193 void update(const XClientMessageEvent &e);
194
195 void setArea(const otk::Rect &area);
196 };
197
198 }
199
200 #endif // __client_hh
This page took 0.040876 seconds and 3 git commands to generate.