X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fclient.c;h=556430ec53594ce1d863bf12be441937b23570e1;hb=a26cd30bf068c2cf7edbfdb5a20548d04bfb3179;hp=3ef71e92f510a82bf5d2373b8d1edb9662d63cf5;hpb=a3012eafbdb8468a8e61e685a47587da0a48868e;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 3ef71e92..556430ec 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -228,6 +228,7 @@ void client_unmanage(Client *client) g_message("Unmanaging window: %lx", client->window); dispatch_client(Event_Client_Destroy, client, 0, 0); + g_assert(client != NULL); /* remove the window from our save set */ XChangeSaveSet(ob_display, client->window, SetModeDelete); @@ -239,12 +240,14 @@ void client_unmanage(Client *client) /* dispatch the unmapped event */ dispatch_client(Event_Client_Unmapped, client, 0, 0); + g_assert(client != NULL); /* give the client its border back */ client_toggle_border(client, TRUE); /* reparent the window out of the frame, and free the frame */ engine_frame_release_client(client->frame, client); + client->frame = NULL; client_list = g_slist_remove(client_list, client); stacking_list = g_list_remove(stacking_list, client); @@ -299,8 +302,8 @@ void client_unmanage(Client *client) g_free(client->icons); g_free(client->title); g_free(client->icon_title); - g_free(client->res_name); - g_free(client->res_class); + g_free(client->name); + g_free(client->class); g_free(client->role); g_free(client); @@ -383,7 +386,7 @@ static void client_get_all(Client *self) /* defaults */ self->frame = NULL; self->title = self->icon_title = NULL; - self->res_name = self->res_class = self->role = NULL; + self->name = self->class = self->role = NULL; self->wmstate = NormalState; self->transient = FALSE; self->transients = NULL; @@ -814,10 +817,9 @@ void client_setup_decor_and_functions(Client *self) client_change_allowed_actions(self); if (self->frame) { - /* change the decors on the frame */ - engine_frame_adjust_size(self->frame); - /* with more/less decorations, we may need to be repositioned */ - engine_frame_adjust_position(self->frame); + /* change the decors on the frame, and with more/less decorations, + we may also need to be repositioned */ + engine_frame_adjust_area(self->frame); /* with new decor, the window's maximized size may change */ client_remaximize(self); } @@ -946,8 +948,7 @@ void client_update_title(Client *self) { gchar *data = NULL; - if (self->title != NULL) - g_free(self->title); + g_free(self->title); /* try netwm */ if (!PROP_GETS(self->window, net_wm_name, utf8, data)) { @@ -981,8 +982,7 @@ void client_update_icon_title(Client *self) { gchar *data = NULL; - if (self->icon_title != NULL) - g_free(self->icon_title); + g_free(self->icon_title); /* try netwm */ if (!PROP_GETS(self->window, net_wm_icon_name, utf8, data)) { @@ -1015,19 +1015,19 @@ void client_update_class(Client *self) gchar *s; guint i; - if (self->res_name) g_free(self->res_name); - if (self->res_class) g_free(self->res_class); + if (self->name) g_free(self->name); + if (self->class) g_free(self->class); if (self->role) g_free(self->role); - self->res_name = self->res_class = self->role = NULL; + self->name = self->class = self->role = NULL; data = g_ptr_array_new(); if (PROP_GETSA(self->window, wm_class, string, data)) { if (data->len > 0) - self->res_name = g_strdup(g_ptr_array_index(data, 0)); + self->name = g_strdup(g_ptr_array_index(data, 0)); if (data->len > 1) - self->res_class = g_strdup(g_ptr_array_index(data, 1)); + self->class = g_strdup(g_ptr_array_index(data, 1)); } for (i = 0; i < data->len; ++i) @@ -1037,8 +1037,8 @@ void client_update_class(Client *self) if (PROP_GETS(self->window, wm_window_role, string, s)) self->role = g_strdup(s); - if (self->res_name == NULL) self->res_name = g_strdup(""); - if (self->res_class == NULL) self->res_class = g_strdup(""); + if (self->name == NULL) self->name = g_strdup(""); + if (self->class == NULL) self->class = g_strdup(""); if (self->role == NULL) self->role = g_strdup(""); } @@ -1387,12 +1387,9 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h, /* move/resize the frame to match the request */ if (self->frame) { - /* Adjust the size and then the position, as required by the EWMH */ - if (resized) - engine_frame_adjust_size(self->frame); - if (moved) { - engine_frame_adjust_position(self->frame); + engine_frame_adjust_area(self->frame); + if (moved) { if (!user || final) { XEvent event; event.type = ConfigureNotify; @@ -1626,7 +1623,8 @@ void client_shade(Client *self, gboolean shade) self->wmstate = shade ? IconicState : NormalState; self->shaded = shade; client_change_state(self); - engine_frame_adjust_size(self->frame); + /* resize the frame to just the titlebar */ + engine_frame_adjust_area(self->frame); } void client_close(Client *self) @@ -1656,6 +1654,11 @@ void client_close(Client *self) XSendEvent(ob_display, self->window, FALSE, NoEventMask, &ce); } +void client_kill(Client *self) +{ + XKillClient(ob_display, self->window); +} + void client_set_desktop(Client *self, guint target) { guint old, i; @@ -1919,6 +1922,8 @@ gboolean client_focus(Client *self) XSendEvent(ob_display, self->window, FALSE, NoEventMask, &ce); } + client_set_focused(self, TRUE); + /* XSync(ob_display, FALSE); XXX Why sync? */ return TRUE; } @@ -1926,7 +1931,30 @@ gboolean client_focus(Client *self) void client_unfocus(Client *self) { g_assert(focus_client == self); - focus_set_client(NULL); + client_set_focused(self, FALSE); +} + +void client_set_focused(Client *self, gboolean focused) +{ + if (focused) { + if (focus_client != self) { + focus_set_client(self); + + /* focus state can affect the stacking layer */ + client_calc_layer(self); + + engine_frame_adjust_focus(self->frame); + } + } else { + if (focus_client == self) + focus_set_client(NULL); + + /* focus state can affect the stacking layer */ + client_calc_layer(self); + + if (self->frame != NULL) /* unfocus can happen while being unmanaged */ + engine_frame_adjust_focus(self->frame); + } } gboolean client_focused(Client *self)