diff options
author | RichardHitt <rbh00@netcom.com> | 2012-11-20 18:29:10 -0800 |
---|---|---|
committer | RichardHitt <rbh00@netcom.com> | 2012-11-20 18:29:10 -0800 |
commit | 2eba723ee78ef16d55f4818952260f50466c24f0 (patch) | |
tree | b0062adbda6fee6e2a8169f7f29ee9be6de5c470 | |
parent | 6437df757661acf6ff451bb8db59cd938c1d4dc5 (diff) | |
parent | a1c8fd998cca80423b0a365e3dff134b21fa2cb8 (diff) |
Merge pull request #286 from TingPing/tray2
Workarounds for plugin-tray menu on Windows
-rw-r--r-- | src/fe-gtk/plugin-tray.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/src/fe-gtk/plugin-tray.c b/src/fe-gtk/plugin-tray.c index 136e9b8e..5c0d02ce 100644 --- a/src/fe-gtk/plugin-tray.c +++ b/src/fe-gtk/plugin-tray.c @@ -60,6 +60,10 @@ typedef GdkPixbuf* TrayIcon; static GtkStatusIcon *sticon; static gint flash_tag; static TrayStatus tray_status; +#ifdef WIN32 +static guint tray_menu_timer; +static gint64 tray_menu_inactivetime; +#endif static hexchat_plugin *ph; static TrayIcon custom_icon1; @@ -494,12 +498,38 @@ tray_menu_destroy (GtkWidget *menu, gpointer userdata) { gtk_widget_destroy (menu); g_object_unref (menu); +#ifdef WIN32 + g_source_remove (tray_menu_timer); +#endif +} + +#ifdef WIN32 +static void +tray_menu_enter_cb (GtkWidget *menu) +{ + tray_menu_inactivetime = 0; +} + +static void +tray_menu_left_cb (GtkWidget *menu) +{ + tray_menu_inactivetime = g_get_real_time (); } static void +tray_check_hide (GtkWidget *menu) +{ + if (tray_menu_inactivetime && g_get_real_time () - tray_menu_inactivetime >= 2000000) + { + tray_menu_destroy (menu, NULL); + } +} +#endif + +static void tray_menu_cb (GtkWidget *widget, guint button, guint time, gpointer userdata) { - GtkWidget *menu; + static GtkWidget *menu; #ifndef WIN32 GtkWidget *submenu; GtkWidget *item; @@ -509,6 +539,12 @@ tray_menu_cb (GtkWidget *widget, guint button, guint time, gpointer userdata) /* ph may have an invalid context now */ hexchat_set_context (ph, hexchat_find_context (ph, NULL, NULL)); + /* close any old menu */ + if (G_IS_OBJECT (menu)) + { + tray_menu_destroy (menu, NULL); + } + menu = gtk_menu_new (); /*gtk_menu_set_screen (GTK_MENU (menu), gtk_widget_get_screen (widget));*/ @@ -546,6 +582,14 @@ tray_menu_cb (GtkWidget *widget, guint button, guint time, gpointer userdata) g_object_unref (menu); g_signal_connect (G_OBJECT (menu), "selection-done", G_CALLBACK (tray_menu_destroy), NULL); +#ifdef WIN32 + g_signal_connect (G_OBJECT (menu), "leave-notify-event", + G_CALLBACK (tray_menu_left_cb), NULL); + g_signal_connect (G_OBJECT (menu), "enter-notify-event", + G_CALLBACK (tray_menu_enter_cb), NULL); + + tray_menu_timer = g_timeout_add(500, (GSourceFunc) tray_check_hide, menu); +#endif gtk_menu_popup (GTK_MENU (menu), NULL, NULL, gtk_status_icon_position_menu, userdata, button, time); |