2 * Window Maker window manager
4 * Copyright (c) 1997-2003 Alfredo K. Kojima
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.
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.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
30 #include "application.h"
32 /* not defined in my X11 headers */
34 #define UrgencyHint (1L << 8)
39 #define BORDER_BOTTOM 2
41 #define BORDER_RIGHT 8
42 #define BORDER_ALL (1|2|4|8)
45 #define CLIENT_EVENTS (StructureNotifyMask | PropertyChangeMask\
46 | EnterWindowMask | LeaveWindowMask | ColormapChangeMask \
47 | FocusChangeMask | VisibilityChangeMask)
50 WFM_PASSIVE
, WFM_NO_INPUT
, WFM_LOCALLY_ACTIVE
, WFM_GLOBALLY_ACTIVE
55 * window attribute flags.
57 * Note: attributes that should apply to the application as a
58 * whole should only access the flags from app->main_window_desc->window_flags
59 * This is to make sure that the application doesn't have many different
60 * values for the same option. For example, imagine xfoo, which has
61 * foo.bar as leader and it a child window named foo.baz. If you set
62 * StartHidden YES for foo.bar and NO for foo.baz we must *always* guarantee
63 * that the value that will be used will be that of the leader foo.bar.
64 * The attributes inspector must always save application wide options
65 * in the name of the leader window, not the child.
69 * All flags must have their default values = 0
73 * user_flags, defined_flags
76 * if defined window_flag then window_flag else client_flag
80 #define WFLAGP(wwin, FLAG) ((wwin)->defined_user_flags.FLAG \
81 ? (wwin)->user_flags.FLAG \
82 : (wwin)->client_flags.FLAG)
84 #define WSETUFLAG(wwin, FLAG, VAL) (wwin)->user_flags.FLAG = (VAL),\
85 (wwin)->defined_user_flags.FLAG = 1
89 unsigned int no_titlebar
:1; /* draw titlebar? */
90 unsigned int no_resizable
:1;
91 unsigned int no_closable
:1;
92 unsigned int no_miniaturizable
:1;
93 unsigned int no_border
:1; /* 1 pixel border around window */
94 #ifdef XKB_BUTTON_HINT
95 unsigned int no_language_button
:1;
97 unsigned int no_movable
:1;
100 unsigned int no_resizebar
:1; /* draw the bottom handle? */
101 unsigned int no_close_button
:1; /* draw a close button? */
102 unsigned int no_miniaturize_button
:1; /* draw an iconify button? */
104 unsigned int broken_close
:1; /* is the close button broken? */
107 unsigned int kill_close
:1; /* can't send WM_DELETE_WINDOW */
109 unsigned int no_shadeable
:1;
110 unsigned int omnipresent
:1;
111 unsigned int skip_window_list
:1;
112 unsigned int skip_switchpanel
: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
120 unsigned int no_hide_others
:1; /* hide window when doing hideothers */
121 unsigned int no_appicon
:1; /* make app icon */
123 unsigned int shared_appicon
:1;
125 unsigned int dont_move_off
:1;
127 unsigned int no_focusable
:1;
128 unsigned int focus_across_wksp
:1; /* let wmaker switch workspace to follow
131 unsigned int always_user_icon
:1; /* ignore client IconPixmap or
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 */
139 unsigned int full_maximize
:1;
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
144 unsigned int emulate_appicon
:1;
151 * Window manager protocols that both the client as we understand.
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;
163 * Structure used for storing fake window group information
165 typedef struct WFakeGroupLeader
{
174 * Stores client window information. Each client window has it's
175 * structure created when it's being first mapped.
177 typedef struct WWindow
{
178 struct WWindow
*prev
; /* window focus list */
179 struct WWindow
*next
;
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 */
187 struct InspectorPanel
*inspector
; /* pointer to attribute editor panel */
189 struct WFrameWindow
*frame
; /* the frame window */
190 int frame_x
, frame_y
; /* position of the frame in root*/
194 unsigned int width
, height
; /* original geometry of the window */
195 } old_geometry
; /* (before things like maximize) */
199 unsigned int width
, height
; /* original geometry of the window */
200 } bfs_geometry
; /* (before fullscreen) */
202 int maximus_x
; /* size after Maximusizing */
205 /* client window info */
206 short old_border_width
; /* original border width of client_win*/
207 Window client_win
; /* the window we're managing */
208 WObjDescriptor client_descriptor
; /* dummy descriptor for client */
210 int x
, y
; /* position of *client* relative
212 unsigned int width
, height
; /* size of the client window */
215 XSizeHints
*normal_hints
; /* WM_NORMAL_HINTS */
216 XWMHints
*wm_hints
; /* WM_HINTS (optional) */
217 char *wm_instance
; /* instance of WM_CLASS */
218 char *wm_class
; /* class of WM_CLASS */
219 GNUstepWMAttributes
*wm_gnustep_attr
; /* GNUstep window attributes */
221 int state
; /* state as in ICCCM */
223 Window transient_for
; /* WM_TRANSIENT_FOR */
225 WFakeGroupLeader
*fake_group
; /* Fake group leader for grouping into
226 * a single appicon */
227 Window group_id
; /* the leader window of the group */
228 Window client_leader
; /* WM_CLIENT_LEADER if not
231 Window main_window
; /* main window for the application */
232 Window orig_main_window
; /* original main window of application.
233 * used for the shared appicon thing */
236 Window
*cmap_windows
;
239 WProtocols protocols
; /* accepted WM_PROTOCOLS */
241 FocusMode focus_mode
; /* type of keyboard input focus */
243 long event_mask
; /* the event mask thats selected */
247 unsigned int mapped
:1;
248 unsigned int focused
:1;
249 unsigned int miniaturized
:1;
250 unsigned int hidden
:1;
251 unsigned int shaded
:1;
252 unsigned int maximized
:7;
253 unsigned int old_maximized
:7;
254 unsigned int fullscreen
:1;
255 unsigned int omnipresent
:1;
256 unsigned int semi_focused
:1;
257 /* window type flags */
258 unsigned int urgent
:1; /* if wm_hints says this is urgent */
260 unsigned int shaped
:1;
264 unsigned int is_gnustep
:1; /* 1 if the window belongs to a GNUstep
266 unsigned int is_dockapp
:1; /* 1 if the window belongs to a DockApp */
268 unsigned int icon_moved
:1; /* icon for this window was moved
270 unsigned int selected
:1; /* multiple window selection */
271 unsigned int skip_next_animation
:1;
272 unsigned int internal_window
:1;
273 unsigned int changing_workspace
:1;
275 unsigned int inspector_open
:1; /* attrib inspector is already open */
277 unsigned int destroyed
:1; /* window was already destroyed */
278 unsigned int menu_open_for_me
:1;/* window commands menu */
279 unsigned int obscured
:1; /* window is obscured */
281 unsigned int net_skip_pager
:1;
282 unsigned int net_handle_icon
:1;
283 unsigned int net_show_desktop
:1;
284 unsigned int net_has_title
:1; /* use netwm version of WM_NAME */
285 } flags
; /* state of the window */
287 struct WIcon
*icon
; /* Window icon when miminized
289 int icon_x
, icon_y
; /* position of the icon */
291 RImage
*net_icon_image
; /* Window Image */
295 #define HAS_TITLEBAR(w) (!(WFLAGP((w), no_titlebar) || (w)->flags.fullscreen))
296 #define HAS_RESIZEBAR(w) (!(WFLAGP((w), no_resizebar) || (w)->flags.fullscreen))
297 #define HAS_BORDER(w) (!(WFLAGP((w), no_border) || (w)->flags.fullscreen))
298 #define IS_MOVABLE(w) (!(WFLAGP((w), no_movable) || (w)->flags.fullscreen))
299 #define IS_RESIZABLE(w) (!(WFLAGP((w), no_resizable) || (w)->flags.fullscreen))
300 #define IS_OMNIPRESENT(w) ((w)->flags.omnipresent | WFLAGP(w, omnipresent))
301 #define WINDOW_LEVEL(w) ((w)->frame->core->stacking->window_level)
304 * Changes to this must update wWindowSaveState/getSavedState
306 typedef struct WSavedState
{
312 int x
; /* original geometry of the */
313 int y
; /* window if it's maximized */
316 unsigned window_shortcuts
; /* mask like 1<<shortcut_number */
319 typedef struct WWindowState
{
325 struct WWindowState
*next
;
328 typedef void* WMagicNumber
;
330 void wWindowDestroy(WWindow
*wwin
);
331 WWindow
*wWindowCreate(void);
334 void wWindowSetShape(WWindow
*wwin
);
335 void wWindowClearShape(WWindow
*wwin
);
338 WWindow
*wManageWindow(WScreen
*scr
, Window window
);
340 void wUnmanageWindow(WWindow
*wwin
, Bool restore
, Bool destroyed
);
342 void wWindowSingleFocus(WWindow
*wwin
);
343 void wWindowFocusPrev(WWindow
*wwin
, Bool inSameWorkspace
);
344 void wWindowFocusNext(WWindow
*wwin
, Bool inSameWorkspace
);
345 void wWindowFocus(WWindow
*wwin
, WWindow
*owin
);
346 void wWindowUnfocus(WWindow
*wwin
);
348 void wWindowUpdateName(WWindow
*wwin
, const char *newTitle
);
349 void wWindowConstrainSize(WWindow
*wwin
, unsigned int *nwidth
, unsigned int *nheight
);
350 void wWindowCropSize(WWindow
*wwin
, unsigned int maxw
, unsigned int maxh
,
351 unsigned int *nwidth
, unsigned int *nheight
);
352 void wWindowConfigure(WWindow
*wwin
, int req_x
, int req_y
,
353 int req_width
, int req_height
);
355 void wWindowMove(WWindow
*wwin
, int req_x
, int req_y
);
357 void wWindowSynthConfigureNotify(WWindow
*wwin
);
359 WWindow
*wWindowFor(Window window
);
362 void wWindowConfigureBorders(WWindow
*wwin
);
364 void wWindowUpdateButtonImages(WWindow
*wwin
);
366 void wWindowSaveState(WWindow
*wwin
);
368 void wWindowChangeWorkspace(WWindow
*wwin
, int workspace
);
369 void wWindowChangeWorkspaceRelative(WWindow
*wwin
, int amount
);
371 void wWindowSetKeyGrabs(WWindow
*wwin
);
373 void wWindowResetMouseGrabs(WWindow
*wwin
);
375 WWindow
*wManageInternalWindow(WScreen
*scr
, Window window
, Window owner
,
376 const char *title
, int x
, int y
,
377 int width
, int height
);
379 void wWindowSetupInitialAttributes(WWindow
*wwin
, int *level
, int *workspace
);
381 void wWindowUpdateGNUstepAttr(WWindow
*wwin
, GNUstepWMAttributes
*attr
);
383 void wWindowMap(WWindow
*wwin
);
385 void wWindowUnmap(WWindow
*wwin
);
387 void wWindowDeleteSavedStatesForPID(pid_t pid
);
389 WMagicNumber
wWindowAddSavedState(const char *instance
, const char *class, const char *command
,
390 pid_t pid
, WSavedState
*state
);
392 WMagicNumber
wWindowGetSavedState(Window win
);
394 void wWindowDeleteSavedState(WMagicNumber id
);
396 Bool
wWindowObscuresWindow(WWindow
*wwin
, WWindow
*obscured
);
398 void wWindowSetOmnipresent(WWindow
*wwin
, Bool flag
);