dde-kwin/dde-kwin.5.4.26.patch
konglidong 5b2d56c57b update to version 5.4.26
(cherry picked from commit a3424231df6ec27e1f1649646cede611b1c7c750)
2022-08-01 13:06:34 +08:00

806 lines
28 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

commit df1937194c07b850425bd047ed4fc8a8986b0609
Author: justforlxz <justforlxz@gmail.com>
Date: Wed Apr 6 20:24:55 2022 +0800
refactor: scissor-window
Adapt to kwin 4.24
Log: Adapt to kwin 4.24
Change-Id: I5da82f2b20cfc6ed165e2e0559fa556624de1d77
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cbbf79e0c..60c2f3cd8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -15,6 +15,26 @@ add_definitions(
-DPROJECT_VERSION=\\"${PROJECT_VERSION}\\"
)
+option(USE_PLUGINS "use dde-kwin plugins" ON)
+option(USE_SCRIPTS "use scripts" ON)
+option(USE_DEEPIN_WM_DBUS "use deepin-wm dbus service" ON)
+option(USE_TABBOX "use deepin style tabbox" ON)
+option(USE_WINDOW_TOOL "support wayland and x11" ON)
+option(USE_DEEPIN_WAYLAND "use deepin wayland" ON)
+option(USE_KWIN_NO_SCALE "use kwin_no_scale script" ON)
+option(ENABLE_BUILTIN_SCISSOR_WINDOW "enable deepin built-in scissor window plugin" ON)
+option(ENABLE_BUILTIN_BLUR "enable deepin built-in blur plugin" ON)
+option(ENABLE_BUILTIN_MULTITASKING "enable deepin built-in multitasking plugin" ON)
+option(ENABLE_BUILTIN_BLACK_SCREEN "enable deepin built-in black screen plugin" ON)
+
+if(ENABLE_BUILTIN_BLUR)
+ add_definitions(-DENABLE_BUILTIN_BLUR)
+endif(ENABLE_BUILTIN_BLUR)
+
+if (USE_DEEPIN_WAYLAND)
+ add_definitions(-DUSE_DEEPIN_WAYLAND)
+endif(USE_DEEPIN_WAYLAND)
+
#when "KWIN_VERSION > KWIN_VERSION_CHECK(5, 18, 90, 0)"
find_path(
KWaylandServerPath
@@ -91,14 +111,28 @@ if (KWIN_VERSION)
)
endif()
-add_subdirectory(configures)
-set(DDE_KWIN_SUPPORTED_VERSION "5.21.5")
-if (${KWIN_VERSION} STRLESS ${DDE_KWIN_SUPPORTED_VERSION} OR ${KWIN_VERSION} STREQUAL ${DDE_KWIN_SUPPORTED_VERSION})
- add_subdirectory(plugins)
- add_subdirectory(scripts)
- add_subdirectory(deepin-wm-dbus)
- add_subdirectory(tabbox)
- if (BUILD_TESTING)
- add_subdirectory(tests)
- endif()
+if (USE_PLUGINS)
+ add_subdirectory(plugins)
+endif()
+
+if (USE_SCRIPTS)
+ add_subdirectory(scripts)
+endif()
+
+if (USE_DEEPIN_WM_DBUS)
+ add_subdirectory(deepin-wm-dbus)
endif()
+
+if (USE_TABBOX)
+add_subdirectory(tabbox)
+endif()
+
+if (BUILD_TESTING)
+ add_subdirectory(tests)
+endif()
+
+if (USE_WINDOW_TOOL)
+ add_subdirectory(windowtool)
+endif()
+
+add_subdirectory(configures)
diff --git a/configures/CMakeLists.txt b/configures/CMakeLists.txt
index 4ac0a906d..99e0d0970 100644
--- a/configures/CMakeLists.txt
+++ b/configures/CMakeLists.txt
@@ -1,9 +1,17 @@
configure_file(kwin_no_scale.in kwin_no_scale)
+if(ENABLE_BUILTIN_BLUR)
+ set(ENABLE_BUILTIN_BLUR_STRING "false")
+ else()
+ set(ENABLE_BUILTIN_BLUR_STRING "true")
+ endif()
+
+configure_file(kwinrc.in kwinrc)
+
install(
FILES
kglobalshortcutsrc
- kwinrc
+ ${CMAKE_CURRENT_BINARY_DIR}/kwinrc
kwinrulesrc
klaunchrc
kdeglobals
@@ -11,4 +19,9 @@ install(
"/etc/xdg"
)
-install_files("/bin" FILES ${CMAKE_CURRENT_BINARY_DIR}/kwin_no_scale)
+if (USE_KWIN_NO_SCALE)
+ configure_file(kwin_no_scale.in kwin_no_scale)
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/kwin_no_scale
+ DESTINATION bin
+ PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
+endif()
diff --git a/configures/kwin_no_scale.in b/configures/kwin_no_scale.in
old mode 100755
new mode 100644
index d34aba1f7..8b4a5b18a
--- a/configures/kwin_no_scale.in
+++ b/configures/kwin_no_scale.in
@@ -1,20 +1,19 @@
-#!/bin/sh
-
-KWIN_VERSION=`kwin_x11 --version 2>/dev/null`
-DDE_KWIN_SUPPORTED_VERSION='kwin 5.21.5'
-if [ "$KWIN_VERSION" \> "$DDE_KWIN_SUPPORTED_VERSION" ]; then
- kwin_x11 $@
- exit 0
-fi
+#!/bin/bash
if [ -n "$HOME" ];then
cp -n /etc/xdg/kglobalshortcutsrc $HOME/.config/kglobalshortcutsrc
fi
-EXECUTE_PATH=$(cd `dirname $0`; pwd)
+ARGS=$@
+
+function runDeepinKWin() {
+ local EXECUTE_PATH=$1
+ export LD_PRELOAD=${PLUGIN_INSTALL_PATH}/libdde-kwin-xcb.so:$LD_PRELOAD
+ export QT_SCALE_FACTOR=1
+ #":"后的"appFilePath=..."会传递给QPlatformIntegration::create调用
+ # appFilePath 的值会覆盖 QCoreApplication::applicationPath以确保kwin崩溃自动重启时也是启动的kwin_no_scale脚本
+ kwin_x11 -platform dde-kwin-xcb:appFilePath=$EXECUTE_PATH/kwin_no_scale $ARGS
+ return $?
+}
-export "LD_PRELOAD=${PLUGIN_INSTALL_PATH}/libdde-kwin-xcb.so:$LD_PRELOAD"
-export QT_SCALE_FACTOR=1
-#":"后的"appFilePath=..."会传递给QPlatformIntegration::create调用
-# appFilePath 的值会覆盖 QCoreApplication::applicationPath以确保kwin崩溃自动重启时也是启动的kwin_no_scale脚本
-kwin_x11 -platform dde-kwin-xcb:appFilePath=$EXECUTE_PATH/kwin_no_scale $@
+runDeepinKWin "$(cd `dirname $0`; pwd)" || kwin_x11 $ARGS
diff --git a/configures/kwinrc b/configures/kwinrc.in
similarity index 98%
rename from configures/kwinrc
rename to configures/kwinrc.in
index c1fde055b..3d73073e5 100644
--- a/configures/kwinrc
+++ b/configures/kwinrc.in
@@ -1,6 +1,6 @@
[Plugins]
#默认使用com.deepin.blur
-blurEnabled=false
+blurEnabled=@ENABLE_BUILTIN_BLUR_STRING@
enforcedecoEnabled=false
minimizeallEnabled=true
kwin4_effect_dialogparentEnabled=false
diff --git a/deepin-wm-dbus/CMakeLists.txt b/deepin-wm-dbus/CMakeLists.txt
index 3312af1d9..3807bc8f9 100644
--- a/deepin-wm-dbus/CMakeLists.txt
+++ b/deepin-wm-dbus/CMakeLists.txt
@@ -3,6 +3,7 @@ set(TARGET_NAME "deepin-wm-dbus")
find_package(Qt5Core REQUIRED)
find_package(Qt5DBus REQUIRED)
+find_package(X11 REQUIRED)
find_package(KF5Config REQUIRED)
find_package(KF5WindowSystem REQUIRED)
find_package(KF5GlobalAccel REQUIRED)
diff --git a/plugins/kdecoration/CMakeLists.txt b/plugins/kdecoration/CMakeLists.txt
index 0a34ea25d..60196cf37 100644
--- a/plugins/kdecoration/CMakeLists.txt
+++ b/plugins/kdecoration/CMakeLists.txt
@@ -5,6 +5,7 @@ add_definitions(-DTARGET_NAME=\\"${TARGET_NAME}\\")
find_package(Qt5 CONFIG REQUIRED COMPONENTS Core)
find_package(KF5CoreAddons REQUIRED)
find_package(Qt5DBus REQUIRED)
+find_package(X11 REQUIRED)
find_package(KF5Config REQUIRED)
find_package(KF5WindowSystem REQUIRED)
find_package(KDecoration2 REQUIRED)
diff --git a/plugins/kdecoration/chameleon.cpp b/plugins/kdecoration/chameleon.cpp
index 6896edbde..289b9c3cc 100644
--- a/plugins/kdecoration/chameleon.cpp
+++ b/plugins/kdecoration/chameleon.cpp
@@ -80,6 +80,7 @@ void Chameleon::init()
updateTheme();
if (!QX11Info::isPlatformX11() && m_client) {
+#ifdef USE_DEEPIN_WAYLAND
m_ddeShellSurface = static_cast<KWayland::Server::DDEShellSurfaceInterface*>(KWinUtils::getDDEShellSurface(m_client));
if (m_ddeShellSurface) {
connect(m_ddeShellSurface, &KWayland::Server::DDEShellSurfaceInterface::noTitleBarPropertyRequested, this,
@@ -102,6 +103,7 @@ void Chameleon::init()
}
);
}
+#endif
}
connect(global_config, &ChameleonConfig::themeChanged, this, &Chameleon::updateTheme);
diff --git a/plugins/kdecoration/chameleon.h b/plugins/kdecoration/chameleon.h
index 6bfde0b16..4eed1e543 100644
--- a/plugins/kdecoration/chameleon.h
+++ b/plugins/kdecoration/chameleon.h
@@ -33,7 +33,11 @@
#include <QSettings>
#include <QScreen>
#include <QPainterPath>
+#include <QFont>
+
+#ifdef USE_DEEPIN_WAYLAND
#include <KWayland/Server/ddeshell_interface.h>
+#endif
class Settings;
class ChameleonWindowTheme;
@@ -124,7 +128,10 @@ private:
QPointer<KWin::EffectWindow> m_effect;
QFont m_font;
+
+#ifdef USE_DEEPIN_WAYLAND
KWayland::Server::DDEShellSurfaceInterface * m_ddeShellSurface = nullptr;
+#endif
};
#endif // CHAMELEON_H
diff --git a/plugins/kdecoration/chameleonconfig.cpp b/plugins/kdecoration/chameleonconfig.cpp
index 8b6a03b8e..3a12e93a1 100644
--- a/plugins/kdecoration/chameleonconfig.cpp
+++ b/plugins/kdecoration/chameleonconfig.cpp
@@ -141,7 +141,7 @@ void ChameleonConfig::onConfigChanged()
}
#define D_KWIN_DEBUG_APP_START_TIME "D_KWIN_DEBUG_APP_START_TIME"
-void ChameleonConfig::onClientAdded(KWin::Client *client)
+void ChameleonConfig::onClientAdded(KWin::AbstractClient *client)
{
QObject *c = reinterpret_cast<QObject*>(client);
@@ -905,7 +905,7 @@ void ChameleonConfig::init()
{
#ifndef DISBLE_DDE_KWIN_XCB
connect(KWinUtils::workspace(), SIGNAL(configChanged()), this, SLOT(onConfigChanged()));
- connect(KWinUtils::workspace(), SIGNAL(clientAdded(KWin::Client*)), this, SLOT(onClientAdded(KWin::Client*)));
+ connect(KWinUtils::workspace(), SIGNAL(clientAdded(KWin::AbstractClient*)), this, SLOT(onClientAdded(KWin::AbstractClient*)));
connect(KWinUtils::workspace(), SIGNAL(unmanagedAdded(KWin::Unmanaged*)), this, SLOT(onUnmanagedAdded(KWin::Unmanaged*)));
connect(KWinUtils::compositor(), SIGNAL(compositingToggled(bool)), this, SLOT(onCompositingToggled(bool)));
connect(KWinUtils::instance(), &KWinUtils::windowPropertyChanged, this, &ChameleonConfig::onWindowPropertyChanged);
@@ -1225,7 +1225,11 @@ void ChameleonConfig::buildKWinX11Shadow(QObject *window)
effect = window->findChild<KWin::EffectWindow*>(QString(), Qt::FindDirectChildrenOnly);
if (effect) {
- QRect shape_rect = effect->shape().boundingRect();
+#if !defined(KWIN_VERSION) || KWIN_VERSION < KWIN_VERSION_CHECK(5, 23, 4, 0)
+ QRect shape_rect = effect->geometry();
+#else
+ QRect shape_rect = effect->clientGeometry();
+#endif
const QRect window_rect(QPoint(0, 0), window->property("size").toSize());
// 减去窗口的shape区域
diff --git a/plugins/kdecoration/chameleonconfig.h b/plugins/kdecoration/chameleonconfig.h
index b9408267e..be5a48b9a 100644
--- a/plugins/kdecoration/chameleonconfig.h
+++ b/plugins/kdecoration/chameleonconfig.h
@@ -38,7 +38,7 @@
#define _NET_WM_WINDOW_TYPE "_NET_WM_WINDOW_TYPE"
namespace KWin {
-class Client;
+class AbstractClient;
class Unmanaged;
class EffectWindow;
class Toplevel;
@@ -93,7 +93,7 @@ protected:
private slots:
void onConfigChanged();
- void onClientAdded(KWin::Client *client);
+ void onClientAdded(KWin::AbstractClient *client);
// 针对X11BypassWindowManagerHint类型的窗口需要做一些特殊处理
void onUnmanagedAdded(KWin::Unmanaged *client);
void onCompositingToggled(bool active);
diff --git a/plugins/kwineffects/CMakeLists.txt b/plugins/kwineffects/CMakeLists.txt
index 9832df92a..5a6036896 100644
--- a/plugins/kwineffects/CMakeLists.txt
+++ b/plugins/kwineffects/CMakeLists.txt
@@ -1,10 +1,22 @@
find_package(Qt5 CONFIG REQUIRED COMPONENTS Core Gui)
+find_package(X11 REQUIRED)
find_package(KF5CoreAddons REQUIRED)
find_package(KF5WindowSystem REQUIRED)
set(INSTALL_PATH "${QT_INSTALL_PLUGINS}/kwin/effects/plugins")
-add_subdirectory(scissor-window)
-add_subdirectory(blur)
-add_subdirectory(multitasking)
-add_subdirectory(black-screen)
+if (ENABLE_BUILTIN_SCISSOR_WINDOW)
+ add_subdirectory(scissor-window)
+endif()
+
+if (ENABLE_BUILTIN_BLUR)
+ add_subdirectory(blur)
+endif()
+
+if (ENABLE_BUILTIN_MULTITASKING)
+ add_subdirectory(multitasking)
+endif()
+
+if (ENABLE_BUILTIN_BLACK_SCREEN)
+ add_subdirectory(black-screen)
+endif()
diff --git a/plugins/kwineffects/scissor-window/cornermask.frag.140 b/plugins/kwineffects/scissor-window/cornermask.frag
similarity index 100%
rename from plugins/kwineffects/scissor-window/cornermask.frag.140
rename to plugins/kwineffects/scissor-window/cornermask.frag
diff --git a/plugins/kwineffects/scissor-window/cornermask.frag.110 b/plugins/kwineffects/scissor-window/cornermask_core.frag
similarity index 100%
rename from plugins/kwineffects/scissor-window/cornermask.frag.110
rename to plugins/kwineffects/scissor-window/cornermask_core.frag
diff --git a/plugins/kwineffects/scissor-window/fullmask.frag.140 b/plugins/kwineffects/scissor-window/fullmask.frag
similarity index 100%
rename from plugins/kwineffects/scissor-window/fullmask.frag.140
rename to plugins/kwineffects/scissor-window/fullmask.frag
diff --git a/plugins/kwineffects/scissor-window/fullmask.frag.110 b/plugins/kwineffects/scissor-window/fullmask_core.frag
similarity index 100%
rename from plugins/kwineffects/scissor-window/fullmask.frag.110
rename to plugins/kwineffects/scissor-window/fullmask_core.frag
diff --git a/plugins/kwineffects/scissor-window/glsl.qrc b/plugins/kwineffects/scissor-window/glsl.qrc
index 8b2ecb6f3..2e6bc448d 100644
--- a/plugins/kwineffects/scissor-window/glsl.qrc
+++ b/plugins/kwineffects/scissor-window/glsl.qrc
@@ -1,10 +1,16 @@
<RCC>
+ <qresource prefix="/">
+ <file>cornermask_core.frag</file>
+ <file>fullmask_core.frag</file>
+ <file>cornermask.frag</file>
+ <file>fullmask.frag</file>
+ </qresource>
<qresource prefix="/effect-shaders-1.10">
- <file alias="corner-mask.frag">cornermask.frag.110</file>
- <file alias="full-mask.frag">fullmask.frag.110</file>
+ <file alias="cornermask.frag">cornermask_core.frag</file>
+ <file alias="fullmask.frag">fullmask_core.frag</file>
</qresource>
<qresource prefix="/effect-shaders-1.40">
- <file alias="corner-mask.frag">cornermask.frag.140</file>
- <file alias="full-mask.frag">fullmask.frag.140</file>
+ <file alias="cornermask.frag">cornermask.frag</file>
+ <file alias="fullmask.frag">fullmask.frag</file>
</qresource>
</RCC>
diff --git a/plugins/kwineffects/scissor-window/main.cpp b/plugins/kwineffects/scissor-window/main.cpp
index 73544556c..8d9659e19 100644
--- a/plugins/kwineffects/scissor-window/main.cpp
+++ b/plugins/kwineffects/scissor-window/main.cpp
@@ -23,19 +23,27 @@
class ScissorWindowPluginFactory : public KWin::EffectPluginFactory
{
Q_OBJECT
- Q_INTERFACES(KPluginFactory)
+#if KWIN_VERSION_MAJ <= 5 && KWIN_VERSION_MIN < 23
Q_PLUGIN_METADATA(IID KPluginFactory_iid FILE "scissor-window.json")
-
+#else
+ Q_PLUGIN_METADATA(IID EffectPluginFactory_iid FILE "scissor-window.json")
+#endif
+ Q_INTERFACES(KPluginFactory)
public:
- explicit ScissorWindowPluginFactory();
- ~ScissorWindowPluginFactory();
+ explicit ScissorWindowPluginFactory() {}
+ ~ScissorWindowPluginFactory() {}
- KWin::Effect *createEffect() const {
- return ScissorWindow::supported() ? new ScissorWindow() : nullptr;
+ bool isSupported() const override {
+ return ScissorWindow::supported();
}
-};
-K_PLUGIN_FACTORY_DEFINITION(ScissorWindowPluginFactory, registerPlugin<ScissorWindow>();)
-K_EXPORT_PLUGIN_VERSION(KWIN_EFFECT_API_VERSION)
+ bool enabledByDefault() const override {
+ return true;
+ }
+
+ KWin::Effect *createEffect() const override {
+ return new ScissorWindow;
+ }
+};
#include "main.moc"
diff --git a/plugins/kwineffects/scissor-window/scissor-window.json b/plugins/kwineffects/scissor-window/scissor-window.json
index e2ebdc65d..56522ecd1 100644
--- a/plugins/kwineffects/scissor-window/scissor-window.json
+++ b/plugins/kwineffects/scissor-window/scissor-window.json
@@ -4,6 +4,10 @@
{
"Email": "zccrs@live.com",
"Name": "zccrs"
+ },
+ {
+ "Email": "lxz@mkacg.com",
+ "Name": "justforlxz"
}
],
"Description": "Allow clip of window content",
@@ -15,8 +19,15 @@
"ServiceTypes": [
"KWin/Effect"
],
- "org.kde.kwin.effect": {
- "exclusiveGroup": "appearance"
- }
- }
+ "Category": "Appearance",
+ "License": "GPL",
+ "Version": "1.0"
+ },
+ "org.kde.kwin.effect": {
+ "exclusiveGroup": "appearance",
+ "enabledByDefaultMethod": true
+ },
+ "X-KDE-Ordering": "5",
+ "X-Plasma-API": "",
+ "X-Plasma-MainScript": ""
}
diff --git a/plugins/kwineffects/scissor-window/scissorwindow.cpp b/plugins/kwineffects/scissor-window/scissorwindow.cpp
index a80118421..4785c1f22 100644
--- a/plugins/kwineffects/scissor-window/scissorwindow.cpp
+++ b/plugins/kwineffects/scissor-window/scissorwindow.cpp
@@ -19,10 +19,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "scissorwindow.h"
-#ifndef DISBLE_DDE_KWIN_XCB
-#include "kwinutils.h"
-#endif
-
#include <kwinglutils.h>
#include <kwinglplatform.h>
#include <kwingltexture.h>
@@ -32,6 +28,7 @@
#include <QExplicitlySharedDataPointer>
#include <QSignalBlocker>
#include <QPainterPath>
+#include <QScopedPointer>
Q_DECLARE_METATYPE(QPainterPath)
@@ -178,16 +175,24 @@ ScissorWindow::ScissorWindow(QObject *, const QVariantList &)
: Effect()
{
// 构建用于窗口圆角特效的着色器
- m_shader = KWin::ShaderManager::instance()->generateShaderFromResources(KWin::ShaderTrait::MapTexture, QString(), "corner-mask.frag");
+#if KWIN_VERSION_MAJ <= 5 && KWIN_VERSION_MIN < 23
+ m_shader = KWin::ShaderManager::instance()->generateShaderFromResources(KWin::ShaderTrait::MapTexture, QString(), ":/cornermask.frag");
+#else
+ m_shader = KWin::ShaderManager::instance()->generateShaderFromFile(KWin::ShaderTrait::MapTexture, QString(), ":/cornermask.frag");
+#endif
// 构建用于自定义窗口形状的着色器
- m_fullMaskShader = KWin::ShaderManager::instance()->generateShaderFromResources(KWin::ShaderTrait::MapTexture, QString(), "full-mask.frag");
+#if KWIN_VERSION_MAJ <= 5 && KWIN_VERSION_MIN < 23
+ m_fullMaskShader = KWin::ShaderManager::instance()->generateShaderFromResources(KWin::ShaderTrait::MapTexture, QString(), ":/fullmask.frag");
+#else
+ m_fullMaskShader = KWin::ShaderManager::instance()->generateShaderFromFile(KWin::ShaderTrait::MapTexture, QString(), ":/fullmask.frag");
+#endif
if (!m_shader->isValid()) {
- // qWarning() << Q_FUNC_INFO << "Invalid fragment shader of corner mask";
+ qWarning() << Q_FUNC_INFO << "Invalid fragment shader of corner mask";
}
if (!m_fullMaskShader->isValid()) {
- // qWarning() << Q_FUNC_INFO << "Invalid fragment shader of full mask";
+ qWarning() << Q_FUNC_INFO << "Invalid fragment shader of full mask";
}
}
@@ -205,6 +210,10 @@ void ScissorWindow::drawWindow(KWin::EffectWindow *w, int mask, QRegion region,
return Effect::drawWindow(w, mask, region, data);
}
+ if (KWin::effects->hasActiveFullScreenEffect() || w->isFullScreen()) {
+ return Effect::drawWindow(w, mask, region, data);
+ }
+
MaskCache::TextureData mask_texture = MaskCache::instance()->getTextureByWindow(w);
if (!mask_texture) {
@@ -214,7 +223,11 @@ void ScissorWindow::drawWindow(KWin::EffectWindow *w, int mask, QRegion region,
QRegion corner_region;
if (!mask_texture->customMask) {
+#if KWIN_VERSION_MAJ <= 5 && KWIN_VERSION_MIN < 23
const QRect window_rect = w->geometry();
+#else
+ const QRect window_rect = w->frameGeometry();
+#endif
QRect corner_rect(window_rect.topLeft(), mask_texture->size);
// top left
@@ -241,6 +254,7 @@ void ScissorWindow::drawWindow(KWin::EffectWindow *w, int mask, QRegion region,
}
}
+#if !defined(KWIN_VERSION) || KWIN_VERSION < KWIN_VERSION_CHECK(5, 23, 4, 0)
KWin::WindowQuadList decoration_quad_list;
KWin::WindowQuadList content_quad_list;
@@ -257,20 +271,65 @@ void ScissorWindow::drawWindow(KWin::EffectWindow *w, int mask, QRegion region,
break;
}
}
+#endif
+#ifndef DISBLE_DDE_KWIN_XCB
+ class SetWindowDepth {
+ public:
+ SetWindowDepth(KWin::EffectWindow *w, int depth)
+ : m_window(w)
+ {
+ // 此时正在进行窗口绘制会有大量的调用应当避免窗口发射hasAlphaChanged信号
+ QSignalBlocker(w->parent());
+ KWinUtils::setClientDepth(w->parent(), depth);
+ }
+
+ ~SetWindowDepth() {
+ bool ok = false;
+ int depth = m_window->data(WindowDepthRole).toInt(&ok);
+ QObject *client = m_window->parent();
+
+ if (!ok) {
+ depth = KWinUtils::getWindowDepth(client);
+ // 保存以便下次使用
+ m_window->setData(WindowDepthRole, depth);
+ }
+
+ // 此时正在进行窗口绘制会有大量的调用应当避免窗口发射hasAlphaChanged信号
+ QSignalBlocker blocker(client);
+ Q_UNUSED(blocker)
+ KWinUtils::setClientDepth(client, depth);
+ }
+
+ private:
+ KWin::EffectWindow *m_window;
+ };
+
+ // 要想窗口裁剪生效必须要保证窗口材质绘制时开启了alpha通道混合
+ QScopedPointer<SetWindowDepth> setDepth;
+ if (!w->hasAlpha()) {
+ QScopedPointer<SetWindowDepth> alpha(new SetWindowDepth(w, 32));
+ setDepth.swap(alpha);
+ }
+ #endif
+
+#if !defined(KWIN_VERSION) || KWIN_VERSION < KWIN_VERSION_CHECK(5, 23, 4, 0)
if (!mask_texture->customMask) {
// 此时只允许绘制窗口边框和阴影
// 针对设置了自定义裁剪的窗口,则不绘制标题栏和阴影
data.quads = decoration_quad_list;
Effect::drawWindow(w, mask, region, data);
}
+#endif
if (!corner_region.isEmpty()) {
QRegion new_region = region - corner_region;
// 先绘制未处于mask区域的窗口材质
if (!new_region.isEmpty()) {
+#if !defined(KWIN_VERSION) || KWIN_VERSION < KWIN_VERSION_CHECK(5, 23, 4, 0)
data.quads = content_quad_list;
+#endif
Effect::drawWindow(w, mask, new_region, data);
}
@@ -278,6 +337,9 @@ void ScissorWindow::drawWindow(KWin::EffectWindow *w, int mask, QRegion region,
region = region - new_region;
}
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
// 将mask材质绑定到第二个材质
glActiveTexture(GL_TEXTURE1);
mask_texture->bind();
@@ -303,52 +365,13 @@ void ScissorWindow::drawWindow(KWin::EffectWindow *w, int mask, QRegion region,
// 此时只允许绘制窗口内容
auto old_shader = data.shader;
+#if !defined(KWIN_VERSION) || KWIN_VERSION < KWIN_VERSION_CHECK(5, 23, 4, 0)
data.quads = content_quad_list;
+ data.quads = content_quad_list;
+#endif
data.shader = shader;
-#ifndef DISBLE_DDE_KWIN_XCB
- class SetWindowDepth {
- public:
- SetWindowDepth(KWin::EffectWindow *w, int depth)
- : m_window(w)
- {
- // 此时正在进行窗口绘制会有大量的调用应当避免窗口发射hasAlphaChanged信号
- QSignalBlocker blocker(w->parent());
- Q_UNUSED(blocker)
- KWinUtils::setClientDepth(w->parent(), depth);
- }
-
- ~SetWindowDepth() {
- bool ok = false;
- int depth = m_window->data(WindowDepthRole).toInt(&ok);
- QObject *client = m_window->parent();
-
- if (!ok) {
- depth = KWinUtils::getWindowDepth(client);
- // 保存以便下次使用
- m_window->setData(WindowDepthRole, depth);
- }
-
- // 此时正在进行窗口绘制会有大量的调用应当避免窗口发射hasAlphaChanged信号
- QSignalBlocker blocker(client);
- Q_UNUSED(blocker)
- KWinUtils::setClientDepth(client, depth);
- }
-
- private:
- KWin::EffectWindow *m_window;
- };
-
- // 要想窗口裁剪生效必须要保证窗口材质绘制时开启了alpha通道混合
- if (!w->hasAlpha()) {
- SetWindowDepth set_depth(w, 32);
- Q_UNUSED(set_depth)
- Effect::drawWindow(w, mask, region, data);
- } else
-#endif
- {
- Effect::drawWindow(w, mask, region, data);
- }
+ Effect::drawWindow(w, mask, region, data);
data.shader = old_shader;
@@ -357,4 +380,6 @@ void ScissorWindow::drawWindow(KWin::EffectWindow *w, int mask, QRegion region,
glActiveTexture(GL_TEXTURE1);
mask_texture->unbind();
glActiveTexture(GL_TEXTURE0);
+
+ glDisable(GL_BLEND);
}
diff --git a/plugins/kwineffects/scissor-window/scissorwindow.h b/plugins/kwineffects/scissor-window/scissorwindow.h
index 6e12a1adc..a778a1d97 100644
--- a/plugins/kwineffects/scissor-window/scissorwindow.h
+++ b/plugins/kwineffects/scissor-window/scissorwindow.h
@@ -23,6 +23,10 @@
#include <kwineffects.h>
+#ifndef DISBLE_DDE_KWIN_XCB
+#include "kwinutils.h"
+#endif
+
class ScissorWindow : public KWin::Effect
{
Q_OBJECT
diff --git a/plugins/platforms/lib/CMakeLists.txt b/plugins/platforms/lib/CMakeLists.txt
index 9dbf2474f..06379d0ab 100644
--- a/plugins/platforms/lib/CMakeLists.txt
+++ b/plugins/platforms/lib/CMakeLists.txt
@@ -3,6 +3,7 @@ set(TARGET_NAME "kwin-xcb")
find_package(Qt5Core REQUIRED)
find_package(Qt5X11Extras REQUIRED)
find_package(Qt5Qml REQUIRED)
+find_package(X11 REQUIRED)
find_package(KF5Config REQUIRED)
find_package(KF5WindowSystem REQUIRED)
find_package(KF5CoreAddons REQUIRED)
diff --git a/plugins/platforms/lib/kwinutils.cpp b/plugins/platforms/lib/kwinutils.cpp
index df1b8ce6b..ee283a60e 100644
--- a/plugins/platforms/lib/kwinutils.cpp
+++ b/plugins/platforms/lib/kwinutils.cpp
@@ -87,7 +87,11 @@ public:
public Q_SLOTS:
void slotWindowMove();
void slotWindowMaximize();
- bool compositing() const;
+#if !defined(KWIN_VERSION) || KWIN_VERSION < KWIN_VERSION_CHECK(5, 23, 4, 0)
+ // remove by c61085dc2e28cb7d737c9b049499b4433916b194
+ // change to Compositor::compositing()
+ bool compositing() const;
+ #endif
void slotTouchPadTomoveWindow(int x, int y);
void slotEndTouchPadToMoveWindow();
@@ -139,14 +143,23 @@ class Compositor : public QObject
public:
enum SuspendReason { NoReasonSuspend = 0, UserSuspend = 1<<0, BlockRuleSuspend = 1<<1, ScriptSuspend = 1<<2, AllReasonSuspend = 0xff };
static Compositor *s_compositor;
+ bool isActive();
};
// 光标管理
+#if defined(KWIN_VERSION) && KWIN_VERSION >= KWIN_VERSION_CHECK(5, 23, 4, 0)
+class Cursors : public QObject
+{
+public:
+ static Cursors *s_self;
+};
+#else
class Cursor : public QObject
{
public:
static Cursor *s_self;
};
+#endif
class AbstractClient : public QObject {};
class Options {
@@ -613,7 +626,11 @@ QObject *KWinUtils::tabBox()
QObject *KWinUtils::cursor()
{
+#if defined(KWIN_VERSION) && KWIN_VERSION >= KWIN_VERSION_CHECK(5, 23, 4, 0)
+ return KWin::Cursors::s_self;
+#else
return KWin::Cursor::s_self;
+#endif
}
QObject *KWinUtils::virtualDesktop()
@@ -643,8 +660,8 @@ QObjectList KWinUtils::clientList()
return {};
}
- QList<KWin::Client*> clients;
- bool ok = QMetaObject::invokeMethod(jsWorkspaceWrapper, "clientList", Q_RETURN_ARG(QList<KWin::Client*>, clients));
+ QList<KWin::AbstractClient*> clients;
+ bool ok = QMetaObject::invokeMethod(jsWorkspaceWrapper, "clientList", Q_RETURN_ARG(QList<KWin::AbstractClient*>, clients));
if (!ok) {
return {};
@@ -652,7 +669,7 @@ QObjectList KWinUtils::clientList()
QObjectList list;
- for (KWin::Client *c : clients) {
+ for (KWin::AbstractClient *c : clients) {
list << c;
}
@@ -1057,12 +1074,19 @@ void KWinUtils::removeWindowPropertyMonitor(quint32 property_atom)
bool KWinUtils::isCompositing()
{
+ #if defined(KWIN_VERSION) && KWIN_VERSION >= KWIN_VERSION_CHECK(5, 23, 4, 0)
+ if (KWin::Compositor::s_compositor) {
+ return KWin::Compositor::s_compositor->isActive();
+ }
+ #else
KWin::Workspace *ws = static_cast<KWin::Workspace *>(workspace());
if (ws) {
return ws->compositing();
} else {
return compositorIsActive();
}
+#endif
+ return compositorIsActive();
}
bool KWinUtils::buildNativeSettings(QObject *baseObject, quint32 windowID)
diff --git a/plugins/platforms/plugin/libkwinpreload.cpp b/plugins/platforms/plugin/libkwinpreload.cpp
index 55b509e4b..c8814bd8d 100644
--- a/plugins/platforms/plugin/libkwinpreload.cpp
+++ b/plugins/platforms/plugin/libkwinpreload.cpp
@@ -279,9 +279,11 @@ void RuleBook::save()
namespace BuiltInEffects {
bool supported(BuiltInEffect effect) {
+#ifdef ENABLE_BUILTIN_BLUR
if (effect == BuiltInEffect::Blur) {
return false;
}
+#endif
typedef bool (*ClientBuiltInEffect)(KWin::BuiltInEffect);
ClientBuiltInEffect clientBuildInEffect = (ClientBuiltInEffect)QLibrary::resolve("kwin", qApp->applicationVersion(), "_ZN4KWin14BuiltInEffects9supportedENS_13BuiltInEffectE");