gboolean tray_appindicator_create(gpointer data) { if (is_exist_tray_appindicator()) return FALSE; if (tray_appindicator) { if (app_indicator_get_status (tray_appindicator) != APP_INDICATOR_STATUS_ACTIVE) { app_indicator_set_status (tray_appindicator, APP_INDICATOR_STATUS_ACTIVE); destroy_other_tray(); } } else { destroy_other_tray(); if (!tray_appindicator_load_icon(HIME_TRAY_PNG, HIME_TRAY_PNG, iconame, icondir)) return FALSE; tray_appindicator = app_indicator_new_with_path ("hime", iconame, APP_INDICATOR_CATEGORY_APPLICATION_STATUS, icondir); if(tray_appindicator == NULL) return TRUE; app_indicator_set_status (tray_appindicator, APP_INDICATOR_STATUS_ACTIVE); GtkWidget *menu = NULL; menu = create_tray_menu(mitems); app_indicator_set_secondary_activate_target(tray_appindicator, mitems[0].item); app_indicator_set_menu (tray_appindicator, GTK_MENU (menu)); } load_tray_appindicator(); return FALSE; }
gboolean create_tray(gpointer data) { if (tray_icon) return FALSE; destroy_other_tray(); tray_icon = gtk_status_icon_new(); g_signal_connect (G_OBJECT (tray_icon), "button-press-event", G_CALLBACK (tray_button_press_event_cb), NULL); g_signal_connect (G_OBJECT (tray_icon), "size-changed", G_CALLBACK (tray_size_changed_cb), NULL); g_signal_connect (G_OBJECT (tray_icon), "notify::embedded", G_CALLBACK (tray_embedded_cb), NULL); #if GTK_CHECK_VERSION(2,12,0) gtk_status_icon_set_tooltip_text (tray_icon, _("左:中英切換 中:小鍵盤 右:選項")); #else GtkTooltips *tips = gtk_tooltips_new (); gtk_status_icon_set_tooltip (GTK_TOOLTIPS (tips), tray_icon, _("左:中英切換 中:小鍵盤 右:選項"), NULL); #endif // Initiate Pango for drawing texts from default setting GtkWidget *wi = gtk_label_new (NULL); // for reference PangoContext *context = gtk_widget_get_pango_context(wi); PangoFontDescription* desc = pango_font_description_copy(pango_context_get_font_description(context)); // Copy one from wi for pango pango_font_description_set_size(desc, 9 * PANGO_SCALE); pango = gtk_widget_create_pango_layout(wi, NULL); pango_layout_set_font_description(pango, desc); gdk_color_parse("red", &red_color_fg); gdk_color_parse("blue", &blue_color_fg); gtk_widget_destroy(wi); load_tray_icon(); return FALSE; }
void load_tray_icon_double() { if (!hime_status_tray) return; if (hime_tray_display != HIME_TRAY_DISPLAY_DOUBLE) return; #if WIN32 // when login, creating icon too early may cause block in gtk_status_icon_new_from_file if (win32_tray_disabled) return; #endif destroy_other_tray(); // dbg("load_tray_icon_win32\n"); #if UNIX char *tip; tip=""; #else wchar_t *tip; tip=L""; #endif char *iconame; if (!current_CS || current_CS->im_state == HIME_STATE_DISABLED||current_CS->im_state == HIME_STATE_ENG_FULL) { iconame=HIME_TRAY_PNG; } else { iconame=inmd[current_CS->in_method].icon; } // dbg("tsin_pho_mode() %d\n", tsin_pho_mode()); char tt[32]; if (current_CS && current_CS->im_state == HIME_STATE_CHINESE && !tsin_pho_mode()) { if ((current_method_type()==method_type_TSIN || current_method_type()==method_type_MODULE)) { strcpy(tt, "en-"); strcat(tt, iconame); } else { strcpy(tt, "en-tsin.png"); } iconame = tt; } // dbg("iconame %s\n", iconame); char fname[128]; fname[0]=0; if (iconame) get_icon_path(iconame, fname); char *icon_st=NULL; char fname_state[128]; // dbg("%d %d\n",current_CS->im_state,current_CS->b_half_full_char); if (current_CS && (current_CS->im_state == HIME_STATE_ENG_FULL || (current_CS->im_state != HIME_STATE_DISABLED && current_CS->b_half_full_char) || (current_method_type()==method_type_TSIN && tss.tsin_half_full))) { if (gb_output) { icon_st="full-simp.png"; tip = _("全形/簡體輸出"); } else { icon_st="full-trad.png"; tip = _("全形/正體輸出"); } } else { if (gb_output) { icon_st="half-simp.png"; tip= _("半形/簡體輸出"); } else { icon_st="half-trad.png"; tip = _("半形/正體輸出"); } } get_icon_path(icon_st, fname_state); // dbg("wwwwwwww %s\n", fname_state); if (icon_main) { // dbg("set %s %s\n", fname, fname_state); gtk_status_icon_set_from_file(icon_main, fname); gtk_status_icon_set_from_file(icon_state, fname_state); } else { // dbg("gtk_status_icon_new_from_file a\n"); icon_main = gtk_status_icon_new_from_file(fname); g_signal_connect(G_OBJECT(icon_main),"activate", G_CALLBACK (cb_activate), NULL); g_signal_connect(G_OBJECT(icon_main),"popup-menu", G_CALLBACK (cb_popup), NULL); // dbg("gtk_status_icon_new_from_file %s b\n", fname_state); icon_state = gtk_status_icon_new_from_file(fname_state); g_signal_connect(G_OBJECT(icon_state),"activate", G_CALLBACK (cb_activate_state), NULL); g_signal_connect(G_OBJECT(icon_state),"popup-menu", G_CALLBACK (cb_popup_state), NULL); // dbg("icon %s %s\n", fname, fname_state); } #if GTK_CHECK_VERSION(2,16,0) if (icon_state) gtk_status_icon_set_tooltip_text(icon_state, _(tip)); #endif if (icon_main) { char tt[64]; if (current_CS && inmd[current_CS->in_method].cname[0]) strcpy(tt, inmd[current_CS->in_method].cname); if (!iconame || !strcmp(iconame, HIME_TRAY_PNG) || !tsin_pho_mode()) strcpy(tt, "English"); #if GTK_CHECK_VERSION(2,16,0) gtk_status_icon_set_tooltip_text(icon_main, tt); #endif } return; }
gboolean create_tray(gpointer data) { if (da) return FALSE; destroy_other_tray(); egg_tray_icon = egg_tray_icon_new ("hime"); if (!egg_tray_icon) return FALSE; GtkWidget *event_box = gtk_event_box_new (); // Do not use this, otherwise tray menu fails // gtk_event_box_set_visible_window (event_box, FALSE); gtk_container_add (GTK_CONTAINER (egg_tray_icon), event_box); #if GTK_CHECK_VERSION(2,12,0) gtk_widget_set_tooltip_text (event_box, _("左:中英切換 中:小鍵盤 右:選項")); #else GtkTooltips *tips = gtk_tooltips_new (); gtk_tooltips_set_tip (GTK_TOOLTIPS (tips), event_box, _("左:中英切換 中:小鍵盤 右:選項"), NULL); #endif g_signal_connect (G_OBJECT (event_box), "button-press-event", G_CALLBACK (tray_button_press_event_cb), NULL); GError *err = NULL; if (pixbuf) g_object_unref(pixbuf); char icon_fname[128]; get_icon_path(HIME_TRAY_PNG, icon_fname); pixbuf = gdk_pixbuf_new_from_file(icon_fname, &err); int pwidth = gdk_pixbuf_get_width (pixbuf); int pheight = gdk_pixbuf_get_height (pixbuf); da = gtk_drawing_area_new(); g_signal_connect (G_OBJECT (event_box), "destroy", G_CALLBACK (gtk_widget_destroyed), &da); #if !GTK_CHECK_VERSION(2,91,0) g_signal_connect(G_OBJECT(da), "expose-event", G_CALLBACK(cb_expose), NULL); #else g_signal_connect(G_OBJECT(da), "draw", G_CALLBACK(cb_expose), NULL); #endif gtk_container_add (GTK_CONTAINER (event_box), da); gtk_widget_set_size_request(GTK_WIDGET(egg_tray_icon), pwidth, pheight); gtk_widget_show_all (GTK_WIDGET (egg_tray_icon)); tray_da_win = gtk_widget_get_window(da); // tray window is not ready ?? if (!tray_da_win || !GTK_WIDGET_DRAWABLE(da)) { gtk_widget_destroy(GTK_WIDGET(egg_tray_icon)); da = NULL; return FALSE; } PangoContext *context=gtk_widget_get_pango_context(da); PangoFontDescription* desc=pango_context_get_font_description(context); // dbg("zz %s %d\n", pango_font_description_to_string(desc), PANGO_SCALE); pango = gtk_widget_create_pango_layout(da, NULL); pango_layout_set_font_description(pango, desc); #if 1 // strange bug, why do we need this ? desc = (PangoFontDescription *)pango_layout_get_font_description(pango); #endif pango_font_description_set_size(desc, 9 * PANGO_SCALE); #if 0 dbg("aa %s\n", pango_font_description_to_string(desc)); dbg("context %x %x\n", pango_layout_get_context(pango), context); dbg("font %x %x\n",pango_layout_get_font_description(pango), desc); #endif #if !GTK_CHECK_VERSION(2,90,6) gc = gdk_gc_new (tray_da_win); #endif return FALSE; }