diff --git a/src/inkview.cpp b/src/inkview.cpp
index fffa0acdf77f68741850368dfa348952c2e8c346..5cfde2c814a793d1365d32549300ff58394f4902 100644 (file)
--- a/src/inkview.cpp
+++ b/src/inkview.cpp
*
* Copyright (C) 1999-2002 authors
* Copyright (C) 2001-2002 Ximian, Inc.
- *
+ *
* Inkscape authors:
* Johan Ceuppens
- *
+ *
* Copyright (C) 2004 Inkscape authors
- *
+ *
* Released under GNU GPL, read the file 'COPYING' for more information
*/
# include "config.h"
#endif
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
#include <string.h>
#include <sys/stat.h>
#include <locale.h>
+#include <glib/gmem.h>
#include <libnr/nr-macros.h>
+// #include <stropts.h>
+
#include <libxml/tree.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtkmain.h>
#include <gtk/gtktable.h>
#include <gtk/gtkbutton.h>
+#include <gtkmm/main.h>
+
#include "gc-core.h"
#include "preferences.h"
#define bind_textdomain_codeset(p,c)
#endif
+extern char *optarg;
+extern int optind, opterr;
+
struct SPSlideShow {
char **slides;
int size;
int current;
SPDocument *doc;
GtkWidget *view;
- GtkWindow *window;
+ GtkWidget *window;
bool fullscreen;
+ int timer;
};
static GtkWidget *sp_svgview_control_show (struct SPSlideShow *ss);
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 +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:
@@ -151,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
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<char ***>(&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;
LIBXML_TEST_VERSION
Inkscape::GC::init();
- Inkscape::Preferences::loadSkeleton();
+ Inkscape::Preferences::get(); // ensure preferences are initialized
gtk_init (&argc, (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)
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,
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 = sp_document_new (ss.slides[ss.current], TRUE, false);
+ if (!ss.doc)
+ ++ss.current;
}
#ifdef WITH_INKJAR
}
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);
}
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;
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);
}
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<struct SPSlideShow *>(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<struct SPSlideShow *>(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<struct SPSlideShow *>(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<struct SPSlideShow *>(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<SPSVGView*>(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<SPSVGView*>(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<SPSVGView*>(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<SPSVGView*>(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<SPSVGView*>(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
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);
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