diff options
| author | Jan Djärv | 2007-01-02 16:49:49 +0000 |
|---|---|---|
| committer | Jan Djärv | 2007-01-02 16:49:49 +0000 |
| commit | 665c8f1cb895d3ecad0cca9cdb133fd8e9985514 (patch) | |
| tree | 56a88ae3259094e118bfc851436803ea7e96861a /src | |
| parent | 0c5e9b06e83d815dcb2d028f4bdd8439e639ac8b (diff) | |
| download | emacs-665c8f1cb895d3ecad0cca9cdb133fd8e9985514.tar.gz emacs-665c8f1cb895d3ecad0cca9cdb133fd8e9985514.zip | |
(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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/gtkutil.c | 80 |
1 files changed, 25 insertions, 55 deletions
diff --git a/src/gtkutil.c b/src/gtkutil.c index 3dcdef2b0ae..3799a82d1ef 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c | |||
| @@ -1718,9 +1718,9 @@ menuitem_destroy_callback (w, client_data) | |||
| 1718 | } | 1718 | } |
| 1719 | 1719 | ||
| 1720 | /* Callback called when the pointer enters/leaves a menu item. | 1720 | /* Callback called when the pointer enters/leaves a menu item. |
| 1721 | W is the menu item. | 1721 | W is the parent of the menu item. |
| 1722 | EVENT is either an enter event or leave event. | 1722 | EVENT is either an enter event or leave event. |
| 1723 | CLIENT_DATA points to the xg_menu_item_cb_data associated with the W. | 1723 | CLIENT_DATA is not used. |
| 1724 | 1724 | ||
| 1725 | Returns FALSE to tell GTK to keep processing this event. */ | 1725 | Returns FALSE to tell GTK to keep processing this event. */ |
| 1726 | 1726 | ||
| @@ -1730,15 +1730,21 @@ menuitem_highlight_callback (w, event, client_data) | |||
| 1730 | GdkEventCrossing *event; | 1730 | GdkEventCrossing *event; |
| 1731 | gpointer client_data; | 1731 | gpointer client_data; |
| 1732 | { | 1732 | { |
| 1733 | if (client_data) | 1733 | GdkEvent ev; |
| 1734 | { | 1734 | GtkWidget *subwidget; |
| 1735 | xg_menu_item_cb_data *data = (xg_menu_item_cb_data*) client_data; | 1735 | xg_menu_item_cb_data *data; |
| 1736 | gpointer call_data = event->type == GDK_LEAVE_NOTIFY ? 0 : client_data; | ||
| 1737 | 1736 | ||
| 1737 | ev.crossing = *event; | ||
| 1738 | subwidget = gtk_get_event_widget (&ev); | ||
| 1739 | data = (xg_menu_item_cb_data *) g_object_get_data (G_OBJECT (subwidget), | ||
| 1740 | XG_ITEM_DATA); | ||
| 1741 | if (data) | ||
| 1742 | { | ||
| 1738 | if (! NILP (data->help) && data->cl_data->highlight_cb) | 1743 | if (! NILP (data->help) && data->cl_data->highlight_cb) |
| 1739 | { | 1744 | { |
| 1745 | gpointer call_data = event->type == GDK_LEAVE_NOTIFY ? 0 : data; | ||
| 1740 | GtkCallback func = (GtkCallback) data->cl_data->highlight_cb; | 1746 | GtkCallback func = (GtkCallback) data->cl_data->highlight_cb; |
| 1741 | (*func) (w, call_data); | 1747 | (*func) (subwidget, call_data); |
| 1742 | } | 1748 | } |
| 1743 | } | 1749 | } |
| 1744 | 1750 | ||
| @@ -2004,7 +2010,7 @@ xg_create_one_menuitem (item, f, select_cb, highlight_cb, cl_data, group) | |||
| 2004 | 2010 | ||
| 2005 | xg_list_insert (&xg_menu_item_cb_list, &cb_data->ptrs); | 2011 | xg_list_insert (&xg_menu_item_cb_list, &cb_data->ptrs); |
| 2006 | 2012 | ||
| 2007 | cb_data->unhighlight_id = cb_data->highlight_id = cb_data->select_id = 0; | 2013 | cb_data->select_id = 0; |
| 2008 | cb_data->help = item->help; | 2014 | cb_data->help = item->help; |
| 2009 | cb_data->cl_data = cl_data; | 2015 | cb_data->cl_data = cl_data; |
| 2010 | cb_data->call_data = item->call_data; | 2016 | cb_data->call_data = item->call_data; |
| @@ -2025,22 +2031,6 @@ xg_create_one_menuitem (item, f, select_cb, highlight_cb, cl_data, group) | |||
| 2025 | = g_signal_connect (G_OBJECT (w), "activate", select_cb, cb_data); | 2031 | = g_signal_connect (G_OBJECT (w), "activate", select_cb, cb_data); |
| 2026 | } | 2032 | } |
| 2027 | 2033 | ||
| 2028 | if (! NILP (item->help) && highlight_cb) | ||
| 2029 | { | ||
| 2030 | /* We use enter/leave notify instead of select/deselect because | ||
| 2031 | select/deselect doesn't go well with detached menus. */ | ||
| 2032 | cb_data->highlight_id | ||
| 2033 | = g_signal_connect (G_OBJECT (w), | ||
| 2034 | "enter-notify-event", | ||
| 2035 | G_CALLBACK (menuitem_highlight_callback), | ||
| 2036 | cb_data); | ||
| 2037 | cb_data->unhighlight_id | ||
| 2038 | = g_signal_connect (G_OBJECT (w), | ||
| 2039 | "leave-notify-event", | ||
| 2040 | G_CALLBACK (menuitem_highlight_callback), | ||
| 2041 | cb_data); | ||
| 2042 | } | ||
| 2043 | |||
| 2044 | return w; | 2034 | return w; |
| 2045 | } | 2035 | } |
| 2046 | 2036 | ||
| @@ -2123,6 +2113,17 @@ create_menus (data, f, select_cb, deactivate_cb, highlight_cb, | |||
| 2123 | { | 2113 | { |
| 2124 | wmenu = gtk_menu_new (); | 2114 | wmenu = gtk_menu_new (); |
| 2125 | xg_set_screen (wmenu, f); | 2115 | xg_set_screen (wmenu, f); |
| 2116 | /* Connect this to the menu instead of items so we get enter/leave for | ||
| 2117 | disabled items also. TODO: Still does not get enter/leave for | ||
| 2118 | disabled items in detached menus. */ | ||
| 2119 | g_signal_connect (G_OBJECT (wmenu), | ||
| 2120 | "enter-notify-event", | ||
| 2121 | G_CALLBACK (menuitem_highlight_callback), | ||
| 2122 | NULL); | ||
| 2123 | g_signal_connect (G_OBJECT (wmenu), | ||
| 2124 | "leave-notify-event", | ||
| 2125 | G_CALLBACK (menuitem_highlight_callback), | ||
| 2126 | NULL); | ||
| 2126 | } | 2127 | } |
| 2127 | else wmenu = gtk_menu_bar_new (); | 2128 | else wmenu = gtk_menu_bar_new (); |
| 2128 | 2129 | ||
| @@ -2619,37 +2620,6 @@ xg_update_menu_item (val, w, select_cb, highlight_cb, cl_data) | |||
| 2619 | g_signal_handler_disconnect (w, cb_data->select_id); | 2620 | g_signal_handler_disconnect (w, cb_data->select_id); |
| 2620 | cb_data->select_id = 0; | 2621 | cb_data->select_id = 0; |
| 2621 | } | 2622 | } |
| 2622 | |||
| 2623 | if (NILP (cb_data->help)) | ||
| 2624 | { | ||
| 2625 | /* Shall not have help. Remove if any existed previously. */ | ||
| 2626 | if (cb_data->highlight_id) | ||
| 2627 | { | ||
| 2628 | g_signal_handler_disconnect (G_OBJECT (w), | ||
| 2629 | cb_data->highlight_id); | ||
| 2630 | cb_data->highlight_id = 0; | ||
| 2631 | } | ||
| 2632 | if (cb_data->unhighlight_id) | ||
| 2633 | { | ||
| 2634 | g_signal_handler_disconnect (G_OBJECT (w), | ||
| 2635 | cb_data->unhighlight_id); | ||
| 2636 | cb_data->unhighlight_id = 0; | ||
| 2637 | } | ||
| 2638 | } | ||
| 2639 | else if (! cb_data->highlight_id && highlight_cb) | ||
| 2640 | { | ||
| 2641 | /* Have help now, but didn't previously. Add callback. */ | ||
| 2642 | cb_data->highlight_id | ||
| 2643 | = g_signal_connect (G_OBJECT (w), | ||
| 2644 | "enter-notify-event", | ||
| 2645 | G_CALLBACK (menuitem_highlight_callback), | ||
| 2646 | cb_data); | ||
| 2647 | cb_data->unhighlight_id | ||
| 2648 | = g_signal_connect (G_OBJECT (w), | ||
| 2649 | "leave-notify-event", | ||
| 2650 | G_CALLBACK (menuitem_highlight_callback), | ||
| 2651 | cb_data); | ||
| 2652 | } | ||
| 2653 | } | 2623 | } |
| 2654 | } | 2624 | } |
| 2655 | 2625 | ||