20 #include "kshortcut.h"
21 #include "kkeynative.h"
22 #include "kkeyserver.h"
25 #include <tqstringlist.h>
30 #include <ksimpleconfig.h>
34 static KKey* g_pspec = 0;
85 return init( (
int) key );
90 int keyQt = pEvent->key();
91 if( pEvent->state() & TQt::ShiftButton ) keyQt |= Qt::SHIFT;
92 if( pEvent->state() & TQt::ControlButton ) keyQt |= Qt::CTRL;
93 if( pEvent->state() & TQt::AltButton ) keyQt |= Qt::ALT;
94 if( pEvent->state() & TQt::MetaButton ) keyQt |= Qt::META;
109 TQString sKey = sSpec.stripWhiteSpace();
110 if( sKey.startsWith(
"default(" ) && sKey.endsWith(
")" ) )
111 sKey = sKey.mid( 8, sKey.length() - 9 );
113 if( sKey.endsWith(
"++" ) )
114 sKey = sKey.left( sKey.length() - 1 ) +
"plus";
115 TQStringList rgs = TQStringList::split(
'+', sKey,
true );
119 for( i = 0; i < rgs.size(); i++ ) {
120 TQString s = rgs[i].lower();
121 if( s ==
"shift" ) m_mod |= KKey::SHIFT;
122 else if( s ==
"ctrl" ) m_mod |= KKey::CTRL;
123 else if( s ==
"alt" ) m_mod |= KKey::ALT;
124 else if( s ==
"win" ) m_mod |= KKey::WIN;
125 else if( s ==
"meta" ) m_mod |= KKey::WIN;
128 if( m != 0 ) m_mod |= m;
133 if( (i == rgs.size() - 1 && !rgs[i].isEmpty()) ) {
141 kdDebug(125) <<
"KKey::init( \"" << sSpec <<
"\" ):"
142 <<
" m_sym = " << TQString::number(m_sym, 16)
143 <<
", m_mod = " << TQString::number(m_mod, 16) <<
endl;
149 uint KKey::sym()
const {
return m_sym; }
150 uint KKey::modFlags()
const {
return m_mod; }
154 if( m_sym != spec.m_sym )
155 return m_sym - spec.m_sym;
156 if( m_mod != spec.m_mod )
157 return m_mod - spec.m_mod;
185 s = KKeyServer::modToStringInternal( m_mod );
216 KKeySequence::~KKeySequence()
223 m_bTriggerOnRelease =
false;
229 if( !seq.isEmpty() ) {
230 for( uint i = 0; i < seq.count(); i++ ) {
231 m_rgvar[i].
init( seq[i] );
235 m_nKeys = seq.count();
236 m_bTriggerOnRelease =
false;
245 m_rgvar[0].
init( key );
246 m_bTriggerOnRelease =
false;
254 m_bTriggerOnRelease =
false;
255 m_nKeys = seq.m_nKeys;
256 for( uint i = 0; i < m_nKeys; i++ ) {
257 if( seq.m_rgvar[i].
isNull() ) {
258 kdDebug(125) <<
"KKeySequence::init( seq ): key[" << i <<
"] is null." <<
endl;
262 m_rgvar[i] = seq.m_rgvar[i];
269 m_bTriggerOnRelease =
false;
271 TQStringList rgs = TQStringList::split(
',', s );
272 if( s ==
"none" || rgs.size() == 0 ) {
275 }
else if( rgs.size() <= MAX_KEYS ) {
276 m_nKeys = rgs.size();
277 for( uint i = 0; i < m_nKeys; i++ ) {
301 bool KKeySequence::isTriggerOnRelease()
const
302 {
return m_bTriggerOnRelease; }
306 if( iKey <= m_nKeys && iKey < MAX_KEYS ) {
307 m_rgvar[iKey].
init( key );
308 if( iKey == m_nKeys )
322 if( m_nKeys < seq.m_nKeys )
325 for( uint i = 0; i < seq.m_nKeys; i++ ) {
326 if( m_rgvar[i] != seq.m_rgvar[i] )
335 for( uint i = 0; i < m_nKeys && i < seq.m_nKeys; i++ ) {
336 int ret = m_rgvar[i].
compare( seq.m_rgvar[i] );
340 if( m_nKeys != seq.m_nKeys )
341 return m_nKeys - seq.m_nKeys;
348 int k[4] = { 0, 0, 0, 0 };
350 for( uint i = 0; i <
count(); i++ )
352 TQKeySequence seq( k[0], k[1], k[2], k[3] );
363 if( m_nKeys < 1 )
return TQString::null;
367 for( uint i = 1; i < m_nKeys; i++ ) {
375 TQString KKeySequence::toStringInternal()
const
377 if( m_nKeys < 1 )
return TQString::null;
381 for( uint i = 1; i < m_nKeys; i++ ) {
411 KShortcut::~KShortcut()
424 m_rgseq[0].
init( TQKeySequence(keyQt) );
433 m_rgseq[0].
init( key );
440 m_rgseq[0].
init( spec );
453 m_nSeqs = cut.m_nSeqs;
454 for( uint i = 0; i < m_nSeqs; i++ )
455 m_rgseq[i] = cut.m_rgseq[i];
462 TQStringList rgs = TQStringList::split(
';', s );
464 if( s ==
"none" || rgs.size() == 0 )
466 else if( rgs.size() <= MAX_SEQUENCES ) {
467 m_nSeqs = rgs.size();
468 for( uint i = 0; i < m_nSeqs; i++ ) {
469 TQString& sSeq = rgs[i];
470 if( sSeq.startsWith(
"default(" ) )
471 sSeq = sSeq.mid( 8, sSeq.length() - 9 );
472 m_rgseq[i].
init( sSeq );
482 TQTextStream os( &sDebug, IO_WriteOnly );
483 os <<
"KShortcut::init( \"" << s <<
"\" ): ";
484 for( uint i = 0; i < m_nSeqs; i++ ) {
485 os <<
" m_rgseq[" << i <<
"]: ";
487 vars.init( m_rgseq[i].key(0),
true );
488 for( uint j = 0; j < vars.count(); j++ )
489 os << TQString::number(vars.m_rgkey[j].
keyCodeQt(),16) <<
',';
491 kdDebug(125) << sDebug <<
endl;
511 return TQKeySequence();
521 for( uint i = 0; i < m_nSeqs && i < cut.m_nSeqs; i++ ) {
522 int ret = m_rgseq[i].
compare( cut.m_rgseq[i] );
526 return m_nSeqs - cut.m_nSeqs;
539 for( uint i = 0; i <
count(); i++ ) {
541 && m_rgseq[i].
count() == 1
542 && m_rgseq[i].
key(0) == key )
550 for( uint i = 0; i <
count(); i++ ) {
551 if( !m_rgseq[i].
isNull() && m_rgseq[i] ==
seq )
560 if( iSeq <= m_nSeqs && iSeq < MAX_SEQUENCES ) {
562 if( iSeq == m_nSeqs )
573 for( uint iSeq = 0; iSeq < m_nSeqs; iSeq++ )
575 if (m_rgseq[iSeq] == seq)
577 for( uint jSeq = iSeq + 1; jSeq < m_nSeqs; jSeq++)
578 m_rgseq[jSeq-1] = m_rgseq[jSeq];
586 if( m_nSeqs < MAX_SEQUENCES ) {
588 m_rgseq[m_nSeqs] =
seq;
598 if( m_nSeqs < MAX_SEQUENCES ) {
599 m_rgseq[m_nSeqs].
init( spec );
608 uint seqs = m_nSeqs, co = cut.
count();
609 for( uint i=0; i<co; i++ ) {
612 if( seqs > MAX_SEQUENCES )
return false;
614 for( uint i=0; i<co; i++ ) {
617 m_rgseq[m_nSeqs] =
seq;
624 KShortcut::operator TQKeySequence ()
const
627 return m_rgseq[0].qt();
629 return TQKeySequence();
636 for( uint i = 0; i <
count(); i++ ) {
638 if( i <
count() - 1 )
645 TQString KShortcut::toStringInternal(
const KShortcut* pcutDefault )
const
649 for( uint i = 0; i <
count(); i++ ) {
651 if( pcutDefault && i < pcutDefault->
count() && seq == (*pcutDefault).seq(i) ) {
653 s += seq.toStringInternal();
656 s += seq.toStringInternal();
657 if( i <
count() - 1 )