]> Dogcows Code - chaz/openbox/commitdiff
restore the desktop and focused window on restarts if possible
authorDana Jansens <danakj@orodu.net>
Fri, 25 Apr 2003 22:35:08 +0000 (22:35 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 25 Apr 2003 22:35:08 +0000 (22:35 +0000)
openbox/Makefile.am
openbox/client.c
openbox/openbox.c
openbox/screen.c
openbox/startup.c [new file with mode: 0644]
openbox/startup.h [new file with mode: 0644]

index 98d524249906cd654af9f4c41b478335be5fdd13..a82473b55a4c58c440770c9056536e968a09a62d 100644 (file)
@@ -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
index c9b7baa135510b90393c5d29babe289bf0e5953f..ef6a0e1a112936eda697ac165f27dd5cba5a9364 100644 (file)
@@ -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)
index 1f5ded49a184954b9184114cb87a5957bc78fc70..ea9b895f6d2d637f85d7ab93e82563690509b349 100644 (file)
@@ -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();
index c941e8daf3270dcd1166dd9ce2c16d7876bf3dfc..03cee447e7456c40093da8f37ac4faf6fe6ebe5d 100644 (file)
@@ -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 (file)
index 0000000..6d381ff
--- /dev/null
@@ -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 (file)
index 0000000..4963ccb
--- /dev/null
@@ -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
This page took 0.039818 seconds and 4 git commands to generate.