X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=libchimara%2Fhyperlink.c;h=4545f9993a02b45a5e928aa1bd007129577893b6;hb=refs%2Fheads%2Fgtk3;hp=aa9f426e353b7ed0039367a5451da5fee909a578;hpb=6a5f37b58f4e1b7ff1063864eded5661b080b2e5;p=projects%2Fchimara%2Fchimara.git diff --git a/libchimara/hyperlink.c b/libchimara/hyperlink.c index aa9f426..4545f99 100644 --- a/libchimara/hyperlink.c +++ b/libchimara/hyperlink.c @@ -1,8 +1,10 @@ +#include +#include #include "hyperlink.h" #include "chimara-glk-private.h" #include "magic.h" -extern GPrivate *glk_data_key; +extern GPrivate glk_data_key; /** * glk_set_hyperlink: @@ -14,7 +16,7 @@ extern GPrivate *glk_data_key; void glk_set_hyperlink(glui32 linkval) { - ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key); + ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key); g_return_if_fail(glk_data->current_stream != NULL); glk_set_hyperlink_stream(glk_data->current_stream, linkval); } @@ -75,7 +77,8 @@ glk_set_hyperlink_stream(strid_t str, glui32 linkval) new_hyperlink->value = linkval; new_hyperlink->tag = gtk_text_tag_new(NULL); new_hyperlink->event_handler = g_signal_connect( new_hyperlink->tag, "event", G_CALLBACK(on_hyperlink_clicked), new_hyperlink ); - g_signal_handler_block(new_hyperlink->tag, new_hyperlink->event_handler); + if(!str->window->hyperlink_event_requested) + g_signal_handler_block(new_hyperlink->tag, new_hyperlink->event_handler); new_hyperlink->window = str->window; /* Add the new tag to the tag table of the textbuffer */ @@ -137,6 +140,12 @@ glk_request_hyperlink_event(winid_t win) g_return_if_fail(win != NULL); g_return_if_fail(win->type == wintype_TextBuffer || win->type == wintype_TextGrid); + if(win->hyperlink_event_requested) { + WARNING(_("Tried to request a hyperlink event on a window that already had a hyperlink request")); + return; + } + + win->hyperlink_event_requested = TRUE; g_hash_table_foreach(win->hyperlinks, hyperlink_unblock_event_handler, NULL); } @@ -155,6 +164,12 @@ glk_cancel_hyperlink_event(winid_t win) g_return_if_fail(win != NULL); g_return_if_fail(win->type == wintype_TextBuffer || win->type == wintype_TextGrid); + if(!win->hyperlink_event_requested) { + WARNING(_("Tried to cancel a nonexistent hyperlink request")); + return; + } + + win->hyperlink_event_requested = FALSE; g_hash_table_foreach(win->hyperlinks, hyperlink_block_event_handler, NULL); } @@ -165,6 +180,8 @@ on_hyperlink_clicked(GtkTextTag *tag, GObject *object, GdkEvent *event, GtkTextI g_assert(glk); if(event->type == GDK_BUTTON_PRESS) { + link->window->hyperlink_event_requested = FALSE; + g_hash_table_foreach(link->window->hyperlinks, hyperlink_block_event_handler, NULL); event_throw(glk, evtype_Hyperlink, link->window, link->value, 0); }