Control: tags - moreinfo

Hi Paul,

On 27.04.2023 10:58, Paul Gevers wrote:
Your debdiff was so big that the mail didn't even reach the list.

60 files changed, 7341 insertions(+), 6240 deletions(-)

As you can see in a diff from 0.8.1 to 0.8.3 [1] also generated UI files and translations changed which makes the debdiff between both packages huge. I created a diff for the upstream changes in the src folder between 0.8.1 and 0.8.3 which should be less bloated and attach it to this email.

Best regards,
Martin

[1] https://github.com/alexandervdm/gummi/compare/0.8.1...0.8.3#files_bucket
diff --git a/Makefile b/Makefile
index 8e8911b..930b1ed 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ TARGET=gummi
 OBJS = main.o gui/gui-main.o gui/gui-prefs.o gui/gui-menu.o gui/gui-search.o 
gui/gui-import.o gui/gui-preview.o gui/gui-tabmanager.o gui/gui-project.o 
gui/gui-snippets.o gui/gui-infoscreen.o compile/texlive.o compile/rubber.o 
compile/latexmk.o motion.o external.o latex.o editor.o utils.o configfile.o 
iofunctions.o environment.o project.o importer.o tabmanager.o template.o 
biblio.o snippets.o signals.o
 
 
-CFLAGS=-g -Wall  -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED 
-DGSEAL_ENABLE -export-dynamic -I. `pkg-config --cflags --libs gtk+-3.0 
gthread-2.0 gtksourceview-3.0 cairo poppler-glib gtkspell3-3.0 synctex zlib` 
-lm -DUSE_SYNCTEX1 -DGUMMI_LOCALES="\"/usr/share/locale\"" 
-DGUMMI_DATA="\"$$PWD/../data\"" -DGUMMI_LIBS="\"$$PWD/../lib\""
+CFLAGS=-g -Wall -Wno-deprecated-declarations -DGDK_DISABLE_DEPRECATED 
-DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE -export-dynamic -I. `pkg-config 
--cflags --libs gtk+-3.0 gthread-2.0 gtksourceview-3.0 cairo poppler-glib 
gtkspell3-3.0 synctex zlib` -lm -DUSE_SYNCTEX2 
-DGUMMI_LOCALES="\"/usr/share/locale\"" -DGUMMI_DATA="\"$$PWD/../data\"" 
-DGUMMI_LIBS="\"$$PWD/../lib\""
 
 gummi: $(OBJS)
        $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)
diff --git a/configfile.c b/configfile.c
index fefda66..a6a338f 100644
--- a/configfile.c
+++ b/configfile.c
@@ -49,9 +49,11 @@ const gchar default_config[] =
 "mainwindow_max = false\n"
 "toolbar = true\n"
 "statusbar = true\n"
+"rightpane = true\n"
 "snippets = true\n"
 "[Editor]\n"
-"font = Monospace 14\n"
+"font_str = Monospace 14\n"
+"font_css = * { font-family: Monospace; font-size: 14px; }\n"
 "line_numbers = true\n"
 "highlighting = true\n"
 "textwrapping = true\n"
diff --git a/constants.h b/constants.h
index 0eeee30..439c0fa 100644
--- a/constants.h
+++ b/constants.h
@@ -35,7 +35,7 @@
 // Gummi defs:
 #define C_PACKAGE "gummi"
 #define C_PACKAGE_NAME "Gummi"
-#define C_PACKAGE_VERSION "0.8.1"
+#define C_PACKAGE_VERSION "0.8.3"
 #define C_PACKAGE_COMMENTS "Simple LaTeX Editor for GTK+"
 #define C_PACKAGE_COPYRIGHT "Copyright \xc2\xa9 2009\n\n"\
                             "Alexander van der Meij\n"\
@@ -94,7 +94,7 @@
 "Arabic: Hamad Mohammad\n" \
 "Brazilian-Portugese: Fernando Cruz, Alexandre Guimarães\n" \
 "Catalan: Marc Vinyals\n" \
-"Chinese (Simplified): Mathlab pass\n" \
+"Chinese (Simplified): Mathlab pass, yjwork-cn\n" \
 "Chinese (Traditional): Wei-Ning Huang\n" \
 "Czech: Přemysl Janouch\n" \
 "Danish: Jack Olsen\n" \
@@ -103,6 +103,7 @@
 "German: Thomas Niederprüm\n" \
 "Greek: Dimitris Leventeas\n" \
 "Hungarian: Balázs Meskó\n" \
+"Interlingue: OIS\n" \
 "Italian: Salvatore Vassallo\n" \
 "Polish: Hubert Kowalski\n" \
 "Portugese: Alexandre Guimarães\n" \
diff --git a/editor.c b/editor.c
index 5c91857..b97292b 100644
--- a/editor.c
+++ b/editor.c
@@ -190,7 +190,7 @@ void editor_fileinfo_update (GuEditor* ec, const gchar* 
filename) {
 
     // directory should exist, but if not create ~/.cache/gummi:
     if (!g_file_test (C_TMPDIR, G_FILE_TEST_IS_DIR)) {
-            slog (L_WARNING, ".cache directory does not exist, creating..\n");
+            slog (L_WARNING, "gummi cache directory does not exist, 
creating..\n");
             g_mkdir_with_parents (C_TMPDIR, DIR_PERMS);
     }
 
@@ -313,7 +313,7 @@ void editor_sourceview_config (GuEditor* ec) {
     const gchar* style_scheme = config_get_string ("Editor", "style_scheme");
     editor_set_style_scheme_by_id (ec, style_scheme);
 
-    editor_set_font (ec, config_get_string ("Editor", "font"));
+    editor_set_font (ec, config_get_string ("Editor", "font_css"));
 
     gtk_source_view_set_show_line_numbers (
                             GTK_SOURCE_VIEW (ec->view),
@@ -724,15 +724,8 @@ void editor_redo_change (GuEditor* ec) {
     }
 }
 
-void editor_set_font (GuEditor* ec, const gchar* font) {
-    // surely there has to be a better solution to transform
-    // a string like 'Monospace 12' into css syntax right..?
-    gchar** font_elems = g_strsplit (font, " ", BUFSIZ);
-    gchar* style = g_strdup_printf ("* { font: %spx '%s'; }",
-                                    font_elems[1], font_elems[0]);
-
-    gtk_css_provider_load_from_data (ec->css, style, -1, NULL);
-    g_free (style);
+void editor_set_font (GuEditor* ec, const gchar* font_css) {
+    gtk_css_provider_load_from_data (ec->css, font_css, -1, NULL);
 }
 
 
diff --git a/editor.h b/editor.h
index 2e42815..03a279a 100644
--- a/editor.h
+++ b/editor.h
@@ -105,7 +105,7 @@ void editor_scroll_to_cursor (GuEditor* ec);
 void editor_scroll_to_line (GuEditor* ec, gint line);
 void editor_undo_change (GuEditor* ec);
 void editor_redo_change (GuEditor* ec);
-void editor_set_font (GuEditor* ec, const gchar* font);
+void editor_set_font (GuEditor* ec, const gchar* font_css);
 void editor_set_style_scheme_by_id (GuEditor* ec, const gchar* id);
 void set_style_fg_bg (GObject* obj, GtkSourceStyleScheme* scheme,
                       gchar* styleName, gchar* defaultBG);
diff --git a/external.c b/external.c
index 60cafb0..900683a 100644
--- a/external.c
+++ b/external.c
@@ -34,8 +34,8 @@
 
 /* local functions */
 static gchar* get_version_output (const gchar* command, int linenr);
-static gchar* version_latexmk (const gchar* output);
-static gchar* version_rubber (const gchar* output);
+static gchar* version_latexmk (gchar* output);
+static gchar* version_rubber (gchar* output);
 
 
 static gdouble get_texlive_version (void);
@@ -80,16 +80,19 @@ gdouble external_version2 (ExternalProg program) {
 }
 
 gchar* external_version (const gchar* program) {
-    const gchar* getversion = g_strdup_printf("%s --version", program);
-    Tuple2 cmdgetv = utils_popen_r (getversion, NULL);
-    gchar* output = (gchar*)cmdgetv.second;
+    gchar* version_output;
+    gchar* result;
 
-    gchar* result = g_strdup ("Unknown, please report a bug");
+    const gchar* version_cmd = g_strdup_printf("%s --version", program);
+    Tuple2 cmdgetv = utils_popen_r (version_cmd, NULL);
+    version_output = (gchar*)cmdgetv.second;
 
-    if (output == NULL) return result;
-
-    gchar** lines = g_strsplit(output, "\n", BUFSIZ);
-    result = lines[0];
+    if (version_output == NULL || g_str_equal (version_output, "")) {
+        return g_strdup_printf("Unknown, please report a bug");
+    }
+    else {
+        result = g_strstrip (version_output);
+    }
 
     /* pdfTeX 3.1415926-1.40.10 (TeX Live 2009)
        pdfTeX 3.1415926-1.40.11-2.2 (TeX Live 2010)
@@ -101,7 +104,7 @@ gchar* external_version (const gchar* program) {
         result = version_rubber (result);
     }
     else if (STR_EQU (program, C_LATEXMK)) {
-        result = version_latexmk (lines[1]);
+        result = version_latexmk (result);
     }
 
     return result;
@@ -145,16 +148,20 @@ static gdouble get_texlive_version (void) {
     return version;
 }
 
-static gchar* version_rubber (const gchar* output) {
-    /* format: Rubber version: 1.1 */
-    gchar** version = g_strsplit (output, " ", BUFSIZ);
-    return version[2];
+static gchar* version_rubber (gchar* output) {
+    // format: Rubber version: 1.1
+    gchar** outarr = g_strsplit (output, " ", BUFSIZ);
+    gchar* version = g_strdup (outarr [g_strv_length(outarr) - 1]);
+
+    g_strfreev (outarr);
+    return version;
 }
 
-static gchar* version_latexmk (const gchar* output) {
-    /* latexmk --version seems to print the requested information after a \n
-       format: Latexmk, John Collins, 24 March 2011. Version 4.23a */
+static gchar* version_latexmk (gchar* output) {
+    // format: Latexmk, John Collins, 24 March 2011. Version 4.23a
+    gchar** outarr = g_strsplit (output, " ", BUFSIZ);
+    gchar* version = g_strdup (outarr [g_strv_length(outarr) - 1]);
 
-    gchar** version = g_strsplit (output, " ", BUFSIZ);
-    return version[7];
+    g_strfreev (outarr);
+    return version;
 }
diff --git a/gui/gui-main.c b/gui/gui-main.c
index 6d4c759..d5f9f71 100644
--- a/gui/gui-main.c
+++ b/gui/gui-main.c
@@ -107,7 +107,9 @@ GummiGui* gui_init (GtkBuilder* builder) {
     g->menu_toolbar =
         GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menu_toolbar"));
     g->menu_statusbar =
-        GTK_CHECK_MENU_ITEM(gtk_builder_get_object (builder, 
"menu_statusbar"));
+        GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, 
"menu_statusbar"));
+    g->menu_rightpane =
+        GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, 
"menu_rightpane"));
     g->statusid =
         gtk_statusbar_get_context_id (GTK_STATUSBAR (g->statusbar), "Gummi");
     g->recent[0] =
@@ -226,6 +228,14 @@ GummiGui* gui_init (GtkBuilder* builder) {
         gtk_widget_hide (GTK_WIDGET (g->statusbar));
     }
 
+    if (config_get_boolean ("Interface", "rightpane")) {
+        gtk_check_menu_item_set_active (g->menu_rightpane, TRUE);
+        gtk_widget_show (GTK_WIDGET (g->rightpane));
+    } else {
+        gtk_check_menu_item_set_active (g->menu_rightpane, FALSE);
+        gtk_widget_hide (GTK_WIDGET (g->rightpane));
+    }
+
     g->menu_autosync =
         GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, 
"menu_autosync"));
 
@@ -247,6 +257,11 @@ GummiGui* gui_init (GtkBuilder* builder) {
 }
 
 void gui_main (GtkBuilder* builder) {
+    #ifdef WIN32
+    // force win32 builds to use a native looking theme
+    g_object_set (gtk_settings_get_default(), "gtk-theme-name", "win32", NULL);
+    #endif
+
     gtk_builder_connect_signals (builder, NULL);
     gtk_widget_show_all (GTK_WIDGET (gui->mainwindow));
 
@@ -553,7 +568,8 @@ void on_template_rowitem_edited (GtkWidget* widget, gchar 
*path, gchar* filenm,
 
 G_MODULE_EXPORT
 void on_template_cursor_changed (GtkTreeView *tree, gpointer data) {
-    if (!gtk_tree_view_get_selection (tree) == 0) {
+
+       if (gtk_tree_view_get_selection (tree)) {
         gtk_widget_set_sensitive (gummi->templ->template_open, TRUE);
     }
 }
diff --git a/gui/gui-main.h b/gui/gui-main.h
index d492c55..6adec43 100644
--- a/gui/gui-main.h
+++ b/gui/gui-main.h
@@ -83,6 +83,7 @@ struct _GummiGui {
     GtkCheckMenuItem* menu_snippets;
     GtkCheckMenuItem* menu_toolbar;
     GtkCheckMenuItem* menu_statusbar;
+    GtkCheckMenuItem* menu_rightpane;
     GtkCheckMenuItem* menu_autosync;
     GtkMenuItem* recent[5];
     gint insens_widget_size;
diff --git a/gui/gui-menu.c b/gui/gui-menu.c
index 3834189..6ff46c9 100644
--- a/gui/gui-menu.c
+++ b/gui/gui-menu.c
@@ -179,6 +179,8 @@ gboolean on_menu_quit_activate (void) {
     gint length = g_list_length (gummi->tabmanager->tabs);
     int i = 0;
 
+    motion_pause_compile_thread (gummi->motion);
+
     for(i = 0; i < length; i++){
         gtk_notebook_set_current_page(gui->tabmanagergui->notebook, i);
         tabmanager_set_active_tab (i);
@@ -320,6 +322,19 @@ void on_menu_toolbar_toggled (GtkWidget *widget, void 
*user) {
     }
 }
 
+G_MODULE_EXPORT
+void on_menu_rightpane_toggled (GtkWidget *widget, void *user) {
+    if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget))) {
+        gtk_widget_show (GTK_WIDGET (gui->rightpane));
+        config_set_boolean ("Interface", "rightpane", TRUE);
+        gtk_toggle_tool_button_set_active (gui->previewgui->preview_pause, 
FALSE);
+    } else {
+        gtk_widget_hide (GTK_WIDGET (gui->rightpane));
+        config_set_boolean ("Interface", "rightpane", FALSE);
+        gtk_toggle_tool_button_set_active (gui->previewgui->preview_pause, 
TRUE);
+    }
+}
+
 G_MODULE_EXPORT
 void on_menu_fullscreen_toggled (GtkWidget *widget, void *user) {
     if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
diff --git a/gui/gui-menu.h b/gui/gui-menu.h
index 1f7bcce..5deb039 100644
--- a/gui/gui-menu.h
+++ b/gui/gui-menu.h
@@ -49,8 +49,4 @@ struct _GuMenuGui {
 GuMenuGui* menugui_init (GtkBuilder* builder);
 void on_menu_close_activate (GtkWidget *widget, void* user);
 
-#ifdef WIN32
-       void on_menu_donate_activate (GtkWidget *widget, void* user);
-#endif
-
 #endif /* __GUMMI_GUI_MENU_H__ */
diff --git a/gui/gui-prefs.c b/gui/gui-prefs.c
index ed63f79..172b708 100644
--- a/gui/gui-prefs.c
+++ b/gui/gui-prefs.c
@@ -149,9 +149,9 @@ GuPrefsGui* prefsgui_init (GtkWindow* mainwindow) {
 
     // list available languages
     if (g_file_test (
-        g_find_program_in_path("enchant-lsmod"), G_FILE_TEST_EXISTS)) {
+        g_find_program_in_path("enchant-lsmod-2"), G_FILE_TEST_EXISTS)) {
 
-        Tuple2 pret = utils_popen_r ("enchant-lsmod -list-dicts", NULL);
+        Tuple2 pret = utils_popen_r ("enchant-lsmod-2 -list-dicts", NULL);
         if (pret.second != NULL) {
             gchar** output = g_strsplit((gchar*)pret.second, "\n", BUFSIZ);
             gchar** elems = NULL;
@@ -247,8 +247,16 @@ static void set_tab_editor_settings (GuPrefsGui* prefs) {
 
 static void set_tab_fontcolor_settings (GuPrefsGui* prefs) {
     gtk_font_chooser_set_font (GTK_FONT_CHOOSER (prefs->editor_font),
-                               config_get_string ("Editor", "font"));
+                               config_get_string ("Editor", "font_str"));
     prefsgui_apply_style_scheme(prefs);
+
+    // set default font on all tabs
+    GList* tab = gummi->tabmanager->tabs;
+    while (tab) {
+        editor_set_font (GU_TAB_CONTEXT (tab->data)->editor,
+                         config_get_string ("Editor", "font_css"));
+        tab = g_list_next (tab);
+    }
 }
 
 static void set_tab_defaulttext_settings (GuPrefsGui* prefs) {
@@ -654,15 +662,24 @@ void on_cache_size_value_changed (GtkWidget* widget, 
void* user) {
 }
 
 G_MODULE_EXPORT
-void on_editor_font_set (GtkWidget* widget, void* user) {
-    gchar* font = gtk_font_chooser_get_font ( GTK_FONT_CHOOSER (widget));
-    GList* tab = gummi->tabmanager->tabs;
+void on_editor_font_change (GtkWidget* widget, void* user) {
+    PangoFontDescription* font_desc;
+    gchar* font_css;
+    gchar* font_str;
+
+    font_str = gtk_font_chooser_get_font ( GTK_FONT_CHOOSER (widget));
+    config_set_string ("Editor", "font_str", font_str);
+    slog (L_INFO, "setting font to %s\n", font_str);
+    g_free (font_str);
 
-    slog (L_INFO, "setting font to %s\n", font);
-    config_set_string ("Editor", "font", font);
+    font_desc = gtk_font_chooser_get_font_desc (GTK_FONT_CHOOSER (widget));
+    font_css  = utils_pango_font_desc_to_css (font_desc);
+    config_set_string ("Editor", "font_css", font_css);
 
+    // set new font on all tabs
+    GList* tab = gummi->tabmanager->tabs;
     while (tab) {
-        editor_set_font (GU_TAB_CONTEXT (tab->data)->editor, font);
+        editor_set_font (GU_TAB_CONTEXT (tab->data)->editor, font_css);
         tab = g_list_next (tab);
     }
 }
@@ -794,8 +811,9 @@ G_MODULE_EXPORT
 void on_styleschemes_treeview_cursor_changed (GtkTreeView* treeview, void* 
user) {
     gchar* id = NULL;
     gchar* name = NULL;
-    GList* tab = gummi->tabmanager->tabs;
+    GList* tab;
     GtkTreeIter iter;
+
     GtkTreeModel* model = GTK_TREE_MODEL (gtk_tree_view_get_model (treeview));
     GtkTreeSelection* selection = gtk_tree_view_get_selection (treeview);
 
diff --git a/gui/gui-prefs.h b/gui/gui-prefs.h
index 7d7b274..fc06db6 100644
--- a/gui/gui-prefs.h
+++ b/gui/gui-prefs.h
@@ -93,7 +93,7 @@ void on_tabwidth_value_changed (GtkWidget* widget, void* 
user);
 void on_configure_snippets_clicked (GtkWidget* widget, void* user);
 void on_autosave_value_changed (GtkWidget* widget, void* user);
 void on_compile_value_changed (GtkWidget* widget, void* user);
-void on_editor_font_set (GtkWidget* widget, void* user);
+void on_editor_font_change (GtkWidget* widget, void* user);
 void on_combo_typesetter_changed (GtkWidget* widget, void* user);
 void on_combo_language_changed (GtkComboBoxText* widget, void* user);
 void on_combo_compilescheme_changed (GtkWidget* widget, void* user);
diff --git a/gui/gui-preview.c b/gui/gui-preview.c
index ab39b81..e4d3ac6 100644
--- a/gui/gui-preview.c
+++ b/gui/gui-preview.c
@@ -141,9 +141,7 @@ static gboolean remove_page_rendering (GuPreviewGui* pc, 
gint page);
 
 // Functions for syncronizing editor and preview via SyncTeX
 static gboolean synctex_run_parser (GuPreviewGui* pc, GtkTextIter *sync_to, 
gchar* tex_file);
-#if HAVE_POPPLER_PAGE_GET_SELECTED_TEXT
 static void synctex_filter_results (GuPreviewGui* pc, GtkTextIter *sync_to);
-#endif
 static void synctex_scroll_to_node (GuPreviewGui* pc, SyncNode* node);
 static SyncNode* synctex_one_node_found (GuPreviewGui* pc);
 static void synctex_merge_nodes (GuPreviewGui* pc);
@@ -172,7 +170,10 @@ GuPreviewGui* previewgui_init (GtkBuilder * builder) {
     p->toolbar = GTK_WIDGET (gtk_builder_get_object (builder, 
"preview_toolbar"));
 
     p->combo_sizes =
-        GTK_COMBO_BOX (gtk_builder_get_object (builder, "combo_sizes"));
+        GTK_COMBO_BOX  (gtk_builder_get_object (builder, 
"combo_preview_size"));
+    p->model_sizes =
+        GTK_TREE_MODEL (gtk_builder_get_object (builder, 
"model_preview_size"));
+
     p->page_next = GTK_WIDGET (gtk_builder_get_object (builder, "page_next"));
     p->page_prev = GTK_WIDGET (gtk_builder_get_object (builder, "page_prev"));
     p->page_label = GTK_WIDGET (gtk_builder_get_object (builder, 
"page_label"));
@@ -547,8 +548,11 @@ gboolean on_document_compiled (gpointer data) {
             previewgui_start_errormode (pc, "compile_error");
         } else {
             if (!pc->uri) {
-
-                gchar* uri = g_filename_to_uri (editor->pdffile, NULL, NULL);
+                // NOTE: g_filename_{to|from}_uri functions (correctly)
+                // encode special characters like space with % + hexvalue
+                // but we don't do that elsewhere so use custom concat for now
+                gchar* uri = g_strconcat ("file://", editor->pdffile, NULL);
+                //gchar* uri = g_filename_to_uri (editor->pdffile, NULL, NULL);
 
                 previewgui_set_pdffile (pc, uri);
                 g_free(uri);
@@ -928,7 +932,7 @@ static void load_document(GuPreviewGui* pc, gboolean 
update) {
 void previewgui_set_pdffile (GuPreviewGui* pc, const gchar *uri) {
     //L_F_DEBUG;
     GError *error = NULL;
-    
+
     previewgui_cleanup_fds (pc);
 
     pc->uri = g_strdup(uri);
@@ -949,31 +953,48 @@ void previewgui_set_pdffile (GuPreviewGui* pc, const 
gchar *uri) {
 
     // Restore scale and fit mode
     if (!g_active_tab->fit_mode) {
+
         const gchar* conf_zoom = config_get_string ("Preview", "zoom_mode");
-        gint new_fit, new_zoom;
-
-        // TODO: build a dict like structure combining zoom fit strs with
-        // id (combo) so we don't have to do this verbose stuff all over the 
place
-        if (STR_EQU (conf_zoom, "Best Fit")) new_fit = 0, new_zoom = 0;
-        else
-        if (STR_EQU (conf_zoom, "Fit Page Width")) new_fit = 1, new_zoom = 1;
-        else {
-            new_fit = 2;
-            if (STR_EQU (conf_zoom, "50%")) new_zoom = 2;
-            else if (STR_EQU (conf_zoom, "70%")) new_zoom = 3;
-            else if (STR_EQU (conf_zoom, "85%")) new_zoom = 4;
-            else if (STR_EQU (conf_zoom, "100%")) new_zoom = 5;
-            else if (STR_EQU (conf_zoom, "125%")) new_zoom = 6;
-            else if (STR_EQU (conf_zoom, "150%")) new_zoom = 7;
-            else if (STR_EQU (conf_zoom, "200%")) new_zoom = 8;
-            else if (STR_EQU (conf_zoom, "300%")) new_zoom = 9;
-            else if (STR_EQU (conf_zoom, "400%")) new_zoom = 10;
-            else slog (L_ERROR, "should not happen\n");
+
+        GtkTreeIter iter;
+        gboolean    iter_next;
+        gint        iter_count = 0;
+
+        iter_next = gtk_tree_model_get_iter_first (pc->model_sizes, &iter);
+
+        while (iter_next) {
+            gchar *str_data;
+            gtk_tree_model_get (pc->model_sizes, &iter, 0, &str_data, -1);
+
+            // match zoom/fit mode from configfile with mapping from glade:
+            if (STR_EQU (conf_zoom, str_data)) {
+
+                // set zoom_mode
+                g_active_tab->zoom_mode = iter_count;
+
+                // set fit_mode
+                switch (iter_count) {
+                    case FIT_BOTH:
+                        g_active_tab->fit_mode = FIT_BOTH;
+                        break;
+                    case FIT_WIDTH:
+                        g_active_tab->fit_mode = FIT_WIDTH;
+                        break;
+                    default:
+                        g_active_tab->fit_mode = FIT_NUMERIC;
+                        break;
+                }
+                g_free (str_data);
+                break;
+            }
+
+            iter_next   = gtk_tree_model_iter_next (pc->model_sizes, &iter);
+            iter_count += 1;
         }
-        g_active_tab->fit_mode = new_fit;
-        g_active_tab->zoom_mode = new_zoom;
     }
 
+    // TODO: further cleanup above and below please!
+
     g_signal_handler_block(pc->combo_sizes, pc->combo_sizes_changed_handler);
 
     switch (g_active_tab->fit_mode) {
@@ -1031,24 +1052,23 @@ void previewgui_refresh (GuPreviewGui* pc, GtkTextIter 
*sync_to, gchar* tex_file
         synctex_run_parser(pc, sync_to, tex_file)) {
 
         SyncNode *node;
-        if ((node = synctex_one_node_found(pc)) == NULL) {
-            // See if the nodes are so close they all fit in the window
-            // in that case we just merge them
+        if (synctex_one_node_found(pc) == NULL) {
+            // See if the nodes are so close they all fit in
+            // the window - in that case we just merge them
             synctex_merge_nodes(pc);
         }
 
-#if HAVE_POPPLER_PAGE_GET_SELECTED_TEXT
-        if ((node = synctex_one_node_found(pc)) == NULL) {
+        if (synctex_one_node_found(pc) == NULL) {
             // Search for words in the pdf
             synctex_filter_results(pc, sync_to);
         }
-        // Here we could try merging again - but only with nodes which
-        // contained the searched text
-#endif
 
-        // If we have only one node left/selected, scroll ot it.
+        // Here we could try merging again - but only with
+        // nodes which contained the searched text
+
+        // If we have only one node left/selected, scroll to it.
         if ((node = synctex_one_node_found(pc)) != NULL) {
-           synctex_scroll_to_node(pc, node);
+            synctex_scroll_to_node(pc, node);
         }
 
     } else {
@@ -1108,7 +1128,6 @@ static gboolean synctex_run_parser(GuPreviewGui* pc, 
GtkTextIter *sync_to, gchar
     return TRUE;
 }
 
-#if HAVE_POPPLER_PAGE_GET_SELECTED_TEXT
 static void synctex_filter_results(GuPreviewGui* pc, GtkTextIter *sync_to) {
 
     // First look if we even have to filter...
@@ -1167,8 +1186,6 @@ static void synctex_filter_results(GuPreviewGui* pc, 
GtkTextIter *sync_to) {
         g_free(word);
     }
 }
-#endif
-
 
 static SyncNode* synctex_one_node_found(GuPreviewGui* pc) {
 
@@ -1455,7 +1472,7 @@ void previewgui_scroll_to_xy (GuPreviewGui* pc, gdouble 
x, gdouble y) {
 
 void previewgui_save_position (GuPreviewGui* pc) {
     //L_F_DEBUG;
-    if (g_active_tab != NULL) {
+    if (g_active_tab != NULL && !pc->errormode) {
         g_active_tab->scroll_x = gtk_adjustment_get_value (pc->hadj);
         g_active_tab->scroll_y = gtk_adjustment_get_value (pc->vadj);
         block_handlers_current_page(pc);
diff --git a/gui/gui-preview.h b/gui/gui-preview.h
index 8984d4e..9b87936 100644
--- a/gui/gui-preview.h
+++ b/gui/gui-preview.h
@@ -105,7 +105,9 @@ struct _GuPreviewGui {
     GtkToggleToolButton* preview_pause;
 
     GtkWidget* errorpanel;
-    GtkComboBox* combo_sizes;
+
+    GtkComboBox*  combo_sizes;
+    GtkTreeModel* model_sizes;
 
     gulong page_input_changed_handler;
     gulong combo_sizes_changed_handler;
diff --git a/importer.c b/importer.c
index 574ea54..0d317df 100644
--- a/importer.c
+++ b/importer.c
@@ -121,12 +121,11 @@ const gchar* importer_generate_image (const gchar* 
filepath, const gchar* captio
     gchar scale_str[16] = { 0 };
     gchar* loc = NULL;
 
-    /* clear previous data */
+    // clear previous data
     result[0] = 0;
 
-    // Filepath notation corrections for Windows systems:
     #ifdef WIN32
-    gchar* path = g_strjoinv("/", g_strsplit(filepath, "\\", -1));
+    // filepath notation correction for win32 systems:
     if (utils_subinstr (" ", filepath, FALSE)) {
         editor_insert_package (g_active_editor, "grffile", "space");
     }
@@ -134,7 +133,7 @@ const gchar* importer_generate_image (const gchar* 
filepath, const gchar* captio
 
     snprintf (scale_str, 16, "%.2f", scale);
 
-    /* some locales use ',' as seperator, replace them as '.' */
+    // some locales use ',' as seperator, replace them as '.'
     if ( (loc = strstr (scale_str, ",")))
         *loc = '.';
 
diff --git a/iofunctions.c b/iofunctions.c
index e7d5c72..05402c7 100644
--- a/iofunctions.c
+++ b/iofunctions.c
@@ -101,22 +101,20 @@ void iofunctions_real_load_file (GObject* hook, const 
gchar* filename) {
     GError* err = NULL;
     gchar* text = NULL;
     gchar* decoded = NULL;
-    gboolean result;
     GuEditor* ec = NULL;
 
-    ec = gummi_get_active_editor();
-
-    /* get the file contents */
-    if (FALSE == (result = g_file_get_contents (filename, &text, NULL, &err))) 
{
+    if (FALSE == (g_file_get_contents (filename, &text, NULL, &err))) {
         slog (L_G_ERROR, "g_file_get_contents (): %s\n", err->message);
         g_error_free (err);
         iofunctions_load_default_text (FALSE);
         return;
     }
+
     if (NULL == (decoded = iofunctions_decode_text (text)))
         goto cleanup;
 
-    editor_fill_buffer (ec, decoded);
+    ec = gummi_get_active_editor();
+    editor_fill_buffer (gummi_get_active_editor(), decoded);
     gtk_text_buffer_set_modified (GTK_TEXT_BUFFER(ec->buffer), FALSE);
 
 cleanup:
@@ -155,18 +153,14 @@ void iofunctions_real_save_file (GObject* hook, GObject* 
savecontext) {
 
     encoded = iofunctions_encode_text (text);
 
-    /* set the contents of the file to the text from the buffer */
+    // set the contents of the file to the text from the buffer
     if (filename != NULL) {
         if (! (result = g_file_set_contents (filename, encoded, -1, &err))) {
             slog (L_ERROR, "g_file_set_contents (): %s\n", err->message);
+            g_error_free (err);
         }
     }
 
-    if (result == FALSE) {
-        slog (L_G_ERROR, _("%s\nPlease try again later."), err->message);
-        g_error_free (err);
-    }
-
     g_free (encoded);
     g_free (text);
     g_object_unref (savecontext);
diff --git a/latex.c b/latex.c
index 4edd319..ddacb29 100644
--- a/latex.c
+++ b/latex.c
@@ -264,7 +264,7 @@ void latex_export_pdffile (GuLatex* lc, GuEditor* ec, const 
gchar* path,
         }
     }
     if (!utils_copy_file (ec->pdffile, savepath, &err)) {
-        slog (L_G_ERROR, _("Unable to export PDF file.\n\n%s"),
+        slog (L_G_ERROR, _("Unable to export PDF file: %s\n"),
                             err->message);
         g_error_free (err);
     }
diff --git a/motion.c b/motion.c
index 5e93b58..4dca5c7 100644
--- a/motion.c
+++ b/motion.c
@@ -104,13 +104,12 @@ void motion_resume_compile_thread (GuMotion* m) {
 
 void motion_kill_typesetter (GuMotion* m) {
     if (*m->typesetter_pid) {
-        gchar* command = NULL;
         /* Kill children spawned by typesetter command/script, don't know
          * how to do this programatically yet(glib doesn't not provides any
          * function for killing a process), so use pkill for now. For
          * win32 there's currently nothing we can do about it. */
 #ifndef WIN32
-        command = g_strdup_printf("pkill -15 -P %d", *m->typesetter_pid);
+        gchar* command = g_strdup_printf("pkill -15 -P %d", 
*m->typesetter_pid);
         system(command);
         g_free(command);
 
diff --git a/snippets.c b/snippets.c
index dc18afb..4c28650 100644
--- a/snippets.c
+++ b/snippets.c
@@ -196,24 +196,24 @@ gchar* snippets_get_value (GuSnippets* sc, const gchar* 
term) {
 }
 
 void snippets_set_accelerator (GuSnippets* sc, gchar* config) {
-    /* config has the form: Key,Accel_key,Name */
+    // config has the form: Key,Accel_key,Name
     GClosure* closure = NULL;
     GdkModifierType mod;
     guint keyval = 0;
     gchar** configs = g_strsplit (config, ",", 0);
-    Tuple2* data = g_new0 (Tuple2, 1);
-    Tuple2* closure_data = g_new0 (Tuple2, 1);
 
-    /* Return if config does not contains accelerator */
+    // return if configs does not contain accelerator
     if (strlen (configs[1]) == 0) {
         g_strfreev (configs);
         return;
     }
 
+    Tuple2* data = g_new0 (Tuple2, 1);
+    Tuple2* closure_data = g_new0 (Tuple2, 1);
+
     data->first = (gpointer)sc;
     data->second = (gpointer)g_strdup (configs[0]);
 
-
     closure = g_cclosure_new (G_CALLBACK (snippets_accel_cb), data, NULL);
     closure_data->first = (gpointer)data->second;
     closure_data->second = (gpointer)closure;
@@ -221,7 +221,7 @@ void snippets_set_accelerator (GuSnippets* sc, gchar* 
config) {
     sc->closure_data = g_list_append (sc->closure_data, closure_data);
     gtk_accelerator_parse (configs[1], &keyval, &mod);
 
-    /* Return without connect if accel is not valid */
+    // return without connect if accel is not valid
     if (!gtk_accelerator_valid (keyval, mod)) return;
 
     snippets_accel_connect (sc, keyval, mod, closure);
@@ -410,7 +410,7 @@ void snippets_accel_connect (GuSnippets* sc, guint keyval, 
GdkModifierType mod,
 
     acc = gtk_accelerator_get_label (keyval,
             gtk_accelerator_get_default_mod_mask () & mod);
-    slog (L_DEBUG, "Accelerator `%s' connected\n", acc);
+    slog (L_DEBUG, "Accelerator '%s' connected\n", acc);
     g_free (acc);
 }
 
@@ -430,9 +430,9 @@ void snippets_accel_disconnect (GuSnippets* sc, const 
gchar* key) {
     if (current) {
         gtk_accel_group_disconnect (sc->accel_group, closure_data->second);
         sc->closure_data = g_list_remove (sc->closure_data, closure_data);
-        g_free (closure_data);
-        slog (L_DEBUG, "Accelerator for `%s' disconnected\n",
+        slog (L_DEBUG, "Accelerator for '%s' disconnected\n",
                 closure_data->first);
+        g_free (closure_data);
     }
 }
 
@@ -561,7 +561,7 @@ void snippet_info_initial_expand (GuSnippetInfo* info, 
GuEditor* ec) {
     GHashTable* map = NULL;
     GList* current = NULL;
     gchar* text = NULL;
-    gint key = 0;
+    glong key = 0;
 
     map = g_hash_table_new (NULL, NULL);
     current = g_list_first (info->einfo);
diff --git a/utils.c b/utils.c
index 264a248..4fce9f5 100644
--- a/utils.c
+++ b/utils.c
@@ -162,6 +162,92 @@ gint utils_save_reload_dialog (const gchar* message) {
     return ret;
 }
 
+static gchar* css_add (gchar* base, gchar* property, const gchar* value) {
+    // helper to create css pairs for utils_pango_font_desc_to_css()
+    return (g_strconcat (base, property, ": ", value, "; ", NULL));
+}
+
+gchar* utils_pango_font_desc_to_css (PangoFontDescription* font_desc) {
+PangoFontMask font_mask;
+    gchar* result = NULL;
+    gchar* val = NULL;
+
+    // Generate css by analysing PangoFontDescription structure:
+    //
+    //     selector {
+    //         property1: value1;
+    //         property2: value2;
+    //         propertyN: valueN;
+    //     }
+
+    font_mask = pango_font_description_get_set_fields (font_desc);
+
+       // add selector:
+    result = "* { ";
+
+    // add font family:
+       if (font_mask & PANGO_FONT_MASK_FAMILY) {
+        result = css_add (result, "font-family",
+                          pango_font_description_get_family (font_desc));
+    }
+
+    // add font slant styling:
+    if (font_mask & PANGO_FONT_MASK_STYLE) {
+        switch (pango_font_description_get_style (font_desc)) {
+            case PANGO_STYLE_NORMAL:  val = "normal";  break;
+            case PANGO_STYLE_OBLIQUE: val = "oblique"; break;
+            case PANGO_STYLE_ITALIC:  val = "italic";  break;
+        }
+        result = css_add (result, "font-style", val);
+    }
+
+    // add font capitalization variant:
+    if (font_mask & PANGO_FONT_MASK_VARIANT) {
+        switch (pango_font_description_get_variant (font_desc)) {
+            case PANGO_VARIANT_NORMAL:     val = "normal";     break;
+            case PANGO_VARIANT_SMALL_CAPS: val = "small-caps"; break;
+        }
+        result = css_add (result, "font-variant", val);
+    }
+
+    // add font boldness / weight:
+    if (font_mask & PANGO_FONT_MASK_WEIGHT) {
+        gint weight = (gint) pango_font_description_get_weight (font_desc);
+        result = css_add (result, "font-weight", g_strdup_printf ("%d", 
weight));
+    }
+
+    // add font stretch:
+    if (font_mask & PANGO_FONT_MASK_STRETCH) {
+        switch (pango_font_description_get_stretch (font_desc)) {
+            case PANGO_STRETCH_ULTRA_CONDENSED: val = "ultra-condensed"; break;
+            case PANGO_STRETCH_EXTRA_CONDENSED: val = "extra-condensed"; break;
+            case PANGO_STRETCH_CONDENSED:       val = "condensed";       break;
+            case PANGO_STRETCH_SEMI_CONDENSED:  val = "semi-condensed";  break;
+            case PANGO_STRETCH_NORMAL:          val = "normal";          break;
+            case PANGO_STRETCH_SEMI_EXPANDED:   val = "semi-expanded";   break;
+            case PANGO_STRETCH_EXPANDED:        val = "expanded";        break;
+            case PANGO_STRETCH_EXTRA_EXPANDED:  val = "extra-expanded";  break;
+            case PANGO_STRETCH_ULTRA_EXPANDED:  val = "ultra-expanded";  break;
+        }
+        result = css_add (result, "font-stretch", val);
+    }
+
+    // add font size:
+    if (font_mask & PANGO_FONT_MASK_SIZE) {
+        gint size = pango_font_description_get_size (font_desc);
+
+        if (!pango_font_description_get_size_is_absolute (font_desc)) {
+            size = size / PANGO_SCALE;
+        }
+        result = css_add (result, "font-size", g_strdup_printf("%dpx", size));
+    }
+
+    // add closing bracket
+    result = g_strconcat (result, "}", NULL);
+
+       return result;
+}
+
 gint utils_yes_no_dialog (const gchar* message) {
     GtkWidget* dialog;
     gint ret = 0;
diff --git a/utils.h b/utils.h
index 527db7c..7c2f66b 100644
--- a/utils.h
+++ b/utils.h
@@ -120,8 +120,8 @@ gint utils_yes_no_dialog (const gchar* message);
 gint utils_save_reload_dialog (const gchar* message);
 gboolean utils_path_exists (const gchar* path);
 gboolean utils_uri_path_exists (const gchar* uri);
-gboolean utils_set_file_contents (const gchar *filename, const gchar *text,
-        gssize length);
+gboolean utils_set_file_contents (const gchar *filename, const gchar *text, 
gssize length);
+gchar* utils_pango_font_desc_to_css (PangoFontDescription* font_desc);
 
 /**
  * utils_copy_file:

Attachment: signature.asc
Description: PGP signature

Reply via email to