WPrefs.app: Add ability to set behavior when dragging a maximized window.
[wmaker-crm.git] / src / application.c
blobff6461dbdd4504790cd3ca8e7b600ee6994e0982
1 /*
2 * Window Maker window manager
4 * Copyright (c) 1997-2003 Alfredo K. Kojima
5 * Copyright (c) 1998-2003 Dan Pascu
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include "wconfig.h"
23 #include <X11/Xlib.h>
24 #include <string.h>
26 #include "WindowMaker.h"
27 #include "menu.h"
28 #include "window.h"
29 #ifdef USER_MENU
30 #include "usermenu.h"
31 #endif /* USER_MENU */
32 #include "appicon.h"
33 #include "application.h"
34 #include "appmenu.h"
35 #include "properties.h"
36 #include "workspace.h"
37 #include "dock.h"
38 #include "defaults.h"
41 /******** Local variables ********/
43 static WWindow *makeMainWindow(WScreen * scr, Window window)
45 WWindow *wwin;
46 XWindowAttributes attr;
48 if (!XGetWindowAttributes(dpy, window, &attr))
49 return NULL;
51 wwin = wWindowCreate();
52 wwin->screen_ptr = scr;
53 wwin->client_win = window;
54 wwin->main_window = window;
55 wwin->wm_hints = XGetWMHints(dpy, window);
57 PropGetWMClass(window, &wwin->wm_class, &wwin->wm_instance);
59 wDefaultFillAttributes(wwin->wm_instance, wwin->wm_class, &wwin->user_flags,
60 &wwin->defined_user_flags, True);
62 XSelectInput(dpy, window, attr.your_event_mask | PropertyChangeMask | StructureNotifyMask);
63 return wwin;
66 WApplication *wApplicationOf(Window window)
68 WApplication *wapp;
70 if (window == None)
71 return NULL;
72 if (XFindContext(dpy, window, w_global.context.app_win, (XPointer *) & wapp) != XCSUCCESS)
73 return NULL;
74 return wapp;
77 WApplication *wApplicationCreate(WWindow * wwin)
79 WScreen *scr = wwin->screen_ptr;
80 Window main_window = wwin->main_window;
81 WApplication *wapp;
82 WWindow *leader;
84 if (main_window == None || main_window == scr->root_win)
85 return NULL;
88 Window root;
89 int foo;
90 unsigned int bar;
91 /* check if the window is valid */
92 if (!XGetGeometry(dpy, main_window, &root, &foo, &foo, &bar, &bar, &bar, &bar))
93 return NULL;
96 wapp = wApplicationOf(main_window);
97 if (wapp) {
98 wapp->refcount++;
99 if (wapp->app_icon && wapp->app_icon->docked &&
100 wapp->app_icon->relaunching && wapp->main_window_desc->fake_group)
101 wDockFinishLaunch(wapp->app_icon);
103 return wapp;
106 wapp = wmalloc(sizeof(WApplication));
108 wapp->refcount = 1;
109 wapp->last_focused = NULL;
110 wapp->urgent_bounce_timer = NULL;
112 wapp->last_workspace = 0;
114 wapp->main_window = main_window;
115 wapp->main_window_desc = makeMainWindow(scr, main_window);
116 if (!wapp->main_window_desc) {
117 wfree(wapp);
118 return NULL;
121 wapp->main_window_desc->fake_group = wwin->fake_group;
122 wapp->main_window_desc->net_icon_image = RRetainImage(wwin->net_icon_image);
124 leader = wWindowFor(main_window);
125 if (leader)
126 leader->main_window = main_window;
128 wapp->menu = wAppMenuGet(scr, main_window);
129 #ifdef USER_MENU
130 if (!wapp->menu)
131 wapp->menu = wUserMenuGet(scr, wapp->main_window_desc);
132 #endif
134 /* Set application wide attributes from the leader */
135 wapp->flags.hidden = WFLAGP(wapp->main_window_desc, start_hidden);
136 wapp->flags.emulated = WFLAGP(wapp->main_window_desc, emulate_appicon);
138 /* application descriptor */
139 XSaveContext(dpy, main_window, w_global.context.app_win, (XPointer) wapp);
141 create_appicon_for_application(wapp, wwin);
143 return wapp;
146 void wApplicationDestroy(WApplication *wapp)
148 WWindow *wwin;
150 if (!wapp)
151 return;
153 wapp->refcount--;
154 if (wapp->refcount > 0)
155 return;
157 if (wapp->urgent_bounce_timer) {
158 WMDeleteTimerHandler(wapp->urgent_bounce_timer);
159 wapp->urgent_bounce_timer = NULL;
161 if (wapp->flags.bouncing) {
162 /* event.c:handleDestroyNotify forced this destroy
163 and thereby overlooked the bounce callback */
164 wapp->refcount = 1;
165 return;
168 if (wapp->next)
169 wapp->next->prev = wapp->prev;
170 if (wapp->prev)
171 wapp->prev->next = wapp->next;
173 XDeleteContext(dpy, wapp->main_window, w_global.context.app_win);
174 wAppMenuDestroy(wapp->menu);
176 /* Remove application icon */
177 removeAppIconFor(wapp);
179 wwin = wWindowFor(wapp->main_window_desc->client_win);
181 wWindowDestroy(wapp->main_window_desc);
182 if (wwin) {
183 /* undelete client window context that was deleted in
184 * wWindowDestroy */
185 XSaveContext(dpy, wwin->client_win, w_global.context.client_win, (XPointer) & wwin->client_descriptor);
187 wfree(wapp);
190 void wApplicationActivate(WApplication *wapp)
192 if (wapp->app_icon) {
193 wIconSetHighlited(wapp->app_icon->icon, True);
194 wAppIconPaint(wapp->app_icon);
198 void wApplicationDeactivate(WApplication *wapp)
200 if (wapp->app_icon) {
201 wIconSetHighlited(wapp->app_icon->icon, False);
202 wAppIconPaint(wapp->app_icon);