diff options
Diffstat (limited to 'src/dialogs')
| -rw-r--r-- | src/dialogs/item-properties.cpp | 11 | ||||
| -rw-r--r-- | src/dialogs/object-attributes.cpp | 26 |
2 files changed, 32 insertions, 5 deletions
diff --git a/src/dialogs/item-properties.cpp b/src/dialogs/item-properties.cpp index 1101f9eec..16c29a69f 100644 --- a/src/dialogs/item-properties.cpp +++ b/src/dialogs/item-properties.cpp @@ -142,7 +142,7 @@ SPItemDialog::SPItemDialog (void) : wd.stop = 0; //set callback for the new dialog - g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), dlg); + g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd); g_signal_connect ( G_OBJECT (dlg), "event", G_CALLBACK (sp_dialog_event_handler), dlg); // g_signal_connect ( G_OBJECT (dlg), "destroy", G_CALLBACK (sp_item_dialog_delete), dlg); g_signal_connect ( G_OBJECT (dlg), "delete_event", G_CALLBACK (sp_item_dialog_delete), dlg); @@ -186,6 +186,7 @@ SPItemDialog::~SPItemDialog (void) prefs->setInt(prefs_path + "h", h); sp_signal_disconnect_by_data (INKSCAPE, wd.win); + sp_signal_disconnect_by_data (INKSCAPE, &wd); if (window) { //should actually always be true, but for safety check @@ -318,10 +319,14 @@ void SPItemDialog::widget_setup(void) Inkscape::Selection *selection = sp_desktop_selection (SP_ACTIVE_DESKTOP); if (!selection->singleItem()) { - set_sensitive (false); + vb.set_sensitive (false); + CurrentItem = NULL; + //no selection anymore or multiple objects selected, means that we need + //to close the connections to the previously selected object + attrTable.clear(); return; } else { - set_sensitive (true); + vb.set_sensitive (true); } SPItem *item = selection->singleItem(); diff --git a/src/dialogs/object-attributes.cpp b/src/dialogs/object-attributes.cpp index b4b2fe256..808e9a16a 100644 --- a/src/dialogs/object-attributes.cpp +++ b/src/dialogs/object-attributes.cpp @@ -66,6 +66,19 @@ static const SPAttrDesc image_nohref_desc[] = { { NULL, NULL} }; +static void object_released( SPObject */*object*/, GtkWidget *widget ) +{ + gtk_widget_destroy (widget); +} + + + +static void window_destroyed( GtkObject *window, GtkObject */*object*/ ) +{ + sigc::connection *release_connection = (sigc::connection *)g_object_get_data(G_OBJECT(window), "release_connection"); + release_connection->disconnect(); + delete release_connection; +} static void sp_object_attr_show_dialog ( SPObject *object, const SPAttrDesc *desc, @@ -95,8 +108,17 @@ static void sp_object_attr_show_dialog ( SPObject *object, } window = Inkscape::UI::window_new (title.c_str(), true); - t = new SPAttributeTable (object, labels, attrs, NULL); - window->show_all(); + t = new SPAttributeTable (object, labels, attrs, (GtkWidget*)window->gobj()); + + g_signal_connect (window->gobj(), "destroy", + G_CALLBACK (window_destroyed), object ); + + sigc::connection *release_connection = new sigc::connection(); + *release_connection = object->connectRelease(sigc::bind<1>(sigc::ptr_fun(&object_released), (GtkWidget*)window->gobj())); + g_object_set_data((GObject*)window->gobj(), "release_connection", release_connection); + + t->show(); + window->show(); } // end of sp_object_attr_show_dialog() |
