diff options
author | markt <markt> | 2007-11-05 17:05:58 (GMT) |
---|---|---|
committer | markt <markt> | 2007-11-05 17:05:58 (GMT) |
commit | 97f7c3e1b59b9a94e36a78d97c141f6a05f43e20 (patch) | |
tree | 982ba8f35083fb54e5058f564ec8e301d8a229dc /src/Ewmh.cc | |
parent | 2c4e1f9a024433396f17ea5f3ef3fda46e0d8edd (diff) | |
download | fluxbox-97f7c3e1b59b9a94e36a78d97c141f6a05f43e20.zip fluxbox-97f7c3e1b59b9a94e36a78d97c141f6a05f43e20.tar.bz2 |
various refactoring and minor changes
Diffstat (limited to 'src/Ewmh.cc')
-rw-r--r-- | src/Ewmh.cc | 126 |
1 files changed, 38 insertions, 88 deletions
diff --git a/src/Ewmh.cc b/src/Ewmh.cc index 5483b8e..3e01e36 100644 --- a/src/Ewmh.cc +++ b/src/Ewmh.cc | |||
@@ -214,19 +214,9 @@ void Ewmh::setupClient(WinClient &winclient) { | |||
214 | updateStrut(winclient); | 214 | updateStrut(winclient); |
215 | 215 | ||
216 | FbTk::FbString newtitle = winclient.textProperty(m_net_wm_name); | 216 | FbTk::FbString newtitle = winclient.textProperty(m_net_wm_name); |
217 | if (!newtitle.empty()) { | 217 | if (!newtitle.empty()) |
218 | winclient.setTitle(newtitle); | 218 | winclient.setTitle(newtitle); |
219 | } | ||
220 | newtitle = winclient.textProperty(m_net_wm_icon_name); | ||
221 | if (!newtitle.empty()) { | ||
222 | winclient.setIconTitle(newtitle); | ||
223 | } | ||
224 | |||
225 | if ( winclient.fbwindow() ) | ||
226 | winclient.fbwindow()->titleSig().notify(); | ||
227 | } | ||
228 | 219 | ||
229 | void Ewmh::setupFrame(FluxboxWindow &win) { | ||
230 | Atom ret_type; | 220 | Atom ret_type; |
231 | int fmt; | 221 | int fmt; |
232 | unsigned long nitems, bytes_after; | 222 | unsigned long nitems, bytes_after; |
@@ -248,95 +238,59 @@ void Ewmh::setupFrame(FluxboxWindow &win) { | |||
248 | * | 238 | * |
249 | */ | 239 | */ |
250 | 240 | ||
251 | win.winClient().property(m_net_wm_window_type, 0, 0x7fffffff, False, XA_ATOM, | 241 | winclient.property(m_net_wm_window_type, 0, 0x7fffffff, False, XA_ATOM, |
252 | &ret_type, &fmt, &nitems, &bytes_after, | 242 | &ret_type, &fmt, &nitems, &bytes_after, |
253 | &data); | 243 | &data); |
244 | Focusable::WindowType type = Focusable::TYPE_NORMAL; | ||
254 | if (data) { | 245 | if (data) { |
255 | Atom *atoms = (unsigned long *)data; | 246 | Atom *atoms = (unsigned long *)data; |
256 | for (unsigned long l = 0; l < nitems; ++l) { | 247 | for (unsigned long l = 0; l < nitems; ++l) { |
257 | /* From Extended Window Manager Hints, draft 1.3: | 248 | if (atoms[l] == m_net_wm_window_type_dock) |
258 | * | 249 | type = Focusable::TYPE_DOCK; |
259 | * _NET_WM_WINDOW_TYPE_DOCK indicates a dock or panel feature. | 250 | else if (atoms[l] == m_net_wm_window_type_desktop) |
260 | * Typically a Window Manager would keep such windows on top | 251 | type = Focusable::TYPE_DESKTOP; |
261 | * of all other windows. | 252 | else if (atoms[l] == m_net_wm_window_type_splash) |
262 | * | 253 | type = Focusable::TYPE_SPLASH; |
254 | else if (atoms[l] == m_net_wm_window_type_dialog) | ||
255 | type = Focusable::TYPE_DIALOG; | ||
256 | else if (atoms[l] == m_net_wm_window_type_menu) | ||
257 | type = Focusable::TYPE_MENU; | ||
258 | else if (atoms[l] == m_net_wm_window_type_toolbar) | ||
259 | type = Focusable::TYPE_TOOLBAR; | ||
260 | else if (atoms[l] != m_net_wm_window_type_normal) | ||
261 | continue; | ||
262 | /* | ||
263 | * NOT YET IMPLEMENTED: | ||
264 | * _NET_WM_WINDOW_TYPE_UTILITY | ||
263 | */ | 265 | */ |
264 | if (atoms[l] == m_net_wm_window_type_dock) { | 266 | break; |
265 | // we also assume it shouldn't be visible in any toolbar | ||
266 | win.setFocusHidden(true); | ||
267 | win.setIconHidden(true); | ||
268 | win.setDecorationMask(FluxboxWindow::DECOR_NONE); | ||
269 | win.moveToLayer(Layer::DOCK); | ||
270 | } else if (atoms[l] == m_net_wm_window_type_desktop) { | ||
271 | /* | ||
272 | * _NET_WM_WINDOW_TYPE_DESKTOP indicates a "false desktop" window | ||
273 | * We let it be the size it wants, but it gets no decoration, | ||
274 | * is hidden in the toolbar and window cycling list, plus | ||
275 | * windows don't tab with it and is right on the bottom. | ||
276 | */ | ||
277 | |||
278 | win.setFocusHidden(true); | ||
279 | win.setIconHidden(true); | ||
280 | win.moveToLayer(Layer::DESKTOP); | ||
281 | win.setDecorationMask(FluxboxWindow::DECOR_NONE); | ||
282 | win.setTabable(false); | ||
283 | win.setMovable(false); | ||
284 | win.setResizable(false); | ||
285 | win.stick(); | ||
286 | |||
287 | } else if (atoms[l] == m_net_wm_window_type_splash) { | ||
288 | /* | ||
289 | * _NET_WM_WINDOW_TYPE_SPLASH indicates that the | ||
290 | * window is a splash screen displayed as an application | ||
291 | * is starting up. | ||
292 | */ | ||
293 | win.setDecorationMask(FluxboxWindow::DECOR_NONE); | ||
294 | win.setFocusHidden(true); | ||
295 | win.setIconHidden(true); | ||
296 | win.setMovable(false); | ||
297 | } else if (atoms[l] == m_net_wm_window_type_normal) { | ||
298 | // do nothing, this is ..normal.. | ||
299 | } else if (atoms[l] == m_net_wm_window_type_dialog) { | ||
300 | // dialog windows should not be tabable | ||
301 | win.setTabable(false); | ||
302 | } else if (atoms[l] == m_net_wm_window_type_menu) { | ||
303 | /* | ||
304 | * _NET_WM_WINDOW_TYPE_TOOLBAR and _NET_WM_WINDOW_TYPE_MENU | ||
305 | * indicate toolbar and pinnable menu windows, respectively | ||
306 | * (i.e. toolbars and menus "torn off" from the main | ||
307 | * application). Windows of this type may set the | ||
308 | * WM_TRANSIENT_FOR hint indicating the main application window. | ||
309 | */ | ||
310 | win.setDecorationMask(FluxboxWindow::DECOR_TOOL); | ||
311 | win.setIconHidden(true); | ||
312 | win.moveToLayer(Layer::ABOVE_DOCK); | ||
313 | } else if (atoms[l] == m_net_wm_window_type_toolbar) { | ||
314 | win.setDecorationMask(FluxboxWindow::DECOR_NONE); | ||
315 | win.setIconHidden(true); | ||
316 | win.moveToLayer(Layer::ABOVE_DOCK); | ||
317 | } | ||
318 | } | 267 | } |
319 | XFree(data); | 268 | XFree(data); |
320 | } else { | 269 | } else if (winclient.isTransient()) { |
321 | // if _NET_WM_WINDOW_TYPE not set and this window | 270 | // if _NET_WM_WINDOW_TYPE not set and this window |
322 | // has transient_for the type must be set to _NET_WM_WINDOW_TYPE_DIALOG | 271 | // has transient_for the type must be set to _NET_WM_WINDOW_TYPE_DIALOG |
323 | if ( win.winClient().isTransient() ) { | 272 | if (winclient.isTransient()) { |
324 | win.winClient(). | 273 | type = Focusable::TYPE_DIALOG; |
274 | winclient. | ||
325 | changeProperty(m_net_wm_window_type, | 275 | changeProperty(m_net_wm_window_type, |
326 | XA_ATOM, 32, PropModeReplace, | 276 | XA_ATOM, 32, PropModeReplace, |
327 | (unsigned char*)&m_net_wm_window_type_dialog, 1); | 277 | (unsigned char*)&m_net_wm_window_type_dialog, 1); |
328 | // and then we should treat it like a dialog | 278 | |
329 | win.setTabable(false); | ||
330 | } | 279 | } |
331 | } | 280 | } |
281 | winclient.setWindowType(type); | ||
332 | 282 | ||
333 | /* | ||
334 | * NOT YET IMPLEMENTED: | ||
335 | * _NET_WM_WINDOW_TYPE_UTILITY | ||
336 | */ | ||
337 | 283 | ||
284 | } | ||
285 | |||
286 | void Ewmh::setupFrame(FluxboxWindow &win) { | ||
338 | setupState(win); | 287 | setupState(win); |
339 | 288 | ||
289 | Atom ret_type; | ||
290 | int fmt; | ||
291 | unsigned long nitems, bytes_after; | ||
292 | unsigned char *data = 0; | ||
293 | |||
340 | if (win.winClient().property(m_net_wm_desktop, 0, 1, False, XA_CARDINAL, | 294 | if (win.winClient().property(m_net_wm_desktop, 0, 1, False, XA_CARDINAL, |
341 | &ret_type, &fmt, &nitems, &bytes_after, | 295 | &ret_type, &fmt, &nitems, &bytes_after, |
342 | (unsigned char **) &data) && data) { | 296 | (unsigned char **) &data) && data) { |
@@ -929,11 +883,7 @@ bool Ewmh::propertyNotify(WinClient &winclient, Atom the_property) { | |||
929 | winclient.fbwindow()->titleSig().notify(); | 883 | winclient.fbwindow()->titleSig().notify(); |
930 | return true; | 884 | return true; |
931 | } else if (the_property == m_net_wm_icon_name) { | 885 | } else if (the_property == m_net_wm_icon_name) { |
932 | FbTk::FbString newtitle = winclient.textProperty(the_property); | 886 | // we don't use icon title, since we don't show icons |
933 | if (!newtitle.empty()) | ||
934 | winclient.setIconTitle(newtitle); | ||
935 | if (winclient.fbwindow()) | ||
936 | winclient.fbwindow()->titleSig().notify(); | ||
937 | return true; | 887 | return true; |
938 | } | 888 | } |
939 | 889 | ||