#include "client.h"
+#include "slit.h"
#include "startup.h"
#include "screen.h"
#include "moveresize.h"
w = startup_stack_order[i-1];
c = g_hash_table_lookup(client_map, &w);
- if (c) stacking_lower(c);
+ if (c) stacking_lower(CLIENT_AS_WINDOW(c));
}
g_free(startup_stack_order);
startup_stack_order = NULL;
XEvent e;
XWindowAttributes attrib;
XSetWindowAttributes attrib_set;
-/* XWMHints *wmhint; */
+ XWMHints *wmhint;
grab_server(TRUE);
return; /* don't manage it */
}
-/* /\* is the window a docking app *\/
+ /* is the window a docking app */
if ((wmhint = XGetWMHints(ob_display, window))) {
if ((wmhint->flags & StateHint) &&
wmhint->initial_state == WithdrawnState) {
- /\* XXX: make dock apps work! *\/
+ slit_add(window, wmhint);
grab_server(FALSE);
XFree(wmhint);
return;
}
XFree(wmhint);
}
-*/
+
g_message("Managing window: %lx", window);
/* choose the events we want to receive on the CLIENT window */
/* create the Client struct, and populate it from the hints on the
window */
self = g_new(Client, 1);
+ self->obwin.type = Window_Client;
self->window = window;
client_get_all(self);
grab_server(FALSE);
client_list = g_list_append(client_list, self);
- stacking_list = g_list_append(stacking_list, self);
+ stacking_add(self);
g_assert(!g_hash_table_lookup(client_map, &self->window));
g_hash_table_insert(client_map, &self->window, self);
/* update the focus lists */
focus_order_add_new(self);
- stacking_raise(self);
+ stacking_raise(CLIENT_AS_WINDOW(self));
screen_update_struts();
frame_hide(self->frame);
client_list = g_list_remove(client_list, self);
- stacking_list = g_list_remove(stacking_list, self);
+ stacking_remove(self);
g_hash_table_remove(client_map, &self->window);
/* update the focus lists */
guint32 nums;
guint i;
char *data = NULL;
+ gboolean read_title;
g_free(self->title);
/* update the icon title */
data = NULL;
g_free(self->icon_title);
-
+
+ read_title = TRUE;
/* try netwm */
if (!PROP_GETS(self->window, net_wm_icon_name, utf8, &data))
/* try old x stuff */
- if (!PROP_GETS(self->window, wm_icon_name, locale, &data))
- data = g_strdup("Unnamed Window");
+ if (!PROP_GETS(self->window, wm_icon_name, locale, &data)) {
+ data = g_strdup(self->title);
+ read_title = FALSE;
+ }
/* append the title count, dont display the number for the first window */
- if (self->title_count > 1) {
+ if (read_title && self->title_count > 1) {
char *vdata, *ndata;
ndata = g_strdup_printf(" - [%u]", self->title_count);
vdata = g_strconcat(data, ndata, NULL);
{
StackLayer l;
- if (self->iconic) l = Layer_Icon;
- else if (self->fullscreen) l = Layer_Fullscreen;
+ if (self->fullscreen) l = Layer_Fullscreen;
else if (self->type == Type_Desktop) l = Layer_Desktop;
else if (self->type == Type_Dock) {
if (!self->below) l = Layer_Top;
if (!raised && l != old)
if (orig->frame) /* only restack if the original window is managed */
- stacking_raise(self);
+ stacking_raise(CLIENT_AS_WINDOW(self));
}
void client_calc_layer(Client *self)
client_showhide(self);
/* raise if it was not already on the desktop */
if (old != DESKTOP_ALL)
- stacking_raise(self);
+ stacking_raise(CLIENT_AS_WINDOW(self));
screen_update_struts();
/* add to the new desktop(s) */
focus_fallback(Fallback_Unfocusing);
}
+void client_activate(Client *self)
+{
+ if (client_normal(self) && screen_showing_desktop)
+ screen_show_desktop(FALSE);
+ if (self->iconic)
+ client_iconify(self, FALSE, TRUE);
+ else if (!self->frame->visible)
+ /* if its not visible for other reasons, then don't mess
+ with it */
+ return;
+ if (self->shaded)
+ client_shade(self, FALSE);
+ client_focus(self);
+ stacking_raise(CLIENT_AS_WINDOW(self));
+}
+
gboolean client_focused(Client *self)
{
return self == focus_client;