Mercurial > emacs
changeset 75040:37202e2fc35f
(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.
author | Jan Djärv <jan.h.d@swipnet.se> |
---|---|
date | Tue, 02 Jan 2007 16:49:49 +0000 |
parents | 3acb94c294b1 |
children | 538afc1a2495 |
files | src/gtkutil.c |
diffstat | 1 files changed, 25 insertions(+), 55 deletions(-) [+] |
line wrap: on
line diff
--- a/src/gtkutil.c Tue Jan 02 16:48:35 2007 +0000 +++ b/src/gtkutil.c Tue Jan 02 16:49:49 2007 +0000 @@ -1718,9 +1718,9 @@ } /* 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 @@ GdkEventCrossing *event; gpointer client_data; { - if (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) { - xg_menu_item_cb_data *data = (xg_menu_item_cb_data*) client_data; - gpointer call_data = event->type == GDK_LEAVE_NOTIFY ? 0 : client_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_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 @@ = 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 @@ { 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 @@ 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); - } } }