Code

Rough pass of Fill-n-Stroke swatch conversion.
[inkscape.git] / src / widgets / fill-style.cpp
index 09c6951ad66b380b70215c3bc74e3fc34c7d92ae..f1342f3de3374d47c14ee64b32eb166c5b315288 100644 (file)
@@ -5,9 +5,11 @@
  *   Lauris Kaplinski <lauris@kaplinski.com>
  *   Frank Felfe <innerspace@iname.com>
  *   bulia byak <buliabyak@users.sf.net>
+ *   Jon A. Cruz <jon@joncruz.org>
  *
  * Copyright (C) 1999-2005 authors
  * Copyright (C) 2001-2002 Ximian, Inc.
+ * Copyright (C) 2010 Jon A. Cruz
  *
  * Released under GNU GPL, read the file 'COPYING' for more information
  */
 #endif
 
 #include <glibmm/i18n.h>
+#include <gtkmm/box.h>
+#include <gtk/gtkvbox.h>
 
+#include "desktop.h"
+#include "selection.h"
 #include "desktop-handles.h"
 #include "desktop-style.h"
 #include "display/sp-canvas.h"
@@ -32,7 +38,6 @@
 #include "sp-radial-gradient.h"
 #include "style.h"
 #include "widgets/paint-selector.h"
-#include "widgets/sp-widget.h"
 #include "xml/repr.h"
 
 #include "fill-style.h"
 
 /* Fill */
 
-static void fillnstroke_constructed(SPWidget *spw, SPPaintSelector *psel);
-static void fillnstroke_fillrule_changed(SPPaintSelector *psel, SPPaintSelector::FillRule mode, SPWidget *spw);
-
-static void fillnstroke_selection_modified(SPWidget *spw, Inkscape::Selection *selection, guint flags, SPPaintSelector *psel);
-static void fillnstroke_selection_changed(SPWidget *spw, Inkscape::Selection *selection, SPPaintSelector *psel);
-static void fillnstroke_subselection_changed(Inkscape::Application *inkscape, SPDesktop *desktop, SPWidget *spw);
-
-static void fillnstroke_paint_mode_changed(SPPaintSelector *psel, SPPaintSelector::Mode mode, SPWidget *spw);
-static void fillnstroke_paint_dragged(SPPaintSelector *psel, SPWidget *spw);
-static void fillnstroke_paint_changed(SPPaintSelector *psel, SPWidget *spw);
 
-static void fillnstroke_transientize_called(Inkscape::Application *inkscape, SPDesktop *desktop, SPWidget *spw);
-
-static void fillnstroke_performUpdate(SPWidget *spw);
-
-GtkWidget *sp_fill_style_widget_new(void)
+Gtk::Widget *sp_fill_style_widget_new(void)
 {
     return Inkscape::Widgets::createStyleWidget( FILL );
 }
 
-/**
- * Create the fill or stroke style widget, and hook up all the signals.
- */
-GtkWidget *Inkscape::Widgets::createStyleWidget( FillOrStroke kind )
+
+namespace Inkscape {
+
+class FillNStroke : public Gtk::VBox
 {
-    GtkWidget *spw = sp_widget_new_global(INKSCAPE);
+public:
+    FillNStroke( FillOrStroke kind );
+    ~FillNStroke();
 
-    // with or without fillrule selector
-    GtkWidget *psel = sp_paint_selector_new(kind == FILL);
-    gtk_widget_show(psel);
-    gtk_container_add(GTK_CONTAINER(spw), psel);
-    g_object_set_data(G_OBJECT(spw), "paint-selector", psel);
-    g_object_set_data(G_OBJECT(spw), "kind", GINT_TO_POINTER(kind));
+    void setFillrule( SPPaintSelector::FillRule mode );
 
-    if (kind == FILL) {
-        g_signal_connect( G_OBJECT(spw), "construct",
-                          G_CALLBACK(fillnstroke_constructed),
-                          psel );
-    }
+    void setDesktop(SPDesktop *desktop);
+
+private:
+    static void paintModeChangeCB(SPPaintSelector *psel, SPPaintSelector::Mode mode, FillNStroke *self);
+    static void paintChangedCB(SPPaintSelector *psel, FillNStroke *self);
+    static void paintDraggedCB(SPPaintSelector *psel, FillNStroke *self);
+    static gboolean dragDelayCB(gpointer data);
+
+    static void fillruleChangedCB( SPPaintSelector *psel, SPPaintSelector::FillRule mode, FillNStroke *self );
 
-//FIXME: switch these from spw signals to global inkscape object signals; spw just retranslates
-//those anyway; then eliminate spw
-    g_signal_connect( G_OBJECT(spw), "modify_selection",
-                      G_CALLBACK(fillnstroke_selection_modified),
-                      psel );
+    void selectionModifiedCB(guint flags);
 
-    g_signal_connect( G_OBJECT(spw), "change_selection",
-                      G_CALLBACK(fillnstroke_selection_changed),
-                      psel );
+    void dragFromPaint();
+    void updateFromPaint();
 
-    g_signal_connect( INKSCAPE, "change_subselection",
-                      G_CALLBACK(fillnstroke_subselection_changed),
-                      spw );
+    void performUpdate();
 
-    if (kind == STROKE) {
-        g_signal_connect( G_OBJECT(INKSCAPE), "activate_desktop",
-                          G_CALLBACK(fillnstroke_transientize_called),
-                          spw );
+    FillOrStroke kind;
+    SPDesktop *desktop;
+    SPPaintSelector *psel;
+    guint32 lastDrag;
+    guint dragId;
+    bool update;
+    sigc::connection selectChangedConn;
+    sigc::connection subselChangedConn;
+    sigc::connection selectModifiedConn;
+};
+
+} // namespace Inkscape
+
+void sp_fill_style_widget_set_desktop(Gtk::Widget *widget, SPDesktop *desktop)
+{
+    Inkscape::FillNStroke *fs = dynamic_cast<Inkscape::FillNStroke*>(widget);
+    if (fs) {
+        fs->setDesktop(desktop);
     }
+}
+
+namespace Inkscape {
+
+/**
+ * Create the fill or stroke style widget, and hook up all the signals.
+ */
+Gtk::Widget *Inkscape::Widgets::createStyleWidget( FillOrStroke kind )
+{
+    FillNStroke *filler = new FillNStroke(kind);
+
+    return filler;
+}
 
+FillNStroke::FillNStroke( FillOrStroke kind ) :
+    Gtk::VBox(),
+    kind(kind),
+    desktop(0),
+    psel(0),
+    lastDrag(0),
+    dragId(0),
+    update(false),
+    selectChangedConn(),
+    subselChangedConn(),
+    selectModifiedConn()
+{
+    // Add and connect up the paint selector widget:
+    psel = sp_paint_selector_new(kind);
+    gtk_widget_show(GTK_WIDGET(psel));
+    gtk_container_add(GTK_CONTAINER(gobj()), GTK_WIDGET(psel));
     g_signal_connect( G_OBJECT(psel), "mode_changed",
-                      G_CALLBACK(fillnstroke_paint_mode_changed),
-                      spw );
+                      G_CALLBACK(paintModeChangeCB),
+                      this );
 
     g_signal_connect( G_OBJECT(psel), "dragged",
-                      G_CALLBACK(fillnstroke_paint_dragged),
-                      spw );
+                      G_CALLBACK(paintDraggedCB),
+                      this );
 
     g_signal_connect( G_OBJECT(psel), "changed",
-                      G_CALLBACK(fillnstroke_paint_changed),
-                      spw );
-
+                      G_CALLBACK(paintChangedCB),
+                      this );
     if (kind == FILL) {
         g_signal_connect( G_OBJECT(psel), "fillrule_changed",
-                          G_CALLBACK(fillnstroke_fillrule_changed),
-                          spw );
+                          G_CALLBACK(fillruleChangedCB),
+                          this );
     }
 
-    fillnstroke_performUpdate(SP_WIDGET(spw));
-
-    return spw;
+    performUpdate();
 }
 
-static void fillnstroke_constructed( SPWidget *spw, SPPaintSelector * /*psel*/ )
+FillNStroke::~FillNStroke()
 {
-#ifdef SP_FS_VERBOSE
-    FillOrStroke kind = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(spw), "kind")) ? FILL : STROKE;
-    g_print( "[%s] style widget constructed: inkscape %p\n",
-             (kind == FILL) ? "fill" : "style",
-              spw->inkscape );
-#endif
-    if (spw->inkscape) {
-        fillnstroke_performUpdate(spw);
+    if (dragId) {
+        g_source_remove(dragId);
+        dragId = 0;
     }
-
+    psel = 0;
+    selectModifiedConn.disconnect();
+    subselChangedConn.disconnect();
+    selectChangedConn.disconnect();
 }
 
 /**
  * On signal modified, invokes an update of the fill or stroke style paint object.
  */
-static void fillnstroke_selection_modified( SPWidget *spw,
-                                    Inkscape::Selection * /*selection*/,
-                                    guint flags,
-                                    SPPaintSelector * /*psel*/ )
+void FillNStroke::selectionModifiedCB( guint flags )
 {
     if (flags & ( SP_OBJECT_MODIFIED_FLAG |
-                  SP_OBJECT_PARENT_MODIFIED_FLAG |
-                  SP_OBJECT_STYLE_MODIFIED_FLAG) ) {
+                   SP_OBJECT_PARENT_MODIFIED_FLAG |
+                   SP_OBJECT_STYLE_MODIFIED_FLAG) ) {
 #ifdef SP_FS_VERBOSE
-        g_message("fillnstroke_selection_modified()");
+        g_message("selectionModifiedCB(%d) on %p", flags, this);
 #endif
-        fillnstroke_performUpdate(spw);
+        performUpdate();
     }
 }
 
-/**
- * On signal selection changed, invokes an update of the fill or stroke style paint object.
- */
-static void fillnstroke_selection_changed( SPWidget *spw,
-                                   Inkscape::Selection * /*selection*/,
-                                   SPPaintSelector * /*psel*/ )
+void FillNStroke::setDesktop(SPDesktop *desktop)
 {
-    fillnstroke_performUpdate(spw);
-}
+    if (this->desktop != desktop) {
+        if (dragId) {
+            g_source_remove(dragId);
+            dragId = 0;
+        }
+        if (this->desktop) {
+            selectModifiedConn.disconnect();
+            subselChangedConn.disconnect();
+            selectChangedConn.disconnect();
+        }
+        this->desktop = desktop;
+        if (desktop && desktop->selection) {
+            selectChangedConn = desktop->selection->connectChanged(sigc::hide(sigc::mem_fun(*this, &FillNStroke::performUpdate)));
+            subselChangedConn = desktop->connectToolSubselectionChanged(sigc::hide(sigc::mem_fun(*this, &FillNStroke::performUpdate)));
 
-/**
- * On signal change subselection, invoke an update of the fill or stroke style widget.
- */
-static void fillnstroke_subselection_changed( Inkscape::Application * /*inkscape*/,
-                                      SPDesktop * /*desktop*/,
-                                      SPWidget *spw )
-{
-    fillnstroke_performUpdate(spw);
+            // Must check flags, so can't call performUpdate() directly.
+            selectModifiedConn = desktop->selection->connectModified(sigc::hide<0>(sigc::mem_fun(*this, &FillNStroke::selectionModifiedCB)));
+        }
+        performUpdate();
+    }
 }
 
 /**
@@ -186,30 +210,26 @@ static void fillnstroke_subselection_changed( Inkscape::Application * /*inkscape
  *
  * @param sel Selection to use, or NULL.
  */
-static void fillnstroke_performUpdate( SPWidget *spw )
+void FillNStroke::performUpdate()
 {
-    if ( g_object_get_data(G_OBJECT(spw), "update") ) {
+    if ( update || !desktop ) {
         return;
     }
 
-    FillOrStroke kind = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(spw), "kind")) ? FILL : STROKE;
-
-    if (kind == FILL) {
-        if ( g_object_get_data(G_OBJECT(spw), "local") ) {
-            g_object_set_data(G_OBJECT(spw), "local", GINT_TO_POINTER(FALSE)); // local change; do nothing, but reset the flag
-            return;
-        }
+    if ( dragId ) {
+        // local change; do nothing, but reset the flag
+        g_source_remove(dragId);
+        dragId = 0;
+        return;
     }
 
-    g_object_set_data(G_OBJECT(spw), "update", GINT_TO_POINTER(TRUE));
-
-    SPPaintSelector *psel = SP_PAINT_SELECTOR(g_object_get_data(G_OBJECT(spw), "paint-selector"));
+    update = true;
 
     // create temporary style
-    SPStyle *query = sp_style_new(SP_ACTIVE_DOCUMENT);
+    SPStyle *query = sp_style_new(desktop->doc());
 
     // query style from desktop into it. This returns a result flag and fills query with the style of subselection, if any, or selection
-    int result = sp_desktop_query_style(SP_ACTIVE_DESKTOP, query, (kind == FILL) ? QUERY_STYLE_PROPERTY_FILL : QUERY_STYLE_PROPERTY_STROKE);
+    int result = sp_desktop_query_style(desktop, query, (kind == FILL) ? QUERY_STYLE_PROPERTY_FILL : QUERY_STYLE_PROPERTY_STROKE);
 
     SPIPaint &targPaint = (kind == FILL) ? query->fill : query->stroke;
     SPIScale24 &targOpacity = (kind == FILL) ? query->fill_opacity : query->stroke_opacity;
@@ -226,7 +246,7 @@ static void fillnstroke_performUpdate( SPWidget *spw )
         case QUERY_STYLE_MULTIPLE_AVERAGED: // TODO: treat this slightly differently, e.g. display "averaged" somewhere in paint selector
         case QUERY_STYLE_MULTIPLE_SAME:
         {
-            SPPaintSelector::Mode pselmode = SPPaintSelector::getModeForStyle(*query, kind == FILL);
+            SPPaintSelector::Mode pselmode = SPPaintSelector::getModeForStyle(*query, kind);
             psel->setMode(pselmode);
 
             if (kind == FILL) {
@@ -248,15 +268,15 @@ static void fillnstroke_performUpdate( SPWidget *spw )
                     psel->setGradientLinear( vector );
 
                     SPLinearGradient *lg = SP_LINEARGRADIENT(server);
-                    psel->setGradientProperties( SP_GRADIENT_UNITS(lg),
-                                                 SP_GRADIENT_SPREAD(lg) );
+                    psel->setGradientProperties( lg->getUnits(),
+                                                 lg->getSpread() );
                 } else if (SP_IS_RADIALGRADIENT(server)) {
                     SPGradient *vector = SP_GRADIENT(server)->getVector();
                     psel->setGradientRadial( vector );
 
                     SPRadialGradient *rg = SP_RADIALGRADIENT(server);
-                    psel->setGradientProperties( SP_GRADIENT_UNITS(rg),
-                                                 SP_GRADIENT_SPREAD(rg) );
+                    psel->setGradientProperties( rg->getUnits(),
+                                                 rg->getSpread() );
                 } else if (SP_IS_PATTERN(server)) {
                     SPPattern *pat = pattern_getroot(SP_PATTERN(server));
                     psel->updatePatternList( pat );
@@ -274,51 +294,47 @@ static void fillnstroke_performUpdate( SPWidget *spw )
 
     sp_style_unref(query);
 
-    g_object_set_data(G_OBJECT(spw), "update", GINT_TO_POINTER(FALSE));
+    update = false;
 }
 
 /**
  * When the mode is changed, invoke a regular changed handler.
  */
-static void fillnstroke_paint_mode_changed( SPPaintSelector *psel,
-                                    SPPaintSelector::Mode /*mode*/,
-                                    SPWidget *spw )
+void FillNStroke::paintModeChangeCB( SPPaintSelector * /*psel*/,
+                                     SPPaintSelector::Mode /*mode*/,
+                                     FillNStroke *self )
 {
-    if (g_object_get_data(G_OBJECT(spw), "update")) {
-        return;
-    }
-
 #ifdef SP_FS_VERBOSE
-    g_message("fillnstroke_paint_mode_changed(psel:%p, mode, spw:%p)", psel, spw);
+    g_message("paintModeChangeCB(psel, mode, self:%p)", self);
 #endif
-
-    /* TODO: Does this work?
-     * Not really, here we have to get old color back from object
-     * Instead of relying on paint widget having meaningful colors set
-     */
-    fillnstroke_paint_changed(psel, spw);
+    if (self && !self->update) {
+        self->updateFromPaint();
+    }
 }
 
-static void fillnstroke_fillrule_changed( SPPaintSelector * /*psel*/,
-                                  SPPaintSelector::FillRule mode,
-                                  SPWidget *spw )
+void FillNStroke::fillruleChangedCB( SPPaintSelector * /*psel*/,
+                                     SPPaintSelector::FillRule mode,
+                                     FillNStroke *self )
 {
-    if (g_object_get_data(G_OBJECT(spw), "update")) {
-        return;
+    if (self) {
+        self->setFillrule(mode);
     }
+}
 
-    SPDesktop *desktop = SP_ACTIVE_DESKTOP;
-
-    SPCSSAttr *css = sp_repr_css_attr_new();
-    sp_repr_css_set_property(css, "fill-rule", mode == SPPaintSelector::FILLRULE_EVENODD? "evenodd":"nonzero");
+void FillNStroke::setFillrule( SPPaintSelector::FillRule mode )
+{
+    if (!update && desktop) {
+        SPCSSAttr *css = sp_repr_css_attr_new();
+        sp_repr_css_set_property(css, "fill-rule", (mode == SPPaintSelector::FILLRULE_EVENODD) ? "evenodd":"nonzero");
 
-    sp_desktop_set_style(desktop, css);
+        sp_desktop_set_style(desktop, css);
 
-    sp_repr_css_attr_unref(css);
-    css = 0;
+        sp_repr_css_attr_unref(css);
+        css = 0;
 
-    sp_document_done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_FILL_STROKE,
-                     _("Change fill rule"));
+        sp_document_done(desktop->doc(), SP_VERB_DIALOG_FILL_STROKE,
+                         _("Change fill rule"));
+    }
 }
 
 static gchar const *undo_F_label_1 = "fill:flatcolor:1";
@@ -330,45 +346,79 @@ static gchar const *undo_S_label_2 = "stroke:flatcolor:2";
 static gchar const *undo_F_label = undo_F_label_1;
 static gchar const *undo_S_label = undo_S_label_1;
 
+
+void FillNStroke::paintDraggedCB(SPPaintSelector * /*psel*/, FillNStroke *self)
+{
+#ifdef SP_FS_VERBOSE
+    g_message("paintDraggedCB(psel, spw:%p)", self);
+#endif
+    if (self && !self->update) {
+        self->dragFromPaint();
+    }
+}
+
+
+gboolean FillNStroke::dragDelayCB(gpointer data)
+{
+    gboolean keepGoing = TRUE;
+    if (data) {
+        FillNStroke *self = reinterpret_cast<FillNStroke*>(data);
+        if (!self->update) {
+            if (self->dragId) {
+                g_source_remove(self->dragId);
+                self->dragId = 0;
+
+                self->dragFromPaint();
+                self->performUpdate();
+            }
+            keepGoing = FALSE;
+        }
+    } else {
+        keepGoing = FALSE;
+    }
+    return keepGoing;
+}
+
 /**
  * This is called repeatedly while you are dragging a color slider, only for flat color
  * modes. Previously it set the color in style but did not update the repr for efficiency, however
  * this was flakey and didn't buy us almost anything. So now it does the same as _changed, except
  * lumps all its changes for undo.
  */
-static void fillnstroke_paint_dragged(SPPaintSelector *psel, SPWidget *spw)
+void FillNStroke::dragFromPaint()
 {
-    if (!spw->inkscape) {
+    if (!desktop || update) {
         return;
     }
 
-    if (g_object_get_data(G_OBJECT(spw), "update")) {
-        return;
-    }
+    guint32 when = gtk_get_current_event_time();
 
-    FillOrStroke kind = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(spw), "kind")) ? FILL : STROKE;
+    // Don't attempt too many updates per second.
+    // Assume a base 15.625ms resolution on the timer.
+    if (!dragId && lastDrag && when && ((when - lastDrag) < 32)) {
+        // local change, do not update from selection
+        dragId = g_timeout_add_full(G_PRIORITY_DEFAULT, 33, dragDelayCB, this, 0);
+    }
 
-    if (kind == FILL) {
-        if (g_object_get_data(G_OBJECT(spw), "local")) {
-            // previous local flag not cleared yet;
-            // this means dragged events come too fast, so we better skip this one to speed up display
-            // (it's safe to do this in any case)
-            return;
-        }
+    if (dragId) {
+        // previous local flag not cleared yet;
+        // this means dragged events come too fast, so we better skip this one to speed up display
+        // (it's safe to do this in any case)
+        return;
     }
+    lastDrag = when;
 
-    g_object_set_data(G_OBJECT(spw), "update", GINT_TO_POINTER(TRUE));
+    update = true;
 
     switch (psel->mode) {
         case SPPaintSelector::MODE_COLOR_RGB:
         case SPPaintSelector::MODE_COLOR_CMYK:
         {
-            psel->setFlatColor( SP_ACTIVE_DESKTOP, (kind == FILL) ? "fill" : "stroke", (kind == FILL) ? "fill-opacity" : "stroke-opacity" );
-            sp_document_maybe_done(sp_desktop_document(SP_ACTIVE_DESKTOP), (kind == FILL) ? undo_F_label : undo_S_label, SP_VERB_DIALOG_FILL_STROKE,
+            // local change, do not update from selection
+            dragId = g_timeout_add_full(G_PRIORITY_DEFAULT, 100, dragDelayCB, this, 0);
+            psel->setFlatColor( desktop, (kind == FILL) ? "fill" : "stroke", (kind == FILL) ? "fill-opacity" : "stroke-opacity" );
+            sp_document_maybe_done(desktop->doc(), (kind == FILL) ? undo_F_label : undo_S_label, SP_VERB_DIALOG_FILL_STROKE,
                                    (kind == FILL) ? _("Set fill color") : _("Set stroke color"));
-            if (kind == FILL) {
-                g_object_set_data(G_OBJECT(spw), "local", GINT_TO_POINTER(TRUE)); // local change, do not update from selection
-            }
             break;
         }
 
@@ -377,7 +427,7 @@ static void fillnstroke_paint_dragged(SPPaintSelector *psel, SPWidget *spw)
                        __FILE__, __LINE__, psel->mode );
             break;
     }
-    g_object_set_data(G_OBJECT(spw), "update", GINT_TO_POINTER(FALSE));
+    update = false;
 }
 
 /**
@@ -387,22 +437,23 @@ This is called (at least) when:
 3  you changed a gradient selector parameter (e.g. spread)
 Must update repr.
  */
-static void fillnstroke_paint_changed( SPPaintSelector *psel, SPWidget *spw )
+void FillNStroke::paintChangedCB( SPPaintSelector * /*psel*/, FillNStroke *self )
 {
 #ifdef SP_FS_VERBOSE
-    g_message("fillnstroke_paint_changed(psel:%p, spw:%p)", psel, spw);
+    g_message("paintChangedCB(psel, spw:%p)", self);
 #endif
-    if (g_object_get_data(G_OBJECT(spw), "update")) {
-        return;
+    if (self && !self->update) {
+        self->updateFromPaint();
     }
-    g_object_set_data(G_OBJECT(spw), "update", GINT_TO_POINTER(TRUE));
-
-    FillOrStroke kind = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(spw), "kind")) ? FILL : STROKE;
+}
 
-    SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+void FillNStroke::updateFromPaint()
+{
     if (!desktop) {
         return;
     }
+    update = true;
+
     SPDocument *document = sp_desktop_document(desktop);
     Inkscape::Selection *selection = sp_desktop_selection(desktop);
 
@@ -484,7 +535,7 @@ static void fillnstroke_paint_changed( SPPaintSelector *psel, SPWidget *spw )
                 if (!vector) {
                     /* No vector in paint selector should mean that we just changed mode */
 
-                    SPStyle *query = sp_style_new(SP_ACTIVE_DOCUMENT);
+                    SPStyle *query = sp_style_new(desktop->doc());
                     int result = objects_query_fillstroke(const_cast<GSList *>(items), query, kind == FILL);
                     SPIPaint &targPaint = (kind == FILL) ? query->fill : query->stroke;
                     guint32 common_rgb = 0;
@@ -505,8 +556,12 @@ static void fillnstroke_paint_changed( SPPaintSelector *psel, SPWidget *spw )
                         }
 
                         if (!vector) {
+                            SPGradient *gr = sp_gradient_vector_for_object(document, desktop, SP_OBJECT(i->data), kind == FILL);
+                            if ( gr && (psel->mode == SPPaintSelector::MODE_SWATCH) ) {
+                                gr->setSwatch();
+                            }
                             sp_item_set_gradient(SP_ITEM(i->data),
-                                                 sp_gradient_vector_for_object(document, desktop, SP_OBJECT(i->data), kind == FILL),
+                                                 gr,
                                                  gradient_type, kind == FILL);
                         } else {
                             sp_item_set_gradient(SP_ITEM(i->data), vector, gradient_type, kind == FILL);
@@ -632,18 +687,10 @@ static void fillnstroke_paint_changed( SPPaintSelector *psel, SPWidget *spw )
             break;
     }
 
-    g_object_set_data(G_OBJECT(spw), "update", GINT_TO_POINTER(FALSE));
+    update = false;
 }
 
-
-static void fillnstroke_transientize_called(Inkscape::Application * /*inkscape*/,
-                                    SPDesktop * /*desktop*/,
-                                    SPWidget * /*spw*/ )
-{
-// TODO:  Either of these will cause crashes sometimes
-//    sp_stroke_style_line_update( SP_WIDGET(spw), desktop ? sp_desktop_selection(desktop) : NULL);
-//    ink_markers_menu_update(spw);
-}
+} // namespace Inkscape
 
 /*
   Local Variables: