summaryrefslogtreecommitdiff
path: root/app-i18n/fcitx-qt/files/fcitx-qt-5.1.3-make-qwayland-workaround-optional.patch
blob: 0ef5fc8652a79e07b387a9d5c128d9a836090b46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
Backport of https://github.com/fcitx/fcitx5-qt/commit/af535e7e106f69e7dc6dc28db3653601d1e6156a

Backport upstream commit af535e7e making QtWayland optional.
All QtWayland-related code is guarded behind `isWayland` checks anyways.
This benefits users of pure X11 setups.

Author: Lucio Sauer <watermanpaint@posteo.net>

--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,6 +16,7 @@ option(ENABLE_QT6 "Enable Qt 6" Off)
 option(BUILD_ONLY_PLUGIN "Build only plugin" Off)
 option(BUILD_STATIC_PLUGIN "Build plugin as static" Off)
 option(WITH_FCITX_PLUGIN_NAME "Enable plugin name with fcitx" On)
+option(ENABLE_QT6_WAYLAND_WORKAROUND "Enable Qt6 Wayland workaround" On)
 
 if (BUILD_ONLY_PLUGIN)
   set(LIBRARY_TYPE OBJECT)
--- a/qt5/platforminputcontext/fcitxcandidatewindow.cpp
+++ b/qt5/platforminputcontext/fcitxcandidatewindow.cpp
@@ -21,7 +21,7 @@
 #include <QtMath>
 #include <utility>
 
-#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
+#if defined(FCITX_ENABLE_QT6_WAYLAND_WORKAROUND) && QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
 #include <QtWaylandClient/private/qwayland-xdg-shell.h>
 #include <QtWaylandClient/private/qwaylanddisplay_p.h>
 #include <QtWaylandClient/private/qwaylandintegration_p.h>
@@ -34,7 +34,7 @@ namespace fcitx {
 
 namespace {
 
-#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
+#if defined(FCITX_ENABLE_QT6_WAYLAND_WORKAROUND) && QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
 class XdgWmBase : public QtWayland::xdg_wm_base {
 public:
     using xdg_wm_base::xdg_wm_base;
@@ -120,7 +120,7 @@ FcitxCandidateWindow::FcitxCandidateWindow(QWindow *window,
         // Not using Qt::BypassWindowManagerHint ensures wayland handle
         // fractional scale.
         setFlags(Qt::ToolTip | commonFlags);
-#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
+#if defined(FCITX_ENABLE_QT6_WAYLAND_WORKAROUND) && QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
         if (auto instance = QtWaylandClient::QWaylandIntegration::instance()) {
             for (QtWaylandClient::QWaylandDisplay::RegistryGlobal global :
                  instance->display()->globals()) {
@@ -132,7 +132,6 @@ FcitxCandidateWindow::FcitxCandidateWindow(QWindow *window,
                 }
             }
         }
-#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
         setProperty("_q_waylandPopupAnchor",
                     QVariant::fromValue(Qt::BottomEdge | Qt::LeftEdge));
         setProperty("_q_waylandPopupGravity",
@@ -142,7 +141,6 @@ FcitxCandidateWindow::FcitxCandidateWindow(QWindow *window,
             static_cast<unsigned int>(
                 QtWayland::xdg_positioner::constraint_adjustment_slide_x |
                 QtWayland::xdg_positioner::constraint_adjustment_flip_y));
-#endif
 #endif
     } else {
         // Qt::Popup ensures X11 doesn't apply tooltip animation under kwin.
@@ -484,7 +482,7 @@ void FcitxCandidateWindow::updateClientSideUI(
     QRect cursorRect = context_->cursorRectangleWrapper();
     QRect screenGeometry;
 
-#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
+#if defined(FCITX_ENABLE_QT6_WAYLAND_WORKAROUND) && QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
     if (isWayland_) {
         auto waylandWindow =
             static_cast<QtWaylandClient::QWaylandWindow *>(window->handle());
@@ -520,12 +518,10 @@ void FcitxCandidateWindow::updateClientSideUI(
         }
         bool wasVisible = isVisible();
         bool cursorRectChanged = false;
-#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
         if (property("_q_waylandPopupAnchorRect") != cursorRect) {
             cursorRectChanged = true;
             setProperty("_q_waylandPopupAnchorRect", cursorRect);
         }
-#endif
         // This try to ensure xdg_popup is available.
         show();
         xdg_popup *xdgPopup = static_cast<xdg_popup *>(
@@ -553,7 +549,6 @@ void FcitxCandidateWindow::updateClientSideUI(
             positioner->destroy();
             return;
         }
-#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
         // Check if we need remap.
         // If it was invisible, nothing need to be done.
         // If cursor rect changed, the window must be remapped.
@@ -570,7 +565,6 @@ void FcitxCandidateWindow::updateClientSideUI(
             show();
         }
         return;
-#endif
     }
 #endif
     // Try to apply the screen edge detection over the window, because if we
--- a/qt5/platforminputcontext/fcitxcandidatewindow.h
+++ b/qt5/platforminputcontext/fcitxcandidatewindow.h
@@ -19,7 +19,7 @@
 #include <qscopedpointer.h>
 #include <vector>
 
-#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
+#if defined(FCITX_ENABLE_QT6_WAYLAND_WORKAROUND) && QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
 #include <QtWaylandClient/private/qwayland-xdg-shell.h>
 #endif
 
@@ -93,7 +93,7 @@ public Q_SLOTS:
     std::vector<QRect> candidateRegions_;
     QPointer<QWindow> parent_;
 
-#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
+#if defined(FCITX_ENABLE_QT6_WAYLAND_WORKAROUND) && QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
     QScopedPointer<QtWayland::xdg_wm_base> xdgWmBase_;
 #endif
 };
--- a/qt6/CMakeLists.txt
+++ b/qt6/CMakeLists.txt
@@ -1,8 +1,10 @@
 
 find_package(Qt6 ${REQUIRED_QT6_VERSION} CONFIG REQUIRED Core DBus Widgets)
 find_package(Qt6Gui ${REQUIRED_QT6_VERSION} REQUIRED Private)
-find_package(Qt6WaylandClient ${REQUIRED_QT6_VERSION} REQUIRED Private)
-find_package(Qt6WaylandGlobalPrivate ${REQUIRED_QT6_VERSION} REQUIRED)
+if (ENABLE_QT6_WAYLAND_WORKAROUND)
+  find_package(Qt6WaylandClient ${REQUIRED_QT6_VERSION} REQUIRED Private)
+  find_package(Qt6WaylandGlobalPrivate ${REQUIRED_QT6_VERSION} REQUIRED)
+endif()
 
 add_subdirectory(dbusaddons)
 add_subdirectory(platforminputcontext)
--- a/qt6/platforminputcontext/CMakeLists.txt
+++ b/qt6/platforminputcontext/CMakeLists.txt
@@ -49,11 +49,16 @@ target_link_libraries(fcitx5platforminputcontextplugin-qt6
                           XCB::XCB
                           Fcitx5Qt6::DBusAddons
                           XKBCommon::XKBCommon
-                          Qt6::WaylandGlobalPrivate
-                          Qt6::WaylandClient
-                          Qt6::WaylandClientPrivate
                          )
 
+if (ENABLE_QT6_WAYLAND_WORKAROUND)
+    target_compile_definitions(fcitx5platforminputcontextplugin-qt6 PRIVATE "-DFCITX_ENABLE_QT6_WAYLAND_WORKAROUND")
+    target_link_libraries(fcitx5platforminputcontextplugin-qt6
+        Qt6::WaylandGlobalPrivate
+        Qt6::WaylandClient
+        Qt6::WaylandClientPrivate)
+endif()
+
 get_target_property(_QT6_QMAKE_EXECUTABLE Qt6::qmake LOCATION)
 execute_process(
     COMMAND ${_QT6_QMAKE_EXECUTABLE} -query "QT_INSTALL_PLUGINS"