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 {