- for (; it; it = next, ++i) {
- next = g_slist_next(it);
- menu_free(it->data);
- desktop_menus = g_slist_delete_link(desktop_menus, it);
- menu_entry_remove(menu_find_entry_id(menu, i));
+
+ return TRUE; /* always show */
+}
+
+static void client_dest(ObClient *client, gpointer data)
+{
+ /* This concise function removes all references to a closed
+ * client in the client_list_menu, so we don't have to check
+ * in client.c */
+ GSList *it;
+ for (it = desktop_menus; it; it = g_slist_next(it)) {
+ ObMenu *mit = it->data;
+ GList *eit;
+ for (eit = mit->entries; eit; eit = g_list_next(eit)) {
+ ObMenuEntry *meit = eit->data;
+ if (meit->type == OB_MENU_ENTRY_TYPE_NORMAL) {
+ ObAction *a = meit->data.normal.actions->data;
+ ObClient *c = a->data.any.c;
+ if (c == client)
+ a->data.any.c = NULL;
+ }
+ }