]> Dogcows Code - chaz/openbox/blob - openbox/actions/showmenu.c
add the showmenu action
[chaz/openbox] / openbox / actions / showmenu.c
1 #include "openbox/actions.h"
2 #include <glib.h>
3
4 typedef struct {
5 gchar *name;
6 } Options;
7
8 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
9 static void free_func(gpointer options);
10 static gboolean run_func(ObActionsData *data, gpointer options);
11 /*
12 static gboolean i_input_func(guint initial_state,
13 XEvent *e,
14 gpointer options,
15 gboolean *used);
16 static void i_cancel_func(gpointer options);
17 */
18
19 void action_showmenu_startup()
20 {
21 actions_register("ShowMenu",
22 setup_func,
23 free_func,
24 run_func,
25 NULL, NULL);
26 }
27
28 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
29 {
30 xmlNodePtr n;
31 Options *o;
32
33 o = g_new0(Options, 1);
34
35 if ((n = parse_find_node("menu", node)))
36 o->name = parse_string(doc, n);
37 return o;
38 }
39
40 static void free_func(gpointer options)
41 {
42 Options *o = options;
43
44 if (o) {
45 g_free(o->name);
46 g_free(o);
47 }
48 }
49
50 /* Always return FALSE because its not interactive */
51 static gboolean run_func(ObActionsData *data, gpointer options)
52 {
53 Options *o = options;
54
55 /* you cannot call ShowMenu from inside a menu */
56 if (data->uact == OB_USER_ACTION_MENU_SELECTION) return FALSE;
57
58 if (o->name) {
59 gboolean mouse = (data->uact == OB_USER_ACTION_MOUSE_PRESS ||
60 data->uact == OB_USER_ACTION_MOUSE_RELEASE ||
61 data->uact == OB_USER_ACTION_MOUSE_CLICK ||
62 data->uact == OB_USER_ACTION_MOUSE_DOUBLE_CLICK ||
63 data->uact == OB_USER_ACTION_MOUSE_MOTION);
64
65 menu_show(o->name, data->x, data->y, mouse, data->client);
66 }
67
68 return FALSE;
69 }
This page took 0.03393 seconds and 4 git commands to generate.