comparison pidgin/gtkconv.c @ 25516:708198aadad8

propagate from branch 'im.pidgin.pidgin' (head c09099530cc12734d4420f3fcc37e18347a16d5e) to branch 'im.pidgin.pidgin.yaz' (head 021ad3c9ed763e5e5f5678b9a081af148b43d064)
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Thu, 21 Jun 2007 06:04:16 +0000
parents 37af7de81430 16bf31872b7a
children d28015a513a9
comparison
equal deleted inserted replaced
25515:37af7de81430 25516:708198aadad8
2358 g_return_if_fail(status != NULL); 2358 g_return_if_fail(status != NULL);
2359 2359
2360 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->icon), status); 2360 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->icon), status);
2361 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->menu_icon), status); 2361 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->menu_icon), status);
2362 2362
2363 gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter), 2363 gtk_list_store_set(GTK_LIST_STORE(gtkconv->infopane_model),
2364 &(gtkconv->infopane_iter),
2364 ICON_COLUMN, status, -1); 2365 ICON_COLUMN, status, -1);
2365 2366
2366 if (status != NULL) 2367 if (status != NULL)
2367 g_object_unref(status); 2368 g_object_unref(status);
2368 2369
2416 g_idle_add(reset_auto_resize_cb, gtkconv); 2417 g_idle_add(reset_auto_resize_cb, gtkconv);
2417 2418
2418 gdk_pixbuf_animation_iter_advance(gtkconv->u.im->iter, NULL); 2419 gdk_pixbuf_animation_iter_advance(gtkconv->u.im->iter, NULL);
2419 buf = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter); 2420 buf = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter);
2420 2421
2421 pidgin_buddy_icon_get_scale_size(buf, &prpl_info->icon_spec, 2422 scale_width = gdk_pixbuf_get_width(buf);
2422 PURPLE_ICON_SCALE_DISPLAY, &scale_width, &scale_height); 2423 scale_height = gdk_pixbuf_get_height(buf);
2423 2424 if (scale_width == scale_height) {
2424 /* this code is ugly, and scares me */ 2425 scale_width = scale_height = 32;
2425 scale = gdk_pixbuf_scale_simple(buf, 32, 32, 2426 } else if (scale_height > scale_width) {
2427 scale_width = 32 * scale_width / scale_height;
2428 scale_height = 32;
2429 } else {
2430 scale_height = 32 * scale_height / scale_width;
2431 scale_width = 32;
2432 }
2433
2434 scale = gdk_pixbuf_scale_simple(buf, scale_width, scale_height,
2426 GDK_INTERP_BILINEAR); 2435 GDK_INTERP_BILINEAR);
2436 if (pidgin_gdk_pixbuf_is_opaque(scale))
2437 pidgin_gdk_pixbuf_make_round(scale);
2427 2438
2428 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->u.im->icon), scale); 2439 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->u.im->icon), scale);
2429 g_object_unref(G_OBJECT(scale)); 2440 g_object_unref(G_OBJECT(scale));
2430 gtk_widget_queue_draw(gtkconv->u.im->icon); 2441 gtk_widget_queue_draw(gtkconv->u.im->icon);
2431 2442
4293 GtkWidget *hbox, *label; 4304 GtkWidget *hbox, *label;
4294 PidginChatPane *gtkchat = gtkconv->u.chat; 4305 PidginChatPane *gtkchat = gtkconv->u.chat;
4295 4306
4296 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 4307 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4297 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); 4308 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
4298 gtk_widget_show(hbox);
4299 4309
4300 label = gtk_label_new(_("Topic:")); 4310 label = gtk_label_new(_("Topic:"));
4301 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); 4311 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
4302 gtk_widget_show(label);
4303 4312
4304 gtkchat->topic_text = gtk_entry_new(); 4313 gtkchat->topic_text = gtk_entry_new();
4305 4314
4306 if(prpl_info->set_chat_topic == NULL) { 4315 if(prpl_info->set_chat_topic == NULL) {
4307 gtk_editable_set_editable(GTK_EDITABLE(gtkchat->topic_text), FALSE); 4316 gtk_editable_set_editable(GTK_EDITABLE(gtkchat->topic_text), FALSE);
4309 g_signal_connect(GTK_OBJECT(gtkchat->topic_text), "activate", 4318 g_signal_connect(GTK_OBJECT(gtkchat->topic_text), "activate",
4310 G_CALLBACK(topic_callback), gtkconv); 4319 G_CALLBACK(topic_callback), gtkconv);
4311 } 4320 }
4312 4321
4313 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0); 4322 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0);
4314 gtk_widget_show(gtkchat->topic_text);
4315 g_signal_connect(G_OBJECT(gtkchat->topic_text), "key_press_event", 4323 g_signal_connect(G_OBJECT(gtkchat->topic_text), "key_press_event",
4316 G_CALLBACK(entry_key_press_cb), gtkconv); 4324 G_CALLBACK(entry_key_press_cb), gtkconv);
4317 } 4325 }
4318 } 4326 }
4319 4327
4431 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->infopane_hbox, FALSE, FALSE, 0); 4439 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->infopane_hbox, FALSE, FALSE, 0);
4432 gtk_widget_show(gtkconv->infopane_hbox); 4440 gtk_widget_show(gtkconv->infopane_hbox);
4433 4441
4434 gtkconv->infopane = gtk_cell_view_new(); 4442 gtkconv->infopane = gtk_cell_view_new();
4435 gtkconv->infopane_model = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING); 4443 gtkconv->infopane_model = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING);
4436 gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane), gtkconv->infopane_model); 4444 gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane),
4445 GTK_TREE_MODEL(gtkconv->infopane_model));
4437 gtk_list_store_append(gtkconv->infopane_model, &(gtkconv->infopane_iter)); 4446 gtk_list_store_append(gtkconv->infopane_model, &(gtkconv->infopane_iter));
4438 gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), gtkconv->infopane, TRUE, TRUE, 0); 4447 gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), gtkconv->infopane, TRUE, TRUE, 0);
4439 path = gtk_tree_path_new_from_string("0"); 4448 path = gtk_tree_path_new_from_string("0");
4440 gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(gtkconv->infopane), path); 4449 gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(gtkconv->infopane), path);
4441 gtk_widget_set_size_request(gtkconv->infopane, -1, 32); 4450 gtk_widget_set_size_request(gtkconv->infopane, -1, 32);
6180 6189
6181 if (fields & PIDGIN_CONV_SMILEY_THEME) 6190 if (fields & PIDGIN_CONV_SMILEY_THEME)
6182 pidgin_themes_smiley_themeize(PIDGIN_CONVERSATION(conv)->imhtml); 6191 pidgin_themes_smiley_themeize(PIDGIN_CONVERSATION(conv)->imhtml);
6183 6192
6184 if ((fields & PIDGIN_CONV_COLORIZE_TITLE) || 6193 if ((fields & PIDGIN_CONV_COLORIZE_TITLE) ||
6185 (fields & PIDGIN_CONV_SET_TITLE)) 6194 (fields & PIDGIN_CONV_SET_TITLE) ||
6195 (fields & PIDGIN_CONV_TOPIC))
6186 { 6196 {
6187 char *title, *title_tmp; 6197 char *title, *title_tmp;
6188 PurpleConvIm *im = NULL; 6198 PurpleConvIm *im = NULL;
6189 PurpleAccount *account = purple_conversation_get_account(conv); 6199 PurpleAccount *account = purple_conversation_get_account(conv);
6190 PurpleBuddy *buddy; 6200 char *markup = NULL;
6191 char *markup;
6192 AtkObject *accessibility_obj; 6201 AtkObject *accessibility_obj;
6193 gboolean ellipsis = FALSE; 6202 gboolean ellipsis = FALSE;
6194 /* I think this is a little longer than it needs to be but I'm lazy. */ 6203 /* I think this is a little longer than it needs to be but I'm lazy. */
6195 char style[51]; 6204 char style[51];
6196 6205
6203 && purple_conv_chat_has_left(PURPLE_CONV_CHAT(conv)))) 6212 && purple_conv_chat_has_left(PURPLE_CONV_CHAT(conv))))
6204 title = g_strdup_printf("(%s)", purple_conversation_get_title(conv)); 6213 title = g_strdup_printf("(%s)", purple_conversation_get_title(conv));
6205 else 6214 else
6206 title = g_strdup(purple_conversation_get_title(conv)); 6215 title = g_strdup(purple_conversation_get_title(conv));
6207 6216
6208 buddy = purple_find_buddy(account, conv->name); 6217 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
6209 if (buddy) 6218 PurpleBuddy *buddy = purple_find_buddy(account, conv->name);
6210 markup = pidgin_blist_get_name_markup(buddy, FALSE); 6219 if (buddy)
6211 else 6220 markup = pidgin_blist_get_name_markup(buddy, FALSE, FALSE);
6212 markup = title; 6221 else
6222 markup = title;
6223 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
6224 PurpleConvChat *chat = PURPLE_CONV_CHAT(conv);
6225 markup = g_strdup_printf("%s\n<span color='%s' size='smaller'>%s</span>",
6226 purple_conversation_get_title(conv),
6227 pidgin_get_dim_grey_string(gtkconv->infopane),
6228 purple_conv_chat_get_topic(chat));
6229 }
6213 gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter), 6230 gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter),
6214 TEXT_COLUMN, markup, -1); 6231 TEXT_COLUMN, markup, -1);
6215 6232
6216 if (title != markup) 6233 if (title != markup)
6217 g_free(markup); 6234 g_free(markup);
6483 "Buddy icon error: %s\n", err->message); 6500 "Buddy icon error: %s\n", err->message);
6484 g_error_free(err); 6501 g_error_free(err);
6485 } 6502 }
6486 6503
6487 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) { 6504 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) {
6505 GdkPixbuf *stat;
6488 gtkconv->u.im->iter = NULL; 6506 gtkconv->u.im->iter = NULL;
6489 buf = gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim); 6507 stat = gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim);
6508 buf = gdk_pixbuf_add_alpha(stat, FALSE, 0, 0, 0);
6490 } else { 6509 } else {
6510 GdkPixbuf *stat;
6491 gtkconv->u.im->iter = 6511 gtkconv->u.im->iter =
6492 gdk_pixbuf_animation_get_iter(gtkconv->u.im->anim, NULL); /* LEAK */ 6512 gdk_pixbuf_animation_get_iter(gtkconv->u.im->anim, NULL); /* LEAK */
6493 buf = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter); 6513 stat = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter);
6514 buf = gdk_pixbuf_add_alpha(stat, FALSE, 0, 0, 0);
6494 if (gtkconv->u.im->animate) 6515 if (gtkconv->u.im->animate)
6495 start_anim(NULL, gtkconv); 6516 start_anim(NULL, gtkconv);
6496 } 6517 }
6497 6518
6498 scale = gdk_pixbuf_scale_simple(buf, 32, 32, 6519 scale_width = gdk_pixbuf_get_width(buf);
6520 scale_height = gdk_pixbuf_get_height(buf);
6521 if (scale_width == scale_height) {
6522 scale_width = scale_height = 32;
6523 } else if (scale_height > scale_width) {
6524 scale_width = 32 * scale_width / scale_height;
6525 scale_height = 32;
6526 } else {
6527 scale_height = 32 * scale_height / scale_width;
6528 scale_width = 32;
6529 }
6530 scale = gdk_pixbuf_scale_simple(buf, scale_width, scale_height,
6499 GDK_INTERP_BILINEAR); 6531 GDK_INTERP_BILINEAR);
6500 6532 g_object_unref(buf);
6533 if (pidgin_gdk_pixbuf_is_opaque(scale))
6534 pidgin_gdk_pixbuf_make_round(scale);
6501 gtkconv->u.im->icon_container = gtk_vbox_new(FALSE, 0); 6535 gtkconv->u.im->icon_container = gtk_vbox_new(FALSE, 0);
6502 6536
6503 event = gtk_event_box_new(); 6537 event = gtk_event_box_new();
6504 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event); 6538 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event);
6505 g_signal_connect(G_OBJECT(event), "button-press-event", 6539 g_signal_connect(G_OBJECT(event), "button-press-event",
6506 G_CALLBACK(icon_menu), gtkconv); 6540 G_CALLBACK(icon_menu), gtkconv);
6507 gtk_widget_show(event); 6541 gtk_widget_show(event);
6508 6542
6509 gtkconv->u.im->icon = gtk_image_new_from_pixbuf(scale); 6543 gtkconv->u.im->icon = gtk_image_new_from_pixbuf(scale);
6510 gtkconv->auto_resize = TRUE; 6544 gtkconv->auto_resize = TRUE;
6511 /* Reset the size request to allow the buddy icon to resize */
6512 g_idle_add(reset_auto_resize_cb, gtkconv);
6513 gtk_container_add(GTK_CONTAINER(event), gtkconv->u.im->icon); 6545 gtk_container_add(GTK_CONTAINER(event), gtkconv->u.im->icon);
6514 gtk_widget_show(gtkconv->u.im->icon); 6546 gtk_widget_show(gtkconv->u.im->icon);
6515 6547
6516 g_object_unref(G_OBJECT(scale)); 6548 g_object_unref(G_OBJECT(scale));
6517 6549