diff -up scim-1.4.7/extras/panel/scim_panel_gtk.cpp.trayicon scim-1.4.7/extras/panel/scim_panel_gtk.cpp --- scim-1.4.7/extras/panel/scim_panel_gtk.cpp.trayicon 2008-07-17 10:57:23.000000000 +0800 +++ scim-1.4.7/extras/panel/scim_panel_gtk.cpp 2008-07-17 13:57:55.000000000 +0800 @@ -60,7 +60,7 @@ #include "scimstringview.h" #if ENABLE_TRAY_ICON - #include "scimtrayicon.h" +// #include "scimtrayicon.h" #endif using namespace scim; @@ -276,6 +276,13 @@ static void ui_command_menu_deacti #if ENABLE_TRAY_ICON static void ui_tray_icon_destroy_cb (GtkObject *object, gpointer user_data); +static void ui_tray_icon_popup_menu_cb (GtkStatusIcon *status_icon, + guint button, + guint activate_time, + gpointer user_data); + +static void ui_tray_icon_activate_cb (GtkStatusIcon *status_icon, + gpointer user_data); #endif // Client Property Callback @@ -399,9 +406,9 @@ static GtkTooltips *_tooltips static PangoFontDescription *_default_font_desc = 0; #if ENABLE_TRAY_ICON -static ScimTrayIcon *_tray_icon = 0; -static GtkWidget *_tray_icon_factory_button = 0; -static gulong _tray_icon_destroy_signal_id = 0; +static GtkStatusIcon *_tray_icon = 0; +// static GtkWidget *_tray_icon_factory_button = 0; +// static gulong _tray_icon_destroy_signal_id = 0; #endif static gboolean _input_window_draging = FALSE; @@ -648,9 +655,9 @@ ui_initialize (void) #if ENABLE_TRAY_ICON if (_tray_icon) { - g_signal_handler_disconnect (G_OBJECT (_tray_icon), - _tray_icon_destroy_signal_id); - gtk_widget_destroy (GTK_WIDGET (_tray_icon)); + // g_signal_handler_disconnect (G_OBJECT (_tray_icon), + // _tray_icon_destroy_signal_id); + g_object_unref (_tray_icon); } _tray_icon = 0; #endif @@ -1305,9 +1312,9 @@ ui_switch_screen (GdkScreen *screen) } #if ENABLE_TRAY_ICON - if (_tray_icon) { - gtk_window_set_screen (GTK_WINDOW (_tray_icon), screen); - } + // if (_tray_icon) { + // gtk_window_set_screen (GTK_WINDOW (_tray_icon), screen); + // } #endif if (_help_dialog) { @@ -1330,65 +1337,75 @@ ui_switch_screen (GdkScreen *screen) #endif #if ENABLE_TRAY_ICON -static gboolean -ui_tray_icon_expose_event_cb (GtkWidget *widget, GdkEventExpose *event) -{ - gdk_window_clear_area (widget->window, event->area.x, event->area.y, - event->area.width, event->area.height); - return FALSE; -} - -static void -ui_tray_icon_style_set_cb (GtkWidget *widget, GtkStyle *previous_style) -{ - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); -} - -static void -ui_tray_icon_realize_cb (GtkWidget *widget) -{ - if (GTK_WIDGET_NO_WINDOW (widget) || GTK_WIDGET_APP_PAINTABLE (widget)) - return; - - gtk_widget_set_app_paintable (widget, TRUE); - gtk_widget_set_double_buffered (widget, FALSE); - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); - g_signal_connect (widget, "expose_event", - G_CALLBACK (ui_tray_icon_expose_event_cb), NULL); - g_signal_connect_after (widget, "style_set", - G_CALLBACK (ui_tray_icon_style_set_cb), NULL); -} +// static gboolean +// ui_tray_icon_expose_event_cb (GtkWidget *widget, GdkEventExpose *event) +// { +// gdk_window_clear_area (widget->window, event->area.x, event->area.y, +// event->area.width, event->area.height); +// return FALSE; +// } +// +// static void +// ui_tray_icon_style_set_cb (GtkWidget *widget, GtkStyle *previous_style) +// { +// gdk_window_set_back_pixmap (widget->window, NULL, TRUE); +// } +// +// static void +// ui_tray_icon_realize_cb (GtkWidget *widget) +// { +// if (GTK_WIDGET_NO_WINDOW (widget) || GTK_WIDGET_APP_PAINTABLE (widget)) +// return; +// +// gtk_widget_set_app_paintable (widget, TRUE); +// gtk_widget_set_double_buffered (widget, FALSE); +// gdk_window_set_back_pixmap (widget->window, NULL, TRUE); +// g_signal_connect (widget, "expose_event", +// G_CALLBACK (ui_tray_icon_expose_event_cb), NULL); +// g_signal_connect_after (widget, "style_set", +// G_CALLBACK (ui_tray_icon_style_set_cb), NULL); +// } static gboolean ui_create_tray_icon_when_idle (gpointer data) { GtkWidget *image; - _tray_icon = scim_tray_icon_new ("SCIM Tray Icon"); - g_signal_connect (G_OBJECT (_tray_icon), "realize", - G_CALLBACK (ui_tray_icon_realize_cb), NULL); - - _tray_icon_destroy_signal_id = - g_signal_connect (G_OBJECT (_tray_icon), "destroy", - G_CALLBACK (ui_tray_icon_destroy_cb), - 0); + _tray_icon = gtk_status_icon_new_from_file (SCIM_KEYBOARD_ICON_FILE); + // g_signal_connect (G_OBJECT (_tray_icon), "realize", + // G_CALLBACK (ui_tray_icon_realize_cb), NULL); + + // _tray_icon_destroy_signal_id = + // g_signal_connect (G_OBJECT (_tray_icon), "destroy", + // G_CALLBACK (ui_tray_icon_destroy_cb), + // 0); + + // image = ui_create_icon (SCIM_KEYBOARD_ICON_FILE, + // NULL, + // TRAY_ICON_SIZE, + // TRAY_ICON_SIZE, + // true); + + // _tray_icon_factory_button = gtk_event_box_new (); + // g_signal_connect (G_OBJECT (_tray_icon_factory_button), "realize", + // G_CALLBACK (ui_tray_icon_realize_cb), NULL); + // gtk_container_add (GTK_CONTAINER (_tray_icon_factory_button), image); + // gtk_container_add (GTK_CONTAINER (_tray_icon), _tray_icon_factory_button); - image = ui_create_icon (SCIM_KEYBOARD_ICON_FILE, - NULL, - TRAY_ICON_SIZE, - TRAY_ICON_SIZE, - true); - - _tray_icon_factory_button = gtk_event_box_new (); - g_signal_connect (G_OBJECT (_tray_icon_factory_button), "realize", - G_CALLBACK (ui_tray_icon_realize_cb), NULL); - gtk_container_add (GTK_CONTAINER (_tray_icon_factory_button), image); - gtk_container_add (GTK_CONTAINER (_tray_icon), _tray_icon_factory_button); - g_signal_connect (G_OBJECT (_tray_icon_factory_button), "button-release-event", - G_CALLBACK (ui_factory_button_click_cb), + + // g_signal_connect (G_OBJECT (_tray_icon_factory_button), "button-release-event", + // G_CALLBACK (ui_factory_button_click_cb), + // 0); + + g_signal_connect (G_OBJECT (_tray_icon), "popup-menu", + G_CALLBACK (ui_tray_icon_popup_menu_cb), + 0); + + g_signal_connect (G_OBJECT (_tray_icon), "activate", + G_CALLBACK (ui_tray_icon_activate_cb), 0); - gtk_widget_show_all (GTK_WIDGET (_tray_icon)); + gtk_status_icon_set_visible (_tray_icon, TRUE); return FALSE; } @@ -1679,6 +1696,19 @@ ui_factory_button_click_cb (GtkWidget *b } static void +ui_tray_icon_popup_menu_cb (GtkStatusIcon *status_icon, guint button, + guint activate_time, gpointer user_data) +{ + action_show_command_menu (); +} + +static void +ui_tray_icon_activate_cb (GtkStatusIcon *status_icon, gpointer user_data) +{ + _panel_agent->request_factory_menu (); +} + +static void ui_factory_menu_activate_cb (GtkMenuItem *item, gpointer user_data) { @@ -2236,19 +2266,19 @@ ui_command_menu_deactivate_cb (GtkWidget } #if ENABLE_TRAY_ICON -static void -ui_tray_icon_destroy_cb (GtkObject *object, - gpointer user_data) -{ - SCIM_DEBUG_MAIN (1) << "Tray Icon destroyed!\n"; - - gtk_widget_destroy (GTK_WIDGET (object)); - - _tray_icon = 0; - _tray_icon_factory_button = 0; - - g_idle_add (ui_create_tray_icon_when_idle, NULL); -} +// static void +// ui_tray_icon_destroy_cb (GtkObject *object, +// gpointer user_data) +// { +// SCIM_DEBUG_MAIN (1) << "Tray Icon destroyed!\n"; +// +// gtk_widget_destroy (GTK_WIDGET (object)); +// +// _tray_icon = 0; +// _tray_icon_factory_button = 0; +// +// g_idle_add (ui_create_tray_icon_when_idle, NULL); +// } #endif static void @@ -2681,18 +2711,21 @@ slot_update_factory_info (const PanelFac } #if ENABLE_TRAY_ICON - if (_tray_icon_factory_button) { - GtkWidget *icon = gtk_bin_get_child (GTK_BIN (_tray_icon_factory_button)); + // if (_tray_icon_factory_button) { + // GtkWidget *icon = gtk_bin_get_child (GTK_BIN (_tray_icon_factory_button)); - if (icon) - gtk_container_remove (GTK_CONTAINER (_tray_icon_factory_button), icon); + // if (icon) + // gtk_container_remove (GTK_CONTAINER (_tray_icon_factory_button), icon); - icon = ui_create_icon (info.icon, NULL, TRAY_ICON_SIZE, TRAY_ICON_SIZE, true); + // icon = ui_create_icon (info.icon, NULL, TRAY_ICON_SIZE, TRAY_ICON_SIZE, true); - gtk_container_add (GTK_CONTAINER (_tray_icon_factory_button), icon); + // gtk_container_add (GTK_CONTAINER (_tray_icon_factory_button), icon); - if (_tooltips) - gtk_tooltips_set_tip (_tooltips, _tray_icon_factory_button, info.name.c_str (), NULL); + // if (_tooltips) + // gtk_tooltips_set_tip (_tooltips, _tray_icon_factory_button, info.name.c_str (), NULL); + // } + if (_tray_icon) { + gtk_status_icon_set_from_file (_tray_icon, info.icon.c_str()); } #endif