From 9318a7f42870753bd6b8c306573936369aa819f4 Mon Sep 17 00:00:00 2001 From: Brad Jorsch Date: Wed, 15 Sep 2010 12:59:00 -0400 Subject: [PATCH] Improve dockapp recognition On Wed, Sep 15, 2010 at 04:40:52PM +0200, Gilbert wrote: > > "." = {NoAppIcon = Yes;}; > "*" = {NoAppIcon = Yes;}; Oh, I see. It lets you override NoAppIcon generically instead of for each app. > Exactly, having 'DockApp' as the class name makes them behave more > consistently internally. This might be fixed in some other way > internally, but I couldn't figure it out... Except it doesn't, the only thing it changes inside wmaker is that it avoids displaying the name as "DockApp" on the settings window. A "dockapp" is just an application that sets icon_window in WM_HINTS (which causes a window to be displayed as the app icon) and initial_state to WithdrawnState (which causes the main window to not actually appear when the window is mapped). The class has nothing to do with it. The problems I mentioned stem from gtk+ not allowing you to set initial_state to WithdrawnState. Openbox and fluxbox (and maybe others) don't take the icon_window into their "slit" unless initial_state is WithdrawnState, so the whole thing completely fails. Wmaker always uses the icon_window for the app icon, so that part works fine, but the "main" app window still flashes onscreen for a split second before the app can call gdk_window_withdraw(), and wmaker applies SharedAppIcon to it which winds up screwing up the "Kill" menu option. That said, I've attached a patch to have wmaker treat any window with class DockApp as if it had initial_state = WithdrawnState, and hopefully openbox, fluxbox, and the like will pick up the idea too so gtk+ hacks[1] will no longer be needed. If this patch is accpeted, I'll poke fluxbox and openbox to suggest the idea to them. [1] E.g. http://wmudmount.svn.sourceforge.net/viewvc/wmudmount/dock.c?r1=8&r2=7 Subject: [PATCH] Improve dockapp recognition Dockapps are traditionally recognized by having initial_state = WithdrawnState in WM_HINTS. But some toolkits (e.g. gtk+) will not allow setting initial_state in this way. So we offer an alternative: any window with the res_class portion of WM_CLASS set as "DockApp" will be treated as if it had initial_state = WithdrawnState. --- NEWS | 9 +++++++++ src/window.c | 9 +++++++++ src/window.h | 1 + 3 files changed, 19 insertions(+) diff --git a/NEWS b/NEWS index 9f391768..c6bf3e6f 100644 --- a/NEWS +++ b/NEWS @@ -65,6 +65,15 @@ your CPU unnecessarily (0 wakeups when idle, instead of 4). So if you edit the WMRootMenu file by hand (or by using 'wmgenmenu'), there is no need to restart wmaker for the changes to take effect. +DockApp recognition +------------------- + +In addition to applications with only Withdrawn windows, Window Maker +will now treat any application with its WM_CLASS res_class set as +"DockApp". This provides an easy workaround for toolkits like gtk+ that +do not allow creation of windows with the initial_state member of +XWMHints set to WithdrawnState. + --- 0.92.0 diff --git a/src/window.c b/src/window.c index 80259830..ed47d968 100644 --- a/src/window.c +++ b/src/window.c @@ -677,6 +677,11 @@ WWindow *wManageWindow(WScreen *scr, Window window) wwin->wm_gnustep_attr = NULL; } + if (wwin->wm_class != NULL && strcmp(wwin->wm_class, "DockApp") == 0) { + wwin->flags.is_dockapp = 1; + withdraw = True; + } + wwin->client_leader = PropGetClientLeader(window); if (wwin->client_leader != None) wwin->main_window = wwin->client_leader; @@ -692,6 +697,7 @@ WWindow *wManageWindow(WScreen *scr, Window window) } else if (wwin->wm_hints->initial_state == WithdrawnState) { + wwin->flags.is_dockapp = 1; withdraw = True; } } @@ -759,6 +765,9 @@ WWindow *wManageWindow(WScreen *scr, Window window) } } + if (wwin->flags.is_dockapp) + WSETUFLAG(wwin, shared_appicon, 0); + if (!withdraw && wwin->main_window && WFLAGP(wwin, shared_appicon)) { char *buffer, *instance, *class; WFakeGroupLeader *fPtr; diff --git a/src/window.h b/src/window.h index 867e2220..ea61c28d 100644 --- a/src/window.h +++ b/src/window.h @@ -261,6 +261,7 @@ typedef struct WWindow { /* info flags */ unsigned int is_gnustep:1; /* 1 if the window belongs to a GNUstep app */ + unsigned int is_dockapp:1; /* 1 if the window belongs to a DockApp */ unsigned int buttons_dont_fit:1; unsigned int rebuild_texture:1; /* the window was resized and -- 2.11.4.GIT