From c06b4c1da389eac6c36bdeb972a3be06d2ee230e Mon Sep 17 00:00:00 2001 From: bobi32 Date: Fri, 7 Apr 2017 11:12:49 +0200 Subject: [PATCH 1/2] Fixes #60: Allowing typesetter to be specified from first line --- src/configfile.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/configfile.c b/src/configfile.c index 69de7eba..5e51c54f 100644 --- a/src/configfile.c +++ b/src/configfile.c @@ -40,6 +40,8 @@ #include "environment.h" #include "utils.h" +extern Gummi* gummi; + static gchar* config_filename = 0; static slist* config_head = 0; @@ -170,6 +172,28 @@ void config_set_default (void) { * if (config_get_value("parameter_name")) {...} */ const gchar* config_get_value (const gchar* term) { +// Tries and gets the typesetter from the first line of the document. + GuTabContext* tc; + GtkSourceBuffer* buffer; +// Checks that nothing is NULL on the road towards the editor buffer + if (term && STR_EQU(term, "typesetter") && + gummi && gummi->tabmanager && g_tabs && + (tc = g_list_nth_data(g_tabs, tabmanagergui_get_current_page())) && + tc->editor && (buffer = tc->editor->buffer)) { + // Gets head-of-file and end-of-first-line indices + gchar* ts_prefix = "%!TYPESETTER"; + GtkTextIter start, end; + gtk_text_buffer_get_start_iter(buffer, &start); + gtk_text_buffer_get_iter_at_line(buffer, &end, 1); + gchar* first_line = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer), + &start, &end, TRUE); + // Return typesetter value if prefix is matched + if (first_line && + strncmp(ts_prefix, first_line, strlen(ts_prefix)) == 0 && + (first_line = strtok(first_line, " \t\n\r"))) + return strtok(NULL, " \t\n\r"); + } // if + gchar* ret = NULL; slist* index = slist_find (config_head, term, FALSE, TRUE); From d9435d61c4a32cc56dd3648e41e476a5308d7b35 Mon Sep 17 00:00:00 2001 From: bobi32 Date: Tue, 11 Apr 2017 11:05:49 +0200 Subject: [PATCH 2/2] Fixes #62: consistent search cycling and highlighting behavior when wholeword is toggled --- src/editor.c | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/editor.c b/src/editor.c index 434c8a2b..a7be6713 100644 --- a/src/editor.c +++ b/src/editor.c @@ -549,16 +549,18 @@ void editor_apply_searchtag (GuEditor* ec) { gtk_text_tag_table_add (ec->editortags, ec->searchtag); while (TRUE) { - ret = gtk_source_iter_forward_search (&start, ec->term, - (ec->matchcase? 0: GTK_SOURCE_SEARCH_CASE_INSENSITIVE), - &mstart, &mend, NULL); - - if (ret && (!ec->wholeword || (ec->wholeword - && gtk_text_iter_starts_word (&mstart) - && gtk_text_iter_ends_word (&mend)))) { + do { + ret = gtk_source_iter_forward_search (&start, ec->term, + (ec->matchcase? 0: GTK_SOURCE_SEARCH_CASE_INSENSITIVE), + &mstart, &mend, NULL); + start = mend; + } while (ec->wholeword && ret && (!gtk_text_iter_starts_word(&mstart) || + !gtk_text_iter_ends_word(&mend))); + + if (ret) { gtk_text_buffer_apply_tag (ec_buffer, ec->searchtag, &mstart, &mend); - start = mend; +// start = mend; } else break; } } @@ -568,21 +570,23 @@ void editor_search_next (GuEditor* ec, gboolean inverse) { gboolean ret = FALSE, response = FALSE; editor_get_current_iter (ec, ¤t); - - if (ec->backwards ^ inverse) { - ret = gtk_source_iter_backward_search (¤t, ec->term, - (ec->matchcase? 0: GTK_SOURCE_SEARCH_CASE_INSENSITIVE), - &mstart, &mend, NULL); - } else { - gtk_text_iter_forward_chars (¤t, strlen (ec->term)); - ret = gtk_source_iter_forward_search (¤t, ec->term, - (ec->matchcase? 0: GTK_SOURCE_SEARCH_CASE_INSENSITIVE), - &mstart, &mend, NULL); - } - - if (ret && (!ec->wholeword || (ec->wholeword - && gtk_text_iter_starts_word (&mstart) - && gtk_text_iter_ends_word (&mend)))) { + + do { + if (ec->backwards ^ inverse) { + ret = gtk_source_iter_backward_search (¤t, ec->term, + (ec->matchcase? 0: GTK_SOURCE_SEARCH_CASE_INSENSITIVE), + &mstart, &mend, NULL); + } else { + gtk_text_iter_forward_chars (¤t, strlen (ec->term)); + ret = gtk_source_iter_forward_search (¤t, ec->term, + (ec->matchcase? 0: GTK_SOURCE_SEARCH_CASE_INSENSITIVE), + &mstart, &mend, NULL); + } + current = mend; + } while (ec->wholeword && ret && (!gtk_text_iter_starts_word(&mstart) || + !gtk_text_iter_ends_word(&mend))); + + if (ret) { gtk_text_buffer_select_range (ec_buffer, &mstart, &mend); editor_scroll_to_cursor (ec); }