X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient_list_menu.c;h=f3df2a5aec1ba5a4e209bfad744e006cfd6e5ad3;hb=HEAD;hp=e6521a0aafe8761dcce6a2b392dbe2139af69d9e;hpb=12ca673de556b341588a7f67fb2b9417c1e91d6b;p=chaz%2Fopenbox diff --git a/openbox/client_list_menu.c b/openbox/client_list_menu.c index e6521a0a..f3df2a5a 100644 --- a/openbox/client_list_menu.c +++ b/openbox/client_list_menu.c @@ -54,11 +54,9 @@ static gboolean desk_menu_update(ObMenuFrame *frame, gpointer data) for (it = focus_order; it; it = g_list_next(it)) { ObClient *c = it->data; - if (client_normal(c) && (!c->skip_taskbar || c->iconic) && - (c->desktop == d->desktop || c->desktop == DESKTOP_ALL)) - { + if (focus_valid_target(c, d->desktop, + TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE)) { ObMenuEntry *e; - const ObClientIcon *icon; empty = FALSE; @@ -71,11 +69,9 @@ static gboolean desk_menu_update(ObMenuFrame *frame, gpointer data) e = menu_add_normal(menu, d->desktop, c->title, NULL, FALSE); } - if (config_menu_client_list_icons - && (icon = client_icon(c, 32, 32))) { - e->data.normal.icon_width = icon->width; - e->data.normal.icon_height = icon->height; - e->data.normal.icon_data = icon->data; + if (config_menu_show_icons) { + e->data.normal.icon = client_icon(c); + RrImageRef(e->data.normal.icon); e->data.normal.icon_alpha = c->iconic ? OB_ICONIC_ALPHA : 0xff; } @@ -104,10 +100,12 @@ static void desk_menu_execute(ObMenuEntry *self, ObMenuFrame *f, { ObClient *t = self->data.normal.data; if (t) { /* it's set to NULL if its destroyed */ - client_activate(t, FALSE, TRUE, TRUE, TRUE); + gboolean here = state & ShiftMask; + + client_activate(t, TRUE, here, TRUE, TRUE, TRUE); /* if the window is omnipresent then we need to go to its desktop */ - if (t->desktop == DESKTOP_ALL) + if (!here && t->desktop == DESKTOP_ALL) screen_set_desktop(self->id, FALSE); } else @@ -118,11 +116,21 @@ static void desk_menu_destroy(ObMenu *menu, gpointer data) { DesktopData *d = data; - g_free(d); + g_slice_free(DesktopData, d); desktop_menus = g_slist_remove(desktop_menus, menu); } +static void self_cleanup(ObMenu *menu, gpointer data) +{ + menu_clear_entries(menu); + + while (desktop_menus) { + menu_free(desktop_menus->data); + desktop_menus = g_slist_delete_link(desktop_menus, desktop_menus); + } +} + static gboolean self_update(ObMenuFrame *frame, gpointer data) { ObMenu *menu = frame->menu; @@ -138,7 +146,7 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data) for (i = 0; i < screen_num_desktops; ++i) { ObMenu *submenu; gchar *name = g_strdup_printf("%s-%u", MENU_NAME, i); - DesktopData *ddata = g_new(DesktopData, 1); + DesktopData *ddata = g_slice_new(DesktopData); ddata->desktop = i; submenu = menu_new(name, screen_desktop_names[i], FALSE, ddata); @@ -205,6 +213,7 @@ void client_list_menu_startup(gboolean reconfig) menu = menu_new(MENU_NAME, _("Desktops"), TRUE, NULL); menu_set_update_func(menu, self_update); + menu_set_cleanup_func(menu, self_cleanup); menu_set_execute_func(menu, self_execute); }