summaryrefslogtreecommitdiffstats
path: root/src/x11_in_qt5.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2015-09-12 16:02:02 +0000
committerDavid Robillard <d@drobilla.net>2015-09-12 16:02:02 +0000
commitefa94682fd223a084687cdcf0f626d56325de0e0 (patch)
tree6da00f1bd9a861679aca9a53cc702d1505d536b5 /src/x11_in_qt5.cpp
parentf18371240cf3d32940e9a67844505b46006e0788 (diff)
downloadsuil-efa94682fd223a084687cdcf0f626d56325de0e0.tar.gz
suil-efa94682fd223a084687cdcf0f626d56325de0e0.tar.bz2
suil-efa94682fd223a084687cdcf0f626d56325de0e0.zip
Add Gtk2 and X11 in Qt5 wrappers.
git-svn-id: http://svn.drobilla.net/lad/trunk/suil@5725 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/x11_in_qt5.cpp')
-rw-r--r--src/x11_in_qt5.cpp165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/x11_in_qt5.cpp b/src/x11_in_qt5.cpp
new file mode 100644
index 0000000..1f62796
--- /dev/null
+++ b/src/x11_in_qt5.cpp
@@ -0,0 +1,165 @@
+/*
+ Copyright 2011-2015 David Robillard <http://drobilla.net>
+ Copyright 2015 Rui Nuno Capela <rncbc@rncbc.org>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#include <QWidget>
+
+#include <QTimerEvent>
+
+#undef signals
+
+#include "./suil_config.h"
+#include "./suil_internal.h"
+
+#ifndef HAVE_LV2_1_6_0
+typedef struct _LV2UI_Idle_Interface LV2UI_Idle_Interface;
+#endif
+
+extern "C" {
+
+typedef struct {
+ QWidget* host_widget;
+ QWidget* parent;
+} SuilX11InQt5Wrapper;
+
+class SuilQX11Widget : public QWidget
+{
+public:
+ SuilQX11Widget(QWidget* parent, Qt::WindowFlags wflags)
+ : QWidget(parent, wflags)
+#ifdef HAVE_LV2_1_6_0
+ , _instance(NULL)
+ , _idle_iface(NULL)
+ , _ui_timer(0)
+#endif
+ {}
+
+#ifdef HAVE_LV2_1_6_0
+ void start_idle(SuilInstance* instance,
+ const LV2UI_Idle_Interface* idle_iface) {
+ _instance = instance;
+ _idle_iface = idle_iface;
+ if (_idle_iface && _ui_timer == 0) {
+ _ui_timer = this->startTimer(30);
+ }
+ }
+
+protected:
+ void timerEvent(QTimerEvent* event) {
+ if (event->timerId() == _ui_timer && _idle_iface) {
+ _idle_iface->idle(_instance->handle);
+ }
+ QWidget::timerEvent(event);
+ }
+
+private:
+ SuilInstance* _instance;
+ const LV2UI_Idle_Interface* _idle_iface;
+ int _ui_timer;
+#endif
+};
+
+static void
+wrapper_free(SuilWrapper* wrapper)
+{
+ SuilX11InQt5Wrapper* impl = (SuilX11InQt5Wrapper*)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)
+{
+ SuilX11InQt5Wrapper* const impl = (SuilX11InQt5Wrapper*)wrapper->impl;
+ SuilQX11Widget* const ew = (SuilQX11Widget*)impl->parent;
+
+#ifdef HAVE_LV2_1_6_0
+ if (instance->descriptor->extension_data) {
+ const LV2UI_Idle_Interface* idle_iface
+ = (const LV2UI_Idle_Interface*)
+ instance->descriptor->extension_data(LV2_UI__idleInterface);
+ ew->start_idle(instance, idle_iface);
+ }
+#endif
+
+ impl->host_widget = ew;
+
+ instance->host_widget = impl->host_widget;
+
+ return 0;
+}
+
+static int
+wrapper_resize(LV2UI_Feature_Handle handle, int width, int height)
+{
+ QWidget* const ew = (QWidget*)handle;
+ ew->resize(width, height);
+ return 0;
+}
+
+SUIL_LIB_EXPORT
+SuilWrapper*
+suil_wrapper_new(SuilHost* host,
+ const char* host_type_uri,
+ const char* ui_type_uri,
+ LV2_Feature*** features,
+ unsigned n_features)
+{
+ SuilX11InQt5Wrapper* const impl = (SuilX11InQt5Wrapper*)
+ calloc(1, sizeof(SuilX11InQt5Wrapper));
+
+ SuilWrapper* wrapper = (SuilWrapper*)malloc(sizeof(SuilWrapper));
+ wrapper->wrap = wrapper_wrap;
+ wrapper->free = wrapper_free;
+
+ Qt::WindowFlags wflags = Qt::Window
+ | Qt::CustomizeWindowHint
+ | Qt::WindowTitleHint
+ | Qt::WindowSystemMenuHint
+ | Qt::WindowMinMaxButtonsHint
+ | Qt::WindowCloseButtonHint;
+
+ QWidget* const ew = new SuilQX11Widget(NULL, wflags);
+
+ impl->parent = ew;
+
+ wrapper->impl = impl;
+ wrapper->resize.handle = ew;
+ wrapper->resize.ui_resize = wrapper_resize;
+
+ suil_add_feature(features, &n_features, LV2_UI__parent,
+ (void*)(intptr_t)ew->winId());
+
+ suil_add_feature(features, &n_features, LV2_UI__resize,
+ &wrapper->resize);
+
+#ifdef HAVE_LV2_1_6_0
+ suil_add_feature(features, &n_features, LV2_UI__idleInterface, NULL);
+#endif
+
+ return wrapper;
+}
+
+} // extern "C"