[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-devel
Subject: Re: Patch for accessibility bug
From: Olaf Jan Schmidt <olaf () amen-online ! de>
Date: 2002-10-23 13:52:13
[Download RAW message or body]
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
OK, here is a new patch in the proper format.
Thanks for explaining.
Jason Bainbridge wrote:
> On Wed, 23 Oct 2002 20:37, Olaf Jan Schmidt wrote:
> > This is the first time I have tried to write a bug fix for KDE, so
> > please don't be angry if the bug fix contains errors. (I have not
> > even learned C++ properly yet.)
>
> I believe the KDE standard for diff patches is for them to be in
> unified output format eg.
>
> diff -u old/kaccess.cpp new/kaccess.cpp --> kaccess_patch.diff
>
> It might be a good idea to re-do your patch like that so the developers
> will look at it. :)
- --
Meine Internetseiten:
http://www.GebetGenerator.de, http://www.amen-online.de
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org
iEYEARECAAYFAj22qZIACgkQoLYC8AehV8cr1ACePdzqP2yQM4J64KG/D7PbQTk7
z/QAn0fFl20XDtkCICoChGoEtjl1QDSP
=APZq
-----END PGP SIGNATURE-----
["kaccess.cpp" (text/x-c++src)]
#include <unistd.h>
#include <qtimer.h>
#include <qpainter.h>
#include <kdebug.h>
#include <kaudioplayer.h>
#include <kconfig.h>
#include <kglobal.h>
#include <kwinmodule.h>
#include <netwm.h>
#include "kaccess.moc"
KAccessApp::KAccessApp(bool allowStyles, bool GUIenabled)
: KUniqueApplication(allowStyles, GUIenabled), _artsBellBlocked(false),
overlay(0), wm(0)
{
// verify the Xlib has matching XKB extension
int major = XkbMajorVersion;
int minor = XkbMinorVersion;
if (!XkbLibraryVersion(&major, &minor))
{
kdError() << "Xlib XKB extension does not match" << endl;
exit(-1);
}
kdDebug() << "Xlib XKB extension major=" << major << " minor=" << minor << endl;
// verify the X server has matching XKB extension
// if yes, the XKB extension is initialized
int opcode_rtrn;
int error_rtrn;
if (!XkbQueryExtension(qt_xdisplay(), &opcode_rtrn, &xkb_opcode, &error_rtrn,
&major, &minor))
{
kdError() << "X server has not matching XKB extension" << endl;
exit(-1);
}
kdDebug() << "X server XKB extension major=" << major << " minor=" << minor << \
endl;
_activeWindow = wm.activeWindow();
connect(&wm, SIGNAL(activeWindowChanged(WId)), this, \
SLOT(activeWindowChanged(WId)));
artsBellTimer = new QTimer( this );
connect( artsBellTimer, SIGNAL( timeout() ), SLOT( slotArtsBellTimeout() ));
}
int KAccessApp::newInstance()
{
KGlobal::config()->reparseConfiguration();
readSettings();
return 0;
};
void KAccessApp::readSettings()
{
KConfig *config = KGlobal::config();
// bell ---------------------------------------------------------------
config->setGroup("Bell");
_systemBell = config->readBoolEntry("SystemBell", true);
_artsBell = config->readBoolEntry("ArtsBell", false);
_artsBellFile = config->readEntry("ArtsBellFile");
_visibleBell = config->readBoolEntry("VisibleBell", false);
_visibleBellInvert = config->readBoolEntry("VisibleBellInvert", false);
QColor def(Qt::red);
_visibleBellColor = config->readColorEntry("VisibleBellColor", &def);
_visibleBellPause = config->readNumEntry("VisibleBellPause", 500);
// select bell events if we need them
int state = (_artsBell || _visibleBell) ? XkbBellNotifyMask : 0;
XkbSelectEvents(qt_xdisplay(), XkbUseCoreKbd, XkbBellNotifyMask, state);
// deactivate system bell if not needed
if (!_systemBell)
XkbChangeEnabledControls(qt_xdisplay(), XkbUseCoreKbd, XkbAudibleBellMask, 0);
else
XkbChangeEnabledControls(qt_xdisplay(), XkbUseCoreKbd, XkbAudibleBellMask, \
XkbAudibleBellMask);
// keyboard -------------------------------------------------------------
config->setGroup("Keyboard");
// get keyboard state
XkbDescPtr xkb = XkbGetMap(qt_xdisplay(), 0, XkbUseCoreKbd);
if (!xkb)
return;
if (XkbGetControls(qt_xdisplay(), XkbAllControlsMask, xkb) != Success)
return;
// sticky keys
if (config->readBoolEntry("StickyKeys", false))
{
if (config->readBoolEntry("StickyKeysLatch", true))
xkb->ctrls->ax_options |= XkbAX_LatchToLockMask;
else
xkb->ctrls->ax_options &= ~XkbAX_LatchToLockMask;
xkb->ctrls->enabled_ctrls |= XkbStickyKeysMask;
}
else
xkb->ctrls->enabled_ctrls &= ~XkbStickyKeysMask;
// turn off two-keys-disable sticky keys option
xkb->ctrls->ax_options &= ~XkbAX_TwoKeysMask;
// turn off timeout
xkb->ctrls->enabled_ctrls &= ~XkbAccessXTimeoutMask;
// slow keys
if (config->readBoolEntry("SlowKeys", false))
{
xkb->ctrls->slow_keys_delay = config->readNumEntry("SlowKeysDelay", 500);
xkb->ctrls->enabled_ctrls |= XkbSlowKeysMask;
}
else
xkb->ctrls->enabled_ctrls &= ~XkbSlowKeysMask;
// bounce keys
if (config->readBoolEntry("BounceKeys", false))
{
xkb->ctrls->debounce_delay = config->readNumEntry("BounceKeysDelay", 500);
xkb->ctrls->enabled_ctrls |= XkbBounceKeysMask;
}
else
xkb->ctrls->enabled_ctrls &= ~XkbBounceKeysMask;
// mouse-by-keyboard ----------------------------------------------
config->setGroup("Mouse");
if (config->readBoolEntry("MouseKeys", false))
{
xkb->ctrls->mk_delay = config->readNumEntry("MKDelay", 160);
xkb->ctrls->mk_interval = config->readNumEntry("MKInterval", 5);
xkb->ctrls->mk_time_to_max = config->readNumEntry("MKTimeToMax", 1000);
xkb->ctrls->mk_max_speed = config->readNumEntry("MKMaxSpeed", 500);
xkb->ctrls->mk_curve = config->readNumEntry("MKCurve", 0);
xkb->ctrls->mk_dflt_btn = config->readNumEntry("MKDefaultButton", 0);
xkb->ctrls->enabled_ctrls |= XkbMouseKeysMask;
}
else
xkb->ctrls->enabled_ctrls &= ~XkbMouseKeysMask;
// set state
XkbSetControls(qt_xdisplay(), XkbControlsEnabledMask | XkbMouseKeysAccelMask | \
XkbStickyKeysMask, xkb);
// reset them after program exit
uint ctrls = XkbStickyKeysMask | XkbSlowKeysMask | XkbBounceKeysMask | \
XkbMouseKeysMask | XkbAudibleBellMask; uint values = XkbAudibleBellMask;
XkbSetAutoResetControls(qt_xdisplay(), ctrls, &ctrls, &values);
delete overlay;
overlay = 0;
}
bool KAccessApp::x11EventFilter(XEvent *event)
{
// handle XKB events
if (event->type == xkb_opcode)
{
XkbAnyEvent *ev = (XkbAnyEvent*) event;
if (ev->xkb_type == XkbBellNotify)
xkbBellNotify((XkbBellNotifyEvent*)event);
return true;
}
// process other events as usual
return KApplication::x11EventFilter(event);
}
void VisualBell::paintEvent(QPaintEvent *event)
{
QWidget::paintEvent(event);
QTimer::singleShot(_pause, this, SLOT(hide()));
}
void KAccessApp::activeWindowChanged(WId wid)
{
_activeWindow = wid;
}
void KAccessApp::xkbBellNotify(XkbBellNotifyEvent *event)
{
// bail out if we should not really ring
if (event->event_only)
return;
// flash the visible bell
if (_visibleBell)
{
// create overlay widget
if (!overlay)
overlay = new VisualBell(_visibleBellPause);
WId id = _activeWindow;
NETRect frame, window;
NETWinInfo net(qt_xdisplay(), id, desktop()->winId(), 0);
net.kdeGeometry(frame, window);
overlay->setGeometry(window.pos.x, window.pos.y, window.size.width, \
window.size.height);
if (_visibleBellInvert)
{
QPixmap screen = QPixmap::grabWindow(id, 0, 0, window.size.width, \
window.size.height); QPixmap invert(window.size.width, window.size.height);
QPainter p(&invert);
p.setRasterOp(QPainter::NotCopyROP);
p.drawPixmap(0, 0, screen);
overlay->setBackgroundPixmap(invert);
}
else
overlay->setBackgroundColor(_visibleBellColor);
// flash the overlay widget
overlay->raise();
overlay->show();
flushX();
}
// ask artsd to ring a nice bell
if (_artsBell && !_artsBellBlocked ) {
KAudioPlayer::play(_artsBellFile);
_artsBellBlocked = true;
artsBellTimer->start( 300, true );
}
}
void KAccessApp::slotArtsBellTimeout()
{
_artsBellBlocked = false;
}
>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic