Mercurial > pidgin.yaz
comparison pidgin/gtkconv.c @ 17092:79f6b097a0a6
merge of '2263648adbe7bbf44fd9bf0230c9054be1d4c72b'
and '8acb1ca32888c20351b7ed15c87ae347440d802a'
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Mon, 14 May 2007 23:17:42 +0000 |
parents | 4876375de307 d2353e780fd5 |
children | e7ad18acc238 |
comparison
equal
deleted
inserted
replaced
17091:4453f59c2035 | 17092:79f6b097a0a6 |
---|---|
174 static void pidgin_conv_custom_smiley_closed(GdkPixbufLoader *loader, gpointer user_data); | 174 static void pidgin_conv_custom_smiley_closed(GdkPixbufLoader *loader, gpointer user_data); |
175 static GdkColor* generate_nick_colors(guint *numcolors, GdkColor background); | 175 static GdkColor* generate_nick_colors(guint *numcolors, GdkColor background); |
176 static gboolean color_is_visible(GdkColor foreground, GdkColor background, int color_contrast, int brightness_contrast); | 176 static gboolean color_is_visible(GdkColor foreground, GdkColor background, int color_contrast, int brightness_contrast); |
177 static void pidgin_conv_update_fields(PurpleConversation *conv, PidginConvFields fields); | 177 static void pidgin_conv_update_fields(PurpleConversation *conv, PidginConvFields fields); |
178 static void focus_out_from_menubar(GtkWidget *wid, PidginWindow *win); | 178 static void focus_out_from_menubar(GtkWidget *wid, PidginWindow *win); |
179 static void pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv); | |
179 | 180 |
180 static GdkColor *get_nick_color(PidginConversation *gtkconv, const char *name) { | 181 static GdkColor *get_nick_color(PidginConversation *gtkconv, const char *name) { |
181 static GdkColor col; | 182 static GdkColor col; |
182 GtkStyle *style = gtk_widget_get_style(gtkconv->imhtml); | 183 GtkStyle *style = gtk_widget_get_style(gtkconv->imhtml); |
183 float scale; | 184 float scale; |
6510 | 6511 |
6511 static void | 6512 static void |
6512 tab_side_pref_cb(const char *name, PurplePrefType type, | 6513 tab_side_pref_cb(const char *name, PurplePrefType type, |
6513 gconstpointer value, gpointer data) | 6514 gconstpointer value, gpointer data) |
6514 { | 6515 { |
6515 GList *l; | 6516 GList *gtkwins, *gtkconvs; |
6516 GtkPositionType pos; | 6517 GtkPositionType pos; |
6517 PidginWindow *win; | 6518 PidginWindow *gtkwin; |
6518 | 6519 |
6519 pos = GPOINTER_TO_INT(value); | 6520 pos = GPOINTER_TO_INT(value); |
6520 | 6521 |
6521 for (l = pidgin_conv_windows_get_list(); l != NULL; l = l->next) { | 6522 for (gtkwins = pidgin_conv_windows_get_list(); gtkwins != NULL; gtkwins = gtkwins->next) { |
6522 win = l->data; | 6523 gtkwin = gtkwins->data; |
6523 | 6524 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(gtkwin->notebook), pos&~8); |
6524 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(win->notebook), pos&~8); | 6525 for (gtkconvs = gtkwin->gtkconvs; gtkconvs != NULL; gtkconvs = gtkconvs->next) { |
6526 pidgin_conv_tab_pack(gtkwin, gtkconvs->data); | |
6527 } | |
6525 } | 6528 } |
6526 } | 6529 } |
6527 | 6530 |
6528 static void | 6531 static void |
6529 show_timestamps_pref_cb(const char *name, PurplePrefType type, | 6532 show_timestamps_pref_cb(const char *name, PurplePrefType type, |
8054 void | 8057 void |
8055 pidgin_conv_window_add_gtkconv(PidginWindow *win, PidginConversation *gtkconv) | 8058 pidgin_conv_window_add_gtkconv(PidginWindow *win, PidginConversation *gtkconv) |
8056 { | 8059 { |
8057 PurpleConversation *conv = gtkconv->active_conv; | 8060 PurpleConversation *conv = gtkconv->active_conv; |
8058 PidginConversation *focus_gtkconv; | 8061 PidginConversation *focus_gtkconv; |
8059 GtkWidget *tabby, *menu_tabby; | |
8060 GtkWidget *tab_cont = gtkconv->tab_cont; | 8062 GtkWidget *tab_cont = gtkconv->tab_cont; |
8061 GtkWidget *close_image; | 8063 GtkWidget *close_image; |
8062 PurpleConversationType conv_type; | 8064 PurpleConversationType conv_type; |
8063 const gchar *tmp_lab; | 8065 const gchar *tmp_lab; |
8064 gint close_button_width, close_button_height, focus_width, focus_pad; | 8066 gint close_button_width, close_button_height, focus_width, focus_pad; |
8065 gboolean tabs_side = FALSE; | |
8066 gint angle = 0; | |
8067 | 8067 |
8068 conv_type = purple_conversation_get_type(conv); | 8068 conv_type = purple_conversation_get_type(conv); |
8069 | |
8070 | 8069 |
8071 win->gtkconvs = g_list_append(win->gtkconvs, gtkconv); | 8070 win->gtkconvs = g_list_append(win->gtkconvs, gtkconv); |
8072 gtkconv->win = win; | 8071 gtkconv->win = win; |
8073 | |
8074 if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_LEFT || | |
8075 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_RIGHT) | |
8076 tabs_side = TRUE; | |
8077 else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_LEFT|8)) | |
8078 angle = 90; | |
8079 else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_RIGHT|8)) | |
8080 angle = 270; | |
8081 | |
8082 if (angle) | |
8083 gtkconv->tabby = tabby = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); | |
8084 else | |
8085 gtkconv->tabby = tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); | |
8086 gtkconv->menu_tabby = menu_tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); | |
8087 | 8072 |
8088 /* Close button. */ | 8073 /* Close button. */ |
8089 gtkconv->close = gtk_button_new(); | 8074 gtkconv->close = gtk_button_new(); |
8090 gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &close_button_width, &close_button_height); | 8075 gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &close_button_width, &close_button_height); |
8091 if (gtk_check_version(2, 4, 2) == NULL) { | 8076 if (gtk_check_version(2, 4, 2) == NULL) { |
8126 update_tab_icon(conv); | 8111 update_tab_icon(conv); |
8127 | 8112 |
8128 /* Tab label. */ | 8113 /* Tab label. */ |
8129 gtkconv->tab_label = gtk_label_new(tmp_lab = purple_conversation_get_title(conv)); | 8114 gtkconv->tab_label = gtk_label_new(tmp_lab = purple_conversation_get_title(conv)); |
8130 | 8115 |
8116 gtkconv->menu_tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); | |
8117 gtkconv->menu_label = gtk_label_new(purple_conversation_get_title(gtkconv->active_conv)); | |
8118 gtk_box_pack_start(GTK_BOX(gtkconv->menu_tabby), gtkconv->menu_icon, FALSE, FALSE, 0); | |
8119 | |
8120 gtk_widget_show_all(gtkconv->menu_icon); | |
8121 | |
8122 gtk_box_pack_start(GTK_BOX(gtkconv->menu_tabby), gtkconv->menu_label, TRUE, TRUE, 0); | |
8123 gtk_widget_show(gtkconv->menu_label); | |
8124 gtk_misc_set_alignment(GTK_MISC(gtkconv->menu_label), 0, 0); | |
8125 | |
8126 gtk_widget_show(gtkconv->menu_tabby); | |
8127 | |
8128 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) | |
8129 pidgin_conv_update_buddy_icon(conv); | |
8130 | |
8131 /* Build and set conversations tab */ | |
8132 pidgin_conv_tab_pack(win, gtkconv); | |
8133 | |
8134 gtk_notebook_set_menu_label(GTK_NOTEBOOK(win->notebook), tab_cont, gtkconv->menu_tabby); | |
8135 | |
8136 gtk_widget_show(tab_cont); | |
8137 | |
8138 if (pidgin_conv_window_get_gtkconv_count(win) == 1) { | |
8139 /* Er, bug in notebooks? Switch to the page manually. */ | |
8140 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); | |
8141 | |
8142 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), | |
8143 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/tabs")); | |
8144 } else | |
8145 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), TRUE); | |
8146 | |
8147 focus_gtkconv = g_list_nth_data(pidgin_conv_window_get_gtkconvs(win), | |
8148 gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook))); | |
8149 gtk_widget_grab_focus(focus_gtkconv->entry); | |
8150 | |
8151 if (pidgin_conv_window_get_gtkconv_count(win) == 1) | |
8152 update_send_to_selection(win); | |
8153 } | |
8154 | |
8155 static void | |
8156 pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv) | |
8157 { | |
8158 gboolean tabs_side = FALSE; | |
8159 gint angle = 0; | |
8160 GtkWidget *first, *third; | |
8161 | |
8162 if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_LEFT || | |
8163 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_RIGHT) | |
8164 tabs_side = TRUE; | |
8165 else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_LEFT|8)) | |
8166 angle = 90; | |
8167 else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_RIGHT|8)) | |
8168 angle = 270; | |
8169 | |
8131 #if GTK_CHECK_VERSION(2,6,0) | 8170 #if GTK_CHECK_VERSION(2,6,0) |
8132 if (!angle) | 8171 if (!angle) |
8133 g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_END, NULL); | 8172 g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
8173 else | |
8174 g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_NONE, NULL); | |
8134 gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), 6); | 8175 gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), 6); |
8135 if (tabs_side) { | 8176 if (tabs_side) { |
8136 gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), MIN(g_utf8_strlen(tmp_lab, -1), 12)); | 8177 gtk_label_set_width_chars( |
8178 GTK_LABEL(gtkconv->tab_label), | |
8179 MIN(g_utf8_strlen(gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)), -1), 12) | |
8180 ); | |
8137 } | 8181 } |
8138 if (angle) | 8182 if (angle) |
8139 gtk_label_set_angle(GTK_LABEL(gtkconv->tab_label), angle); | 8183 gtk_label_set_angle(GTK_LABEL(gtkconv->tab_label), angle); |
8140 #endif | 8184 #endif |
8141 gtkconv->menu_label = gtk_label_new(purple_conversation_get_title(conv)); | 8185 |
8142 #if 0 | 8186 #if 0 |
8143 gtk_misc_set_alignment(GTK_MISC(gtkconv->tab_label), 0.00, 0.5); | 8187 gtk_misc_set_alignment(GTK_MISC(gtkconv->tab_label), 0.00, 0.5); |
8144 gtk_misc_set_padding(GTK_MISC(gtkconv->tab_label), 4, 0); | 8188 gtk_misc_set_padding(GTK_MISC(gtkconv->tab_label), 4, 0); |
8145 #endif | 8189 #endif |
8146 | 8190 |
8147 /* Pack it all together. */ | 8191 if (angle) |
8148 if (angle == 90) | 8192 gtkconv->tabby = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
8149 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); | |
8150 else | 8193 else |
8151 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); | 8194 gtkconv->tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
8152 gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_icon, | 8195 |
8153 FALSE, FALSE, 0); | 8196 /* select the correct ordering for verticle tabs */ |
8154 | 8197 if (angle == 90) { |
8155 gtk_widget_show_all(gtkconv->icon); | 8198 first = gtkconv->close; |
8156 gtk_widget_show_all(gtkconv->menu_icon); | 8199 third = gtkconv->icon; |
8157 | 8200 } else { |
8158 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->tab_label, TRUE, TRUE, 0); | 8201 first = gtkconv->icon; |
8159 gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_label, TRUE, TRUE, 0); | 8202 third = gtkconv->close; |
8203 } | |
8204 | |
8205 if (gtkconv->tab_label->parent == NULL) { | |
8206 /* Pack if it's a new widget */ | |
8207 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), first, FALSE, FALSE, 0); | |
8208 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), gtkconv->tab_label, TRUE, TRUE, 0); | |
8209 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), third, FALSE, FALSE, 0); | |
8210 | |
8211 /* Add this pane to the conversation's notebook. */ | |
8212 gtk_notebook_append_page(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, gtkconv->tabby); | |
8213 } else { | |
8214 /* reparent old widgets on preference changes */ | |
8215 gtk_widget_reparent(first, gtkconv->tabby); | |
8216 gtk_widget_reparent(gtkconv->tab_label, gtkconv->tabby); | |
8217 gtk_widget_reparent(third, gtkconv->tabby); | |
8218 gtk_box_set_child_packing(GTK_BOX(gtkconv->tabby), first, FALSE, FALSE, 0, GTK_PACK_START); | |
8219 gtk_box_set_child_packing(GTK_BOX(gtkconv->tabby), gtkconv->tab_label, TRUE, TRUE, 0, GTK_PACK_START); | |
8220 gtk_box_set_child_packing(GTK_BOX(gtkconv->tabby), third, FALSE, FALSE, 0, GTK_PACK_START); | |
8221 | |
8222 /* Reset the tabs label to the new version */ | |
8223 gtk_notebook_set_tab_label(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, gtkconv->tabby); | |
8224 } | |
8225 | |
8226 gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, !tabs_side && !angle, TRUE, GTK_PACK_START); | |
8227 | |
8228 /* show the widgets */ | |
8229 gtk_widget_show(gtkconv->icon); | |
8160 gtk_widget_show(gtkconv->tab_label); | 8230 gtk_widget_show(gtkconv->tab_label); |
8161 gtk_widget_show(gtkconv->menu_label); | |
8162 gtk_misc_set_alignment(GTK_MISC(gtkconv->menu_label), 0, 0); | |
8163 | |
8164 if (angle == 90) | |
8165 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); | |
8166 else | |
8167 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); | |
8168 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/close_on_tabs")) | 8231 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/close_on_tabs")) |
8169 gtk_widget_show(gtkconv->close); | 8232 gtk_widget_show(gtkconv->close); |
8170 | 8233 gtk_widget_show(gtkconv->tabby); |
8171 gtk_widget_show(tabby); | |
8172 gtk_widget_show(menu_tabby); | |
8173 | |
8174 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) | |
8175 pidgin_conv_update_buddy_icon(conv); | |
8176 | |
8177 /* Add this pane to the conversation's notebook. */ | |
8178 gtk_notebook_append_page_menu(GTK_NOTEBOOK(win->notebook), tab_cont, tabby, menu_tabby); | |
8179 gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), tab_cont, !tabs_side && !angle, TRUE, GTK_PACK_START); | |
8180 | |
8181 | |
8182 gtk_widget_show(tab_cont); | |
8183 | |
8184 if (pidgin_conv_window_get_gtkconv_count(win) == 1) { | |
8185 /* Er, bug in notebooks? Switch to the page manually. */ | |
8186 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); | |
8187 | |
8188 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), | |
8189 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/tabs")); | |
8190 } else | |
8191 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), TRUE); | |
8192 | |
8193 focus_gtkconv = g_list_nth_data(pidgin_conv_window_get_gtkconvs(win), | |
8194 gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook))); | |
8195 gtk_widget_grab_focus(focus_gtkconv->entry); | |
8196 | |
8197 if (pidgin_conv_window_get_gtkconv_count(win) == 1) | |
8198 update_send_to_selection(win); | |
8199 } | 8234 } |
8200 | 8235 |
8201 void | 8236 void |
8202 pidgin_conv_window_remove_gtkconv(PidginWindow *win, PidginConversation *gtkconv) | 8237 pidgin_conv_window_remove_gtkconv(PidginWindow *win, PidginConversation *gtkconv) |
8203 { | 8238 { |