lyx_mirror/src/frontends/qt4/CustomizedWidgets.cpp
Jean-Marc Lasgouttes 5784b88f65 Patch from Ben M.: do not accept key events if we do not know what these keys
stand for.

This fixes bug #6043: Windows multimedia keys intercepted



git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@30389 a592a061-630c-0410-9148-cb99ea01b6c8
2009-07-06 16:14:20 +00:00

162 lines
3.2 KiB
C++

/**
* \file GuiPrefs.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Bo Peng
* \author Edwin Leuven
* \author Jürgen Spitzmüller
*
* Full author contact details are available in file CREDITS.
*/
/*
The code for the ShortcutWidget class was adapted from
kkeysequencewidget.cpp, which is part of the KDE libraries.
Copyright (C) 1998 Mark Donohoe <donohoe@kde.org>
Copyright (C) 2001 Ellis Whitehead <ellis@kde.org>
Copyright (C) 2007 Andreas Hartmetz <ahartmetz@gmail.com>
Licensed under version 2 of the General Public License and
used here in accordance with the terms of that license.
*/
#include <config.h>
#include "CustomizedWidgets.h"
#include "FuncRequest.h"
#include "GuiKeySymbol.h"
#include <QApplication>
#include <QKeyEvent>
#include <QMouseEvent>
#include <QShowEvent>
#include "support/qstring_helpers.h"
using lyx::KeySymbol;
using lyx::KeySequence;
using lyx::KeyModifier;
using lyx::toqstr;
namespace lyx {
namespace frontend {
ShortcutWidget::ShortcutWidget(QWidget * parent)
: QLabel(parent), keysequence_()
{
QApplication::instance()->installEventFilter(this);
has_cursor_ = false;
setFrameShape(QFrame::Panel);
setFrameShadow(QFrame::Raised);
setLineWidth(3);
setFocusPolicy(Qt::StrongFocus);
setAlignment(Qt::AlignCenter);
}
void ShortcutWidget::reset()
{
clear();
keysequence_ = KeySequence();
}
bool ShortcutWidget::eventFilter(QObject * obj, QEvent * e)
{
if (!has_cursor_)
return false;
switch (e->type()) {
// swallow these if we have focus and they come from elsewhere
case QEvent::Shortcut:
case QEvent::ShortcutOverride:
if (obj != this)
return true;
default:
break;
}
return false;
}
KeySequence const ShortcutWidget::getKeySequence() const
{
return keysequence_;
}
void ShortcutWidget::setKeySequence(lyx::KeySequence const s)
{
keysequence_ = s;
}
void ShortcutWidget::keyPressEvent(QKeyEvent * e)
{
int const keyQt = e->key();
if (!keyQt)
return;
switch(keyQt) {
case Qt::Key_AltGr: //or else we get unicode salad
case Qt::Key_Shift:
case Qt::Key_Control:
case Qt::Key_Alt:
case Qt::Key_Meta:
break;
default:
appendToSequence(e);
setText(toqstr(keysequence_.print(KeySequence::ForGui)));
}
}
bool ShortcutWidget::event(QEvent * e)
{
switch (e->type()) {
case QEvent::FocusOut:
has_cursor_ = false;
setFrameShadow(QFrame::Raised);
break;
case QEvent::FocusIn:
has_cursor_ = true;
setFrameShadow(QFrame::Sunken);
break;
case QEvent::ShortcutOverride:
keyPressEvent(static_cast<QKeyEvent *>(e));
return true;
case QEvent::KeyRelease:
case QEvent::Shortcut:
case QEvent::KeyPress:
return true;
default:
break;
}
return QLabel::event(e);
}
void ShortcutWidget::appendToSequence(QKeyEvent * e)
{
KeySymbol sym;
setKeySymbol(&sym, e);
if (sym.isOK()) {
KeyModifier mod = lyx::q_key_state(e->modifiers());
keysequence_.addkey(sym, mod, lyx::NoModifier);
}
}
void ShortcutWidget::removeFromSequence()
{
keysequence_.removeKey();
setText(toqstr(keysequence_.print(KeySequence::ForGui)));
}
} // namespace frontend
} // namespace lyx
#include "moc_CustomizedWidgets.cpp"