kde-workspace/kcontrol/access/kcmaccess.cpp
Ivailo Monev 3cba95c89a generic: adjust to KIntNumInput and KDoubleNumInput changes
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2024-05-21 09:00:16 +03:00

788 lines
28 KiB
C++
Raw Permalink Blame History

/**
* kcmaccess.cpp
*
* Copyright (c) 2000 Matthias H<>zer-Klpfel
*
*/
#include <stdlib.h>
#include <math.h>
#include <QTabWidget>
#include <QLabel>
#include <QCheckBox>
#include <QLineEdit>
#include <QRadioButton>
#include <QtGui/qx11info_x11.h>
#include <QtDBus/QtDBus>
//Added by qt3to4:
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <klocale.h>
#include <KPluginFactory>
#include <kcombobox.h>
#include <kstandarddirs.h>
#include <kcolorbutton.h>
#include <kfiledialog.h>
#include <kapplication.h>
#include <kaboutdata.h>
#include <knotificationconfigwidget.h>
#include <kkeyserver.h>
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
#define XK_MISCELLANY
#define XK_XKB_KEYS
#include <X11/keysymdef.h>
#include <ktoolinvocation.h>
#include "moc_kcmaccess.cpp"
K_PLUGIN_FACTORY(KAccessConfigFactory, registerPlugin<KAccessConfig>();)
K_EXPORT_PLUGIN(KAccessConfigFactory("kcmaccess"))
QString mouseKeysShortcut (Display *display) {
// Calculate the keycode
KeySym sym = XK_MouseKeys_Enable;
KeyCode code = XKeysymToKeycode(display, sym);
if (code == 0) {
sym = XK_Pointer_EnableKeys;
code = XKeysymToKeycode(display, sym);
if (code == 0)
return ""; // No shortcut available?
}
// Calculate the modifiers by searching the keysym in the X keyboard mapping
XkbDescPtr xkbdesc = XkbGetMap(display, XkbKeyTypesMask | XkbKeySymsMask, XkbUseCoreKbd);
if (!xkbdesc)
return ""; // Failed to obtain the mapping from server
bool found = false;
unsigned char modifiers = 0;
int groups = XkbKeyNumGroups(xkbdesc, code);
for (int grp = 0; grp < groups && !found; grp++)
{
int levels = XkbKeyGroupWidth(xkbdesc, code, grp);
for (int level = 0; level < levels && !found; level++)
{
if (sym == XkbKeySymEntry(xkbdesc, code, level, grp))
{
// keysym found => determine modifiers
int typeIdx = xkbdesc->map->key_sym_map[code].kt_index[grp];
XkbKeyTypePtr type = &(xkbdesc->map->types[typeIdx]);
for (int i = 0; i < type->map_count && !found; i++)
{
if (type->map[i].active && (type->map[i].level == level))
{
modifiers = type->map[i].mods.mask;
found = true;
}
}
}
}
}
XkbFreeClientMap (xkbdesc, 0, true);
if (!found)
return ""; // Somehow the keycode -> keysym mapping is flawed
XEvent ev;
ev.type = KeyPress;
ev.xkey.display = display;
ev.xkey.keycode = code;
ev.xkey.state = 0;
int key;
KKeyServer::xEventToQt(&ev, &key);
QString keyname = QKeySequence(key).toString();
unsigned int AltMask = KKeyServer::modXAlt();
unsigned int WinMask = KKeyServer::modXMeta();
unsigned int NumMask = KKeyServer::modXNumLock();
unsigned int ScrollMask= KKeyServer::modXScrollLock();
unsigned int MetaMask = XkbKeysymToModifiers (display, XK_Meta_L);
unsigned int SuperMask = XkbKeysymToModifiers (display, XK_Super_L);
unsigned int HyperMask = XkbKeysymToModifiers (display, XK_Hyper_L);
unsigned int AltGrMask = XkbKeysymToModifiers (display, XK_Mode_switch)
| XkbKeysymToModifiers (display, XK_ISO_Level3_Shift)
| XkbKeysymToModifiers (display, XK_ISO_Level3_Latch)
| XkbKeysymToModifiers (display, XK_ISO_Level3_Lock);
unsigned int mods = ShiftMask | ControlMask | AltMask | WinMask
| LockMask | NumMask | ScrollMask;
AltGrMask &= ~mods;
MetaMask &= ~(mods | AltGrMask);
SuperMask &= ~(mods | AltGrMask | MetaMask);
HyperMask &= ~(mods | AltGrMask | MetaMask | SuperMask);
if ((modifiers & AltGrMask) != 0)
keyname = i18n("AltGraph") + '+' + keyname;
if ((modifiers & HyperMask) != 0)
keyname = i18n("Hyper") + '+' + keyname;
if ((modifiers & SuperMask) != 0)
keyname = i18n("Super") + '+' + keyname;
if ((modifiers & WinMask) != 0)
keyname = QKeySequence(Qt::META).toString() + '+' + keyname;
if ((modifiers & AltMask) != 0)
keyname = QKeySequence(Qt::ALT).toString() + '+' + keyname;
if ((modifiers & ControlMask) != 0)
keyname = QKeySequence(Qt::CTRL).toString() + '+' + keyname;
if ((modifiers & ShiftMask) != 0)
keyname = QKeySequence(Qt::SHIFT).toString() + '+' + keyname;
QString result;
if ((modifiers & ScrollMask) != 0)
if ((modifiers & LockMask) != 0)
if ((modifiers & NumMask) != 0)
result = i18n("Press %1 while NumLock, CapsLock and ScrollLock are active", keyname);
else
result = i18n("Press %1 while CapsLock and ScrollLock are active", keyname);
else if ((modifiers & NumMask) != 0)
result = i18n("Press %1 while NumLock and ScrollLock are active", keyname);
else
result = i18n("Press %1 while ScrollLock is active", keyname);
else if ((modifiers & LockMask) != 0)
if ((modifiers & NumMask) != 0)
result = i18n("Press %1 while NumLock and CapsLock are active", keyname);
else
result = i18n("Press %1 while CapsLock is active", keyname);
else if ((modifiers & NumMask) != 0)
result = i18n("Press %1 while NumLock is active", keyname);
else
result = i18n("Press %1", keyname);
return result;
}
KAccessConfig::KAccessConfig(QWidget *parent, const QVariantList& args)
: KCModule(KAccessConfigFactory::componentData(), parent, args)
{
KAboutData *about =
new KAboutData(I18N_NOOP("kaccess"), 0, ki18n("KDE Accessibility Tool"),
0, KLocalizedString(), KAboutData::License_GPL,
ki18n("(c) 2000, Matthias Hoelzer-Kluepfel"));
about->addAuthor(ki18n("Matthias Hoelzer-Kluepfel"), ki18n("Author") , "hoelzer@kde.org");
setAboutData( about );
QVBoxLayout *main = new QVBoxLayout(this);
main->setMargin(0);
QTabWidget *tab = new QTabWidget(this);
main->addWidget(tab);
// bell settings ---------------------------------------
QWidget *bell = new QWidget(this);
QVBoxLayout *vbox = new QVBoxLayout(bell);
QGroupBox *grp = new QGroupBox(i18n("Audible Bell"), bell);
QHBoxLayout *layout = new QHBoxLayout;
grp->setLayout(layout);
vbox->addWidget(grp);
QVBoxLayout *vvbox = new QVBoxLayout();
layout->addLayout( vvbox );
systemBell = new QCheckBox(i18n("Use &system bell"), grp);
vvbox->addWidget(systemBell);
customBell = new QCheckBox(i18n("Us&e customized bell"), grp);
vvbox->addWidget(customBell);
systemBell->setWhatsThis( i18n("If this option is checked, the default system bell will be used. See the"
" \"System Bell\" control module for how to customize the system bell."
" Normally, this is just a \"beep\".") );
customBell->setWhatsThis( i18n("<p>Check this option if you want to use a customized bell, playing"
" a sound file. If you do this, you will probably want to turn off the system bell.</p><p> Please note"
" that on slow machines this may cause a \"lag\" between the event causing the bell and the sound being played.</p>") );
QHBoxLayout *hbox = new QHBoxLayout();
vvbox->addLayout( hbox );
hbox->addSpacing(24);
soundEdit = new QLineEdit(grp);
soundLabel = new QLabel(i18n("Sound &to play:"), grp);
soundLabel->setBuddy(soundEdit);
hbox->addWidget(soundLabel);
hbox->addWidget(soundEdit);
soundButton = new QPushButton(i18n("Browse..."), grp);
hbox->addWidget(soundButton);
QString wtstr = i18n("If the option \"Use customized bell\" is enabled, you can choose a sound file here."
" Click \"Browse...\" to choose a sound file using the file dialog.");
soundEdit->setWhatsThis( wtstr );
soundLabel->setWhatsThis( wtstr );
soundButton->setWhatsThis( wtstr );
connect(soundButton, SIGNAL(clicked()), this, SLOT(selectSound()));
connect(customBell, SIGNAL(clicked()), this, SLOT(checkAccess()));
connect(systemBell, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(customBell, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(soundEdit, SIGNAL(textChanged(QString)), this, SLOT(configChanged()));
// -----------------------------------------------------
// visible bell ----------------------------------------
grp = new QGroupBox(i18n("Visible Bell"), bell);
layout = new QHBoxLayout;
grp->setLayout(layout);
vbox->addWidget(grp);
vvbox = new QVBoxLayout();
layout->addLayout( vvbox );
visibleBell = new QCheckBox(i18n("&Use visible bell"), grp);
vvbox->addWidget(visibleBell);
visibleBell->setWhatsThis( i18n("This option will turn on the \"visible bell\", i.e. a visible"
" notification shown every time that normally just a bell would occur. This is especially useful"
" for deaf people.") );
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
invertScreen = new QRadioButton(i18n("I&nvert screen"), grp);
hbox->addWidget(invertScreen);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
invertScreen->setWhatsThis( i18n("All screen colors will be inverted for the amount of time specified below.") );
hbox->addSpacing(24);
flashScreen = new QRadioButton(i18n("F&lash screen"), grp);
hbox->addWidget(flashScreen);
flashScreen->setWhatsThis( i18n("The screen will turn to a custom color for the amount of time specified below.") );
hbox->addSpacing(12);
colorButton = new KColorButton(grp);
colorButton->setFixedWidth(colorButton->sizeHint().height()*2);
hbox->addWidget(colorButton);
hbox->addStretch();
colorButton->setWhatsThis( i18n("Click here to choose the color used for the \"flash screen\" visible bell.") );
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
durationLabel = new QLabel(i18n("Duration:"), grp);
hbox->addWidget(durationLabel);
durationSlider = new KDoubleNumInput(grp);
durationSlider->setRange(100, 2000);
durationSlider->setSingleStep(100);
durationSlider->setDecimals(0);
durationSlider->setSuffix(i18n(" msec"));
hbox->addWidget(durationSlider);
durationSlider->setWhatsThis( i18n("Here you can customize the duration of the \"visible bell\" effect being shown.") );
connect(invertScreen, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(flashScreen, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(visibleBell, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(visibleBell, SIGNAL(clicked()), this, SLOT(checkAccess()));
connect(colorButton, SIGNAL(clicked()), this, SLOT(changeFlashScreenColor()));
connect(invertScreen, SIGNAL(clicked()), this, SLOT(invertClicked()));
connect(flashScreen, SIGNAL(clicked()), this, SLOT(flashClicked()));
connect(durationSlider, SIGNAL(valueChanged(double)), this, SLOT(configChanged()));
vbox->addStretch();
// -----------------------------------------------------
tab->addTab(bell, i18n("&Bell"));
// modifier key settings -------------------------------
QWidget *modifiers = new QWidget(this);
vbox = new QVBoxLayout(modifiers);
grp = new QGroupBox(i18n("S&ticky Keys"), modifiers);
layout = new QHBoxLayout;
grp->setLayout(layout);
vbox->addWidget(grp);
vvbox = new QVBoxLayout();
layout->addLayout(vvbox);
stickyKeys = new QCheckBox(i18n("Use &sticky keys"), grp);
vvbox->addWidget(stickyKeys);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
stickyKeysLock = new QCheckBox(i18n("&Lock sticky keys"), grp);
hbox->addWidget(stickyKeysLock);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
stickyKeysAutoOff = new QCheckBox(i18n("Turn sticky keys off when two keys are pressed simultaneously"), grp);
hbox->addWidget(stickyKeysAutoOff);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
stickyKeysBeep = new QCheckBox(i18n("Use system bell whenever a modifier gets latched, locked or unlocked"), grp);
hbox->addWidget(stickyKeysBeep);
grp = new QGroupBox(i18n("Locking Keys"), modifiers);
layout = new QHBoxLayout;
grp->setLayout(layout);
vbox->addWidget(grp);
vvbox = new QVBoxLayout();
layout->addLayout(vvbox);
toggleKeysBeep = new QCheckBox(i18n("Use system bell whenever a locking key gets activated or deactivated"), grp);
vvbox->addWidget(toggleKeysBeep);
kNotifyModifiers = new QCheckBox(i18n("Use KDE's system notification mechanism whenever a modifier or locking key changes its state"), grp);
vvbox->addWidget(kNotifyModifiers);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addStretch(1);
kNotifyModifiersButton = new QPushButton(i18n("Configure &Notifications..."), grp);
kNotifyModifiersButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
hbox->addWidget(kNotifyModifiersButton);
connect(stickyKeys, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(stickyKeysLock, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(stickyKeysAutoOff, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(stickyKeys, SIGNAL(clicked()), this, SLOT(checkAccess()));
connect(stickyKeysBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(toggleKeysBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(kNotifyModifiers, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(kNotifyModifiers, SIGNAL(clicked()), this, SLOT(checkAccess()));
connect(kNotifyModifiersButton, SIGNAL(clicked()), this, SLOT(configureKNotify()));
vbox->addStretch();
tab->addTab(modifiers, i18n("&Modifier Keys"));
// key filter settings ---------------------------------
QWidget *filters = new QWidget(this);
vbox = new QVBoxLayout(filters);
grp = new QGroupBox(i18n("Slo&w Keys"), filters);
layout = new QHBoxLayout;
grp->setLayout(layout);
vbox->addWidget(grp);
vvbox = new QVBoxLayout();
layout->addLayout(vvbox);
slowKeys = new QCheckBox(i18n("&Use slow keys"), grp);
vvbox->addWidget(slowKeys);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
slowKeysLabel = new QLabel(i18n("Acceptance dela&y:"), grp);
slowKeysLabel->setAlignment(Qt::AlignVCenter|Qt::AlignLeft);
hbox->addWidget(slowKeysLabel);
slowKeysDelay = new KDoubleNumInput(grp);
slowKeysDelay->setRange(50, 10000);
slowKeysDelay->setSingleStep(100);
slowKeysDelay->setDecimals(0);
slowKeysDelay->setSuffix(i18n(" msec"));
hbox->addWidget(slowKeysDelay);
slowKeysLabel->setBuddy(slowKeysDelay);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
slowKeysPressBeep = new QCheckBox(i18n("&Use system bell whenever a key is pressed"), grp);
hbox->addWidget(slowKeysPressBeep);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
slowKeysAcceptBeep = new QCheckBox(i18n("&Use system bell whenever a key is accepted"), grp);
hbox->addWidget(slowKeysAcceptBeep);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
slowKeysRejectBeep = new QCheckBox(i18n("&Use system bell whenever a key is rejected"), grp);
hbox->addWidget(slowKeysRejectBeep);
grp = new QGroupBox(i18n("Bounce Keys"), filters);
layout= new QHBoxLayout;
grp->setLayout(layout);
vbox->addWidget(grp);
vvbox = new QVBoxLayout();
layout->addLayout( vvbox );
bounceKeys = new QCheckBox(i18n("Use bou&nce keys"), grp);
vvbox->addWidget(bounceKeys);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
bounceKeysLabel = new QLabel(i18n("D&ebounce time:"), grp);
bounceKeysLabel->setAlignment(Qt::AlignVCenter|Qt::AlignLeft);
hbox->addWidget(bounceKeysLabel);
bounceKeysDelay = new KDoubleNumInput(grp);
bounceKeysDelay->setRange(100, 5000);
bounceKeysDelay->setSingleStep(100);
bounceKeysDelay->setDecimals(0);
bounceKeysDelay->setSuffix(i18n(" msec"));
hbox->addWidget(bounceKeysDelay);
bounceKeysLabel->setBuddy(bounceKeysDelay);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
bounceKeysRejectBeep = new QCheckBox(i18n("Use the system bell whenever a key is rejected"), grp);
hbox->addWidget(bounceKeysRejectBeep);
connect(slowKeysDelay, SIGNAL(valueChanged(double)), this, SLOT(configChanged()));
connect(slowKeys, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(slowKeys, SIGNAL(clicked()), this, SLOT(checkAccess()));
connect(slowKeysPressBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(slowKeysAcceptBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(slowKeysRejectBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(bounceKeysDelay, SIGNAL(valueChanged(double)), this, SLOT(configChanged()));
connect(bounceKeys, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(bounceKeysRejectBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(bounceKeys, SIGNAL(clicked()), this, SLOT(checkAccess()));
vbox->addStretch();
tab->addTab(filters, i18n("&Keyboard Filters"));
// gestures --------------------------------------------
QWidget *features = new QWidget(this);
vbox = new QVBoxLayout(features);
grp = new QGroupBox(i18n("Activation Gestures"), features);
layout = new QHBoxLayout;
grp->setLayout(layout);
vbox->addWidget(grp);
vvbox = new QVBoxLayout();
layout->addLayout( vvbox );
gestures = new QCheckBox(i18n("Use gestures for activating sticky keys and slow keys"), grp);
vvbox->addWidget(gestures);
QString shortcut = mouseKeysShortcut(x11Info().display());
if (shortcut.isEmpty())
gestures->setWhatsThis( i18n("Here you can activate keyboard gestures that turn on the following features: \n"
"Sticky keys: Press Shift key 5 consecutive times\n"
"Slow keys: Hold down Shift for 8 seconds"));
else
gestures->setWhatsThis( i18n("Here you can activate keyboard gestures that turn on the following features: \n"
"Mouse Keys: %1\n"
"Sticky keys: Press Shift key 5 consecutive times\n"
"Slow keys: Hold down Shift for 8 seconds", shortcut));
timeout = new QCheckBox(i18n("Turn sticky keys and slow keys off after a certain period of inactivity."), grp);
vvbox->addWidget(timeout);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addSpacing(24);
timeoutLabel = new QLabel(grp);
timeoutLabel->setAlignment(Qt::AlignVCenter|Qt::AlignLeft);
timeoutLabel->setText(i18n("Timeout:"));
hbox->addWidget(timeoutLabel);
timeoutDelay = new KIntNumInput(grp);
timeoutDelay->setSuffix(i18n(" min"));
timeoutDelay->setRange(1, 30);
timeoutDelay->setSingleStep(4);
hbox->addWidget(timeoutDelay);
timeoutLabel->setBuddy(timeoutDelay);
grp = new QGroupBox(i18n("Notification"), features);
layout = new QHBoxLayout;
grp->setLayout(layout);
vbox->addWidget(grp);
vvbox = new QVBoxLayout();
layout->addLayout(vvbox);
accessxBeep = new QCheckBox(i18n("Use the system bell whenever a gesture is used to turn an accessibility feature on or off"), grp);
vvbox->addWidget(accessxBeep);
gestureConfirmation = new QCheckBox(i18n("Show a confirmation dialog whenever a keyboard accessibility feature is turned on or off"), grp);
vvbox->addWidget(gestureConfirmation);
gestureConfirmation->setWhatsThis( i18n("If this option is checked, KDE will show a confirmation dialog whenever a keyboard accessibility feature is turned on or off.\nEnsure you know what you are doing if you uncheck it, as the keyboard accessibility settings will then always be applied without confirmation.") );
kNotifyAccessX = new QCheckBox(i18n("Use KDE's system notification mechanism whenever a keyboard accessibility feature is turned on or off"), grp);
vvbox->addWidget(kNotifyAccessX);
hbox = new QHBoxLayout();
vvbox->addLayout(hbox);
hbox->addStretch(1);
kNotifyAccessXButton = new QPushButton(i18n("Configure &Notifications..."), grp);
kNotifyAccessXButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
hbox->addWidget(kNotifyAccessXButton);
connect(gestures, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(timeout, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(timeout, SIGNAL(clicked()), this, SLOT(checkAccess()));
connect(timeoutDelay, SIGNAL(valueChanged(int)), this, SLOT(configChanged()));
connect(accessxBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(gestureConfirmation, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(kNotifyAccessX, SIGNAL(clicked()), this, SLOT(configChanged()));
connect(kNotifyAccessX, SIGNAL(clicked()), this, SLOT(checkAccess()));
connect(kNotifyAccessXButton, SIGNAL(clicked()), this, SLOT(configureKNotify()));
vbox->addStretch();
tab->addTab(features, i18n("Activation Gestures"));
}
KAccessConfig::~KAccessConfig()
{
}
void KAccessConfig::configureKNotify()
{
KNotificationConfigWidget::configure("kaccess", this);
}
void KAccessConfig::changeFlashScreenColor()
{
invertScreen->setChecked(false);
flashScreen->setChecked(true);
configChanged();
}
void KAccessConfig::selectSound()
{
QStringList list = KGlobal::dirs()->findDirs("sound", "");
QString start;
if (list.count()>0)
start = list[0];
QString fname = KFileDialog::getOpenFileName(start, "audio/x-wav audio/ogg");
if (!fname.isEmpty())
soundEdit->setText(fname);
}
void KAccessConfig::configChanged()
{
emit changed(true);
}
void KAccessConfig::load()
{
KConfigGroup cg(KSharedConfig::openConfig("kaccessrc"), "Bell");
systemBell->setChecked(cg.readEntry("SystemBell", true));
customBell->setChecked(cg.readEntry("ArtsBell", false));
soundEdit->setText(cg.readPathEntry("ArtsBellFile", QString()));
visibleBell->setChecked(cg.readEntry("VisibleBell", false));
invertScreen->setChecked(cg.readEntry("VisibleBellInvert", true));
flashScreen->setChecked(!invertScreen->isChecked());
colorButton->setColor(cg.readEntry("VisibleBellColor", QColor(Qt::red)));
durationSlider->setValue(cg.readEntry("VisibleBellPause", 500));
KConfigGroup keyboardGroup(KSharedConfig::openConfig("kaccessrc"),"Keyboard");
stickyKeys->setChecked(keyboardGroup.readEntry("StickyKeys", false));
stickyKeysLock->setChecked(keyboardGroup.readEntry("StickyKeysLatch", true));
stickyKeysAutoOff->setChecked(keyboardGroup.readEntry("StickyKeysAutoOff", false));
stickyKeysBeep->setChecked(keyboardGroup.readEntry("StickyKeysBeep", true));
toggleKeysBeep->setChecked(keyboardGroup.readEntry("ToggleKeysBeep", false));
kNotifyModifiers->setChecked(keyboardGroup.readEntry("kNotifyModifiers", false));
slowKeys->setChecked(keyboardGroup.readEntry("SlowKeys", false));
slowKeysDelay->setValue(keyboardGroup.readEntry("SlowKeysDelay", 500));
slowKeysPressBeep->setChecked(keyboardGroup.readEntry("SlowKeysPressBeep", true));
slowKeysAcceptBeep->setChecked(keyboardGroup.readEntry("SlowKeysAcceptBeep", true));
slowKeysRejectBeep->setChecked(keyboardGroup.readEntry("SlowKeysRejectBeep", true));
bounceKeys->setChecked(keyboardGroup.readEntry("BounceKeys", false));
bounceKeysDelay->setValue(keyboardGroup.readEntry("BounceKeysDelay", 500));
bounceKeysRejectBeep->setChecked(keyboardGroup.readEntry("BounceKeysRejectBeep", true));
gestures->setChecked(keyboardGroup.readEntry("Gestures", false));
timeout->setChecked(keyboardGroup.readEntry("AccessXTimeout", false));
timeoutDelay->setValue(keyboardGroup.readEntry("AccessXTimeoutDelay", 30));
accessxBeep->setChecked(keyboardGroup.readEntry("AccessXBeep", true));
gestureConfirmation->setChecked(keyboardGroup.readEntry("GestureConfirmation", false));
kNotifyAccessX->setChecked(keyboardGroup.readEntry("kNotifyAccessX", false));
checkAccess();
emit changed(false);
}
void KAccessConfig::save()
{
KConfigGroup cg(KSharedConfig::openConfig("kaccessrc"), "Bell");
cg.writeEntry("SystemBell", systemBell->isChecked());
cg.writeEntry("ArtsBell", customBell->isChecked());
cg.writePathEntry("ArtsBellFile", soundEdit->text());
cg.writeEntry("VisibleBell", visibleBell->isChecked());
cg.writeEntry("VisibleBellInvert", invertScreen->isChecked());
cg.writeEntry("VisibleBellColor", colorButton->color());
cg.writeEntry("VisibleBellPause", durationSlider->value());
KConfigGroup keyboardGroup(KSharedConfig::openConfig("kaccessrc"),"Keyboard");
keyboardGroup.writeEntry("StickyKeys", stickyKeys->isChecked());
keyboardGroup.writeEntry("StickyKeysLatch", stickyKeysLock->isChecked());
keyboardGroup.writeEntry("StickyKeysAutoOff", stickyKeysAutoOff->isChecked());
keyboardGroup.writeEntry("StickyKeysBeep", stickyKeysBeep->isChecked());
keyboardGroup.writeEntry("ToggleKeysBeep", toggleKeysBeep->isChecked());
keyboardGroup.writeEntry("kNotifyModifiers", kNotifyModifiers->isChecked());
keyboardGroup.writeEntry("SlowKeys", slowKeys->isChecked());
keyboardGroup.writeEntry("SlowKeysDelay", slowKeysDelay->value());
keyboardGroup.writeEntry("SlowKeysPressBeep", slowKeysPressBeep->isChecked());
keyboardGroup.writeEntry("SlowKeysAcceptBeep", slowKeysAcceptBeep->isChecked());
keyboardGroup.writeEntry("SlowKeysRejectBeep", slowKeysRejectBeep->isChecked());
keyboardGroup.writeEntry("BounceKeys", bounceKeys->isChecked());
keyboardGroup.writeEntry("BounceKeysDelay", bounceKeysDelay->value());
keyboardGroup.writeEntry("BounceKeysRejectBeep", bounceKeysRejectBeep->isChecked());
keyboardGroup.writeEntry("Gestures", gestures->isChecked());
keyboardGroup.writeEntry("AccessXTimeout", timeout->isChecked());
keyboardGroup.writeEntry("AccessXTimeoutDelay", timeoutDelay->value());
keyboardGroup.writeEntry("AccessXBeep", accessxBeep->isChecked());
keyboardGroup.writeEntry("GestureConfirmation", gestureConfirmation->isChecked());
keyboardGroup.writeEntry("kNotifyAccessX", kNotifyAccessX->isChecked());
cg.sync();
keyboardGroup.sync();
if (systemBell->isChecked() ||
customBell->isChecked() ||
visibleBell->isChecked())
{
KConfig _cfg("kdeglobals", KConfig::NoGlobals);
KConfigGroup cfg(&_cfg, "General");
cfg.writeEntry("UseSystemBell", true);
cfg.sync();
}
// make kaccess reread the configuration
// turning a11y features off needs to be done by kaccess
// so run it to clear any enabled features and it will exit if it should
KToolInvocation::self()->startProgram("kaccess");
emit changed(false);
}
void KAccessConfig::defaults()
{
systemBell->setChecked(true);
customBell->setChecked(false);
soundEdit->setText("");
visibleBell->setChecked(false);
invertScreen->setChecked(true);
flashScreen->setChecked(false);
colorButton->setColor(QColor(Qt::red));
durationSlider->setValue(500);
slowKeys->setChecked(false);
slowKeysDelay->setValue(500);
slowKeysPressBeep->setChecked(true);
slowKeysAcceptBeep->setChecked(true);
slowKeysRejectBeep->setChecked(true);
bounceKeys->setChecked(false);
bounceKeysDelay->setValue(500);
bounceKeysRejectBeep->setChecked(true);
stickyKeys->setChecked(false);
stickyKeysLock->setChecked(true);
stickyKeysAutoOff->setChecked(false);
stickyKeysBeep->setChecked(true);
toggleKeysBeep->setChecked(false);
kNotifyModifiers->setChecked(false);
gestures->setChecked(false);
timeout->setChecked(false);
timeoutDelay->setValue(30);
accessxBeep->setChecked(true);
gestureConfirmation->setChecked(true);
kNotifyAccessX->setChecked(false);
checkAccess();
emit changed(true);
}
void KAccessConfig::invertClicked()
{
flashScreen->setChecked(false);
}
void KAccessConfig::flashClicked()
{
invertScreen->setChecked(false);
}
void KAccessConfig::checkAccess()
{
bool custom = customBell->isChecked();
soundEdit->setEnabled(custom);
soundButton->setEnabled(custom);
soundLabel->setEnabled(custom);
bool visible = visibleBell->isChecked();
invertScreen->setEnabled(visible);
flashScreen->setEnabled(visible);
colorButton->setEnabled(visible);
durationLabel->setEnabled(visible);
durationSlider->setEnabled(visible);
bool sticky = stickyKeys->isChecked();
stickyKeysLock->setEnabled(sticky);
stickyKeysAutoOff->setEnabled(sticky);
stickyKeysBeep->setEnabled(sticky);
bool slow = slowKeys->isChecked();
slowKeysLabel->setEnabled(slow);
slowKeysDelay->setEnabled(slow);
slowKeysPressBeep->setEnabled(slow);
slowKeysAcceptBeep->setEnabled(slow);
slowKeysRejectBeep->setEnabled(slow);
bool bounce = bounceKeys->isChecked();
bounceKeysLabel->setEnabled(bounce);
bounceKeysDelay->setEnabled(bounce);
bounceKeysRejectBeep->setEnabled(bounce);
bool useTimeout = timeout->isChecked();
timeoutLabel->setEnabled(useTimeout);
timeoutDelay->setEnabled(useTimeout);
}