Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > 7edaa027c70230f8a6e16ff4bb704e06 > files > 8

scim-1.4.9-6.fc13.src.rpm

diff -up scim-1.4.7/extras/panel/scim_panel_gtk.cpp.menu-pos scim-1.4.7/extras/panel/scim_panel_gtk.cpp
--- scim-1.4.7/extras/panel/scim_panel_gtk.cpp.menu-pos	2008-07-17 16:02:08.000000000 +0800
+++ scim-1.4.7/extras/panel/scim_panel_gtk.cpp	2008-07-17 16:50:32.000000000 +0800
@@ -409,6 +409,8 @@ static PangoFontDescription *_default_fo
 static GtkStatusIcon     *_tray_icon                   = 0;
 // static GtkWidget         *_tray_icon_factory_button    = 0;
 // static gulong             _tray_icon_destroy_signal_id = 0;
+static bool              _tray_icon_clicked            = false;
+static guint             _tray_icon_clicked_time       = 0;
 #endif
 
 static gboolean           _input_window_draging        = FALSE;
@@ -1699,12 +1701,16 @@ static void
 ui_tray_icon_popup_menu_cb (GtkStatusIcon *status_icon, guint button, 
     guint activate_time, gpointer user_data)
 {
+    _tray_icon_clicked = true;
+    _tray_icon_clicked_time = activate_time;
     action_show_command_menu ();
 }
 
 static void
 ui_tray_icon_activate_cb (GtkStatusIcon *status_icon, gpointer user_data)
 {
+    _tray_icon_clicked = true;
+    _tray_icon_clicked_time = gtk_get_current_event_time ();
     _panel_agent->request_factory_menu ();
 }
 
@@ -2459,8 +2465,12 @@ action_show_command_menu (void)
                       G_CALLBACK (ui_command_menu_exit_activate_cb),
                       0);
     gtk_widget_show_all (menu_item);
-
-    gtk_menu_popup (GTK_MENU (_command_menu), 0, 0, 0, 0, 2, activate_time);
+    if (_tray_icon_clicked && _tray_icon) {
+        gtk_menu_popup (GTK_MENU (_command_menu), 0, 0, gtk_status_icon_position_menu, _tray_icon, 2, _tray_icon_clicked_time);
+    }
+    else
+        gtk_menu_popup (GTK_MENU (_command_menu), 0, 0, 0, 0, 2, activate_time);
+    _tray_icon_clicked = false;
 }
 
 //////////////////////////////////////////////////////////////////////
@@ -2752,7 +2762,6 @@ slot_show_factory_menu (const std::vecto
         MapStringVectorSizeT groups;
         std::map<String,size_t> langs, recents;
 
-        guint32 activate_time = gtk_get_current_event_time ();
 
         _factory_menu_uuids.clear ();
         _factory_menu_activated = true;
@@ -2847,7 +2856,17 @@ slot_show_factory_menu (const std::vecto
         g_signal_connect (G_OBJECT (_factory_menu), "deactivate",
                           G_CALLBACK (ui_factory_menu_deactivate_cb),
                           NULL);
-        gtk_menu_popup (GTK_MENU (_factory_menu), 0, 0, 0, 0, 1, activate_time);
+        
+        if (_tray_icon_clicked && _tray_icon) {
+            while (gtk_main_iteration_do (FALSE));
+            gtk_menu_popup (GTK_MENU (_factory_menu), 0, 0, gtk_status_icon_position_menu, _tray_icon, 1, _tray_icon_clicked_time);
+        }
+        else {
+            gtk_menu_popup (GTK_MENU (_factory_menu), 0, 0, 0, 0, 1, gtk_get_current_event_time ());
+        }
+
+        _tray_icon_clicked = false;
+        
     }
 }