kwin/kcmkwin/kwinoptions/mouse.cpp

999 lines
34 KiB
C++
Raw Normal View History

/*
*
* Copyright (c) 1998 Matthias Ettrich <ettrich@kde.org>
*
* 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 "mouse.h"
#include <QLabel>
#include <KComboBox>
#include <QLayout>
#include <QSizePolicy>
#include <QBitmap>
#include <QGroupBox>
#include <QPixmap>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFormLayout>
#include <kconfig.h>
#include <kdialog.h>
#include <kdebug.h>
#include <kglobalsettings.h>
#include <kcolorscheme.h>
#include <kseparator.h>
#include <QtDBus/QtDBus>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdlib.h>
#include "mouse.moc"
2011-01-30 14:34:42 +00:00
namespace
{
char const * const cnf_Max[] = {
2011-01-30 14:34:42 +00:00
"MaximizeButtonLeftClickCommand",
"MaximizeButtonMiddleClickCommand",
"MaximizeButtonRightClickCommand",
};
char const * const tbl_Max[] = {
2011-01-30 14:34:42 +00:00
"Maximize",
"Maximize (vertical only)",
"Maximize (horizontal only)",
""
};
QPixmap maxButtonPixmaps[3];
void createMaxButtonPixmaps()
{
2011-01-30 14:34:42 +00:00
char const * maxButtonXpms[][3 + 13] = {
{
0, 0, 0,
"...............",
".......#.......",
"......###......",
".....#####.....",
"..#....#....#..",
".##....#....##.",
"###############",
".##....#....##.",
"..#....#....#..",
".....#####.....",
"......###......",
".......#.......",
"..............."
},
{
0, 0, 0,
"...............",
".......#.......",
"......###......",
".....#####.....",
".......#.......",
".......#.......",
".......#.......",
".......#.......",
".......#.......",
".....#####.....",
"......###......",
".......#.......",
"..............."
},
{
0, 0, 0,
"...............",
"...............",
"...............",
"...............",
"..#.........#..",
".##.........##.",
"###############",
".##.........##.",
"..#.........#..",
"...............",
"...............",
"...............",
"..............."
},
};
QByteArray baseColor(". c " + KColorScheme(QPalette::Active, KColorScheme::View).background().color().name().toAscii());
QByteArray textColor("# c " + KColorScheme(QPalette::Active, KColorScheme::View).foreground().color().name().toAscii());
for (int t = 0; t < 3; ++t) {
maxButtonXpms[t][0] = "15 13 2 1";
maxButtonXpms[t][1] = baseColor.constData();
maxButtonXpms[t][2] = textColor.constData();
maxButtonPixmaps[t] = QPixmap(maxButtonXpms[t]);
maxButtonPixmaps[t].setMask(maxButtonPixmaps[t].createHeuristicMask());
}
}
} // namespace
void KTitleBarActionsConfig::paletteChanged()
{
2011-01-30 14:34:42 +00:00
createMaxButtonPixmaps();
for (int b = 0; b < 3; ++b)
for (int t = 0; t < 3; ++t)
coMax[b]->setItemIcon(t, maxButtonPixmaps[t]);
}
2011-01-30 14:34:42 +00:00
KTitleBarActionsConfig::KTitleBarActionsConfig(bool _standAlone, KConfig *_config, const KComponentData &inst, QWidget * parent)
: KCModule(inst, parent), config(_config), standAlone(_standAlone)
{
2011-01-30 14:34:42 +00:00
QString strWin1, strWin2, strWin3, strAllKey, strAll1, strAll2, strAll3;
QGridLayout *grid;
QGroupBox *box;
QLabel *label;
QString strMouseButton1, strMouseButton3;
QString txtButton1, txtButton3;
QStringList items;
bool leftHandedMouse = (KGlobalSettings::mouseSettings().handed == KGlobalSettings::KMouseSettings::LeftHanded);
QVBoxLayout *layout = new QVBoxLayout(this);
/** Titlebar doubleclick ************/
QWidget *titlebarActions = new QWidget(this);
QGridLayout *gLayout = new QGridLayout(titlebarActions);
layout->addWidget(titlebarActions);
KComboBox* combo = new KComboBox(this);
combo->addItem(i18nc("@item:inlistbox behavior on double click", "Maximize"));
combo->addItem(i18n("Maximize (vertical only)"));
combo->addItem(i18n("Maximize (horizontal only)"));
combo->addItem(i18nc("@item:inlistbox behavior on double click", "Minimize"));
combo->addItem(i18n("Shade"));
combo->addItem(i18n("Lower"));
combo->addItem(i18nc("@item:inlistbox behavior on double click", "Close"));
combo->addItem(i18nc("@item:inlistbox behavior on double click", "On All Desktops"));
combo->addItem(i18n("Nothing"));
combo->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coTiDbl = combo;
combo->setWhatsThis(i18n("Behavior on <em>double</em> click into the titlebar."));
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
label = new QLabel(i18n("&Titlebar double-click:"), this);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
label->setBuddy(combo);
gLayout->addWidget(label, 0, 0);
gLayout->addWidget(combo, 0, 1);
/** Mouse Wheel Events **************/
// Titlebar and frame mouse Wheel
KComboBox* comboW = new KComboBox(this);
comboW->addItem(i18n("Raise/Lower"));
comboW->addItem(i18n("Shade/Unshade"));
comboW->addItem(i18n("Maximize/Restore"));
comboW->addItem(i18n("Keep Above/Below"));
comboW->addItem(i18n("Move to Previous/Next Desktop"));
comboW->addItem(i18n("Change Opacity"));
comboW->addItem(i18n("Switch to Window Tab to the Left/Right"));
comboW->addItem(i18n("Nothing"));
comboW->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
connect(comboW, SIGNAL(activated(int)), SLOT(changed()));
coTiAct4 = comboW;
comboW->setWhatsThis(i18n("Handle mouse wheel events"));
comboW->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
label = new QLabel(i18n("Titlebar wheel event:"), this);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
label->setBuddy(comboW);
gLayout->addWidget(label, 1, 0);
gLayout->addWidget(comboW, 1, 1);
/** Titlebar and frame **************/
box = new QGroupBox(i18n("Titlebar && Frame"), this);
layout->addWidget(box);
box->setObjectName(QString::fromLatin1("Titlebar and Frame"));
box->setWhatsThis(i18n("Here you can customize mouse click behavior when clicking on the"
" titlebar or the frame of a window."));
grid = new QGridLayout(box);
strMouseButton1 = i18n("Left button:");
txtButton1 = i18n("In this row you can customize left click behavior when clicking into"
" the titlebar or the frame.");
strMouseButton3 = i18n("Right button:");
txtButton3 = i18n("In this row you can customize right click behavior when clicking into"
" the titlebar or the frame.");
if (leftHandedMouse) {
qSwap(strMouseButton1, strMouseButton3);
qSwap(txtButton1, txtButton3);
}
label = new QLabel(strMouseButton1, box);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
grid->addWidget(label, 1, 0);
label->setWhatsThis(txtButton1);
label = new QLabel(i18n("Middle button:"), box);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
grid->addWidget(label, 2, 0);
label->setWhatsThis(i18n("In this row you can customize middle click behavior when clicking into"
" the titlebar or the frame."));
label = new QLabel(strMouseButton3, box);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
grid->addWidget(label, 3, 0);
label->setWhatsThis(txtButton3);
label = new QLabel(i18n("Active"), box);
grid->addWidget(label, 0, 1);
label->setAlignment(Qt::AlignCenter);
label->setWhatsThis(i18n("In this column you can customize mouse clicks into the titlebar"
" or the frame of an active window."));
// Items for titlebar and frame, active windows
items << i18n("Raise")
<< i18n("Lower")
<< i18n("Toggle Raise & Lower")
<< i18n("Minimize")
<< i18n("Shade")
<< i18n("Close")
<< i18n("Operations Menu")
<< i18n("Start Window Tab Drag")
<< i18n("Nothing");
2011-01-30 14:34:42 +00:00
// Titlebar and frame, active, mouse button 1
combo = new KComboBox(box);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
grid->addWidget(combo, 1, 1);
combo->addItems(items);
2011-01-30 14:34:42 +00:00
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coTiAct1 = combo;
txtButton1 = i18n("Behavior on <em>left</em> click into the titlebar or frame of an "
"<em>active</em> window.");
txtButton3 = i18n("Behavior on <em>right</em> click into the titlebar or frame of an "
"<em>active</em> window.");
// Be nice to left handed users
if (leftHandedMouse) qSwap(txtButton1, txtButton3);
combo->setWhatsThis(txtButton1);
// Titlebar and frame, active, mouse button 2
combo = new KComboBox(box);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
grid->addWidget(combo, 2, 1);
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coTiAct2 = combo;
combo->setWhatsThis(i18n("Behavior on <em>middle</em> click into the titlebar or frame of an <em>active</em> window."));
// Titlebar and frame, active, mouse button 3
combo = new KComboBox(box);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
grid->addWidget(combo, 3, 1);
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coTiAct3 = combo;
combo->setWhatsThis(txtButton3);
txtButton1 = i18n("Behavior on <em>left</em> click into the titlebar or frame of an "
"<em>inactive</em> window.");
txtButton3 = i18n("Behavior on <em>right</em> click into the titlebar or frame of an "
"<em>inactive</em> window.");
// Be nice to left handed users
if (leftHandedMouse) qSwap(txtButton1, txtButton3);
label = new QLabel(i18n("Inactive"), box);
grid->addWidget(label, 0, 2);
label->setAlignment(Qt::AlignCenter);
label->setWhatsThis(i18n("In this column you can customize mouse clicks into the titlebar"
" or the frame of an inactive window."));
// Items for titlebar and frame, inactive windows
2011-01-30 14:34:42 +00:00
items.clear();
items << i18n("Activate & Raise")
<< i18n("Activate & Lower")
<< i18n("Activate")
<< i18n("Raise")
<< i18n("Lower")
<< i18n("Toggle Raise & Lower")
<< i18n("Minimize")
<< i18n("Shade")
2011-01-30 14:34:42 +00:00
<< i18n("Close")
<< i18n("Operations Menu")
2011-01-30 14:34:42 +00:00
<< i18n("Start Window Tab Drag")
<< i18n("Nothing");
// Titlebar and frame, inactive, mouse button 1
2011-01-30 14:34:42 +00:00
combo = new KComboBox(box);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
grid->addWidget(combo, 1, 2);
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coTiInAct1 = combo;
combo->setWhatsThis(txtButton1);
// Titlebar and frame, inactive, mouse button 2
2011-01-30 14:34:42 +00:00
combo = new KComboBox(box);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
grid->addWidget(combo, 2, 2);
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coTiInAct2 = combo;
combo->setWhatsThis(i18n("Behavior on <em>middle</em> click into the titlebar or frame of an <em>inactive</em> window."));
// Titlebar and frame, inactive, mouse button 3
2011-01-30 14:34:42 +00:00
combo = new KComboBox(box);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
grid->addWidget(combo, 3, 2);
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coTiInAct3 = combo;
combo->setWhatsThis(txtButton3);
/** Maximize Button ******************/
box = new QGroupBox(i18n("Maximize Button"), this);
layout->addWidget(box);
box->setObjectName(QString::fromLatin1("Maximize Button"));
box->setWhatsThis(
i18n("Here you can customize behavior when clicking on the maximize button."));
QHBoxLayout* hlayout = new QHBoxLayout(box);
QString strMouseButton[] = {
i18n("Left button:"),
i18n("Middle button:"),
i18n("Right button:")
};
QString txtButton[] = {
i18n("Behavior on <em>left</em> click onto the maximize button."),
i18n("Behavior on <em>middle</em> click onto the maximize button."),
i18n("Behavior on <em>right</em> click onto the maximize button.")
};
if (leftHandedMouse) { // Be nice to lefties
qSwap(strMouseButton[0], strMouseButton[2]);
qSwap(txtButton[0], txtButton[2]);
}
createMaxButtonPixmaps();
for (int b = 0; b < 3; ++b) {
if (b != 0) hlayout->addItem(new QSpacerItem(5, 5, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); // Spacer
QLabel * label = new QLabel(strMouseButton[b], box);
hlayout->addWidget(label);
label->setWhatsThis(txtButton[b]);
label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
coMax[b] = new ToolTipComboBox(box, tbl_Max);
hlayout->addWidget(coMax[b]);
for (int t = 0; t < 3; ++t) coMax[b]->addItem(maxButtonPixmaps[t], QString());
connect(coMax[b], SIGNAL(activated(int)), SLOT(changed()));
connect(coMax[b], SIGNAL(activated(int)), coMax[b], SLOT(changed()));
coMax[b]->setWhatsThis(txtButton[b]);
coMax[b]->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
}
connect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()), SLOT(paletteChanged()));
layout->addStretch();
load();
}
KTitleBarActionsConfig::~KTitleBarActionsConfig()
{
2011-01-30 14:34:42 +00:00
if (standAlone)
delete config;
}
// do NOT change the texts below, they are written to config file
// and are not shown in the GUI
// they have to match the order of items in GUI elements though
const char* const tbl_TiDbl[] = {
"Maximize",
"Maximize (vertical only)",
"Maximize (horizontal only)",
"Minimize",
"Shade",
"Lower",
"Close",
"OnAllDesktops",
"Nothing",
2011-01-30 14:34:42 +00:00
""
};
const char* const tbl_TiAc[] = {
"Raise",
"Lower",
"Toggle raise and lower",
"Minimize",
"Shade",
"Close",
"Operations menu",
"Start window tab drag",
"Nothing",
2011-01-30 14:34:42 +00:00
""
};
const char* const tbl_TiInAc[] = {
"Activate and raise",
"Activate and lower",
"Activate",
"Raise",
"Lower",
"Toggle raise and lower",
"Minimize",
"Shade",
"Close",
"Operations menu",
"Start window tab drag",
"Nothing",
2011-01-30 14:34:42 +00:00
""
};
const char* const tbl_Win[] = {
"Activate, raise and pass click",
"Activate and pass click",
"Activate",
"Activate and raise",
2011-01-30 14:34:42 +00:00
""
};
const char* const tbl_WinWheel[] = {
"Scroll",
"Activate and scroll",
"Activate, raise and scroll",
2011-01-30 14:34:42 +00:00
""
};
const char* const tbl_AllKey[] = {
"Meta",
"Alt",
2011-01-30 14:34:42 +00:00
""
};
const char* const tbl_All[] = {
"Move",
"Activate, raise and move",
"Toggle raise and lower",
"Resize",
"Raise",
"Lower",
"Minimize",
"Nothing",
2011-01-30 14:34:42 +00:00
""
};
const char* tbl_TiWAc[] = {
"Raise/Lower",
"Shade/Unshade",
"Maximize/Restore",
"Above/Below",
"Previous/Next Desktop",
"Change Opacity",
"Switch to Window Tab to the Left/Right",
"Nothing",
2011-01-30 14:34:42 +00:00
""
};
const char* tbl_AllW[] = {
"Raise/Lower",
"Shade/Unshade",
"Maximize/Restore",
"Above/Below",
"Previous/Next Desktop",
"Change Opacity",
"Switch to Window Tab to the Left/Right",
"Nothing",
2011-01-30 14:34:42 +00:00
""
};
2011-01-30 14:34:42 +00:00
static const char* tbl_num_lookup(const char* const arr[], int pos)
{
2011-01-30 14:34:42 +00:00
for (int i = 0;
arr[ i ][ 0 ] != '\0' && pos >= 0;
++i) {
if (pos == 0)
return arr[ i ];
--pos;
}
abort(); // should never happen this way
}
2011-01-30 14:34:42 +00:00
static int tbl_txt_lookup(const char* const arr[], const char* txt)
{
int pos = 0;
2011-01-30 14:34:42 +00:00
for (int i = 0;
arr[ i ][ 0 ] != '\0';
++i) {
if (qstricmp(txt, arr[ i ]) == 0)
return pos;
++pos;
}
return 0;
}
2011-01-30 14:34:42 +00:00
void KTitleBarActionsConfig::setComboText(KComboBox* combo, const char*txt)
{
2011-01-30 14:34:42 +00:00
if (combo == coTiDbl)
combo->setCurrentIndex(tbl_txt_lookup(tbl_TiDbl, txt));
else if (combo == coTiAct1 || combo == coTiAct2 || combo == coTiAct3)
combo->setCurrentIndex(tbl_txt_lookup(tbl_TiAc, txt));
else if (combo == coTiInAct1 || combo == coTiInAct2 || combo == coTiInAct3)
combo->setCurrentIndex(tbl_txt_lookup(tbl_TiInAc, txt));
else if (combo == coTiAct4)
combo->setCurrentIndex(tbl_txt_lookup(tbl_TiWAc, txt));
else if (combo == coMax[0] || combo == coMax[1] || combo == coMax[2]) {
combo->setCurrentIndex(tbl_txt_lookup(tbl_Max, txt));
static_cast<ToolTipComboBox *>(combo)->changed();
2011-01-30 14:34:42 +00:00
} else
abort();
}
2011-01-30 14:34:42 +00:00
const char* KTitleBarActionsConfig::functionTiDbl(int i)
{
2011-01-30 14:34:42 +00:00
return tbl_num_lookup(tbl_TiDbl, i);
}
2011-01-30 14:34:42 +00:00
const char* KTitleBarActionsConfig::functionTiAc(int i)
{
2011-01-30 14:34:42 +00:00
return tbl_num_lookup(tbl_TiAc, i);
}
2011-01-30 14:34:42 +00:00
const char* KTitleBarActionsConfig::functionTiInAc(int i)
{
2011-01-30 14:34:42 +00:00
return tbl_num_lookup(tbl_TiInAc, i);
}
const char* KTitleBarActionsConfig::functionTiWAc(int i)
{
2011-01-30 14:34:42 +00:00
return tbl_num_lookup(tbl_TiWAc, i);
}
2011-01-30 14:34:42 +00:00
const char* KTitleBarActionsConfig::functionMax(int i)
{
2011-01-30 14:34:42 +00:00
return tbl_num_lookup(tbl_Max, i);
}
2011-01-30 14:34:42 +00:00
void KTitleBarActionsConfig::showEvent(QShowEvent *ev)
{
2011-01-30 14:34:42 +00:00
if (!standAlone) {
// Workaround KCModule::showEvent() calling load(), see bug 163817
2011-01-30 14:34:42 +00:00
QWidget::showEvent(ev);
return;
}
2011-01-30 14:34:42 +00:00
KCModule::showEvent(ev);
}
void KTitleBarActionsConfig::load()
{
2011-01-30 14:34:42 +00:00
KConfigGroup windowsConfig(config, "Windows");
setComboText(coTiDbl, windowsConfig.readEntry("TitlebarDoubleClickCommand", "Maximize").toAscii());
for (int t = 0; t < 3; ++t)
setComboText(coMax[t], windowsConfig.readEntry(cnf_Max[t], tbl_Max[t]).toAscii());
KConfigGroup cg(config, "MouseBindings");
setComboText(coTiAct1, cg.readEntry("CommandActiveTitlebar1", "Raise").toAscii());
setComboText(coTiAct2, cg.readEntry("CommandActiveTitlebar2", "Start Window Tab Drag").toAscii());
setComboText(coTiAct3, cg.readEntry("CommandActiveTitlebar3", "Operations menu").toAscii());
setComboText(coTiAct4, cg.readEntry("CommandTitlebarWheel", "Switch to Window Tab to the Left/Right").toAscii());
setComboText(coTiInAct1, cg.readEntry("CommandInactiveTitlebar1", "Activate and raise").toAscii());
setComboText(coTiInAct2, cg.readEntry("CommandInactiveTitlebar2", "Start Window Tab Drag").toAscii());
setComboText(coTiInAct3, cg.readEntry("CommandInactiveTitlebar3", "Operations menu").toAscii());
}
void KTitleBarActionsConfig::save()
{
2011-01-30 14:34:42 +00:00
KConfigGroup windowsConfig(config, "Windows");
windowsConfig.writeEntry("TitlebarDoubleClickCommand", functionTiDbl(coTiDbl->currentIndex()));
for (int t = 0; t < 3; ++t)
windowsConfig.writeEntry(cnf_Max[t], functionMax(coMax[t]->currentIndex()));
KConfigGroup cg(config, "MouseBindings");
cg.writeEntry("CommandActiveTitlebar1", functionTiAc(coTiAct1->currentIndex()));
cg.writeEntry("CommandActiveTitlebar2", functionTiAc(coTiAct2->currentIndex()));
cg.writeEntry("CommandActiveTitlebar3", functionTiAc(coTiAct3->currentIndex()));
cg.writeEntry("CommandInactiveTitlebar1", functionTiInAc(coTiInAct1->currentIndex()));
cg.writeEntry("CommandTitlebarWheel", functionTiWAc(coTiAct4->currentIndex()));
cg.writeEntry("CommandInactiveTitlebar2", functionTiInAc(coTiInAct2->currentIndex()));
cg.writeEntry("CommandInactiveTitlebar3", functionTiInAc(coTiInAct3->currentIndex()));
if (standAlone) {
config->sync();
// Send signal to all kwin instances
QDBusMessage message =
QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig");
QDBusConnection::sessionBus().send(message);
}
}
void KTitleBarActionsConfig::defaults()
{
2011-01-30 14:34:42 +00:00
setComboText(coTiDbl, "Shade");
setComboText(coTiAct1, "Raise");
setComboText(coTiAct2, "Start Window Tab Drag");
setComboText(coTiAct3, "Operations menu");
setComboText(coTiAct4, "Switch to Window Tab to the Left/Right");
setComboText(coTiInAct1, "Activate and raise");
setComboText(coTiInAct2, "Start Window Tab Drag");
setComboText(coTiInAct3, "Operations menu");
for (int t = 0; t < 3; ++t)
setComboText(coMax[t], tbl_Max[t]);
}
2011-01-30 14:34:42 +00:00
KWindowActionsConfig::KWindowActionsConfig(bool _standAlone, KConfig *_config, const KComponentData &inst, QWidget * parent)
: KCModule(inst, parent), config(_config), standAlone(_standAlone)
{
2011-01-30 14:34:42 +00:00
QString strWin1, strWin2, strWin3, strWinWheel, strAllKey, strAll1, strAll2, strAll3, strAllW;
QGroupBox *box;
QString strMouseButton1, strMouseButton2, strMouseButton3, strMouseWheel;
QString txtButton1, txtButton2, txtButton3, txtWheel;
QStringList items;
bool leftHandedMouse = (KGlobalSettings::mouseSettings().handed == KGlobalSettings::KMouseSettings::LeftHanded);
QVBoxLayout *layout = new QVBoxLayout(this);
/** Inactive inner window ******************/
box = new QGroupBox(i18n("Inactive Inner Window"), this);
layout->addWidget(box);
box->setObjectName(QString::fromLatin1("Inactive Inner Window"));
box->setWhatsThis(i18n("Here you can customize mouse click behavior when clicking on an inactive"
" inner window ('inner' means: not titlebar, not frame)."));
QGridLayout *gridLayout = new QGridLayout(box);
strMouseButton1 = i18n("Left button:");
txtButton1 = i18n("In this row you can customize left click behavior when clicking into"
" the titlebar or the frame.");
strMouseButton2 = i18n("Middle button:");
txtButton2 = i18n("In this row you can customize middle click behavior when clicking into"
" the titlebar or the frame.");
strMouseButton3 = i18n("Right button:");
txtButton3 = i18n("In this row you can customize right click behavior when clicking into"
" the titlebar or the frame.");
strMouseWheel = i18n("Wheel");
if (leftHandedMouse) {
qSwap(strMouseButton1, strMouseButton3);
qSwap(txtButton1, txtButton3);
}
strWin1 = i18n("In this row you can customize left click behavior when clicking into"
" an inactive inner window ('inner' means: not titlebar, not frame).");
strWin2 = i18n("In this row you can customize middle click behavior when clicking into"
" an inactive inner window ('inner' means: not titlebar, not frame).");
strWin3 = i18n("In this row you can customize right click behavior when clicking into"
" an inactive inner window ('inner' means: not titlebar, not frame).");
strWinWheel = i18n("In this row you can customize behavior when scrolling into"
" an inactive inner window ('inner' means: not titlebar, not frame).");
// Be nice to lefties
if (leftHandedMouse) qSwap(strWin1, strWin3);
items.clear();
items << i18n("Activate, Raise & Pass Click")
<< i18n("Activate & Pass Click")
<< i18n("Activate")
<< i18n("Activate & Raise");
KComboBox* combo = new KComboBox(box);
coWin1 = combo;
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
combo->setWhatsThis(strWin1);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
QLabel* label = new QLabel(strMouseButton1, this);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
label->setBuddy(combo);
gridLayout->addWidget(label, 0, 0);
gridLayout->addWidget(combo, 0, 1);
combo = new KComboBox(box);
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coWin2 = combo;
combo->setWhatsThis(strWin2);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
label = new QLabel(strMouseButton2, this);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
label->setBuddy(combo);
gridLayout->addWidget(label, 1, 0);
gridLayout->addWidget(combo, 1, 1);
combo = new KComboBox(box);
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coWin3 = combo;
combo->setWhatsThis(strWin3);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
label = new QLabel(strMouseButton3, this);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
label->setBuddy(combo);
gridLayout->addWidget(label, 2, 0);
gridLayout->addWidget(combo, 2, 1);
items.clear();
items << i18n("Scroll")
<< i18n("Activate & Scroll")
<< i18n("Activate, Raise & Scroll");
combo = new KComboBox(box);
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coWinWheel = combo;
combo->setWhatsThis(strWinWheel);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
label = new QLabel(strMouseWheel, this);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
label->setBuddy(combo);
gridLayout->addWidget(label, 3, 0);
gridLayout->addWidget(combo, 3, 1);
/** Inner window, titlebar and frame **************/
box = new QGroupBox(i18n("Inner Window, Titlebar && Frame"), this);
layout->addWidget(box);
box->setObjectName(QString::fromLatin1("Inner Window, Titlebar and Frame"));
box->setWhatsThis(i18n("Here you can customize KDE's behavior when clicking somewhere into"
" a window while pressing a modifier key."));
QHBoxLayout* innerLay = new QHBoxLayout(box);
QHBoxLayout* fLay = new QHBoxLayout;
gridLayout = new QGridLayout;
innerLay->addLayout(fLay);
innerLay->addLayout(gridLayout);
// Labels
strMouseButton1 = i18n("Left button:");
strAll1 = i18n("In this row you can customize left click behavior when clicking into"
" the titlebar or the frame.");
strMouseButton2 = i18n("Middle button:");
strAll2 = i18n("In this row you can customize middle click behavior when clicking into"
" the titlebar or the frame.");
strMouseButton3 = i18n("Right button:");
strAll3 = i18n("In this row you can customize right click behavior when clicking into"
" the titlebar or the frame.");
if (leftHandedMouse) {
qSwap(strMouseButton1, strMouseButton3);
qSwap(strAll1, strAll3);
}
// Combo's
combo = new KComboBox(box);
combo->addItem(i18n("Meta"));
combo->addItem(i18n("Alt"));
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coAllKey = combo;
combo->setWhatsThis(i18n("Here you select whether holding the Meta key or Alt key "
"will allow you to perform the following actions."));
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
label = new QLabel(i18n("Modifier key:"), this);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
label->setBuddy(combo);
fLay->addWidget(label);
fLay->addWidget(combo);
fLay->addWidget(new QLabel(" + ", this));
items.clear();
items << i18n("Move")
<< i18n("Activate, Raise and Move")
<< i18n("Toggle Raise & Lower")
<< i18n("Resize")
<< i18n("Raise")
<< i18n("Lower")
<< i18n("Minimize")
<< i18n("Nothing");
combo = new KComboBox(box);
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coAll1 = combo;
combo->setWhatsThis(strAll1);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
label = new QLabel(strMouseButton1, this);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
label->setBuddy(combo);
gridLayout->addWidget(label, 0, 0);
gridLayout->addWidget(combo, 0, 1);
combo = new KComboBox(box);
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coAll2 = combo;
combo->setWhatsThis(strAll2);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
label = new QLabel(strMouseButton2, this);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
label->setBuddy(combo);
gridLayout->addWidget(label, 1, 0);
gridLayout->addWidget(combo, 1, 1);
combo = new KComboBox(box);
combo->addItems(items);
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coAll3 = combo;
combo->setWhatsThis(strAll3);
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
label = new QLabel(strMouseButton3, this);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
label->setBuddy(combo);
gridLayout->addWidget(label, 2, 0);
gridLayout->addWidget(combo, 2, 1);
combo = new KComboBox(box);
combo->addItem(i18n("Raise/Lower"));
combo->addItem(i18n("Shade/Unshade"));
combo->addItem(i18n("Maximize/Restore"));
combo->addItem(i18n("Keep Above/Below"));
combo->addItem(i18n("Move to Previous/Next Desktop"));
combo->addItem(i18n("Change Opacity"));
combo->addItem(i18n("Switch to Window Tab to the Left/Right"));
combo->addItem(i18n("Nothing"));
connect(combo, SIGNAL(activated(int)), SLOT(changed()));
coAllW = combo;
combo->setWhatsThis(i18n("Here you can customize KDE's behavior when scrolling with the mouse wheel"
" in a window while pressing the modifier key."));
combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
label = new QLabel(i18n("Mouse wheel:"), this);
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
label->setBuddy(combo);
gridLayout->addWidget(label, 3, 0);
gridLayout->addWidget(combo, 3, 1);
layout->addStretch();
load();
}
KWindowActionsConfig::~KWindowActionsConfig()
{
2011-01-30 14:34:42 +00:00
if (standAlone)
delete config;
}
2011-01-30 14:34:42 +00:00
void KWindowActionsConfig::setComboText(KComboBox* combo, const char*txt)
{
2011-01-30 14:34:42 +00:00
if (combo == coWin1 || combo == coWin2 || combo == coWin3)
combo->setCurrentIndex(tbl_txt_lookup(tbl_Win, txt));
else if (combo == coWinWheel)
2011-01-30 14:34:42 +00:00
combo->setCurrentIndex(tbl_txt_lookup(tbl_WinWheel, txt));
else if (combo == coAllKey)
combo->setCurrentIndex(tbl_txt_lookup(tbl_AllKey, txt));
else if (combo == coAll1 || combo == coAll2 || combo == coAll3)
combo->setCurrentIndex(tbl_txt_lookup(tbl_All, txt));
else if (combo == coAllW)
combo->setCurrentIndex(tbl_txt_lookup(tbl_AllW, txt));
else
abort();
}
2011-01-30 14:34:42 +00:00
const char* KWindowActionsConfig::functionWin(int i)
{
2011-01-30 14:34:42 +00:00
return tbl_num_lookup(tbl_Win, i);
}
2011-01-30 14:34:42 +00:00
const char* KWindowActionsConfig::functionWinWheel(int i)
{
2011-01-30 14:34:42 +00:00
return tbl_num_lookup(tbl_WinWheel, i);
}
2011-01-30 14:34:42 +00:00
const char* KWindowActionsConfig::functionAllKey(int i)
{
2011-01-30 14:34:42 +00:00
return tbl_num_lookup(tbl_AllKey, i);
}
2011-01-30 14:34:42 +00:00
const char* KWindowActionsConfig::functionAll(int i)
{
2011-01-30 14:34:42 +00:00
return tbl_num_lookup(tbl_All, i);
}
const char* KWindowActionsConfig::functionAllW(int i)
{
2011-01-30 14:34:42 +00:00
return tbl_num_lookup(tbl_AllW, i);
}
2011-01-30 14:34:42 +00:00
void KWindowActionsConfig::showEvent(QShowEvent *ev)
{
2011-01-30 14:34:42 +00:00
if (!standAlone) {
QWidget::showEvent(ev);
return;
}
2011-01-30 14:34:42 +00:00
KCModule::showEvent(ev);
}
void KWindowActionsConfig::load()
{
2011-01-30 14:34:42 +00:00
KConfigGroup cg(config, "MouseBindings");
setComboText(coWin1, cg.readEntry("CommandWindow1", "Activate, raise and pass click").toAscii());
setComboText(coWin2, cg.readEntry("CommandWindow2", "Activate and pass click").toAscii());
setComboText(coWin3, cg.readEntry("CommandWindow3", "Activate and pass click").toAscii());
setComboText(coWinWheel, cg.readEntry("CommandWindowWheel", "Scroll").toAscii());
setComboText(coAllKey, cg.readEntry("CommandAllKey", "Alt").toAscii());
setComboText(coAll1, cg.readEntry("CommandAll1", "Move").toAscii());
setComboText(coAll2, cg.readEntry("CommandAll2", "Toggle raise and lower").toAscii());
setComboText(coAll3, cg.readEntry("CommandAll3", "Resize").toAscii());
setComboText(coAllW, cg.readEntry("CommandAllWheel", "Nothing").toAscii());
}
void KWindowActionsConfig::save()
{
2011-01-30 14:34:42 +00:00
KConfigGroup cg(config, "MouseBindings");
cg.writeEntry("CommandWindow1", functionWin(coWin1->currentIndex()));
cg.writeEntry("CommandWindow2", functionWin(coWin2->currentIndex()));
cg.writeEntry("CommandWindow3", functionWin(coWin3->currentIndex()));
cg.writeEntry("CommandWindowWheel", functionWinWheel(coWinWheel->currentIndex()));
cg.writeEntry("CommandAllKey", functionAllKey(coAllKey->currentIndex()));
cg.writeEntry("CommandAll1", functionAll(coAll1->currentIndex()));
cg.writeEntry("CommandAll2", functionAll(coAll2->currentIndex()));
cg.writeEntry("CommandAll3", functionAll(coAll3->currentIndex()));
cg.writeEntry("CommandAllWheel", functionAllW(coAllW->currentIndex()));
if (standAlone) {
config->sync();
// Send signal to all kwin instances
QDBusMessage message =
QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig");
QDBusConnection::sessionBus().send(message);
}
}
void KWindowActionsConfig::defaults()
{
2011-01-30 14:34:42 +00:00
setComboText(coWin1, "Activate, raise and pass click");
setComboText(coWin2, "Activate and pass click");
setComboText(coWin3, "Activate and pass click");
setComboText(coWinWheel, "Scroll");
setComboText(coAllKey, "Alt");
setComboText(coAll1, "Move");
setComboText(coAll2, "Toggle raise and lower");
setComboText(coAll3, "Resize");
setComboText(coAllW, "Nothing");
}