diff options
author | Karoly Lorentey <lorentey@elte.hu> | 2007-01-06 15:25:16 +0000 |
---|---|---|
committer | Karoly Lorentey <lorentey@elte.hu> | 2007-01-06 15:25:16 +0000 |
commit | 191ae1cf7cd2571277635b3b8e488e773ca5c9b9 (patch) | |
tree | e0b26e3040767dae38fb39a03b757da05088c58f /src/gtkutil.c | |
parent | 382707ecfb50f8c7794a7ba3d8cd9db9b6cd29d0 (diff) | |
parent | f85c5e3b72855951b071eacb7b6e2d002c5fc4be (diff) | |
download | emacs-191ae1cf7cd2571277635b3b8e488e773ca5c9b9.tar.gz |
Merged from emacs@sv.gnu.org
Patches applied:
* emacs@sv.gnu.org/emacs--devo--0--patch-585
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-586
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-587
Update from erc--emacs--22
* emacs@sv.gnu.org/emacs--devo--0--patch-588
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-589
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-590
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-591
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-592
Diffstat (limited to 'src/gtkutil.c')
-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 d136dbe0fce..d57a0b56c0c 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -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); - } } } |