X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Finkview.cpp;h=448aa77f180e0be7c1679ff398cf90deadc8f758;hb=0dc33d4ce43e0bb49c63aa53b826ec4a1ff68e28;hp=8be261dcdfc3273213cb352c1bbbfe49b1fe2e19;hpb=f951374eef04129c6a0d213e7ab4d9ed2095ca69;p=inkscape.git diff --git a/src/inkview.cpp b/src/inkview.cpp index 8be261dcd..448aa77f1 100644 --- a/src/inkview.cpp +++ b/src/inkview.cpp @@ -1,5 +1,3 @@ -#define __SPSVGVIEW_C__ - /* * Inkscape - an ambitious vector drawing program * @@ -14,6 +12,7 @@ * Chema Celorio * Pawel Palucha * ... and various people who have worked with various projects + * Abhishek Sharma * * Copyright (C) 1999-2002 authors * Copyright (C) 2001-2002 Ximian, Inc. @@ -31,12 +30,19 @@ # include "config.h" #endif +#ifdef HAVE_GETOPT_H +#include +#endif + #include #include #include +#include #include +// #include + #include #include #include @@ -45,6 +51,8 @@ #include #include +#include + #include "gc-core.h" #include "preferences.h" @@ -54,7 +62,7 @@ #include "svg-view-widget.h" #ifdef WITH_INKJAR -#include "inkjar/jar.h" +#include "io/inkjar.h" #endif #include "inkscape-private.h" @@ -67,6 +75,9 @@ Inkscape::Application *inkscape; #define bind_textdomain_codeset(p,c) #endif +extern char *optarg; +extern int optind, opterr; + struct SPSlideShow { char **slides; int size; @@ -74,8 +85,9 @@ struct SPSlideShow { int current; SPDocument *doc; GtkWidget *view; - GtkWindow *window; + GtkWidget *window; bool fullscreen; + int timer; }; static GtkWidget *sp_svgview_control_show (struct SPSlideShow *ss); @@ -100,29 +112,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 @@ -141,6 +155,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: @@ -151,8 +166,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), ss->doc->getName()); + return TRUE; } int @@ -162,8 +177,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) + { + switch(option) { + case 't': // for timer + // fprintf(stderr, "set timer arg %s\n", optarg ); + ss.timer = atoi(optarg); + num_parsed_options += 2; // 2 because of flag + option + break; + case '?': + default: + usage(); + } + } + GtkWidget *w; int i; @@ -174,7 +212,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); @@ -191,16 +229,17 @@ main (int argc, const char **argv) ss.size = 32; ss.length = 0; ss.current = 0; - ss.slides = nr_new (char *, ss.size); + ss.slides = g_new (char *, ss.size); ss.current = 0; ss.doc = NULL; ss.view = NULL; ss.fullscreen = false; inkscape = (Inkscape::Application *)g_object_new (SP_TYPE_INKSCAPE, NULL); - Inkscape::Preferences::load(); - for (i = 1; i < argc; i++) { + // 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++) { struct stat st; if (stat (argv[i], &st) || !S_ISREG (st.st_mode) @@ -230,16 +269,16 @@ main (int argc, const char **argv) if (ss.length >= ss.size) { /* Expand */ ss.size <<= 1; - ss.slides = nr_renew (ss.slides, char *, ss.size); + ss.slides = g_renew (char *, ss.slides, ss.size); } - ss.doc = sp_document_new_from_mem ((const gchar *)gba->data, + 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); - sp_document_set_uri (ss.doc, strdup(last_filename)); + (ss.doc)->setUri (strdup(last_filename)); } g_byte_array_free(gba, TRUE); g_free(last_filename); @@ -252,16 +291,16 @@ main (int argc, const char **argv) if (ss.length >= ss.size) { /* Expand */ ss.size <<= 1; - ss.slides = nr_renew (ss.slides, char *, ss.size); + ss.slides = g_renew (char *, ss.slides, ss.size); } 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 = SPDocument::createNewDoc (ss.slides[ss.current], TRUE, false); + if (!ss.doc) + ++ss.current; } #ifdef WITH_INKJAR } @@ -273,19 +312,20 @@ 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), SP_DOCUMENT_NAME (ss.doc)); + gtk_window_set_title( GTK_WINDOW(w), ss.doc->getName() ); gtk_window_set_default_size (GTK_WINDOW (w), - MIN ((int)sp_document_width (ss.doc), (int)gdk_screen_width () - 64), - MIN ((int)sp_document_height (ss.doc), (int)gdk_screen_height () - 64)); + MIN ((int)(ss.doc)->getWidth (), (int)gdk_screen_width () - 64), + MIN ((int)(ss.doc)->getHeight (), (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.doc)->ensureUpToDate(); 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); - sp_document_unref (ss.doc); + (ss.doc)->doUnref (); + SP_SVG_VIEW_WIDGET(ss.view)->setResize( false, ss.doc->getWidth(), ss.doc->getHeight() ); gtk_widget_show (ss.view); gtk_container_add (GTK_CONTAINER (w), ss.view); @@ -297,7 +337,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; @@ -309,6 +349,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); @@ -345,99 +387,134 @@ 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) { + doc->ensureUpToDate(); + reinterpret_cast(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (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 = SPDocument::createNewDoc (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 = SPDocument::createNewDoc (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 = SPDocument::createNewDoc (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 = SPDocument::createNewDoc (ss->slides[current--], TRUE, false); } + + sp_svgview_set_document(ss, doc, current + 1); + + sp_svgview_normal_cursor(ss); } #ifdef WITH_INKJAR @@ -459,10 +536,10 @@ is_jar(char const *filename) static void usage() { fprintf(stderr, - "Usage: inkview [FILES ...]\n" + "Usage: inkview [OPTIONS...] [FILES ...]\n" "\twhere FILES are SVG (.svg or .svgz)" #ifdef WITH_INKJAR - "or archives of SVGs (.sxw, .jar)" + " or archives of SVGs (.sxw, .jar)" #endif "\n"); exit(1); @@ -475,7 +552,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