From kde-commits Tue Aug 02 13:25:08 2005 From: =?utf-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= Date: Tue, 02 Aug 2005 13:25:08 +0000 To: kde-commits Subject: KDE/kdelibs/kdecore Message-Id: <1122989108.215018.18438.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=112299291515707 SVN commit 442362 by lunakl: Forward port of #108961. M +6 -1 kaccelbase.cpp M +1 -0 kaccelbase.h M +7 -1 kapplication.cpp M +6 -0 kglobalaccel.cpp M +9 -0 kglobalaccel.h M +42 -8 kglobalaccel_x11.cpp M +7 -0 kglobalaccel_x11.h M +1 -0 kipc.h --- trunk/KDE/kdelibs/kdecore/kaccelbase.cpp #442361:442362 @@ -63,6 +63,11 @@ uint KAccelBase::actionCount() const { return m_rgActions.count(); } KAccelActions& KAccelBase::actions() { return m_rgActions; } bool KAccelBase::isEnabled() const { return m_bEnabled; } +// see KGlobalAccel::blockShortcuts() stuff - it's to temporarily block +// all global shortcuts, so that the key grabs are released, but from the app's +// point of view the KGlobalAccel is still enabled, so KGlobalAccel needs +// to disable key grabbing even if enabled +bool KAccelBase::isEnabledInternal() const { return isEnabled(); } KAccelAction* KAccelBase::actionPtr( const QString& sAction ) { return m_rgActions.actionPtr( sAction ); } @@ -417,7 +422,7 @@ void KAccelBase::createKeyList( Q3ValueVector& rgKeys ) { //kdDebug(125) << "KAccelBase::createKeyList()" << endl; - if( !m_bEnabled ) + if( !isEnabledInternal()) return; // create the list --- trunk/KDE/kdelibs/kdecore/kaccelbase.h #442361:442362 @@ -198,6 +198,7 @@ virtual bool disconnectKey( const KKeyServer::Key& ) = 0; protected: + virtual bool isEnabledInternal() const; struct ActionInfo { KAccelAction* pAction; --- trunk/KDE/kdelibs/kdecore/kapplication.cpp #442361:442362 @@ -76,6 +76,7 @@ #include #include #include +#include #if defined Q_WS_X11 #include @@ -808,7 +809,7 @@ kipcEventMask = (1 << KIPC::StyleChanged) | (1 << KIPC::PaletteChanged) | (1 << KIPC::FontChanged) | (1 << KIPC::BackgroundChanged) | (1 << KIPC::ToolbarStyleChanged) | (1 << KIPC::SettingsChanged) | - (1 << KIPC::ClipboardConfigChanged); + (1 << KIPC::ClipboardConfigChanged) | (1 << KIPC::BlockShortcuts); #endif // Trigger creation of locale. @@ -1764,6 +1765,11 @@ case KIPC::ClipboardConfigChanged: KClipboardSynchronizer::newConfiguration(arg); break; + + case KIPC::BlockShortcuts: + KGlobalAccel::blockShortcuts(arg); + emit kipcMessage(id, arg); // some apps may do additional things + break; } } else if (id >= 32) --- trunk/KDE/kdelibs/kdecore/kglobalaccel.cpp #442361:442362 @@ -65,6 +65,12 @@ void KGlobalAccel::setEnabled( bool bEnabled ) { d->setEnabled( bEnabled ); } +void KGlobalAccel::blockShortcuts( bool block ) + { KGlobalAccelPrivate::blockShortcuts( block ); } + +void KGlobalAccel::disableBlocking( bool disable ) + { d->disableBlocking( disable ); } + KAccelAction* KGlobalAccel::insert( const QString& sAction, const QString& sDesc, const QString& sHelp, const KShortcut& cutDef3, const KShortcut& cutDef4, const QObject* pObjSlot, const char* psMethodSlot, --- trunk/KDE/kdelibs/kdecore/kglobalaccel.h #442361:442362 @@ -206,6 +206,15 @@ * KAccelActions::useFourModifierKeys(). */ static bool useFourModifierKeys(); + + /** + * @internal + */ + static void blockShortcuts( bool block ); + /** + * @internal + */ + void disableBlocking( bool disable ); private: --- trunk/KDE/kdelibs/kdecore/kglobalaccel_x11.cpp #442361:442362 @@ -75,9 +75,16 @@ //---------------------------------------------------- +static QLinkedList< KGlobalAccelPrivate* >* all_accels; + KGlobalAccelPrivate::KGlobalAccelPrivate() : KAccelBase( KAccelBase::NATIVE_KEYS ) +, m_blocked( false ) +, m_blockingDisabled( false ) { + if( all_accels == NULL ) + all_accels = new QLinkedList< KGlobalAccelPrivate* >; + all_accels->append( this ); m_sConfigGroup = "Global Shortcuts"; kapp->installX11EventFilter( this ); } @@ -88,6 +95,11 @@ //for( CodeModMap::ConstIterator it = m_rgCodeModToAction.begin(); it != m_rgCodeModToAction.end(); ++it ) { // const CodeMod& codemod = it.key(); //} + all_accels->removeAll( this ); + if( all_accels->count() == 0 ) { + delete all_accels; + all_accels = NULL; + } } void KGlobalAccelPrivate::setEnabled( bool bEnable ) @@ -96,6 +108,30 @@ updateConnections(); } +void KGlobalAccelPrivate::blockShortcuts( bool block ) +{ + if( all_accels == NULL ) + return; + for( QLinkedList< KGlobalAccelPrivate* >::ConstIterator it = all_accels->begin(); + it != all_accels->end(); + ++it ) { + if( (*it)->m_blockingDisabled ) + continue; + (*it)->m_blocked = block; + (*it)->updateConnections(); + } +} + +void KGlobalAccelPrivate::disableBlocking( bool block ) +{ + m_blockingDisabled = block; +} + +bool KGlobalAccelPrivate::isEnabledInternal() const +{ + return KAccelBase::isEnabled() && !m_blocked; +} + bool KGlobalAccelPrivate::emitSignal( Signal ) { return false; @@ -215,13 +251,11 @@ void KGlobalAccelPrivate::x11MappingNotify() { kdDebug(125) << "KGlobalAccelPrivate::x11MappingNotify()" << endl; - if( m_bEnabled ) { - // Maybe the X modifier map has been changed. - KKeyServer::initializeMods(); - calculateGrabMasks(); - // Do new XGrabKey()s. - updateConnections(); - } + // Maybe the X modifier map has been changed. + KKeyServer::initializeMods(); + calculateGrabMasks(); + // Do new XGrabKey()s. + updateConnections(); } bool KGlobalAccelPrivate::x11KeyPress( const XEvent *pEvent ) @@ -232,7 +266,7 @@ XFlush( QX11Info::display()); // avoid X(?) bug } - if( !m_bEnabled ) + if( !isEnabledInternal()) return false; CodeMod codemod; --- trunk/KDE/kdelibs/kdecore/kglobalaccel_x11.h #442361:442362 @@ -93,9 +93,16 @@ void x11MappingNotify(); bool x11KeyPress( const XEvent *pEvent ); void activate( KAccelAction* pAction, const KKeySequence& seq ); + virtual bool isEnabledInternal() const; + static void blockShortcuts( bool block ); + void disableBlocking( bool disable ); + protected slots: void slotActivated( int iAction ); + private: + bool m_blocked; + bool m_blockingDisabled; }; #endif // _KGLOBALACCEL_X11_H --- trunk/KDE/kdelibs/kdecore/kipc.h #442361:442362 @@ -56,6 +56,7 @@ enum Message { PaletteChanged=0, FontChanged, StyleChanged, BackgroundChanged, SettingsChanged, IconChanged, ToolbarStyleChanged, ClipboardConfigChanged, /// @since 3.1 + BlockShortcuts, /// @since 3.5 UserMessage=32 }; /**