X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=75aecf41f630500d154f15e90b0655b06d48cd80;hb=cb3aaab102035e227c6d64c7b5c319ed3b13cef2;hp=999b23dd287b01a85d4cb3262aaf90a9993e7323;hpb=5e5fdb1666ac4877ca4d26f5ca565a299bc4cc42;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 999b23dd..75aecf41 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -1,8 +1,8 @@ -#include "debug.h" #include "client.h" +#include "debug.h" +#include "startupnotify.h" #include "dock.h" #include "xerror.h" -#include "startup.h" #include "screen.h" #include "moveresize.h" #include "place.h" @@ -37,6 +37,7 @@ GSList *client_destructors = NULL; static void client_get_all(ObClient *self); static void client_toggle_border(ObClient *self, gboolean show); +static void client_get_startup_id(ObClient *self); static void client_get_area(ObClient *self); static void client_get_desktop(ObClient *self); static void client_get_state(ObClient *self); @@ -51,12 +52,14 @@ static void client_restore_session_state(ObClient *self); static void client_restore_session_stacking(ObClient *self); static void client_urgent_notify(ObClient *self); -void client_startup() +void client_startup(gboolean reconfig) { + if (reconfig) return; + client_set_list(); } -void client_shutdown() +void client_shutdown(gboolean reconfig) { } @@ -163,35 +166,8 @@ void client_manage_all() } XFree(children); - /* stack them as they were on startup! - why with stacking_lower? Why, because then windows who aren't in the - stacking list are on the top where you can see them instead of buried - at the bottom! */ - for (i = startup_stack_size; i > 0; --i) { - ObWindow *obw; - - w = startup_stack_order[i-1]; - obw = g_hash_table_lookup(window_map, &w); - if (obw) { - g_assert(WINDOW_IS_CLIENT(obw)); - stacking_lower(CLIENT_AS_WINDOW(obw)); - } - } - g_free(startup_stack_order); - startup_stack_order = NULL; - startup_stack_size = 0; - - if (config_focus_new) { - ObWindow *active; - - active = g_hash_table_lookup(window_map, &startup_active); - if (active) { - g_assert(WINDOW_IS_CLIENT(active)); - if (!client_focus(WINDOW_AS_CLIENT(active))) - focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); - } else - focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); - } + if (config_focus_new) + focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); } void client_manage(Window window) @@ -249,9 +225,18 @@ void client_manage(Window window) self->obwin.type = Window_Client; self->window = window; + /* non-zero defaults */ + self->title_count = 1; + self->wmstate = NormalState; + self->layer = -1; + self->decorate = TRUE; + self->desktop = screen_num_desktops; /* always an invalid value */ + client_get_all(self); client_restore_session_state(self); + sn_app_started(self->class); + client_change_state(self); /* remove the client's border (and adjust re gravity) */ @@ -667,15 +652,10 @@ static void client_toggle_border(ObClient *self, gboolean show) static void client_get_all(ObClient *self) { - /* non-zero defaults */ - self->title_count = 1; - self->wmstate = NormalState; - self->layer = -1; - self->decorate = TRUE; - client_get_area(self); client_update_transient_for(self); client_update_wmhints(self); + client_get_startup_id(self); client_get_desktop(self); client_get_state(self); client_get_shaped(self); @@ -699,6 +679,14 @@ static void client_get_all(ObClient *self) client_update_icons(self); } +static void client_get_startup_id(ObClient *self) +{ + if (!(PROP_GETS(self->window, net_startup_id, utf8, &self->startup_id))) + if (self->group) + PROP_GETS(self->group->leader, + net_startup_id, utf8, &self->startup_id); +} + static void client_get_area(ObClient *self) { XWindowAttributes wattrib; @@ -739,9 +727,16 @@ static void client_get_desktop(ObClient *self) } } } - if (!trdesk) - /* defaults to the current desktop */ - self->desktop = screen_desktop; + if (!trdesk) { + /* try get from the startup-notification protocol */ + if (sn_get_desktop(self->startup_id, &self->desktop)) { + if (self->desktop >= screen_num_desktops && + self->desktop != DESKTOP_ALL) + self->desktop = screen_num_desktops - 1; + } else + /* defaults to the current desktop */ + self->desktop = screen_desktop; + } } if (self->desktop != d) { /* set the desktop hint, to make sure that it always exists */ @@ -817,7 +812,11 @@ void client_update_transient_for(ObClient *self) target = g_hash_table_lookup(window_map, &t); /* if this happens then we need to check for it*/ g_assert(target != self); - g_assert(!target || WINDOW_IS_CLIENT(target)); + if (target && !WINDOW_IS_CLIENT(target)) { + /* this can happen when a dialog is a child of + a dockapp, for example */ + target = NULL; + } if (!target && self->group) { /* not transient to a client, see if it is transient for a