commit df1937194c07b850425bd047ed4fc8a8986b0609 Author: justforlxz 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(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 #include #include +#include + +#ifdef USE_DEEPIN_WAYLAND #include +#endif class Settings; class ChameleonWindowTheme; @@ -124,7 +128,10 @@ private: QPointer 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(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(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 @@ + + cornermask_core.frag + fullmask_core.frag + cornermask.frag + fullmask.frag + - cornermask.frag.110 - fullmask.frag.110 + cornermask_core.frag + fullmask_core.frag - cornermask.frag.140 - fullmask.frag.140 + cornermask.frag + fullmask.frag 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();) -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 . */ #include "scissorwindow.h" -#ifndef DISBLE_DDE_KWIN_XCB -#include "kwinutils.h" -#endif - #include #include #include @@ -32,6 +28,7 @@ #include #include #include +#include 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 setDepth; + if (!w->hasAlpha()) { + QScopedPointer 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 +#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 clients; - bool ok = QMetaObject::invokeMethod(jsWorkspaceWrapper, "clientList", Q_RETURN_ARG(QList, clients)); + QList clients; + bool ok = QMetaObject::invokeMethod(jsWorkspaceWrapper, "clientList", Q_RETURN_ARG(QList, 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(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");