diff --git a/src/main.cpp b/src/main.cpp
index 9da8c304858fc1c65a4eeebb67c82f25d387273b..72cab584ff854eb4faf038266c421aa0a8e3fa8e 100644 (file)
--- a/src/main.cpp
+++ b/src/main.cpp
#endif
#include "path-prefix.h"
+// This has to be included prior to anything that includes setjmp.h, it croaks otherwise
+#include <png.h>
+
#include <gtk/gtkmessagedialog.h>
#ifdef HAVE_IEEEFP_H
#include "widgets/icon.h"
#include "ui/widget/panel.h"
-
-#include <png.h>
#include <errno.h>
enum {
{"export-dpi", 'd',
POPT_ARG_STRING, &sp_export_dpi, SP_ARG_EXPORT_DPI,
- N_("The resolution used for exporting SVG into bitmap (default 90)"),
+ N_("Resolution for exporting to bitmap and for rasterization of filters in PS/EPS/PDF (default 90)"),
N_("DPI")},
{"export-area", 'a',
{"shell", 0,
POPT_ARG_NONE, &sp_shell, SP_ARG_SHELL,
- N_("Start Inkscape in interative shell mode."),
+ N_("Start Inkscape in interactive shell mode."),
NULL},
POPT_AUTOHELP POPT_TABLEEND
static void
snooper(GdkEvent *event, gpointer /*data*/) {
- if(inkscape_mapalt()) /* returns the map of the keyboard modifier to map to Alt, zero if no mapping */
+ if (inkscape_mapalt()) /* returns the map of the keyboard modifier to map to Alt, zero if no mapping */
{
GdkModifierType mapping=(GdkModifierType)inkscape_mapalt();
switch (event->type) {
break;
}
}
+
+ if (inkscape_trackalt()) {
+ // MacOS X with X11 has some problem with the default
+ // xmodmapping. A ~/.xmodmap solution does not work reliably due
+ // to the way we package our executable in a .app that can launch
+ // X11 or use an already-running X11. The same problem has been
+ // reported on Linux but there is no .app/X11 to get in the way
+ // of ~/.xmodmap fixes. So we make this a preference.
+ //
+ // For some reason, Gdk senses changes in Alt (Mod1) state for
+ // many message types, but not for keystrokes! So this ugly hack
+ // tracks what the state of Alt-pressing is, and ensures
+ // GDK_MOD1_MASK is in the event->key.state as appropriate.
+ //
+ static gboolean altL_pressed = FALSE;
+ static gboolean altR_pressed = FALSE;
+ static gboolean alt_pressed = FALSE;
+ guint get_group0_keyval(GdkEventKey* event);
+ guint keyval = 0;
+ switch (event->type) {
+ case GDK_MOTION_NOTIFY:
+ alt_pressed = TRUE && (event->motion.state & GDK_MOD1_MASK);
+ break;
+ case GDK_BUTTON_PRESS:
+ alt_pressed = TRUE && (event->button.state & GDK_MOD1_MASK);
+ break;
+ case GDK_KEY_PRESS:
+ keyval = get_group0_keyval(&event->key);
+ if (keyval == GDK_Alt_L) altL_pressed = TRUE;
+ if (keyval == GDK_Alt_R) altR_pressed = TRUE;
+ alt_pressed = alt_pressed || altL_pressed || altR_pressed;
+ alt_pressed = alt_pressed || (event->button.state & GDK_MOD1_MASK);
+ if (alt_pressed)
+ event->key.state |= GDK_MOD1_MASK;
+ else
+ event->key.state &= ~GDK_MOD1_MASK;
+ break;
+ case GDK_KEY_RELEASE:
+ keyval = get_group0_keyval(&event->key);
+ if (keyval == GDK_Alt_L) altL_pressed = FALSE;
+ if (keyval == GDK_Alt_R) altR_pressed = FALSE;
+ if (!altL_pressed && !altR_pressed)
+ alt_pressed = FALSE;
+ break;
+ default:
+ break;
+ }
+ //printf("alt_pressed: %s\n", alt_pressed? "+" : "-");
+ }
+
gtk_main_do_event (event);
}
+static std::vector<Glib::ustring> getDirectorySet(const gchar* userDir, const gchar* const * systemDirs) {
+ std::vector<Glib::ustring> listing;
+ listing.push_back(userDir);
+ for ( const char* const* cur = systemDirs; *cur; cur++ )
+ {
+ listing.push_back(*cur);
+ }
+ return listing;
+}
+
int
sp_main_gui(int argc, char const **argv)
{
int retVal = sp_common_main( argc, argv, &fl );
g_return_val_if_fail(retVal == 0, 1);
+ // Add possible icon entry directories
+ std::vector<Glib::ustring> dataDirs = getDirectorySet( g_get_user_data_dir(),
+ g_get_system_data_dirs() );
+ for (std::vector<Glib::ustring>::iterator it = dataDirs.begin(); it != dataDirs.end(); ++it)
+ {
+ std::vector<Glib::ustring> listing;
+ listing.push_back(*it);
+ listing.push_back("inkscape");
+ listing.push_back("icons");
+ Glib::ustring dir = Glib::build_filename(listing);
+ gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(), dir.c_str());
+ }
+
// Add our icon directory to the search path for icon theme lookups.
+ gchar *usericondir = profile_path("icons");
+ gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(), usericondir);
gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(), INKSCAPE_PIXMAPDIR);
+ g_free(usericondir);
gdk_event_handler_set((GdkEventFunc)snooper, NULL, NULL);
Inkscape::Debug::log_display_config();
rdoc = sp_repr_document_new("svg:svg");
repr = rdoc->root();
repr = sp_document_root(doc)->updateRepr(rdoc, repr, SP_OBJECT_WRITE_BUILD);
- sp_repr_save_file(repr->document(), sp_export_svg, SP_SVG_NS_URI);
+ sp_repr_save_rebased_file(repr->document(), sp_export_svg, SP_SVG_NS_URI,
+ doc->base, sp_export_svg);
}
if (sp_export_ps) {
do_export_ps_pdf(doc, sp_export_ps, "image/x-postscript");
@@ -1399,6 +1477,17 @@ static void do_export_ps_pdf(SPDocument* doc, gchar const* uri, char const* mime
(*i)->set_param_bool("blurToBitmap", FALSE);
} else {
(*i)->set_param_bool("blurToBitmap", TRUE);
+
+ gdouble dpi = 90.0;
+ if (sp_export_dpi) {
+ dpi = atof(sp_export_dpi);
+ if ((dpi < 1) || (dpi > 10000.0)) {
+ g_warning("DPI value %s out of range [1 - 10000]. Using 90 dpi instead.", sp_export_dpi);
+ dpi = 90;
+ }
+ }
+
+ (*i)->set_param_int("resolution", (int) dpi);
}
(*i)->save(doc, uri);