pidgin/gtkconv.c

branch
soc.2007.finchfeat
changeset 19307
0027732ddb26
parent 18857
45d6cb43b892
child 18867
ccdc920ec008
equal deleted inserted replaced
18717:4c0284a98465 19307:0027732ddb26
81 PIDGIN_CONV_SMILEY_THEME = 1 << 5, 81 PIDGIN_CONV_SMILEY_THEME = 1 << 5,
82 PIDGIN_CONV_COLORIZE_TITLE = 1 << 6 82 PIDGIN_CONV_COLORIZE_TITLE = 1 << 6
83 }PidginConvFields; 83 }PidginConvFields;
84 84
85 enum { 85 enum {
86 ICON_COLUMN, 86 CONV_ICON_COLUMN,
87 TEXT_COLUMN, 87 CONV_TEXT_COLUMN,
88 NUM_COLUMNS 88 CONV_EMBLEM_COLUMN,
89 CONV_NUM_COLUMNS
89 } PidginInfopaneColumns; 90 } PidginInfopaneColumns;
90 91
91 #define PIDGIN_CONV_ALL ((1 << 7) - 1) 92 #define PIDGIN_CONV_ALL ((1 << 7) - 1)
92 93
93 #define SEND_COLOR "#204a87" 94 #define SEND_COLOR "#204a87"
2333 static void 2334 static void
2334 update_tab_icon(PurpleConversation *conv) 2335 update_tab_icon(PurpleConversation *conv)
2335 { 2336 {
2336 PidginConversation *gtkconv; 2337 PidginConversation *gtkconv;
2337 PidginWindow *win; 2338 PidginWindow *win;
2339 PurpleBuddy *b;
2338 GList *l; 2340 GList *l;
2339 GdkPixbuf *status = NULL; 2341 GdkPixbuf *status = NULL;
2342 GdkPixbuf *emblem = NULL;
2340 2343
2341 g_return_if_fail(conv != NULL); 2344 g_return_if_fail(conv != NULL);
2342 2345
2343 gtkconv = PIDGIN_CONVERSATION(conv); 2346 gtkconv = PIDGIN_CONVERSATION(conv);
2344 win = gtkconv->win; 2347 win = gtkconv->win;
2345 if (conv != gtkconv->active_conv) 2348 if (conv != gtkconv->active_conv)
2346 return; 2349 return;
2347 2350
2351
2348 status = pidgin_conv_get_tab_icon(conv, TRUE); 2352 status = pidgin_conv_get_tab_icon(conv, TRUE);
2353 b = purple_find_buddy(conv->account, conv->name);
2354 if (b)
2355 emblem = pidgin_blist_get_emblem((PurpleBlistNode*)b);
2349 2356
2350 g_return_if_fail(status != NULL); 2357 g_return_if_fail(status != NULL);
2351 2358
2352 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->icon), status); 2359 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->icon), status);
2353 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->menu_icon), status); 2360 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->menu_icon), status);
2354 2361
2355 gtk_list_store_set(GTK_LIST_STORE(gtkconv->infopane_model), 2362 gtk_list_store_set(GTK_LIST_STORE(gtkconv->infopane_model),
2356 &(gtkconv->infopane_iter), 2363 &(gtkconv->infopane_iter),
2357 ICON_COLUMN, status, -1); 2364 CONV_ICON_COLUMN, status, -1);
2365
2366 gtk_list_store_set(GTK_LIST_STORE(gtkconv->infopane_model),
2367 &(gtkconv->infopane_iter),
2368 CONV_EMBLEM_COLUMN, emblem, -1);
2369
2358 2370
2359 if (status != NULL) 2371 if (status != NULL)
2360 g_object_unref(status); 2372 g_object_unref(status);
2361 2373
2362 if (pidgin_conv_window_is_active_conversation(conv) && 2374 if (pidgin_conv_window_is_active_conversation(conv) &&
4410 g_signal_connect(G_OBJECT(event_box), "button_press_event", 4422 g_signal_connect(G_OBJECT(event_box), "button_press_event",
4411 G_CALLBACK(infopane_press_cb), gtkconv); 4423 G_CALLBACK(infopane_press_cb), gtkconv);
4412 4424
4413 4425
4414 gtkconv->infopane = gtk_cell_view_new(); 4426 gtkconv->infopane = gtk_cell_view_new();
4415 gtkconv->infopane_model = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING); 4427 gtkconv->infopane_model = gtk_list_store_new(CONV_NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, GDK_TYPE_PIXBUF);
4416 gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane), 4428 gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane),
4417 GTK_TREE_MODEL(gtkconv->infopane_model)); 4429 GTK_TREE_MODEL(gtkconv->infopane_model));
4418 gtk_list_store_append(gtkconv->infopane_model, &(gtkconv->infopane_iter)); 4430 gtk_list_store_append(gtkconv->infopane_model, &(gtkconv->infopane_iter));
4419 gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), gtkconv->infopane, TRUE, TRUE, 0); 4431 gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), gtkconv->infopane, TRUE, TRUE, 0);
4420 path = gtk_tree_path_new_from_string("0"); 4432 path = gtk_tree_path_new_from_string("0");
4423 gtk_widget_set_size_request(gtkconv->infopane, -1, 32); 4435 gtk_widget_set_size_request(gtkconv->infopane, -1, 32);
4424 gtk_widget_show(gtkconv->infopane); 4436 gtk_widget_show(gtkconv->infopane);
4425 4437
4426 rend = gtk_cell_renderer_pixbuf_new(); 4438 rend = gtk_cell_renderer_pixbuf_new();
4427 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, FALSE); 4439 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, FALSE);
4428 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "pixbuf", ICON_COLUMN, NULL); 4440 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "pixbuf", CONV_ICON_COLUMN, NULL);
4429 g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL); 4441 g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL);
4430 4442
4431 rend = gtk_cell_renderer_text_new(); 4443 rend = gtk_cell_renderer_text_new();
4432 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, TRUE); 4444 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, TRUE);
4433 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "markup", TEXT_COLUMN, NULL); 4445 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "markup", CONV_TEXT_COLUMN, NULL);
4434 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); 4446 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL);
4435 4447
4436 #if GTK_CHECK_VERSION(2, 6, 0) 4448 #if GTK_CHECK_VERSION(2, 6, 0)
4437 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); 4449 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
4438 #endif 4450 #endif
4451
4452 rend = gtk_cell_renderer_pixbuf_new();
4453 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, FALSE);
4454 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "pixbuf", CONV_EMBLEM_COLUMN, NULL);
4455 g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL);
4439 4456
4440 /* Setup the gtkimhtml widget */ 4457 /* Setup the gtkimhtml widget */
4441 frame = pidgin_create_imhtml(FALSE, &gtkconv->imhtml, NULL, &imhtml_sw); 4458 frame = pidgin_create_imhtml(FALSE, &gtkconv->imhtml, NULL, &imhtml_sw);
4442 if (chat) { 4459 if (chat) {
4443 GtkWidget *hpaned; 4460 GtkWidget *hpaned;
6197 topic ? "\n" : "", 6214 topic ? "\n" : "",
6198 pidgin_get_dim_grey_string(gtkconv->infopane), 6215 pidgin_get_dim_grey_string(gtkconv->infopane),
6199 topic ? topic : ""); 6216 topic ? topic : "");
6200 } 6217 }
6201 gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter), 6218 gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter),
6202 TEXT_COLUMN, markup, -1); 6219 CONV_TEXT_COLUMN, markup, -1);
6203 6220
6204 if (title != markup) 6221 if (title != markup)
6205 g_free(markup); 6222 g_free(markup);
6206 6223
6207 *style = '\0'; 6224 *style = '\0';
7616 static gboolean 7633 static gboolean
7617 infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv) 7634 infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv)
7618 { 7635 {
7619 int nb_x, nb_y; 7636 int nb_x, nb_y;
7620 7637
7621 if (e->button != 1 || e->type != GDK_BUTTON_PRESS) 7638 if (e->type != GDK_BUTTON_PRESS)
7622 return FALSE; 7639 return FALSE;
7623 7640
7641 if (e->button == 3) {
7642 /* Right click was pressed. Popup the Send To menu. */
7643 GtkWidget *menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(gtkconv->win->menu.send_to));
7644 if (menu)
7645 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time);
7646 else
7647 return FALSE;
7648 return TRUE;
7649 } else if (e->button != 1) {
7650 return FALSE;
7651 }
7652
7624 if (gtkconv->win->in_drag) { 7653 if (gtkconv->win->in_drag) {
7625 purple_debug(PURPLE_DEBUG_WARNING, "gtkconv", 7654 purple_debug(PURPLE_DEBUG_WARNING, "gtkconv",
7626 "Already in the middle of a window drag at tab_press_cb\n"); 7655 "Already in the middle of a window drag at tab_press_cb\n");
7627 return TRUE; 7656 return TRUE;
7628 } 7657 }
7629 7658
7630 gtkconv->win->in_predrag = TRUE; 7659 gtkconv->win->in_predrag = TRUE;
7631 gtkconv->win->drag_tab = gtk_notebook_page_num(GTK_NOTEBOOK(gtkconv->win->notebook), gtkconv->tab_cont); 7660 gtkconv->win->drag_tab = gtk_notebook_page_num(GTK_NOTEBOOK(gtkconv->win->notebook), gtkconv->tab_cont);
7632 7661
7633 gdk_window_get_origin(gtkconv->infopane_hbox->window, &nb_x, &nb_y); 7662 gdk_window_get_origin(gtkconv->infopane_hbox->window, &nb_x, &nb_y);
7634 7663
7635 gtkconv->win->drag_min_x = gtkconv->infopane_hbox->allocation.x + nb_x; 7664 gtkconv->win->drag_min_x = gtkconv->infopane_hbox->allocation.x + nb_x;
7636 gtkconv->win->drag_min_y = gtkconv->infopane_hbox->allocation.y + nb_y; 7665 gtkconv->win->drag_min_y = gtkconv->infopane_hbox->allocation.y + nb_y;
7637 gtkconv->win->drag_max_x = gtkconv->infopane_hbox->allocation.width + gtkconv->win->drag_min_x; 7666 gtkconv->win->drag_max_x = gtkconv->infopane_hbox->allocation.width + gtkconv->win->drag_min_x;
7638 gtkconv->win->drag_max_y = gtkconv->infopane_hbox->allocation.height + gtkconv->win->drag_min_y; 7667 gtkconv->win->drag_max_y = gtkconv->infopane_hbox->allocation.height + gtkconv->win->drag_min_y;
7639
7640 7668
7641 /* Connect the new motion signals. */ 7669 /* Connect the new motion signals. */
7642 gtkconv->win->drag_motion_signal = 7670 gtkconv->win->drag_motion_signal =
7643 g_signal_connect(G_OBJECT(gtkconv->win->notebook), "motion_notify_event", 7671 g_signal_connect(G_OBJECT(gtkconv->win->notebook), "motion_notify_event",
7644 G_CALLBACK(notebook_motion_cb), gtkconv->win); 7672 G_CALLBACK(notebook_motion_cb), gtkconv->win);
7645 7673
7646 gtkconv->win->drag_leave_signal = 7674 gtkconv->win->drag_leave_signal =
7647 g_signal_connect(G_OBJECT(gtkconv->win->notebook), "leave_notify_event", 7675 g_signal_connect(G_OBJECT(gtkconv->win->notebook), "leave_notify_event",
7648 G_CALLBACK(notebook_leave_cb), gtkconv->win); 7676 G_CALLBACK(notebook_leave_cb), gtkconv->win);
7649 7677
7650 return FALSE; 7678 return FALSE;
7651 7679
7652 } 7680 }
7653 7681

mercurial