summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-04-26 21:44:09 +0200
committerDavid Robillard <d@drobilla.net>2020-04-26 21:44:33 +0200
commiteee62b7f32e4ef7aaca09565fa53b54ad0815970 (patch)
tree775e52c85876c19e70a339b962d5a89271435b62
parent3ca8969fda53f3ad0a520bccb6526c327dd151e6 (diff)
downloadsuil-eee62b7f32e4ef7aaca09565fa53b54ad0815970.tar.gz
suil-eee62b7f32e4ef7aaca09565fa53b54ad0815970.tar.bz2
suil-eee62b7f32e4ef7aaca09565fa53b54ad0815970.zip
Implement size hints for X11 in Qt5
-rw-r--r--src/x11_in_qt5.cpp76
-rw-r--r--wscript7
2 files changed, 72 insertions, 11 deletions
diff --git a/src/x11_in_qt5.cpp b/src/x11_in_qt5.cpp
index 509f747..229a98d 100644
--- a/src/x11_in_qt5.cpp
+++ b/src/x11_in_qt5.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2011-2015 David Robillard <http://drobilla.net>
+ Copyright 2011-2020 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
@@ -18,6 +18,9 @@
#include <QCloseEvent>
#include <QTimerEvent>
#include <QWidget>
+#include <QX11Info>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
#undef signals
@@ -26,11 +29,6 @@
extern "C" {
-typedef struct {
- QWidget* host_widget;
- QWidget* parent;
-} SuilX11InQt5Wrapper;
-
class SuilQX11Widget : public QWidget
{
public:
@@ -38,6 +36,7 @@ public:
: QWidget(parent, wflags)
, _instance(NULL)
, _idle_iface(NULL)
+ , _window(0)
, _ui_timer(0)
{}
@@ -51,6 +50,36 @@ public:
}
}
+ void set_window(Window window)
+ {
+ _window = window;
+ }
+
+ QSize sizeHint() const override
+ {
+ if (_window) {
+ XWindowAttributes attrs{};
+ XGetWindowAttributes(QX11Info::display(), _window, &attrs);
+ return {attrs.width, attrs.height};
+ }
+
+ return {0, 0};
+ }
+
+ QSize minimumSizeHint() const override
+ {
+ if (_window) {
+ XSizeHints hints{};
+ long supplied{};
+ XGetWMNormalHints(QX11Info::display(), _window, &hints, &supplied);
+ if ((hints.flags & PMinSize)) {
+ return {hints.min_width, hints.min_height};
+ }
+ }
+
+ return {0, 0};
+ }
+
protected:
void timerEvent(QTimerEvent* event) override
{
@@ -72,9 +101,15 @@ protected:
private:
SuilInstance* _instance;
const LV2UI_Idle_Interface* _idle_iface;
+ Window _window;
int _ui_timer;
};
+typedef struct {
+ QWidget* host_widget;
+ SuilQX11Widget* parent;
+} SuilX11InQt5Wrapper;
+
static void
wrapper_free(SuilWrapper* wrapper)
{
@@ -91,8 +126,31 @@ static int
wrapper_wrap(SuilWrapper* wrapper,
SuilInstance* instance)
{
- SuilX11InQt5Wrapper* const impl = (SuilX11InQt5Wrapper*)wrapper->impl;
- SuilQX11Widget* const ew = (SuilQX11Widget*)impl->parent;
+ SuilX11InQt5Wrapper* const impl = (SuilX11InQt5Wrapper*)wrapper->impl;
+ SuilQX11Widget* const ew = (SuilQX11Widget*)impl->parent;
+ Display* const display = QX11Info::display();
+ const Window window = (Window)instance->ui_widget;
+
+ XWindowAttributes attrs{};
+ XSizeHints hints{};
+ long supplied{};
+ XSync(display, False);
+ XGetWindowAttributes(display, window, &attrs);
+ XGetWMNormalHints(display, window, &hints, &supplied);
+
+ impl->parent->set_window(window);
+
+ if ((hints.flags & PBaseSize)) {
+ impl->parent->setBaseSize(hints.base_width, hints.base_height);
+ }
+
+ if ((hints.flags & PMinSize)) {
+ impl->parent->setMinimumSize(hints.min_width, hints.min_height);
+ }
+
+ if ((hints.flags & PMaxSize)) {
+ impl->parent->setMaximumSize(hints.max_width, hints.max_height);
+ }
if (instance->descriptor->extension_data) {
const LV2UI_Idle_Interface* idle_iface
@@ -131,7 +189,7 @@ suil_wrapper_new(SuilHost* host,
wrapper->wrap = wrapper_wrap;
wrapper->free = wrapper_free;
- QWidget* const ew = new SuilQX11Widget(NULL, Qt::Window);
+ SuilQX11Widget* const ew = new SuilQX11Widget(NULL, Qt::Window);
impl->parent = ew;
diff --git a/wscript b/wscript
index 3bd065f..7a4aea8 100644
--- a/wscript
+++ b/wscript
@@ -107,6 +107,9 @@ def configure(conf):
conf.check_pkg('Qt5Widgets >= 5.1.0',
uselib_store='QT5',
mandatory=False)
+ conf.check_pkg('Qt5X11Extras >= 5.1.0',
+ uselib_store='QT5_X11',
+ mandatory=False)
if not conf.options.no_cocoa:
if conf.check_cxx(header_name = 'QMacCocoaViewContainer',
@@ -152,7 +155,7 @@ def configure(conf):
if conf.env.HAVE_QT4:
enable_module('SUIL_WITH_X11_IN_QT4')
- if conf.env.HAVE_QT5:
+ if conf.env.HAVE_QT5 and conf.env.HAVE_QT5_X11:
enable_module('SUIL_WITH_X11_IN_QT5')
if conf.env.HAVE_X11:
@@ -388,7 +391,7 @@ def build(bld):
install_path = module_dir,
cflags = cflags,
lib = modlib,
- uselib = 'QT5 LV2')
+ uselib = 'QT5 QT5_X11 LV2 X11')
if bld.env.SUIL_WITH_COCOA_IN_QT5:
obj = bld(features = 'cxx cxxshlib',