Re: GtkStatusIcon and popup menu
- From: Peter Lund <firefly vax64 dk>
- To: Chris tophe <cohika gmail com>
- Cc: gtk-app-devel-list gnome org
- Subject: Re: GtkStatusIcon and popup menu
- Date: Tue, 07 Nov 2006 00:08:42 +0100
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]