summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/client_menu.c66
-rw-r--r--openbox/menu.h2
-rw-r--r--openbox/menuframe.c7
3 files changed, 29 insertions, 46 deletions
diff --git a/openbox/client_menu.c b/openbox/client_menu.c
index 0d4aa57f..80feb2a1 100644
--- a/openbox/client_menu.c
+++ b/openbox/client_menu.c
@@ -100,30 +100,21 @@ static gboolean client_menu_update(ObMenuFrame *frame, gpointer data)
return TRUE; /* show the menu */
}
-static void client_menu_execute(ObMenuEntry *e, guint state, gpointer data,
+static void client_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
+ ObClient *c, guint state, gpointer data,
Time time)
{
GList *it;
- ObMenuFrame *f;
- ObClient *c;
-
- /* find our frame */
- for (it = menu_frame_visible; it; it = g_list_next(it)) {
- f = it->data;
- /* yay this is our menu frame */
- if (f->menu == e->menu)
- break;
- }
- g_assert(it);
- c = f->client;
+ g_assert(c);
switch (e->id) {
case CLIENT_ICONIFY:
client_iconify(c, TRUE, FALSE);
/* the client won't be on screen anymore so hide the menu */
menu_frame_hide_all();
- return; /* and don't update */
+ f = NULL; /* and don't update */
+ break;
case CLIENT_RESTORE:
client_maximize(c, FALSE, 0);
break;
@@ -150,8 +141,10 @@ static void client_menu_execute(ObMenuEntry *e, guint state, gpointer data,
}
/* update the menu cuz stuff can have changed */
- client_menu_update(f, NULL);
- menu_frame_render(f);
+ if (f) {
+ client_menu_update(f, NULL);
+ menu_frame_render(f);
+ }
}
static gboolean layer_menu_update(ObMenuFrame *frame, gpointer data)
@@ -186,20 +179,11 @@ static gboolean layer_menu_update(ObMenuFrame *frame, gpointer data)
return TRUE; /* show the menu */
}
-static void layer_menu_execute(ObMenuEntry *e, guint state, gpointer data,
+static void layer_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
+ ObClient *c, guint state, gpointer data,
Time time)
{
- GList *it;
- ObMenuFrame *f;
-
- /* find our frame */
- for (it = menu_frame_visible; it; it = g_list_next(it)) {
- f = it->data;
- /* yay this is our menu frame */
- if (f->menu == e->menu)
- break;
- }
- g_assert(it);
+ g_assert(c);
switch (e->id) {
case LAYER_TOP:
@@ -216,8 +200,10 @@ static void layer_menu_execute(ObMenuEntry *e, guint state, gpointer data,
}
/* update the menu cuz stuff can have changed */
- layer_menu_update(f, NULL);
- menu_frame_render(f);
+ if (f) {
+ layer_menu_update(f, NULL);
+ menu_frame_render(f);
+ }
}
static gboolean send_to_menu_update(ObMenuFrame *frame, gpointer data)
@@ -264,24 +250,16 @@ static gboolean send_to_menu_update(ObMenuFrame *frame, gpointer data)
return TRUE; /* show the menu */
}
-static void send_to_menu_execute(ObMenuEntry *e, guint state, gpointer data,
+static void send_to_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
+ ObClient *c, guint state, gpointer data,
Time time)
{
- GList *it;
- ObMenuFrame *f;
-
- /* find our frame */
- for (it = menu_frame_visible; it; it = g_list_next(it)) {
- f = it->data;
- /* yay this is our menu frame */
- if (f->menu == e->menu)
- break;
- }
- g_assert(it);
+ g_assert(c);
- client_set_desktop(f->client, e->id, FALSE);
+ client_set_desktop(c, e->id, FALSE);
/* the client won't even be on the screen anymore, so hide the menu */
- menu_frame_hide_all();
+ if (f)
+ menu_frame_hide_all();
}
static void client_menu_place(ObMenuFrame *frame, gint *x, gint *y,
diff --git a/openbox/menu.h b/openbox/menu.h
index 9fc84bb8..7987f96e 100644
--- a/openbox/menu.h
+++ b/openbox/menu.h
@@ -42,6 +42,8 @@ typedef void (*ObMenuHideFunc)(struct _ObMenuFrame *frame, gpointer data);
typedef gboolean (*ObMenuUpdateFunc)(struct _ObMenuFrame *frame,
gpointer data);
typedef void (*ObMenuExecuteFunc)(struct _ObMenuEntry *entry,
+ struct _ObMenuFrame *frame,
+ ObClient *client,
guint state, gpointer data, Time time);
typedef void (*ObMenuDestroyFunc)(struct _ObMenu *menu, gpointer data);
/*! @param x is the mouse x coordinate. on return it should be the x coordinate
diff --git a/openbox/menuframe.c b/openbox/menuframe.c
index 6ca876fa..a2760aa1 100644
--- a/openbox/menuframe.c
+++ b/openbox/menuframe.c
@@ -1169,13 +1169,16 @@ void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state, Time time)
gpointer data = self->frame->menu->data;
GSList *acts = self->entry->data.normal.actions;
ObClient *client = self->frame->client;
+ ObMenuFrame *frame = self->frame;
/* release grabs before executing the shit */
- if (!(state & ControlMask))
+ if (!(state & ControlMask)) {
menu_frame_hide_all();
+ frame = NULL;
+ }
if (func)
- func(entry, state, data, time);
+ func(entry, frame, client, state, data, time);
else
action_run(acts, client, state, time);
}