summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorRichardHitt <rbh00@netcom.com>2012-11-20 18:29:10 -0800
committerRichardHitt <rbh00@netcom.com>2012-11-20 18:29:10 -0800
commit2eba723ee78ef16d55f4818952260f50466c24f0 (patch)
treeb0062adbda6fee6e2a8169f7f29ee9be6de5c470
parent6437df757661acf6ff451bb8db59cd938c1d4dc5 (diff)
parenta1c8fd998cca80423b0a365e3dff134b21fa2cb8 (diff)
Merge pull request #286 from TingPing/tray2
Workarounds for plugin-tray menu on Windows
-rw-r--r--src/fe-gtk/plugin-tray.c46
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);