From f35bb1f74a0ffeb5c6477a25e3c4cde87a97bcf1 Mon Sep 17 00:00:00 2001 From: Adrian Boguszewski Date: Thu, 28 Jul 2016 12:06:06 +0200 Subject: Removed unused includes, decrease compilation time (bzr r15025) --- src/inkview.cpp | 3 --- 1 file changed, 3 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index db4b1aeb0..b377a3bd0 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -35,7 +35,6 @@ #include #include -#include // #include @@ -58,8 +57,6 @@ #include "inkscape.h" -#include - #ifndef HAVE_BIND_TEXTDOMAIN_CODESET #define bind_textdomain_codeset(p,c) #endif -- cgit v1.2.3 From 43b49e325db73cc19b1731db6c69545664ee8fbe Mon Sep 17 00:00:00 2001 From: Adrian Boguszewski Date: Thu, 28 Jul 2016 13:26:17 +0200 Subject: Reverted changes to r15024 after many building problems (bzr r15027) --- src/inkview.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index b377a3bd0..db4b1aeb0 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -35,6 +35,7 @@ #include #include +#include // #include @@ -57,6 +58,8 @@ #include "inkscape.h" +#include + #ifndef HAVE_BIND_TEXTDOMAIN_CODESET #define bind_textdomain_codeset(p,c) #endif -- cgit v1.2.3 From 49a7927ecf31ace696e9e5770e8d6543c356db7a Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Thu, 28 Jul 2016 19:15:34 +0100 Subject: Finish removing GTK+ 2 fallbacks (bzr r15023.2.8) --- src/inkview.cpp | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index db4b1aeb0..f6dfe34fe 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -346,13 +346,7 @@ static GtkWidget* sp_svgview_control_show(struct SPSlideShow *ss) gtk_window_set_transient_for(GTK_WINDOW(ctrlwin), GTK_WINDOW(ss->window)); g_signal_connect(G_OBJECT (ctrlwin), "key_press_event", (GCallback) sp_svgview_main_key_press, ss); g_signal_connect(G_OBJECT (ctrlwin), "delete_event", (GCallback) sp_svgview_ctrlwin_delete, NULL); - -#if GTK_CHECK_VERSION(3,0,0) - GtkWidget *t = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); -#else - GtkWidget *t = gtk_hbutton_box_new(); -#endif - + auto t = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); gtk_container_add(GTK_CONTAINER(ctrlwin), t); #if GTK_CHECK_VERSION(3,10,0) @@ -431,19 +425,11 @@ static void sp_svgview_waiting_cursor(struct SPSlideShow *ss) GdkDisplay *display = gdk_display_get_default(); GdkCursor *waiting = gdk_cursor_new_for_display(display, GDK_WATCH); gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ss->window)), waiting); -#if GTK_CHECK_VERSION(3,0,0) g_object_unref(waiting); -#else - gdk_cursor_unref(waiting); -#endif if (ctrlwin) { GdkCursor *waiting = gdk_cursor_new_for_display(display, GDK_WATCH); gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ctrlwin)), waiting); -#if GTK_CHECK_VERSION(3,0,0) g_object_unref(waiting); -#else - gdk_cursor_unref(waiting); -#endif } while(gtk_events_pending()) { gtk_main_iteration(); -- cgit v1.2.3 From 35830f456cadaecf8b8e3944e3031a1a93f6cb41 Mon Sep 17 00:00:00 2001 From: Adrian Boguszewski Date: Wed, 3 Aug 2016 15:29:38 +0200 Subject: Removed unused includes, decreased compilation time. Once again (bzr r15034) --- src/inkview.cpp | 3 --- 1 file changed, 3 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index db4b1aeb0..b377a3bd0 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -35,7 +35,6 @@ #include #include -#include // #include @@ -58,8 +57,6 @@ #include "inkscape.h" -#include - #ifndef HAVE_BIND_TEXTDOMAIN_CODESET #define bind_textdomain_codeset(p,c) #endif -- cgit v1.2.3 From 79114d4f5ed18fc7bc79fff42bbc02d24042b484 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Sat, 13 Aug 2016 16:59:04 +0100 Subject: inkview: C++ify (bzr r15056) --- src/inkview.cpp | 273 ++++++++++++++++++++++++-------------------------------- 1 file changed, 115 insertions(+), 158 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index c90d0b85e..fe656ca5b 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -34,6 +34,8 @@ #include #include +#include +#include #include // #include @@ -66,28 +68,38 @@ extern char *optarg; extern int optind, opterr; -struct SPSlideShow { - char **slides; - int size; - int length; +class SPSlideShow { +public: + std::vector slides; int current; SPDocument *doc; GtkWidget *view; GtkWidget *window; bool fullscreen; int timer; -}; -static GtkWidget *sp_svgview_control_show (struct SPSlideShow *ss); -static void sp_svgview_show_next (struct SPSlideShow *ss); -static void sp_svgview_show_prev (struct SPSlideShow *ss); -static void sp_svgview_goto_first (struct SPSlideShow *ss); -static void sp_svgview_goto_last (struct SPSlideShow *ss); + SPSlideShow() + : + slides(), + current(0), + doc(NULL), + view(NULL), + fullscreen(false) + {} + + GtkWidget *control_show(); + void show_next(); + void show_prev(); + void goto_first(); + void goto_last(); + +protected: + void waiting_cursor(); + void normal_cursor(); + void set_document(SPDocument *doc, + int current); +}; -static int sp_svgview_show_next_cb (GtkWidget *widget, void *data); -static int sp_svgview_show_prev_cb (GtkWidget *widget, void *data); -static int sp_svgview_goto_first_cb (GtkWidget *widget, void *data); -static int sp_svgview_goto_last_cb (GtkWidget *widget, void *data); #ifdef WITH_INKJAR static bool is_jar(char const *filename); #endif @@ -114,11 +126,11 @@ static int sp_svgview_main_key_press (GtkWidget */*widget*/, switch (event->keyval) { case GDK_KEY_Up: case GDK_KEY_Home: - sp_svgview_goto_first(ss); + ss->goto_first(); break; case GDK_KEY_Down: case GDK_KEY_End: - sp_svgview_goto_last(ss); + ss->goto_last(); break; case GDK_KEY_F11: if (ss->fullscreen) { @@ -130,19 +142,19 @@ static int sp_svgview_main_key_press (GtkWidget */*widget*/, } break; case GDK_KEY_Return: - sp_svgview_control_show (ss); + ss->control_show(); break; case GDK_KEY_KP_Page_Down: case GDK_KEY_Page_Down: case GDK_KEY_Right: case GDK_KEY_space: - sp_svgview_show_next (ss); + ss->show_next(); break; case GDK_KEY_KP_Page_Up: case GDK_KEY_Page_Up: case GDK_KEY_Left: case GDK_KEY_BackSpace: - sp_svgview_show_prev (ss); + ss->show_prev(); break; case GDK_KEY_Escape: case GDK_KEY_q: @@ -167,9 +179,8 @@ int main (int argc, const char **argv) Gtk::Main main_instance (&argc, const_cast(&argv)); - struct SPSlideShow ss; - int num_parsed_options = 0; + SPSlideShow ss; // the list of arguments is in the net line for (int i = 1; i < argc; i++) { @@ -215,15 +226,6 @@ int main (int argc, const char **argv) setlocale (LC_NUMERIC, "C"); - ss.size = 32; - ss.length = 0; - ss.current = 0; - ss.slides = g_new (char *, ss.size); - ss.current = 0; - ss.doc = NULL; - ss.view = NULL; - ss.fullscreen = false; - Inkscape::Application::create(argv[0], true); //Inkscape::Application &inkscape = Inkscape::Application::instance(); @@ -254,21 +256,13 @@ int main (int argc, const char **argv) } } } else if (gba->len > 0) { - //::write(1, gba->data, gba->len); - /* Append to list */ - if (ss.length >= ss.size) { - /* Expand */ - ss.size <<= 1; - ss.slides = g_renew (char *, ss.slides, ss.size); - } - ss.doc = SPDocument::createNewDocFromMem ((const gchar *)gba->data, gba->len, TRUE); gchar *last_filename = jar_file_reader.get_last_filename(); if (ss.doc) { - ss.slides[ss.length++] = strdup (last_filename); - (ss.doc)->setUri (last_filename); + ss.slides.push_back(strdup(last_filename)); + (ss.doc)->setUri(last_filename); } g_byte_array_free(gba, TRUE); g_free(last_filename); @@ -279,16 +273,10 @@ int main (int argc, const char **argv) } else { #endif /* WITH_INKJAR */ /* Append to list */ - if (ss.length >= ss.size) { - /* Expand */ - ss.size <<= 1; - ss.slides = g_renew (char *, ss.slides, ss.size); - } - - ss.slides[ss.length++] = strdup (argv[i]); + ss.slides.push_back(strdup (argv[i])); if (!ss.doc) { - ss.doc = SPDocument::createNewDoc (ss.slides[ss.current], TRUE, false); + ss.doc = SPDocument::createNewDoc((ss.slides[ss.current]).c_str(), TRUE, false); if (!ss.doc) { ++ss.current; } @@ -335,56 +323,48 @@ static int sp_svgview_ctrlwin_delete (GtkWidget */*widget*/, return FALSE; } -static GtkWidget* sp_svgview_control_show(struct SPSlideShow *ss) +/** + * @brief Show the control buttons (next, previous etc) for the application + */ +GtkWidget* SPSlideShow::control_show() { if (!ctrlwin) { ctrlwin = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_resizable(GTK_WINDOW(ctrlwin), FALSE); - gtk_window_set_transient_for(GTK_WINDOW(ctrlwin), GTK_WINDOW(ss->window)); - g_signal_connect(G_OBJECT (ctrlwin), "key_press_event", (GCallback) sp_svgview_main_key_press, ss); + gtk_window_set_transient_for(GTK_WINDOW(ctrlwin), GTK_WINDOW(window)); + g_signal_connect(G_OBJECT (ctrlwin), "key_press_event", (GCallback) sp_svgview_main_key_press, this); g_signal_connect(G_OBJECT (ctrlwin), "delete_event", (GCallback) sp_svgview_ctrlwin_delete, NULL); auto t = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); gtk_container_add(GTK_CONTAINER(ctrlwin), t); -#if GTK_CHECK_VERSION(3,10,0) - GtkWidget *b = gtk_button_new_from_icon_name(INKSCAPE_ICON("go-first"), GTK_ICON_SIZE_BUTTON); -#else - GtkWidget *b = gtk_button_new(); - GtkWidget *img = gtk_image_new_from_icon_name(INKSCAPE_ICON("go-first"), GTK_ICON_SIZE_BUTTON); - gtk_button_set_image(GTK_BUTTON(b), img); -#endif - gtk_container_add(GTK_CONTAINER(t), b); - - g_signal_connect(G_OBJECT(b), "clicked", (GCallback) sp_svgview_goto_first_cb, ss); -#if GTK_CHECK_VERSION(3,10,0) - b = gtk_button_new_from_icon_name(INKSCAPE_ICON("go-previous"), GTK_ICON_SIZE_BUTTON); -#else - b = gtk_button_new(); - img = gtk_image_new_from_icon_name(INKSCAPE_ICON("go-previous"), GTK_ICON_SIZE_BUTTON); - gtk_button_set_image(GTK_BUTTON(b), img); -#endif - gtk_container_add(GTK_CONTAINER(t), b); - - g_signal_connect(G_OBJECT(b), "clicked", (GCallback) sp_svgview_show_prev_cb, ss); -#if GTK_CHECK_VERSION(3,10,0) - b = gtk_button_new_from_icon_name(INKSCAPE_ICON("go-next"), GTK_ICON_SIZE_BUTTON); -#else - b = gtk_button_new(); - img = gtk_image_new_from_icon_name(INKSCAPE_ICON("go-next"), GTK_ICON_SIZE_BUTTON); - gtk_button_set_image(GTK_BUTTON(b), img); -#endif - gtk_container_add(GTK_CONTAINER(t), b); - - g_signal_connect(G_OBJECT(b), "clicked", (GCallback) sp_svgview_show_next_cb, ss); -#if GTK_CHECK_VERSION(3,10,0) - b = gtk_button_new_from_icon_name(INKSCAPE_ICON("go-last"), GTK_ICON_SIZE_BUTTON); -#else - b = gtk_button_new(); - img = gtk_image_new_from_icon_name(INKSCAPE_ICON("go-last"), GTK_ICON_SIZE_BUTTON); - gtk_button_set_image(GTK_BUTTON(b), img); -#endif - gtk_container_add(GTK_CONTAINER(t), b); - g_signal_connect(G_OBJECT(b), "clicked", (GCallback) sp_svgview_goto_last_cb, ss); + auto btn_go_first = Gtk::manage(new Gtk::Button()); + auto img_go_first = Gtk::manage(new Gtk::Image()); + img_go_first->set_from_icon_name(INKSCAPE_ICON("go-first"), Gtk::ICON_SIZE_BUTTON); + btn_go_first->set_image(*img_go_first); + gtk_container_add(GTK_CONTAINER(t), GTK_WIDGET(btn_go_first->gobj())); + btn_go_first->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::goto_first)); + + auto btn_go_prev = Gtk::manage(new Gtk::Button()); + auto img_go_prev = Gtk::manage(new Gtk::Image()); + img_go_prev->set_from_icon_name(INKSCAPE_ICON("go-previous"), Gtk::ICON_SIZE_BUTTON); + btn_go_prev->set_image(*img_go_prev); + gtk_container_add(GTK_CONTAINER(t), GTK_WIDGET(btn_go_prev->gobj())); + btn_go_prev->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::show_prev)); + + auto btn_go_next = Gtk::manage(new Gtk::Button()); + auto img_go_next = Gtk::manage(new Gtk::Image()); + img_go_next->set_from_icon_name(INKSCAPE_ICON("go-next"), Gtk::ICON_SIZE_BUTTON); + btn_go_next->set_image(*img_go_next); + gtk_container_add(GTK_CONTAINER(t), GTK_WIDGET(btn_go_next->gobj())); + btn_go_next->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::show_next)); + + auto btn_go_last = Gtk::manage(new Gtk::Button()); + auto img_go_last = Gtk::manage(new Gtk::Image()); + img_go_last->set_from_icon_name(INKSCAPE_ICON("go-last"), Gtk::ICON_SIZE_BUTTON); + btn_go_last->set_image(*img_go_last); + gtk_container_add(GTK_CONTAINER(t), GTK_WIDGET(btn_go_last->gobj())); + btn_go_last->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::goto_last)); + gtk_widget_show_all(ctrlwin); } else { gtk_window_present(GTK_WINDOW(ctrlwin)); @@ -393,35 +373,11 @@ static GtkWidget* sp_svgview_control_show(struct SPSlideShow *ss) return NULL; } -static int sp_svgview_show_next_cb (GtkWidget */*widget*/, void *data) -{ - sp_svgview_show_next(static_cast(data)); - return FALSE; -} - -static int sp_svgview_show_prev_cb (GtkWidget */*widget*/, void *data) -{ - sp_svgview_show_prev(static_cast(data)); - return FALSE; -} - -static int sp_svgview_goto_first_cb (GtkWidget */*widget*/, void *data) -{ - sp_svgview_goto_first(static_cast(data)); - return FALSE; -} - -static int sp_svgview_goto_last_cb (GtkWidget */*widget*/, void *data) -{ - sp_svgview_goto_last(static_cast(data)); - return FALSE; -} - -static void sp_svgview_waiting_cursor(struct SPSlideShow *ss) +void SPSlideShow::waiting_cursor() { GdkDisplay *display = gdk_display_get_default(); GdkCursor *waiting = gdk_cursor_new_for_display(display, GDK_WATCH); - gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ss->window)), waiting); + gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(window)), waiting); g_object_unref(waiting); if (ctrlwin) { GdkCursor *waiting = gdk_cursor_new_for_display(display, GDK_WATCH); @@ -433,90 +389,91 @@ static void sp_svgview_waiting_cursor(struct SPSlideShow *ss) } } -static void sp_svgview_normal_cursor(struct SPSlideShow *ss) +void SPSlideShow::normal_cursor() { - gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ss->window)), NULL); + gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(window)), NULL); if (ctrlwin) { gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ctrlwin)), NULL); } } -static void sp_svgview_set_document(struct SPSlideShow *ss, - SPDocument *doc, - int current) +void SPSlideShow::set_document(SPDocument *doc, + int current) { - if (doc && doc != ss->doc) { + if (doc && doc != this->doc) { doc->ensureUpToDate(); - reinterpret_cast(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (doc); - ss->doc = doc; - ss->current = current; + reinterpret_cast(SP_VIEW_WIDGET_VIEW (view))->setDocument (doc); + this->doc = doc; + this->current = current; } } -static void sp_svgview_show_next (struct SPSlideShow *ss) +/** + * @brief Show the next file in the slideshow + */ +void SPSlideShow::show_next() { - sp_svgview_waiting_cursor(ss); + waiting_cursor(); SPDocument *doc = NULL; - int current = ss->current; - while (!doc && (current < ss->length - 1)) { - doc = SPDocument::createNewDoc (ss->slides[++current], TRUE, false); + while (!doc && (current < slides.size() - 1)) { + doc = SPDocument::createNewDoc ((slides[++current]).c_str(), TRUE, false); } - sp_svgview_set_document(ss, doc, current); - - sp_svgview_normal_cursor(ss); + set_document(doc, current); + normal_cursor(); } -static void sp_svgview_show_prev (struct SPSlideShow *ss) +/** + * @brief Show the previous file in the slideshow + */ +void SPSlideShow::show_prev() { - sp_svgview_waiting_cursor(ss); + waiting_cursor(); SPDocument *doc = NULL; - int current = ss->current; while (!doc && (current > 0)) { - doc = SPDocument::createNewDoc (ss->slides[--current], TRUE, false); + doc = SPDocument::createNewDoc ((slides[--current]).c_str(), TRUE, false); } - sp_svgview_set_document(ss, doc, current); - - sp_svgview_normal_cursor(ss); + set_document(doc, current); + normal_cursor(); } -static void sp_svgview_goto_first (struct SPSlideShow *ss) +/** + * @brief Switch to first slide in slideshow + */ +void SPSlideShow::goto_first() { - sp_svgview_waiting_cursor(ss); + waiting_cursor(); SPDocument *doc = NULL; int current = 0; - while ( !doc && (current < ss->length - 1)) { - if (current == ss->current) { - break; - } - doc = SPDocument::createNewDoc (ss->slides[current++], TRUE, false); + while ( !doc && (current < slides.size() - 1)) { + doc = SPDocument::createNewDoc((slides[current++]).c_str(), TRUE, false); } - sp_svgview_set_document(ss, doc, current - 1); + set_document(doc, current - 1); - sp_svgview_normal_cursor(ss); + normal_cursor(); } -static void sp_svgview_goto_last (struct SPSlideShow *ss) +/** + * @brief Switch to last slide in slideshow + */ +void SPSlideShow::goto_last() { - sp_svgview_waiting_cursor(ss); + waiting_cursor(); SPDocument *doc = NULL; - int current = ss->length - 1; + int current = slides.size() - 1; while (!doc && (current >= 0)) { - if (current == ss->current) { - break; - } - doc = SPDocument::createNewDoc (ss->slides[current--], TRUE, false); + doc = SPDocument::createNewDoc((slides[current--]).c_str(), TRUE, false); } - sp_svgview_set_document(ss, doc, current + 1); + set_document(doc, current + 1); - sp_svgview_normal_cursor(ss); + normal_cursor(); } #ifdef WITH_INKJAR -- cgit v1.2.3 From 75c4b2b43058668f2c94b27db858763d0b1f308c Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Sun, 14 Aug 2016 13:16:27 +0100 Subject: inkview: Convert to ApplicationWindow (bzr r15057) --- src/inkview.cpp | 94 +++++++++++++++++++++++++++------------------------------ 1 file changed, 45 insertions(+), 49 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index fe656ca5b..b9447a94f 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -68,15 +69,19 @@ extern char *optarg; extern int optind, opterr; -class SPSlideShow { +/** + * The main application window for the slideshow + */ +class SPSlideShow : public Gtk::ApplicationWindow { public: - std::vector slides; - int current; - SPDocument *doc; - GtkWidget *view; - GtkWidget *window; - bool fullscreen; - int timer; + std::vector slides; ///< List of filenames for each slide + int current; ///< Index of the currently displayed slide + SPDocument *doc; ///< The currently displayed slide + GtkWidget *view; + int timer; + + /// Current state of application (full-screen or windowed) + bool is_fullscreen; SPSlideShow() : @@ -84,20 +89,20 @@ public: current(0), doc(NULL), view(NULL), - fullscreen(false) + is_fullscreen(false) {} - GtkWidget *control_show(); - void show_next(); - void show_prev(); - void goto_first(); - void goto_last(); + void control_show(); + void show_next(); + void show_prev(); + void goto_first(); + void goto_last(); protected: - void waiting_cursor(); - void normal_cursor(); - void set_document(SPDocument *doc, - int current); + void waiting_cursor(); + void normal_cursor(); + void set_document(SPDocument *doc, + int current); }; #ifdef WITH_INKJAR @@ -133,12 +138,12 @@ static int sp_svgview_main_key_press (GtkWidget */*widget*/, ss->goto_last(); break; case GDK_KEY_F11: - if (ss->fullscreen) { - gtk_window_unfullscreen (GTK_WINDOW(ss->window)); - ss->fullscreen = false; + if (ss->is_fullscreen) { + ss->unfullscreen(); + ss->is_fullscreen = false; } else { - gtk_window_fullscreen (GTK_WINDOW(ss->window)); - ss->fullscreen = true; + ss->fullscreen(); + ss->is_fullscreen = true; } break; case GDK_KEY_Return: @@ -164,7 +169,8 @@ static int sp_svgview_main_key_press (GtkWidget */*widget*/, default: break; } - gtk_window_set_title(GTK_WINDOW(ss->window), ss->doc->getName()); + + ss->set_title(ss->doc->getName()); return TRUE; } @@ -202,7 +208,6 @@ int main (int argc, const char **argv) } } - GtkWidget *w; int i; bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); @@ -214,8 +219,6 @@ int main (int argc, const char **argv) Inkscape::GC::init(); Inkscape::Preferences::get(); // ensure preferences are initialized - gtk_init (&argc, (char ***) &argv); - #ifdef lalaWITH_MODULES g_warning ("Have to autoinit modules (lauris)"); sp_modulesys_init(); @@ -291,24 +294,21 @@ int main (int argc, const char **argv) return 1; /* none of the slides loadable */ } - w = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title( GTK_WINDOW(w), ss.doc->getName() ); - gtk_window_set_default_size (GTK_WINDOW (w), - MIN ((int)(ss.doc)->getWidth().value("px"), (int)gdk_screen_width() - 64), - MIN ((int)(ss.doc)->getHeight().value("px"), (int)gdk_screen_height() - 64)); - ss.window = w; + ss.set_title(ss.doc->getName() ); + ss.set_default_size(MIN ((int)(ss.doc)->getWidth().value("px"), (int)gdk_screen_width() - 64), + MIN ((int)(ss.doc)->getHeight().value("px"), (int)gdk_screen_height() - 64)); - g_signal_connect (G_OBJECT (w), "delete_event", (GCallback) sp_svgview_main_delete, &ss); - g_signal_connect (G_OBJECT (w), "key_press_event", (GCallback) sp_svgview_main_key_press, &ss); + g_signal_connect (G_OBJECT (ss.gobj()), "delete_event", (GCallback) sp_svgview_main_delete, &ss); + g_signal_connect (G_OBJECT (ss.gobj()), "key_press_event", (GCallback) sp_svgview_main_key_press, &ss); (ss.doc)->ensureUpToDate(); ss.view = sp_svg_view_widget_new (ss.doc); (ss.doc)->doUnref (); SP_SVG_VIEW_WIDGET(ss.view)->setResize( false, ss.doc->getWidth().value("px"), ss.doc->getHeight().value("px") ); gtk_widget_show (ss.view); - gtk_container_add (GTK_CONTAINER (w), ss.view); + ss.add(*Glib::wrap(ss.view)); - gtk_widget_show (w); + ss.show(); gtk_main (); @@ -326,12 +326,12 @@ static int sp_svgview_ctrlwin_delete (GtkWidget */*widget*/, /** * @brief Show the control buttons (next, previous etc) for the application */ -GtkWidget* SPSlideShow::control_show() +void SPSlideShow::control_show() { if (!ctrlwin) { ctrlwin = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_resizable(GTK_WINDOW(ctrlwin), FALSE); - gtk_window_set_transient_for(GTK_WINDOW(ctrlwin), GTK_WINDOW(window)); + gtk_window_set_transient_for(GTK_WINDOW(ctrlwin), GTK_WINDOW(this->gobj())); g_signal_connect(G_OBJECT (ctrlwin), "key_press_event", (GCallback) sp_svgview_main_key_press, this); g_signal_connect(G_OBJECT (ctrlwin), "delete_event", (GCallback) sp_svgview_ctrlwin_delete, NULL); auto t = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); @@ -369,20 +369,16 @@ GtkWidget* SPSlideShow::control_show() } else { gtk_window_present(GTK_WINDOW(ctrlwin)); } - - return NULL; } void SPSlideShow::waiting_cursor() { - GdkDisplay *display = gdk_display_get_default(); - GdkCursor *waiting = gdk_cursor_new_for_display(display, GDK_WATCH); - gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(window)), waiting); - g_object_unref(waiting); + auto display = Gdk::Display::get_default(); + auto waiting = Gdk::Cursor::create(display, Gdk::WATCH); + get_window()->set_cursor(waiting); + if (ctrlwin) { - GdkCursor *waiting = gdk_cursor_new_for_display(display, GDK_WATCH); - gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ctrlwin)), waiting); - g_object_unref(waiting); + gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ctrlwin)), waiting->gobj()); } while(gtk_events_pending()) { gtk_main_iteration(); @@ -391,7 +387,7 @@ void SPSlideShow::waiting_cursor() void SPSlideShow::normal_cursor() { - gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(window)), NULL); + get_window()->set_cursor(); if (ctrlwin) { gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ctrlwin)), NULL); } -- cgit v1.2.3 From 230c3e966f370c563e2ede394d336cb0b760d4f6 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Tue, 23 Aug 2016 22:49:43 +0100 Subject: Inkview: Use GOptionContext (bzr r15072) --- src/inkview.cpp | 114 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 60 insertions(+), 54 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index b9447a94f..4dcaa247d 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -34,6 +34,8 @@ #include #include +#include + #include #include #include @@ -43,7 +45,6 @@ #include #include -#include #include "inkgc/gc-core.h" #include "preferences.h" @@ -66,9 +67,6 @@ #include "ui/icon-names.h" -extern char *optarg; -extern int optind, opterr; - /** * The main application window for the slideshow */ @@ -174,41 +172,56 @@ static int sp_svgview_main_key_press (GtkWidget */*widget*/, return TRUE; } -int main (int argc, const char **argv) +/// List of all input filenames +static Glib::OptionGroup::vecustrings filenames; + +/// Input timer option +static int timer = 0; + +/** + * \brief Set of command-line options for Inkview + */ +class InkviewOptionsGroup : public Glib::OptionGroup { - if (argc == 1) { - usage(); +public: + InkviewOptionsGroup() + : + Glib::OptionGroup(_("Inkscape Options"), + _("Default program options")), + _entry_timer(), + _entry_args() + { + // Entry for the "timer" option + _entry_timer.set_short_name('t'); + _entry_timer.set_long_name("timer"); + _entry_timer.set_arg_description(_("NUM")); + add_entry(_entry_timer, timer); + + // Entry for the remaining non-option arguments + _entry_args.set_short_name('\0'); + _entry_args.set_long_name(G_OPTION_REMAINING); + _entry_args.set_arg_description(_("FILES...")); + + add_entry(_entry_args, filenames); } +private: + Glib::OptionEntry _entry_timer; + Glib::OptionEntry _entry_args; +}; + +int main (int argc, char **argv) +{ + Glib::OptionContext opt(_("Open SVG files")); + InkviewOptionsGroup grp; + opt.set_main_group(grp); + // Prevents errors like "Unable to wrap GdkPixbuf..." (in nr-filter-image.cpp for example) Gtk::Main::init_gtkmm_internals(); + Gtk::Main main_instance (argc, argv, opt); - Gtk::Main main_instance (&argc, const_cast(&argv)); - - int num_parsed_options = 0; SPSlideShow ss; - - // the list of arguments is in the net line - for (int i = 1; i < argc; i++) { - if ((argv[i][0] == '-')) { - if (!strcmp(argv[i], "--")) { - break; - } - else if ((!strcmp(argv[i], "-t"))) { - if (i + 1 >= argc) { - usage(); - } - ss.timer = atoi(argv[i+1]); - num_parsed_options = i+1; - i++; - } - else { - usage(); - } - } - } - - int i; + ss.timer=timer; bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); @@ -232,19 +245,24 @@ int main (int argc, const char **argv) Inkscape::Application::create(argv[0], true); //Inkscape::Application &inkscape = Inkscape::Application::instance(); - // starting at where the commandline options stopped parsing because - // we want all the files to be in the list - for (i = num_parsed_options + 1 ; i < argc; i++) { + if(filenames.empty()) + { + std::cout << opt.get_help(); + exit(EXIT_FAILURE); + } + + for(auto file : filenames) + { struct stat st; - if (stat (argv[i], &st) - || !S_ISREG (st.st_mode) - || (st.st_size < 64)) { - fprintf(stderr, "could not open file %s\n", argv[i]); + if (stat(file.c_str(), &st) + || !S_ISREG (st.st_mode) + || (st.st_size < 64)) { + fprintf(stderr, "could not open file %s\n", file.c_str()); } else { #ifdef WITH_INKJAR - if (is_jar(argv[i])) { - Inkjar::JarFileReader jar_file_reader(argv[i]); + if (is_jar(file.c_str())) { + Inkjar::JarFileReader jar_file_reader(file.c_str()); for (;;) { GByteArray *gba = jar_file_reader.get_next_file(); if (gba == NULL) { @@ -276,7 +294,7 @@ int main (int argc, const char **argv) } else { #endif /* WITH_INKJAR */ /* Append to list */ - ss.slides.push_back(strdup (argv[i])); + ss.slides.push_back(file); if (!ss.doc) { ss.doc = SPDocument::createNewDoc((ss.slides[ss.current]).c_str(), TRUE, false); @@ -487,18 +505,6 @@ static bool is_jar(char const *filename) } #endif /* WITH_INKJAR */ -static void usage() -{ - fprintf(stderr, - "Usage: inkview [OPTIONS...] [FILES ...]\n" - "\twhere FILES are SVG (.svg or .svgz)" -#ifdef WITH_INKJAR - " or archives of SVGs (.sxw, .jar)" -#endif - "\n"); - exit(1); -} - /* Local Variables: mode:c++ -- cgit v1.2.3 From cb2670616b3cfb41ee235f6505ddc9105604d74c Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Tue, 23 Aug 2016 23:55:16 +0100 Subject: Inkview: C++ify (bzr r15073) --- src/inkview.cpp | 145 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 81 insertions(+), 64 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 4dcaa247d..61017fc71 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -67,29 +67,64 @@ #include "ui/icon-names.h" +class SPSlideShow; + +static int sp_svgview_main_delete (GtkWidget *widget, + GdkEvent *event, + struct SPSlideShow *ss); + +static int sp_svgview_main_key_press (GtkWidget *widget, + GdkEventKey *event, + struct SPSlideShow *ss); + /** * The main application window for the slideshow */ class SPSlideShow : public Gtk::ApplicationWindow { + std::vector _slides; ///< List of filenames for each slide + int _current; ///< Index of the currently displayed slide + SPDocument *_doc; ///< The currently displayed slide + int _timer; + GtkWidget *_view; + public: - std::vector slides; ///< List of filenames for each slide - int current; ///< Index of the currently displayed slide - SPDocument *doc; ///< The currently displayed slide - GtkWidget *view; - int timer; - /// Current state of application (full-screen or windowed) bool is_fullscreen; - SPSlideShow() + /// Update the window title with current document name + void update_title() + { + set_title(_doc->getName()); + } + + SPSlideShow(std::vector &slides) : - slides(), - current(0), - doc(NULL), - view(NULL), - is_fullscreen(false) - {} + _slides(slides), + _current(0), + _doc(SPDocument::createNewDoc(_slides[0].c_str(), true, false)), + _view(NULL), + is_fullscreen(false), + _timer(0) + { + update_title(); + + set_default_size(MIN ((int)_doc->getWidth().value("px"), (int)gdk_screen_width() - 64), + MIN ((int)_doc->getHeight().value("px"), (int)gdk_screen_height() - 64)); + + g_signal_connect (G_OBJECT (gobj()), "delete_event", (GCallback) sp_svgview_main_delete, this); + g_signal_connect (G_OBJECT (gobj()), "key_press_event", (GCallback) sp_svgview_main_key_press, this); + + _doc->ensureUpToDate(); + _view = sp_svg_view_widget_new (_doc); + _doc->doUnref (); + SP_SVG_VIEW_WIDGET(_view)->setResize( false, _doc->getWidth().value("px"), _doc->getHeight().value("px") ); + gtk_widget_show (_view); + add(*Glib::wrap(_view)); + + show(); + } + void set_timer(int timer) {_timer = timer;} void control_show(); void show_next(); void show_prev(); @@ -118,7 +153,7 @@ static int sp_svgview_main_delete (GtkWidget */*widget*/, GdkEvent */*event*/, struct SPSlideShow */*ss*/) { - gtk_main_quit (); + Gtk::Main::quit(); return FALSE; } @@ -168,7 +203,7 @@ static int sp_svgview_main_key_press (GtkWidget */*widget*/, break; } - ss->set_title(ss->doc->getName()); + ss->update_title(); return TRUE; } @@ -220,9 +255,6 @@ int main (int argc, char **argv) Gtk::Main::init_gtkmm_internals(); Gtk::Main main_instance (argc, argv, opt); - SPSlideShow ss; - ss.timer=timer; - bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); @@ -243,7 +275,6 @@ int main (int argc, char **argv) setlocale (LC_NUMERIC, "C"); Inkscape::Application::create(argv[0], true); - //Inkscape::Application &inkscape = Inkscape::Application::instance(); if(filenames.empty()) { @@ -251,6 +282,8 @@ int main (int argc, char **argv) exit(EXIT_FAILURE); } + std::vector valid_files; + for(auto file : filenames) { struct stat st; @@ -277,13 +310,13 @@ int main (int argc, char **argv) } } } else if (gba->len > 0) { - ss.doc = SPDocument::createNewDocFromMem ((const gchar *)gba->data, - gba->len, - TRUE); + // Try opening the document + auto doc = SPDocument::createNewDocFromMem ((const gchar *)gba->data, + gba->len, + TRUE); gchar *last_filename = jar_file_reader.get_last_filename(); - if (ss.doc) { - ss.slides.push_back(strdup(last_filename)); - (ss.doc)->setUri(last_filename); + if (doc) { + valid_files.push_back(strdup(last_filename)); } g_byte_array_free(gba, TRUE); g_free(last_filename); @@ -293,14 +326,12 @@ int main (int argc, char **argv) } } else { #endif /* WITH_INKJAR */ - /* Append to list */ - ss.slides.push_back(file); + auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); - if (!ss.doc) { - ss.doc = SPDocument::createNewDoc((ss.slides[ss.current]).c_str(), TRUE, false); - if (!ss.doc) { - ++ss.current; - } + if(doc) + { + /* Append to list */ + valid_files.push_back(file); } #ifdef WITH_INKJAR } @@ -308,27 +339,13 @@ int main (int argc, char **argv) } } - if(!ss.doc) { + if(valid_files.empty()) { return 1; /* none of the slides loadable */ } - ss.set_title(ss.doc->getName() ); - ss.set_default_size(MIN ((int)(ss.doc)->getWidth().value("px"), (int)gdk_screen_width() - 64), - MIN ((int)(ss.doc)->getHeight().value("px"), (int)gdk_screen_height() - 64)); - - g_signal_connect (G_OBJECT (ss.gobj()), "delete_event", (GCallback) sp_svgview_main_delete, &ss); - g_signal_connect (G_OBJECT (ss.gobj()), "key_press_event", (GCallback) sp_svgview_main_key_press, &ss); - - (ss.doc)->ensureUpToDate(); - ss.view = sp_svg_view_widget_new (ss.doc); - (ss.doc)->doUnref (); - SP_SVG_VIEW_WIDGET(ss.view)->setResize( false, ss.doc->getWidth().value("px"), ss.doc->getHeight().value("px") ); - gtk_widget_show (ss.view); - ss.add(*Glib::wrap(ss.view)); - - ss.show(); - - gtk_main (); + SPSlideShow ss(valid_files); + ss.set_timer(timer); + main_instance.run(); return 0; } @@ -414,11 +431,11 @@ void SPSlideShow::normal_cursor() void SPSlideShow::set_document(SPDocument *doc, int current) { - if (doc && doc != this->doc) { + if (doc && doc != _doc) { doc->ensureUpToDate(); - reinterpret_cast(SP_VIEW_WIDGET_VIEW (view))->setDocument (doc); - this->doc = doc; - this->current = current; + reinterpret_cast(SP_VIEW_WIDGET_VIEW (_view))->setDocument (doc); + _doc = doc; + _current = current; } } @@ -430,11 +447,11 @@ void SPSlideShow::show_next() waiting_cursor(); SPDocument *doc = NULL; - while (!doc && (current < slides.size() - 1)) { - doc = SPDocument::createNewDoc ((slides[++current]).c_str(), TRUE, false); + while (!doc && (_current < _slides.size() - 1)) { + doc = SPDocument::createNewDoc ((_slides[++_current]).c_str(), TRUE, false); } - set_document(doc, current); + set_document(doc, _current); normal_cursor(); } @@ -446,11 +463,11 @@ void SPSlideShow::show_prev() waiting_cursor(); SPDocument *doc = NULL; - while (!doc && (current > 0)) { - doc = SPDocument::createNewDoc ((slides[--current]).c_str(), TRUE, false); + while (!doc && (_current > 0)) { + doc = SPDocument::createNewDoc ((_slides[--_current]).c_str(), TRUE, false); } - set_document(doc, current); + set_document(doc, _current); normal_cursor(); } @@ -463,8 +480,8 @@ void SPSlideShow::goto_first() SPDocument *doc = NULL; int current = 0; - while ( !doc && (current < slides.size() - 1)) { - doc = SPDocument::createNewDoc((slides[current++]).c_str(), TRUE, false); + while ( !doc && (current < _slides.size() - 1)) { + doc = SPDocument::createNewDoc((_slides[current++]).c_str(), TRUE, false); } set_document(doc, current - 1); @@ -480,9 +497,9 @@ void SPSlideShow::goto_last() waiting_cursor(); SPDocument *doc = NULL; - int current = slides.size() - 1; + int current = _slides.size() - 1; while (!doc && (current >= 0)) { - doc = SPDocument::createNewDoc((slides[current--]).c_str(), TRUE, false); + doc = SPDocument::createNewDoc((_slides[current--]).c_str(), TRUE, false); } set_document(doc, current + 1); -- cgit v1.2.3 From caadc219ec9987f65d94a1e8f8198c9ab3c08bf5 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Thu, 25 Aug 2016 22:40:33 +0100 Subject: Inkview: Remove support for obsolete SVG JAR archives (bzr r15075) --- src/inkview.cpp | 59 --------------------------------------------------------- 1 file changed, 59 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 61017fc71..694869bf8 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -55,10 +55,6 @@ #include "svg-view-widget.h" #include "util/units.h" -#ifdef WITH_INKJAR -#include "io/inkjar.h" -#endif - #include "inkscape.h" #ifndef HAVE_BIND_TEXTDOMAIN_CODESET @@ -138,9 +134,6 @@ protected: int current); }; -#ifdef WITH_INKJAR -static bool is_jar(char const *filename); -#endif static void usage(); static GtkWidget *ctrlwin = NULL; @@ -292,40 +285,6 @@ int main (int argc, char **argv) || (st.st_size < 64)) { fprintf(stderr, "could not open file %s\n", file.c_str()); } else { - - #ifdef WITH_INKJAR - if (is_jar(file.c_str())) { - Inkjar::JarFileReader jar_file_reader(file.c_str()); - for (;;) { - GByteArray *gba = jar_file_reader.get_next_file(); - if (gba == NULL) { - char *c_ptr; - gchar *last_filename = jar_file_reader.get_last_filename(); - if (last_filename == NULL) - break; - if ((c_ptr = std::strrchr(last_filename, '/')) != NULL) { - if (*(++c_ptr) == '\0') { - g_free(last_filename); - continue; - } - } - } else if (gba->len > 0) { - // Try opening the document - auto doc = SPDocument::createNewDocFromMem ((const gchar *)gba->data, - gba->len, - TRUE); - gchar *last_filename = jar_file_reader.get_last_filename(); - if (doc) { - valid_files.push_back(strdup(last_filename)); - } - g_byte_array_free(gba, TRUE); - g_free(last_filename); - } else { - break; - } - } - } else { - #endif /* WITH_INKJAR */ auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); if(doc) @@ -333,9 +292,6 @@ int main (int argc, char **argv) /* Append to list */ valid_files.push_back(file); } - #ifdef WITH_INKJAR - } - #endif } } @@ -507,21 +463,6 @@ void SPSlideShow::goto_last() normal_cursor(); } -#ifdef WITH_INKJAR -static bool is_jar(char const *filename) -{ - /* fixme: Check MIME type or something. /usr/share/misc/file/magic suggests that checking for - initial string "PK\003\004" in content should suffice. */ - size_t const filename_len = strlen(filename); - if (filename_len < 5) { - return false; - } - char const *extension = filename + filename_len - 4; - return ((memcmp(extension, ".jar", 4) == 0) || - (memcmp(extension, ".sxw", 4) == 0) ); -} -#endif /* WITH_INKJAR */ - /* Local Variables: mode:c++ -- cgit v1.2.3 From 2e0b7a4f08c74d8bd326616b5d48b0d1c8614672 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Thu, 25 Aug 2016 23:24:46 +0100 Subject: Inkview: C++ify (bzr r15076) --- src/inkview.cpp | 103 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 54 insertions(+), 49 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 694869bf8..434680884 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -38,11 +38,10 @@ #include #include +#include #include #include -// #include - #include #include @@ -93,33 +92,8 @@ public: set_title(_doc->getName()); } - SPSlideShow(std::vector &slides) - : - _slides(slides), - _current(0), - _doc(SPDocument::createNewDoc(_slides[0].c_str(), true, false)), - _view(NULL), - is_fullscreen(false), - _timer(0) - { - update_title(); - - set_default_size(MIN ((int)_doc->getWidth().value("px"), (int)gdk_screen_width() - 64), - MIN ((int)_doc->getHeight().value("px"), (int)gdk_screen_height() - 64)); - - g_signal_connect (G_OBJECT (gobj()), "delete_event", (GCallback) sp_svgview_main_delete, this); - g_signal_connect (G_OBJECT (gobj()), "key_press_event", (GCallback) sp_svgview_main_key_press, this); - - _doc->ensureUpToDate(); - _view = sp_svg_view_widget_new (_doc); - _doc->doUnref (); - SP_SVG_VIEW_WIDGET(_view)->setResize( false, _doc->getWidth().value("px"), _doc->getHeight().value("px") ); - gtk_widget_show (_view); - add(*Glib::wrap(_view)); - - show(); - } - + SPSlideShow(std::vector const &slides); + void set_timer(int timer) {_timer = timer;} void control_show(); void show_next(); @@ -134,9 +108,38 @@ protected: int current); }; +SPSlideShow::SPSlideShow(std::vector const &slides) + : + _slides(slides), + _current(0), + _doc(SPDocument::createNewDoc(_slides[0].c_str(), true, false)), + _view(NULL), + is_fullscreen(false), + _timer(0) +{ + update_title(); + + auto default_screen = Gdk::Screen::get_default(); + + set_default_size(MIN ((int)_doc->getWidth().value("px"), default_screen->get_width() - 64), + MIN ((int)_doc->getHeight().value("px"), default_screen->get_height() - 64)); + + g_signal_connect (G_OBJECT (gobj()), "delete_event", (GCallback) sp_svgview_main_delete, this); + g_signal_connect (G_OBJECT (gobj()), "key_press_event", (GCallback) sp_svgview_main_key_press, this); + + _doc->ensureUpToDate(); + _view = sp_svg_view_widget_new (_doc); + _doc->doUnref (); + SP_SVG_VIEW_WIDGET(_view)->setResize( false, _doc->getWidth().value("px"), _doc->getHeight().value("px") ); + gtk_widget_show (_view); + add(*Glib::wrap(_view)); + + show(); +} + static void usage(); -static GtkWidget *ctrlwin = NULL; +static Gtk::Window *ctrlwin = NULL; // Dummy functions to keep linker happy int sp_main_gui (int, char const**) { return 0; } @@ -190,7 +193,7 @@ static int sp_svgview_main_key_press (GtkWidget */*widget*/, case GDK_KEY_Escape: case GDK_KEY_q: case GDK_KEY_Q: - gtk_main_quit(); + Gtk::Main::quit(); break; default: break; @@ -283,7 +286,7 @@ int main (int argc, char **argv) if (stat(file.c_str(), &st) || !S_ISREG (st.st_mode) || (st.st_size < 64)) { - fprintf(stderr, "could not open file %s\n", file.c_str()); + std::cerr << "could not open file " << file << std::endl; } else { auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); @@ -310,6 +313,8 @@ static int sp_svgview_ctrlwin_delete (GtkWidget */*widget*/, GdkEvent */*event*/, void */*data*/) { + if(ctrlwin) delete ctrlwin; + ctrlwin = NULL; return FALSE; } @@ -320,45 +325,45 @@ static int sp_svgview_ctrlwin_delete (GtkWidget */*widget*/, void SPSlideShow::control_show() { if (!ctrlwin) { - ctrlwin = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_resizable(GTK_WINDOW(ctrlwin), FALSE); - gtk_window_set_transient_for(GTK_WINDOW(ctrlwin), GTK_WINDOW(this->gobj())); - g_signal_connect(G_OBJECT (ctrlwin), "key_press_event", (GCallback) sp_svgview_main_key_press, this); - g_signal_connect(G_OBJECT (ctrlwin), "delete_event", (GCallback) sp_svgview_ctrlwin_delete, NULL); - auto t = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); - gtk_container_add(GTK_CONTAINER(ctrlwin), t); + ctrlwin = new Gtk::Window(); + ctrlwin->set_resizable(false); + ctrlwin->set_transient_for(*this); + g_signal_connect(G_OBJECT (ctrlwin->gobj()), "key_press_event", (GCallback) sp_svgview_main_key_press, this); + g_signal_connect(G_OBJECT (ctrlwin->gobj()), "delete_event", (GCallback) sp_svgview_ctrlwin_delete, NULL); + auto t = Gtk::manage(new Gtk::ButtonBox()); + ctrlwin->add(*t); auto btn_go_first = Gtk::manage(new Gtk::Button()); auto img_go_first = Gtk::manage(new Gtk::Image()); img_go_first->set_from_icon_name(INKSCAPE_ICON("go-first"), Gtk::ICON_SIZE_BUTTON); btn_go_first->set_image(*img_go_first); - gtk_container_add(GTK_CONTAINER(t), GTK_WIDGET(btn_go_first->gobj())); + t->add(*btn_go_first); btn_go_first->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::goto_first)); auto btn_go_prev = Gtk::manage(new Gtk::Button()); auto img_go_prev = Gtk::manage(new Gtk::Image()); img_go_prev->set_from_icon_name(INKSCAPE_ICON("go-previous"), Gtk::ICON_SIZE_BUTTON); btn_go_prev->set_image(*img_go_prev); - gtk_container_add(GTK_CONTAINER(t), GTK_WIDGET(btn_go_prev->gobj())); + t->add(*btn_go_prev); btn_go_prev->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::show_prev)); auto btn_go_next = Gtk::manage(new Gtk::Button()); auto img_go_next = Gtk::manage(new Gtk::Image()); img_go_next->set_from_icon_name(INKSCAPE_ICON("go-next"), Gtk::ICON_SIZE_BUTTON); btn_go_next->set_image(*img_go_next); - gtk_container_add(GTK_CONTAINER(t), GTK_WIDGET(btn_go_next->gobj())); + t->add(*btn_go_next); btn_go_next->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::show_next)); auto btn_go_last = Gtk::manage(new Gtk::Button()); auto img_go_last = Gtk::manage(new Gtk::Image()); img_go_last->set_from_icon_name(INKSCAPE_ICON("go-last"), Gtk::ICON_SIZE_BUTTON); btn_go_last->set_image(*img_go_last); - gtk_container_add(GTK_CONTAINER(t), GTK_WIDGET(btn_go_last->gobj())); + t->add(*btn_go_last); btn_go_last->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::goto_last)); - gtk_widget_show_all(ctrlwin); + ctrlwin->show_all(); } else { - gtk_window_present(GTK_WINDOW(ctrlwin)); + ctrlwin->present(); } } @@ -369,10 +374,10 @@ void SPSlideShow::waiting_cursor() get_window()->set_cursor(waiting); if (ctrlwin) { - gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ctrlwin)), waiting->gobj()); + ctrlwin->get_window()->set_cursor(waiting); } - while(gtk_events_pending()) { - gtk_main_iteration(); + while(Gtk::Main::events_pending()) { + Gtk::Main::iteration(); } } @@ -380,7 +385,7 @@ void SPSlideShow::normal_cursor() { get_window()->set_cursor(); if (ctrlwin) { - gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ctrlwin)), NULL); + ctrlwin->get_window()->set_cursor(); } } -- cgit v1.2.3 From 89375d1e62cb033ec870e9b8e7837437b71737e3 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Thu, 25 Aug 2016 23:58:15 +0100 Subject: Inkview: Make ctrlwin private (bzr r15077) --- src/inkview.cpp | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 434680884..7acaa83dd 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -76,11 +76,13 @@ static int sp_svgview_main_key_press (GtkWidget *widget, * The main application window for the slideshow */ class SPSlideShow : public Gtk::ApplicationWindow { +private: std::vector _slides; ///< List of filenames for each slide int _current; ///< Index of the currently displayed slide SPDocument *_doc; ///< The currently displayed slide int _timer; GtkWidget *_view; + Gtk::Window *_ctrlwin; ///< Window containing slideshow control buttons public: /// Current state of application (full-screen or windowed) @@ -101,6 +103,9 @@ public: void goto_first(); void goto_last(); + static int ctrlwin_delete (GtkWidget *widget, + GdkEvent *event, + void *data); protected: void waiting_cursor(); void normal_cursor(); @@ -115,7 +120,8 @@ SPSlideShow::SPSlideShow(std::vector const &slides) _doc(SPDocument::createNewDoc(_slides[0].c_str(), true, false)), _view(NULL), is_fullscreen(false), - _timer(0) + _timer(0), + _ctrlwin(NULL) { update_title(); @@ -139,7 +145,6 @@ SPSlideShow::SPSlideShow(std::vector const &slides) static void usage(); -static Gtk::Window *ctrlwin = NULL; // Dummy functions to keep linker happy int sp_main_gui (int, char const**) { return 0; } @@ -309,13 +314,14 @@ int main (int argc, char **argv) return 0; } -static int sp_svgview_ctrlwin_delete (GtkWidget */*widget*/, - GdkEvent */*event*/, - void */*data*/) +int SPSlideShow::ctrlwin_delete (GtkWidget */*widget*/, + GdkEvent */*event*/, + void *data) { - if(ctrlwin) delete ctrlwin; + auto ss = reinterpret_cast(data); + if(ss->_ctrlwin) delete ss->_ctrlwin; - ctrlwin = NULL; + ss->_ctrlwin = NULL; return FALSE; } @@ -324,14 +330,14 @@ static int sp_svgview_ctrlwin_delete (GtkWidget */*widget*/, */ void SPSlideShow::control_show() { - if (!ctrlwin) { - ctrlwin = new Gtk::Window(); - ctrlwin->set_resizable(false); - ctrlwin->set_transient_for(*this); - g_signal_connect(G_OBJECT (ctrlwin->gobj()), "key_press_event", (GCallback) sp_svgview_main_key_press, this); - g_signal_connect(G_OBJECT (ctrlwin->gobj()), "delete_event", (GCallback) sp_svgview_ctrlwin_delete, NULL); + if (!_ctrlwin) { + _ctrlwin = new Gtk::Window(); + _ctrlwin->set_resizable(false); + _ctrlwin->set_transient_for(*this); + g_signal_connect(G_OBJECT (_ctrlwin->gobj()), "key_press_event", (GCallback) sp_svgview_main_key_press, this); + g_signal_connect(G_OBJECT (_ctrlwin->gobj()), "delete_event", (GCallback) SPSlideShow::ctrlwin_delete, this); auto t = Gtk::manage(new Gtk::ButtonBox()); - ctrlwin->add(*t); + _ctrlwin->add(*t); auto btn_go_first = Gtk::manage(new Gtk::Button()); auto img_go_first = Gtk::manage(new Gtk::Image()); @@ -361,9 +367,9 @@ void SPSlideShow::control_show() t->add(*btn_go_last); btn_go_last->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::goto_last)); - ctrlwin->show_all(); + _ctrlwin->show_all(); } else { - ctrlwin->present(); + _ctrlwin->present(); } } @@ -373,8 +379,8 @@ void SPSlideShow::waiting_cursor() auto waiting = Gdk::Cursor::create(display, Gdk::WATCH); get_window()->set_cursor(waiting); - if (ctrlwin) { - ctrlwin->get_window()->set_cursor(waiting); + if (_ctrlwin) { + _ctrlwin->get_window()->set_cursor(waiting); } while(Gtk::Main::events_pending()) { Gtk::Main::iteration(); @@ -384,8 +390,8 @@ void SPSlideShow::waiting_cursor() void SPSlideShow::normal_cursor() { get_window()->set_cursor(); - if (ctrlwin) { - ctrlwin->get_window()->set_cursor(); + if (_ctrlwin) { + _ctrlwin->get_window()->set_cursor(); } } -- cgit v1.2.3 From 983830727db80ba8e6b1eb6c5663b1f9ab9c866d Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 7 May 2017 18:31:04 +0200 Subject: Minor refactor: check setlocale() occurences and make sure we do not setlocale() without resetting it to the initial default) - inkview.cpp : This occurence in fact does *not* seem to be needed anymore (despite what the comment says) - main.cpp : The (commented out) occurence is unnecessary as it is called as part of gtk_init_check() (bzr r15674) --- src/inkview.cpp | 5 ----- 1 file changed, 5 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 7acaa83dd..4f8665a02 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -270,11 +270,6 @@ int main (int argc, char **argv) sp_modulesys_init(); #endif /* WITH_MODULES */ - /* We must set LC_NUMERIC to default, or otherwise */ - /* we'll end with localised SVG files :-( */ - - setlocale (LC_NUMERIC, "C"); - Inkscape::Application::create(argv[0], true); if(filenames.empty()) -- cgit v1.2.3 From ee7eeb26f4841bf3aa7561c8c9ebcb775cc3dbd8 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Mon, 8 May 2017 01:04:02 +0200 Subject: Inkview: Fix localization (bzr r15675.1.5) --- src/inkview.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 4f8665a02..a7a6b6a78 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -34,7 +34,6 @@ #include #include -#include #include #include @@ -49,16 +48,18 @@ #include "preferences.h" #include +#include + #include "document.h" #include "svg-view.h" #include "svg-view-widget.h" #include "util/units.h" +#ifdef ENABLE_NLS +#include "helper/gettext.h" +#endif -#include "inkscape.h" -#ifndef HAVE_BIND_TEXTDOMAIN_CODESET -#define bind_textdomain_codeset(p,c) -#endif +#include "inkscape.h" #include "ui/icon-names.h" @@ -231,6 +232,7 @@ public: _entry_timer.set_short_name('t'); _entry_timer.set_long_name("timer"); _entry_timer.set_arg_description(_("NUM")); + _entry_timer.set_description(_("Reset timer:")); add_entry(_entry_timer, timer); // Entry for the remaining non-option arguments @@ -248,28 +250,23 @@ private: int main (int argc, char **argv) { +#ifdef ENABLE_NLS + Inkscape::initialize_gettext(); +#endif + Glib::OptionContext opt(_("Open SVG files")); InkviewOptionsGroup grp; opt.set_main_group(grp); - + // Prevents errors like "Unable to wrap GdkPixbuf..." (in nr-filter-image.cpp for example) Gtk::Main::init_gtkmm_internals(); Gtk::Main main_instance (argc, argv, opt); - bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); - LIBXML_TEST_VERSION Inkscape::GC::init(); Inkscape::Preferences::get(); // ensure preferences are initialized -#ifdef lalaWITH_MODULES - g_warning ("Have to autoinit modules (lauris)"); - sp_modulesys_init(); -#endif /* WITH_MODULES */ - Inkscape::Application::create(argv[0], true); if(filenames.empty()) -- cgit v1.2.3 From ecd36f0dc901a3dc538df68c75f3e0a3f591a37e Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Fri, 12 May 2017 04:06:58 +0200 Subject: Inkview: Fix gettext localization (bzr r15687.1.1) --- src/inkview.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index a7a6b6a78..abb12462a 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -223,22 +223,22 @@ class InkviewOptionsGroup : public Glib::OptionGroup public: InkviewOptionsGroup() : - Glib::OptionGroup(_("Inkscape Options"), - _("Default program options")), + Glib::OptionGroup(N_("Inkscape Options"), + N_("Default program options")), _entry_timer(), _entry_args() { // Entry for the "timer" option _entry_timer.set_short_name('t'); _entry_timer.set_long_name("timer"); - _entry_timer.set_arg_description(_("NUM")); - _entry_timer.set_description(_("Reset timer:")); + _entry_timer.set_arg_description(N_("NUM")); + _entry_timer.set_description(N_("Reset timer:")); add_entry(_entry_timer, timer); // Entry for the remaining non-option arguments _entry_args.set_short_name('\0'); _entry_args.set_long_name(G_OPTION_REMAINING); - _entry_args.set_arg_description(_("FILES...")); + _entry_args.set_arg_description(N_("FILES...")); add_entry(_entry_args, filenames); } @@ -254,8 +254,12 @@ int main (int argc, char **argv) Inkscape::initialize_gettext(); #endif - Glib::OptionContext opt(_("Open SVG files")); + Glib::OptionContext opt(N_("Open SVG files")); + opt.set_translation_domain(GETTEXT_PACKAGE); + InkviewOptionsGroup grp; + grp.set_translation_domain(GETTEXT_PACKAGE); + opt.set_main_group(grp); // Prevents errors like "Unable to wrap GdkPixbuf..." (in nr-filter-image.cpp for example) -- cgit v1.2.3 From 30c69ed93c47ef06a7a777bda2b02e6b7c25eedc Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Fri, 12 May 2017 04:18:06 +0200 Subject: Inkview: Fix encoding of console output on Windows To do this we have to "hack" g_print() as the glib people decided Windows consoles should be limited to 255 character code pages forevermore and g_print() converts all strings to the system's ANSI code page without exception. (see http://stackoverflow.com/q/43927373/2514664 for details) (bzr r15687.1.2) --- src/inkview.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index abb12462a..cbbd4d6c3 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -248,8 +248,22 @@ private: Glib::OptionEntry _entry_args; }; + +#ifdef WIN32 +// minimal print handler (just prints the string to stdout) +void g_print_no_convert(const gchar *buf) +{ + fputs(buf, stdout); +} +#endif + int main (int argc, char **argv) { +#ifdef WIN32 + // Ugly hack to make g_print emit UTF-8 encoded characters. Otherwise glib will *always* + // perform character conversion to the system's ANSI code page making UTF-8 output impossible. + g_set_print_handler(g_print_no_convert); +#endif #ifdef ENABLE_NLS Inkscape::initialize_gettext(); #endif @@ -275,7 +289,7 @@ int main (int argc, char **argv) if(filenames.empty()) { - std::cout << opt.get_help(); + g_print(opt.get_help().c_str()); exit(EXIT_FAILURE); } -- cgit v1.2.3 From a560e28ed15c14afd9a4657ce4a33895eeed0397 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Fri, 12 May 2017 04:27:13 +0200 Subject: Inkview: minor cleanup (bzr r15687.1.3) --- src/inkview.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index cbbd4d6c3..ca3d16cdf 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -144,12 +144,6 @@ SPSlideShow::SPSlideShow(std::vector const &slides) show(); } -static void usage(); - - -// Dummy functions to keep linker happy -int sp_main_gui (int, char const**) { return 0; } -int sp_main_console (int, char const**) { return 0; } static int sp_svgview_main_delete (GtkWidget */*widget*/, GdkEvent */*event*/, @@ -238,7 +232,7 @@ public: // Entry for the remaining non-option arguments _entry_args.set_short_name('\0'); _entry_args.set_long_name(G_OPTION_REMAINING); - _entry_args.set_arg_description(N_("FILES...")); + _entry_args.set_arg_description(N_("FILES …")); add_entry(_entry_args, filenames); } @@ -276,8 +270,6 @@ int main (int argc, char **argv) opt.set_main_group(grp); - // Prevents errors like "Unable to wrap GdkPixbuf..." (in nr-filter-image.cpp for example) - Gtk::Main::init_gtkmm_internals(); Gtk::Main main_instance (argc, argv, opt); LIBXML_TEST_VERSION -- cgit v1.2.3 From 2f0bb898db5a229e7967f6708a64aebb602c121d Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Fri, 12 May 2017 23:02:21 +0200 Subject: Fix build warning (bzr r15690) --- src/inkview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index ca3d16cdf..b52d69825 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -281,7 +281,7 @@ int main (int argc, char **argv) if(filenames.empty()) { - g_print(opt.get_help().c_str()); + g_print("%s", opt.get_help().c_str()); exit(EXIT_FAILURE); } -- cgit v1.2.3 From c5f6ddd9b268dd6b5165a2353ee1a893075da91a Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sat, 13 May 2017 18:56:35 +0200 Subject: Inkview: Fix loading files with non-ASCII characters in filename Fixed bugs: - https://launchpad.net/bugs/488997 (bzr r15690.1.1) --- src/inkview.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index b52d69825..1848cccd3 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -31,7 +31,6 @@ #endif #include -#include #include @@ -53,6 +52,8 @@ #include "document.h" #include "svg-view.h" #include "svg-view-widget.h" + +#include "io/sys.h" #include "util/units.h" #ifdef ENABLE_NLS #include "helper/gettext.h" @@ -289,10 +290,8 @@ int main (int argc, char **argv) for(auto file : filenames) { - struct stat st; - if (stat(file.c_str(), &st) - || !S_ISREG (st.st_mode) - || (st.st_size < 64)) { + if (!Inkscape::IO::file_test( file.c_str(), G_FILE_TEST_EXISTS )) + { std::cerr << "could not open file " << file << std::endl; } else { auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); -- cgit v1.2.3 From 8c9ccd06ff0c11ec7728775ebedc4247d4e41234 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sat, 13 May 2017 19:21:17 +0200 Subject: Inkview: Print error in correct encoding. (bzr r15690.1.2) --- src/inkview.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 1848cccd3..3cca34d6c 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -246,10 +246,8 @@ private: #ifdef WIN32 // minimal print handler (just prints the string to stdout) -void g_print_no_convert(const gchar *buf) -{ - fputs(buf, stdout); -} +void g_print_no_convert(const gchar *buf) { fputs(buf, stdout); } +void g_printerr_no_convert(const gchar *buf) { fputs(buf, stderr); } #endif int main (int argc, char **argv) @@ -258,6 +256,7 @@ int main (int argc, char **argv) // Ugly hack to make g_print emit UTF-8 encoded characters. Otherwise glib will *always* // perform character conversion to the system's ANSI code page making UTF-8 output impossible. g_set_print_handler(g_print_no_convert); + g_set_printerr_handler(g_print_no_convert); #endif #ifdef ENABLE_NLS Inkscape::initialize_gettext(); @@ -290,9 +289,8 @@ int main (int argc, char **argv) for(auto file : filenames) { - if (!Inkscape::IO::file_test( file.c_str(), G_FILE_TEST_EXISTS )) - { - std::cerr << "could not open file " << file << std::endl; + if (!Inkscape::IO::file_test( file.c_str(), G_FILE_TEST_EXISTS )) { + g_printerr("File does not exist: %s\n", file.c_str()); } else { auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); -- cgit v1.2.3 From d6170f0d771ce86df57dc90c9c9ac4d6f8845c7d Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sat, 13 May 2017 21:06:24 +0200 Subject: Inkview: Put checking for valid files in separate function (bzr r15690.1.3) --- src/inkview.cpp | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 3cca34d6c..0358fe917 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -244,6 +244,29 @@ private: }; +/** get a list of valid SVG files from a list of strings */ +std::vector get_valid_files(std::vector filenames) +{ + std::vector valid_files; + + for(auto file : filenames) + { + if (!Inkscape::IO::file_test( file.c_str(), G_FILE_TEST_EXISTS )) { + g_printerr("File does not exist: %s\n", file.c_str()); + } else { + auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); + + if(doc) + { + /* Append to list */ + valid_files.push_back(file); + } + } + } + + return valid_files; +} + #ifdef WIN32 // minimal print handler (just prints the string to stdout) void g_print_no_convert(const gchar *buf) { fputs(buf, stdout); } @@ -285,23 +308,7 @@ int main (int argc, char **argv) exit(EXIT_FAILURE); } - std::vector valid_files; - - for(auto file : filenames) - { - if (!Inkscape::IO::file_test( file.c_str(), G_FILE_TEST_EXISTS )) { - g_printerr("File does not exist: %s\n", file.c_str()); - } else { - auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); - - if(doc) - { - /* Append to list */ - valid_files.push_back(file); - } - } - } - + std::vector valid_files = get_valid_files(filenames); if(valid_files.empty()) { return 1; /* none of the slides loadable */ } -- cgit v1.2.3 From 5725bbcbd308cd7341da49947484dcce7df9eeb4 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sat, 13 May 2017 22:40:24 +0200 Subject: Inkview: Support folders as input. All .svg and .svgz files contained in the specified folder(s) will be opened. Note: Currently this is done non-recursively, but a command line option to make this recursive could be easily added in future (see "recursive" parameter of "get_valid_files()" function). (bzr r15690.1.4) --- src/inkview.cpp | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 0358fe917..f41e36cb1 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -46,8 +46,8 @@ #include "inkgc/gc-core.h" #include "preferences.h" +#include #include -#include #include "document.h" #include "svg-view.h" @@ -245,21 +245,36 @@ private: /** get a list of valid SVG files from a list of strings */ -std::vector get_valid_files(std::vector filenames) +std::vector get_valid_files(std::vector filenames, bool recursive = false) { std::vector valid_files; for(auto file : filenames) { if (!Inkscape::IO::file_test( file.c_str(), G_FILE_TEST_EXISTS )) { - g_printerr("File does not exist: %s\n", file.c_str()); + g_printerr("%s: %s\n", _("File or folder does not exist"), file.c_str()); } else { - auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); + if (Inkscape::IO::file_test( file.c_str(), G_FILE_TEST_IS_DIR )) { + if (recursive) { + std::vector new_filenames; + Glib::Dir directory(file); + for (auto new_file: directory) { + Glib::ustring extension = new_file.substr( new_file.find_last_of(".") + 1 ); + if (!extension.compare("svg") || !extension.compare("svgz")) { + new_filenames.push_back(Glib::build_filename(file, new_file)); + } + } + std::vector new_files = get_valid_files(new_filenames); + valid_files.insert(valid_files.end(), new_files.begin(), new_files.end()); + } + } else { + auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); - if(doc) - { - /* Append to list */ - valid_files.push_back(file); + if(doc) + { + /* Append to list */ + valid_files.push_back(file); + } } } } @@ -308,7 +323,7 @@ int main (int argc, char **argv) exit(EXIT_FAILURE); } - std::vector valid_files = get_valid_files(filenames); + std::vector valid_files = get_valid_files(filenames, true); if(valid_files.empty()) { return 1; /* none of the slides loadable */ } -- cgit v1.2.3 From 1fead914d382ed1173d8bc4941c8ed270fe95b08 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sat, 13 May 2017 23:01:29 +0200 Subject: Inkview: Print warning if a file failed to load. (bzr r15690.1.5) --- src/inkview.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index f41e36cb1..5ba896a40 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -269,11 +269,11 @@ std::vector get_valid_files(std::vector filenames, } } else { auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); - - if(doc) - { + if(doc) { /* Append to list */ valid_files.push_back(file); + } else { + g_printerr("%s: %s\n", _("Could not open file"), file.c_str()); } } } -- cgit v1.2.3 From b22b1218a3b22272e5c223959272fd22bb477548 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sat, 13 May 2017 23:16:17 +0200 Subject: Inkview: Show number of current slide and total number of slides in title (bzr r15690.1.6) --- src/inkview.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 5ba896a40..897ecb3fb 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -93,7 +93,12 @@ public: /// Update the window title with current document name void update_title() { - set_title(_doc->getName()); + Glib::ustring title(_doc->getName()); + if (_slides.size() > 1) { + title += Glib::ustring::compose(" (%1/%2)", _current+1, _slides.size()); + } + + set_title(title); } SPSlideShow(std::vector const &slides); -- cgit v1.2.3 From b2280a117695f1205e549066f9a459b26cf89f8d Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sat, 13 May 2017 23:27:16 +0200 Subject: Inkview: Title was not updated when using controls in control window. (bzr r15690.1.7) --- src/inkview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 897ecb3fb..f39dd4cf4 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -205,7 +205,6 @@ static int sp_svgview_main_key_press (GtkWidget */*widget*/, break; } - ss->update_title(); return TRUE; } @@ -429,6 +428,7 @@ void SPSlideShow::set_document(SPDocument *doc, reinterpret_cast(SP_VIEW_WIDGET_VIEW (_view))->setDocument (doc); _doc = doc; _current = current; + update_title(); } } -- cgit v1.2.3 From 030f2f1ebd1f776b45576079a1a4c2768553873a Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 02:12:38 +0200 Subject: Inkview: Refactoring - move SPSlideShow to separate source file (bzr r15690.1.8) --- src/inkview.cpp | 330 +------------------------------------------------------- 1 file changed, 5 insertions(+), 325 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index f39dd4cf4..abb690619 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -25,188 +25,29 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ - #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include -#include - - #include -#include -#include -#include #include #include -#include - -#include "inkgc/gc-core.h" -#include "preferences.h" #include #include #include "document.h" -#include "svg-view.h" -#include "svg-view-widget.h" - -#include "io/sys.h" -#include "util/units.h" +#include "inkscape.h" +#include "preferences.h" #ifdef ENABLE_NLS #include "helper/gettext.h" #endif +#include "inkgc/gc-core.h" +#include "io/sys.h" +#include "svg-view-slideshow.h" -#include "inkscape.h" - -#include "ui/icon-names.h" - -class SPSlideShow; - -static int sp_svgview_main_delete (GtkWidget *widget, - GdkEvent *event, - struct SPSlideShow *ss); - -static int sp_svgview_main_key_press (GtkWidget *widget, - GdkEventKey *event, - struct SPSlideShow *ss); - -/** - * The main application window for the slideshow - */ -class SPSlideShow : public Gtk::ApplicationWindow { -private: - std::vector _slides; ///< List of filenames for each slide - int _current; ///< Index of the currently displayed slide - SPDocument *_doc; ///< The currently displayed slide - int _timer; - GtkWidget *_view; - Gtk::Window *_ctrlwin; ///< Window containing slideshow control buttons - -public: - /// Current state of application (full-screen or windowed) - bool is_fullscreen; - - /// Update the window title with current document name - void update_title() - { - Glib::ustring title(_doc->getName()); - if (_slides.size() > 1) { - title += Glib::ustring::compose(" (%1/%2)", _current+1, _slides.size()); - } - - set_title(title); - } - - SPSlideShow(std::vector const &slides); - - void set_timer(int timer) {_timer = timer;} - void control_show(); - void show_next(); - void show_prev(); - void goto_first(); - void goto_last(); - - static int ctrlwin_delete (GtkWidget *widget, - GdkEvent *event, - void *data); -protected: - void waiting_cursor(); - void normal_cursor(); - void set_document(SPDocument *doc, - int current); -}; - -SPSlideShow::SPSlideShow(std::vector const &slides) - : - _slides(slides), - _current(0), - _doc(SPDocument::createNewDoc(_slides[0].c_str(), true, false)), - _view(NULL), - is_fullscreen(false), - _timer(0), - _ctrlwin(NULL) -{ - update_title(); - - auto default_screen = Gdk::Screen::get_default(); - - set_default_size(MIN ((int)_doc->getWidth().value("px"), default_screen->get_width() - 64), - MIN ((int)_doc->getHeight().value("px"), default_screen->get_height() - 64)); - - g_signal_connect (G_OBJECT (gobj()), "delete_event", (GCallback) sp_svgview_main_delete, this); - g_signal_connect (G_OBJECT (gobj()), "key_press_event", (GCallback) sp_svgview_main_key_press, this); - - _doc->ensureUpToDate(); - _view = sp_svg_view_widget_new (_doc); - _doc->doUnref (); - SP_SVG_VIEW_WIDGET(_view)->setResize( false, _doc->getWidth().value("px"), _doc->getHeight().value("px") ); - gtk_widget_show (_view); - add(*Glib::wrap(_view)); - - show(); -} - - -static int sp_svgview_main_delete (GtkWidget */*widget*/, - GdkEvent */*event*/, - struct SPSlideShow */*ss*/) -{ - Gtk::Main::quit(); - return FALSE; -} - -static int sp_svgview_main_key_press (GtkWidget */*widget*/, - GdkEventKey *event, - struct SPSlideShow *ss) -{ - switch (event->keyval) { - case GDK_KEY_Up: - case GDK_KEY_Home: - ss->goto_first(); - break; - case GDK_KEY_Down: - case GDK_KEY_End: - ss->goto_last(); - break; - case GDK_KEY_F11: - if (ss->is_fullscreen) { - ss->unfullscreen(); - ss->is_fullscreen = false; - } else { - ss->fullscreen(); - ss->is_fullscreen = true; - } - break; - case GDK_KEY_Return: - ss->control_show(); - break; - case GDK_KEY_KP_Page_Down: - case GDK_KEY_Page_Down: - case GDK_KEY_Right: - case GDK_KEY_space: - ss->show_next(); - break; - case GDK_KEY_KP_Page_Up: - case GDK_KEY_Page_Up: - case GDK_KEY_Left: - case GDK_KEY_BackSpace: - ss->show_prev(); - break; - case GDK_KEY_Escape: - case GDK_KEY_q: - case GDK_KEY_Q: - Gtk::Main::quit(); - break; - default: - break; - } - - return TRUE; -} /// List of all input filenames static Glib::OptionGroup::vecustrings filenames; @@ -339,167 +180,6 @@ int main (int argc, char **argv) return 0; } -int SPSlideShow::ctrlwin_delete (GtkWidget */*widget*/, - GdkEvent */*event*/, - void *data) -{ - auto ss = reinterpret_cast(data); - if(ss->_ctrlwin) delete ss->_ctrlwin; - - ss->_ctrlwin = NULL; - return FALSE; -} - -/** - * @brief Show the control buttons (next, previous etc) for the application - */ -void SPSlideShow::control_show() -{ - if (!_ctrlwin) { - _ctrlwin = new Gtk::Window(); - _ctrlwin->set_resizable(false); - _ctrlwin->set_transient_for(*this); - g_signal_connect(G_OBJECT (_ctrlwin->gobj()), "key_press_event", (GCallback) sp_svgview_main_key_press, this); - g_signal_connect(G_OBJECT (_ctrlwin->gobj()), "delete_event", (GCallback) SPSlideShow::ctrlwin_delete, this); - auto t = Gtk::manage(new Gtk::ButtonBox()); - _ctrlwin->add(*t); - - auto btn_go_first = Gtk::manage(new Gtk::Button()); - auto img_go_first = Gtk::manage(new Gtk::Image()); - img_go_first->set_from_icon_name(INKSCAPE_ICON("go-first"), Gtk::ICON_SIZE_BUTTON); - btn_go_first->set_image(*img_go_first); - t->add(*btn_go_first); - btn_go_first->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::goto_first)); - - auto btn_go_prev = Gtk::manage(new Gtk::Button()); - auto img_go_prev = Gtk::manage(new Gtk::Image()); - img_go_prev->set_from_icon_name(INKSCAPE_ICON("go-previous"), Gtk::ICON_SIZE_BUTTON); - btn_go_prev->set_image(*img_go_prev); - t->add(*btn_go_prev); - btn_go_prev->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::show_prev)); - - auto btn_go_next = Gtk::manage(new Gtk::Button()); - auto img_go_next = Gtk::manage(new Gtk::Image()); - img_go_next->set_from_icon_name(INKSCAPE_ICON("go-next"), Gtk::ICON_SIZE_BUTTON); - btn_go_next->set_image(*img_go_next); - t->add(*btn_go_next); - btn_go_next->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::show_next)); - - auto btn_go_last = Gtk::manage(new Gtk::Button()); - auto img_go_last = Gtk::manage(new Gtk::Image()); - img_go_last->set_from_icon_name(INKSCAPE_ICON("go-last"), Gtk::ICON_SIZE_BUTTON); - btn_go_last->set_image(*img_go_last); - t->add(*btn_go_last); - btn_go_last->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::goto_last)); - - _ctrlwin->show_all(); - } else { - _ctrlwin->present(); - } -} - -void SPSlideShow::waiting_cursor() -{ - auto display = Gdk::Display::get_default(); - auto waiting = Gdk::Cursor::create(display, Gdk::WATCH); - get_window()->set_cursor(waiting); - - if (_ctrlwin) { - _ctrlwin->get_window()->set_cursor(waiting); - } - while(Gtk::Main::events_pending()) { - Gtk::Main::iteration(); - } -} - -void SPSlideShow::normal_cursor() -{ - get_window()->set_cursor(); - if (_ctrlwin) { - _ctrlwin->get_window()->set_cursor(); - } -} - -void SPSlideShow::set_document(SPDocument *doc, - int current) -{ - if (doc && doc != _doc) { - doc->ensureUpToDate(); - reinterpret_cast(SP_VIEW_WIDGET_VIEW (_view))->setDocument (doc); - _doc = doc; - _current = current; - update_title(); - } -} - -/** - * @brief Show the next file in the slideshow - */ -void SPSlideShow::show_next() -{ - waiting_cursor(); - - SPDocument *doc = NULL; - while (!doc && (_current < _slides.size() - 1)) { - doc = SPDocument::createNewDoc ((_slides[++_current]).c_str(), TRUE, false); - } - - set_document(doc, _current); - normal_cursor(); -} - -/** - * @brief Show the previous file in the slideshow - */ -void SPSlideShow::show_prev() -{ - waiting_cursor(); - - SPDocument *doc = NULL; - while (!doc && (_current > 0)) { - doc = SPDocument::createNewDoc ((_slides[--_current]).c_str(), TRUE, false); - } - - set_document(doc, _current); - normal_cursor(); -} - -/** - * @brief Switch to first slide in slideshow - */ -void SPSlideShow::goto_first() -{ - waiting_cursor(); - - SPDocument *doc = NULL; - int current = 0; - while ( !doc && (current < _slides.size() - 1)) { - doc = SPDocument::createNewDoc((_slides[current++]).c_str(), TRUE, false); - } - - set_document(doc, current - 1); - - normal_cursor(); -} - -/** - * @brief Switch to last slide in slideshow - */ -void SPSlideShow::goto_last() -{ - waiting_cursor(); - - SPDocument *doc = NULL; - int current = _slides.size() - 1; - while (!doc && (current >= 0)) { - doc = SPDocument::createNewDoc((_slides[current--]).c_str(), TRUE, false); - } - - set_document(doc, current + 1); - - normal_cursor(); -} - /* Local Variables: mode:c++ -- cgit v1.2.3 From 9607306c03378d38b9ba67b7f0120593b7820826 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 02:41:40 +0200 Subject: Inkview: Some more refactoring (bzr r15690.1.9) --- src/inkview.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index abb690619..04d223091 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -29,7 +29,6 @@ # include "config.h" #endif -#include #include #include -- cgit v1.2.3 From 8b5ac2ae58d3857d98b4e6d12b95be8430a1ca50 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 03:49:13 +0200 Subject: Inkview: Finally implement the -t or --timer option after we dragged it around for over 10 years without implementation (bzr r15690.1.10) --- src/inkview.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 04d223091..bc4782b39 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -172,8 +172,7 @@ int main (int argc, char **argv) return 1; /* none of the slides loadable */ } - SPSlideShow ss(valid_files); - ss.set_timer(timer); + SPSlideShow ss(valid_files, timer); main_instance.run(); return 0; -- cgit v1.2.3 From 556ddf2fb4dd71d9677082cc9238b1c117aa2497 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 04:59:36 +0200 Subject: Inkview: refactor InkviewOptionsGroup and other minor refactoring (bzr r15690.1.12) --- src/inkview.cpp | 52 ++++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index bc4782b39..b4edfa22f 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -48,11 +48,7 @@ -/// List of all input filenames -static Glib::OptionGroup::vecustrings filenames; -/// Input timer option -static int timer = 0; /** * \brief Set of command-line options for Inkview @@ -60,14 +56,17 @@ static int timer = 0; class InkviewOptionsGroup : public Glib::OptionGroup { public: - InkviewOptionsGroup() - : - Glib::OptionGroup(N_("Inkscape Options"), - N_("Default program options")), - _entry_timer(), - _entry_args() + /// List of all input filenames + Glib::OptionGroup::vecustrings filenames; + + /// Input timer option + int timer = 0; + + InkviewOptionsGroup() : Glib::OptionGroup(N_("Inkscape Options"), + N_("Default program options")) { // Entry for the "timer" option + Glib::OptionEntry _entry_timer; _entry_timer.set_short_name('t'); _entry_timer.set_long_name("timer"); _entry_timer.set_arg_description(N_("NUM")); @@ -75,16 +74,13 @@ public: add_entry(_entry_timer, timer); // Entry for the remaining non-option arguments + Glib::OptionEntry _entry_args; _entry_args.set_short_name('\0'); _entry_args.set_long_name(G_OPTION_REMAINING); _entry_args.set_arg_description(N_("FILES …")); add_entry(_entry_args, filenames); } - -private: - Glib::OptionEntry _entry_timer; - Glib::OptionEntry _entry_args; }; @@ -122,7 +118,7 @@ std::vector get_valid_files(std::vector filenames, } } } - + return valid_files; } @@ -144,15 +140,15 @@ int main (int argc, char **argv) Inkscape::initialize_gettext(); #endif - Glib::OptionContext opt(N_("Open SVG files")); - opt.set_translation_domain(GETTEXT_PACKAGE); - - InkviewOptionsGroup grp; - grp.set_translation_domain(GETTEXT_PACKAGE); - - opt.set_main_group(grp); + Glib::OptionContext context(N_("Open SVG files")); + context.set_translation_domain(GETTEXT_PACKAGE); - Gtk::Main main_instance (argc, argv, opt); + InkviewOptionsGroup options; + options.set_translation_domain(GETTEXT_PACKAGE); + + context.set_main_group(options); + + Gtk::Main main_instance (argc, argv, context); LIBXML_TEST_VERSION @@ -161,18 +157,18 @@ int main (int argc, char **argv) Inkscape::Application::create(argv[0], true); - if(filenames.empty()) + if(options.filenames.empty()) { - g_print("%s", opt.get_help().c_str()); + g_print("%s", context.get_help().c_str()); exit(EXIT_FAILURE); } - std::vector valid_files = get_valid_files(filenames, true); + std::vector valid_files = get_valid_files(options.filenames, true); if(valid_files.empty()) { return 1; /* none of the slides loadable */ } - - SPSlideShow ss(valid_files, timer); + + SPSlideShow ss(valid_files, options.timer); main_instance.run(); return 0; -- cgit v1.2.3 From 32e1550bf1f16ade2bd14b833bc366dc12b50af5 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 05:46:43 +0200 Subject: Inkview: Add additional information to help output and update option description (bzr r15690.1.13) --- src/inkview.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index b4edfa22f..f1eb1cfc6 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -70,14 +70,13 @@ public: _entry_timer.set_short_name('t'); _entry_timer.set_long_name("timer"); _entry_timer.set_arg_description(N_("NUM")); - _entry_timer.set_description(N_("Reset timer:")); + _entry_timer.set_description(N_("Change image every NUM seconds")); add_entry(_entry_timer, timer); // Entry for the remaining non-option arguments Glib::OptionEntry _entry_args; - _entry_args.set_short_name('\0'); _entry_args.set_long_name(G_OPTION_REMAINING); - _entry_args.set_arg_description(N_("FILES …")); + _entry_args.set_arg_description(N_("FILES/FOLDERS …")); add_entry(_entry_args, filenames); } @@ -140,7 +139,13 @@ int main (int argc, char **argv) Inkscape::initialize_gettext(); #endif - Glib::OptionContext context(N_("Open SVG files")); + Glib::OptionContext context(N_("- display SVG files")); + context.set_summary(N_( + "Quickly browse through a collection of .svg(z) files\n" + "or show them as a slide show.")); + context.set_description(N_( + "Example:\n" + " inkview -t 3 file1.svg file2.svgz series*.svg more_files")); context.set_translation_domain(GETTEXT_PACKAGE); InkviewOptionsGroup options; -- cgit v1.2.3 From 1be23961b14fb409ee1a13fde6de676111587356 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 06:11:55 +0200 Subject: Inkview: add option -s or --scale to set a factor by witch to scale the displayed image Fixed bugs: - https://launchpad.net/bugs/1550897 (bzr r15690.1.14) --- src/inkview.cpp | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index f1eb1cfc6..e50c76ab0 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -59,26 +59,37 @@ public: /// List of all input filenames Glib::OptionGroup::vecustrings filenames; - /// Input timer option + /// timer for the slideshow int timer = 0; + + /// scale factor for images (currently only applied to the first image - others are resized to window dimensions) + double scale = 1; InkviewOptionsGroup() : Glib::OptionGroup(N_("Inkscape Options"), N_("Default program options")) { // Entry for the "timer" option - Glib::OptionEntry _entry_timer; - _entry_timer.set_short_name('t'); - _entry_timer.set_long_name("timer"); - _entry_timer.set_arg_description(N_("NUM")); - _entry_timer.set_description(N_("Change image every NUM seconds")); - add_entry(_entry_timer, timer); + Glib::OptionEntry entry_timer; + entry_timer.set_short_name('t'); + entry_timer.set_long_name("timer"); + entry_timer.set_arg_description(N_("NUM")); + entry_timer.set_description(N_("Change image every NUM seconds")); + add_entry(entry_timer, timer); + + // Entry for the "scale" option + Glib::OptionEntry entry_scale; + entry_scale.set_short_name('s'); + entry_scale.set_long_name("scale"); + entry_scale.set_arg_description(N_("NUM")); + entry_scale.set_description(N_("Scale image by factor NUM")); + add_entry(entry_scale, scale); // Entry for the remaining non-option arguments - Glib::OptionEntry _entry_args; - _entry_args.set_long_name(G_OPTION_REMAINING); - _entry_args.set_arg_description(N_("FILES/FOLDERS …")); + Glib::OptionEntry entry_args; + entry_args.set_long_name(G_OPTION_REMAINING); + entry_args.set_arg_description(N_("FILES/FOLDERS …")); - add_entry(_entry_args, filenames); + add_entry(entry_args, filenames); } }; @@ -173,7 +184,7 @@ int main (int argc, char **argv) return 1; /* none of the slides loadable */ } - SPSlideShow ss(valid_files, options.timer); + SPSlideShow ss(valid_files, options.timer, options.scale); main_instance.run(); return 0; -- cgit v1.2.3 From 7ac22eb4ab56e0ddc1242b88cdb03a275631615a Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 06:38:05 +0200 Subject: Inkview: Don't crash when unknow command line option is specified (bzr r15690.1.15) --- src/inkview.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index e50c76ab0..05d8cd1eb 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -164,7 +164,14 @@ int main (int argc, char **argv) context.set_main_group(options); - Gtk::Main main_instance (argc, argv, context); + Gtk::Main main_instance(true); + try { + context.parse(argc, argv); + } catch (const Glib::Error& ex) { + g_printerr("%s\n\n", ex.what().c_str()); + g_print("%s", context.get_help().c_str()); + exit(EXIT_FAILURE); + } LIBXML_TEST_VERSION -- cgit v1.2.3 From 8672bfec38d1838bf17704a4a674f6f713092a62 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 18:02:50 +0200 Subject: Inkview: new option -f or --fullscreen to lauch Inkview in fullscreen mode (bzr r15694) --- src/inkview.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 05d8cd1eb..1b19b0e0a 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -56,18 +56,26 @@ class InkviewOptionsGroup : public Glib::OptionGroup { public: - /// List of all input filenames + // list of all input filenames; + // this list contains all arguments that are not recognized as an option (so needs to be checked) Glib::OptionGroup::vecustrings filenames; - /// timer for the slideshow - int timer = 0; - - /// scale factor for images (currently only applied to the first image - others are resized to window dimensions) - double scale = 1; + bool fullscreen = false; // wether to launch in fullscreen mode + int timer = 0; // time (in seconds) after which the next image of the slideshow is automatically loaded + double scale = 1; // scale factor for images + // (currently only applied to the first image - others are resized to window dimensions) InkviewOptionsGroup() : Glib::OptionGroup(N_("Inkscape Options"), N_("Default program options")) { + // Entry for the "fullscreen" option + Glib::OptionEntry entry_fullscreen; + entry_fullscreen.set_short_name('f'); + entry_fullscreen.set_long_name("fullscreen"); + //entry_fullscreen.set_arg_description(N_("NUM")); + entry_fullscreen.set_description(N_("Launch in fullscreen mode")); + add_entry(entry_fullscreen, fullscreen); + // Entry for the "timer" option Glib::OptionEntry entry_timer; entry_timer.set_short_name('t'); @@ -191,7 +199,7 @@ int main (int argc, char **argv) return 1; /* none of the slides loadable */ } - SPSlideShow ss(valid_files, options.timer, options.scale); + SPSlideShow ss(valid_files, options.fullscreen, options.timer, options.scale); main_instance.run(); return 0; -- cgit v1.2.3 From 3378ece4298ea29e7d263f765c72da02d99d48f4 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 18:52:44 +0200 Subject: Inkview: New option -r or --recursive which make Inkview search recursively for SVG files in the specified directories (bzr r15695) --- src/inkview.cpp | 60 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 23 deletions(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 1b19b0e0a..38efb6549 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -61,6 +61,7 @@ public: Glib::OptionGroup::vecustrings filenames; bool fullscreen = false; // wether to launch in fullscreen mode + bool recursive = false; // wether to search folders for SVG files recursively int timer = 0; // time (in seconds) after which the next image of the slideshow is automatically loaded double scale = 1; // scale factor for images // (currently only applied to the first image - others are resized to window dimensions) @@ -72,10 +73,16 @@ public: Glib::OptionEntry entry_fullscreen; entry_fullscreen.set_short_name('f'); entry_fullscreen.set_long_name("fullscreen"); - //entry_fullscreen.set_arg_description(N_("NUM")); entry_fullscreen.set_description(N_("Launch in fullscreen mode")); add_entry(entry_fullscreen, fullscreen); + // Entry for the "recursive" option + Glib::OptionEntry entry_recursive; + entry_recursive.set_short_name('r'); + entry_recursive.set_long_name("recursive"); + entry_recursive.set_description(N_("Search folders recursively")); + add_entry(entry_recursive, recursive); + // Entry for the "timer" option Glib::OptionEntry entry_timer; entry_timer.set_short_name('t'); @@ -95,7 +102,7 @@ public: // Entry for the remaining non-option arguments Glib::OptionEntry entry_args; entry_args.set_long_name(G_OPTION_REMAINING); - entry_args.set_arg_description(N_("FILES/FOLDERS …")); + entry_args.set_arg_description(N_("FILES/FOLDERS…")); add_entry(entry_args, filenames); } @@ -103,7 +110,7 @@ public: /** get a list of valid SVG files from a list of strings */ -std::vector get_valid_files(std::vector filenames, bool recursive = false) +std::vector get_valid_files(std::vector filenames, bool recursive = false, bool first_iteration = false) { std::vector valid_files; @@ -111,28 +118,35 @@ std::vector get_valid_files(std::vector filenames, { if (!Inkscape::IO::file_test( file.c_str(), G_FILE_TEST_EXISTS )) { g_printerr("%s: %s\n", _("File or folder does not exist"), file.c_str()); + continue; + } + + if (Inkscape::IO::file_test( file.c_str(), G_FILE_TEST_IS_DIR )) { + // only recurse into directories if explicitly specified by user on command line or if recursive = true + if (first_iteration || recursive) { + std::vector new_filenames; + Glib::Dir directory(file); + for (auto new_file: directory) { + new_filenames.push_back(Glib::build_filename(file, new_file)); + } + std::vector new_valid_files = get_valid_files(new_filenames, recursive); + valid_files.insert(valid_files.end(), new_valid_files.begin(), new_valid_files.end()); + } } else { - if (Inkscape::IO::file_test( file.c_str(), G_FILE_TEST_IS_DIR )) { - if (recursive) { - std::vector new_filenames; - Glib::Dir directory(file); - for (auto new_file: directory) { - Glib::ustring extension = new_file.substr( new_file.find_last_of(".") + 1 ); - if (!extension.compare("svg") || !extension.compare("svgz")) { - new_filenames.push_back(Glib::build_filename(file, new_file)); - } - } - std::vector new_files = get_valid_files(new_filenames); - valid_files.insert(valid_files.end(), new_files.begin(), new_files.end()); + if (!first_iteration) { + // filter out files based on extension if they were not explicitly specified on command line + Glib::ustring extension = file.substr( file.find_last_of(".") + 1 ); + if (extension.compare("svg") && extension.compare("svgz")) { + continue; } + } + + auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); + if(doc) { + /* Append to list */ + valid_files.push_back(file); } else { - auto doc = SPDocument::createNewDoc(file.c_str(), TRUE, false); - if(doc) { - /* Append to list */ - valid_files.push_back(file); - } else { - g_printerr("%s: %s\n", _("Could not open file"), file.c_str()); - } + g_printerr("%s: %s\n", _("Could not open file"), file.c_str()); } } } @@ -194,7 +208,7 @@ int main (int argc, char **argv) exit(EXIT_FAILURE); } - std::vector valid_files = get_valid_files(options.filenames, true); + std::vector valid_files = get_valid_files(options.filenames, options.recursive, true); if(valid_files.empty()) { return 1; /* none of the slides loadable */ } -- cgit v1.2.3 From ef50bfc5251ccfd55ccea214becc3654530a5675 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 19:32:50 +0200 Subject: Inkview: Print warning of no (valid) files are found in input (bzr r15696) --- src/inkview.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/inkview.cpp') diff --git a/src/inkview.cpp b/src/inkview.cpp index 38efb6549..0b2b07f42 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -210,7 +210,8 @@ int main (int argc, char **argv) std::vector valid_files = get_valid_files(options.filenames, options.recursive, true); if(valid_files.empty()) { - return 1; /* none of the slides loadable */ + g_printerr("%s\n", _("No valid files to load.")); + return 1; /* none of the slides loadable */ } SPSlideShow ss(valid_files, options.fullscreen, options.timer, options.scale); -- cgit v1.2.3