From f0fdba8ad36010280fc84c2425010c195b76562a Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 9 May 2007 00:11:06 +0000 Subject: [PATCH] fix no more crashing in the client menu. --- openbox/client_menu.c | 66 +++++++++++++++---------------------------- openbox/menu.h | 2 ++ openbox/menuframe.c | 7 +++-- 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); } -- 2.45.2