前言
就随便往屏幕上画点东西,真的。
准备文件
kwin 是一个非常插件化和模块化的项目,这非常方便我们执行扩展,而且大家在用 kde 的时候,应该也都玩过百宝箱,里面有非常多社区开发的特效。
首先新建一个目录 watermark
用于插件的开发,我们一共需要下列文件:
- main.cpp
- metatada.json
- watermark.h
- watermark.cpp
main.cpp
kwin 提供了一个宏用来生成代码,当然我们也可以手动创建,宏只是辅助我们的。
#include "watermark.h"
namespace KWin {
KWIN_EFFECT_FACTORY(WaterMarkEffect, "metadata.json" )
}
#include "main.moc"
|
插件需要一个描述文件,用于识别。
{ "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
|
运行
将编译出来的动态库 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
来实时查看。
https://blog.mkacg.com/2023/06/25/How-to-develop-a-kwin-special-effects-plugin/