前言

就随便往屏幕上画点东西,真的。

准备文件

kwin 是一个非常插件化和模块化的项目,这非常方便我们执行扩展,而且大家在用 kde 的时候,应该也都玩过百宝箱,里面有非常多社区开发的特效。

首先新建一个目录 watermark 用于插件的开发,我们一共需要下列文件:

  1. main.cpp
  2. metatada.json
  3. watermark.h
  4. watermark.cpp

main.cpp

kwin 提供了一个宏用来生成代码,当然我们也可以手动创建,宏只是辅助我们的。

#include "watermark.h"

namespace KWin
{

KWIN_EFFECT_FACTORY(WaterMarkEffect,
"metadata.json"
)

} // namespace KWin

#include "main.moc"

metadata.json

插件需要一个描述文件,用于识别。

{
"KPlugin": {
"Category": "Window Management",
"Description": "show screen watermark",
"Description[zh_CN]": "显示屏幕水印",
"EnabledByDefault": true,
"Id": "watermark",
"License": "GPL",
"Name": "screen watermark",
"Name[zh_CN]": "屏幕水印"
},
"org.kde.kwin.effect": {
"internal": true
}
}

watermark.h

#pragma once

#include "kwineffectsex.h"
#include "kwinglutils.h"

namespace KWin
{
class WaterMarkEffect : public Effect
{
Q_OBJECT
public:
WaterMarkEffect(QObject *parent = nullptr);
~WaterMarkEffect() override = default;
};
}

watermark.cpp

#include "watermark.h"

#include <QLoggingCategory>

using namespace KWin;

Q_LOGGING_CATEGORY(watermark, "kwin.effects.watermark")

WaterMarkEffect::WaterMarkEffect(QObject *parent)
: Effect(parent)
{
qCDebug(watermark) << "init watermark effect.";
}

将模块添加到构建系统中

CMakeLists.txt

新建一个 CMakeLists.txt 文件

cmake_minimum_required(VERSION 3.22)
project(watermark)

set(CMAKE_AUTOMOC ON)

find_package(ECM REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH})

find_package(KWinEffects REQUIRED)
find_package(XCB REQUIRED)
find_package(epoxy REQUIRED)

add_library(watermark SHARED
main.cpp
watermark.h
watermark.cpp
)

target_link_libraries(watermark PRIVATE
KWinEffects::kwineffects
)

构建

cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=YES
cmake --build build

运行

将编译出来的动态库 build/libwatermark.so 文件安装到系统里 /usr/share/kwin/effects/plugins/ ,然后调用 DBus 加载插件。

qdbus org.kde.KWin /Effects org.kde.kwin.Effects.loadEffect watermark

日志输出可以通过 journalctl --user -f -t kwin_x11 来实时查看。

init watermark effect.

https://blog.mkacg.com/2023/06/25/How-to-develop-a-kwin-special-effects-plugin/