fix no more crashing in the client menu.
This commit is contained in:
parent
1361a87bdf
commit
f0fdba8ad3
3 changed files with 29 additions and 46 deletions
|
@ -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;
|
||||
g_assert(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);
|
||||
|
||||
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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue