From 9297a8a9b27278555d5bed6101855874392f2b45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Sun, 12 Feb 2012 15:15:54 +0100 Subject: [PATCH] Window Switcher layouts follow Plasma Package structure A new service type is introduced which is used by the KCM to find all available window switcher layouts. This makes it finally possible to have 3rd party window switchers. Also the tabbox finds the packaged QML file through the service definitions. Desktop switcher is not yet in packaged version (UI to configure is missing). REVIEW: 103951 --- CMakeLists.txt | 13 +------ kcmkwin/kwintabbox/layoutconfig.cpp | 36 +++++++++---------- tabbox/CMakeLists.txt | 4 +++ tabbox/declarative.cpp | 34 ++++++++++++++---- tabbox/kwinwindowswitcher.desktop | 11 ++++++ tabbox/qml/CMakeLists.txt | 24 +++++++++++++ .../big_icons/contents/ui/main.qml} | 0 tabbox/qml/clients/big_icons/metadata.desktop | 17 +++++++++ .../compact/contents/ui/main.qml} | 0 tabbox/qml/clients/compact/metadata.desktop | 17 +++++++++ .../informative/contents/ui/main.qml} | 0 .../qml/clients/informative/metadata.desktop | 17 +++++++++ .../small_icons/contents/ui/main.qml} | 0 .../qml/clients/small_icons/metadata.desktop | 17 +++++++++ .../text/contents/ui/main.qml} | 0 tabbox/qml/clients/text/metadata.desktop | 17 +++++++++ .../thumbnails/contents/ui/main.qml} | 0 .../qml/clients/thumbnails/metadata.desktop | 17 +++++++++ .../window_strip/contents/ui/main.qml} | 0 .../qml/clients/window_strip/metadata.desktop | 17 +++++++++ 20 files changed, 204 insertions(+), 37 deletions(-) create mode 100644 tabbox/CMakeLists.txt create mode 100644 tabbox/kwinwindowswitcher.desktop create mode 100644 tabbox/qml/CMakeLists.txt rename tabbox/qml/{big_icons.qml => clients/big_icons/contents/ui/main.qml} (100%) create mode 100644 tabbox/qml/clients/big_icons/metadata.desktop rename tabbox/qml/{compact.qml => clients/compact/contents/ui/main.qml} (100%) create mode 100644 tabbox/qml/clients/compact/metadata.desktop rename tabbox/qml/{informative.qml => clients/informative/contents/ui/main.qml} (100%) create mode 100644 tabbox/qml/clients/informative/metadata.desktop rename tabbox/qml/{small_icons.qml => clients/small_icons/contents/ui/main.qml} (100%) create mode 100644 tabbox/qml/clients/small_icons/metadata.desktop rename tabbox/qml/{text.qml => clients/text/contents/ui/main.qml} (100%) create mode 100644 tabbox/qml/clients/text/metadata.desktop rename tabbox/qml/{thumbnails.qml => clients/thumbnails/contents/ui/main.qml} (100%) create mode 100644 tabbox/qml/clients/thumbnails/metadata.desktop rename tabbox/qml/{window_strip.qml => clients/window_strip/contents/ui/main.qml} (100%) create mode 100644 tabbox/qml/clients/window_strip/metadata.desktop diff --git a/CMakeLists.txt b/CMakeLists.txt index c741cb4b82..b5d44b10c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,6 +72,7 @@ endif( KWIN_BUILD_DECORATIONS ) add_subdirectory( data ) add_subdirectory( effects ) +add_subdirectory( tabbox ) ########### next target ############### @@ -231,17 +232,5 @@ install(TARGETS kwinnvidiahack ${INSTALL_TARGETS_DEFAULT_ARGS} LIBRARY NAMELINK_ install( FILES kwin.kcfg DESTINATION ${KCFG_INSTALL_DIR} ) install( FILES kwin.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kwin ) install( FILES org.kde.KWin.xml DESTINATION ${DBUS_INTERFACES_INSTALL_DIR} ) -install( FILES - tabbox/qml/informative.qml - tabbox/qml/big_icons.qml - tabbox/qml/compact.qml - tabbox/qml/desktop.qml - tabbox/qml/small_icons.qml - tabbox/qml/tabbox.qml - tabbox/qml/text.qml - tabbox/qml/thumbnails.qml - tabbox/qml/IconTabBox.qml - tabbox/qml/window_strip.qml - DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox ) kde4_install_icons( ${ICON_INSTALL_DIR} ) diff --git a/kcmkwin/kwintabbox/layoutconfig.cpp b/kcmkwin/kwintabbox/layoutconfig.cpp index 84b7d30845..d982bcf564 100644 --- a/kcmkwin/kwintabbox/layoutconfig.cpp +++ b/kcmkwin/kwintabbox/layoutconfig.cpp @@ -25,6 +25,7 @@ along with this program. If not, see . #include #include #include +#include #include #include #include @@ -32,6 +33,7 @@ along with this program. If not, see . #include #include #include +#include #include namespace KWin @@ -208,23 +210,20 @@ LayoutModel::~LayoutModel() void LayoutModel::init() { - QStringList layouts; - layouts << "thumbnails" << "informative" << "compact" << "text" << "big_icons" << "small_icons"; - QStringList descriptions; - descriptions << i18nc("Name for a window switcher layout showing live window thumbnails", "Thumbnails"); - descriptions << i18nc("Name for a window switcher layout showing icon, name and desktop", "Informative"); - descriptions << i18nc("Name for a window switcher layout showing only icon and name", "Compact"); - descriptions << i18nc("Name for a window switcher layout showing only the name", "Text"); - descriptions << i18nc("Name for a window switcher layout showing large icons", "Large Icons"); - descriptions << i18nc("Name for a window switcher layout showing small icons", "Small Icons"); - - for (int i=0; iquery("KWin/WindowSwitcher"); + foreach (KService::Ptr service, offers) { + const QString pluginName = service->property("X-KDE-PluginInfo-Name").toString(); + if (service->property("X-Plasma-API").toString() != "declarativeappletscript") { + continue; } + const QString scriptName = service->property("X-Plasma-MainScript").toString(); + const QString scriptFile = KStandardDirs::locate("data", "kwin/tabbox/" + pluginName + "/contents/" + scriptName); + if (scriptFile.isNull()) { + continue; + } + m_nameList << service->name(); + m_pathList << scriptFile; + m_layoutList << pluginName; } } @@ -254,11 +253,12 @@ int LayoutModel::rowCount (const QModelIndex& parent) const QModelIndex LayoutModel::indexForLayoutName(const QString &name) const { // fallback for default + QString normalizedName = name.toLower().replace(' ', '_'); if (name == "Default" || name.isEmpty()) { - return index(0); + normalizedName = "informative"; } for (int i=0; i. #include #include #include +#include #include #include #include @@ -284,17 +285,36 @@ void DeclarativeView::updateQmlSource(bool force) if (!force && tabBox->config().layoutName() == m_currentLayout) { return; } - m_currentLayout = tabBox->config().layoutName(); - QString file = KStandardDirs::locate("data", "kwin/tabbox/" + m_currentLayout.toLower().replace(' ', '_') + ".qml"); if (m_mode == TabBoxConfig::DesktopTabBox) { - file = KStandardDirs::locate("data", "kwin/tabbox/desktop.qml"); + m_currentLayout = tabBox->config().layoutName(); + const QString file = KStandardDirs::locate("data", "kwin/tabbox/desktop.qml"); + rootObject()->setProperty("source", QUrl(file)); + return; } - if (file.isNull()) { - // fallback to default - if (m_mode == TabBoxConfig::ClientTabBox) { - file = KStandardDirs::locate("data", "kwin/tabbox/informative.qml"); + QString constraint = QString("[X-KDE-PluginInfo-Name] == '%1'").arg(tabBox->config().layoutName()); + KService::List offers = KServiceTypeTrader::self()->query("KWin/WindowSwitcher", constraint); + if (offers.isEmpty()) { + // load default + constraint = QString("[X-KDE-PluginInfo-Name] == '%1'").arg("informative"); + offers = KServiceTypeTrader::self()->query("KWin/WindowSwitcher", constraint); + if (offers.isEmpty()) { + kDebug(1212) << "could not find default window switcher layout"; + return; } } + m_currentLayout = tabBox->config().layoutName(); + KService::Ptr service = offers.first(); + const QString pluginName = service->property("X-KDE-PluginInfo-Name").toString(); + if (service->property("X-Plasma-API").toString() != "declarativeappletscript") { + kDebug(1212) << "Window Switcher Layout is no declarativeappletscript"; + return; + } + const QString scriptName = service->property("X-Plasma-MainScript").toString(); + const QString file = KStandardDirs::locate("data", "kwin/tabbox/" + pluginName + "/contents/" + scriptName); + if (file.isNull()) { + kDebug(1212) << "Could not find QML file for window switcher"; + return; + } rootObject()->setProperty("source", QUrl(file)); } diff --git a/tabbox/kwinwindowswitcher.desktop b/tabbox/kwinwindowswitcher.desktop new file mode 100644 index 0000000000..4a575280f6 --- /dev/null +++ b/tabbox/kwinwindowswitcher.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=ServiceType +X-KDE-ServiceType=KWin/WindowSwitcher + +Comment=KWin Window Switcher Layout + +[PropertyDef::X-Plasma-API] +Type=QString + +[PropertyDef::X-Plasma-MainScript] +Type=QString diff --git a/tabbox/qml/CMakeLists.txt b/tabbox/qml/CMakeLists.txt new file mode 100644 index 0000000000..d6771e068b --- /dev/null +++ b/tabbox/qml/CMakeLists.txt @@ -0,0 +1,24 @@ +install( FILES tabbox.qml DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox ) +install( FILES desktop.qml DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox ) + +# packages +install( DIRECTORY clients/big_icons DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox ) +install( DIRECTORY clients/compact DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox ) +install( DIRECTORY clients/informative DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox ) +install( DIRECTORY clients/small_icons DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox ) +install( DIRECTORY clients/text DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox ) +install( DIRECTORY clients/thumbnails DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox ) +install( DIRECTORY clients/window_strip DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox ) + +# service files +install( FILES clients/big_icons/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/kwin RENAME kwin4_window_switcher_big_icons.desktop ) +install( FILES clients/compact/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/kwin RENAME kwin4_window_switcher_compact.desktop ) +install( FILES clients/informative/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/kwin RENAME kwin4_window_switcher_informative.desktop ) +install( FILES clients/small_icons/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/kwin RENAME kwin4_window_switcher_small_icons.desktop ) +install( FILES clients/text/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/kwin RENAME kwin4_window_switcher_text.desktop ) +install( FILES clients/thumbnails/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/kwin RENAME kwin4_window_switcher_thumbnails.desktop ) +install( FILES clients/window_strip/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/kwin RENAME kwin4_window_switcher_window_strip.desktop ) + +# install additional icon tabbox into those that need it +install (FILES IconTabBox.qml DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox/big_icons/contents/ui) +install (FILES IconTabBox.qml DESTINATION ${DATA_INSTALL_DIR}/kwin/tabbox/small_icons/contents/ui) diff --git a/tabbox/qml/big_icons.qml b/tabbox/qml/clients/big_icons/contents/ui/main.qml similarity index 100% rename from tabbox/qml/big_icons.qml rename to tabbox/qml/clients/big_icons/contents/ui/main.qml diff --git a/tabbox/qml/clients/big_icons/metadata.desktop b/tabbox/qml/clients/big_icons/metadata.desktop new file mode 100644 index 0000000000..25579dc506 --- /dev/null +++ b/tabbox/qml/clients/big_icons/metadata.desktop @@ -0,0 +1,17 @@ +[Desktop Entry] +Name=Large Icons +Comment=A window switcher layout using large icons to represent the window +Icon=preferences-system-windows-switcher-big-icons + +X-Plasma-API=declarativeappletscript +X-Plasma-MainScript=ui/main.qml + +X-KDE-PluginInfo-Author=Martin Gräßlin +X-KDE-PluginInfo-Email=mgraesslin@kde.org +X-KDE-PluginInfo-Name=big_icons +X-KDE-PluginInfo-Version=1.0 + +X-KDE-PluginInfo-Depends= +X-KDE-PluginInfo-License=GPL +X-KDE-ServiceTypes=KWin/WindowSwitcher +Type=Service diff --git a/tabbox/qml/compact.qml b/tabbox/qml/clients/compact/contents/ui/main.qml similarity index 100% rename from tabbox/qml/compact.qml rename to tabbox/qml/clients/compact/contents/ui/main.qml diff --git a/tabbox/qml/clients/compact/metadata.desktop b/tabbox/qml/clients/compact/metadata.desktop new file mode 100644 index 0000000000..9617347434 --- /dev/null +++ b/tabbox/qml/clients/compact/metadata.desktop @@ -0,0 +1,17 @@ +[Desktop Entry] +Name=Compact +Comment=A compact window switcher layout +Icon=preferences-system-windows-switcher-compact + +X-Plasma-API=declarativeappletscript +X-Plasma-MainScript=ui/main.qml + +X-KDE-PluginInfo-Author=Martin Gräßlin +X-KDE-PluginInfo-Email=mgraesslin@kde.org +X-KDE-PluginInfo-Name=compact +X-KDE-PluginInfo-Version=1.0 + +X-KDE-PluginInfo-Depends= +X-KDE-PluginInfo-License=GPL +X-KDE-ServiceTypes=KWin/WindowSwitcher +Type=Service diff --git a/tabbox/qml/informative.qml b/tabbox/qml/clients/informative/contents/ui/main.qml similarity index 100% rename from tabbox/qml/informative.qml rename to tabbox/qml/clients/informative/contents/ui/main.qml diff --git a/tabbox/qml/clients/informative/metadata.desktop b/tabbox/qml/clients/informative/metadata.desktop new file mode 100644 index 0000000000..835e211092 --- /dev/null +++ b/tabbox/qml/clients/informative/metadata.desktop @@ -0,0 +1,17 @@ +[Desktop Entry] +Name=Informative +Comment=An informative window switcher layout including desktop name +Icon=preferences-system-windows-switcher-informative + +X-Plasma-API=declarativeappletscript +X-Plasma-MainScript=ui/main.qml + +X-KDE-PluginInfo-Author=Martin Gräßlin +X-KDE-PluginInfo-Email=mgraesslin@kde.org +X-KDE-PluginInfo-Name=informative +X-KDE-PluginInfo-Version=1.0 + +X-KDE-PluginInfo-Depends= +X-KDE-PluginInfo-License=GPL +X-KDE-ServiceTypes=KWin/WindowSwitcher +Type=Service diff --git a/tabbox/qml/small_icons.qml b/tabbox/qml/clients/small_icons/contents/ui/main.qml similarity index 100% rename from tabbox/qml/small_icons.qml rename to tabbox/qml/clients/small_icons/contents/ui/main.qml diff --git a/tabbox/qml/clients/small_icons/metadata.desktop b/tabbox/qml/clients/small_icons/metadata.desktop new file mode 100644 index 0000000000..c9d5cfeee2 --- /dev/null +++ b/tabbox/qml/clients/small_icons/metadata.desktop @@ -0,0 +1,17 @@ +[Desktop Entry] +Name=Small Icons +Comment=A window switcher layout using small icons to represent the window +Icon=preferences-system-windows-switcher-small-icons + +X-Plasma-API=declarativeappletscript +X-Plasma-MainScript=ui/main.qml + +X-KDE-PluginInfo-Author=Martin Gräßlin +X-KDE-PluginInfo-Email=mgraesslin@kde.org +X-KDE-PluginInfo-Name=small_icons +X-KDE-PluginInfo-Version=1.0 + +X-KDE-PluginInfo-Depends= +X-KDE-PluginInfo-License=GPL +X-KDE-ServiceTypes=KWin/WindowSwitcher +Type=Service diff --git a/tabbox/qml/text.qml b/tabbox/qml/clients/text/contents/ui/main.qml similarity index 100% rename from tabbox/qml/text.qml rename to tabbox/qml/clients/text/contents/ui/main.qml diff --git a/tabbox/qml/clients/text/metadata.desktop b/tabbox/qml/clients/text/metadata.desktop new file mode 100644 index 0000000000..c4cb2ccffe --- /dev/null +++ b/tabbox/qml/clients/text/metadata.desktop @@ -0,0 +1,17 @@ +[Desktop Entry] +Name=Text Icons +Comment=A window switcher layout only showing window captions +Icon=preferences-system-windows-switcher-text + +X-Plasma-API=declarativeappletscript +X-Plasma-MainScript=ui/main.qml + +X-KDE-PluginInfo-Author=Martin Gräßlin +X-KDE-PluginInfo-Email=mgraesslin@kde.org +X-KDE-PluginInfo-Name=text +X-KDE-PluginInfo-Version=1.0 + +X-KDE-PluginInfo-Depends= +X-KDE-PluginInfo-License=GPL +X-KDE-ServiceTypes=KWin/WindowSwitcher +Type=Service diff --git a/tabbox/qml/thumbnails.qml b/tabbox/qml/clients/thumbnails/contents/ui/main.qml similarity index 100% rename from tabbox/qml/thumbnails.qml rename to tabbox/qml/clients/thumbnails/contents/ui/main.qml diff --git a/tabbox/qml/clients/thumbnails/metadata.desktop b/tabbox/qml/clients/thumbnails/metadata.desktop new file mode 100644 index 0000000000..424abcfd13 --- /dev/null +++ b/tabbox/qml/clients/thumbnails/metadata.desktop @@ -0,0 +1,17 @@ +[Desktop Entry] +Name=Thumbnails +Comment=A window switcher layout using live thumbnails +Icon=preferences-system-windows-switcher-thumbnails + +X-Plasma-API=declarativeappletscript +X-Plasma-MainScript=ui/main.qml + +X-KDE-PluginInfo-Author=Martin Gräßlin +X-KDE-PluginInfo-Email=mgraesslin@kde.org +X-KDE-PluginInfo-Name=thumbnails +X-KDE-PluginInfo-Version=1.0 + +X-KDE-PluginInfo-Depends= +X-KDE-PluginInfo-License=GPL +X-KDE-ServiceTypes=KWin/WindowSwitcher +Type=Service diff --git a/tabbox/qml/window_strip.qml b/tabbox/qml/clients/window_strip/contents/ui/main.qml similarity index 100% rename from tabbox/qml/window_strip.qml rename to tabbox/qml/clients/window_strip/contents/ui/main.qml diff --git a/tabbox/qml/clients/window_strip/metadata.desktop b/tabbox/qml/clients/window_strip/metadata.desktop new file mode 100644 index 0000000000..d25cc54b92 --- /dev/null +++ b/tabbox/qml/clients/window_strip/metadata.desktop @@ -0,0 +1,17 @@ +[Desktop Entry] +Name=Window Strip +Comment=Window switcher layout for Plasma Active +Icon=preferences-system-windows-switcher-window-strip + +X-Plasma-API=declarativeappletscript +X-Plasma-MainScript=ui/main.qml + +X-KDE-PluginInfo-Author=Martin Gräßlin +X-KDE-PluginInfo-Email=mgraesslin@kde.org +X-KDE-PluginInfo-Name=window_strip +X-KDE-PluginInfo-Version=1.0 + +X-KDE-PluginInfo-Depends= +X-KDE-PluginInfo-License=GPL +X-KDE-ServiceTypes=KWin/WindowSwitcher +Type=Service