add the showmenu action
[mikachu/openbox.git] / openbox / actions / showmenu.c
diff --git a/openbox/actions/showmenu.c b/openbox/actions/showmenu.c
new file mode 100644 (file)
index 0000000..6b6cbbe
--- /dev/null
@@ -0,0 +1,69 @@
+#include "openbox/actions.h"
+#include <glib.h>
+
+typedef struct {
+    gchar   *name;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+/*
+static gboolean i_input_func(guint initial_state,
+                             XEvent *e,
+                             gpointer options,
+                             gboolean *used);
+static void     i_cancel_func(gpointer options);
+*/
+
+void action_showmenu_startup()
+{
+    actions_register("ShowMenu",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+
+    if ((n = parse_find_node("menu", node)))
+        o->name = parse_string(doc, n);
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    if (o) {
+        g_free(o->name);
+        g_free(o);
+    }
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    /* you cannot call ShowMenu from inside a menu */
+    if (data->uact == OB_USER_ACTION_MENU_SELECTION) return FALSE;
+
+    if (o->name) {
+        gboolean mouse = (data->uact == OB_USER_ACTION_MOUSE_PRESS ||
+                          data->uact == OB_USER_ACTION_MOUSE_RELEASE ||
+                          data->uact == OB_USER_ACTION_MOUSE_CLICK ||
+                          data->uact == OB_USER_ACTION_MOUSE_DOUBLE_CLICK ||
+                          data->uact == OB_USER_ACTION_MOUSE_MOTION);
+
+        menu_show(o->name, data->x, data->y, mouse, data->client);
+    }
+
+    return FALSE;
+}