summaryrefslogtreecommitdiffstats
path: root/kdeui/kshortcutdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdeui/kshortcutdialog.cpp')
-rw-r--r--kdeui/kshortcutdialog.cpp529
1 files changed, 0 insertions, 529 deletions
diff --git a/kdeui/kshortcutdialog.cpp b/kdeui/kshortcutdialog.cpp
deleted file mode 100644
index fbdd46519..000000000
--- a/kdeui/kshortcutdialog.cpp
+++ /dev/null
@@ -1,529 +0,0 @@
-/* This file is part of the KDE libraries
- Copyright (C) 2002,2003 Ellis Whitehead <ellis@kde.org>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include "kshortcutdialog.h"
-
-#include <tqvariant.h>
-
-#ifdef Q_WS_X11
- #define XK_XKB_KEYS
- #define XK_MISCELLANY
- #include <X11/Xlib.h> // For x11Event()
- #include <X11/keysymdef.h> // For XK_...
-
- #ifdef KeyPress
- const int XKeyPress = KeyPress;
- const int XKeyRelease = KeyRelease;
- const int XFocusOut = FocusOut;
- const int XFocusIn = FocusIn;
- #undef KeyRelease
- #undef KeyPress
- #undef FocusOut
- #undef FocusIn
- #endif
-#elif defined(Q_WS_WIN)
-# include <kkeyserver.h>
-#endif
-
-#include <kshortcutdialog_simple.h>
-#include <kshortcutdialog_advanced.h>
-
-#include <tqbuttongroup.h>
-#include <tqcheckbox.h>
-#include <tqframe.h>
-#include <tqlayout.h>
-#include <tqradiobutton.h>
-#include <tqtimer.h>
-#include <tqvbox.h>
-
-#include <kapplication.h>
-#include <kconfig.h>
-#include <kdebug.h>
-#include <kglobal.h>
-#include <kiconloader.h>
-#include <kkeynative.h>
-#include <klocale.h>
-#include <kstdguiitem.h>
-#include <kpushbutton.h>
-
-bool KShortcutDialog::s_showMore = false;
-
-KShortcutDialog::KShortcutDialog( const KShortcut& shortcut, bool bQtShortcut, TQWidget* parent, const char* name )
-: KDialogBase( parent, name, true, i18n("Configure Shortcut"),
- KDialogBase::Details|KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Cancel, true )
-{
- setButtonText(Details, i18n("Advanced"));
- m_stack = new TQVBox(this);
- m_stack->setMinimumWidth(360);
- m_stack->setSpacing(0);
- m_stack->setMargin(0);
- setMainWidget(m_stack);
-
- m_simple = new KShortcutDialogSimple(m_stack);
-
- m_adv = new KShortcutDialogAdvanced(m_stack);
- m_adv->hide();
-
- m_bQtShortcut = bQtShortcut;
-
- m_bGrab = false;
- m_iSeq = 0;
- m_iKey = 0;
- m_ptxtCurrent = 0;
- m_bRecording = false;
- m_mod = 0;
-
- m_simple->m_btnClearShortcut->setPixmap( SmallIcon( "locationbar_erase" ) );
- m_adv->m_btnClearPrimary->setPixmap( SmallIcon( "locationbar_erase" ) );
- m_adv->m_btnClearAlternate->setPixmap( SmallIcon( "locationbar_erase" ) );
- connect(m_simple->m_btnClearShortcut, TQT_SIGNAL(clicked()),
- this, TQT_SLOT(slotClearShortcut()));
- connect(m_adv->m_btnClearPrimary, TQT_SIGNAL(clicked()),
- this, TQT_SLOT(slotClearPrimary()));
- connect(m_adv->m_btnClearAlternate, TQT_SIGNAL(clicked()),
- this, TQT_SLOT(slotClearAlternate()));
-
- connect(m_adv->m_txtPrimary, TQT_SIGNAL(clicked()),
- m_adv->m_btnPrimary, TQT_SLOT(animateClick()));
- connect(m_adv->m_txtAlternate, TQT_SIGNAL(clicked()),
- m_adv->m_btnAlternate, TQT_SLOT(animateClick()));
- connect(m_adv->m_btnPrimary, TQT_SIGNAL(clicked()),
- this, TQT_SLOT(slotSelectPrimary()));
- connect(m_adv->m_btnAlternate, TQT_SIGNAL(clicked()),
- this, TQT_SLOT(slotSelectAlternate()));
-
- KGuiItem ok = KStdGuiItem::ok();
- ok.setText( i18n( "OK" ) );
- setButtonOK( ok );
-
- KGuiItem cancel = KStdGuiItem::cancel();
- cancel.setText( i18n( "Cancel" ) );
- setButtonCancel( cancel );
-
- setShortcut( shortcut );
- resize( 0, 0 );
-
- s_showMore = KConfigGroup(KGlobal::config(), "General").readBoolEntry("ShowAlternativeShortcutConfig", s_showMore);
- updateDetails();
-
- #ifdef Q_WS_X11
- kapp->installX11EventFilter( this ); // Allow button to capture X Key Events.
- #endif
-}
-
-KShortcutDialog::~KShortcutDialog()
-{
- KConfigGroup group(KGlobal::config(), "General");
- group.writeEntry("ShowAlternativeShortcutConfig", s_showMore);
-}
-
-void KShortcutDialog::setShortcut( const KShortcut & shortcut )
-{
- m_shortcut = shortcut;
- updateShortcutDisplay();
-}
-
-void KShortcutDialog::updateShortcutDisplay()
-{
- TQString s[2] = { m_shortcut.seq(0).toString(), m_shortcut.seq(1).toString() };
-
- if( m_bRecording ) {
- m_ptxtCurrent->setDefault( true );
- m_ptxtCurrent->setFocus();
-
- // Display modifiers for the first key in the KKeySequence
- if( m_iKey == 0 ) {
- if( m_mod ) {
- TQString keyModStr;
- if( m_mod & KKey::WIN ) keyModStr += KKey::modFlagLabel(KKey::WIN) + "+";
- if( m_mod & KKey::ALT ) keyModStr += KKey::modFlagLabel(KKey::ALT) + "+";
- if( m_mod & KKey::CTRL ) keyModStr += KKey::modFlagLabel(KKey::CTRL) + "+";
- if( m_mod & KKey::SHIFT ) keyModStr += KKey::modFlagLabel(KKey::SHIFT) + "+";
- s[m_iSeq] = keyModStr;
- }
- }
- // When in the middle of entering multi-key shortcuts,
- // add a "," to the end of the displayed shortcut.
- else
- s[m_iSeq] += ",";
- }
- else {
- m_adv->m_txtPrimary->setDefault( false );
- m_adv->m_txtAlternate->setDefault( false );
- this->setFocus();
- }
-
- s[0].replace('&', TQString::tqfromLatin1("&&"));
- s[1].replace('&', TQString::tqfromLatin1("&&"));
-
- m_simple->m_txtShortcut->setText( s[0] );
- m_adv->m_txtPrimary->setText( s[0] );
- m_adv->m_txtAlternate->setText( s[1] );
-
- // Determine the enable state of the 'Less' button
- bool bLessOk;
- // If there is no shortcut defined,
- if( m_shortcut.count() == 0 )
- bLessOk = true;
- // If there is a single shortcut defined, and it is not a multi-key shortcut,
- else if( m_shortcut.count() == 1 && m_shortcut.seq(0).count() <= 1 )
- bLessOk = true;
- // Otherwise, we have an alternate shortcut or multi-key shortcut(s).
- else
- bLessOk = false;
- enableButton(Details, bLessOk);
-}
-
-void KShortcutDialog::slotDetails()
-{
- s_showMore = (m_adv->isHidden());
- updateDetails();
-}
-
-void KShortcutDialog::updateDetails()
-{
- bool showAdvanced = s_showMore || (m_shortcut.count() > 1);
- setDetails(showAdvanced);
- m_bRecording = false;
- m_iSeq = 0;
- m_iKey = 0;
-
- if (showAdvanced)
- {
- m_simple->hide();
- m_adv->show();
- m_adv->m_btnPrimary->setChecked( true );
- slotSelectPrimary();
- }
- else
- {
- m_ptxtCurrent = m_simple->m_txtShortcut;
- m_adv->hide();
- m_simple->show();
- m_simple->m_txtShortcut->setDefault( true );
- m_simple->m_txtShortcut->setFocus();
- m_adv->m_btnMultiKey->setChecked( false );
- }
- kapp->processEvents();
- adjustSize();
-}
-
-void KShortcutDialog::slotSelectPrimary()
-{
- m_bRecording = false;
- m_iSeq = 0;
- m_iKey = 0;
- m_ptxtCurrent = m_adv->m_txtPrimary;
- m_ptxtCurrent->setDefault(true);
- m_ptxtCurrent->setFocus();
- updateShortcutDisplay();
-}
-
-void KShortcutDialog::slotSelectAlternate()
-{
- m_bRecording = false;
- m_iSeq = 1;
- m_iKey = 0;
- m_ptxtCurrent = m_adv->m_txtAlternate;
- m_ptxtCurrent->setDefault(true);
- m_ptxtCurrent->setFocus();
- updateShortcutDisplay();
-}
-
-void KShortcutDialog::slotClearShortcut()
-{
- m_shortcut.setSeq( 0, KKeySequence() );
- updateShortcutDisplay();
-}
-
-void KShortcutDialog::slotClearPrimary()
-{
- m_shortcut.setSeq( 0, KKeySequence() );
- m_adv->m_btnPrimary->setChecked( true );
- slotSelectPrimary();
-}
-
-void KShortcutDialog::slotClearAlternate()
-{
- if( m_shortcut.count() == 2 )
- m_shortcut.init( m_shortcut.seq(0) );
- m_adv->m_btnAlternate->setChecked( true );
- slotSelectAlternate();
-}
-
-void KShortcutDialog::slotMultiKeyMode( bool bOn )
-{
- // If turning off multi-key mode during a recording,
- if( !bOn && m_bRecording ) {
- m_bRecording = false;
- m_iKey = 0;
- updateShortcutDisplay();
- }
-}
-
-#ifdef Q_WS_X11
-/* we don't use the generic Qt code on X11 because it allows us
- to grab the keyboard so that all keypresses are seen
- */
-bool KShortcutDialog::x11Event( XEvent *pEvent )
-{
- switch( pEvent->type ) {
- case XKeyPress:
- x11KeyPressEvent( pEvent );
- return true;
- case XKeyRelease:
- x11KeyReleaseEvent( pEvent );
- return true;
- case XFocusIn:
- if (!m_bGrab) {
- //kdDebug(125) << "FocusIn and Grab!" << endl;
- grabKeyboard();
- m_bGrab = true;
- }
- //else
- // kdDebug(125) << "FocusIn" << endl;
- break;
- case XFocusOut:
- if (m_bGrab) {
- //kdDebug(125) << "FocusOut and Ungrab!" << endl;
- releaseKeyboard();
- m_bGrab = false;
- }
- //else
- // kdDebug(125) << "FocusOut" << endl;
- break;
- default:
- //kdDebug(125) << "x11Event->type = " << pEvent->type << endl;
- break;
- }
- return KDialogBase::x11Event( pEvent );
-}
-
-static uint getModsFromModX( uint keyModX )
-{
- uint mod = 0;
- if( keyModX & KKeyNative::modX(KKey::SHIFT) ) mod += KKey::SHIFT;
- if( keyModX & KKeyNative::modX(KKey::CTRL) ) mod += KKey::CTRL;
- if( keyModX & KKeyNative::modX(KKey::ALT) ) mod += KKey::ALT;
- if( keyModX & KKeyNative::modX(KKey::WIN) ) mod += KKey::WIN;
- return mod;
-}
-
-static bool convertSymXToMod( uint keySymX, uint* pmod )
-{
- switch( keySymX ) {
- // Don't allow setting a modifier key as an accelerator.
- // Also, don't release the focus yet. We'll wait until
- // we get a 'normal' key.
- case XK_Shift_L: case XK_Shift_R: *pmod = KKey::SHIFT; break;
- case XK_Control_L: case XK_Control_R: *pmod = KKey::CTRL; break;
- case XK_Alt_L: case XK_Alt_R: *pmod = KKey::ALT; break;
- // FIXME: check whether the Meta or Super key are for the Win modifier
- case XK_Meta_L: case XK_Meta_R:
- case XK_Super_L: case XK_Super_R: *pmod = KKey::WIN; break;
- case XK_Hyper_L: case XK_Hyper_R:
- case XK_Mode_switch:
- case XK_Num_Lock:
- case XK_Caps_Lock:
- break;
- default:
- return false;
- }
- return true;
-}
-
-void KShortcutDialog::x11KeyPressEvent( XEvent* pEvent )
-{
- KKeyNative keyNative( pEvent );
- uint keyModX = keyNative.mod();
- uint keySymX = keyNative.sym();
-
- m_mod = getModsFromModX( keyModX );
-
- if( keySymX ) {
- m_bRecording = true;
-
- uint mod = 0;
- if( convertSymXToMod( keySymX, &mod ) ) {
- if( mod )
- m_mod |= mod;
- }
- else
- keyPressed( KKey(keyNative) );
- }
- updateShortcutDisplay();
-}
-
-void KShortcutDialog::x11KeyReleaseEvent( XEvent* pEvent )
-{
- // We're only interested in the release of modifier keys,
- // and then only when it's for the first key in a sequence.
- if( m_bRecording && m_iKey == 0 ) {
- KKeyNative keyNative( pEvent );
- uint keyModX = keyNative.mod();
- uint keySymX = keyNative.sym();
-
- m_mod = getModsFromModX( keyModX );
-
- uint mod = 0;
- if( convertSymXToMod( keySymX, &mod ) && mod ) {
- m_mod &= ~mod;
- if( !m_mod )
- m_bRecording = false;
- }
- updateShortcutDisplay();
- }
-}
-#elif defined(Q_WS_WIN)
-void KShortcutDialog::keyPressEvent( TQKeyEvent * e )
-{
- kdDebug() << e->text() << " " << (int)e->text()[0].latin1()<< " " << (int)e->ascii() << endl;
- //if key is a letter, it must be stored as lowercase
- int keyQt = TQChar( e->key() & 0xff ).isLetter() ?
- (TQChar( e->key() & 0xff ).lower().latin1() | (e->key() & 0xffff00) )
- : e->key();
- int modQt = KKeyServer::qtButtonStateToMod( e->state() );
- KKeyNative keyNative( KKey(keyQt, modQt) );
- m_mod = keyNative.mod();
- uint keySym = keyNative.sym();
-
- switch( keySym ) {
- case Key_Shift:
- m_mod |= KKey::SHIFT;
- m_bRecording = true;
- break;
- case Key_Control:
- m_mod |= KKey::CTRL;
- m_bRecording = true;
- break;
- case Key_Alt:
- m_mod |= KKey::ALT;
- m_bRecording = true;
- break;
- case Key_Menu:
- case Key_Meta: //unused
- break;
- default:
- if( keyNative.sym() == Key_Return && m_iKey > 0 ) {
- accept();
- return;
- }
- //accept
- if (keyNative.sym()) {
- KKey key = keyNative;
- key.simplify();
- KKeySequence seq;
- if( m_iKey == 0 )
- seq = key;
- else {
- seq = m_shortcut.seq( m_iSeq );
- seq.setKey( m_iKey, key );
- }
- m_shortcut.setSeq( m_iSeq, seq );
-
- if(m_adv->m_btnMultiKey->isChecked())
- m_iKey++;
-
- m_bRecording = true;
-
- updateShortcutDisplay();
-
- if( !m_adv->m_btnMultiKey->isChecked() )
- TQTimer::singleShot(500, this, TQT_SLOT(accept()));
- }
- return;
- }
-
- // If we are editing the first key in the sequence,
- // display modifier keys which are held down
- if( m_iKey == 0 ) {
- updateShortcutDisplay();
- }
-}
-
-bool KShortcutDialog::event ( TQEvent * e )
-{
- if (e->type()==TQEvent::KeyRelease) {
- int modQt = KKeyServer::qtButtonStateToMod( static_cast<TQKeyEvent*>(e)->state() );
- KKeyNative keyNative( KKey(static_cast<TQKeyEvent*>(e)->key(), modQt) );
- uint keySym = keyNative.sym();
-
- bool change = true;
- switch( keySym ) {
- case Key_Shift:
- if (m_mod & KKey::SHIFT)
- m_mod ^= KKey::SHIFT;
- break;
- case Key_Control:
- if (m_mod & KKey::CTRL)
- m_mod ^= KKey::CTRL;
- break;
- case Key_Alt:
- if (m_mod & KKey::ALT)
- m_mod ^= KKey::ALT;
- break;
- default:
- change = false;
- }
- if (change)
- updateShortcutDisplay();
- }
- return KDialogBase::event(e);
-}
-#endif
-
-void KShortcutDialog::keyPressed( KKey key )
-{
- kdDebug(125) << "keyPressed: " << key.toString() << endl;
-
- key.simplify();
- if( m_bQtShortcut ) {
- key = key.keyCodeQt();
- if( key.isNull() ) {
- // TODO: message box about key not able to be used as application shortcut
- }
- }
-
- KKeySequence seq;
- if( m_iKey == 0 )
- seq = key;
- else {
- // Remove modifiers
- key.init( key.sym(), 0 );
- seq = m_shortcut.seq( m_iSeq );
- seq.setKey( m_iKey, key );
- }
-
- m_shortcut.setSeq( m_iSeq, seq );
-
- m_mod = 0;
- if( m_adv->m_btnMultiKey->isChecked() && m_iKey < KKeySequence::MAX_KEYS - 1 )
- m_iKey++;
- else {
- m_iKey = 0;
- m_bRecording = false;
- }
-
- updateShortcutDisplay();
-
- if( !m_adv->m_btnMultiKey->isChecked() )
- TQTimer::singleShot(500, this, TQT_SLOT(accept()));
-}
-
-#include "kshortcutdialog.moc"