Changeset 4264
- Timestamp:
- 2012-04-24 15:06:24 (13 months ago)
- Location:
- trunk/suil
- Files:
-
- 7 edited
-
NEWS (modified) (1 diff)
-
src/gtk2_in_qt4.cpp (modified) (1 diff)
-
src/instance.c (modified) (1 diff)
-
src/qt4_in_gtk2.cpp (modified) (7 diffs)
-
src/x11_in_gtk2.c (modified) (7 diffs)
-
src/x11_in_qt4.cpp (modified) (1 diff)
-
wscript (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/suil/NEWS
r4201 r4264 1 suil (9999) stable; 2 3 * Fix crashes when wrapper widget is destroyed by toolkit before 4 suil cleanup function is called. 5 6 -- David Robillard <d@drobilla.net> 7 1 8 suil (0.6.0) stable; 2 9 -
trunk/suil/src/gtk2_in_qt4.cpp
r4160 r4264 75 75 SuilWrapper* wrapper = (SuilWrapper*)malloc(sizeof(SuilWrapper)); 76 76 wrapper->wrap = wrapper_wrap; 77 wrapper->free = (SuilWrapperFreeFunc)free;77 wrapper->free = NULL; 78 78 wrapper->impl = NULL; 79 79 -
trunk/suil/src/instance.c
r4173 r4264 258 258 free(instance->features); 259 259 260 if (instance->wrapper) {261 instance->wrapper->free(instance->wrapper);262 dlclose(instance->wrapper->lib);263 }264 260 if (instance->handle) { 265 261 instance->descriptor->cleanup(instance->handle); 262 } 263 if (instance->wrapper) { 264 if (instance->wrapper->free) { 265 instance->wrapper->free(instance->wrapper); 266 } 267 dlclose(instance->wrapper->lib); 268 free(instance->wrapper); 266 269 } 267 270 dlclose(instance->lib_handle); -
trunk/suil/src/qt4_in_gtk2.cpp
r4162 r4264 35 35 QApplication* app; 36 36 QX11EmbedWidget* qembed; 37 SuilWrapper* wrapper; 37 38 SuilInstance* instance; 38 39 }; … … 47 48 48 49 static void 49 suil_qt_wrapper_ dispose(GObject* gobject)50 suil_qt_wrapper_finalize(GObject* gobject) 50 51 { 51 52 SuilQtWrapper* const self = SUIL_QT_WRAPPER(gobject); 52 53 53 if (self->qembed) { 54 delete self->qembed; 55 self->qembed = NULL; 56 57 delete self->app; 58 self->app = NULL; 54 if (self->instance->handle) { 55 self->instance->descriptor->cleanup(self->instance->handle); 56 self->instance->handle = NULL; 59 57 } 60 58 61 G_OBJECT_CLASS(suil_qt_wrapper_parent_class)->dispose(gobject); 59 delete self->qembed; 60 self->qembed = NULL; 61 62 delete self->app; 63 self->app = NULL; 64 65 self->wrapper->impl = NULL; 66 67 G_OBJECT_CLASS(suil_qt_wrapper_parent_class)->finalize(gobject); 62 68 } 63 69 … … 67 73 GObjectClass* const gobject_class = G_OBJECT_CLASS(klass); 68 74 69 gobject_class-> dispose = suil_qt_wrapper_dispose;75 gobject_class->finalize = suil_qt_wrapper_finalize; 70 76 } 71 77 … … 95 101 96 102 wrap->qembed = new QX11EmbedWidget(); 103 wrap->wrapper = wrapper; 97 104 wrap->instance = instance; 98 105 … … 116 123 wrapper_free(SuilWrapper* wrapper) 117 124 { 118 SuilQtWrapper* const wrap = SUIL_QT_WRAPPER( 119 g_object_new(SUIL_TYPE_QT_WRAPPER, NULL)); 120 121 gtk_object_destroy(GTK_OBJECT(wrap)); 122 free(wrap); 125 if (wrapper->impl) { 126 SuilQtWrapper* const wrap = SUIL_QT_WRAPPER(wrapper->impl); 127 gtk_object_destroy(GTK_OBJECT(wrap)); 128 } 123 129 } 124 130 … … 131 137 { 132 138 SuilWrapper* wrapper = (SuilWrapper*)malloc(sizeof(SuilWrapper)); 133 wrapper->wrap = wrapper_wrap;134 wrapper->free = wrapper_free;135 wrapper->impl = NULL;139 wrapper->wrap = wrapper_wrap; 140 wrapper->free = wrapper_free; 141 wrapper->impl = NULL; 136 142 137 143 SuilQtWrapper* const wrap = SUIL_QT_WRAPPER( … … 139 145 140 146 static int argc = 0; 141 wrap->app = new QApplication(argc, NULL, true); 147 wrap->app = new QApplication(argc, NULL, true); 148 wrap->wrapper = NULL; 142 149 143 150 wrapper->impl = wrap; -
trunk/suil/src/x11_in_gtk2.c
r4160 r4264 30 30 GtkSocket socket; 31 31 GtkPlug* plug; 32 SuilWrapper* wrapper; 32 33 SuilInstance* instance; 33 34 }; … … 41 42 G_DEFINE_TYPE(SuilX11Wrapper, suil_x11_wrapper, GTK_TYPE_SOCKET) 42 43 44 static gboolean 45 on_plug_removed(GtkSocket* sock, gpointer data) 46 { 47 SuilX11Wrapper* const self = SUIL_X11_WRAPPER(sock); 48 49 if (self->instance->handle) { 50 self->instance->descriptor->cleanup(self->instance->handle); 51 self->instance->handle = NULL; 52 } 53 54 self->plug = NULL; 55 return TRUE; 56 } 57 43 58 static void 44 wrap_widget_dispose(GObject* gobject)59 suil_x11_wrapper_finalize(GObject* gobject) 45 60 { 46 G_OBJECT_CLASS(suil_x11_wrapper_parent_class)->dispose(gobject); 61 SuilX11Wrapper* const self = SUIL_X11_WRAPPER(gobject); 62 63 self->wrapper->impl = NULL; 64 65 G_OBJECT_CLASS(suil_x11_wrapper_parent_class)->finalize(gobject); 47 66 } 48 67 … … 52 71 GObjectClass* const gobject_class = G_OBJECT_CLASS(klass); 53 72 54 gobject_class-> dispose = wrap_widget_dispose;73 gobject_class->finalize = suil_x11_wrapper_finalize; 55 74 } 56 75 … … 86 105 87 106 instance->host_widget = GTK_WIDGET(wrap); 107 wrap->wrapper = wrapper; 88 108 wrap->instance = instance; 89 109 … … 93 113 NULL); 94 114 115 g_signal_connect(G_OBJECT(wrap), 116 "plug-removed", 117 G_CALLBACK(on_plug_removed), 118 NULL); 119 95 120 return 0; 96 121 } … … 99 124 wrapper_free(SuilWrapper* wrapper) 100 125 { 101 free(wrapper); 126 if (wrapper->impl) { 127 SuilX11Wrapper* const wrap = SUIL_X11_WRAPPER(wrapper->impl); 128 gtk_object_destroy(GTK_OBJECT(wrap)); 129 } 102 130 } 131 103 132 104 133 SUIL_API … … 111 140 { 112 141 SuilWrapper* wrapper = (SuilWrapper*)malloc(sizeof(SuilWrapper)); 113 wrapper->wrap = wrapper_wrap;114 wrapper->free = wrapper_free;142 wrapper->wrap = wrapper_wrap; 143 wrapper->free = wrapper_free; 115 144 116 145 SuilX11Wrapper* const wrap = SUIL_X11_WRAPPER( 117 146 g_object_new(SUIL_TYPE_X11_WRAPPER, NULL)); 147 148 wrap->wrapper = NULL; 118 149 119 150 wrapper->impl = wrap; -
trunk/suil/src/x11_in_qt4.cpp
r4160 r4264 55 55 SuilWrapper* wrapper = (SuilWrapper*)malloc(sizeof(SuilWrapper)); 56 56 wrapper->wrap = wrapper_wrap; 57 wrapper->free = (SuilWrapperFreeFunc)free;57 wrapper->free = NULL; 58 58 59 59 QX11EmbedWidget* const ew = new QX11EmbedWidget(); -
trunk/suil/wscript
r4202 r4264 8 8 9 9 # Version of this package (even if built as a child) 10 SUIL_VERSION = '0.6. 0'10 SUIL_VERSION = '0.6.1' 11 11 SUIL_MAJOR_VERSION = '0' 12 12
Note: See TracChangeset
for help on using the changeset viewer.
