diff options
-rw-r--r-- | AUTHORS | 2 | ||||
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | src/x11_in_qt4.cpp | 41 |
3 files changed, 40 insertions, 6 deletions
@@ -10,3 +10,5 @@ Contributors: * Idle interface fixes for X11 in Qt4 * Robin Gareus <robin@gareus.org> * Support for resizing X11 UIs in Gtk + * Rui Nuno Capela + * Fixes for X11 in Qt4
\ No newline at end of file @@ -1,8 +1,9 @@ suil (0.6.15) unstable; * Fix suil_instance_extension_data() for UIs with NULL extension_data + * Fix crashes and resizing for X11 in Qt (patch from Rui Nuno Capela) - -- David Robillard <d@drobilla.net> Fri, 09 Aug 2013 20:41:20 -0400 + -- David Robillard <d@drobilla.net> Mon, 16 Sep 2013 23:41:12 -0400 suil (0.6.14) stable; diff --git a/src/x11_in_qt4.cpp b/src/x11_in_qt4.cpp index ee55207..338ae12 100644 --- a/src/x11_in_qt4.cpp +++ b/src/x11_in_qt4.cpp @@ -27,6 +27,11 @@ typedef struct _LV2UI_Idle_Interface LV2UI_Idle_Interface; extern "C" { +typedef struct { + QX11EmbedContainer* host_widget; + QX11EmbedWidget* parent; +} SuilX11InQt4Wrapper; + class SuilQX11Container : public QX11EmbedContainer { public: @@ -45,6 +50,7 @@ public: if (_idle_iface && _ui_timer == 0) { _ui_timer = this->startTimer(30); _widget->embedInto(winId()); + resize(_widget->size()); } QX11EmbedContainer::showEvent(event); } @@ -63,6 +69,22 @@ public: int _ui_timer; }; +static void +wrapper_free(SuilWrapper* wrapper) +{ + SuilX11InQt4Wrapper* impl = (SuilX11InQt4Wrapper*)wrapper->impl; + + if (impl->parent) { + delete impl->parent; + } + + if (impl->host_widget) { + delete impl->host_widget; + } + + free(impl); +} + static int wrapper_wrap(SuilWrapper* wrapper, SuilInstance* instance) @@ -73,10 +95,12 @@ wrapper_wrap(SuilWrapper* wrapper, instance, LV2_UI__idleInterface); #endif - QX11EmbedWidget* const w = (QX11EmbedWidget*)wrapper->impl; - SuilQX11Container* const c = new SuilQX11Container(instance, idle_iface, w); + SuilX11InQt4Wrapper* const impl = (SuilX11InQt4Wrapper*)wrapper->impl; + QX11EmbedWidget* const ew = impl->parent; - instance->host_widget = c; + impl->host_widget = new SuilQX11Container(instance, idle_iface, ew); + + instance->host_widget = impl->host_widget; return 0; } @@ -97,13 +121,20 @@ suil_wrapper_new(SuilHost* host, LV2_Feature*** features, unsigned n_features) { + SuilX11InQt4Wrapper* const impl = (SuilX11InQt4Wrapper*) + malloc(sizeof(SuilX11InQt4Wrapper)); + impl->host_widget = NULL; + impl->parent = NULL; + SuilWrapper* wrapper = (SuilWrapper*)malloc(sizeof(SuilWrapper)); wrapper->wrap = wrapper_wrap; - wrapper->free = NULL; + wrapper->free = wrapper_free; QX11EmbedWidget* const ew = new QX11EmbedWidget(); - wrapper->impl = ew; + impl->parent = ew; + + wrapper->impl = impl; wrapper->resize.handle = ew; wrapper->resize.ui_resize = wrapper_resize; |