#include "client.h"
+#include "startup.h"
#include "screen.h"
#include "moveresize.h"
#include "prop.h"
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);
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();
}
Window w, *children;
XWMHints *wmhints;
XWindowAttributes attrib;
+ Client *active;
XQueryTree(ob_display, ob_root, &w, &w, &children, &nchild);
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);
+ if (config_focus_new) {
+ active = g_hash_table_lookup(client_map, &startup_active);
+ if (!active || !client_focus(active))
+ focus_fallback(Fallback_NoFocus);
+ }
}
void client_manage(Window window)
return NULL;
}
-static void calc_recursive(Client *self, StackLayer l, gboolean raised)
+static void calc_recursive(Client *self, Client *orig, StackLayer l,
+ gboolean raised)
{
StackLayer old;
GSList *it;
self->layer = l;
for (it = self->transients; it; it = it->next)
- calc_recursive(it->data, l, raised ? raised : l != old);
+ calc_recursive(it->data, orig, l, raised ? raised : l != old);
if (!raised && l != old)
- if (self->frame)
+ if (orig->frame) /* only restack if the original window is managed */
stacking_raise(self);
}
{
StackLayer l;
gboolean f;
+ Client *orig;
+
+ orig = self;
/* transients take on the layer of their parents */
if (self->transient_for) {
else if (self->below) l = Layer_Below;
else l = Layer_Normal;
- calc_recursive(self, l, FALSE);
+ calc_recursive(self, orig, l, FALSE);
}
gboolean client_should_show(Client *self)