all repos — openbox @ d3c094357d06f4e65681e7ca7e227a33ebd122a4

openbox fork - make it a bit more like ryudo

restore the desktop and focused window on restarts if possible
Dana Jansens danakj@orodu.net
commit

d3c094357d06f4e65681e7ca7e227a33ebd122a4

parent

92d3f2342db3d3bfd5d41a6c3dc165efa7766ffa

M openbox/Makefile.amopenbox/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
M openbox/client.copenbox/client.c

@@ -1,4 +1,5 @@

#include "client.h" +#include "startup.h" #include "screen.h" #include "moveresize.h" #include "prop.h"

@@ -25,9 +26,6 @@ ButtonMotionMask)

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);

@@ -53,11 +51,6 @@ {

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 @@ unsigned int i, j, nchild;

Window w, *children; XWMHints *wmhints; XWindowAttributes attrib; + Client *active; XQueryTree(ob_display, ob_root, &w, &w, &children, &nchild);

@@ -130,19 +124,21 @@ /* 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 = 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)
M openbox/openbox.copenbox/openbox.c

@@ -5,6 +5,7 @@ #include "client.h"

#include "dispatch.h" #include "xerror.h" #include "prop.h" +#include "startup.h" #include "screen.h" #include "focus.h" #include "moveresize.h"

@@ -150,6 +151,9 @@ ob_cursors.l = XCreateFontCursor(ob_display, XC_left_side);

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 */
M openbox/screen.copenbox/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 @@ screen_desktop_names = NULL;

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;
A 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); +}
A 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