Improve dockapp recognition
[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 * emulate_app_icon must be automatically disabled for apps that can
142 * generate their own appicons and for apps that have no_appicon=1
143 */
144 unsigned int emulate_appicon:1;
145
146 } WWindowAttributes;
147
148
149
150 /*
151 * Window manager protocols that both the client as we understand.
152 */
153 typedef struct {
154 unsigned int TAKE_FOCUS:1;
155 unsigned int DELETE_WINDOW:1;
156 unsigned int SAVE_YOURSELF:1;
157 /* WindowMaker specific */
158 unsigned int MINIATURIZE_WINDOW:1;
159 } WProtocols;
160
161
162 /*
163 * Structure used for storing fake window group information
164 */
165 typedef struct WFakeGroupLeader {
166 char *identifier;
167 Window leader;
168 Window origLeader;
169 int retainCount;
170 } WFakeGroupLeader;
171
172
173 /*
174 * Stores client window information. Each client window has it's
175 * structure created when it's being first mapped.
176 */
177 typedef struct WWindow {
178 struct WWindow *prev; /* window focus list */
179 struct WWindow *next;
180
181 WScreen *screen_ptr; /* pointer to the screen structure */
182 WWindowAttributes user_flags; /* window attribute flags set by user */
183 WWindowAttributes defined_user_flags;/* mask for user_flags */
184 WWindowAttributes client_flags; /* window attribute flags set by app
185 * initialized with global defaults */
186
187 struct InspectorPanel *inspector; /* pointer to attribute editor panel */
188
189 struct WFrameWindow *frame; /* the frame window */
190 int frame_x, frame_y; /* position of the frame in root*/
191
192 struct {
193 int x, y;
194 unsigned int width, height; /* original geometry of the window */
195 } old_geometry; /* (before things like maximize) */
196
197 struct {
198 int x, y;
199 unsigned int width, height; /* original geometry of the window */
200 } bfs_geometry; /* (before fullscreen) */
201
202 /* client window info */
203 short old_border_width; /* original border width of client_win*/
204 Window client_win; /* the window we're managing */
205 WObjDescriptor client_descriptor; /* dummy descriptor for client */
206 struct {
207 int x, y; /* position of *client* relative
208 * to root */
209 unsigned int width, height; /* size of the client window */
210 } client;
211
212 XSizeHints *normal_hints; /* WM_NORMAL_HINTS */
213 XWMHints *wm_hints; /* WM_HINTS (optional) */
214 char *wm_instance; /* instance of WM_CLASS */
215 char *wm_class; /* class of WM_CLASS */
216 GNUstepWMAttributes *wm_gnustep_attr;/* GNUstep window attributes */
217
218 int state; /* state as in ICCCM */
219
220 Window transient_for; /* WM_TRANSIENT_FOR */
221
222 WFakeGroupLeader *fake_group; /* Fake group leader for grouping into
223 a single appicon */
224 Window group_id; /* the leader window of the group */
225 Window client_leader; /* WM_CLIENT_LEADER if not
226 internal_window */
227
228 Window main_window; /* main window for the application */
229
230 Window orig_main_window; /* original main window of application.
231 used for the shared appicon thing */
232
233 int cmap_window_no;
234 Window *cmap_windows;
235
236 /* protocols */
237 WProtocols protocols; /* accepted WM_PROTOCOLS */
238
239 FocusMode focus_mode; /* type of keyboard input focus */
240
241 long event_mask; /* the event mask thats selected */
242
243 struct {
244 /* state flags */
245 unsigned int mapped:1;
246 unsigned int focused:1;
247 unsigned int miniaturized:1;
248 unsigned int hidden:1;
249 unsigned int shaded:1;
250 unsigned int maximized:5;
251 unsigned int fullscreen:1;
252 unsigned int omnipresent:1;
253
254 unsigned int semi_focused:1;
255 /* window type flags */
256 unsigned int urgent:1; /* if wm_hints says this is urgent */
257 #ifdef SHAPE
258 unsigned int shaped:1;
259 #endif
260
261 /* info flags */
262 unsigned int is_gnustep:1; /* 1 if the window belongs to a GNUstep
263 app */
264 unsigned int is_dockapp:1; /* 1 if the window belongs to a DockApp */
265
266 unsigned int buttons_dont_fit:1;
267 unsigned int rebuild_texture:1; /* the window was resized and
268 * gradients should be re-rendered */
269 unsigned int needs_full_repaint:1;/* does a full repaint of the
270 * window next time it's painted */
271 unsigned int icon_moved:1; /* icon for this window was moved
272 * by the user */
273 unsigned int selected:1; /* multiple window selection */
274 unsigned int skip_next_animation:1;
275 unsigned int internal_window:1;
276 unsigned int changing_workspace:1;
277
278 unsigned int inspector_open:1; /* attrib inspector is already open */
279
280 unsigned int destroyed:1; /* window was already destroyed */
281
282 unsigned int menu_open_for_me:1; /* window commands menu */
283
284 unsigned int waiting_save_ack:1; /* waiting for SAVE_YOURSELF ack */
285
286 unsigned int obscured:1; /* window is obscured */
287
288 unsigned int dragged_while_fmaximized;
289
290 unsigned int user_changed_width:1;
291 unsigned int user_changed_height:1;
292 unsigned int wm_name_changed:1;
293 unsigned int net_state_from_client:1; /* state hint was set by client */
294 unsigned int net_skip_pager:1;
295 unsigned int net_handle_icon:1;
296 unsigned int net_show_desktop:1;
297 unsigned int net_has_title:1; /* use netwm version of WM_NAME */
298 unsigned int net_has_icon_title:1;
299 } flags; /* state of the window */
300
301 struct WIcon *icon; /* icon info for the window */
302 int icon_x, icon_y; /* position of the icon */
303 int icon_w, icon_h;
304 RImage *net_icon_image;
305 Atom type;
306 } WWindow;
307
308
309 #define HAS_TITLEBAR(w) (!(WFLAGP((w), no_titlebar) || (w)->flags.fullscreen))
310 #define HAS_RESIZEBAR(w) (!(WFLAGP((w), no_resizebar) || (w)->flags.fullscreen))
311 #define HAS_BORDER(w) (!(WFLAGP((w), no_border) || (w)->flags.fullscreen))
312 #define IS_MOVABLE(w) (!(WFLAGP((w), no_movable) || (w)->flags.fullscreen))
313 #define IS_RESIZABLE(w) (!(WFLAGP((w), no_resizable) || (w)->flags.fullscreen))
314
315 /* XXX: CHECK THIS,.. IT SEEMED WEIRD TO ME!!! */
316 #define IS_OMNIPRESENT(w) ((w)->flags.omnipresent | WFLAGP(w, omnipresent))
317
318 #define WINDOW_LEVEL(w) ((w)->frame->core->stacking->window_level)
319
320 #define IS_GNUSTEP_MENU(w) ((w)->wm_gnustep_attr && \
321 ((w)->wm_gnustep_attr->flags & GSWindowLevelAttr) && \
322 ((w)->wm_gnustep_attr->window_level==WMMainMenuWindowLevel || \
323 (w)->wm_gnustep_attr->window_level==WMSubmenuWindowLevel))
324
325
326 /*
327 * Changes to this must update wWindowSaveState/getSavedState
328 *
329 */
330 typedef struct WSavedState {
331 int workspace;
332 int miniaturized;
333 int shaded;
334 int hidden;
335 int maximized;
336 int x; /* original geometry of the */
337 int y; /* window if it's maximized */
338 unsigned int w;
339 unsigned int h;
340 unsigned window_shortcuts; /* mask like 1<<shortcut_number */
341 } WSavedState;
342
343
344 typedef struct WWindowState {
345 char *instance;
346 char *class;
347 char *command;
348 pid_t pid;
349 WSavedState *state;
350 struct WWindowState *next;
351 } WWindowState;
352
353
354 typedef void* WMagicNumber;
355
356
357
358 void wWindowDestroy(WWindow *wwin);
359 WWindow *wWindowCreate(void);
360
361 #ifdef SHAPE
362 void wWindowSetShape(WWindow *wwin);
363 void wWindowClearShape(WWindow *wwin);
364 #endif
365
366 WWindow *wManageWindow(WScreen *scr, Window window);
367
368 void wUnmanageWindow(WWindow *wwin, Bool restore, Bool destroyed);
369
370 void wWindowFocus(WWindow *wwin, WWindow *owin);
371 void wWindowUnfocus(WWindow *wwin);
372
373 void wWindowUpdateName(WWindow *wwin, char *newTitle);
374 void wWindowConstrainSize(WWindow *wwin, unsigned int *nwidth, unsigned int *nheight);
375 void wWindowCropSize(WWindow *wwin, unsigned int maxw, unsigned int maxh,
376 unsigned int *nwidth, unsigned int *nheight);
377 void wWindowConfigure(WWindow *wwin, int req_x, int req_y,
378 int req_width, int req_height);
379
380 void wWindowMove(WWindow *wwin, int req_x, int req_y);
381
382 void wWindowSynthConfigureNotify(WWindow *wwin);
383
384 WWindow *wWindowFor(Window window);
385
386
387 void wWindowConfigureBorders(WWindow *wwin);
388
389 void wWindowUpdateButtonImages(WWindow *wwin);
390
391 void wWindowSaveState(WWindow *wwin);
392
393 void wWindowChangeWorkspace(WWindow *wwin, int workspace);
394
395 void wWindowSetKeyGrabs(WWindow *wwin);
396
397 void wWindowResetMouseGrabs(WWindow *wwin);
398
399 WWindow *wManageInternalWindow(WScreen *scr, Window window, Window owner,
400 char *title, int x, int y,
401 int width, int height);
402
403 void wWindowSetupInitialAttributes(WWindow *wwin, int *level, int *workspace);
404
405 void wWindowUpdateGNUstepAttr(WWindow *wwin, GNUstepWMAttributes *attr);
406
407 void wWindowMap(WWindow *wwin);
408
409 void wWindowUnmap(WWindow *wwin);
410
411 Bool wWindowCanReceiveFocus(WWindow *wwin);
412
413 void wWindowDeleteSavedStatesForPID(pid_t pid);
414
415 WMagicNumber wWindowAddSavedState(char *instance, char *class, char *command,
416 pid_t pid, WSavedState *state);
417
418 WMagicNumber wWindowGetSavedState(Window win);
419
420 void wWindowDeleteSavedState(WMagicNumber id);
421
422 Bool wWindowObscuresWindow(WWindow *wwin, WWindow *obscured);
423
424 void wWindowSetOmnipresent(WWindow *wwin, Bool flag);
425
426 #endif