Maximus: Tiled Maximization
[wmaker-crm.git] / src / window.h
1 /*
2  *  Window Maker window manager
3  *
4  *  Copyright (c) 1997-2003 Alfredo K. Kojima
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19  *  USA.
20  */
21
22 #ifndef WMWINDOW_H_
23 #define WMWINDOW_H_
24
25 #include <wraster.h>
26
27 #include "wconfig.h"
28 #include "GNUstep.h"
29 #include "texture.h"
30 #include "menu.h"
31 #include "application.h"
32
33 /* not defined in my X11 headers */
34 #ifndef UrgencyHint
35 #define UrgencyHint (1L << 8)
36 #endif
37
38
39 #define BORDER_TOP      1
40 #define BORDER_BOTTOM   2
41 #define BORDER_LEFT     4
42 #define BORDER_RIGHT    8
43 #define BORDER_ALL      (1|2|4|8)
44
45
46 #define CLIENT_EVENTS (StructureNotifyMask | PropertyChangeMask\
47     | EnterWindowMask | LeaveWindowMask | ColormapChangeMask \
48     | FocusChangeMask | VisibilityChangeMask)
49
50 typedef enum {
51     WFM_PASSIVE, WFM_NO_INPUT, WFM_LOCALLY_ACTIVE, WFM_GLOBALLY_ACTIVE
52 } FocusMode;
53
54
55 /*
56  * window attribute flags.
57  *
58  * Note: attributes that should apply to the application as a
59  * whole should only access the flags from app->main_window_desc->window_flags
60  * This is to make sure that the application doesn't have many different
61  * values for the same option. For example, imagine xfoo, which has
62  * foo.bar as leader and it a child window named foo.baz. If you set
63  * StartHidden YES for foo.bar and NO for foo.baz we must *always* guarantee
64  * that the value that will be used will be that of the leader foo.bar.
65  * The attributes inspector must always save application wide options
66  * in the name of the leader window, not the child.
67  *
68  */
69 /*
70  * All flags must have their default values = 0
71  *
72  * New flag scheme:
73  *
74  * user_flags, defined_flags
75  * client_flags
76  *
77  * if defined window_flag then window_flag else client_flag
78  *
79  */
80
81 #define WFLAGP(wwin, FLAG)      ((wwin)->defined_user_flags.FLAG \
82     ? (wwin)->user_flags.FLAG \
83     : (wwin)->client_flags.FLAG)
84
85 #define WSETUFLAG(wwin, FLAG, VAL)      (wwin)->user_flags.FLAG = (VAL),\
86     (wwin)->defined_user_flags.FLAG = 1
87
88 typedef struct {
89     /* OpenStep */
90     unsigned int no_titlebar:1;        /* draw titlebar? */
91     unsigned int no_resizable:1;
92     unsigned int no_closable:1;
93     unsigned int no_miniaturizable:1;
94     unsigned int no_border:1;          /* 1 pixel border around window */
95 #ifdef XKB_BUTTON_HINT
96     unsigned int no_language_button:1;
97 #endif
98     unsigned int no_movable:1;
99
100     /* decorations */
101     unsigned int no_resizebar:1;       /* draw the bottom handle? */
102     unsigned int no_close_button:1;    /* draw a close button? */
103     unsigned int no_miniaturize_button:1; /* draw an iconify button? */
104
105     unsigned int broken_close:1;       /* is the close button broken? */
106
107     /* ours */
108     unsigned int kill_close:1;         /* can't send WM_DELETE_WINDOW */
109
110     unsigned int no_shadeable:1;
111     unsigned int omnipresent:1;
112     unsigned int skip_window_list:1;
113     unsigned int floating:1;           /* put in WMFloatingLevel */
114     unsigned int sunken:1;             /* put in WMSunkenLevel */
115     unsigned int no_bind_keys:1;       /* intercept wm kbd binds
116                                         * while window is focused */
117     unsigned int no_bind_mouse:1;      /* intercept mouse events
118                                         * on client area while window
119                                         * is focused */
120     unsigned int no_hide_others:1;     /* hide window when doing hideothers */
121     unsigned int no_appicon:1;         /* make app icon */
122
123     unsigned int shared_appicon:1;
124
125     unsigned int dont_move_off:1;
126
127     unsigned int no_focusable:1;
128     unsigned int dont_focus_across_wksp:1; /* don't let wmaker switch workspace to follow
129                                             * a focus request */
130
131     unsigned int always_user_icon:1;   /* ignore client IconPixmap or
132                                         * IconWindow */
133
134     unsigned int start_miniaturized:1;
135     unsigned int start_hidden:1;
136     unsigned int start_maximized:1;
137     unsigned int dont_save_session:1;  /* do not save app's state in session */
138
139     unsigned int full_maximize:1;
140
141 #ifdef VIRTUAL_DESKTOP
142     unsigned int virtual_stick:1;
143 #endif
144
145     /*
146      * emulate_app_icon must be automatically disabled for apps that can
147      * generate their own appicons and for apps that have no_appicon=1
148      */
149     unsigned int emulate_appicon:1;
150
151 } WWindowAttributes;
152
153
154
155 /*
156  * Window manager protocols that both the client as we understand.
157  */
158 typedef struct {
159     unsigned int TAKE_FOCUS:1;
160     unsigned int DELETE_WINDOW:1;
161     unsigned int SAVE_YOURSELF:1;
162     /* WindowMaker specific */
163     unsigned int MINIATURIZE_WINDOW:1;
164 #ifdef MONITOR_HEARTBEAT
165     unsigned int HEARTBEAT:1;
166 #endif
167 } WProtocols;
168
169
170 /*
171  * Structure used for storing fake window group information
172  */
173 typedef struct WFakeGroupLeader {
174     char *identifier;
175     Window leader;
176     Window origLeader;
177     int retainCount;
178 } WFakeGroupLeader;
179
180
181 /*
182  * Stores client window information. Each client window has it's
183  * structure created when it's being first mapped.
184  */
185 typedef struct WWindow {
186     struct WWindow *prev;              /* window focus list */
187     struct WWindow *next;
188
189     WScreen *screen_ptr;               /* pointer to the screen structure */
190     WWindowAttributes user_flags;      /* window attribute flags set by user */
191     WWindowAttributes defined_user_flags;/* mask for user_flags */
192     WWindowAttributes client_flags;    /* window attribute flags set by app
193                                         * initialized with global defaults */
194
195     struct InspectorPanel *inspector;  /*  pointer to attribute editor panel */
196
197     struct WFrameWindow *frame;        /* the frame window */
198     int frame_x, frame_y;              /* position of the frame in root*/
199
200     struct {
201         int x, y;
202         unsigned int width, height;    /* original geometry of the window */
203     } old_geometry;                    /* (before things like maximize) */
204
205     struct {
206         int x, y;
207         unsigned int width, height;    /* original geometry of the window */
208     } bfs_geometry;                    /* (before fullscreen) */
209
210     /* client window info */
211     short old_border_width;            /* original border width of client_win*/
212     Window client_win;                 /* the window we're managing */
213     WObjDescriptor client_descriptor;  /* dummy descriptor for client */
214     struct {
215         int x, y;                      /* position of *client* relative
216                                         * to root */
217         unsigned int width, height;    /* size of the client window */
218     } client;
219
220     XSizeHints *normal_hints;          /* WM_NORMAL_HINTS */
221     XWMHints *wm_hints;                /* WM_HINTS (optional) */
222     char *wm_instance;                 /* instance of WM_CLASS */
223     char *wm_class;                    /* class of WM_CLASS */
224     GNUstepWMAttributes *wm_gnustep_attr;/* GNUstep window attributes */
225
226     int state;                         /* state as in ICCCM */
227
228     Window transient_for;              /* WM_TRANSIENT_FOR */
229
230     WFakeGroupLeader *fake_group;      /* Fake group leader for grouping into
231                                           a single appicon */
232     Window group_id;                   /* the leader window of the group */
233     Window client_leader;              /* WM_CLIENT_LEADER if not
234                                           internal_window */
235
236     Window main_window;                /* main window for the application */
237
238     Window orig_main_window;           /* original main window of application.
239                                           used for the shared appicon thing */
240
241     int cmap_window_no;
242     Window *cmap_windows;
243
244     /* protocols */
245     WProtocols protocols;              /* accepted WM_PROTOCOLS */
246
247     FocusMode focus_mode;              /* type of keyboard input focus */
248
249     long event_mask;                   /* the event mask thats selected */
250
251 #ifdef MONITOR_HEARTBEAT
252     time_t last_beat;
253 #endif
254     struct {
255         /* state flags */
256         unsigned int mapped:1;
257         unsigned int focused:1;
258         unsigned int miniaturized:1;
259         unsigned int hidden:1;
260         unsigned int shaded:1;
261         unsigned int maximized:5;
262         unsigned int fullscreen:1;
263         unsigned int omnipresent:1;
264
265         unsigned int semi_focused:1;
266         /* window type flags */
267         unsigned int urgent:1;         /* if wm_hints says this is urgent */
268 #ifdef SHAPE
269         unsigned int shaped:1;
270 #endif
271
272         /* info flags */
273         unsigned int is_gnustep:1;  /* 1 if the window belongs to a GNUstep
274                                        app */
275
276         unsigned int buttons_dont_fit:1;
277         unsigned int rebuild_texture:1;  /* the window was resized and
278                                           * gradients should be re-rendered */
279         unsigned int needs_full_repaint:1;/* does a full repaint of the
280                                            * window next time it's painted */
281         unsigned int icon_moved:1;     /* icon for this window was moved
282                                         * by the user */
283         unsigned int selected:1;       /* multiple window selection */
284         unsigned int skip_next_animation:1;
285         unsigned int internal_window:1;
286         unsigned int changing_workspace:1;
287
288         unsigned int inspector_open:1; /* attrib inspector is already open */
289
290         unsigned int destroyed:1;      /* window was already destroyed */
291
292         unsigned int menu_open_for_me:1;   /* window commands menu */
293
294         unsigned int waiting_save_ack:1;   /* waiting for SAVE_YOURSELF ack */
295
296         unsigned int obscured:1;       /* window is obscured */
297
298         unsigned int dragged_while_fmaximized;
299
300         unsigned int user_changed_width:1;
301         unsigned int user_changed_height:1;
302         unsigned int wm_name_changed:1;
303
304 #ifdef NETWM_HINTS
305         unsigned int net_state_from_client:1; /* state hint was set by client */
306         unsigned int net_skip_pager:1;
307         unsigned int net_handle_icon:1;
308         unsigned int net_show_desktop:1;
309         unsigned int net_has_title:1; /* use netwm version of WM_NAME */
310         unsigned int net_has_icon_title:1;
311 #endif
312     } flags;            /* state of the window */
313
314     struct WIcon *icon;                /* icon info for the window */
315     int icon_x, icon_y;                /* position of the icon */
316 #ifdef NETWM_HINTS
317     int icon_w, icon_h;
318     RImage *net_icon_image;
319     Atom type;
320 #endif
321 } WWindow;
322
323
324 #define HAS_TITLEBAR(w)     (!(WFLAGP((w), no_titlebar) || (w)->flags.fullscreen))
325 #define HAS_RESIZEBAR(w)    (!(WFLAGP((w), no_resizebar) || (w)->flags.fullscreen))
326 #define HAS_BORDER(w)       (!(WFLAGP((w), no_border) || (w)->flags.fullscreen))
327 #define IS_MOVABLE(w)       (!(WFLAGP((w), no_movable) || (w)->flags.fullscreen))
328 #define IS_RESIZABLE(w)    (!(WFLAGP((w), no_resizable) || (w)->flags.fullscreen))
329
330 #ifdef VIRTUAL_DESKTOP
331 # define IS_VSTUCK(w)       (WFLAGP((w), virtual_stick) || (w)->flags.fullscreen)
332 #endif
333
334 /* XXX: CHECK THIS,.. IT SEEMED WEIRD TO ME!!! */
335 #define IS_OMNIPRESENT(w) ((w)->flags.omnipresent | WFLAGP(w, omnipresent))
336
337 #define WINDOW_LEVEL(w) ((w)->frame->core->stacking->window_level)
338
339 #define IS_GNUSTEP_MENU(w) ((w)->wm_gnustep_attr && \
340     ((w)->wm_gnustep_attr->flags & GSWindowLevelAttr) && \
341     ((w)->wm_gnustep_attr->window_level==WMMainMenuWindowLevel || \
342      (w)->wm_gnustep_attr->window_level==WMSubmenuWindowLevel))
343
344
345 /*
346  * Changes to this must update wWindowSaveState/getSavedState
347  *
348  */
349 typedef struct WSavedState {
350     int workspace;
351     int miniaturized;
352     int shaded;
353     int hidden;
354     int maximized;
355     int x;                             /* original geometry of the */
356     int y;                             /* window if it's maximized */
357     unsigned int w;
358     unsigned int h;
359     unsigned window_shortcuts; /* mask like 1<<shortcut_number */
360 } WSavedState;
361
362
363 typedef struct WWindowState {
364     char *instance;
365     char *class;
366     char *command;
367     pid_t pid;
368     WSavedState *state;
369     struct WWindowState *next;
370 } WWindowState;
371
372
373 typedef void* WMagicNumber;
374
375
376
377 void wWindowDestroy(WWindow *wwin);
378 WWindow *wWindowCreate();
379
380 #ifdef SHAPE
381 void wWindowSetShape(WWindow *wwin);
382 void wWindowClearShape(WWindow *wwin);
383 #endif
384
385 WWindow *wManageWindow(WScreen *scr, Window window);
386
387 void wUnmanageWindow(WWindow *wwin, Bool restore, Bool destroyed);
388
389 void wWindowFocus(WWindow *wwin, WWindow *owin);
390 void wWindowUnfocus(WWindow *wwin);
391
392 void wWindowUpdateName(WWindow *wwin, char *newTitle);
393 void wWindowConstrainSize(WWindow *wwin, unsigned int *nwidth, unsigned int *nheight);
394 void wWindowCropSize(WWindow *wwin, unsigned int maxw, unsigned int maxh,
395                      unsigned int *nwidth, unsigned int *nheight);
396 void wWindowConfigure(WWindow *wwin, int req_x, int req_y,
397                       int req_width, int req_height);
398
399 void wWindowMove(WWindow *wwin, int req_x, int req_y);
400
401 void wWindowSynthConfigureNotify(WWindow *wwin);
402
403 WWindow *wWindowFor(Window window);
404
405
406 void wWindowConfigureBorders(WWindow *wwin);
407
408 void wWindowUpdateButtonImages(WWindow *wwin);
409
410 void wWindowSaveState(WWindow *wwin);
411
412 void wWindowChangeWorkspace(WWindow *wwin, int workspace);
413
414 void wWindowSetKeyGrabs(WWindow *wwin);
415
416 void wWindowResetMouseGrabs(WWindow *wwin);
417
418 WWindow *wManageInternalWindow(WScreen *scr, Window window, Window owner,
419                                char *title, int x, int y,
420                                int width, int height);
421
422 void wWindowSetupInitialAttributes(WWindow *wwin, int *level, int *workspace);
423
424 void wWindowUpdateGNUstepAttr(WWindow *wwin, GNUstepWMAttributes *attr);
425
426 void wWindowMap(WWindow *wwin);
427
428 void wWindowUnmap(WWindow *wwin);
429
430 Bool wWindowCanReceiveFocus(WWindow *wwin);
431
432 void wWindowDeleteSavedStatesForPID(pid_t pid);
433
434 WMagicNumber wWindowAddSavedState(char *instance, char *class, char *command,
435                                   pid_t pid, WSavedState *state);
436
437 WMagicNumber wWindowGetSavedState(Window win);
438
439 void wWindowDeleteSavedState(WMagicNumber id);
440
441 Bool wWindowObscuresWindow(WWindow *wwin, WWindow *obscured);
442
443 void wWindowSetOmnipresent(WWindow *wwin, Bool flag);
444
445 #endif