Mercurial > pidgin.yaz
comparison pidgin/gtkconv.c @ 17045:d2353e780fd5
Patch #363 Fix for tab packing problem
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Mon, 14 May 2007 19:23:09 +0000 |
parents | af4181dde6fa |
children | 580c6c5d9480 79f6b097a0a6 |
comparison
equal
deleted
inserted
replaced
17044:c28f4593f723 | 17045:d2353e780fd5 |
---|---|
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; |
6504 | 6505 |
6505 static void | 6506 static void |
6506 tab_side_pref_cb(const char *name, PurplePrefType type, | 6507 tab_side_pref_cb(const char *name, PurplePrefType type, |
6507 gconstpointer value, gpointer data) | 6508 gconstpointer value, gpointer data) |
6508 { | 6509 { |
6509 GList *l; | 6510 GList *gtkwins, *gtkconvs; |
6510 GtkPositionType pos; | 6511 GtkPositionType pos; |
6511 PidginWindow *win; | 6512 PidginWindow *gtkwin; |
6512 | 6513 |
6513 pos = GPOINTER_TO_INT(value); | 6514 pos = GPOINTER_TO_INT(value); |
6514 | 6515 |
6515 for (l = pidgin_conv_windows_get_list(); l != NULL; l = l->next) { | 6516 for (gtkwins = pidgin_conv_windows_get_list(); gtkwins != NULL; gtkwins = gtkwins->next) { |
6516 win = l->data; | 6517 gtkwin = gtkwins->data; |
6517 | 6518 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(gtkwin->notebook), pos&~8); |
6518 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(win->notebook), pos&~8); | 6519 for (gtkconvs = gtkwin->gtkconvs; gtkconvs != NULL; gtkconvs = gtkconvs->next) { |
6520 pidgin_conv_tab_pack(gtkwin, gtkconvs->data); | |
6521 } | |
6519 } | 6522 } |
6520 } | 6523 } |
6521 | 6524 |
6522 static void | 6525 static void |
6523 show_timestamps_pref_cb(const char *name, PurplePrefType type, | 6526 show_timestamps_pref_cb(const char *name, PurplePrefType type, |
8048 void | 8051 void |
8049 pidgin_conv_window_add_gtkconv(PidginWindow *win, PidginConversation *gtkconv) | 8052 pidgin_conv_window_add_gtkconv(PidginWindow *win, PidginConversation *gtkconv) |
8050 { | 8053 { |
8051 PurpleConversation *conv = gtkconv->active_conv; | 8054 PurpleConversation *conv = gtkconv->active_conv; |
8052 PidginConversation *focus_gtkconv; | 8055 PidginConversation *focus_gtkconv; |
8053 GtkWidget *tabby, *menu_tabby; | |
8054 GtkWidget *tab_cont = gtkconv->tab_cont; | 8056 GtkWidget *tab_cont = gtkconv->tab_cont; |
8055 GtkWidget *close_image; | 8057 GtkWidget *close_image; |
8056 PurpleConversationType conv_type; | 8058 PurpleConversationType conv_type; |
8057 const gchar *tmp_lab; | 8059 const gchar *tmp_lab; |
8058 gint close_button_width, close_button_height, focus_width, focus_pad; | 8060 gint close_button_width, close_button_height, focus_width, focus_pad; |
8059 gboolean tabs_side = FALSE; | |
8060 gint angle = 0; | |
8061 | 8061 |
8062 conv_type = purple_conversation_get_type(conv); | 8062 conv_type = purple_conversation_get_type(conv); |
8063 | |
8064 | 8063 |
8065 win->gtkconvs = g_list_append(win->gtkconvs, gtkconv); | 8064 win->gtkconvs = g_list_append(win->gtkconvs, gtkconv); |
8066 gtkconv->win = win; | 8065 gtkconv->win = win; |
8067 | |
8068 if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_LEFT || | |
8069 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_RIGHT) | |
8070 tabs_side = TRUE; | |
8071 else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_LEFT|8)) | |
8072 angle = 90; | |
8073 else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_RIGHT|8)) | |
8074 angle = 270; | |
8075 | |
8076 if (angle) | |
8077 gtkconv->tabby = tabby = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); | |
8078 else | |
8079 gtkconv->tabby = tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); | |
8080 gtkconv->menu_tabby = menu_tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); | |
8081 | 8066 |
8082 /* Close button. */ | 8067 /* Close button. */ |
8083 gtkconv->close = gtk_button_new(); | 8068 gtkconv->close = gtk_button_new(); |
8084 gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &close_button_width, &close_button_height); | 8069 gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &close_button_width, &close_button_height); |
8085 if (gtk_check_version(2, 4, 2) == NULL) { | 8070 if (gtk_check_version(2, 4, 2) == NULL) { |
8120 update_tab_icon(conv); | 8105 update_tab_icon(conv); |
8121 | 8106 |
8122 /* Tab label. */ | 8107 /* Tab label. */ |
8123 gtkconv->tab_label = gtk_label_new(tmp_lab = purple_conversation_get_title(conv)); | 8108 gtkconv->tab_label = gtk_label_new(tmp_lab = purple_conversation_get_title(conv)); |
8124 | 8109 |
8110 gtkconv->menu_tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); | |
8111 gtkconv->menu_label = gtk_label_new(purple_conversation_get_title(gtkconv->active_conv)); | |
8112 gtk_box_pack_start(GTK_BOX(gtkconv->menu_tabby), gtkconv->menu_icon, FALSE, FALSE, 0); | |
8113 | |
8114 gtk_widget_show_all(gtkconv->menu_icon); | |
8115 | |
8116 gtk_box_pack_start(GTK_BOX(gtkconv->menu_tabby), gtkconv->menu_label, TRUE, TRUE, 0); | |
8117 gtk_widget_show(gtkconv->menu_label); | |
8118 gtk_misc_set_alignment(GTK_MISC(gtkconv->menu_label), 0, 0); | |
8119 | |
8120 gtk_widget_show(gtkconv->menu_tabby); | |
8121 | |
8122 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) | |
8123 pidgin_conv_update_buddy_icon(conv); | |
8124 | |
8125 /* Build and set conversations tab */ | |
8126 pidgin_conv_tab_pack(win, gtkconv); | |
8127 | |
8128 gtk_notebook_set_menu_label(GTK_NOTEBOOK(win->notebook), tab_cont, gtkconv->menu_tabby); | |
8129 | |
8130 gtk_widget_show(tab_cont); | |
8131 | |
8132 if (pidgin_conv_window_get_gtkconv_count(win) == 1) { | |
8133 /* Er, bug in notebooks? Switch to the page manually. */ | |
8134 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); | |
8135 | |
8136 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), | |
8137 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/tabs")); | |
8138 } else | |
8139 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), TRUE); | |
8140 | |
8141 focus_gtkconv = g_list_nth_data(pidgin_conv_window_get_gtkconvs(win), | |
8142 gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook))); | |
8143 gtk_widget_grab_focus(focus_gtkconv->entry); | |
8144 | |
8145 if (pidgin_conv_window_get_gtkconv_count(win) == 1) | |
8146 update_send_to_selection(win); | |
8147 } | |
8148 | |
8149 static void | |
8150 pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv) | |
8151 { | |
8152 gboolean tabs_side = FALSE; | |
8153 gint angle = 0; | |
8154 GtkWidget *first, *third; | |
8155 | |
8156 if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_LEFT || | |
8157 purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_RIGHT) | |
8158 tabs_side = TRUE; | |
8159 else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_LEFT|8)) | |
8160 angle = 90; | |
8161 else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_RIGHT|8)) | |
8162 angle = 270; | |
8163 | |
8125 #if GTK_CHECK_VERSION(2,6,0) | 8164 #if GTK_CHECK_VERSION(2,6,0) |
8126 if (!angle) | 8165 if (!angle) |
8127 g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_END, NULL); | 8166 g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
8167 else | |
8168 g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_NONE, NULL); | |
8128 gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), 6); | 8169 gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), 6); |
8129 if (tabs_side) { | 8170 if (tabs_side) { |
8130 gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), MIN(g_utf8_strlen(tmp_lab, -1), 12)); | 8171 gtk_label_set_width_chars( |
8172 GTK_LABEL(gtkconv->tab_label), | |
8173 MIN(g_utf8_strlen(gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)), -1), 12) | |
8174 ); | |
8131 } | 8175 } |
8132 if (angle) | 8176 if (angle) |
8133 gtk_label_set_angle(GTK_LABEL(gtkconv->tab_label), angle); | 8177 gtk_label_set_angle(GTK_LABEL(gtkconv->tab_label), angle); |
8134 #endif | 8178 #endif |
8135 gtkconv->menu_label = gtk_label_new(purple_conversation_get_title(conv)); | 8179 |
8136 #if 0 | 8180 #if 0 |
8137 gtk_misc_set_alignment(GTK_MISC(gtkconv->tab_label), 0.00, 0.5); | 8181 gtk_misc_set_alignment(GTK_MISC(gtkconv->tab_label), 0.00, 0.5); |
8138 gtk_misc_set_padding(GTK_MISC(gtkconv->tab_label), 4, 0); | 8182 gtk_misc_set_padding(GTK_MISC(gtkconv->tab_label), 4, 0); |
8139 #endif | 8183 #endif |
8140 | 8184 |
8141 /* Pack it all together. */ | 8185 if (angle) |
8142 if (angle == 90) | 8186 gtkconv->tabby = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
8143 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); | |
8144 else | 8187 else |
8145 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); | 8188 gtkconv->tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
8146 gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_icon, | 8189 |
8147 FALSE, FALSE, 0); | 8190 /* select the correct ordering for verticle tabs */ |
8148 | 8191 if (angle == 90) { |
8149 gtk_widget_show_all(gtkconv->icon); | 8192 first = gtkconv->close; |
8150 gtk_widget_show_all(gtkconv->menu_icon); | 8193 third = gtkconv->icon; |
8151 | 8194 } else { |
8152 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->tab_label, TRUE, TRUE, 0); | 8195 first = gtkconv->icon; |
8153 gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_label, TRUE, TRUE, 0); | 8196 third = gtkconv->close; |
8197 } | |
8198 | |
8199 if (gtkconv->tab_label->parent == NULL) { | |
8200 /* Pack if it's a new widget */ | |
8201 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), first, FALSE, FALSE, 0); | |
8202 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), gtkconv->tab_label, TRUE, TRUE, 0); | |
8203 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), third, FALSE, FALSE, 0); | |
8204 | |
8205 /* Add this pane to the conversation's notebook. */ | |
8206 gtk_notebook_append_page(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, gtkconv->tabby); | |
8207 } else { | |
8208 /* reparent old widgets on preference changes */ | |
8209 gtk_widget_reparent(first, gtkconv->tabby); | |
8210 gtk_widget_reparent(gtkconv->tab_label, gtkconv->tabby); | |
8211 gtk_widget_reparent(third, gtkconv->tabby); | |
8212 gtk_box_set_child_packing(GTK_BOX(gtkconv->tabby), first, FALSE, FALSE, 0, GTK_PACK_START); | |
8213 gtk_box_set_child_packing(GTK_BOX(gtkconv->tabby), gtkconv->tab_label, TRUE, TRUE, 0, GTK_PACK_START); | |
8214 gtk_box_set_child_packing(GTK_BOX(gtkconv->tabby), third, FALSE, FALSE, 0, GTK_PACK_START); | |
8215 | |
8216 /* Reset the tabs label to the new version */ | |
8217 gtk_notebook_set_tab_label(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, gtkconv->tabby); | |
8218 } | |
8219 | |
8220 gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, !tabs_side && !angle, TRUE, GTK_PACK_START); | |
8221 | |
8222 /* show the widgets */ | |
8223 gtk_widget_show(gtkconv->icon); | |
8154 gtk_widget_show(gtkconv->tab_label); | 8224 gtk_widget_show(gtkconv->tab_label); |
8155 gtk_widget_show(gtkconv->menu_label); | |
8156 gtk_misc_set_alignment(GTK_MISC(gtkconv->menu_label), 0, 0); | |
8157 | |
8158 if (angle == 90) | |
8159 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); | |
8160 else | |
8161 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); | |
8162 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/close_on_tabs")) | 8225 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/close_on_tabs")) |
8163 gtk_widget_show(gtkconv->close); | 8226 gtk_widget_show(gtkconv->close); |
8164 | 8227 gtk_widget_show(gtkconv->tabby); |
8165 gtk_widget_show(tabby); | |
8166 gtk_widget_show(menu_tabby); | |
8167 | |
8168 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) | |
8169 pidgin_conv_update_buddy_icon(conv); | |
8170 | |
8171 /* Add this pane to the conversation's notebook. */ | |
8172 gtk_notebook_append_page_menu(GTK_NOTEBOOK(win->notebook), tab_cont, tabby, menu_tabby); | |
8173 gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), tab_cont, !tabs_side && !angle, TRUE, GTK_PACK_START); | |
8174 | |
8175 | |
8176 gtk_widget_show(tab_cont); | |
8177 | |
8178 if (pidgin_conv_window_get_gtkconv_count(win) == 1) { | |
8179 /* Er, bug in notebooks? Switch to the page manually. */ | |
8180 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); | |
8181 | |
8182 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), | |
8183 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/tabs")); | |
8184 } else | |
8185 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), TRUE); | |
8186 | |
8187 focus_gtkconv = g_list_nth_data(pidgin_conv_window_get_gtkconvs(win), | |
8188 gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook))); | |
8189 gtk_widget_grab_focus(focus_gtkconv->entry); | |
8190 | |
8191 if (pidgin_conv_window_get_gtkconv_count(win) == 1) | |
8192 update_send_to_selection(win); | |
8193 } | 8228 } |
8194 | 8229 |
8195 void | 8230 void |
8196 pidgin_conv_window_remove_gtkconv(PidginWindow *win, PidginConversation *gtkconv) | 8231 pidgin_conv_window_remove_gtkconv(PidginWindow *win, PidginConversation *gtkconv) |
8197 { | 8232 { |