summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/Makefile.am4
-rw-r--r--openbox/client.c26
-rw-r--r--openbox/openbox.c4
-rw-r--r--openbox/screen.c7
-rw-r--r--openbox/startup.c20
-rw-r--r--openbox/startup.h11
6 files changed, 53 insertions, 19 deletions
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