Re: GtkStatusIcon and popup menu



On Sun, 2006-11-05 at 18:31 +0100, Chris tophe wrote:


click somewhere out of it. I tried around, this problem doesn't happen when
calling gtk_menu_popup in response to a widget's "button-press-event"/button
== 3 for example, only in "popup-menu" callback. Any idea to make this menu
go away normally? Thanks.


The program I wrote earlier this year just uses the "button-press-event"
signal.  In the handler I create a menu and connect a deactivation
function to its "deactive" signal.

Seems to work fine.

-Peter


static void deactivatemenu(GtkMenuShell *menushell, gpointer user_data)
{
        GtkWidget       *attach_widget;

        (void) user_data;

        gtk_menu_popdown(GTK_MENU(menushell));
        attach_widget = gtk_menu_get_attach_widget(GTK_MENU(menushell));
        if (attach_widget)
                gtk_widget_set_state(attach_widget, GTK_STATE_NORMAL);
}



static gboolean tray_icon_button_press(EggTrayIcon    *tray_icon,
                                       GdkEventButton *event,
                                       gpointer        user_data)
{
        (void) user_data;

        /* single click with the left mouse button */
        if (event->type == GDK_BUTTON_PRESS && event->button == 1) {
                GtkMenu *menu;

                menu = make_left_click_menu(GTK_WIDGET(tray_icon));

                g_signal_connect(menu, "deactivate",
                                 G_CALLBACK(deactivatemenu),
                                 NULL);
                gtk_menu_popup(menu,
                               NULL,
                               NULL,
                               calc_menu_position,
                               NULL,
                               event->button,
                               gdk_event_get_time((GdkEvent *) event));
                gtk_widget_set_state(gtk_menu_get_attach_widget(menu), GTK_STATE_SELECTED);

                return TRUE; /* we handled the click */
        }

        /* single click with the right mouse button */
        if (event->type == GDK_BUTTON_PRESS && event->button == 3) {
                GtkMenu *menu;

                menu = make_right_click_menu(GTK_WIDGET(tray_icon));

                g_signal_connect(menu, "deactivate",
                                 G_CALLBACK(deactivatemenu),
                                 NULL);
                gtk_menu_popup(menu,
                               NULL,
                               NULL,
                               calc_menu_position,
                               NULL,
                               event->button,
                               gdk_event_get_time((GdkEvent *) event));
                gtk_widget_set_state(gtk_menu_get_attach_widget(menu), GTK_STATE_SELECTED);

                return TRUE; /* we handled the click */
        }

        return FALSE; /* we did not handle the click (or whatever it was) */
}


and the initialization code:


        ...
        tray_icon = egg_tray_icon_new("bÃlg");

        event_box = gtk_event_box_new();
        gtk_container_add(GTK_CONTAINER(tray_icon), event_box);

        w = gtk_label_new("BÃlg");
        gtk_container_add(GTK_CONTAINER(event_box), w);
        gtk_widget_show_all(GTK_WIDGET(tray_icon));

        g_signal_connect(event_box, "button-press-event",
                         G_CALLBACK(tray_icon_button_press),
                         NULL);
        ...




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]