/** * kcmaccess.cpp * * Copyright (c) 2000 Matthias H�zer-Klpfel * */ #include #include #include #include #include #include #include #include #include //Added by qt3to4: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define XK_MISCELLANY #define XK_XKB_KEYS #include #include #include "moc_kcmaccess.cpp" K_PLUGIN_FACTORY(KAccessConfigFactory, registerPlugin();) 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("

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.

Please note" " that on slow machines this may cause a \"lag\" between the event causing the bell and the sound being played.

") ); 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); }