index cededca516c13fe2abb8b4e9d310dcdae090d687..eabf147f64980afa2acbb18027dc682c961da6a3 100644 (file)
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-/*
-TODO:
-FIXME:
- After Inkscape makes a formal requirement for a GTK version above 2.11.4, please
- replace all the instances of ink_ext_XXXXXX in this file that represent
- svg files with ink_ext_XXXXXX.svg . Doing so will prevent errors in extensions
- that call inkscape to manipulate the file.
-
- "** (inkscape:5848): WARNING **: Format autodetect failed. The file is being opened as SVG."
-
- references:
- http://www.gtk.org/api/2.6/glib/glib-File-Utilities.html#g-mkstemp
- http://ftp.gnome.org/pub/gnome/sources/glib/2.11/glib-2.11.4.changes
- http://developer.gnome.org/doc/API/2.0/glib/glib-File-Utilities.html#g-mkstemp
-
- --Aaron Spike
-*/
#define __INKSCAPE_EXTENSION_IMPLEMENTATION_SCRIPT_C__
#ifdef HAVE_CONFIG_H
#include "selection.h"
#include "sp-namedview.h"
#include "io/sys.h"
-#include "prefs-utils.h"
+#include "preferences.h"
#include "../system.h"
#include "extension/effect.h"
#include "extension/output.h"
#include "extension/db.h"
#include "script.h"
#include "dialogs/dialog-events.h"
+#include "application/application.h"
+#include "xml/node.h"
+#include "xml/attribute-record.h"
#include "util/glib-list-iterators.h"
namespace Extension {
namespace Implementation {
-void pump_events (void) {
+/** \brief Make GTK+ events continue to come through a little bit
+
+ This just keeps coming the events through so that we'll make the GUI
+ update and look pretty.
+*/
+void
+Script::pump_events (void) {
while( Gtk::Main::events_pending() )
Gtk::Main::iteration();
return;
}
-//Interpreter lookup table
-struct interpreter_t {
- gchar const *identity;
- gchar const *prefstring;
- gchar const *defaultval;
-};
-
/** \brief A table of what interpreters to call for a given language
given script. It also tracks the preference to use to overwrite
the given interpreter to a custom one per user.
*/
-static interpreter_t const interpreterTab[] = {
+Script::interpreter_t const Script::interpreterTab[] = {
{"perl", "perl-interpreter", "perl" },
#ifdef WIN32
{"python", "python-interpreter", "pythonw" },
-/**
- * Look up an interpreter name, and translate to something that
- * is executable
- */
-static Glib::ustring
-resolveInterpreterExecutable(const Glib::ustring &interpNameArg)
+/** \brief Look up an interpreter name, and translate to something that
+ is executable
+ \param interpNameArg The name of the interpreter that we're looking
+ for, should be an entry in interpreterTab
+*/
+Glib::ustring
+Script::resolveInterpreterExecutable(const Glib::ustring &interpNameArg)
{
Glib::ustring interpName = interpNameArg;
interpName = interp->defaultval;
// 1. Check preferences
- gchar const *prefInterp = prefs_get_string_attribute("extensions", interp->prefstring);
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ Glib::ustring prefInterp = prefs->getString("/extensions/" + Glib::ustring(interp->prefstring));
- if (prefInterp) {
+ if (!prefInterp.empty()) {
interpName = prefInterp;
return interpName;
}
return interpName;
}
-
-
/** \brief This function creates a script object and sets up the
variables.
\return A script object
{
}
-
/**
* brief Destructor
*/
/* This should probably check to find the executable... */
Inkscape::XML::Node *child_repr = sp_repr_children(module->get_repr());
while (child_repr != NULL) {
- if (!strcmp(child_repr->name(), "script")) {
+ if (!strcmp(child_repr->name(), INKSCAPE_EXTENSION_NS "script")) {
child_repr = sp_repr_children(child_repr);
while (child_repr != NULL) {
- if (!strcmp(child_repr->name(), "command")) {
+ if (!strcmp(child_repr->name(), INKSCAPE_EXTENSION_NS "command")) {
const gchar *interpretstr = child_repr->attribute("interpreter");
if (interpretstr != NULL) {
Glib::ustring interpString =
command.insert(command.end(), tmp);
}
- if (!strcmp(child_repr->name(), "helper_extension")) {
+ if (!strcmp(child_repr->name(), INKSCAPE_EXTENSION_NS "helper_extension")) {
helper_extension = sp_repr_children(child_repr)->content();
}
child_repr = sp_repr_next(child_repr);
bool
Script::check(Inkscape::Extension::Extension *module)
{
+ int script_count = 0;
Inkscape::XML::Node *child_repr = sp_repr_children(module->get_repr());
while (child_repr != NULL) {
- if (!strcmp(child_repr->name(), "script")) {
+ if (!strcmp(child_repr->name(), INKSCAPE_EXTENSION_NS "script")) {
+ script_count++;
child_repr = sp_repr_children(child_repr);
while (child_repr != NULL) {
- if (!strcmp(child_repr->name(), "check")) {
+ if (!strcmp(child_repr->name(), INKSCAPE_EXTENSION_NS "check")) {
Glib::ustring command_text = solve_reldir(child_repr);
if (command_text.size() > 0) {
/* I've got the command */
}
}
- if (!strcmp(child_repr->name(), "helper_extension")) {
+ if (!strcmp(child_repr->name(), INKSCAPE_EXTENSION_NS "helper_extension")) {
gchar const *helper = sp_repr_children(child_repr)->content();
if (Inkscape::Extension::db.get(helper) == NULL) {
return false;
child_repr = sp_repr_next(child_repr);
}
+ if (script_count == 0) {
+ return false;
+ }
+
return true;
}
return module->autogui(NULL, NULL);
}
-
-
-/**
- \return A dialog for preferences
- \brief A stub funtion right now
- \param module Module who's preferences need getting
-
- This function should really do something, right now it doesn't.
-*/
-Gtk::Widget *
-Script::prefs_effect( Inkscape::Extension::Effect *module,
- Inkscape::UI::View::View *view,
- sigc::signal<void> * changeSignal,
- ImplementationDocumentCache * /*docCache*/ )
-{
- SPDocument * current_document = view->doc();
-
- using Inkscape::Util::GSListConstIterator;
- GSListConstIterator<SPItem *> selected =
- sp_desktop_selection((SPDesktop *)view)->itemList();
- Inkscape::XML::Node * first_select = NULL;
- if (selected != NULL) {
- const SPItem * item = *selected;
- first_select = SP_OBJECT_REPR(item);
- }
-
- return module->autogui(current_document, first_select, changeSignal);
-}
-
-
-
-
/**
\return A new document that has been opened
\brief This function uses a filename that is put in, and calls
std::string tempfilename_out;
int tempfd_out = 0;
try {
- tempfd_out = Inkscape::IO::file_open_tmp(tempfilename_out, "ink_ext_XXXXXX");
+ tempfd_out = Inkscape::IO::file_open_tmp(tempfilename_out, "ink_ext_XXXXXX.svg");
} catch (...) {
/// \todo Popup dialog here
return NULL;
} // data_read
if (mydoc != NULL) {
- sp_document_set_uri(mydoc, filenameArg);
+ g_free(mydoc->base);
+ mydoc->base = NULL;
+ sp_document_change_uri_and_hrefs(mydoc, filenameArg);
}
// make sure we don't leak file descriptors from g_file_open_tmp
std::string tempfilename_in;
int tempfd_in = 0;
try {
- tempfd_in = Inkscape::IO::file_open_tmp(tempfilename_in, "ink_ext_XXXXXX");
+ tempfd_in = Inkscape::IO::file_open_tmp(tempfilename_in, "ink_ext_XXXXXX.svg");
} catch (...) {
/// \todo Popup dialog here
return;
@@ -870,16 +830,34 @@ Script::copy_doc (Inkscape::XML::Node * oldroot, Inkscape::XML::Node * newroot)
for (Inkscape::XML::Node * newroot_namedview_child = child->firstChild();
newroot_namedview_child != NULL;
newroot_namedview_child = newroot_namedview_child->next()) {
- oldroot_namedview->appendChild(newroot_namedview_child->duplicate(child->document()));
+ oldroot_namedview->appendChild(newroot_namedview_child->duplicate(oldroot->document()));
}
}
} else {
- oldroot->appendChild(child->duplicate(newroot->document()));
+ oldroot->appendChild(child->duplicate(oldroot->document()));
}
}
- oldroot->setAttribute("width", newroot->attribute("width"));
- oldroot->setAttribute("height", newroot->attribute("height"));
+ {
+ using Inkscape::Util::List;
+ using Inkscape::XML::AttributeRecord;
+ std::vector<gchar const *> attribs;
+
+ // Make a list of all attributes of the old root node.
+ for (List<AttributeRecord const> iter = oldroot->attributeList(); iter; ++iter) {
+ attribs.push_back(g_quark_to_string(iter->key));
+ }
+
+ // Delete the attributes of the old root nodes.
+ for (std::vector<gchar const *>::const_iterator it = attribs.begin(); it != attribs.end(); it++)
+ oldroot->setAttribute(*it, NULL);
+
+ // Set the new attributes.
+ for (List<AttributeRecord const> iter = newroot->attributeList(); iter; ++iter) {
+ gchar const *name = g_quark_to_string(iter->key);
+ oldroot->setAttribute(name, newroot->attribute(name));
+ }
+ }
/** \todo Restore correct layer */
/** \todo Restore correct selection */
}
Glib::ustring stderr_data = fileerr.string();
- if (stderr_data.length() != 0) {
+ if (stderr_data.length() != 0 &&
+ Inkscape::NSApplication::Application::getUseGui()
+ ) {
checkStderr(stderr_data, Gtk::MESSAGE_INFO,
_("Inkscape has received additional data from the script executed. "
"The script did not return an error, but this may indicate the results will not be as expected."));