tdecore
kkeynative_x11.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <tqnamespace.h>
00024 #include <tqwindowdefs.h>
00025
00026 #if defined(Q_WS_X11) || defined(Q_WS_WIN) || defined(Q_WS_MACX) // Only compile this module if we're compiling for X11, mac or win32
00027
00028 #include "kkeynative.h"
00029 #include "kkeyserver_x11.h"
00030
00031 #include <tqmap.h>
00032 #include <tqstringlist.h>
00033 #include "kckey.h"
00034 #include <kdebug.h>
00035 #include <tdelocale.h>
00036
00037 #ifdef Q_WS_X11
00038 #define XK_MISCELLANY
00039 #define XK_XKB_KEYS
00040 #include <X11/X.h>
00041 #include <X11/Xlib.h>
00042 #include <X11/Xutil.h>
00043 #include <X11/XKBlib.h>
00044 #include <X11/keysymdef.h>
00045 #include <ctype.h>
00046 #endif
00047
00048
00049
00050 static KKeyNative* gx_pkey = 0;
00051
00052
00053
00054
00055
00056 KKeyNative::KKeyNative() { clear(); }
00057 KKeyNative::KKeyNative( const KKey& key ) { init( key ); }
00058 KKeyNative::KKeyNative( const KKeyNative& key ) { init( key ); }
00059 #ifdef Q_WS_X11
00060 KKeyNative::KKeyNative( const XEvent* pEvent ) { init( pEvent ); }
00061 #endif
00062
00063 KKeyNative::KKeyNative( uint code, uint mod, uint sym )
00064 {
00065 m_code = code;
00066 m_mod = mod;
00067 m_sym = sym;
00068 }
00069
00070 KKeyNative::~KKeyNative()
00071 { }
00072
00073 void KKeyNative::clear()
00074 {
00075 m_code = 0;
00076 m_mod = 0;
00077 m_sym = 0;
00078 }
00079
00080 #ifdef Q_WS_X11
00081 bool KKeyNative::init( const XEvent* pEvent )
00082 {
00083 KeySym keySym;
00084 m_code = pEvent->xkey.keycode;
00085 m_mod = pEvent->xkey.state;
00086 XLookupString( (XKeyEvent*) pEvent, 0, 0, &keySym, 0 );
00087 m_sym = (uint) keySym;
00088 return true;
00089 }
00090 #endif
00091
00092 bool KKeyNative::init( const KKey& key )
00093 {
00094 #ifdef Q_WS_WIN
00095 m_sym = key.sym();
00096 m_code = m_sym;
00097 m_mod = key.m_mod;
00098 #elif !defined(Q_WS_WIN) && !defined(Q_WS_MACX)
00099
00100
00101 m_sym = key.sym();
00102 uint modExtra = KKeyServer::Sym(m_sym).getModsRequired();
00103
00104 if( !m_sym || !KKeyServer::modToModX( key.modFlags() | modExtra, m_mod ) ) {
00105 m_sym = m_mod = 0;
00106 m_code = 0;
00107 return false;
00108 }
00109
00110
00111
00112
00113
00114 if( m_sym == XK_Print && !(m_mod & Mod1Mask) &&
00115 XkbKeycodeToKeysym( tqt_xdisplay(), 111, 0, 0 ) == XK_Print )
00116 m_code = 111;
00117 else if( m_sym == XK_Break || (m_sym == XK_Pause && (m_mod & ControlMask)) &&
00118 XkbKeycodeToKeysym( tqt_xdisplay(), 114, 0, 0 ) == XK_Pause )
00119 m_code = 114;
00120 else
00121 m_code = XKeysymToKeycode( tqt_xdisplay(), m_sym );
00122
00123 if( !m_code && m_sym )
00124 kdDebug(125) << "Couldn't get code for sym" << endl;
00125
00126
00127 if( key.modFlags() && ( ( m_sym < XK_Home || m_sym > XK_Begin ) &&
00128 m_sym != XK_Insert && m_sym != XK_Delete ))
00129 KKeyServer::codeXToSym( m_code, m_mod, m_sym );
00130 #endif
00131 return true;
00132 }
00133
00134 bool KKeyNative::init( const KKeyNative& key )
00135 {
00136 m_code = key.m_code;
00137 m_mod = key.m_mod;
00138 m_sym = key.m_sym;
00139 return true;
00140 }
00141
00142 uint KKeyNative::code() const { return m_code; }
00143 uint KKeyNative::mod() const { return m_mod; }
00144 uint KKeyNative::sym() const { return m_sym; }
00145
00146 bool KKeyNative::isNull() const
00147 {
00148 return m_sym == 0;
00149 }
00150
00151 int KKeyNative::compare( const KKeyNative& key ) const
00152 {
00153 if( m_sym != key.m_sym ) return m_sym - key.m_sym;
00154 if( m_mod != key.m_mod ) return m_mod - key.m_mod;
00155 if( m_code != key.m_code ) return m_code - key.m_code;
00156 return 0;
00157 }
00158
00159 KKeyNative& KKeyNative::null()
00160 {
00161 if( !gx_pkey )
00162 gx_pkey = new KKeyNative;
00163 if( !gx_pkey->isNull() )
00164 gx_pkey->clear();
00165 return *gx_pkey;
00166 }
00167
00168 KKey KKeyNative::key() const
00169 {
00170 #ifdef Q_WS_WIN
00171 return KKey( m_sym, m_mod );
00172 #else
00173 uint modSpec;
00174 if( KKeyServer::modXToMod( m_mod, modSpec ) )
00175 return KKey( m_sym, modSpec );
00176 else
00177 return KKey();
00178 #endif
00179 }
00180
00181 int KKeyNative::keyCodeQt() const
00182 {
00183 int keyQt = KKeyServer::Sym(m_sym).qt();
00184 int modQt;
00185
00186 if( (keyQt != TQt::Key_unknown) && (KKeyServer::modXToModQt( m_mod, modQt )) ) {
00187 return keyQt | modQt;
00188 }
00189
00190 return 0;
00191 }
00192
00193 bool KKeyNative::keyboardHasWinKey() { return KKeyServer::keyboardHasWinKey(); }
00194
00195 #ifdef Q_WS_X11
00196 uint KKeyNative::modX( KKey::ModFlag modFlag ) { return KKeyServer::modX( modFlag ); }
00197 uint KKeyNative::accelModMaskX() { return KKeyServer::accelModMaskX(); }
00198 uint KKeyNative::modXNumLock() { return KKeyServer::modXNumLock(); }
00199 uint KKeyNative::modXLock() { return KKeyServer::modXLock(); }
00200 uint KKeyNative::modXScrollLock() { return KKeyServer::modXScrollLock(); }
00201 uint KKeyNative::modXModeSwitch() { return KKeyServer::modXModeSwitch(); }
00202 #endif
00203
00204 #endif // Q_WS_X11