qulogic/talkatu

Parents e4e8d26ff8d0
Children 6dca5ae8b091
Start moving the link to an anchor, might not be a good idea
--- 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;
GtkTextIter insert;
- 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),
- &insert,
- display,
- url
- );
+ 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
- * over a link.
- */
- 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)
/******************************************************************************
- * Helpers
- *****************************************************************************/
-static const gchar *
-talkatu_view_url_from_iter(TalkatuView *view, GtkTextIter *iter) {
- TalkatuViewPrivate *priv = talkatu_view_get_instance_private(view);
- GSList *tags = NULL, *tag = NULL;
- gchar *url = NULL;
-
- if(priv->anchor_tag == NULL) {
- return NULL;
- }
-
- if(!gtk_text_iter_has_tag(iter, priv->anchor_tag)) {
- return NULL;
- }
-
- tags = gtk_text_iter_get_tags(iter);
- for(tag = tags; tag; tag = tag->next) {
- url = g_object_get_data(
- G_OBJECT(tag->data),
- TALKATU_BUFFER_LINK_TARGET_ATTRIBUTE
- );
-
- if(url != NULL) {
- break;
- }
- }
-
- g_slist_free(tags);
-
- return url;
-}
-
-static void
-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.
- */
-static void
-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 */
- if(priv->anchor_tag) {
- 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);
-
- if(anchor_tag) {
- priv->anchor_tag = g_object_ref(anchor_tag);
- }
- }
- }
-}
-
-/******************************************************************************
* Callbacks
*****************************************************************************/
static void
@@ -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 @@
}
}
-static void
-talkatu_view_left_button_release_event(GtkWidget *widget, GdkEventButton *event) {
- GtkTextIter iter;
- gint x = 0, y = 0;
-
- /* make sure the pointer is still within the widget */
- gtk_text_view_window_to_buffer_coords(
- GTK_TEXT_VIEW(widget),
- GTK_TEXT_WINDOW_WIDGET,
- event->x,
- event->y,
- &x,
- &y
- );
-
- /* make sure the x co-ordinate is within the widget */
- if(x < 0 || x > gtk_widget_get_allocated_width(widget)) {
- return;
- }
-
- /* make sure the y co-ordinate is within the widget */
- if(y < 0 || y > gtk_widget_get_allocated_height(widget)) {
- return;
- }
-
- /* 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);
-
- if(url != NULL) {
- g_signal_emit(
- widget,
- signals[SIG_OPEN_URL],
- 0,
- url
- );
- }
- }
-}
-
-static gboolean
-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)) {
- GtkTextIter iter;
- gint x, y;
-
- gtk_text_view_window_to_buffer_coords(
- GTK_TEXT_VIEW(widget),
- GTK_TEXT_WINDOW_WIDGET,
- event->x,
- event->y,
- &x,
- &y
- );
-
- /* 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);
-}
-
-static gboolean
-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);
-}
-
-static gboolean
-talkatu_view_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) {
- GtkTextIter iter;
- gint x = 0, y = 0;
-
- /* convert the pointer coordinates into widget coordinates */
- gtk_text_view_window_to_buffer_coords(
- GTK_TEXT_VIEW(widget),
- GTK_TEXT_WINDOW_WIDGET,
- event->x,
- event->y,
- &x,
- &y
- );
-
- /* 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(priv->anchor_tag) {
- if(gtk_text_iter_has_tag(&iter, priv->anchor_tag)) {
- gdk_window_set_cursor(window, priv->cursor_hand);
- } else {
- gdk_window_set_cursor(window, priv->cursor_normal);
- }
- }
- }
-
- return TRUE;
-}
-
static gboolean
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++);
gtk_widget_show(item);
}
-
- /* 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);
-
- if(url != NULL) {
- 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_OBJECT(item),
- "activate",
- G_CALLBACK(talkatu_view_open_url_cb),
- open_link_data
- );
- gtk_menu_shell_insert(GTK_MENU_SHELL(popup), item, pos++);
- gtk_widget_show(item);
-
- item = gtk_menu_item_new_with_label(_("Copy link address"));
- g_signal_connect_after(
- G_OBJECT(item),
- "activate",
- G_CALLBACK(talkatu_view_copy_url_cb),
- (gpointer)url
- );
- gtk_menu_shell_insert(GTK_MENU_SHELL(popup), item, pos++);
- gtk_widget_show(item);
-
- item = gtk_separator_menu_item_new();
- gtk_menu_shell_insert(GTK_MENU_SHELL(popup), item, pos++);
- gtk_widget_show(item);
- }
- }
}
/******************************************************************************
@@ -519,9 +280,6 @@
G_CALLBACK(talkatu_view_populate_popup_cb),
NULL
);
-
- /* cache the pointer cursors */
- talkatu_view_cache_cursors(view);
}
static void
@@ -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 */