1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
9 # include <X11/extensions/shape.h>
15 #include "basedisplay.hh"
19 #define MwmHintsFunctions (1l << 0)
20 #define MwmHintsDecorations (1l << 1)
22 #define MwmFuncAll (1l << 0)
23 #define MwmFuncResize (1l << 1)
24 #define MwmFuncMove (1l << 2)
25 #define MwmFuncIconify (1l << 3)
26 #define MwmFuncMaximize (1l << 4)
27 #define MwmFuncClose (1l << 5)
29 #define MwmDecorAll (1l << 0)
30 #define MwmDecorBorder (1l << 1)
31 #define MwmDecorHandle (1l << 2)
32 #define MwmDecorTitle (1l << 3)
33 #define MwmDecorMenu (1l << 4) // not used
34 #define MwmDecorIconify (1l << 5)
35 #define MwmDecorMaximize (1l << 6)
37 // this structure only contains 3 elements... the Motif 2.0 structure contains
38 // 5... we only need the first 3... so that is all we will define
39 typedef struct MwmHints {
40 unsigned long flags, functions, decorations;
43 #define PropMwmHintsElements 3
49 BlackboxWindowList windowList;
52 BWindowGroup(Blackbox *b, Window _group);
55 inline Window groupWindow(void) const { return group; }
57 inline bool empty(void) const { return windowList.empty(); }
59 void addWindow(BlackboxWindow *w) { windowList.push_back(w); }
60 void removeWindow(BlackboxWindow *w) { windowList.remove(w); }
63 find a window on the specified screen. the focused window (if any) is
64 checked first, otherwise the first matching window found is returned.
65 transients are returned only if allow_transients is True.
67 BlackboxWindow *find(BScreen *screen, bool allow_transients = False) const;
71 class BlackboxWindow : public TimeoutHandler {
73 enum Function { Func_Resize = (1l << 0),
74 Func_Move = (1l << 1),
75 Func_Iconify = (1l << 2),
76 Func_Maximize = (1l << 3),
77 Func_Close = (1l << 4) };
78 typedef unsigned char FunctionFlags;
80 enum Decoration { Decor_Titlebar = (1l << 0),
81 Decor_Handle = (1l << 1),
82 Decor_Border = (1l << 2),
83 Decor_Iconify = (1l << 3),
84 Decor_Maximize = (1l << 4),
85 Decor_Close = (1l << 5) };
86 typedef unsigned char DecorationFlags;
88 enum WindowType { Type_Desktop,
97 enum Corner { TopLeft,
107 BlackboxAttributes blackbox_attrib;
109 Time lastButtonPressTime; // used for double clicks, when were we clicked
111 unsigned int window_number;
112 unsigned long current_state;
113 unsigned int mod_mask; // the mod mask used to grab buttons
115 enum FocusMode { F_NoInput = 0, F_Passive,
116 F_LocallyActive, F_GloballyActive };
117 FocusMode focus_mode;
120 bool moving, // is moving?
121 resizing, // is resizing?
122 shaded, // is shaded?
123 visible, // is visible?
124 iconic, // is iconified?
125 focused, // has focus?
126 stuck, // is omnipresent?
127 modal, // is modal? (must be dismissed to continue)
128 skip_taskbar, // skipped by taskbars?
129 skip_pager, // skipped by pagers?
130 fullscreen, // a fullscreen window?
131 send_focus_message, // should we send focus messages to our client?
132 shaped; // does the frame use the shape extension?
133 unsigned int maximized; // maximize is special, the number corresponds
134 // with a mouse button
135 // if 0, not maximized
136 // 1 = HorizVert, 2 = Vertical, 3 = Horizontal
140 Window window, // the client's window
142 BlackboxWindow *transient_for; // which window are we a transient for?
143 BlackboxWindowList transientList; // which windows are our transients?
145 std::string title, icon_title;
150 int old_bw; // client's borderwidth
153 min_width, min_height, // can not be resized smaller
154 max_width, max_height, // can not be resized larger
155 width_inc, height_inc, // increment step
156 #if 0 // not supported at the moment
157 min_aspect_x, min_aspect_y, // minimum aspect ratio
158 max_aspect_x, max_aspect_y, // maximum aspect ratio
160 base_width, base_height,
163 unsigned long initial_state, normal_hint_flags;
166 FunctionFlags functions;
168 * what decorations do we have?
169 * this is based on the type of the client window as well as user input
171 DecorationFlags decorations;
172 DecorationFlags mwm_decorations;
174 WindowType window_type;
177 * client window = the application's window
178 * frame window = the window drawn around the outside of the client window
179 * by the window manager which contains items like the
180 * titlebar and close button
181 * title = the titlebar drawn above the client window, it displays the
182 * window's name and any buttons for interacting with the window,
183 * such as iconify, maximize, and close
184 * label = the window in the titlebar where the title is drawn
185 * buttons = maximize, iconify, close
186 * handle = the bar drawn at the bottom of the window, which contains the
187 * left and right grips used for resizing the window
188 * grips = the smaller reactangles in the handle, one of each side of it.
189 * When clicked and dragged, these resize the window interactively
190 * border = the line drawn around the outside edge of the frame window,
191 * between the title, the bordered client window, and the handle.
192 * Also drawn between the grips and the handle
196 // u -> unfocused, f -> has focus, p -> pressed
197 unsigned long ulabel_pixel, flabel_pixel, utitle_pixel,
198 ftitle_pixel, uhandle_pixel, fhandle_pixel, ubutton_pixel,
199 fbutton_pixel, pfbutton_pixel, pubutton_pixel,
200 uborder_pixel, fborder_pixel, ugrip_pixel, fgrip_pixel;
201 Pixmap ulabel, flabel, utitle, ftitle, uhandle, fhandle,
202 ubutton, fbutton, pfbutton, pubutton, ugrip, fgrip;
204 Window window, // the frame
205 plate, // holds the client
209 close_button, iconify_button, maximize_button, stick_button,
210 right_grip, left_grip;
213 * size and location of the box drawn while the window dimensions or
214 * location is being changed, ie. resized or moved
218 Rect rect; // frame geometry
219 Strut margin; // margins between the frame and client
221 int grab_x, grab_y; // where was the window when it was grabbed?
223 unsigned int inside_w, inside_h, // window w/h without border_w
224 title_h, label_w, label_h, handle_h,
225 button_w, grip_w, mwm_border_w, border_w,
229 BlackboxWindow(const BlackboxWindow&);
230 BlackboxWindow& operator=(const BlackboxWindow&);
233 Window createToplevelWindow();
234 Window createChildWindow(Window parent, unsigned long event_mask,
237 bool getWindowType(void);
238 void updateStrut(void);
239 void getWMName(void);
240 void getWMIconName(void);
241 void getWMNormalHints(void);
242 void getWMProtocols(void);
243 void getWMHints(void);
244 void getNetWMHints(void);
245 void getMWMHints(void);
246 bool getBlackboxHints(void);
247 void getTransientInfo(void);
248 void setNetWMAttributes(void);
249 void associateClientWindow(void);
251 void decorateLabel(void);
252 void positionButtons(bool redecorate_label = False);
253 void positionWindows(void);
254 void createHandle(void);
255 void destroyHandle(void);
256 void createTitlebar(void);
257 void destroyTitlebar(void);
258 void createCloseButton(void);
259 void destroyCloseButton(void);
260 void createIconifyButton(void);
261 void destroyIconifyButton(void);
262 void createMaximizeButton(void);
263 void destroyMaximizeButton(void);
264 void createStickyButton(void);
265 void destroyStickyButton(void);
266 void redrawWindowFrame(void) const;
267 void redrawLabel(void) const;
268 void redrawAllButtons(void) const;
269 void redrawButton(bool pressed, Window win,
270 Pixmap fppix, unsigned long fppixel,
271 Pixmap uppix, unsigned long uppixel,
272 Pixmap fpix, unsigned long fpixel,
273 Pixmap upix, unsigned long upixel) const;
274 void redrawCloseButton(bool pressed) const;
275 void redrawIconifyButton(bool pressed) const;
276 void redrawMaximizeButton(bool pressed) const;
277 void redrawStickyButton(bool pressed) const;
278 void applyGravity(Rect &r);
279 void restoreGravity(Rect &r);
280 void setAllowedActions(void);
281 void setState(unsigned long new_state);
283 void doMove(int x_root, int y_root);
284 void doWorkspaceWarping(int x_root, int y_root, int &dx);
285 void doWindowSnapping(int &dx, int &dy);
287 void doResize(int x_root, int y_root);
288 void endResize(void);
290 void constrain(Corner anchor, unsigned int *pw = 0, unsigned int *ph = 0);
293 BlackboxWindow(Blackbox *b, Window w, BScreen *s);
294 virtual ~BlackboxWindow(void);
296 inline bool isTransient(void) const { return client.transient_for != 0; }
297 inline bool isFocused(void) const { return flags.focused; }
298 inline bool isVisible(void) const { return flags.visible; }
299 inline bool isIconic(void) const { return flags.iconic; }
300 inline bool isShaded(void) const { return flags.shaded; }
301 inline bool isMaximized(void) const { return flags.maximized; }
302 inline bool isMaximizedHoriz(void) const { return flags.maximized == 3; }
303 inline bool isMaximizedVert(void) const { return flags.maximized == 2; }
304 inline bool isMaximizedFull(void) const { return flags.maximized == 1; }
305 inline bool isStuck(void) const { return flags.stuck; }
306 inline bool isModal(void) const { return flags.modal; }
307 inline bool isIconifiable(void) const { return functions & Func_Iconify; }
308 inline bool isMaximizable(void) const { return functions & Func_Maximize; }
309 inline bool isResizable(void) const { return functions & Func_Resize; }
310 inline bool isClosable(void) const { return functions & Func_Close; }
312 // is a 'normal' window? meaning, a standard client application
313 inline bool isNormal(void) const
314 { return window_type == Type_Dialog || window_type == Type_Normal ||
315 window_type == Type_Toolbar || window_type == Type_Utility; }
316 inline bool isTopmost(void) const
317 { return window_type == Type_Toolbar || window_type == Type_Utility; }
318 inline bool isDesktop(void) const { return window_type == Type_Desktop; }
320 inline bool hasTitlebar(void) const { return decorations & Decor_Titlebar; }
322 inline const BlackboxWindowList &getTransients(void) const
323 { return client.transientList; }
324 BlackboxWindow *getTransientFor(void) const;
326 inline BScreen *getScreen(void) const { return screen; }
328 inline Window getFrameWindow(void) const { return frame.window; }
329 inline Window getClientWindow(void) const { return client.window; }
330 inline Window getGroupWindow(void) const { return client.window_group; }
332 inline const char *getTitle(void) const
333 { return client.title.c_str(); }
334 inline const char *getIconTitle(void) const
335 { return client.icon_title.c_str(); }
337 inline unsigned int getWorkspaceNumber(void) const
338 { return blackbox_attrib.workspace; }
339 inline unsigned int getWindowNumber(void) const { return window_number; }
341 inline const Rect &frameRect(void) const { return frame.rect; }
342 inline const Rect &clientRect(void) const { return client.rect; }
344 inline unsigned int getTitleHeight(void) const
345 { return frame.title_h; }
347 inline void setWindowNumber(int n) { window_number = n; }
349 bool validateClient(void) const;
350 bool setInputFocus(void);
352 // none of these are used by the window manager, they are here to persist
353 // them properly in the window's netwm state property.
354 inline bool skipTaskbar(void) const { return flags.skip_taskbar; }
355 inline void setSkipTaskbar(const bool s) { flags.skip_taskbar = s; }
356 inline bool skipPager(void) const { return flags.skip_pager; }
357 inline void setSkipPager(const bool s) { flags.skip_pager = s; }
358 inline bool isFullscreen(void) const { return flags.fullscreen; }
359 inline void setFullscreen(const bool f) { flags.fullscreen = f; }
361 inline void setModal(const bool m) { flags.modal = m; }
363 void beginMove(int x_root, int y_root);
364 void beginResize(int x_root, int y_root, Corner dir);
365 void enableDecor(bool enable);
367 void setFocusFlag(bool focus);
369 void deiconify(bool reassoc = True, bool raise = True);
373 void maximize(unsigned int button);
374 void remaximize(void);
377 void reconfigure(void);
378 void grabButtons(void);
379 void ungrabButtons(void);
380 void installColormap(bool install);
381 void restore(bool remap);
382 void configure(int dx, int dy, unsigned int dw, unsigned int dh);
383 void setWorkspace(unsigned int n);
384 void changeBlackboxHints(const BlackboxHints *net);
385 void restoreAttributes(void);
387 void buttonPressEvent(const XButtonEvent *be);
388 void buttonReleaseEvent(const XButtonEvent *re);
389 void motionNotifyEvent(const XMotionEvent *me);
390 void destroyNotifyEvent(const XDestroyWindowEvent* /*unused*/);
391 void mapRequestEvent(const XMapRequestEvent *mre);
392 void unmapNotifyEvent(const XUnmapEvent* /*unused*/);
393 void reparentNotifyEvent(const XReparentEvent* /*unused*/);
394 void propertyNotifyEvent(const XPropertyEvent *pe);
395 void exposeEvent(const XExposeEvent *ee);
396 void configureRequestEvent(const XConfigureRequestEvent *cr);
397 void enterNotifyEvent(const XCrossingEvent *ce);
398 void leaveNotifyEvent(const XCrossingEvent* /*unused*/);
401 void configureShape(void);
402 void clearShape(void);
403 void shapeEvent(XShapeEvent * /*unused*/);
406 virtual void timeout(void);
410 #endif // __Window_hh