From kde-core-devel Wed Dec 15 15:38:39 2004 From: Gunnar Schmi Dt Date: Wed, 15 Dec 2004 15:38:39 +0000 To: kde-core-devel Subject: Keyboard gestures for enabling AccessX features Message-Id: <200412151638.47915.gunnar () schmi-dt ! de> X-MARC-Message: https://marc.info/?l=kde-core-devel&m=110312516912810 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--nextPart1288761.enJ3z4GRSc" --nextPart1288761.enJ3z4GRSc Content-Type: multipart/mixed; boundary="Boundary-01=_/pFwBfY3uZVpg2h" Content-Transfer-Encoding: 7bit Content-Disposition: inline --Boundary-01=_/pFwBfY3uZVpg2h Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Hello, Attached you can find a patch that enables keyboard gestures for AccessX=20 features: Mouse Keys: Press Alt+left Shift+Num Lock simultaneously Sticky keys: Press Shift key 5 consecutive times Slow keys: Hold down Shift for 8 seconds These gestures are also available under GNOME and other window managers=20 (actually they are defined by X). If there are no objections I will commit this patch tomorrow evening (so=20 that is in CVS before the freeze starts). Gunnar Schmi Dt P.S. Sorry for the cross-posting, but this is relevant to two mailing lists. =2D-=20 Co-maintainer of the KDE Accessibility Project Maintainer of the kdeaccessibility package http://accessibility.kde.org/ --Boundary-01=_/pFwBfY3uZVpg2h Content-Type: text/x-diff; charset="us-ascii"; name="accessx.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="accessx.patch" Index: kcontrol/access/kaccess.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /home/kde/kdebase/kcontrol/access/kaccess.cpp,v retrieving revision 1.20 diff -u -p -r1.20 kaccess.cpp =2D-- kcontrol/access/kaccess.cpp 26 Oct 2003 23:38:39 -0000 1.20 +++ kcontrol/access/kaccess.cpp 15 Dec 2004 15:23:51 -0000 @@ -4,11 +4,12 @@ #include #include =20 =2D +#include #include #include #include #include +#include #include =20 =20 @@ -46,6 +47,8 @@ KAccessApp::KAccessApp(bool allowStyles, =20 artsBellTimer =3D new QTimer( this ); connect( artsBellTimer, SIGNAL( timeout() ), SLOT( slotArtsBellTimeout()= )); + + features =3D 0; } =20 int KAccessApp::newInstance() @@ -112,22 +115,21 @@ void KAccessApp::readSettings() =20 // slow keys if (config->readBoolEntry("SlowKeys", false)) =2D { =2D xkb->ctrls->slow_keys_delay =3D config->readNumEntry("SlowKeysDela= y", 500); xkb->ctrls->enabled_ctrls |=3D XkbSlowKeysMask; =2D } else xkb->ctrls->enabled_ctrls &=3D ~XkbSlowKeysMask; + xkb->ctrls->slow_keys_delay =3D config->readNumEntry("SlowKeysDelay", 50= 0); =20 // bounce keys if (config->readBoolEntry("BounceKeys", false)) =2D { =2D xkb->ctrls->debounce_delay =3D config->readNumEntry("BounceKeysDel= ay", 500); xkb->ctrls->enabled_ctrls |=3D XkbBounceKeysMask; =2D } else xkb->ctrls->enabled_ctrls &=3D ~XkbBounceKeysMask; + xkb->ctrls->debounce_delay =3D config->readNumEntry("BounceKeysDelay", 5= 00); =20 + // gestures for enabling the other features + if (config->readBoolEntry("Gestures", true)) + xkb->ctrls->enabled_ctrls |=3D XkbAccessXKeysMask; =20 // mouse-by-keyboard ---------------------------------------------- =20 @@ -147,11 +149,18 @@ void KAccessApp::readSettings() else xkb->ctrls->enabled_ctrls &=3D ~XkbMouseKeysMask; =20 + features =3D xkb->ctrls->enabled_ctrls & (XkbSlowKeysMask | XkbBounceKe= ysMask | XkbStickyKeysMask | XkbMouseKeysMask); // set state =2D XkbSetControls(qt_xdisplay(), XkbControlsEnabledMask | XkbMouseKeysAcc= elMask | XkbStickyKeysMask, xkb); + XkbSetControls(qt_xdisplay(), XkbControlsEnabledMask | XkbMouseKeysAccel= Mask | XkbStickyKeysMask | XkbAccessXKeysMask, xkb); + + // select AccessX events if we need them + config->setGroup("Keyboard"); + bool gestures =3D config->readBoolEntry("Gestures", true); + state =3D gestures ? XkbControlsNotifyMask : 0; + XkbSelectEvents(qt_xdisplay(), XkbUseCoreKbd, XkbControlsNotifyMask, sta= te); =20 // reset them after program exit =2D uint ctrls =3D XkbStickyKeysMask | XkbSlowKeysMask | XkbBounceKeysMask= | XkbMouseKeysMask | XkbAudibleBellMask; + uint ctrls =3D XkbStickyKeysMask | XkbSlowKeysMask | XkbBounceKeysMask |= XkbMouseKeysMask | XkbAudibleBellMask | XkbControlsNotifyMask; uint values =3D XkbAudibleBellMask; XkbSetAutoResetControls(qt_xdisplay(), ctrls, &ctrls, &values); =20 @@ -169,6 +178,8 @@ bool KAccessApp::x11EventFilter(XEvent * =20 if (ev->xkb_type =3D=3D XkbBellNotify) xkbBellNotify((XkbBellNotifyEvent*)event); + else if (ev->xkb_type =3D=3D XkbControlsNotify) + xkbControlsNotify((XkbControlsNotifyEvent*)event); =20 return true; } @@ -239,6 +250,138 @@ void KAccessApp::xkbBellNotify(XkbBellNo } } =20 +void KAccessApp::xkbControlsNotify(XkbControlsNotifyEvent *event) +{ + unsigned int newFeatures =3D event->enabled_ctrls & (XkbSlowKeysMask | = XkbBounceKeysMask | XkbStickyKeysMask | XkbMouseKeysMask); + if (newFeatures !=3D features) { + unsigned int enabled =3D newFeatures & ~features; + unsigned int disabled =3D features & ~newFeatures; + features =3D newFeatures; + + QString message; + if (disabled =3D=3D 0) { + switch (enabled) { + case 0: + message =3D i18n("Nothing happend?"); + break; + case XkbSlowKeysMask: + message =3D i18n("Slow keys is now enabled.\n" + "This may be because you hold down the Shift key for 8 seconds " + "or because some application has enabed this feature.\n" + "You can configure slow keys and similar features in the " + "Regional & Accessibility->Accessibility module of the " + "KDE Control Center.\n" + "To quickly disable slow keys, press the Shift key for another = 8 seconds."); + break; + case XkbBounceKeysMask: + message =3D i18n("Bounce keys is now enabled.\n" + "This may be because some application has enabed this feature.\= n" + "You can configure bounce keys and similar features in the " + "Regional & Accessibility->Accessibility module of the " + "KDE Control Center."); + break; + case XkbStickyKeysMask: + message =3D i18n("Sticky keys is now enabled.\n" + "This may be because you pressed the Shift key 5 consecutive " + "times or because some application has enabed this feature.\n" + "You can configure sticky keys and similar features in the " + "Regional & Accessibility->Accessibility module of the " + "KDE Control Center.\n" + "To quickly disable sticky keys, press the Shift key for anothe= r 5 times."); + break; + case XkbMouseKeysMask: + message =3D i18n("Mouse keys is now enabled.\n" + "This may be because you pressed Alt+left Shift+Num Lock " + "or because some application has enabed this feature.\n" + "You can configure sticky keys and similar features in the " + "Regional & Accessibility->Accessibility module of the " + "KDE Control Center.\n" + "To quickly disable mouse keys, press Alt+left Shift+Num Lock a= gain."); + break; + default: + message =3D i18n("Multiple AccessX features have been enabled.\= n" + "This may be because some application has enabed these features= =2E\n" + "You can configure them in the " + "Regional & Accessibility->Accessibility module of the " + "KDE Control Center."); + } + } + else if (enabled =3D=3D 0) { + switch (disabled) { + case XkbSlowKeysMask: + message =3D i18n("Slow keys is now disabled.\n" + "This may be because you hold down the Shift key for 8 seconds " + "or because some application has disabed this feature.\n" + "You can configure slow keys and similar features in the " + "Regional & Accessibility->Accessibility module of the " + "KDE Control Center."); + break; + case XkbBounceKeysMask: + message =3D i18n("Bounce keys is now disabled.\n" + "This may be because some application has disabed this feature.= \n" + "You can configure bounce keys and similar features in the " + "Regional & Accessibility->Accessibility module of the " + "KDE Control Center."); + break; + case XkbStickyKeysMask: + message =3D i18n("Sticky keys is now disabled.\n" + "This may be because you pressed the Shift key 5 consecutive " + "times or because some application has disabed this feature.\n" + "You can configure sticky keys and similar features in the " + "Regional & Accessibility->Accessibility module of the " + "KDE Control Center."); + break; + case XkbMouseKeysMask: + message =3D i18n("Mouse keys is now disabled.\n" + "This may be because you pressed Alt+left Shift+Num Lock " + "or because some application has disabed this feature.\n" + "You can configure sticky keys and similar features in the " + "Regional & Accessibility->Accessibility module of the " + "KDE Control Center."); + break; + default: + message =3D i18n("Multiple AccessX features have been disabled.= \n" + "This may be because some application has disabed these feature= s.\n" + "You can configure them in the " + "Regional & Accessibility->Accessibility module of the " + "KDE Control Center."); + } + } + else + message =3D i18n("Multiple AccessX features have been changed."); + + KMessageBox::information (0, message, "Accessibility"); + =20 + KConfig *config =3D KGlobal::config(); + + config->setGroup("Keyboard"); + + if (enabled & XkbSlowKeysMask) + config->writeEntry("SlowKeys", true); + else if (enabled & XkbSlowKeysMask) + config->writeEntry("SlowKeys", false); + + if (enabled & XkbBounceKeysMask) + config->writeEntry("BounceKeys", true); + else if (enabled & XkbBounceKeysMask) + config->writeEntry("BounceKeys", false); + + if (enabled & XkbStickyKeysMask) + config->writeEntry("StickyKeys", true); + else if (enabled & XkbStickyKeysMask) + config->writeEntry("StickyKeys", false); + + config->setGroup("Mouse"); + + if (enabled & XkbMouseKeysMask) + config->writeEntry("MouseKeys", true); + else if (disabled & XkbMouseKeysMask) + config->writeEntry("MouseKeys", false); + + config->sync(); + } +} + void KAccessApp::slotArtsBellTimeout() { _artsBellBlocked =3D false; Index: kcontrol/access/kaccess.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /home/kde/kdebase/kcontrol/access/kaccess.h,v retrieving revision 1.8 diff -u -p -r1.8 kaccess.h =2D-- kcontrol/access/kaccess.h 9 Oct 2003 12:35:59 -0000 1.8 +++ kcontrol/access/kaccess.h 15 Dec 2004 15:23:51 -0000 @@ -34,6 +34,7 @@ protected: void readSettings(); =20 void xkbBellNotify(XkbBellNotifyEvent *event); + void xkbControlsNotify(XkbControlsNotifyEvent *event); =20 =20 private slots: @@ -45,6 +46,7 @@ private slots: private: =20 int xkb_opcode; + unsigned int features; =20 bool _systemBell, _artsBell, _visibleBell, _visibleBellInvert; bool _artsBellBlocked; Index: kcontrol/access/kcmaccess.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /home/kde/kdebase/kcontrol/access/kcmaccess.cpp,v retrieving revision 1.38 diff -u -p -r1.38 kcmaccess.cpp =2D-- kcontrol/access/kcmaccess.cpp 22 Nov 2004 03:00:06 -0000 1.38 +++ kcontrol/access/kcmaccess.cpp 15 Dec 2004 15:23:51 -0000 @@ -235,6 +235,18 @@ KAccessConfig::KAccessConfig(QWidget *pa bounceKeysDelay->setLabel(i18n("D&elay:")); hbox->addWidget(bounceKeysDelay); =20 + grp =3D new QGroupBox(i18n("Activation Gestures"), keys); + grp->setColumnLayout( 0, Qt::Horizontal ); + vbox->addWidget(grp); + + vvbox =3D new QVBoxLayout(grp->layout(), KDialog::spacingHint()); + + gestures =3D new QCheckBox(i18n("Use gestures for activating the above f= eatures"), grp); + vvbox->addWidget(gestures); + QWhatsThis::add( gestures, i18n("Here you can activate keyboard gestures= that turn on the following features: \n" + "Mouse Keys: Press Alt+left Shift+Num Lock simultaneously\n" + "Sticky keys: Press Shift key 5 consecutive times\n" + "Slow keys: Hold down Shift for 8 seconds") ); =20 connect(stickyKeys, SIGNAL(clicked()), this, SLOT(configChanged())); connect(stickyKeysLock, SIGNAL(clicked()), this, SLOT(configChanged())); @@ -247,6 +259,8 @@ KAccessConfig::KAccessConfig(QWidget *pa connect(bounceKeys, SIGNAL(clicked()), this, SLOT(configChanged())); connect(bounceKeys, SIGNAL(clicked()), this, SLOT(checkAccess())); =20 + connect(gestures, SIGNAL(clicked()), this, SLOT(configChanged())); + vbox->addStretch(); =20 tab->addTab(keys, i18n("&Keyboard")); @@ -312,6 +326,7 @@ void KAccessConfig::load() slowKeysDelay->setValue(config->readNumEntry("SlowKeysDelay", 500)); bounceKeys->setChecked(config->readBoolEntry("BounceKeys", false)); bounceKeysDelay->setValue(config->readNumEntry("BounceKeysDelay", 500)); + gestures->setChecked(config->readBoolEntry("Gestures", true)); =20 =20 delete config; @@ -349,6 +364,8 @@ void KAccessConfig::save() =20 config->writeEntry("BounceKeys", bounceKeys->isChecked()); config->writeEntry("BounceKeysDelay", bounceKeysDelay->value()); + =20 + config->writeEntry("Gestures", gestures->isChecked()); =20 =20 config->sync(); @@ -398,9 +415,11 @@ void KAccessConfig::defaults() bounceKeys->setChecked(false); bounceKeysDelay->setValue(500); =20 =2D stickyKeys->setChecked(true); + stickyKeys->setChecked(false); stickyKeysLock->setChecked(true); =20 + gestures->setChecked(true); + checkAccess(); =20 emit changed(true); Index: kcontrol/access/kcmaccess.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /home/kde/kdebase/kcontrol/access/kcmaccess.h,v retrieving revision 1.7 diff -u -p -r1.7 kcmaccess.h =2D-- kcontrol/access/kcmaccess.h 18 Jul 2004 23:05:37 -0000 1.7 +++ kcontrol/access/kcmaccess.h 15 Dec 2004 15:23:51 -0000 @@ -59,7 +59,8 @@ private: =20 QCheckBox *slowKeys, *bounceKeys; =20 KIntNumInput *slowKeysDelay, *bounceKeysDelay; =2D + =20 + QCheckBox *gestures; }; =20 =20 --Boundary-01=_/pFwBfY3uZVpg2h-- --nextPart1288761.enJ3z4GRSc Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) iD4DBQBBwFqHsxZ93p+gHn4RAqb+AJiTK7vOpxL7HYZ54Mu0LcOKHFgDAJ9ANGMn PSYUpP1Fq4nno3YtftEmDw== =bMug -----END PGP SIGNATURE----- --nextPart1288761.enJ3z4GRSc--