Code

Fixes for transient dialogs in win32.
[inkscape.git] / src / ui / widget / color-picker.cpp
index ef8c491d0fe458a4c953c74b6cb5a61fa50336b5..7d7dc9117c32092e1bdbb3c5e20c51b981ac2ee5 100644 (file)
 #include "inkscape.h"
 #include "desktop-handles.h"
 #include "document.h"
+#include "dialogs/dialog-events.h"
 
 #include "widgets/sp-color-notebook.h"
 
 #include "color-picker.h"
 
+static bool _in_use = false;
+
 namespace Inkscape {
 namespace UI {
 namespace Widget {
 
+void sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp);
 
 ColorPicker::ColorPicker (const Glib::ustring& title, const Glib::ustring& tip,
                           guint32 rgba, bool undo)
@@ -47,6 +51,9 @@ ColorPicker::~ColorPicker()
 void
 ColorPicker::setupDialog(const Glib::ustring &title)
 {
+    GtkWidget *dlg = GTK_WIDGET(_colorSelectorDialog.gobj());
+    sp_transientize(dlg);
+
     _colorSelectorDialog.hide();
     _colorSelectorDialog.set_title (title);
     _colorSelectorDialog.set_border_width (4);
@@ -57,6 +64,8 @@ ColorPicker::setupDialog(const Glib::ustring &title)
 
     g_signal_connect(G_OBJECT(_colorSelector), "dragged",
                          G_CALLBACK(sp_color_picker_color_mod), (void *)this);
+    g_signal_connect(G_OBJECT(_colorSelector), "released",
+                         G_CALLBACK(sp_color_picker_color_mod), (void *)this);
     g_signal_connect(G_OBJECT(_colorSelector), "changed",
                          G_CALLBACK(sp_color_picker_color_mod), (void *)this);
 
@@ -70,6 +79,8 @@ ColorPicker::setupDialog(const Glib::ustring &title)
 void
 ColorPicker::setRgba32 (guint32 rgba)
 {
+    if (_in_use) return;
+
     _preview.setRgba32 (rgba);
     _rgba = rgba;
     if (_colorSelector)
@@ -106,6 +117,9 @@ ColorPicker::on_changed (guint32)
 void
 sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp)
 {
+    if (_in_use) return;
+    else _in_use = true;
+    
     SPColor color;
     float alpha;
     csel->base->getColorAlpha(color, &alpha);
@@ -116,10 +130,13 @@ sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp)
     (ptr->_preview).setRgba32 (rgba);
 
     if (ptr->_undo && SP_ACTIVE_DESKTOP)
-        sp_document_done(SP_DT_DOCUMENT(SP_ACTIVE_DESKTOP));
+        sp_document_done(sp_desktop_document(SP_ACTIVE_DESKTOP), SP_VERB_NONE, 
+                         /* TODO: annotate */ "color-picker.cpp:130");
 
     ptr->on_changed (rgba);
+    _in_use = false;
     ptr->_changed_signal.emit (rgba);
+    ptr->_rgba = rgba;
 }