Mercurial > pidgin.yaz
comparison pidgin/gtkconv.c @ 19234:aafa9b36344e
Double-click infopane to alias or change topic. Also, show alias instead of screenname in infopane
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Tue, 14 Aug 2007 00:31:24 +0000 |
parents | 03d81500766d |
children | f243a10045e2 |
comparison
equal
deleted
inserted
replaced
19231:03d81500766d | 19234:aafa9b36344e |
---|---|
184 static gboolean color_is_visible(GdkColor foreground, GdkColor background, int color_contrast, int brightness_contrast); | 184 static gboolean color_is_visible(GdkColor foreground, GdkColor background, int color_contrast, int brightness_contrast); |
185 static void pidgin_conv_update_fields(PurpleConversation *conv, PidginConvFields fields); | 185 static void pidgin_conv_update_fields(PurpleConversation *conv, PidginConvFields fields); |
186 static void focus_out_from_menubar(GtkWidget *wid, PidginWindow *win); | 186 static void focus_out_from_menubar(GtkWidget *wid, PidginWindow *win); |
187 static void pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv); | 187 static void pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv); |
188 static gboolean infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *conv); | 188 static gboolean infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *conv); |
189 static gboolean alias_double_click_cb(GtkWidget *widget, GdkEventButton *event, PidginConversation *gtkconv); | |
189 | 190 |
190 static void pidgin_conv_set_position_size(PidginWindow *win, int x, int y, | 191 static void pidgin_conv_set_position_size(PidginWindow *win, int x, int y, |
191 int width, int height); | 192 int width, int height); |
192 | 193 |
193 static GdkColor *get_nick_color(PidginConversation *gtkconv, const char *name) { | 194 static GdkColor *get_nick_color(PidginConversation *gtkconv, const char *name) { |
4015 g_free(new_topic); | 4016 g_free(new_topic); |
4016 return; | 4017 return; |
4017 } | 4018 } |
4018 | 4019 |
4019 gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), current_topic); | 4020 gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), current_topic); |
4020 | |
4021 prpl_info->set_chat_topic(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)), | 4021 prpl_info->set_chat_topic(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)), |
4022 new_topic); | 4022 new_topic); |
4023 | 4023 |
4024 g_free(new_topic); | 4024 g_free(new_topic); |
4025 } | 4025 } |
4383 rend = gtk_cell_renderer_text_new(); | 4383 rend = gtk_cell_renderer_text_new(); |
4384 g_object_set(rend, | 4384 g_object_set(rend, |
4385 "foreground-set", TRUE, | 4385 "foreground-set", TRUE, |
4386 "weight-set", TRUE, | 4386 "weight-set", TRUE, |
4387 NULL); | 4387 NULL); |
4388 g_object_set(G_OBJECT(rend), "editable", TRUE, NULL); | |
4389 | |
4388 col = gtk_tree_view_column_new_with_attributes(NULL, rend, | 4390 col = gtk_tree_view_column_new_with_attributes(NULL, rend, |
4389 "text", CHAT_USERS_ALIAS_COLUMN, | 4391 "text", CHAT_USERS_ALIAS_COLUMN, |
4390 "foreground-gdk", CHAT_USERS_COLOR_COLUMN, | 4392 "foreground-gdk", CHAT_USERS_COLOR_COLUMN, |
4391 "weight", CHAT_USERS_WEIGHT_COLUMN, | 4393 "weight", CHAT_USERS_WEIGHT_COLUMN, |
4392 NULL); | 4394 NULL); |
6311 markup = pidgin_blist_get_name_markup(buddy, FALSE, FALSE); | 6313 markup = pidgin_blist_get_name_markup(buddy, FALSE, FALSE); |
6312 } else { | 6314 } else { |
6313 markup = title; | 6315 markup = title; |
6314 } | 6316 } |
6315 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { | 6317 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { |
6316 PurpleConvChat *chat = PURPLE_CONV_CHAT(conv); | 6318 const char *topic = gtk_entry_get_text(GTK_ENTRY(gtkconv->u.chat->topic_text)); |
6317 const char *topic = purple_conv_chat_get_topic(chat); | |
6318 char *esc = topic ? g_markup_escape_text(topic, -1) : NULL; | 6319 char *esc = topic ? g_markup_escape_text(topic, -1) : NULL; |
6319 markup = g_strdup_printf("%s%s<span color='%s' size='smaller'>%s</span>", | 6320 markup = g_strdup_printf("%s%s<span color='%s' size='smaller'>%s</span>", |
6320 purple_conversation_get_title(conv), | 6321 purple_conversation_get_title(conv), |
6321 esc ? "\n" : "", | 6322 esc && *esc ? "\n" : "", |
6322 pidgin_get_dim_grey_string(gtkconv->infopane), | 6323 pidgin_get_dim_grey_string(gtkconv->infopane), |
6323 esc ? esc : ""); | 6324 esc ? esc : ""); |
6324 g_free(esc); | 6325 g_free(esc); |
6325 } | 6326 } |
6326 gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter), | 6327 gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter), |
6327 CONV_TEXT_COLUMN, markup, -1); | 6328 CONV_TEXT_COLUMN, markup, -1); |
6329 /* XXX seanegan Why do I have to do this? */ | |
6330 gtk_widget_queue_draw(gtkconv->infopane); | |
6328 | 6331 |
6329 if (title != markup) | 6332 if (title != markup) |
6330 g_free(markup); | 6333 g_free(markup); |
6331 | 6334 |
6332 if (!GTK_WIDGET_REALIZED(gtkconv->tab_label)) | 6335 if (!GTK_WIDGET_REALIZED(gtkconv->tab_label)) |
7759 */ | 7762 */ |
7760 | 7763 |
7761 static gboolean | 7764 static gboolean |
7762 infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv) | 7765 infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv) |
7763 { | 7766 { |
7767 if (e->type == GDK_2BUTTON_PRESS && e->button == 1) { | |
7768 if (alias_double_click_cb(widget, e, gtkconv)) | |
7769 return TRUE; | |
7770 } | |
7771 | |
7764 if (e->type != GDK_BUTTON_PRESS) | 7772 if (e->type != GDK_BUTTON_PRESS) |
7765 return FALSE; | 7773 return FALSE; |
7766 | 7774 |
7767 if (e->button == 3) { | 7775 if (e->button == 3) { |
7768 /* Right click was pressed. Popup the Send To menu. */ | 7776 /* Right click was pressed. Popup the Send To menu. */ |
8140 static void | 8148 static void |
8141 remove_edit_entry(PidginConversation *gtkconv, GtkWidget *entry) | 8149 remove_edit_entry(PidginConversation *gtkconv, GtkWidget *entry) |
8142 { | 8150 { |
8143 g_signal_handlers_disconnect_matched(G_OBJECT(entry), G_SIGNAL_MATCH_DATA, | 8151 g_signal_handlers_disconnect_matched(G_OBJECT(entry), G_SIGNAL_MATCH_DATA, |
8144 0, 0, NULL, NULL, gtkconv); | 8152 0, 0, NULL, NULL, gtkconv); |
8145 gtk_widget_show(gtkconv->tab_label); | 8153 gtk_widget_show(gtkconv->infopane); |
8146 gtk_widget_grab_focus(gtkconv->entry); | 8154 gtk_widget_grab_focus(gtkconv->entry); |
8147 gtk_widget_destroy(entry); | 8155 gtk_widget_destroy(entry); |
8148 } | 8156 } |
8149 | 8157 |
8150 static gboolean | 8158 static gboolean |
8187 purple_blist_alias_buddy(buddy, | 8195 purple_blist_alias_buddy(buddy, |
8188 gtk_entry_get_text(entry)); | 8196 gtk_entry_get_text(entry)); |
8189 } | 8197 } |
8190 serv_alias_buddy(buddy); | 8198 serv_alias_buddy(buddy); |
8191 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { | 8199 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { |
8192 PurpleChat *chat; | 8200 gtk_entry_set_text(GTK_ENTRY(gtkconv->u.chat->topic_text), gtk_entry_get_text(entry)); |
8193 | 8201 topic_callback(NULL, gtkconv); |
8194 chat = purple_blist_find_chat(account, name); | |
8195 if (chat != NULL) { | |
8196 purple_blist_alias_chat(chat, | |
8197 gtk_entry_get_text(entry)); | |
8198 } | |
8199 } | 8202 } |
8200 remove_edit_entry(user_data, GTK_WIDGET(entry)); | 8203 remove_edit_entry(user_data, GTK_WIDGET(entry)); |
8201 } | 8204 } |
8202 | 8205 |
8203 static gboolean | 8206 static gboolean |
8204 alias_double_click_cb(GtkNotebook *notebook, GdkEventButton *event, PidginConversation *gtkconv) | 8207 alias_double_click_cb(GtkWidget *widget, GdkEventButton *event, PidginConversation *gtkconv) |
8205 { | 8208 { |
8206 GtkWidget *entry = NULL; | 8209 GtkWidget *entry = NULL; |
8210 PurpleConversation *conv = gtkconv->active_conv; | |
8211 const char *text = NULL; | |
8207 | 8212 |
8208 if (event->button != 1 || event->type != GDK_2BUTTON_PRESS) { | 8213 if (event->button != 1 || event->type != GDK_2BUTTON_PRESS) { |
8209 return FALSE; | 8214 return FALSE; |
8210 } | 8215 } |
8211 | 8216 |
8215 } | 8220 } |
8216 | 8221 |
8217 if (!purple_account_is_connected(gtkconv->active_conv->account)) { | 8222 if (!purple_account_is_connected(gtkconv->active_conv->account)) { |
8218 /* Do not allow aliasing someone on a disconnected account. */ | 8223 /* Do not allow aliasing someone on a disconnected account. */ |
8219 return FALSE; | 8224 return FALSE; |
8225 } | |
8226 | |
8227 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { | |
8228 PurpleBuddy *buddy = purple_find_buddy(gtkconv->active_conv->account, gtkconv->active_conv->name); | |
8229 if (!buddy) | |
8230 return FALSE; | |
8231 text = purple_buddy_get_contact_alias(buddy); | |
8232 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { | |
8233 text = purple_conv_chat_get_topic(PURPLE_CONV_CHAT(conv)); | |
8220 } | 8234 } |
8221 | 8235 |
8222 /* alias label */ | 8236 /* alias label */ |
8223 entry = gtk_entry_new(); | 8237 entry = gtk_entry_new(); |
8224 gtk_entry_set_has_frame(GTK_ENTRY(entry), FALSE); | 8238 gtk_entry_set_has_frame(GTK_ENTRY(entry), FALSE); |
8225 gtk_entry_set_width_chars(GTK_ENTRY(entry), 10); | 8239 gtk_entry_set_width_chars(GTK_ENTRY(entry), 10); |
8226 #if GTK_CHECK_VERSION(2,4,0) | 8240 #if GTK_CHECK_VERSION(2,4,0) |
8227 gtk_entry_set_alignment(GTK_ENTRY(entry), 0.5); | 8241 gtk_entry_set_alignment(GTK_ENTRY(entry), 0.5); |
8228 #endif | 8242 #endif |
8229 | 8243 |
8230 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), entry, TRUE, TRUE, 0); | 8244 gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), entry, TRUE, TRUE, 0); |
8231 /* after the tab label */ | 8245 /* after the tab label */ |
8232 gtk_box_reorder_child(GTK_BOX(gtkconv->tabby), entry, 2); | 8246 gtk_box_reorder_child(GTK_BOX(gtkconv->infopane_hbox), entry, 0); |
8233 | 8247 |
8234 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(alias_cb), gtkconv); | 8248 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(alias_cb), gtkconv); |
8235 g_signal_connect(G_OBJECT(entry), "focus-out-event", G_CALLBACK(alias_focus_cb), gtkconv); | 8249 g_signal_connect(G_OBJECT(entry), "focus-out-event", G_CALLBACK(alias_focus_cb), gtkconv); |
8236 g_signal_connect(G_OBJECT(entry), "key-press-event", G_CALLBACK(alias_key_press_cb), gtkconv); | 8250 g_signal_connect(G_OBJECT(entry), "key-press-event", G_CALLBACK(alias_key_press_cb), gtkconv); |
8237 gtk_entry_set_text(GTK_ENTRY(entry), | 8251 |
8238 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label))); | 8252 |
8253 | |
8254 gtk_entry_set_text(GTK_ENTRY(entry), text); | |
8239 gtk_widget_show(entry); | 8255 gtk_widget_show(entry); |
8240 gtk_widget_hide(gtkconv->tab_label); | 8256 gtk_widget_hide(gtkconv->infopane); |
8241 gtk_widget_grab_focus(entry); | 8257 gtk_widget_grab_focus(entry); |
8242 | 8258 |
8243 return FALSE; | 8259 return FALSE; |
8244 } | 8260 } |
8245 | 8261 |