Accepting request 561009 from KDE:Qt5
- Add patch from upstream dev branch for compose key support: * 0001-Implement-basic-key-composition-support.patch - Add fix from upstream dev branch: * 0002-Automatically-change-scale-when-entering-a-new-outpu.patch OBS-URL: https://build.opensuse.org/request/show/561009 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqt5-qtwayland?expand=0&rev=18
This commit is contained in:
parent
9560f8538a
commit
5f056bb474
176
0001-Implement-basic-key-composition-support.patch
Normal file
176
0001-Implement-basic-key-composition-support.patch
Normal file
@ -0,0 +1,176 @@
|
||||
From 867cf6e37a657fea1bd847494d80b9b65678f5d8 Mon Sep 17 00:00:00 2001
|
||||
From: Giulio Camuffo <giulio.camuffo@jollamobile.com>
|
||||
Date: Fri, 1 May 2015 17:12:22 +0300
|
||||
Subject: [PATCH 1/2] Implement basic key composition support
|
||||
|
||||
Use xkbcommon-compose to handle basic compose key support. We should expand on
|
||||
it in the future to handle things like resetting the compose state on text
|
||||
field switching.
|
||||
|
||||
Task-number: QTBUG-54792
|
||||
Task-number: QTBUG-64572
|
||||
Change-Id: I9d1d5ca4c9991928e12979f69eaa477e0cb28ada
|
||||
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
|
||||
---
|
||||
src/client/qwaylandinputdevice.cpp | 65 +++++++++++++++++++++++++++++++++++++-
|
||||
src/client/qwaylandinputdevice_p.h | 9 ++++++
|
||||
2 files changed, 73 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/client/qwaylandinputdevice.cpp b/src/client/qwaylandinputdevice.cpp
|
||||
index 4def0de8..90b27769 100644
|
||||
--- a/src/client/qwaylandinputdevice.cpp
|
||||
+++ b/src/client/qwaylandinputdevice.cpp
|
||||
@@ -70,6 +70,10 @@
|
||||
|
||||
#include <QtGui/QGuiApplication>
|
||||
|
||||
+#if QT_CONFIG(xkbcommon_evdev)
|
||||
+#include <xkbcommon/xkbcommon-compose.h>
|
||||
+#endif
|
||||
+
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
@@ -113,6 +117,7 @@ bool QWaylandInputDevice::Keyboard::createDefaultKeyMap()
|
||||
qWarning() << "xkb_map_new_from_names failed, no key input";
|
||||
return false;
|
||||
}
|
||||
+ createComposeState();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -125,11 +130,41 @@ void QWaylandInputDevice::Keyboard::releaseKeyMap()
|
||||
if (mXkbContext)
|
||||
xkb_context_unref(mXkbContext);
|
||||
}
|
||||
+
|
||||
+void QWaylandInputDevice::Keyboard::createComposeState()
|
||||
+{
|
||||
+ static const char *locale = nullptr;
|
||||
+ if (!locale) {
|
||||
+ locale = getenv("LC_ALL");
|
||||
+ if (!locale)
|
||||
+ locale = getenv("LC_CTYPE");
|
||||
+ if (!locale)
|
||||
+ locale = getenv("LANG");
|
||||
+ if (!locale)
|
||||
+ locale = "C";
|
||||
+ }
|
||||
+
|
||||
+ mXkbComposeTable = xkb_compose_table_new_from_locale(mXkbContext, locale, XKB_COMPOSE_COMPILE_NO_FLAGS);
|
||||
+ if (mXkbComposeTable)
|
||||
+ mXkbComposeState = xkb_compose_state_new(mXkbComposeTable, XKB_COMPOSE_STATE_NO_FLAGS);
|
||||
+}
|
||||
+
|
||||
+void QWaylandInputDevice::Keyboard::releaseComposeState()
|
||||
+{
|
||||
+ if (mXkbComposeState)
|
||||
+ xkb_compose_state_unref(mXkbComposeState);
|
||||
+ if (mXkbComposeTable)
|
||||
+ xkb_compose_table_unref(mXkbComposeTable);
|
||||
+ mXkbComposeState = nullptr;
|
||||
+ mXkbComposeTable = nullptr;
|
||||
+}
|
||||
+
|
||||
#endif
|
||||
|
||||
QWaylandInputDevice::Keyboard::~Keyboard()
|
||||
{
|
||||
#if QT_CONFIG(xkbcommon_evdev)
|
||||
+ releaseComposeState();
|
||||
releaseKeyMap();
|
||||
#endif
|
||||
if (mFocus)
|
||||
@@ -632,6 +667,7 @@ void QWaylandInputDevice::Keyboard::keyboard_keymap(uint32_t format, int32_t fd,
|
||||
|
||||
// Release the old keymap resources in the case they were already created in
|
||||
// the key event or when the compositor issues a new map
|
||||
+ releaseComposeState();
|
||||
releaseKeyMap();
|
||||
|
||||
mXkbContext = xkb_context_new(xkb_context_flags(0));
|
||||
@@ -640,6 +676,8 @@ void QWaylandInputDevice::Keyboard::keyboard_keymap(uint32_t format, int32_t fd,
|
||||
close(fd);
|
||||
|
||||
mXkbState = xkb_state_new(mXkbMap);
|
||||
+ createComposeState();
|
||||
+
|
||||
#else
|
||||
Q_UNUSED(format);
|
||||
Q_UNUSED(fd);
|
||||
@@ -723,12 +761,37 @@ void QWaylandInputDevice::Keyboard::keyboard_key(uint32_t serial, uint32_t time,
|
||||
return;
|
||||
}
|
||||
|
||||
- const xkb_keysym_t sym = xkb_state_key_get_one_sym(mXkbState, code);
|
||||
+ QString composedText;
|
||||
+ xkb_keysym_t sym = xkb_state_key_get_one_sym(mXkbState, code);
|
||||
+ if (mXkbComposeState) {
|
||||
+ if (isDown)
|
||||
+ xkb_compose_state_feed(mXkbComposeState, sym);
|
||||
+ xkb_compose_status status = xkb_compose_state_get_status(mXkbComposeState);
|
||||
+
|
||||
+ switch (status) {
|
||||
+ case XKB_COMPOSE_COMPOSED: {
|
||||
+ int size = xkb_compose_state_get_utf8(mXkbComposeState, nullptr, 0);
|
||||
+ QVarLengthArray<char, 32> buffer(size + 1);
|
||||
+ xkb_compose_state_get_utf8(mXkbComposeState, buffer.data(), buffer.size());
|
||||
+ composedText = QString::fromUtf8(buffer.constData());
|
||||
+ sym = xkb_compose_state_get_one_sym(mXkbComposeState);
|
||||
+ xkb_compose_state_reset(mXkbComposeState);
|
||||
+ } break;
|
||||
+ case XKB_COMPOSE_COMPOSING:
|
||||
+ case XKB_COMPOSE_CANCELLED:
|
||||
+ return;
|
||||
+ case XKB_COMPOSE_NOTHING:
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
Qt::KeyboardModifiers modifiers = mParent->modifiers();
|
||||
|
||||
std::tie(qtkey, text) = QWaylandXkb::keysymToQtKey(sym, modifiers);
|
||||
|
||||
+ if (!composedText.isNull())
|
||||
+ text = composedText;
|
||||
+
|
||||
sendKey(window->window(), time, type, qtkey, modifiers, code, sym, mNativeModifiers, text);
|
||||
#else
|
||||
// Generic fallback for single hard keys: Assume 'key' is a Qt key code.
|
||||
diff --git a/src/client/qwaylandinputdevice_p.h b/src/client/qwaylandinputdevice_p.h
|
||||
index 9e3d1d1f..b1424981 100644
|
||||
--- a/src/client/qwaylandinputdevice_p.h
|
||||
+++ b/src/client/qwaylandinputdevice_p.h
|
||||
@@ -76,6 +76,11 @@
|
||||
struct wl_cursor_image;
|
||||
#endif
|
||||
|
||||
+#if QT_CONFIG(xkbcommon_evdev)
|
||||
+struct xkb_compose_state;
|
||||
+struct xkb_compose_table;
|
||||
+#endif
|
||||
+
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
@@ -207,6 +212,8 @@ public:
|
||||
xkb_context *mXkbContext;
|
||||
xkb_keymap *mXkbMap;
|
||||
xkb_state *mXkbState;
|
||||
+ xkb_compose_table *mXkbComposeTable = nullptr;
|
||||
+ xkb_compose_state *mXkbComposeState = nullptr;
|
||||
#endif
|
||||
uint32_t mNativeModifiers;
|
||||
|
||||
@@ -228,6 +235,8 @@ private:
|
||||
#if QT_CONFIG(xkbcommon_evdev)
|
||||
bool createDefaultKeyMap();
|
||||
void releaseKeyMap();
|
||||
+ void createComposeState();
|
||||
+ void releaseComposeState();
|
||||
#endif
|
||||
|
||||
};
|
||||
--
|
||||
2.15.0
|
||||
|
139
0002-Automatically-change-scale-when-entering-a-new-outpu.patch
Normal file
139
0002-Automatically-change-scale-when-entering-a-new-outpu.patch
Normal file
@ -0,0 +1,139 @@
|
||||
From ae858fe3d5a81b8ce5ab1d6ce7e2e6a65a11cc14 Mon Sep 17 00:00:00 2001
|
||||
From: Johan Klokkhammer Helsing <johan.helsing@qt.io>
|
||||
Date: Fri, 18 Aug 2017 13:08:50 +0200
|
||||
Subject: [PATCH 2/2] Automatically change scale when entering a new output
|
||||
|
||||
Change-Id: I99198d47eac5b2091fe2bfd8fc24646be9c9890a
|
||||
Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@liri.io>
|
||||
Reviewed-by: David Edmundson <davidedmundson@kde.org>
|
||||
---
|
||||
src/client/qwaylandwindow.cpp | 27 ++++++++++++++++++----
|
||||
src/client/qwaylandwindow_p.h | 2 ++
|
||||
.../client/wayland-egl/qwaylandeglwindow.cpp | 5 ++++
|
||||
.../client/wayland-egl/qwaylandeglwindow.h | 1 +
|
||||
4 files changed, 31 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
|
||||
index 6d7c0885..c7490532 100644
|
||||
--- a/src/client/qwaylandwindow.cpp
|
||||
+++ b/src/client/qwaylandwindow.cpp
|
||||
@@ -128,6 +128,12 @@ QWaylandWindow::~QWaylandWindow()
|
||||
}
|
||||
}
|
||||
|
||||
+void QWaylandWindow::ensureSize()
|
||||
+{
|
||||
+ if (mBackingStore)
|
||||
+ mBackingStore->ensureSize();
|
||||
+}
|
||||
+
|
||||
void QWaylandWindow::initWindow()
|
||||
{
|
||||
if (window()->type() == Qt::Desktop)
|
||||
@@ -196,7 +202,6 @@ void QWaylandWindow::initWindow()
|
||||
// Enable high-dpi rendering. Scale() returns the screen scale factor and will
|
||||
// typically be integer 1 (normal-dpi) or 2 (high-dpi). Call set_buffer_scale()
|
||||
// to inform the compositor that high-resolution buffers will be provided.
|
||||
- //FIXME this needs to be changed when the screen changes along with a resized backing store
|
||||
if (mDisplay->compositorVersion() >= 3)
|
||||
set_buffer_scale(scale());
|
||||
|
||||
@@ -516,7 +521,7 @@ void QWaylandWindow::surface_enter(wl_output *output)
|
||||
|
||||
QWaylandScreen *newScreen = calculateScreenFromSurfaceEvents();
|
||||
if (oldScreen != newScreen) //currently this will only happen if the first wl_surface.enter is for a non-primary screen
|
||||
- QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->QPlatformScreen::screen());
|
||||
+ handleScreenChanged();
|
||||
}
|
||||
|
||||
void QWaylandWindow::surface_leave(wl_output *output)
|
||||
@@ -533,7 +538,7 @@ void QWaylandWindow::surface_leave(wl_output *output)
|
||||
|
||||
QWaylandScreen *newScreen = calculateScreenFromSurfaceEvents();
|
||||
if (oldScreen != newScreen)
|
||||
- QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->QPlatformScreen::screen());
|
||||
+ handleScreenChanged();
|
||||
}
|
||||
|
||||
void QWaylandWindow::handleScreenRemoved(QScreen *qScreen)
|
||||
@@ -543,7 +548,7 @@ void QWaylandWindow::handleScreenRemoved(QScreen *qScreen)
|
||||
if (wasRemoved) {
|
||||
QWaylandScreen *newScreen = calculateScreenFromSurfaceEvents();
|
||||
if (oldScreen != newScreen)
|
||||
- QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->QPlatformScreen::screen());
|
||||
+ handleScreenChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -906,6 +911,20 @@ void QWaylandWindow::handleMouseEventWithDecoration(QWaylandInputDevice *inputDe
|
||||
}
|
||||
}
|
||||
|
||||
+void QWaylandWindow::handleScreenChanged()
|
||||
+{
|
||||
+ QWaylandScreen *newScreen = calculateScreenFromSurfaceEvents();
|
||||
+ QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->QPlatformScreen::screen());
|
||||
+
|
||||
+ int scale = newScreen->scale();
|
||||
+ if (scale != mScale) {
|
||||
+ mScale = scale;
|
||||
+ if (isInitialized() && mDisplay->compositorVersion() >= 3)
|
||||
+ set_buffer_scale(mScale);
|
||||
+ ensureSize();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
#if QT_CONFIG(cursor)
|
||||
void QWaylandWindow::setMouseCursor(QWaylandInputDevice *device, const QCursor &cursor)
|
||||
{
|
||||
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
|
||||
index bd4a3590..5457d655 100644
|
||||
--- a/src/client/qwaylandwindow_p.h
|
||||
+++ b/src/client/qwaylandwindow_p.h
|
||||
@@ -110,6 +110,7 @@ public:
|
||||
~QWaylandWindow();
|
||||
|
||||
virtual WindowType windowType() const = 0;
|
||||
+ virtual void ensureSize();
|
||||
WId winId() const override;
|
||||
void setVisible(bool visible) override;
|
||||
void setParent(const QPlatformWindow *parent) override;
|
||||
@@ -263,6 +264,7 @@ private:
|
||||
QWaylandScreen *calculateScreenFromSurfaceEvents() const;
|
||||
|
||||
void handleMouseEventWithDecoration(QWaylandInputDevice *inputDevice, const QWaylandPointerEvent &e);
|
||||
+ void handleScreenChanged();
|
||||
|
||||
bool mUpdateRequested;
|
||||
|
||||
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
|
||||
index 6b5c5326..87f3e2d4 100644
|
||||
--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
|
||||
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
|
||||
@@ -92,6 +92,11 @@ QWaylandWindow::WindowType QWaylandEglWindow::windowType() const
|
||||
return QWaylandWindow::Egl;
|
||||
}
|
||||
|
||||
+void QWaylandEglWindow::ensureSize()
|
||||
+{
|
||||
+ updateSurface(false);
|
||||
+}
|
||||
+
|
||||
void QWaylandEglWindow::setGeometry(const QRect &rect)
|
||||
{
|
||||
QWaylandWindow::setGeometry(rect);
|
||||
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h
|
||||
index e471a8f7..77aee56d 100644
|
||||
--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h
|
||||
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h
|
||||
@@ -59,6 +59,7 @@ public:
|
||||
QWaylandEglWindow(QWindow *window);
|
||||
~QWaylandEglWindow();
|
||||
WindowType windowType() const override;
|
||||
+ void ensureSize() override;
|
||||
|
||||
void updateSurface(bool create);
|
||||
virtual void setGeometry(const QRect &rect) override;
|
||||
--
|
||||
2.15.0
|
||||
|
@ -1,3 +1,11 @@
|
||||
-------------------------------------------------------------------
|
||||
Mon Jan 1 01:03:04 UTC 2018 - fabian@ritter-vogt.de
|
||||
|
||||
- Add patch from upstream dev branch for compose key support:
|
||||
* 0001-Implement-basic-key-composition-support.patch
|
||||
- Add fix from upstream dev branch:
|
||||
* 0002-Automatically-change-scale-when-entering-a-new-outpu.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Dec 8 23:14:19 UTC 2017 - christophe@krop.fr
|
||||
|
||||
|
@ -33,6 +33,9 @@ Source: https://download.qt.io/official_releases/qt/5.10/%{real_version}
|
||||
Source1: baselibs.conf
|
||||
# PATCH-FIX-OPENSUSE
|
||||
Patch1: workaround-null-object.patch
|
||||
# Patches from upstream dev branch
|
||||
Patch2000: 0001-Implement-basic-key-composition-support.patch
|
||||
Patch2001: 0002-Automatically-change-scale-when-entering-a-new-outpu.patch
|
||||
BuildRequires: fdupes
|
||||
BuildRequires: libqt5-qtbase-private-headers-devel >= %{version}
|
||||
BuildRequires: libqt5-qtdeclarative-private-headers-devel >= %{version}
|
||||
@ -104,6 +107,8 @@ Examples for libqt5-qtwayland module.
|
||||
%prep
|
||||
%setup -q -n %{tar_version}
|
||||
%patch1 -p1
|
||||
%patch2000 -p1
|
||||
%patch2001 -p1
|
||||
|
||||
%post -n libQt5WaylandCompositor5 -p /sbin/ldconfig
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user