comparison pidgin/gtkconv.c @ 25515:37af7de81430

propagate from branch 'im.pidgin.pidgin' (head 4aabd11d86454556c0ed6e7c67640fa2a2ea5d6b) to branch 'im.pidgin.pidgin.yaz' (head 8376a42bcad5e1ffeaa542cec3a258adb1b83c1a)
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Wed, 20 Jun 2007 04:56:08 +0000
parents a8c701d877aa 90d558470507
children 708198aadad8
comparison
equal deleted inserted replaced
18204:4cc042912ac2 25515:37af7de81430
134 #define MIN_COLOR_CONTRAST 200 134 #define MIN_COLOR_CONTRAST 200
135 135
136 #define NUM_NICK_COLORS 220 136 #define NUM_NICK_COLORS 220
137 static GdkColor *nick_colors = NULL; 137 static GdkColor *nick_colors = NULL;
138 static guint nbr_nick_colors; 138 static guint nbr_nick_colors;
139
140 /* yaz. If you want to use shortcut keys that may conflict with
141 inputmethods, change this to 1. */
142 #define ENABLE_SHORTCUT 0
139 143
140 typedef struct { 144 typedef struct {
141 GtkWidget *window; 145 GtkWidget *window;
142 146
143 GtkWidget *entry; 147 GtkWidget *entry;
2782 { N_("/Conversation/New Instant _Message..."), "<CTL>M", menu_new_conv_cb, 2786 { N_("/Conversation/New Instant _Message..."), "<CTL>M", menu_new_conv_cb,
2783 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW }, 2787 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW },
2784 2788
2785 { "/Conversation/sep0", NULL, NULL, 0, "<Separator>", NULL }, 2789 { "/Conversation/sep0", NULL, NULL, 0, "<Separator>", NULL },
2786 2790
2791 #if ENABLE_SHORTCUT
2787 { N_("/Conversation/_Find..."), NULL, menu_find_cb, 0, 2792 { N_("/Conversation/_Find..."), NULL, menu_find_cb, 0,
2788 "<StockItem>", GTK_STOCK_FIND }, 2793 "<StockItem>", GTK_STOCK_FIND },
2794 #else
2795 { N_("/Conversation/_Find..."), NULL, menu_find_cb, 0,
2796 "<Item>" },
2797 #endif
2789 { N_("/Conversation/View _Log"), NULL, menu_view_log_cb, 0, "<Item>", NULL }, 2798 { N_("/Conversation/View _Log"), NULL, menu_view_log_cb, 0, "<Item>", NULL },
2790 { N_("/Conversation/_Save As..."), NULL, menu_save_as_cb, 0, 2799 { N_("/Conversation/_Save As..."), NULL, menu_save_as_cb, 0,
2791 "<StockItem>", GTK_STOCK_SAVE_AS }, 2800 "<StockItem>", GTK_STOCK_SAVE_AS },
2801 #if ENABLE_SHORTCUT
2792 { N_("/Conversation/Clea_r Scrollback"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR }, 2802 { N_("/Conversation/Clea_r Scrollback"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR },
2793 2803 #else
2804 { N_("/Conversation/Clea_r Scrollback"), NULL, menu_clear_cb, 0, "<Item>" },
2805 #endif
2794 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL }, 2806 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL },
2795 2807
2796 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE }, 2808 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE },
2797 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb, 2809 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb,
2798 0, "<Item>", NULL }, 2810 0, "<Item>", NULL },
2811 #if ENABLE_SHORTCUT
2799 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0, 2812 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0,
2800 "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO }, 2813 "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO },
2814 #else
2815 { N_("/Conversation/_Get Info"), NULL, menu_get_info_cb, 0,
2816 "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO },
2817 #endif
2801 { N_("/Conversation/In_vite..."), NULL, menu_invite_cb, 0, 2818 { N_("/Conversation/In_vite..."), NULL, menu_invite_cb, 0,
2802 "<Item>", NULL }, 2819 "<Item>", NULL },
2803 { N_("/Conversation/M_ore"), NULL, NULL, 0, "<Branch>", NULL }, 2820 { N_("/Conversation/M_ore"), NULL, NULL, 0, "<Branch>", NULL },
2804 2821
2805 { "/Conversation/sep2", NULL, NULL, 0, "<Separator>", NULL }, 2822 { "/Conversation/sep2", NULL, NULL, 0, "<Separator>", NULL },
3483 3500
3484 if (win->menu.send_to != NULL) 3501 if (win->menu.send_to != NULL)
3485 gtk_widget_destroy(win->menu.send_to); 3502 gtk_widget_destroy(win->menu.send_to);
3486 3503
3487 /* Build the Send To menu */ 3504 /* Build the Send To menu */
3505
3506 #if ENABLE_SHORTCUT
3488 win->menu.send_to = gtk_menu_item_new_with_mnemonic(_("_Send To")); 3507 win->menu.send_to = gtk_menu_item_new_with_mnemonic(_("_Send To"));
3508 #else
3509 win->menu.send_to = gtk_menu_item_new_with_mnemonic(_("Send To")); //to free Alt-s. intentional. --yaz
3510 #endif
3489 gtk_widget_show(win->menu.send_to); 3511 gtk_widget_show(win->menu.send_to);
3490 3512
3491 menu = gtk_menu_new(); 3513 menu = gtk_menu_new();
3492 gtk_menu_shell_insert(GTK_MENU_SHELL(win->menu.menubar), 3514 gtk_menu_shell_insert(GTK_MENU_SHELL(win->menu.menubar),
3493 win->menu.send_to, 2); 3515 win->menu.send_to, 2);
3957 PurplePluginProtocolInfo *prpl_info = NULL; 3979 PurplePluginProtocolInfo *prpl_info = NULL;
3958 PurpleConnection *gc; 3980 PurpleConnection *gc;
3959 PurpleConversation *conv = gtkconv->active_conv; 3981 PurpleConversation *conv = gtkconv->active_conv;
3960 PidginChatPane *gtkchat; 3982 PidginChatPane *gtkchat;
3961 char *new_topic; 3983 char *new_topic;
3962 const char *current_topic; 3984 // const char *current_topic;
3985 char dummy[] = "No Topic";
3986 char *current_topic = NULL;
3963 3987
3964 gc = purple_conversation_get_gc(conv); 3988 gc = purple_conversation_get_gc(conv);
3965 3989
3966 if(!gc || !(prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl))) 3990 if(!gc || !(prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)))
3967 return; 3991 return;
3970 return; 3994 return;
3971 3995
3972 gtkconv = PIDGIN_CONVERSATION(conv); 3996 gtkconv = PIDGIN_CONVERSATION(conv);
3973 gtkchat = gtkconv->u.chat; 3997 gtkchat = gtkconv->u.chat;
3974 new_topic = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtkchat->topic_text))); 3998 new_topic = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtkchat->topic_text)));
3999 // purple_debug_info("yaz gtkconv", "new_topic=%s\n", new_topic);
3975 current_topic = purple_conv_chat_get_topic(PURPLE_CONV_CHAT(conv)); 4000 current_topic = purple_conv_chat_get_topic(PURPLE_CONV_CHAT(conv));
4001
4002 if(!current_topic)
4003 current_topic = dummy;
4004 // purple_debug_info("yaz gtkconv", "current_topic=%s\n", current_topic);
3976 4005
3977 if(current_topic && !g_utf8_collate(new_topic, current_topic)){ 4006 if(current_topic && !g_utf8_collate(new_topic, current_topic)){
3978 g_free(new_topic); 4007 g_free(new_topic);
3979 return; 4008 return;
3980 } 4009 }
6153 pidgin_themes_smiley_themeize(PIDGIN_CONVERSATION(conv)->imhtml); 6182 pidgin_themes_smiley_themeize(PIDGIN_CONVERSATION(conv)->imhtml);
6154 6183
6155 if ((fields & PIDGIN_CONV_COLORIZE_TITLE) || 6184 if ((fields & PIDGIN_CONV_COLORIZE_TITLE) ||
6156 (fields & PIDGIN_CONV_SET_TITLE)) 6185 (fields & PIDGIN_CONV_SET_TITLE))
6157 { 6186 {
6158 char *title; 6187 char *title, *title_tmp;
6159 PurpleConvIm *im = NULL; 6188 PurpleConvIm *im = NULL;
6160 PurpleAccount *account = purple_conversation_get_account(conv); 6189 PurpleAccount *account = purple_conversation_get_account(conv);
6161 PurpleBuddy *buddy; 6190 PurpleBuddy *buddy;
6162 char *markup; 6191 char *markup;
6163 AtkObject *accessibility_obj; 6192 AtkObject *accessibility_obj;
6193 gboolean ellipsis = FALSE;
6164 /* I think this is a little longer than it needs to be but I'm lazy. */ 6194 /* I think this is a little longer than it needs to be but I'm lazy. */
6165 char style[51]; 6195 char style[51];
6166 6196
6167 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) 6197 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)
6168 im = PURPLE_CONV_IM(conv); 6198 im = PURPLE_CONV_IM(conv);
6218 { 6248 {
6219 atk_object_set_description(accessibility_obj, _("New Event")); 6249 atk_object_set_description(accessibility_obj, _("New Event"));
6220 strncpy(style, "color=\"#888a85\" style=\"italic\"", sizeof(style)); 6250 strncpy(style, "color=\"#888a85\" style=\"italic\"", sizeof(style));
6221 } 6251 }
6222 6252
6253 // nosuke's tab width patch
6254 if ((purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_LEFT|8)
6255 || purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_RIGHT|8))
6256 && purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/trim_vertical_tabs"))
6257 ellipsis = TRUE;
6258
6259 if (ellipsis)
6260 title_tmp = pidgin_gtk_ellipsis_text(gtkconv->tab_label, title, 60, "...");
6261 else
6262 title_tmp = title;
6263
6264
6223 if (*style != '\0') 6265 if (*style != '\0')
6224 { 6266 {
6225 char *html_title,*label; 6267 char *html_title,*label;
6226 6268
6227 html_title = g_markup_escape_text(title, -1); 6269 html_title = g_markup_escape_text(title_tmp, -1);
6228 6270
6229 label = g_strdup_printf("<span %s>%s</span>", 6271 label = g_strdup_printf("<span %s>%s</span>",
6230 style, html_title); 6272 style, html_title);
6231 g_free(html_title); 6273 g_free(html_title);
6232 gtk_label_set_markup(GTK_LABEL(gtkconv->tab_label), label); 6274 gtk_label_set_markup(GTK_LABEL(gtkconv->tab_label), label);
6233 g_free(label); 6275 g_free(label);
6234 } 6276 }
6235 else 6277 else
6236 gtk_label_set_text(GTK_LABEL(gtkconv->tab_label), title); 6278 gtk_label_set_text(GTK_LABEL(gtkconv->tab_label), title_tmp);
6237 6279
6238 if (pidgin_conv_window_is_active_conversation(conv)) 6280 if (pidgin_conv_window_is_active_conversation(conv))
6239 update_typing_icon(gtkconv); 6281 update_typing_icon(gtkconv);
6240 6282
6241 gtk_label_set_text(GTK_LABEL(gtkconv->menu_label), title); 6283 gtk_label_set_text(GTK_LABEL(gtkconv->menu_label), title);
6567 } 6609 }
6568 6610
6569 return page_num; 6611 return page_num;
6570 } 6612 }
6571 6613
6614 //nosuke
6615 static void
6616 trim_vertical_tabs_pref_cb(const char *name, PurplePrefType type,
6617 gconstpointer value, gpointer data)
6618 {
6619 GList *l;
6620 PurpleConversation *conv;
6621
6622 for (l = purple_get_conversations(); l != NULL; l = l->next) {
6623 conv = (PurpleConversation *)l->data;
6624
6625 if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv))
6626 continue;
6627
6628 pidgin_conv_update_fields(conv, PIDGIN_CONV_SET_TITLE);
6629 }
6630 }
6631
6572 static void 6632 static void
6573 close_on_tabs_pref_cb(const char *name, PurplePrefType type, 6633 close_on_tabs_pref_cb(const char *name, PurplePrefType type,
6574 gconstpointer value, gpointer data) 6634 gconstpointer value, gpointer data)
6575 { 6635 {
6576 GList *l; 6636 GList *l;
6636 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(gtkwin->notebook), pos&~8); 6696 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(gtkwin->notebook), pos&~8);
6637 for (gtkconvs = gtkwin->gtkconvs; gtkconvs != NULL; gtkconvs = gtkconvs->next) { 6697 for (gtkconvs = gtkwin->gtkconvs; gtkconvs != NULL; gtkconvs = gtkconvs->next) {
6638 pidgin_conv_tab_pack(gtkwin, gtkconvs->data); 6698 pidgin_conv_tab_pack(gtkwin, gtkconvs->data);
6639 } 6699 }
6640 } 6700 }
6701 trim_vertical_tabs_pref_cb(name, type, value, data);
6641 } 6702 }
6642 6703
6643 static void 6704 static void
6644 show_timestamps_pref_cb(const char *name, PurplePrefType type, 6705 show_timestamps_pref_cb(const char *name, PurplePrefType type,
6645 gconstpointer value, gpointer data) 6706 gconstpointer value, gpointer data)
7005 7066
7006 /* Conversations */ 7067 /* Conversations */
7007 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/conversations"); 7068 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/conversations");
7008 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/use_smooth_scrolling", TRUE); 7069 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/use_smooth_scrolling", TRUE);
7009 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/close_on_tabs", TRUE); 7070 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/close_on_tabs", TRUE);
7071 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/trim_vertical_tabs", FALSE);
7010 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_bold", FALSE); 7072 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_bold", FALSE);
7011 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_italic", FALSE); 7073 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_italic", FALSE);
7012 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_underline", FALSE); 7074 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_underline", FALSE);
7013 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/spellcheck", TRUE); 7075 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/spellcheck", TRUE);
7014 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/show_incoming_formatting", TRUE); 7076 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/show_incoming_formatting", TRUE);
7048 purple_prefs_add_string(PIDGIN_PREFS_ROOT "/conversations/im/hide_new", "never"); 7110 purple_prefs_add_string(PIDGIN_PREFS_ROOT "/conversations/im/hide_new", "never");
7049 7111
7050 /* Connect callbacks. */ 7112 /* Connect callbacks. */
7051 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/close_on_tabs", 7113 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/close_on_tabs",
7052 close_on_tabs_pref_cb, NULL); 7114 close_on_tabs_pref_cb, NULL);
7115 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/trim_vertical_tabs",
7116 trim_vertical_tabs_pref_cb, NULL);
7053 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/show_timestamps", 7117 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/show_timestamps",
7054 show_timestamps_pref_cb, NULL); 7118 show_timestamps_pref_cb, NULL);
7055 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar", 7119 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar",
7056 show_formatting_toolbar_pref_cb, NULL); 7120 show_formatting_toolbar_pref_cb, NULL);
7057 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/spellcheck", 7121 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/spellcheck",