Fix shadowed variables
[mikachu/openbox.git] / openbox / client_list_combined_menu.c
index fcc95f6..194c927 100644 (file)
@@ -20,7 +20,6 @@
 #include "openbox.h"
 #include "menu.h"
 #include "menuframe.h"
-#include "action.h"
 #include "screen.h"
 #include "client.h"
 #include "focus.h"
 
 ObMenu *combined_menu;
 
+#define SEPARATOR -1
+#define ADD_DESKTOP -2
+#define REMOVE_DESKTOP -3
+
 static gboolean self_update(ObMenuFrame *frame, gpointer data)
 {
     ObMenu *menu = frame->menu;
     ObMenuEntry *e;
     GList *it;
-    gint i;
     guint desktop;
 
     menu_clear_entries(menu);
@@ -47,34 +49,23 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
         gboolean empty = TRUE;
         gboolean onlyiconic = TRUE;
 
-        menu_add_separator(menu, -1, screen_desktop_names[desktop]);
-        for (it = focus_order, i = 0; it; it = g_list_next(it), ++i) {
+        menu_add_separator(menu, SEPARATOR, screen_desktop_names[desktop]);
+        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 == desktop || c->desktop == DESKTOP_ALL))
             {
-                GSList *acts = NULL;
-                ObAction* act;
                 const ObClientIcon *icon;
 
                 empty = FALSE;
 
-                act = action_from_string("Activate",
-                                         OB_USER_ACTION_MENU_SELECTION);
-                act->data.activate.any.c = c;
-                acts = g_slist_append(acts, act);
-                act = action_from_string("Desktop",
-                                         OB_USER_ACTION_MENU_SELECTION);
-                act->data.desktop.desk = desktop;
-                acts = g_slist_append(acts, act);
-
                 if (c->iconic) {
                     gchar *title = g_strdup_printf("(%s)", c->icon_title);
-                    e = menu_add_normal(menu, i, title, acts, FALSE);
+                    e = menu_add_normal(menu, desktop, title, NULL, FALSE);
                     g_free(title);
                 } else {
                     onlyiconic = FALSE;
-                    e = menu_add_normal(menu, i, c->title, acts, FALSE);
+                    e = menu_add_normal(menu, desktop, c->title, NULL, FALSE);
                 }
 
                 if (config_menu_client_list_icons
@@ -82,7 +73,11 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
                     e->data.normal.icon_width = icon->width;
                     e->data.normal.icon_height = icon->height;
                     e->data.normal.icon_data = icon->data;
+                    e->data.normal.icon_alpha =
+                        c->iconic ? OB_ICONIC_ALPHA : 0xff;
                 }
+
+                e->data.normal.data = c;
             }
         }
 
@@ -90,33 +85,44 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
             /* no entries or only iconified windows, so add a
              * way to go to this desktop without uniconifying a window */
             if (!empty)
-                menu_add_separator(menu, -1, NULL);
+                menu_add_separator(menu, SEPARATOR, NULL);
 
-            GSList *acts = NULL;
-            ObAction* act;
-            ObMenuEntry *e;
-
-            act = action_from_string("Desktop", OB_USER_ACTION_MENU_SELECTION);
-            act->data.desktop.desk = desktop;
-            acts = g_slist_append(acts, act);
-            e = menu_add_normal(menu, 0, _("Go there..."), acts, TRUE);
+            e = menu_add_normal(menu, desktop, _("Go there..."), NULL, TRUE);
             if (desktop == screen_desktop)
                 e->data.normal.enabled = FALSE;
         }
     }
+
+    menu_add_separator(menu, SEPARATOR, _("Manage desktops"));
+    menu_add_normal(menu, ADD_DESKTOP, _("_Add new desktop"), NULL, TRUE);
+    menu_add_normal(menu, REMOVE_DESKTOP, _("_Remove last desktop"),
+                    NULL, TRUE);
+
     return TRUE; /* always show the menu */
 }
 
-/* executes it using the client in the actions, since we set that
-   when we make the actions! */
-static void menu_execute(ObMenuEntry *self, guint state, gpointer data,
-                         Time time)
+static void menu_execute(ObMenuEntry *self, ObMenuFrame *f,
+                         ObClient *c, guint state, gpointer data)
 {
-    ObAction *a;
-
-    if (self->data.normal.actions) {
-        a = self->data.normal.actions->data;
-        action_run(self->data.normal.actions, a->data.any.c, state, time);
+    if (self->id == ADD_DESKTOP) {
+        screen_add_desktop(FALSE);
+        menu_frame_hide_all();
+    }
+    else if (self->id == REMOVE_DESKTOP) {
+        screen_remove_desktop(FALSE);
+        menu_frame_hide_all();
+    }
+    else {
+        ObClient *t = self->data.normal.data;
+        if (t) { /* it's set to NULL if its destroyed */
+            client_activate(t, FALSE, TRUE, TRUE, TRUE);
+            /* if the window is omnipresent then we need to go to its
+               desktop */
+            if (t->desktop == DESKTOP_ALL)
+                screen_set_desktop(self->id, FALSE);
+        }
+        else
+            screen_set_desktop(self->id, TRUE);
     }
 }
 
@@ -129,12 +135,9 @@ static void client_dest(ObClient *client, gpointer data)
     for (eit = combined_menu->entries; eit; eit = g_list_next(eit)) {
         ObMenuEntry *meit = eit->data;
         if (meit->type == OB_MENU_ENTRY_TYPE_NORMAL &&
-            meit->data.normal.actions)
+            meit->data.normal.data == client)
         {
-            ObAction *a = meit->data.normal.actions->data;
-            ObClient *c = a->data.any.c;
-            if (c == client)
-                a->data.any.c = NULL;
+            meit->data.normal.data = NULL;
         }
     }
 }
@@ -142,7 +145,7 @@ static void client_dest(ObClient *client, gpointer data)
 void client_list_combined_menu_startup(gboolean reconfig)
 {
     if (!reconfig)
-        client_add_destructor(client_dest, NULL);
+        client_add_destroy_notify(client_dest, NULL);
 
     combined_menu = menu_new(MENU_NAME, _("Windows"), TRUE, NULL);
     menu_set_update_func(combined_menu, self_update);
@@ -152,5 +155,5 @@ void client_list_combined_menu_startup(gboolean reconfig)
 void client_list_combined_menu_shutdown(gboolean reconfig)
 {
     if (!reconfig)
-        client_remove_destructor(client_dest);
+        client_remove_destroy_notify(client_dest);
 }