summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-06-22 03:05:02 +0000
committerDana Jansens <danakj@orodu.net>2007-06-22 03:05:02 +0000
commit780d1b0961e2eed5fea4645b4398fafb4adad73a (patch)
tree2c200a9ef1f99d93f2d9cee560e649c1c682bb63
parentae624a1487fd7db9291c4de1a3b2c34fcab89ef9 (diff)
well.. it compiles..
-rw-r--r--openbox/actions.c13
-rw-r--r--openbox/client_list_combined_menu.c51
-rw-r--r--openbox/client_list_menu.c53
-rw-r--r--openbox/event.c1
-rw-r--r--openbox/keyboard.c95
-rw-r--r--openbox/keyboard.h8
-rw-r--r--openbox/keytree.c3
-rw-r--r--openbox/mainloop.c60
-rw-r--r--openbox/mainloop.h6
-rw-r--r--openbox/menu.c58
-rw-r--r--openbox/menu.h2
-rw-r--r--openbox/menuframe.c5
12 files changed, 91 insertions, 264 deletions
diff --git a/openbox/actions.c b/openbox/actions.c
index 7087f37d..00563a70 100644
--- a/openbox/actions.c
+++ b/openbox/actions.c
@@ -19,6 +19,7 @@
#include "actions.h"
#include "gettext.h"
#include "grab.h"
+#include "screen.h"
static void actions_definition_ref(ObActionsDefinition *def);
static void actions_definition_unref(ObActionsDefinition *def);
@@ -54,12 +55,12 @@ static GSList *registered = NULL;
void actions_startup(gboolean reconfig)
{
if (reconfig) return;
-
-
}
void actions_shutdown(gboolean reconfig)
{
+ actions_interactive_cancel_act();
+
if (reconfig) return;
/* free all the registered actions */
@@ -205,6 +206,14 @@ void actions_run_acts(GSList *acts,
{
GSList *it;
+ /* Don't allow saving the initial state when running things from the
+ menu */
+ if (uact == OB_USER_ACTION_MENU_SELECTION)
+ state = 0;
+ /* If x and y are < 0 then use the current pointer position */
+ if (x < 0 && y < 0)
+ screen_pointer_pos(&x, &y);
+
for (it = acts; it; it = g_slist_next(it)) {
ObActionsData data;
ObActionsAct *act = it->data;
diff --git a/openbox/client_list_combined_menu.c b/openbox/client_list_combined_menu.c
index cf85fd65..af2819bb 100644
--- a/openbox/client_list_combined_menu.c
+++ b/openbox/client_list_combined_menu.c
@@ -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"
@@ -38,7 +37,6 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
ObMenu *menu = frame->menu;
ObMenuEntry *e;
GList *it;
- gint i;
guint desktop;
menu_clear_entries(menu);
@@ -48,33 +46,22 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
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) {
+ 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, -1, title, NULL, FALSE);
g_free(title);
} else {
onlyiconic = FALSE;
- e = menu_add_normal(menu, i, c->title, acts, FALSE);
+ e = menu_add_normal(menu, -1, c->title, NULL, FALSE);
}
if (config_menu_client_list_icons
@@ -85,23 +72,20 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
e->data.normal.icon_alpha =
c->iconic ? OB_ICONIC_ALPHA : 0xff;
}
+
+ e->data.normal.data = c;
}
}
if (empty || onlyiconic) {
+ ObMenuEntry *e;
+
/* 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);
- 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;
}
@@ -109,18 +93,16 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
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, ObMenuFrame *f,
ObClient *c, guint state, gpointer data,
Time time)
{
- 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 == -1) {
+ if (self->data.normal.data) /* it's set to NULL if its destroyed */
+ client_activate(self->data.normal.data, FALSE, TRUE);
}
+ else
+ screen_set_desktop(self->id, TRUE);
}
static void client_dest(ObClient *client, gpointer data)
@@ -132,12 +114,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;
}
}
}
diff --git a/openbox/client_list_menu.c b/openbox/client_list_menu.c
index 25864684..936c3125 100644
--- a/openbox/client_list_menu.c
+++ b/openbox/client_list_menu.c
@@ -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"
@@ -43,40 +42,28 @@ static gboolean desk_menu_update(ObMenuFrame *frame, gpointer data)
ObMenu *menu = frame->menu;
DesktopData *d = data;
GList *it;
- gint i;
gboolean empty = TRUE;
gboolean onlyiconic = TRUE;
menu_clear_entries(menu);
- for (it = focus_order, i = 0; it; it = g_list_next(it), ++i) {
+ 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))
{
- GSList *acts = NULL;
- ObAction* act;
ObMenuEntry *e;
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 = d->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, -1, title, NULL, FALSE);
g_free(title);
} else {
onlyiconic = FALSE;
- e = menu_add_normal(menu, i, c->title, acts, FALSE);
+ e = menu_add_normal(menu, -1, c->title, NULL, FALSE);
}
if (config_menu_client_list_icons
@@ -86,41 +73,36 @@ static gboolean desk_menu_update(ObMenuFrame *frame, gpointer data)
e->data.normal.icon_data = icon->data;
e->data.normal.icon_alpha = c->iconic ? OB_ICONIC_ALPHA : 0xff;
}
+
+ e->data.normal.data = c;
}
}
if (empty || onlyiconic) {
+ ObMenuEntry *e;
+
/* 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);
- GSList *acts = NULL;
- ObAction* act;
- ObMenuEntry *e;
-
- act = action_from_string("Desktop", OB_USER_ACTION_MENU_SELECTION);
- act->data.desktop.desk = d->desktop;
- acts = g_slist_append(acts, act);
- e = menu_add_normal(menu, 0, _("Go there..."), acts, TRUE);
+ e = menu_add_normal(menu, d->desktop, _("Go there..."), NULL, TRUE);
if (d->desktop == screen_desktop)
e->data.normal.enabled = FALSE;
}
return TRUE; /* always show */
}
-/* executes it using the client in the actions, since we set that
- when we make the actions! */
static void desk_menu_execute(ObMenuEntry *self, ObMenuFrame *f,
ObClient *c, guint state, gpointer data,
Time time)
{
- 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 == -1) {
+ if (self->data.normal.data) /* it's set to NULL if its destroyed */
+ client_activate(self->data.normal.data, FALSE, TRUE);
}
+ else
+ screen_set_desktop(self->id, TRUE);
}
static void desk_menu_destroy(ObMenu *menu, gpointer data)
@@ -176,11 +158,10 @@ static void client_dest(ObClient *client, gpointer 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;
+ if (meit->type == OB_MENU_ENTRY_TYPE_NORMAL &&
+ meit->data.normal.data == client)
+ {
+ meit->data.normal.data = NULL;
}
}
}
diff --git a/openbox/event.c b/openbox/event.c
index 6d53de21..2a12d990 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -22,6 +22,7 @@
#include "window.h"
#include "openbox.h"
#include "dock.h"
+#include "actions.h"
#include "client.h"
#include "xerror.h"
#include "prop.h"
diff --git a/openbox/keyboard.c b/openbox/keyboard.c
index 18884991..ac92f5f9 100644
--- a/openbox/keyboard.c
+++ b/openbox/keyboard.c
@@ -38,16 +38,8 @@
#include <glib.h>
-typedef struct {
- gboolean active;
- guint state;
- ObClient *client;
- ObActionsAct *action;
-} ObInteractiveState;
-
KeyBindingTree *keyboard_firstnode = NULL;
static ObPopup *popup = NULL;
-static ObInteractiveState istate;
static KeyBindingTree *curpos;
static void grab_keys(gboolean grab)
@@ -178,64 +170,7 @@ gboolean keyboard_bind(GList *keylist, ObActionsAct *action)
return TRUE;
}
-static void keyboard_interactive_end(guint state, gboolean cancel, Time time,
- gboolean ungrab)
-{
#if 0
- GSList *alist;
-
- g_assert(istate.active);
-
- /* ungrab first so they won't be NotifyWhileGrabbed */
- if (ungrab)
- ungrab_keyboard();
-
- /* set this before running the actions so they know the keyboard is not
- grabbed */
- istate.active = FALSE;
-
- alist = g_slist_append(NULL, istate.action);
- action_run_interactive(alist, istate.client, state, time, cancel, TRUE);
- g_slist_free(alist);
-
- keyboard_reset_chains(0);
-#endif
-}
-
-static void keyboard_interactive_end_client(ObClient *client, gpointer data)
-{
- if (istate.active && istate.client == client)
- istate.client = NULL;
-}
-
-
-void keyboard_interactive_cancel()
-{
- keyboard_interactive_end(0, TRUE, event_curtime, TRUE);
-}
-
-gboolean keyboard_interactive_grab(guint state, ObClient *client,
- ObActionsAct *action)
-{
-#if 0
- g_assert(action->data.any.interactive);
-
- if (!istate.active) {
- if (!grab_keyboard())
- return FALSE;
- } else if (action->func != istate.action->func) {
- keyboard_interactive_end(state, TRUE, action->data.any.time, FALSE);
- }
-
- istate.active = TRUE;
- istate.state = state;
- istate.client = client;
- istate.action = action;
-
-#endif
- return TRUE;
-}
-
gboolean keyboard_process_interactive_grab(const XEvent *e, ObClient **client)
{
gboolean handled = FALSE;
@@ -268,6 +203,7 @@ gboolean keyboard_process_interactive_grab(const XEvent *e, ObClient **client)
return handled;
}
+#endif
void keyboard_event(ObClient *client, const XEvent *e)
{
@@ -312,17 +248,16 @@ void keyboard_event(ObClient *client, const XEvent *e)
set_curpos(p);
else {
GSList *it;
- gboolean inter = FALSE;
- for (it = p->actions; it && !inter; it = g_slist_next(it))
- if (((ObActionsAct*)it->data)->data.any.interactive)
- inter = TRUE;
- if (!inter) /* don't reset if the action is interactive */
+ for (it = p->actions; it; it = g_slist_next(it))
+ if (actions_act_is_interactive(it->data)) break;
+ if (it == NULL) /* reset if the actions are not interactive */
keyboard_reset_chains(0);
- action_run_key(p->actions, client, e->xkey.state,
- e->xkey.x_root, e->xkey.y_root,
- e->xkey.time);
+ actions_run_acts(p->actions, OB_USER_ACTION_KEYBOARD_KEY,
+ e->xkey.time, e->xkey.state,
+ e->xkey.x_root, e->xkey.y_root,
+ OB_FRAME_CONTEXT_NONE, client);
}
break;
}
@@ -330,29 +265,15 @@ void keyboard_event(ObClient *client, const XEvent *e)
}
}
-gboolean keyboard_interactively_grabbed()
-{
- return istate.active;
-}
-
void keyboard_startup(gboolean reconfig)
{
grab_keys(TRUE);
popup = popup_new(FALSE);
popup_set_text_align(popup, RR_JUSTIFY_CENTER);
-
- if (!reconfig)
- client_add_destroy_notify(keyboard_interactive_end_client, NULL);
}
void keyboard_shutdown(gboolean reconfig)
{
- if (!reconfig)
- client_remove_destroy_notify(keyboard_interactive_end_client);
-
- if (istate.active)
- keyboard_interactive_cancel();
-
ob_main_loop_timeout_remove(ob_main_loop, chain_timeout);
keyboard_unbind_all();
diff --git a/openbox/keyboard.h b/openbox/keyboard.h
index 1dfff654..1c55e050 100644
--- a/openbox/keyboard.h
+++ b/openbox/keyboard.h
@@ -43,12 +43,4 @@ void keyboard_event(struct _ObClient *client, const XEvent *e);
*/
void keyboard_reset_chains(gint break_chroots);
-gboolean keyboard_interactive_grab(guint state, struct _ObClient *client,
- struct _ObActionsAct *action);
-gboolean keyboard_process_interactive_grab(const XEvent *e,
- struct _ObClient **client);
-gboolean keyboard_interactively_grabbed();
-
-void keyboard_interactive_cancel();
-
#endif
diff --git a/openbox/keytree.c b/openbox/keytree.c
index 202dd32c..fb26624d 100644
--- a/openbox/keytree.c
+++ b/openbox/keytree.c
@@ -19,6 +19,7 @@
#include "keyboard.h"
#include "translate.h"
+#include "actions.h"
#include <glib.h>
void tree_destroy(KeyBindingTree *tree)
@@ -35,7 +36,7 @@ void tree_destroy(KeyBindingTree *tree)
g_free(it->data);
g_list_free(tree->keylist);
for (sit = tree->actions; sit != NULL; sit = sit->next)
- action_unref(sit->data);
+ actions_act_unref(sit->data);
g_slist_free(tree->actions);
}
g_free(tree);
diff --git a/openbox/mainloop.c b/openbox/mainloop.c
index 36bba627..f2a25133 100644
--- a/openbox/mainloop.c
+++ b/openbox/mainloop.c
@@ -18,8 +18,6 @@
*/
#include "mainloop.h"
-#include "action.h"
-#include "client.h"
#include "event.h"
#include <stdio.h>
@@ -90,8 +88,6 @@ struct _ObMainLoop
gboolean signal_fired;
guint signals_fired[NUM_SIGNALS];
GSList *signal_handlers[NUM_SIGNALS];
-
- GSList *action_queue;
};
struct _ObMainLoopTimer
@@ -182,8 +178,6 @@ ObMainLoop *ob_main_loop_new(Display *display)
all_loops = g_slist_prepend(all_loops, loop);
- loop->action_queue = NULL;
-
return loop;
}
@@ -234,10 +228,6 @@ void ob_main_loop_destroy(ObMainLoop *loop)
}
}
- for (it = loop->action_queue; it; it = g_slist_next(it))
- action_unref(it->data);
- g_slist_free(loop->action_queue);
-
g_free(loop);
}
}
@@ -253,37 +243,16 @@ static void fd_handle_foreach(gpointer key,
h->func(h->fd, h->data);
}
-void ob_main_loop_queue_action(ObMainLoop *loop, ObAction *act)
-{
- loop->action_queue = g_slist_append(loop->action_queue, action_copy(act));
-}
-
-static void ob_main_loop_client_destroy(ObClient *client, gpointer data)
-{
- ObMainLoop *loop = data;
- GSList *it;
-
- for (it = loop->action_queue; it; it = g_slist_next(it)) {
- ObAction *act = it->data;
-
- if (act->data.any.c == client)
- act->data.any.c = NULL;
- }
-}
-
void ob_main_loop_run(ObMainLoop *loop)
{
XEvent e;
struct timeval *wait;
fd_set selset;
GSList *it;
- ObAction *act;
loop->run = TRUE;
loop->running = TRUE;
- client_add_destroy_notify(ob_main_loop_client_destroy, loop);
-
while (loop->run) {
if (loop->signal_fired) {
guint i;
@@ -315,33 +284,6 @@ void ob_main_loop_run(ObMainLoop *loop)
h->func(&e, h->data);
}
} while (XPending(loop->display) && loop->run);
- } else if (loop->action_queue) {
- /* only fire off one action at a time, then go back for more
- X events, since the action might cause some X events (like
- FocusIn :) */
-
- do {
- act = loop->action_queue->data;
- if (act->data.any.client_action == OB_CLIENT_ACTION_ALWAYS &&
- !act->data.any.c)
- {
- loop->action_queue =
- g_slist_delete_link(loop->action_queue,
- loop->action_queue);
- action_unref(act);
- act = NULL;
- }
- } while (!act && loop->action_queue && loop->run);
-
- if (act) {
- event_curtime = act->data.any.time;
- act->func(&act->data);
- event_curtime = CurrentTime;
- loop->action_queue =
- g_slist_delete_link(loop->action_queue,
- loop->action_queue);
- action_unref(act);
- }
} else {
/* this only runs if there were no x events received */
@@ -365,8 +307,6 @@ void ob_main_loop_run(ObMainLoop *loop)
}
}
- client_remove_destroy_notify(ob_main_loop_client_destroy);
-
loop->running = FALSE;
}
diff --git a/openbox/mainloop.h b/openbox/mainloop.h
index 03f00359..373528e3 100644
--- a/openbox/mainloop.h
+++ b/openbox/mainloop.h
@@ -70,12 +70,6 @@ void ob_main_loop_timeout_remove_data(ObMainLoop *loop,
gpointer data,
gboolean cancel_dest);
-struct _ObAction;
-
-/*! Queues an action, which will be run when there are no more X events
- to process */
-void ob_main_loop_queue_action(ObMainLoop *loop, struct _ObAction *act);
-
void ob_main_loop_run(ObMainLoop *loop);
void ob_main_loop_exit(ObMainLoop *loop);
diff --git a/openbox/menu.c b/openbox/menu.c
index c82eab80..c4111018 100644
--- a/openbox/menu.c
+++ b/openbox/menu.c
@@ -22,8 +22,10 @@
#include "openbox.h"
#include "mainloop.h"
#include "stacking.h"
+#include "grab.h"
#include "client.h"
#include "config.h"
+#include "actions.h"
#include "screen.h"
#include "menuframe.h"
#include "keyboard.h"
@@ -263,8 +265,7 @@ static void parse_menu_item(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
for (node = node->children; node; node = node->next)
if (!xmlStrcasecmp(node->name, (const xmlChar*) "action")) {
- ObAction *a = action_parse
- (i, doc, node, OB_USER_ACTION_MENU_SELECTION);
+ ObActionsAct *a = actions_parse(i, doc, node);
if (a)
acts = g_slist_append(acts, a);
}
@@ -411,8 +412,8 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
ObMenu *self;
ObMenuFrame *frame;
- if (!(self = menu_from_name(name))
- || keyboard_interactively_grabbed()) return;
+ if (!(self = menu_from_name(name)) ||
+ grab_on_keyboard() || grab_on_pointer()) return;
/* if the requested menu is already the top visible menu, then don't
bother */
@@ -430,30 +431,33 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
frame = menu_frame_new(self, 0, client);
if (!menu_frame_show_topmenu(frame, x, y, button))
menu_frame_free(frame);
- else if (!button) {
- /* select the first entry if it's not a submenu and we opened
- * the menu with the keyboard, and skip all headers */
- GList *it = frame->entries;
- while (it) {
- ObMenuEntryFrame *e = it->data;
- if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL) {
- menu_frame_select(frame, e, FALSE);
- break;
- } else if (e->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR)
- it = g_list_next(it);
- else
- break;
+ else {
+ if (!button) {
+ /* select the first entry if it's not a submenu and we opened
+ * the menu with the keyboard, and skip all headers */
+ GList *it = frame->entries;
+ while (it) {
+ ObMenuEntryFrame *e = it->data;
+ if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL) {
+ menu_frame_select(frame, e, FALSE);
+ break;
+ } else if (e->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR)
+ it = g_list_next(it);
+ else
+ break;
+ }
}
- }
- if (!button)
- menu_can_hide = TRUE;
- else {
- menu_can_hide = FALSE;
- ob_main_loop_timeout_add(ob_main_loop,
- config_menu_hide_delay * 1000,
- menu_hide_delay_func,
- NULL, g_direct_equal, NULL);
+ /* reset the hide timer */
+ if (!button)
+ menu_can_hide = TRUE;
+ else {
+ menu_can_hide = FALSE;
+ ob_main_loop_timeout_add(ob_main_loop,
+ config_menu_hide_delay * 1000,
+ menu_hide_delay_func,
+ NULL, g_direct_equal, NULL);
+ }
}
}
@@ -498,7 +502,7 @@ void menu_entry_unref(ObMenuEntry *self)
case OB_MENU_ENTRY_TYPE_NORMAL:
g_free(self->data.normal.label);
while (self->data.normal.actions) {
- action_unref(self->data.normal.actions->data);
+ actions_act_unref(self->data.normal.actions->data);
self->data.normal.actions =
g_slist_delete_link(self->data.normal.actions,
self->data.normal.actions);
diff --git a/openbox/menu.h b/openbox/menu.h
index 6288d870..47b65fbb 100644
--- a/openbox/menu.h
+++ b/openbox/menu.h
@@ -125,6 +125,8 @@ struct _ObNormalMenuEntry {
RrColor *mask_selected_color;
RrColor *mask_disabled_color;
RrColor *mask_disabled_selected_color;
+
+ gpointer data;
};
struct _ObSubmenuMenuEntry {
diff --git a/openbox/menuframe.c b/openbox/menuframe.c
index fdb24afb..7bacf020 100644
--- a/openbox/menuframe.c
+++ b/openbox/menuframe.c
@@ -21,6 +21,7 @@
#include "client.h"
#include "menu.h"
#include "screen.h"
+#include "actions.h"
#include "grab.h"
#include "openbox.h"
#include "mainloop.h"
@@ -1201,7 +1202,9 @@ void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state, Time time)
if (func)
func(entry, frame, client, state, data, time);
else
- action_run(acts, client, state, time);
+ actions_run_acts(acts, OB_USER_ACTION_MENU_SELECTION,
+ time, state, -1, -1, OB_FRAME_CONTEXT_NONE,
+ client);
}
}