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 {