X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Finkview.cpp;h=5cfde2c814a793d1365d32549300ff58394f4902;hb=c573cf21fec48b8494843de05a2c980241579639;hp=495a943b75ee91fd87f162a9a8a333a5899806b5;hpb=af80de26fd5777ead589f500348b2b90672e8e71;p=inkscape.git diff --git a/src/inkview.cpp b/src/inkview.cpp index 495a943b7..5cfde2c81 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -31,6 +31,10 @@ # include "config.h" #endif +#ifdef HAVE_GETOPT_H +#include +#endif + #include #include #include @@ -48,6 +52,8 @@ #include #include +#include + #include "gc-core.h" #include "preferences.h" @@ -80,7 +86,7 @@ struct SPSlideShow { int current; SPDocument *doc; GtkWidget *view; - GtkWindow *window; + GtkWidget *window; bool fullscreen; int timer; }; @@ -107,29 +113,31 @@ 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, struct SPSlideShow *ss) +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) +sp_svgview_main_key_press (GtkWidget */*widget*/, GdkEventKey *event, struct SPSlideShow *ss) { switch (event->keyval) { case GDK_Up: + case GDK_Home: sp_svgview_goto_first(ss); break; case GDK_Down: + case GDK_End: sp_svgview_goto_last(ss); break; case GDK_F11: #ifdef HAVE_GTK_WINDOW_FULLSCREEN if (ss->fullscreen) { - gtk_window_unfullscreen ((GtkWindow *) widget); + gtk_window_unfullscreen (GTK_WINDOW(ss->window)); ss->fullscreen = false; } else { - gtk_window_fullscreen ((GtkWindow *) widget); + gtk_window_fullscreen (GTK_WINDOW(ss->window)); ss->fullscreen = true; } #else @@ -148,6 +156,7 @@ sp_svgview_main_key_press (GtkWidget *widget, GdkEventKey *event, struct SPSlide case GDK_KP_Page_Up: case GDK_Page_Up: case GDK_Left: + case GDK_BackSpace: sp_svgview_show_prev (ss); break; case GDK_Escape: @@ -158,8 +167,8 @@ sp_svgview_main_key_press (GtkWidget *widget, GdkEventKey *event, struct SPSlide default: break; } - gtk_window_set_title(GTK_WINDOW(widget), SP_DOCUMENT_NAME(ss->doc)); - return FALSE; + gtk_window_set_title(GTK_WINDOW(ss->window), SP_DOCUMENT_NAME(ss->doc)); + return TRUE; } int @@ -169,26 +178,31 @@ main (int argc, const char **argv) usage(); } + // Prevents errors like "Unable to wrap GdkPixbuf..." (in nr-filter-image.cpp for example) + Gtk::Main::init_gtkmm_internals(); + + Gtk::Main main_instance (&argc, const_cast(&argv)); + struct SPSlideShow ss; int option, num_parsed_options = 0; // the list of arguments is in the net line - while ((option = getopt(argc, (char* const* )argv, "t:")) != -1) + while ((option = getopt(argc, (char* const* )argv, "t:")) != -1) { switch(option) { case 't': // for timer // fprintf(stderr, "set timer arg %s\n", optarg ); - ss.timer = int(optarg); + ss.timer = atoi(optarg); num_parsed_options += 2; // 2 because of flag + option break; case '?': default: usage(); - } + } } - + GtkWidget *w; int i; @@ -199,7 +213,7 @@ main (int argc, const char **argv) LIBXML_TEST_VERSION Inkscape::GC::init(); - Inkscape::Preferences::loadSkeleton(); + Inkscape::Preferences::get(); // ensure preferences are initialized gtk_init (&argc, (char ***) &argv); @@ -223,8 +237,7 @@ main (int argc, const char **argv) ss.fullscreen = false; inkscape = (Inkscape::Application *)g_object_new (SP_TYPE_INKSCAPE, NULL); - Inkscape::Preferences::load(); - + // 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++) { @@ -284,11 +297,11 @@ main (int argc, const char **argv) } ss.slides[ss.length++] = strdup (argv[i]); - ss.doc = sp_document_new (ss.slides[ss.current], TRUE, false); - if (!ss.doc && ++ss.current >= ss.length) { - /* No loadable documents */ - return 1; + if (!ss.doc) { + ss.doc = sp_document_new (ss.slides[ss.current], TRUE, false); + if (!ss.doc) + ++ss.current; } #ifdef WITH_INKJAR } @@ -305,14 +318,16 @@ main (int argc, const char **argv) MIN ((int)sp_document_width (ss.doc), (int)gdk_screen_width () - 64), MIN ((int)sp_document_height (ss.doc), (int)gdk_screen_height () - 64)); gtk_window_set_policy (GTK_WINDOW (w), TRUE, TRUE, FALSE); + ss.window = w; 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); - ss.view = sp_svg_view_widget_new (ss.doc); - sp_svg_view_widget_set_resize (SP_SVG_VIEW_WIDGET (ss.view), FALSE, sp_document_width (ss.doc), sp_document_height (ss.doc)); sp_document_ensure_up_to_date (ss.doc); + ss.view = sp_svg_view_widget_new (ss.doc); sp_document_unref (ss.doc); + sp_svg_view_widget_set_resize (SP_SVG_VIEW_WIDGET (ss.view), FALSE, + sp_document_width (ss.doc), sp_document_height (ss.doc)); gtk_widget_show (ss.view); gtk_container_add (GTK_CONTAINER (w), ss.view); @@ -324,7 +339,7 @@ main (int argc, const char **argv) } static int -sp_svgview_ctrlwin_delete (GtkWidget *widget, GdkEvent *event, void *data) +sp_svgview_ctrlwin_delete (GtkWidget */*widget*/, GdkEvent */*event*/, void */*data*/) { ctrlwin = NULL; return FALSE; @@ -336,6 +351,8 @@ sp_svgview_control_show (struct SPSlideShow *ss) if (!ctrlwin) { GtkWidget *t, *b; ctrlwin = gtk_window_new (GTK_WINDOW_TOPLEVEL); + 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); t = gtk_table_new (1, 4, TRUE); gtk_container_add ((GtkContainer *) ctrlwin, t); @@ -372,99 +389,137 @@ sp_svgview_control_show (struct SPSlideShow *ss) } static int -sp_svgview_show_next_cb (GtkWidget *widget, void *data) +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_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_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_cb (GtkWidget */*widget*/, void *data) { sp_svgview_goto_last(static_cast(data)); return FALSE; } +static void +sp_svgview_waiting_cursor(struct SPSlideShow *ss) +{ + GdkCursor *waiting = gdk_cursor_new(GDK_WATCH); + gdk_window_set_cursor(GTK_WIDGET(ss->window)->window, waiting); + gdk_cursor_unref(waiting); + if (ctrlwin) { + GdkCursor *waiting = gdk_cursor_new(GDK_WATCH); + gdk_window_set_cursor(GTK_WIDGET(ctrlwin)->window, waiting); + gdk_cursor_unref(waiting); + } + while(gtk_events_pending()) + gtk_main_iteration(); +} + +static void +sp_svgview_normal_cursor(struct SPSlideShow *ss) +{ + gdk_window_set_cursor(GTK_WIDGET(ss->window)->window, NULL); + if (ctrlwin) { + gdk_window_set_cursor(GTK_WIDGET(ctrlwin)->window, NULL); + } +} + +static void +sp_svgview_set_document(struct SPSlideShow *ss, SPDocument *doc, int current) +{ + if (doc && doc != ss->doc) { + sp_document_ensure_up_to_date (doc); + reinterpret_cast(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (doc); + if (ss->doc) { + delete ss->doc; + } + ss->doc = doc; + ss->current = current; + } +} + static void sp_svgview_show_next (struct SPSlideShow *ss) { - SPDocument *doc; - int current; - doc = NULL; - current = ss->current; + sp_svgview_waiting_cursor(ss); + + SPDocument *doc = NULL; + int current = ss->current; while (!doc && (current < ss->length - 1)) { - doc = sp_document_new (ss->slides[++current], TRUE, false); - } - if (doc) { - reinterpret_cast(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (doc); - sp_document_ensure_up_to_date (doc); - ss->doc = doc; - ss->current = current; + doc = sp_document_new (ss->slides[++current], TRUE, false); } + + sp_svgview_set_document(ss, doc, current); + + sp_svgview_normal_cursor(ss); } static void sp_svgview_show_prev (struct SPSlideShow *ss) { - SPDocument *doc; - int current; - doc = NULL; - current = ss->current; + sp_svgview_waiting_cursor(ss); + + SPDocument *doc = NULL; + int current = ss->current; while (!doc && (current > 0)) { - doc = sp_document_new (ss->slides[--current], TRUE, false); - } - if (doc) { - reinterpret_cast(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (doc); - sp_document_ensure_up_to_date (doc); - ss->doc = doc; - ss->current = current; + doc = sp_document_new (ss->slides[--current], TRUE, false); } + + sp_svgview_set_document(ss, doc, current); + + sp_svgview_normal_cursor(ss); } static void sp_svgview_goto_first (struct SPSlideShow *ss) { + sp_svgview_waiting_cursor(ss); + SPDocument *doc = NULL; int current = 0; - for ( ; !doc && (current < ss->length); current++) { - doc = sp_document_new (ss->slides[current], TRUE, false); - } - if (doc) { - reinterpret_cast(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (doc); - sp_document_ensure_up_to_date (doc); - ss->doc = doc; - ss->current = current; + while ( !doc && (current < ss->length - 1)) { + if (current == ss->current) + break; + doc = sp_document_new (ss->slides[current++], TRUE, false); } + + sp_svgview_set_document(ss, doc, current - 1); + + sp_svgview_normal_cursor(ss); } static void sp_svgview_goto_last (struct SPSlideShow *ss) { + sp_svgview_waiting_cursor(ss); + SPDocument *doc = NULL; int current = ss->length - 1; - for ( ; !doc && (current >= 0); current--) { - doc = sp_document_new (ss->slides[current], TRUE, false); - } - if (doc) { - reinterpret_cast(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (doc); - sp_document_ensure_up_to_date (doc); - ss->doc = doc; - ss->current = current; + while (!doc && (current >= 0)) { + if (current == ss->current) + break; + doc = sp_document_new (ss->slides[current--], TRUE, false); } + + sp_svgview_set_document(ss, doc, current + 1); + + sp_svgview_normal_cursor(ss); } #ifdef WITH_INKJAR @@ -491,9 +546,6 @@ static void usage() #ifdef WITH_INKJAR " or archives of SVGs (.sxw, .jar)" #endif - "\n\n" - "Available options:\n" - "\t-t\t\tTimer for automatically changing slides in seconds.\n" "\n"); exit(1); } @@ -505,7 +557,6 @@ void inkscape_ref (void) {} void inkscape_unref (void) {} void inkscape_add_document (SPDocument *document) {} void inkscape_remove_document (SPDocument *document) {} -Inkscape::XML::Node *inkscape_get_repr (Inkscape::Application *inkscape, const gchar *key) {return NULL;} #endif