diff --git a/effects/CMakeLists.txt b/effects/CMakeLists.txt --- a/effects/CMakeLists.txt +++ b/effects/CMakeLists.txt @@ -61,6 +61,11 @@ endmacro() +# For ICC (FIXME remove if building separately) +find_package(PkgConfig) +pkg_check_modules(LCMS2 REQUIRED lcms2) +set_package_properties(LCMS2 PROPERTIES TYPE REQUIRED PURPOSE "Required for ICC color correction.") + # Install the KWin/Effect service type install( FILES kwineffect.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} ) @@ -81,6 +86,7 @@ diminactive/diminactive.cpp flipswitch/flipswitch.cpp glide/glide.cpp + icc/icc.cpp invert/invert.cpp lookingglass/lookingglass.cpp magiclamp/magiclamp.cpp @@ -113,6 +119,7 @@ fallapart/fallapartconfig.kcfgc flipswitch/flipswitchconfig.kcfgc glide/glideconfig.kcfgc + icc/iccconfig.kcfgc lookingglass/lookingglassconfig.kcfgc magiclamp/magiclampconfig.kcfgc magnifier/magnifierconfig.kcfgc @@ -177,6 +184,7 @@ add_subdirectory( cubeslide ) add_subdirectory( flipswitch ) add_subdirectory( glide ) +add_subdirectory( icc ) add_subdirectory( invert ) add_subdirectory( lookingglass ) add_subdirectory( magnifier ) @@ -193,3 +201,8 @@ # Add the builtins plugin kwin4_add_effect( builtins ${kwin4_effect_builtins_sources} ) + +# FIXME For ICC, remove if building separately +target_link_libraries(kwin4_effect_builtins PUBLIC ${LCMS2_LIBRARIES}) +target_include_directories(kwin4_effect_builtins PUBLIC ${LCMS2_INCLUDE_DIRS}) +target_compile_options(kwin4_effect_builtins PUBLIC ${LCMS2_CFLAGS_OTHER}) diff --git a/effects/effect_builtins.h b/effects/effect_builtins.h --- a/effects/effect_builtins.h +++ b/effects/effect_builtins.h @@ -46,6 +46,7 @@ FlipSwitch, Glide, HighlightWindow, + ICC, Invert, Kscreen, LookingGlass, diff --git a/effects/effect_builtins.cpp b/effects/effect_builtins.cpp --- a/effects/effect_builtins.cpp +++ b/effects/effect_builtins.cpp @@ -49,6 +49,7 @@ #include "cubeslide/cubeslide.h" #include "flipswitch/flipswitch.h" #include "glide/glide.h" +#include "icc/icc.h" #include "invert/invert.h" #include "lookingglass/lookingglass.h" #include "magnifier/magnifier.h" @@ -276,6 +277,21 @@ nullptr, nullptr #endif +EFFECT_FALLBACK + }, { + QStringLiteral("icc"), + i18ndc("kwin_effects", "Name of a KWin Effect", "ICC Color Correction"), + i18ndc("kwin_effects", "Comment describing the KWin Effect", "Applies full ICC color correction to the whole display"), + QStringLiteral("Appearance"), + QString(), + QUrl(), + false, + false, +#ifdef EFFECT_BUILTINS + &createHelper, + &ICCEffect::supported, + nullptr +#endif EFFECT_FALLBACK }, { QStringLiteral("invert"), diff --git a/effects/icc/CMakeLists.txt b/effects/icc/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/effects/icc/CMakeLists.txt @@ -0,0 +1,27 @@ +####################################### +# Effect + +####################################### +# Config +set(kwin_icc_config_SRCS icc_config.cpp) +ki18n_wrap_ui(kwin_icc_config_SRCS icc_config.ui) +qt5_add_dbus_interface(kwin_icc_config_SRCS ${kwin_effects_dbus_xml} kwineffects_interface) +kconfig_add_kcfg_files(kwin_icc_config_SRCS iccconfig.kcfgc) + +add_library(kwin_icc_config MODULE ${kwin_icc_config_SRCS}) + +target_link_libraries(kwin_icc_config + KF5::ConfigWidgets + KF5::I18n + KF5::Service + KF5::XmlGui +) + +kcoreaddons_desktop_to_json(kwin_icc_config icc_config.desktop SERVICE_TYPES kcmodule.desktop) + +install( + TARGETS + kwin_icc_config + DESTINATION + ${PLUGIN_INSTALL_DIR}/kwin/effects/configs +) diff --git a/effects/icc/data/1.10/icc.frag b/effects/icc/data/1.10/icc.frag new file mode 100644 --- /dev/null +++ b/effects/icc/data/1.10/icc.frag @@ -0,0 +1,14 @@ +uniform sampler2D sampler; + +varying vec2 texcoord0; + +uniform sampler3D clut; + +void main() +{ + vec4 tex = texture2D(sampler, texcoord0); + + tex.rgb = texture3D(clut, tex.rgb).rgb * tex.a; + + gl_FragColor = tex; +} diff --git a/effects/icc/data/1.40/icc.frag b/effects/icc/data/1.40/icc.frag new file mode 100644 --- /dev/null +++ b/effects/icc/data/1.40/icc.frag @@ -0,0 +1,17 @@ +#version 140 +uniform sampler2D sampler; + +in vec2 texcoord0; + +uniform sampler3D clut; + +out vec4 fragColor; + +void main() +{ + vec4 tex = texture(sampler, texcoord0); + + tex.rgb = texture(clut, tex.rgb).rgb * tex.a; + + fragColor = tex; +} diff --git a/effects/icc/icc.h b/effects/icc/icc.h new file mode 100644 --- /dev/null +++ b/effects/icc/icc.h @@ -0,0 +1,78 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2019 Vitaliy Filippov + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ + +#ifndef KWIN_ICC_H +#define KWIN_ICC_H + +#include +#include "kwinglutils.h" + +namespace KWin +{ + +class GLShader; + +/** + * Applies cLUT (32x32x32 RGB LUT)-based color correction to the whole desktop + * cLUT is generated from a pair of ICC profiles using LCMS2 + */ +class ICCEffect + : public Effect +{ + Q_OBJECT +public: + ICCEffect(); + ~ICCEffect(); + + void reconfigure(ReconfigureFlags flags) override; + void drawWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data) override; + void paintEffectFrame(KWin::EffectFrame* frame, QRegion region, double opacity, double frameOpacity) override; + bool isActive() const; + + int requestedEffectChainPosition() const override; + + static bool supported(); + +public Q_SLOTS: + +protected: + bool loadData(); + +private: + bool m_inited; + bool m_valid; + QString m_sourceICC; + QString m_targetICC; + GLShader* m_shader; + GLuint m_texture; + std::vector m_clut; + + std::vector makeCLUT(const char* source_icc, const char* target_icc); + GLuint setupCCTexture(uint8_t *clut); +}; + +inline int ICCEffect::requestedEffectChainPosition() const +{ + return 98; +} + +} // namespace + +#endif diff --git a/effects/icc/icc.cpp b/effects/icc/icc.cpp new file mode 100644 --- /dev/null +++ b/effects/icc/icc.cpp @@ -0,0 +1,211 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2019 Vitaliy Filippov + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ + +#include "icc.h" +#include "iccconfig.h" +#include "kwinglplatform.h" + +#include "lcms2.h" + +#include +#include +#include +#include +#include + +static const int LUT_POINTS = 64; + +namespace KWin +{ + +ICCEffect::ICCEffect() + : m_valid(false), + m_shader(NULL), + m_texture(0) +{ + initConfig(); + reconfigure(ReconfigureAll); +} + +ICCEffect::~ICCEffect() +{ + if (m_shader) + delete m_shader; + if (m_texture != 0) + glDeleteTextures(1, &m_texture); +} + +bool ICCEffect::supported() +{ + return effects->compositingType() == OpenGL2Compositing; +} + +void ICCEffect::reconfigure(ReconfigureFlags flags) +{ + Q_UNUSED(flags) + + ICCConfig::self()->read(); + + m_sourceICC = ICCConfig::self()->sourceICC().trimmed(); + m_targetICC = ICCConfig::self()->targetICC().trimmed(); + + loadData(); + + effects->addRepaintFull(); +} + +bool ICCEffect::loadData() +{ + m_valid = false; + + if (m_shader) { + delete m_shader; + m_shader = NULL; + } + if (m_texture != 0) { + glDeleteTextures(1, &m_texture); + m_texture = 0; + } + + m_shader = ShaderManager::instance()->generateShaderFromResources(ShaderTrait::MapTexture, QString(), QStringLiteral("icc.frag")); + if (!m_shader->isValid()) { + qCCritical(KWINEFFECTS) << "The shader failed to load!"; + return false; + } + ShaderManager::instance()->pushShader(m_shader); + m_shader->setUniform("clut", 3); // GL_TEXTURE3 + ShaderManager::instance()->popShader(); + + m_clut = makeCLUT(m_sourceICC.trimmed().isEmpty() ? NULL : m_sourceICC.toLocal8Bit().data(), m_targetICC.toLocal8Bit().data()); + + if (!m_clut.empty()) { + m_texture = setupCCTexture(m_clut.data()); + + if (m_texture) { + m_valid = true; + return true; + } + } + + return false; +} + +std::vector ICCEffect::makeCLUT(const char* source_icc, const char* target_icc) +{ + std::vector clut, clut_source(LUT_POINTS*LUT_POINTS*LUT_POINTS*3); + cmsHPROFILE source, target; + cmsHTRANSFORM transform; + source = source_icc ? cmsOpenProfileFromFile(source_icc, "r") : cmsCreate_sRGBProfile(); + if (!source) + goto free_nothing; + target = cmsOpenProfileFromFile(target_icc, "r"); + if (!target) + goto free_source; + transform = cmsCreateTransform( + source, TYPE_RGB_8, target, TYPE_RGB_8, + INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_BLACKPOINTCOMPENSATION + ); + if (!transform) + goto free_target; + for (int b = 0, addr = 0; b < LUT_POINTS; b++) { + for (int g = 0; g < LUT_POINTS; g++) { + for (int r = 0; r < LUT_POINTS; r++, addr += 3) { + clut_source[addr] = 255*r/(LUT_POINTS-1); + clut_source[addr+1] = 255*g/(LUT_POINTS-1); + clut_source[addr+2] = 255*b/(LUT_POINTS-1); + } + } + } + clut.resize(LUT_POINTS*LUT_POINTS*LUT_POINTS*3); + cmsDoTransform(transform, clut_source.data(), clut.data(), LUT_POINTS*LUT_POINTS*LUT_POINTS); + cmsDeleteTransform(transform); +free_target: + cmsCloseProfile(target); +free_source: + cmsCloseProfile(source); +free_nothing: + return std::move(clut); +} + +GLuint ICCEffect::setupCCTexture(uint8_t *clut) +{ + GLenum err = glGetError(); + GLuint texture; + + glGenTextures(1, &texture); + + glBindTexture(GL_TEXTURE_3D, texture); + + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8, + LUT_POINTS, LUT_POINTS, LUT_POINTS, + 0, GL_RGB, GL_UNSIGNED_BYTE, clut); + + if ((err = glGetError()) != GL_NO_ERROR) { + glDeleteTextures(1, &texture); + return 0; + } + + return texture; +} + +void ICCEffect::drawWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data) +{ + if (m_valid) { + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_3D, m_texture); + glActiveTexture(GL_TEXTURE0); + ShaderManager *shaderManager = ShaderManager::instance(); + shaderManager->pushShader(m_shader); + data.shader = m_shader; + } + + effects->drawWindow(w, mask, region, data); + + if (m_valid) { + ShaderManager::instance()->popShader(); + } +} + +void ICCEffect::paintEffectFrame(KWin::EffectFrame* frame, QRegion region, double opacity, double frameOpacity) +{ + if (m_valid) { + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_3D, m_texture); + glActiveTexture(GL_TEXTURE0); + frame->setShader(m_shader); + ShaderBinder binder(m_shader); + effects->paintEffectFrame(frame, region, opacity, frameOpacity); + } else { + effects->paintEffectFrame(frame, region, opacity, frameOpacity); + } +} + +bool ICCEffect::isActive() const +{ + return m_valid; +} + +} // namespace diff --git a/effects/icc/icc.kcfg b/effects/icc/icc.kcfg new file mode 100644 --- /dev/null +++ b/effects/icc/icc.kcfg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/effects/icc/icc_config.h b/effects/icc/icc_config.h new file mode 100644 --- /dev/null +++ b/effects/icc/icc_config.h @@ -0,0 +1,48 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2019 Vitaliy Filippov + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ + +#ifndef KWIN_ICC_CONFIG_H +#define KWIN_ICC_CONFIG_H + +#include +#include "ui_icc_config.h" + +namespace KWin +{ + +class ICCEffectConfig : public KCModule +{ + Q_OBJECT +public: + explicit ICCEffectConfig(QWidget* parent = 0, const QVariantList& args = QVariantList()); + ~ICCEffectConfig(); + +public Q_SLOTS: + void save() override; + void load() override; + void defaults() override; + +private: + ::Ui::ICCEffectConfig ui; +}; + +} // namespace + +#endif diff --git a/effects/icc/icc_config.cpp b/effects/icc/icc_config.cpp new file mode 100644 --- /dev/null +++ b/effects/icc/icc_config.cpp @@ -0,0 +1,82 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2019 Vitaliy Filippov + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ + +#include "icc_config.h" +#include +#include "iccconfig.h" +#include + +#include + +#include +#include +#include +#include + +#include + +K_PLUGIN_FACTORY_WITH_JSON(ICCEffectConfigFactory, + "icc_config.json", + registerPlugin();) + +namespace KWin +{ + +ICCEffectConfig::ICCEffectConfig(QWidget* parent, const QVariantList& args) : + KCModule(KAboutData::pluginData(QStringLiteral("icc")), parent, args) +{ + ui.setupUi(this); + ICCConfig::instance(KWIN_CONFIG); + addConfig(ICCConfig::self(), this); + load(); +} + +ICCEffectConfig::~ICCEffectConfig() +{ + // Undo unsaved changes +} + +void ICCEffectConfig::load() +{ + KCModule::load(); + + emit changed(false); +} + +void ICCEffectConfig::save() +{ + KCModule::save(); + + emit changed(false); + OrgKdeKwinEffectsInterface interface(QStringLiteral("org.kde.KWin"), + QStringLiteral("/Effects"), + QDBusConnection::sessionBus()); + interface.reconfigureEffect(QStringLiteral("icc")); +} + +void ICCEffectConfig::defaults() +{ + emit changed(true); +} + + +} // namespace + +#include "icc_config.moc" diff --git a/effects/icc/icc_config.desktop b/effects/icc/icc_config.desktop new file mode 100644 --- /dev/null +++ b/effects/icc/icc_config.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KCModule + +X-KDE-Library=kwin_icc_config +X-KDE-ParentComponents=icc + +Name=ICC color correction diff --git a/effects/icc/icc_config.ui b/effects/icc/icc_config.ui new file mode 100644 --- /dev/null +++ b/effects/icc/icc_config.ui @@ -0,0 +1,59 @@ + + + ICCEffectConfig + + + + 0 + 0 + 642 + 107 + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + Source ICC profile file: + + + + + + + + + + leave empty to use sRGB (default color space) + + + + + + + Target ICC profile file: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + select your display's ICC profile here + + + + + + + + + + diff --git a/effects/icc/iccconfig.kcfgc b/effects/icc/iccconfig.kcfgc new file mode 100644 --- /dev/null +++ b/effects/icc/iccconfig.kcfgc @@ -0,0 +1,5 @@ +File=icc.kcfg +ClassName=ICCConfig +NameSpace=KWin +Singleton=true +Mutators=true diff --git a/effects/shaders.qrc b/effects/shaders.qrc --- a/effects/shaders.qrc +++ b/effects/shaders.qrc @@ -6,6 +6,7 @@ cube/data/1.10/cylinder.vert cube/data/1.10/sphere.vert invert/data/1.10/invert.frag + icc/data/1.10/icc.frag lookingglass/data/1.10/lookingglass.frag startupfeedback/data/1.10/blinking-startup-fragment.glsl @@ -16,6 +17,7 @@ cube/data/1.40/cylinder.vert cube/data/1.40/sphere.vert invert/data/1.40/invert.frag + icc/data/1.40/icc.frag lookingglass/data/1.40/lookingglass.frag startupfeedback/data/1.40/blinking-startup-fragment.glsl diff --git a/kcmkwin/kwineffects/kcm_kwin_effects.desktop b/kcmkwin/kwineffects/kcm_kwin_effects.desktop --- a/kcmkwin/kwineffects/kcm_kwin_effects.desktop +++ b/kcmkwin/kwineffects/kcm_kwin_effects.desktop @@ -104,7 +104,7 @@ Comment[zh_CN]=桌面特效 Comment[zh_TW]=桌面效果 -X-KDE-Keywords=kwin,window,manager,effect,3D effects,2D effects,graphical effects,desktop effects,animations,various animations,window management effects,window switching effect,desktop switching effect,animations,desktop animations,drivers,driver settings,rendering,render,invert effect,looking glass effect,magnifier effect,snap helper effect,track mouse effect,zoom effect,blur effect,fade effect,fade desktop effect,fall apart effect,glide effect,highlight window effect,login effect,logout effect,magic lamp effect,minimize animation effect,mouse mark effect,scale effect,screenshot effect,sheet effect,slide effect,sliding popups effect,thumbnail aside effect,translucency,translucency effect,transparency,window geometry effect,wobbly windows effect,startup feedback effect,dialog parent effect,dim inactive effect,dim screen effect,slide back effect,eye candy,candy,show FPS effect,show paint effect,cover switch effect,desktop cube effect,desktop cube animation effect,desktop grid effect,flip switch effect,present windows effect,resize window effect,background contrast effect +X-KDE-Keywords=kwin,window,manager,effect,3D effects,2D effects,graphical effects,desktop effects,animations,various animations,window management effects,window switching effect,desktop switching effect,animations,desktop animations,drivers,driver settings,rendering,render,icc effect,invert effect,looking glass effect,magnifier effect,snap helper effect,track mouse effect,zoom effect,blur effect,fade effect,fade desktop effect,fall apart effect,glide effect,highlight window effect,login effect,logout effect,magic lamp effect,minimize animation effect,mouse mark effect,scale effect,screenshot effect,sheet effect,slide effect,sliding popups effect,thumbnail aside effect,translucency,translucency effect,transparency,window geometry effect,wobbly windows effect,startup feedback effect,dialog parent effect,dim inactive effect,dim screen effect,slide back effect,eye candy,candy,show FPS effect,show paint effect,cover switch effect,desktop cube effect,desktop cube animation effect,desktop grid effect,flip switch effect,present windows effect,resize window effect,background contrast effect X-KDE-Keywords[ca]=kwin,finestra,gestor,efecte,efectes 3D,efectes 2D,efectes gràfics,efectes d'escriptori,animacions,animacions diverses,efectes en la gestió de les finestres,efecte en el canvi de finestra,efecte en el canvi d'escriptori,animacions,animacions en l'escriptori,controladors,configuració dels controladors,renderització,render,efecte d'inversió,efecte d'aspecte de vidre,efecte de lupa,efecte ajudant del desplaçament,efecte de seguiment del ratolí,efecte de zoom,efecte de difuminat,efecte d'esvaïment,efecte d'esvaïment de l'escriptori,efecte de trencament,efecte de lliscament,efecte de ressaltat de la finestra,efecte en l'inici de la sessió,efecte en sortir de la sessió,efecte de làmpada màgica,efecte d'animació de la minimització,efecte de marca del ratolí,efecte d'apropament,efecte de captura de pantalla,efecte de full,efecte de diapositiva,efecte de missatges emergents lliscants,efecte de miniatures laterals,translucidesa,efecte de translucidesa,transparència,efecte de geometria de la finestra,efecte de finestres sacsejades,efecte de confirmació d'engegada,efecte de diàleg principal,efecte d'enfosquiment en estar inactiu,efecte d'enfosquiment de la pantalla,efecte de diapositiva prèvia,decoració,efecte per a mostrar els FPS,efecte de mostrar el pintat,efecte de canvi de coberta,efecte de cub de l'escriptori,efecte d'animació del cub de l'escriptori,efecte de quadrícula de l'escriptori,efecte de canvi en roda,efecte de presentació de les finestres,efecte de redimensionat de la finestra,efecte de contrast del fons X-KDE-Keywords[ca@valencia]=kwin,finestra,gestor,efecte,efectes 3D,efectes 2D,efectes gràfics,efectes d'escriptori,animacions,animacions diverses,efectes en la gestió de les finestres,efecte en el canvi de finestra,efecte en el canvi d'escriptori,animacions,animacions en l'escriptori,controladors,configuració dels controladors,renderització,render,efecte d'inversió,efecte d'aspecte de vidre,efecte de lupa,efecte ajudant del desplaçament,efecte de seguiment del ratolí,efecte de zoom,efecte de difuminat,efecte d'esvaïment,efecte d'esvaïment de l'escriptori,efecte de trencament,efecte de lliscament,efecte de ressaltat de la finestra,efecte en l'inici de la sessió,efecte en eixir de la sessió,efecte de làmpada màgica,efecte d'animació de la minimització,efecte de marca del ratolí,efecte d'apropament,efecte de captura de pantalla,efecte de full,efecte de diapositiva,efecte de missatges emergents lliscants,efecte de miniatures laterals,translucidesa,efecte de translucidesa,transparència,efecte de geometria de la finestra,efecte de finestres sacsejades,efecte de confirmació d'engegada,efecte de diàleg principal,efecte d'enfosquiment en estar inactiu,efecte d'enfosquiment de la pantalla,efecte de diapositiva prèvia,decoració,efecte per a mostrar els FPS,efecte de mostrar el pintat,efecte de canvi de coberta,efecte de cub de l'escriptori,efecte d'animació del cub de l'escriptori,efecte de quadrícula de l'escriptori,efecte de canvi en roda,efecte de presentació de les finestres,efecte de redimensionat de la finestra,efecte de contrast del fons X-KDE-Keywords[de]=KWin,Fenster,Verwaltung,Effekt,2D-Effekte,3D-Effekte,Grafische Effekte,Desktopeffekte,Arbeitsflächeneffekte,Animation,Fensterverwaltungs-Effekte,Fensterwechsel-Effekte,Desktop-Wechsel,Arbeitsflächenwechsel,Desktop-Animation,Arbeitsflächen-Animation,Treiber,Treibereinstellung,Rendering,Rendern,Invertierungseffekt,Bildschirmlupeneffekt,Vergrößerungseffekt,Einrasteffekt,Maus folgen,Zoomeffekt,Dashboard,Überblendungseffekt,Gleiteneffekt,Fensterhervorhebungs-Effekt,Anmeldungseffekt,Abmeldungseffekt,Animierter Minimierungseffekt,Mausmarkierungseffekt,Skalierungseffekt,Bildschirmeffekt,Blatteffekt,Folieneffekt,Vorschaueffekt,Durchsichtigkeit,Durchsichtigkeitseffekt,Fenstergeometrieffekt,Effekt Wabernde Fenster,Programmstartanzeigeneffekt,Inaktiveffekt,Bildschirmabdunkelungseffekt,FPS-Effekt,Zeichnungsbereicheffekt, 3D-Fenstergalerieeffekt,Desktopgittereffekt,3D-Fensterstapelumschalteffekt,Fensteranzeigeeffekt,Fenstergrößenänderungseffekt,Hintergrundkonstrasteffekt