comparison src/gtkconv.c @ 12939:7f633dd625a9

[gaim-migrate @ 15292] SF Patch # from Levi Bard with changes by Sadrul Levi says: " This patch adds anchors to the conversation history so that you can scroll up to the last thing a person said by middle-clicking his nick in the chatter list." Sadrul added a right-click menu item. I modified the text marks to be of the form user:SCREENNAME to make sure we don't end up with any conflicts with other text marks. committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Thu, 19 Jan 2006 06:30:09 +0000
parents 3bf3f489b64b
children 614ab5ffc6f9
comparison
equal deleted inserted replaced
12938:56129c18aa2b 12939:7f633dd625a9
1524 gaim_blist_request_add_buddy(account, name, NULL, NULL); 1524 gaim_blist_request_add_buddy(account, name, NULL, NULL);
1525 1525
1526 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); 1526 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry);
1527 } 1527 }
1528 1528
1529 static GtkTextMark *
1530 get_mark_for_user(GaimGtkConversation *gtkconv, const char *who)
1531 {
1532 GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->imhtml));
1533 char *tmp = g_strconcat("user:", who, NULL);
1534 GtkTextMark *mark = gtk_text_buffer_get_mark(buf, tmp);
1535
1536 g_free(tmp);
1537 return mark;
1538 }
1539
1540 static void
1541 menu_last_said_cb(GtkWidget *w, GaimGtkConversation *gtkconv)
1542 {
1543 GtkTextMark *mark;
1544 const char *who;
1545
1546 who = g_object_get_data(G_OBJECT(w), "user_data");
1547 mark = get_mark_for_user(gtkconv, who);
1548
1549 if (mark != NULL)
1550 gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(gtkconv->imhtml), mark, 0.1, FALSE, 0, 0);
1551 else
1552 g_return_if_reached();
1553 }
1554
1529 static GtkWidget * 1555 static GtkWidget *
1530 create_chat_menu(GaimConversation *conv, const char *who, 1556 create_chat_menu(GaimConversation *conv, const char *who,
1531 GaimPluginProtocolInfo *prpl_info, GaimConnection *gc) 1557 GaimPluginProtocolInfo *prpl_info, GaimConnection *gc)
1532 { 1558 {
1533 static GtkWidget *menu = NULL; 1559 static GtkWidget *menu = NULL;
1588 else 1614 else
1589 button = gaim_new_item_from_stock(menu, _("Add"), GTK_STOCK_ADD, 1615 button = gaim_new_item_from_stock(menu, _("Add"), GTK_STOCK_ADD,
1590 G_CALLBACK(menu_chat_add_remove_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); 1616 G_CALLBACK(menu_chat_add_remove_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL);
1591 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free); 1617 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free);
1592 } 1618 }
1619
1620 button = gaim_new_item_from_stock(menu, _("Last said"), GTK_STOCK_INDEX,
1621 G_CALLBACK(menu_last_said_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL);
1622 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free);
1623 if (!get_mark_for_user(GAIM_GTK_CONVERSATION(conv), who))
1624 gtk_widget_set_sensitive(button, FALSE);
1593 1625
1594 return menu; 1626 return menu;
1595 } 1627 }
1596 1628
1597 1629
1671 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path); 1703 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path);
1672 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &who, -1); 1704 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &who, -1);
1673 1705
1674 if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { 1706 if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) {
1675 chat_do_im(gtkconv, who); 1707 chat_do_im(gtkconv, who);
1708 } else if (event->button == 2 && event->type == GDK_BUTTON_PRESS) {
1709 /* Move to user's anchor */
1710 GtkTextMark *mark = get_mark_for_user(gtkconv, who);
1711
1712 if(mark != NULL)
1713 gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(gtkconv->imhtml), mark, 0.1, FALSE, 0, 0);
1676 } else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { 1714 } else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) {
1677 GtkWidget *menu = create_chat_menu (conv, who, prpl_info, gc); 1715 GtkWidget *menu = create_chat_menu (conv, who, prpl_info, gc);
1678 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 1716 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
1679 event->button, event->time); 1717 event->button, event->time);
1680 } 1718 }
4618 4656
4619 gtk_text_buffer_get_start_iter(text_buffer, &start); 4657 gtk_text_buffer_get_start_iter(text_buffer, &start);
4620 gtk_text_buffer_get_iter_at_line(text_buffer, &end, 4658 gtk_text_buffer_get_iter_at_line(text_buffer, &end,
4621 (line_count - max_scrollback_lines)); 4659 (line_count - max_scrollback_lines));
4622 gtk_imhtml_delete(GTK_IMHTML(gtkconv->imhtml), &start, &end); 4660 gtk_imhtml_delete(GTK_IMHTML(gtkconv->imhtml), &start, &end);
4661 }
4662
4663 if (type == GAIM_CONV_TYPE_CHAT)
4664 {
4665 /* Create anchor for user */
4666 GtkTextIter iter;
4667 char *tmp = g_strconcat("user:", name, NULL);
4668
4669 gtk_text_buffer_get_end_iter(gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->imhtml)), &iter);
4670 gtk_text_buffer_create_mark(gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->imhtml)),
4671 tmp, &iter, TRUE);
4672 g_free(tmp);
4623 } 4673 }
4624 4674
4625 if (gtk_text_buffer_get_char_count(gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->imhtml)))) 4675 if (gtk_text_buffer_get_char_count(gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->imhtml))))
4626 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), "<BR>", gtk_font_options_all); 4676 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), "<BR>", gtk_font_options_all);
4627 4677