From: Dana Jansens Date: Fri, 25 Apr 2003 22:35:08 +0000 (+0000) Subject: restore the desktop and focused window on restarts if possible X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=d3c094357d06f4e65681e7ca7e227a33ebd122a4;p=chaz%2Fopenbox restore the desktop and focused window on restarts if possible --- diff --git a/openbox/Makefile.am b/openbox/Makefile.am index 98d52424..a82473b5 100644 --- a/openbox/Makefile.am +++ b/openbox/Makefile.am @@ -24,12 +24,12 @@ openbox3_SOURCES=parse.tab.c parse.lex.c action.c client.c config.c \ extensions.c focus.c frame.c grab.c menu.c menu_render.c \ openbox.c framerender.c parse.c plugin.c prop.c screen.c \ stacking.c dispatch.c event.c group.c timer.c xerror.c \ - moveresize.c + moveresize.c startup.c noinst_HEADERS=action.h client.h config.h dispatch.h event.h extensions.h \ focus.h frame.h framerender.h geom.h gettext.h grab.h group.h \ menu.h openbox.h parse.h parse.tab.h plugin.h prop.h screen.h \ - stacking.h timer.h xerror.h moveresize.h + stacking.h timer.h xerror.h moveresize.h startup.h # kill the implicit .c.y rule %.c: %.y diff --git a/openbox/client.c b/openbox/client.c index c9b7baa1..ef6a0e1a 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -1,4 +1,5 @@ #include "client.h" +#include "startup.h" #include "screen.h" #include "moveresize.h" #include "prop.h" @@ -26,9 +27,6 @@ GList *client_list = NULL; GHashTable *client_map = NULL; -static Window *client_startup_stack_order = NULL; -static guint client_startup_stack_size = 0; - static void client_get_all(Client *self); static void client_toggle_border(Client *self, gboolean show); static void client_get_area(Client *self); @@ -53,11 +51,6 @@ void client_startup() client_map = g_hash_table_new((GHashFunc)map_hash, (GEqualFunc)map_key_comp); - /* save the stacking order on startup! */ - PROP_GETA32(ob_root, net_client_list_stacking, window, - (guint32**)&client_startup_stack_order, - &client_startup_stack_size); - client_set_list(); } @@ -95,6 +88,7 @@ void client_manage_all() Window w, *children; XWMHints *wmhints; XWindowAttributes attrib; + Client *active; XQueryTree(ob_display, ob_root, &w, &w, &children, &nchild); @@ -130,19 +124,21 @@ void client_manage_all() 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 = client_startup_stack_size; i > 0; --i) { + for (i = startup_stack_size; i > 0; --i) { Client *c; - w = client_startup_stack_order[i-1]; + w = startup_stack_order[i-1]; c = g_hash_table_lookup(client_map, &w); if (c) stacking_lower(c); } - g_free(client_startup_stack_order); - client_startup_stack_order = NULL; - client_startup_stack_size = 0; + g_free(startup_stack_order); + startup_stack_order = NULL; + startup_stack_size = 0; - if (config_focus_new) - focus_fallback(Fallback_NoFocus); + active = g_hash_table_lookup(client_map, &startup_active); + if (!active || !client_focus(active)) + if (config_focus_new) + focus_fallback(Fallback_NoFocus); } void client_manage(Window window) diff --git a/openbox/openbox.c b/openbox/openbox.c index 1f5ded49..ea9b895f 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -5,6 +5,7 @@ #include "dispatch.h" #include "xerror.h" #include "prop.h" +#include "startup.h" #include "screen.h" #include "focus.h" #include "moveresize.h" @@ -151,6 +152,9 @@ int main(int argc, char **argv) prop_startup(); /* get atoms values for the display */ extensions_query_all(); /* find which extensions are present */ + /* save stuff that we can use to restore state */ + startup_save(); + if (screen_annex()) { /* it will be ours! */ /* startup the parsing so everything can register sections of the rc */ parse_startup(); diff --git a/openbox/screen.c b/openbox/screen.c index c941e8da..03cee447 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -1,5 +1,6 @@ #include "openbox.h" #include "prop.h" +#include "startup.h" #include "config.h" #include "screen.h" #include "client.h" @@ -173,8 +174,10 @@ void screen_startup() screen_num_desktops = 0; screen_set_num_desktops(config_desktops_num); - screen_desktop = 0; - screen_set_desktop(0); + if (startup_desktop >= screen_num_desktops) + startup_desktop = 0; + screen_desktop = startup_desktop; + screen_set_desktop(startup_desktop); /* don't start in showing-desktop mode */ screen_showing_desktop = FALSE; diff --git a/openbox/startup.c b/openbox/startup.c new file mode 100644 index 00000000..6d381ff5 --- /dev/null +++ b/openbox/startup.c @@ -0,0 +1,20 @@ +#include "prop.h" +#include "screen.h" +#include "client.h" +#include "focus.h" +#include "config.h" +#include "openbox.h" + +guint32 *startup_stack_order = NULL; +guint startup_stack_size = 0; +guint32 startup_active = None; +guint32 startup_desktop = 0; + +void startup_save() +{ + /* save the stacking order on startup! */ + PROP_GETA32(ob_root, net_client_list_stacking, window, + (guint32**)&startup_stack_order, &startup_stack_size); + PROP_GET32(ob_root, net_active_window, window, &startup_active); + PROP_GET32(ob_root, net_current_desktop, cardinal, &startup_desktop); +} diff --git a/openbox/startup.h b/openbox/startup.h new file mode 100644 index 00000000..4963ccbf --- /dev/null +++ b/openbox/startup.h @@ -0,0 +1,11 @@ +#ifndef __startup_h +#define __startup_h + +extern guint32 *startup_stack_order; +extern guint startup_stack_size; +extern guint32 startup_active; +extern guint32 startup_desktop; + +void startup_save(); + +#endif