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.
26 #include "WindowMaker.h"
31 #endif /* USER_MENU */
33 #include "application.h"
35 #include "properties.h"
36 #include "workspace.h"
39 /******** Global variables ********/
41 extern XContext wAppWinContext
;
42 extern XContext wWinContext
;
44 /******** Local variables ********/
46 static WWindow
*makeMainWindow(WScreen
* scr
, Window window
)
49 XWindowAttributes attr
;
51 if (!XGetWindowAttributes(dpy
, window
, &attr
))
54 wwin
= wWindowCreate();
55 wwin
->screen_ptr
= scr
;
56 wwin
->client_win
= window
;
57 wwin
->main_window
= window
;
58 wwin
->wm_hints
= XGetWMHints(dpy
, window
);
60 PropGetWMClass(window
, &wwin
->wm_class
, &wwin
->wm_instance
);
62 wDefaultFillAttributes(wwin
->wm_instance
, wwin
->wm_class
, &wwin
->user_flags
,
63 &wwin
->defined_user_flags
, True
);
65 XSelectInput(dpy
, window
, attr
.your_event_mask
| PropertyChangeMask
| StructureNotifyMask
);
69 WApplication
*wApplicationOf(Window window
)
75 if (XFindContext(dpy
, window
, wAppWinContext
, (XPointer
*) & wapp
) != XCSUCCESS
)
80 WApplication
*wApplicationCreate(WWindow
* wwin
)
82 WScreen
*scr
= wwin
->screen_ptr
;
83 Window main_window
= wwin
->main_window
;
87 if (main_window
== None
|| main_window
== scr
->root_win
)
94 /* check if the window is valid */
95 if (!XGetGeometry(dpy
, main_window
, &root
, &foo
, &foo
, &bar
, &bar
, &bar
, &bar
))
99 wapp
= wApplicationOf(main_window
);
102 if (wapp
->app_icon
&& wapp
->app_icon
->docked
&&
103 wapp
->app_icon
->relaunching
&& wapp
->main_window_desc
->fake_group
)
104 wDockFinishLaunch(wapp
->app_icon
->dock
, wapp
->app_icon
);
109 wapp
= wmalloc(sizeof(WApplication
));
112 wapp
->last_focused
= NULL
;
113 wapp
->urgent_bounce_timer
= NULL
;
115 wapp
->last_workspace
= 0;
117 wapp
->main_window
= main_window
;
118 wapp
->main_window_desc
= makeMainWindow(scr
, main_window
);
119 if (!wapp
->main_window_desc
) {
124 wapp
->main_window_desc
->fake_group
= wwin
->fake_group
;
125 wapp
->main_window_desc
->net_icon_image
= RRetainImage(wwin
->net_icon_image
);
127 leader
= wWindowFor(main_window
);
129 leader
->main_window
= main_window
;
131 wapp
->menu
= wAppMenuGet(scr
, main_window
);
134 wapp
->menu
= wUserMenuGet(scr
, wapp
->main_window_desc
);
137 /* Set application wide attributes from the leader */
138 wapp
->flags
.hidden
= WFLAGP(wapp
->main_window_desc
, start_hidden
);
139 wapp
->flags
.emulated
= WFLAGP(wapp
->main_window_desc
, emulate_appicon
);
141 /* application descriptor */
142 XSaveContext(dpy
, main_window
, wAppWinContext
, (XPointer
) wapp
);
144 /* First try to create an icon from the dock or clip */
145 create_appicon_from_dock(wwin
, wapp
, main_window
);
148 * In case it was not found in the dock, make it from scratch.
149 * Note: makeAppIconFor() returns early if wapp->app_icon exists
151 makeAppIconFor(wapp
);
153 /* Save the app_icon in a file */
154 save_appicon(wapp
->app_icon
, False
);
159 void wApplicationDestroy(WApplication
* wapp
)
168 if (wapp
->refcount
> 0)
171 if (wapp
->urgent_bounce_timer
) {
172 WMDeleteTimerHandler(wapp
->urgent_bounce_timer
);
173 wapp
->urgent_bounce_timer
= NULL
;
175 if (wapp
->flags
.bouncing
) {
176 /* event.c:handleDestroyNotify forced this destroy
177 and thereby overlooked the bounce callback */
182 scr
= wapp
->main_window_desc
->screen_ptr
;
184 if (wapp
== scr
->wapp_list
) {
186 wapp
->next
->prev
= NULL
;
187 scr
->wapp_list
= wapp
->next
;
190 wapp
->next
->prev
= wapp
->prev
;
192 wapp
->prev
->next
= wapp
->next
;
195 XDeleteContext(dpy
, wapp
->main_window
, wAppWinContext
);
196 wAppMenuDestroy(wapp
->menu
);
197 wApplicationDeactivate(wapp
);
199 /* Remove application icon */
200 removeAppIconFor(wapp
);
202 wwin
= wWindowFor(wapp
->main_window_desc
->client_win
);
204 wWindowDestroy(wapp
->main_window_desc
);
206 /* undelete client window context that was deleted in
208 XSaveContext(dpy
, wwin
->client_win
, wWinContext
, (XPointer
) & wwin
->client_descriptor
);
213 void wApplicationActivate(WApplication
*wapp
)
216 if (wapp
->app_icon
) {
217 wIconSetHighlited(wapp
->app_icon
->icon
, True
);
218 wAppIconPaint(wapp
->app_icon
);
223 void wApplicationDeactivate(WApplication
*wapp
)
226 if (wapp
->app_icon
) {
227 wIconSetHighlited(wapp
->app_icon
->icon
, False
);
228 wAppIconPaint(wapp
->app_icon
);