--- a/talkatu/talkatuaction.c Mon Aug 20 20:23:21 2018 -0500
+++ b/talkatu/talkatuaction.c Tue Aug 21 20:12:02 2018 -0500
@@ -154,24 +154,25 @@
GtkWidget *link_dialog = talkatu_link_dialog_new();
if(gtk_dialog_run(GTK_DIALOG(link_dialog)) == GTK_RESPONSE_ACCEPT) {
+ GtkTextChildAnchor *anchor = NULL; GtkTextMark *insert_mark = NULL;
- gchar *url = NULL, *display = NULL;
+ gchar *url = NULL, *label = NULL; + if(gtk_text_buffer_get_has_selection(buffer)) { + gtk_text_buffer_delete_selection(buffer, TRUE, TRUE); insert_mark = gtk_text_buffer_get_insert(buffer);
gtk_text_buffer_get_iter_at_mark(buffer, &insert, insert_mark);
- url = talkatu_link_dialog_get_url(TALKATU_LINK_DIALOG(link_dialog));
- display = talkatu_link_dialog_get_display_text(TALKATU_LINK_DIALOG(link_dialog));
+ anchor = gtk_text_buffer_create_child_anchor(buffer, &insert); - talkatu_buffer_insert_link(
- TALKATU_BUFFER(buffer),
+ url = talkatu_link_dialog_get_url(TALKATU_LINK_DIALOG(link_dialog)); + g_object_set_data_full(G_OBJECT(anchor), "talkatu-url", url, g_free); - talkatu_action_toggle(action, parameter, user_data);
+ label = talkatu_link_dialog_get_display_text(TALKATU_LINK_DIALOG(link_dialog)); + g_object_set_data_full(G_OBJECT(anchor), "talkatu-url-label", label, g_free); gtk_widget_destroy(link_dialog);
--- a/talkatu/talkatuview.c Mon Aug 20 20:23:21 2018 -0500
+++ b/talkatu/talkatuview.c Tue Aug 21 20:12:02 2018 -0500
@@ -53,17 +53,6 @@
TalkatuViewSendBinding send_binding;
GspellTextView *gspell_view;
- /* a cached version of the anchor tag from the tag table which is used to
- * avoid excessive lookups for this specific tag.
- GtkTextTag *anchor_tag;
- /* these are cached copies of GdkCursors that are used when the user hovers
- GdkCursor *cursor_normal;
- GdkCursor *cursor_hand;
/* this mark is used to keep track of our context for the context menu. It
* is updated via cursor-moved and button-press callbacks.
@@ -94,88 +83,6 @@
G_DEFINE_TYPE_WITH_PRIVATE(TalkatuView, talkatu_view, GTK_TYPE_TEXT_VIEW)
/******************************************************************************
- *****************************************************************************/
-talkatu_view_url_from_iter(TalkatuView *view, GtkTextIter *iter) {
- TalkatuViewPrivate *priv = talkatu_view_get_instance_private(view);
- GSList *tags = NULL, *tag = NULL;
- if(priv->anchor_tag == NULL) {
- if(!gtk_text_iter_has_tag(iter, priv->anchor_tag)) {
- tags = gtk_text_iter_get_tags(iter);
- for(tag = tags; tag; tag = tag->next) {
- url = g_object_get_data(
- TALKATU_BUFFER_LINK_TARGET_ATTRIBUTE
-talkatu_view_cache_cursors(TalkatuView *view) {
- TalkatuViewPrivate *priv = talkatu_view_get_instance_private(view);
- GdkDisplay *display = gtk_widget_get_display(GTK_WIDGET(view));
- if(priv->cursor_normal) {
- g_object_unref(G_OBJECT(priv->cursor_normal));
- priv->cursor_normal = gdk_cursor_new_from_name(display, "text");
- if(priv->cursor_hand) {
- g_object_unref(G_OBJECT(priv->cursor_hand));
- priv->cursor_hand = gdk_cursor_new_from_name(display, "pointer");
- * talkatu_view_cache_anchor_tag:
- * @view: The #TalkatuView
- * Caches the anchor tag if there is one in the tag table for the buffer thats
- * connected to this text view.
-talkatu_view_cache_anchor_tag(TalkatuView *view) {
- TalkatuViewPrivate *priv = talkatu_view_get_instance_private(view);
- GtkTextBuffer *buffer = NULL;
- GtkTextTagTable *table = NULL;
- /* invalidate the current cache */
- g_object_unref(priv->anchor_tag);
- priv->anchor_tag = NULL;
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
- if(GTK_IS_TEXT_BUFFER(buffer)) {
- table = gtk_text_buffer_get_tag_table(buffer);
- if(GTK_IS_TEXT_TAG_TABLE(table)) {
- GtkTextTag *anchor_tag = gtk_text_tag_table_lookup(table, TALKATU_TAG_ANCHOR);
- priv->anchor_tag = g_object_ref(anchor_tag);
-/******************************************************************************
*****************************************************************************/
@@ -192,8 +99,6 @@
priv->context_mark = gtk_text_buffer_create_mark(buffer, NULL, &start, TRUE);
gspell_text_view_basic_setup(priv->gspell_view);
- talkatu_view_cache_anchor_tag(TALKATU_VIEW(view));
/******************************************************************************
@@ -225,115 +130,6 @@
-talkatu_view_left_button_release_event(GtkWidget *widget, GdkEventButton *event) {
- /* make sure the pointer is still within the widget */
- gtk_text_view_window_to_buffer_coords(
- GTK_TEXT_WINDOW_WIDGET,
- /* make sure the x co-ordinate is within the widget */
- if(x < 0 || x > gtk_widget_get_allocated_width(widget)) {
- /* make sure the y co-ordinate is within the widget */
- if(y < 0 || y > gtk_widget_get_allocated_height(widget)) {
- /* now check if there is an iter where the pointer is */
- if(gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &iter, x, y)) {
- const gchar *url = talkatu_view_url_from_iter(TALKATU_VIEW(widget), &iter);
-talkatu_view_button_press_event(GtkWidget *widget, GdkEventButton *event) {
- TalkatuViewPrivate *priv = talkatu_view_get_instance_private(TALKATU_VIEW(widget));
- if(gdk_event_triggers_context_menu((GdkEvent *)event)) {
- gtk_text_view_window_to_buffer_coords(
- GTK_TEXT_WINDOW_WIDGET,
- /* now check if there is an iter where the pointer is */
- if(gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &iter, x, y)) {
- GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
- gtk_text_buffer_move_mark(buffer, priv->context_mark, &iter);
- return GTK_WIDGET_CLASS(talkatu_view_parent_class)->button_press_event(widget, event);
-talkatu_view_button_release_event(GtkWidget *widget, GdkEventButton *event) {
- if(event->button == GDK_BUTTON_PRIMARY) {
- talkatu_view_left_button_release_event(widget, event);
- return GTK_WIDGET_CLASS(talkatu_view_parent_class)->button_release_event(widget, event);
-talkatu_view_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) {
- /* convert the pointer coordinates into widget coordinates */
- gtk_text_view_window_to_buffer_coords(
- GTK_TEXT_WINDOW_WIDGET,
- /* get the iter at the pointers position */
- if(gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &iter, x, y)) {
- TalkatuViewPrivate *priv = talkatu_view_get_instance_private(TALKATU_VIEW(widget));
- GdkWindow *window = gtk_text_view_get_window(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_TEXT);
- if(gtk_text_iter_has_tag(&iter, priv->anchor_tag)) {
- gdk_window_set_cursor(window, priv->cursor_hand);
- gdk_window_set_cursor(window, priv->cursor_normal);
talkatu_view_popup_menu(GtkWidget *widget) {
TalkatuViewPrivate *priv = talkatu_view_get_instance_private(TALKATU_VIEW(widget));
@@ -419,41 +215,6 @@
gtk_menu_shell_insert(GTK_MENU_SHELL(popup), item , pos++);
- /* check if we're in a link tag, and if so add the link items */
- if(gtk_text_iter_has_tag(&iter, priv->anchor_tag)) {
- const gchar *url = talkatu_view_url_from_iter(TALKATU_VIEW(view), &iter);
- TalkatuViewOpenLinkData *open_link_data = g_slice_new(TalkatuViewOpenLinkData);
- open_link_data->view = TALKATU_VIEW(view);
- open_link_data->url = url;
- item = gtk_menu_item_new_with_label(_("Open link"));
- g_signal_connect_after(
- G_CALLBACK(talkatu_view_open_url_cb),
- gtk_menu_shell_insert(GTK_MENU_SHELL(popup), item, pos++);
- item = gtk_menu_item_new_with_label(_("Copy link address"));
- g_signal_connect_after(
- G_CALLBACK(talkatu_view_copy_url_cb),
- gtk_menu_shell_insert(GTK_MENU_SHELL(popup), item, pos++);
- item = gtk_separator_menu_item_new();
- gtk_menu_shell_insert(GTK_MENU_SHELL(popup), item, pos++);
/******************************************************************************
@@ -519,9 +280,6 @@
G_CALLBACK(talkatu_view_populate_popup_cb),
- /* cache the pointer cursors */
- talkatu_view_cache_cursors(view);
@@ -533,9 +291,6 @@
obj_class->get_property = talkatu_view_get_property;
obj_class->set_property = talkatu_view_set_property;
- widget_class->button_press_event = talkatu_view_button_press_event;
- widget_class->button_release_event = talkatu_view_button_release_event;
- widget_class->motion_notify_event = talkatu_view_motion_notify_event;
widget_class->popup_menu = talkatu_view_popup_menu;
/* add our default signal handlers */