(menuitem_highlight_callback): Invoked widget is the
parent of the menu item. Get menu item widget from event. (xg_create_one_menuitem, xg_update_menu_item): highlight_id and unhighlight_id has been removed. (create_menus): Connect enter/leave-notify-event to the menu instead of individual items.
This commit is contained in:
parent
0c5e9b06e8
commit
665c8f1cb8
1 changed files with 25 additions and 55 deletions
|
@ -1718,9 +1718,9 @@ menuitem_destroy_callback (w, client_data)
|
|||
}
|
||||
|
||||
/* Callback called when the pointer enters/leaves a menu item.
|
||||
W is the menu item.
|
||||
W is the parent of the menu item.
|
||||
EVENT is either an enter event or leave event.
|
||||
CLIENT_DATA points to the xg_menu_item_cb_data associated with the W.
|
||||
CLIENT_DATA is not used.
|
||||
|
||||
Returns FALSE to tell GTK to keep processing this event. */
|
||||
|
||||
|
@ -1730,15 +1730,21 @@ menuitem_highlight_callback (w, event, client_data)
|
|||
GdkEventCrossing *event;
|
||||
gpointer client_data;
|
||||
{
|
||||
if (client_data)
|
||||
{
|
||||
xg_menu_item_cb_data *data = (xg_menu_item_cb_data*) client_data;
|
||||
gpointer call_data = event->type == GDK_LEAVE_NOTIFY ? 0 : client_data;
|
||||
GdkEvent ev;
|
||||
GtkWidget *subwidget;
|
||||
xg_menu_item_cb_data *data;
|
||||
|
||||
ev.crossing = *event;
|
||||
subwidget = gtk_get_event_widget (&ev);
|
||||
data = (xg_menu_item_cb_data *) g_object_get_data (G_OBJECT (subwidget),
|
||||
XG_ITEM_DATA);
|
||||
if (data)
|
||||
{
|
||||
if (! NILP (data->help) && data->cl_data->highlight_cb)
|
||||
{
|
||||
gpointer call_data = event->type == GDK_LEAVE_NOTIFY ? 0 : data;
|
||||
GtkCallback func = (GtkCallback) data->cl_data->highlight_cb;
|
||||
(*func) (w, call_data);
|
||||
(*func) (subwidget, call_data);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2004,7 +2010,7 @@ xg_create_one_menuitem (item, f, select_cb, highlight_cb, cl_data, group)
|
|||
|
||||
xg_list_insert (&xg_menu_item_cb_list, &cb_data->ptrs);
|
||||
|
||||
cb_data->unhighlight_id = cb_data->highlight_id = cb_data->select_id = 0;
|
||||
cb_data->select_id = 0;
|
||||
cb_data->help = item->help;
|
||||
cb_data->cl_data = cl_data;
|
||||
cb_data->call_data = item->call_data;
|
||||
|
@ -2025,22 +2031,6 @@ xg_create_one_menuitem (item, f, select_cb, highlight_cb, cl_data, group)
|
|||
= g_signal_connect (G_OBJECT (w), "activate", select_cb, cb_data);
|
||||
}
|
||||
|
||||
if (! NILP (item->help) && highlight_cb)
|
||||
{
|
||||
/* We use enter/leave notify instead of select/deselect because
|
||||
select/deselect doesn't go well with detached menus. */
|
||||
cb_data->highlight_id
|
||||
= g_signal_connect (G_OBJECT (w),
|
||||
"enter-notify-event",
|
||||
G_CALLBACK (menuitem_highlight_callback),
|
||||
cb_data);
|
||||
cb_data->unhighlight_id
|
||||
= g_signal_connect (G_OBJECT (w),
|
||||
"leave-notify-event",
|
||||
G_CALLBACK (menuitem_highlight_callback),
|
||||
cb_data);
|
||||
}
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
|
@ -2123,6 +2113,17 @@ create_menus (data, f, select_cb, deactivate_cb, highlight_cb,
|
|||
{
|
||||
wmenu = gtk_menu_new ();
|
||||
xg_set_screen (wmenu, f);
|
||||
/* Connect this to the menu instead of items so we get enter/leave for
|
||||
disabled items also. TODO: Still does not get enter/leave for
|
||||
disabled items in detached menus. */
|
||||
g_signal_connect (G_OBJECT (wmenu),
|
||||
"enter-notify-event",
|
||||
G_CALLBACK (menuitem_highlight_callback),
|
||||
NULL);
|
||||
g_signal_connect (G_OBJECT (wmenu),
|
||||
"leave-notify-event",
|
||||
G_CALLBACK (menuitem_highlight_callback),
|
||||
NULL);
|
||||
}
|
||||
else wmenu = gtk_menu_bar_new ();
|
||||
|
||||
|
@ -2619,37 +2620,6 @@ xg_update_menu_item (val, w, select_cb, highlight_cb, cl_data)
|
|||
g_signal_handler_disconnect (w, cb_data->select_id);
|
||||
cb_data->select_id = 0;
|
||||
}
|
||||
|
||||
if (NILP (cb_data->help))
|
||||
{
|
||||
/* Shall not have help. Remove if any existed previously. */
|
||||
if (cb_data->highlight_id)
|
||||
{
|
||||
g_signal_handler_disconnect (G_OBJECT (w),
|
||||
cb_data->highlight_id);
|
||||
cb_data->highlight_id = 0;
|
||||
}
|
||||
if (cb_data->unhighlight_id)
|
||||
{
|
||||
g_signal_handler_disconnect (G_OBJECT (w),
|
||||
cb_data->unhighlight_id);
|
||||
cb_data->unhighlight_id = 0;
|
||||
}
|
||||
}
|
||||
else if (! cb_data->highlight_id && highlight_cb)
|
||||
{
|
||||
/* Have help now, but didn't previously. Add callback. */
|
||||
cb_data->highlight_id
|
||||
= g_signal_connect (G_OBJECT (w),
|
||||
"enter-notify-event",
|
||||
G_CALLBACK (menuitem_highlight_callback),
|
||||
cb_data);
|
||||
cb_data->unhighlight_id
|
||||
= g_signal_connect (G_OBJECT (w),
|
||||
"leave-notify-event",
|
||||
G_CALLBACK (menuitem_highlight_callback),
|
||||
cb_data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue