Mercurial > pidgin.yaz
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 |