static GtkWidget * get_event_widget (GtkWidget *proxy) { GtkWidget *widget; /** * Finding the interesting widget requires internal knowledge of * the widgets in question. This can't be helped, but by keeping * the sneaky code in one place, it can easily be updated. */ if (GTK_IS_MENU_ITEM (proxy)) { /* Menu items already forward middle clicks */ widget = NULL; } else if (GTK_IS_MENU_TOOL_BUTTON (proxy)) { widget = eel_gtk_menu_tool_button_get_button (GTK_MENU_TOOL_BUTTON (proxy)); } else if (GTK_IS_TOOL_BUTTON (proxy)) { /* The tool button's button is the direct child */ widget = gtk_bin_get_child (GTK_BIN (proxy)); } else if (GTK_IS_BUTTON (proxy)) { widget = proxy; } else { /* Don't touch anything we don't know about */ widget = NULL; } return widget; }
static void connect_proxy (GtkAction *action, GtkWidget *proxy) { if (GTK_IS_MENU_TOOL_BUTTON (proxy)) { CajaNavigationAction *naction = CAJA_NAVIGATION_ACTION (action); GtkMenuToolButton *button = GTK_MENU_TOOL_BUTTON (proxy); GtkWidget *menu; GtkWidget *child; /* set an empty menu, so the arrow button becomes sensitive */ menu = gtk_menu_new (); gtk_menu_tool_button_set_menu (button, menu); gtk_menu_tool_button_set_arrow_tooltip_text (button, naction->priv->arrow_tooltip); g_signal_connect (proxy, "show-menu", G_CALLBACK (show_menu_callback), action); /* Make sure that middle click works. Note that there is some code duplication * between here and caja-window-menus.c */ child = eel_gtk_menu_tool_button_get_button (button); g_signal_connect (child, "button-press-event", G_CALLBACK (proxy_button_press_event_cb), NULL); g_signal_connect (child, "button-release-event", G_CALLBACK (proxy_button_release_event_cb), NULL); } (* GTK_ACTION_CLASS (parent_class)->connect_proxy) (action, proxy); }
static void disconnect_proxy (GtkAction *action, GtkWidget *proxy) { if (GTK_IS_MENU_TOOL_BUTTON (proxy)) { GtkWidget *child; g_signal_handlers_disconnect_by_func (proxy, G_CALLBACK (show_menu_callback), action); child = eel_gtk_menu_tool_button_get_button (GTK_MENU_TOOL_BUTTON (proxy)); g_signal_handlers_disconnect_by_func (child, G_CALLBACK (proxy_button_press_event_cb), NULL); g_signal_handlers_disconnect_by_func (child, G_CALLBACK (proxy_button_release_event_cb), NULL); } (* GTK_ACTION_CLASS (parent_class)->disconnect_proxy) (action, proxy); }