mirror of
https://bitbucket.org/smil3y/kde-workspace.git
synced 2025-02-23 18:32:50 +00:00
335 lines
14 KiB
C++
335 lines
14 KiB
C++
/*
|
|
* Copyright (C) 2009 Marco Martin <notmart@gmail.com>
|
|
*
|
|
* 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, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
#include "workspaceoptions.h"
|
|
|
|
#include "ui_mainpage.h"
|
|
|
|
#include <QDBusInterface>
|
|
|
|
#include <KDebug>
|
|
#include <KAboutData>
|
|
#include <KMessageBox>
|
|
#include <KPluginFactory>
|
|
#include <KRun>
|
|
#include <KStandardDirs>
|
|
#include <KUrl>
|
|
#include <KConfigGroup>
|
|
|
|
using namespace KAuth;
|
|
|
|
K_PLUGIN_FACTORY(WorkspaceOptionsModuleFactory, registerPlugin<WorkspaceOptionsModule>();)
|
|
K_EXPORT_PLUGIN(WorkspaceOptionsModuleFactory("kcmworkspaceoptions"))
|
|
|
|
|
|
WorkspaceOptionsModule::WorkspaceOptionsModule(QWidget *parent, const QVariantList &)
|
|
: KCModule(WorkspaceOptionsModuleFactory::componentData(), parent),
|
|
m_kwinConfig( KSharedConfig::openConfig("kwinrc")),
|
|
m_ownConfig( KSharedConfig::openConfig("workspaceoptionsrc")),
|
|
m_plasmaDesktopAutostart("plasma-desktop"),
|
|
m_krunnerAutostart("krunner"),
|
|
m_ui(new Ui::MainPage)
|
|
{
|
|
KAboutData *about =
|
|
new KAboutData("kcmworkspaceoptions", 0, ki18n("Global options for the Plasma Workspace"),
|
|
0, KLocalizedString(), KAboutData::License_GPL,
|
|
ki18n("(c) 2009 Marco Martin"));
|
|
|
|
about->addAuthor(ki18n("Marco Martin"), ki18n("Maintainer"), "notmart@gmail.com");
|
|
|
|
setAboutData(about);
|
|
|
|
setButtons(Help|Apply);
|
|
|
|
m_ui->setupUi(this);
|
|
|
|
connect(m_ui->formFactor, SIGNAL(currentIndexChanged(int)), this, SLOT(changed()));
|
|
connect(m_ui->dashboardMode, SIGNAL(currentIndexChanged(int)), this, SLOT(changed()));
|
|
connect(m_ui->showToolTips, SIGNAL(toggled(bool)), this, SLOT(changed()));
|
|
connect(m_ui->formFactor, SIGNAL(currentIndexChanged(int)), this, SLOT(formFactorChanged(int)));
|
|
|
|
if (KStandardDirs::findExe("plasma-desktop").isNull()) {
|
|
m_ui->formFactor->setEnabled(false);
|
|
}
|
|
}
|
|
|
|
WorkspaceOptionsModule::~WorkspaceOptionsModule()
|
|
{
|
|
delete m_ui;
|
|
}
|
|
|
|
|
|
void WorkspaceOptionsModule::save()
|
|
{
|
|
{
|
|
KConfig config("plasmarc");
|
|
KConfigGroup cg(&config, "PlasmaToolTips");
|
|
cg.writeEntry("Delay", m_ui->showToolTips->isChecked() ? 0.7 : -1);
|
|
}
|
|
|
|
const bool isDesktop = m_ui->formFactor->currentIndex() == 0;
|
|
|
|
m_plasmaDesktopAutostart.setAutostarts(true);
|
|
m_plasmaDesktopAutostart.setStartPhase(KAutostart::BaseDesktop);
|
|
m_plasmaDesktopAutostart.setCommand("plasma-desktop");
|
|
m_plasmaDesktopAutostart.setAllowedEnvironments(QStringList()<<"KDE");
|
|
|
|
m_krunnerAutostart.setAutostarts(true);
|
|
m_krunnerAutostart.setStartPhase(KAutostart::BaseDesktop);
|
|
m_krunnerAutostart.setCommand("krunner");
|
|
m_krunnerAutostart.setAllowedEnvironments(QStringList()<<"KDE");
|
|
|
|
KConfigGroup winCg(m_kwinConfig, "Windows");
|
|
|
|
winCg.writeEntry("BorderlessMaximizedWindows", !isDesktop);
|
|
if (!isDesktop) {
|
|
winCg.writeEntry("Placement", "Maximizing");
|
|
} else {
|
|
winCg.writeEntry("Placement", "Smart");
|
|
}
|
|
winCg.sync();
|
|
|
|
KConfigGroup ownButtonsCg(m_ownConfig, "TitleBarButtons");
|
|
KConfigGroup ownPresentWindowsCg(m_ownConfig, "Effect-PresentWindows");
|
|
KConfigGroup ownCompositingCg(m_ownConfig, "Compositing");
|
|
KConfigGroup kwinStyleCg(m_kwinConfig, "Style");
|
|
KConfigGroup kwinPresentWindowsCg(m_kwinConfig, "Effect-PresentWindows");
|
|
KConfigGroup kwinCompositingCg(m_kwinConfig, "Compositing");
|
|
|
|
|
|
QString desktopTitleBarButtonsLeft = ownButtonsCg.readEntry("DesktopLeft", "MS");
|
|
QString desktopTitleBarButtonsRight = ownButtonsCg.readEntry("DesktopRight", "HIA__X");
|
|
|
|
QString netbookTitleBarButtonsLeft = ownButtonsCg.readEntry("NetbookLeft", "MS");
|
|
QString netbookTitleBarButtonsRight = ownButtonsCg.readEntry("NetbookRight", "HA__X");
|
|
|
|
|
|
bool desktopPresentWindowsTabbox = false;
|
|
bool desktopBoxSwitchTabbox = true;
|
|
bool desktopCoverSwitchTabbox = false;
|
|
bool desktopFlipSwitchTabbox = false;
|
|
|
|
bool netbookPresentWindowsTabbox = true;
|
|
bool netbookBoxSwitchTabbox = false;
|
|
bool netbookCoverSwitchTabbox = false;
|
|
bool netbookFlipSwitchTabbox = false;
|
|
|
|
|
|
int desktopPresentWindowsLayoutMode = 0;
|
|
int netbookPresentWindowsLayoutMode = 1;
|
|
|
|
bool desktopUnredirectFullscreen = ownCompositingCg.readEntry("DesktopUnredirectFullscreen", true);
|
|
bool netbookUnredirectFullscreen = ownCompositingCg.readEntry("NetbookUnredirectFullscreen", false);
|
|
|
|
if (m_currentlyIsDesktop) {
|
|
//save the user preferences on titlebar buttons
|
|
desktopTitleBarButtonsLeft = kwinStyleCg.readEntry("ButtonsOnLeft", "MS");
|
|
desktopTitleBarButtonsRight = kwinStyleCg.readEntry("ButtonsOnRight", "HIA__X");
|
|
ownButtonsCg.writeEntry("DesktopLeft", desktopTitleBarButtonsLeft);
|
|
ownButtonsCg.writeEntry("DesktopRight", desktopTitleBarButtonsRight);
|
|
|
|
//Unredirect fullscreen
|
|
desktopUnredirectFullscreen = kwinCompositingCg.readEntry("UnredirectFullscreen", true);
|
|
ownCompositingCg.writeEntry("DesktopUnredirectFullscreen", desktopUnredirectFullscreen);
|
|
|
|
//desktop grid effect
|
|
desktopPresentWindowsLayoutMode = kwinPresentWindowsCg.readEntry("LayoutMode", 0);
|
|
ownPresentWindowsCg.writeEntry("DesktopLayoutMode", desktopPresentWindowsLayoutMode);
|
|
|
|
//box switch effect
|
|
desktopPresentWindowsTabbox = kwinPresentWindowsCg.readEntry("TabBox", false);
|
|
ownPresentWindowsCg.writeEntry("DesktopTabBox", desktopPresentWindowsTabbox);
|
|
|
|
KConfigGroup ownBoxSwitchCg( m_ownConfig, "Effect-BoxSwitch" );
|
|
KConfigGroup kwinBoxSwitchCg( m_kwinConfig, "Effect-BoxSwitch" );
|
|
desktopBoxSwitchTabbox = kwinBoxSwitchCg.readEntry("TabBox", desktopBoxSwitchTabbox);
|
|
ownBoxSwitchCg.writeEntry( "DesktopTabBox", desktopBoxSwitchTabbox );
|
|
ownBoxSwitchCg.sync();
|
|
|
|
KConfigGroup ownCoverSwitchCg( m_ownConfig, "Effect-CoverSwitch" );
|
|
KConfigGroup kwinCoverSwitchCg( m_kwinConfig, "Effect-CoverSwitch" );
|
|
desktopCoverSwitchTabbox = kwinCoverSwitchCg.readEntry("TabBox", desktopCoverSwitchTabbox);
|
|
ownCoverSwitchCg.writeEntry( "DesktopTabBox", desktopCoverSwitchTabbox );
|
|
ownCoverSwitchCg.sync();
|
|
|
|
KConfigGroup ownFlipSwitchCg( m_ownConfig, "Effect-FlipSwitch" );
|
|
KConfigGroup kwinFlipSwitchCg( m_kwinConfig, "Effect-FlipSwitch" );
|
|
desktopFlipSwitchTabbox = kwinFlipSwitchCg.readEntry("TabBox", desktopFlipSwitchTabbox);
|
|
ownFlipSwitchCg.writeEntry( "DesktopTabBox", desktopFlipSwitchTabbox );
|
|
ownFlipSwitchCg.sync();
|
|
} else {
|
|
//save the user preferences on titlebar buttons
|
|
netbookTitleBarButtonsLeft = kwinStyleCg.readEntry("ButtonsOnLeft", "MS");
|
|
netbookTitleBarButtonsRight = kwinStyleCg.readEntry("ButtonsOnRight", "HA__X");
|
|
ownButtonsCg.writeEntry("NetbookLeft", netbookTitleBarButtonsLeft);
|
|
ownButtonsCg.writeEntry("NetbookRight", netbookTitleBarButtonsRight);
|
|
|
|
//Unredirect fullscreen
|
|
netbookUnredirectFullscreen = kwinCompositingCg.readEntry("UnredirectFullscreen", true);
|
|
ownCompositingCg.writeEntry("NetbookUnredirectFullscreen", netbookUnredirectFullscreen);
|
|
|
|
//desktop grid effect
|
|
desktopPresentWindowsLayoutMode = kwinPresentWindowsCg.readEntry("LayoutMode", 0);
|
|
ownPresentWindowsCg.writeEntry("NetbookLayoutMode", desktopPresentWindowsLayoutMode);
|
|
|
|
|
|
//box switch effect
|
|
netbookPresentWindowsTabbox = kwinPresentWindowsCg.readEntry("TabBox", false);
|
|
ownPresentWindowsCg.writeEntry("NetbookTabBox", netbookPresentWindowsTabbox);
|
|
|
|
KConfigGroup ownBoxSwitchCg( m_ownConfig, "Effect-BoxSwitch" );
|
|
KConfigGroup kwinBoxSwitchCg( m_kwinConfig, "Effect-BoxSwitch" );
|
|
netbookBoxSwitchTabbox = kwinBoxSwitchCg.readEntry("TabBox", netbookBoxSwitchTabbox);
|
|
ownBoxSwitchCg.writeEntry( "NetbookTabBox", netbookBoxSwitchTabbox );
|
|
ownBoxSwitchCg.sync();
|
|
|
|
KConfigGroup ownCoverSwitchCg( m_ownConfig, "Effect-CoverSwitch" );
|
|
KConfigGroup kwinCoverSwitchCg( m_kwinConfig, "Effect-CoverSwitch" );
|
|
netbookCoverSwitchTabbox = kwinCoverSwitchCg.readEntry("TabBox", netbookCoverSwitchTabbox);
|
|
ownCoverSwitchCg.writeEntry( "NetbookTabBox", netbookCoverSwitchTabbox );
|
|
ownCoverSwitchCg.sync();
|
|
|
|
KConfigGroup ownFlipSwitchCg( m_ownConfig, "Effect-FlipSwitch" );
|
|
KConfigGroup kwinFlipSwitchCg( m_kwinConfig, "Effect-FlipSwitch" );
|
|
netbookFlipSwitchTabbox = kwinFlipSwitchCg.readEntry("TabBox", netbookFlipSwitchTabbox);
|
|
ownFlipSwitchCg.writeEntry( "NetbookTabBox", netbookFlipSwitchTabbox );
|
|
ownFlipSwitchCg.sync();
|
|
}
|
|
|
|
ownButtonsCg.sync();
|
|
ownPresentWindowsCg.sync();
|
|
ownCompositingCg.sync();
|
|
|
|
kwinStyleCg.writeEntry("CustomButtonPositions", true);
|
|
if (isDesktop) {
|
|
//kill/enable the minimize button, unless configured differently
|
|
kwinStyleCg.writeEntry("ButtonsOnLeft", desktopTitleBarButtonsLeft);
|
|
kwinStyleCg.writeEntry("ButtonsOnRight", desktopTitleBarButtonsRight);
|
|
|
|
// enable unredirect fullscreen, unless configured differently
|
|
kwinCompositingCg.writeEntry("UnredirectFullscreen", desktopUnredirectFullscreen);
|
|
|
|
//present windows mode
|
|
kwinPresentWindowsCg.writeEntry("LayoutMode", desktopPresentWindowsLayoutMode);
|
|
|
|
//what to use as tabbox
|
|
kwinPresentWindowsCg.writeEntry("TabBox", desktopPresentWindowsTabbox);
|
|
|
|
KConfigGroup kwinBoxSwitchCg( m_kwinConfig, "Effect-BoxSwitch" );
|
|
kwinBoxSwitchCg.writeEntry( "TabBox", desktopBoxSwitchTabbox );
|
|
kwinBoxSwitchCg.sync();
|
|
|
|
KConfigGroup kwinCoverSwitchCg( m_kwinConfig, "Effect-CoverSwitch" );
|
|
kwinCoverSwitchCg.writeEntry( "TabBox", desktopCoverSwitchTabbox );
|
|
kwinCoverSwitchCg.sync();
|
|
|
|
KConfigGroup kwinFlipSwitchCg( m_kwinConfig, "Effect-FlipSwitch" );
|
|
kwinFlipSwitchCg.writeEntry( "TabBox", desktopFlipSwitchTabbox );
|
|
kwinFlipSwitchCg.sync();
|
|
} else {
|
|
//kill/enable the minimize button, unless configured differently
|
|
kwinStyleCg.writeEntry("ButtonsOnLeft", netbookTitleBarButtonsLeft);
|
|
kwinStyleCg.writeEntry("ButtonsOnRight", netbookTitleBarButtonsRight);
|
|
|
|
// disable unredirect fullscreen, unless configured differently
|
|
kwinCompositingCg.writeEntry("UnredirectFullscreen", netbookUnredirectFullscreen);
|
|
|
|
//present windows mode
|
|
kwinPresentWindowsCg.writeEntry("LayoutMode", netbookPresentWindowsLayoutMode);
|
|
|
|
//what to use as tabbox
|
|
kwinPresentWindowsCg.writeEntry("TabBox", netbookPresentWindowsTabbox);
|
|
|
|
KConfigGroup kwinBoxSwitchCg( m_kwinConfig, "Effect-BoxSwitch" );
|
|
kwinBoxSwitchCg.writeEntry( "TabBox", netbookBoxSwitchTabbox );
|
|
kwinBoxSwitchCg.sync();
|
|
|
|
KConfigGroup kwinCoverSwitchCg( m_kwinConfig, "Effect-CoverSwitch" );
|
|
kwinCoverSwitchCg.writeEntry( "TabBox", netbookCoverSwitchTabbox );
|
|
kwinCoverSwitchCg.sync();
|
|
|
|
KConfigGroup kwinFlipSwitchCg( m_kwinConfig, "Effect-FlipSwitch" );
|
|
kwinFlipSwitchCg.writeEntry( "TabBox", netbookFlipSwitchTabbox );
|
|
kwinFlipSwitchCg.sync();
|
|
}
|
|
|
|
kwinStyleCg.sync();
|
|
kwinPresentWindowsCg.sync();
|
|
kwinCompositingCg.sync();
|
|
|
|
// Reload KWin.
|
|
QDBusMessage message = QDBusMessage::createSignal( "/KWin", "org.kde.KWin", "reloadConfig" );
|
|
QDBusConnection::sessionBus().send(message);
|
|
|
|
m_currentlyIsDesktop = isDesktop;
|
|
|
|
const bool fixedDashboard = m_ui->dashboardMode->currentIndex() == 1;
|
|
if (m_currentlyFixedDashboard != fixedDashboard) {
|
|
// confirm with th euser that this is really the change they want if going from
|
|
// separate-dashboard back to dashboard-follows-desktop
|
|
const QString message = i18n("Turning off the show independent widget set feature will "
|
|
"result in all widgets that were on the dashboard to be removed. "
|
|
"Are you sure you wish to make this change?");
|
|
if (!m_currentlyFixedDashboard ||
|
|
KMessageBox::Yes == KMessageBox::warningYesNo(this, message, i18n("Turn off independent widgets?"),
|
|
KGuiItem(i18n("Turn off independent widgets")),
|
|
KStandardGuiItem::cancel())) {
|
|
QDBusInterface interface("org.kde.plasma-desktop", "/App");
|
|
interface.call(QDBus::NoBlock, "setFixedDashboard", fixedDashboard);
|
|
m_currentlyFixedDashboard = fixedDashboard;
|
|
} else {
|
|
m_ui->dashboardMode->setCurrentIndex(m_currentlyFixedDashboard ? 1 : 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
void WorkspaceOptionsModule::load()
|
|
{
|
|
if (m_plasmaDesktopAutostart.autostarts()) {
|
|
m_ui->formFactor->setCurrentIndex(0);
|
|
} else {
|
|
m_ui->formFactor->setCurrentIndex(1);
|
|
}
|
|
|
|
QDBusInterface interface("org.kde.plasma-desktop", "/App");
|
|
m_currentlyFixedDashboard = false;
|
|
|
|
if (interface.isValid()) {
|
|
m_currentlyFixedDashboard = interface.call("fixedDashboard").arguments().first().toBool();
|
|
}
|
|
|
|
m_ui->dashboardMode->setCurrentIndex(m_currentlyFixedDashboard ? 1 : 0);
|
|
|
|
KConfig config("plasmarc");
|
|
KConfigGroup cg(&config, "PlasmaToolTips");
|
|
m_ui->showToolTips->setChecked(cg.readEntry("Delay", 0.7) > 0);
|
|
}
|
|
|
|
void WorkspaceOptionsModule::defaults()
|
|
{
|
|
m_ui->formFactor->setCurrentIndex(0);
|
|
m_ui->dashboardMode->setCurrentIndex(0);
|
|
}
|
|
|
|
void WorkspaceOptionsModule::formFactorChanged(int newFormFactorIndex)
|
|
{
|
|
m_ui->dashboardMode->setEnabled(newFormFactorIndex == 0);
|
|
m_ui->dashboardLabel->setEnabled(newFormFactorIndex == 0);
|
|
}
|
|
|
|
#include "moc_workspaceoptions.cpp"
|