Plasma Package support for desktop switcher layouts

The existing desktop switcher becomes the first available layout called
"informative". For both variants of desktop switchers a new config key is
introduced to define the desktop switcher layout.

Desktop layouts are installed into a different directory than window
switcher layout and use a different service type.

For the moment it's basically a hidden config option as there are no
further layouts yet.

BUG: 296068
FIXED-IN: 4.11
REVIEW: 110021
This commit is contained in:
Martin Gräßlin 2013-04-15 13:03:13 +02:00
parent badc7a2bc4
commit 7c489e43d9
8 changed files with 94 additions and 18 deletions

View file

@ -3,3 +3,4 @@ add_subdirectory( tests )
# Install the KWin/WindowSwitcher service type
install( FILES kwinwindowswitcher.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} )
install( FILES kwindesktopswitcher.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} )

View file

@ -351,12 +351,26 @@ void DeclarativeView::updateQmlSource(bool force)
if (!force && tabBox->config().layoutName() == m_currentLayout) {
return;
}
if (m_mode == TabBoxConfig::DesktopTabBox) {
m_currentLayout = tabBox->config().layoutName();
const QString file = KStandardDirs::locate("data", QLatin1String(KWIN_NAME) + QLatin1String("/tabbox/desktop.qml"));
rootObject()->setProperty("source", QUrl(file));
const bool desktopMode = (m_mode == TabBoxConfig::DesktopTabBox);
m_currentLayout = tabBox->config().layoutName();
KService::Ptr service = desktopMode ? findDesktopSwitcher() : findWindowSwitcher();
if (service.isNull()) {
return;
}
if (service->property("X-Plasma-API").toString() != "declarativeappletscript") {
kDebug(1212) << "Window Switcher Layout is no declarativeappletscript";
return;
}
const QString file = desktopMode ? findDesktopSwitcherScriptFile(service) : findWindowSwitcherScriptFile(service);
if (file.isNull()) {
kDebug(1212) << "Could not find QML file for window switcher";
return;
}
rootObject()->setProperty("source", QUrl(file));
}
KService::Ptr DeclarativeView::findWindowSwitcher()
{
QString constraint = QString("[X-KDE-PluginInfo-Name] == '%1'").arg(tabBox->config().layoutName());
KService::List offers = KServiceTypeTrader::self()->query("KWin/WindowSwitcher", constraint);
if (offers.isEmpty()) {
@ -365,23 +379,40 @@ void DeclarativeView::updateQmlSource(bool force)
offers = KServiceTypeTrader::self()->query("KWin/WindowSwitcher", constraint);
if (offers.isEmpty()) {
kDebug(1212) << "could not find default window switcher layout";
return;
return KService::Ptr();
}
}
m_currentLayout = tabBox->config().layoutName();
KService::Ptr service = offers.first();
return offers.first();
}
KService::Ptr DeclarativeView::findDesktopSwitcher()
{
QString constraint = QString("[X-KDE-PluginInfo-Name] == '%1'").arg(tabBox->config().layoutName());
KService::List offers = KServiceTypeTrader::self()->query("KWin/DesktopSwitcher", constraint);
if (offers.isEmpty()) {
// load default
constraint = QString("[X-KDE-PluginInfo-Name] == '%1'").arg("informative");
offers = KServiceTypeTrader::self()->query("KWin/DesktopSwitcher", constraint);
if (offers.isEmpty()) {
kDebug(1212) << "could not find default desktop switcher layout";
return KService::Ptr();
}
}
return offers.first();
}
QString DeclarativeView::findWindowSwitcherScriptFile(KService::Ptr service)
{
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", QLatin1String(KWIN_NAME) + "/tabbox/" + pluginName + "/contents/" + scriptName);
if (file.isNull()) {
kDebug(1212) << "Could not find QML file for window switcher";
return;
}
rootObject()->setProperty("source", QUrl(file));
return KStandardDirs::locate("data", QLatin1String(KWIN_NAME) + "/tabbox/" + pluginName + "/contents/" + scriptName);
}
QString DeclarativeView::findDesktopSwitcherScriptFile(KService::Ptr service)
{
const QString pluginName = service->property("X-KDE-PluginInfo-Name").toString();
const QString scriptName = service->property("X-Plasma-MainScript").toString();
return KStandardDirs::locate("data", QLatin1String(KWIN_NAME) + "/desktoptabbox/" + pluginName + "/contents/" + scriptName);
}
void DeclarativeView::slotEmbeddedChanged(bool enabled)

View file

@ -22,6 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// includes
#include <QtDeclarative/QDeclarativeImageProvider>
#include <QtDeclarative/QDeclarativeView>
#include <KDE/KService>
#include "tabboxconfig.h"
// forward declaration
@ -71,6 +72,10 @@ private Q_SLOTS:
void currentIndexChanged(int row);
void slotWindowChanged(WId wId, unsigned int properties);
private:
KService::Ptr findWindowSwitcher();
KService::Ptr findDesktopSwitcher();
QString findWindowSwitcherScriptFile(KService::Ptr service);
QString findDesktopSwitcherScriptFile(KService::Ptr service);
QAbstractItemModel *m_model;
TabBoxConfig::TabBoxMode m_mode;
QRect m_currentScreenGeometry;

View file

@ -0,0 +1,14 @@
[Desktop Entry]
Type=ServiceType
X-KDE-ServiceType=KWin/DesktopSwitcher
Comment=KWin Desktop Switcher Layout
[PropertyDef::X-Plasma-API]
Type=QString
[PropertyDef::X-Plasma-MainScript]
Type=QString
[PropertyDef::X-KWin-Exclude-Listing]
Type=bool

View file

@ -1,5 +1,4 @@
install( FILES tabbox.qml DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/tabbox )
install( FILES desktop.qml DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/tabbox )
# packages
install( DIRECTORY clients/big_icons DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/tabbox )
@ -11,6 +10,8 @@ install( DIRECTORY clients/text DESTINATION ${DATA_INSTALL_DIR}/${KWIN_N
install( DIRECTORY clients/thumbnails DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/tabbox )
install( DIRECTORY clients/window_strip DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/tabbox )
install( DIRECTORY desktops/informative DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/desktoptabbox )
# service files
install( FILES clients/big_icons/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/${KWIN_NAME} RENAME kwin4_window_switcher_big_icons.desktop )
install( FILES clients/compact/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/${KWIN_NAME} RENAME kwin4_window_switcher_compact.desktop )
@ -21,6 +22,8 @@ install( FILES clients/text/metadata.desktop DESTINATION ${SERVICES_INST
install( FILES clients/thumbnails/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/${KWIN_NAME} RENAME kwin4_window_switcher_thumbnails.desktop )
install( FILES clients/window_strip/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/${KWIN_NAME} RENAME kwin4_window_switcher_window_strip.desktop )
install( FILES desktops/informative/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR}/${KWIN_NAME} RENAME kwin4_desktop_switcher_informative.desktop )
install (FILES IconTabBox.qml ShadowedSvgItem.qml DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/tabbox/big_icons/contents/ui)
install (FILES IconTabBox.qml ShadowedSvgItem.qml DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/tabbox/small_icons/contents/ui)
install (FILES ShadowedSvgItem.qml DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/tabbox/)
@ -29,3 +32,5 @@ install (FILES ShadowedSvgItem.qml DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/
install (FILES ShadowedSvgItem.qml DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/tabbox/present_windows/contents/ui)
install (FILES ShadowedSvgItem.qml DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/tabbox/thumbnails/contents/ui)
install (FILES ShadowedSvgItem.qml DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/tabbox/text/contents/ui)
install (FILES ShadowedSvgItem.qml DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/desktoptabbox/informative/contents/ui)

View file

@ -0,0 +1,17 @@
[Desktop Entry]
Name=Informative
Comment=An informative desktop switcher layout
Icon=preferences-system-desktop-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/DesktopSwitcher
Type=Service

View file

@ -729,6 +729,9 @@ void TabBox::reconfigure()
m_delayShow = config.readEntry<bool>("ShowDelay", true);
m_delayShowTime = config.readEntry<int>("DelayTime", 90);
m_desktopConfig.setLayoutName(config.readEntry("DesktopLayout", "informative"));
m_desktopListConfig.setLayoutName(config.readEntry("DesktopListLayout", "informative"));
QList<ElectricBorder> *borders = &m_borderActivate;
QString borderConfig = "BorderActivate";
for (int i = 0; i < 2; ++i) {