diff options
author | Sergey Udaltsov <svu@gnome.org> | 2005-01-08 00:00:40 +0000 |
---|---|---|
committer | Sergey Udaltsov <svu@gnome.org> | 2005-01-08 00:00:40 +0000 |
commit | 46b857188be32ad483211b36635779a0241c45ef (patch) | |
tree | 255b509274bbabf941d83148ce86992cb1496235 | |
parent | 8b45c4aa4725b28ee4be1c2310874d1620690e71 (diff) | |
download | libxklavier-46b857188be32ad483211b36635779a0241c45ef.tar.gz |
optimizations/fixes
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | libxklavier/xklavier.c | 11 | ||||
-rw-r--r-- | libxklavier/xklavier_evt.c | 1 | ||||
-rw-r--r-- | libxklavier/xklavier_evt_xkb.c | 2 | ||||
-rw-r--r-- | libxklavier/xklavier_private.h | 9 | ||||
-rw-r--r-- | libxklavier/xklavier_private_xkb.h | 2 | ||||
-rw-r--r-- | libxklavier/xklavier_private_xmm.h | 2 | ||||
-rw-r--r-- | libxklavier/xklavier_xkb.c | 125 | ||||
-rwxr-xr-x | libxklavier/xklavier_xmm.c | 6 |
9 files changed, 128 insertions, 34 deletions
@@ -1,3 +1,7 @@ +2005-01-07 svu + + * libxklavier: a lot of optimizations (and some small fixes) + 2004-12-30 svu * libxklavier/xklavier_config_xkb.c: some memory leak nailed diff --git a/libxklavier/xklavier.c b/libxklavier/xklavier.c index 14183c9..6422846 100644 --- a/libxklavier/xklavier.c +++ b/libxklavier/xklavier.c @@ -790,9 +790,14 @@ int XklGetBackendFeatures( void ) void _XklResetAllInfo( const char reason[] ) { - XklDebug( 150, "Resetting all the info, reason: [%s]\n", reason ); - _XklFreeAllInfo(); - _XklLoadAllInfo(); + XklDebug( 150, "Resetting all the cached info, reason: [%s]\n", reason ); + _XklEnsureVTableInited(); + if( !(*xklVTable->xklIfCachedInfoEqualsActualHandler)() ) + { + (*xklVTable->xklFreeAllInfoHandler)(); + (*xklVTable->xklLoadAllInfoHandler)(); + } else + XklDebug( 100, "NOT Resetting the cache: same configuration\n" ); } /** diff --git a/libxklavier/xklavier_evt.c b/libxklavier/xklavier_evt.c index 438020c..008cac4 100644 --- a/libxklavier/xklavier_evt.c +++ b/libxklavier/xklavier_evt.c @@ -296,7 +296,6 @@ void _XklPropertyEvHandler( XPropertyEvent * pev ) { if( pev->state == PropertyNewValue ) { - XklDebug( 160, "New value of *_NAMES_PROP_ATOM on root window\n" ); /* If root window got new *_NAMES_PROP_ATOM - it most probably means new keyboard config is loaded by somebody */ _XklResetAllInfo( "New value of *_NAMES_PROP_ATOM on root window" ); diff --git a/libxklavier/xklavier_evt_xkb.c b/libxklavier/xklavier_evt_xkb.c index 1cc0292..d70a3a3 100644 --- a/libxklavier/xklavier_evt_xkb.c +++ b/libxklavier/xklavier_evt_xkb.c @@ -89,10 +89,12 @@ int _XklXkbEventHandler( XEvent *xev ) case XkbIndicatorMapNotify: case XkbControlsNotify: case XkbNamesNotify: +#if 0 /* not really fair - but still better than flooding... */ XklDebug( 200, "warning: configuration event %s is not actually processed\n", _XklXkbGetXkbEventName( kev->any.xkb_type ) ); break; +#endif case XkbNewKeyboardNotify: XklDebug( 150, "%s\n", _XklXkbGetXkbEventName( kev->any.xkb_type ) ); diff --git a/libxklavier/xklavier_private.h b/libxklavier/xklavier_private.h index 2b92d3f..5203ade 100644 --- a/libxklavier/xklavier_private.h +++ b/libxklavier/xklavier_private.h @@ -27,6 +27,8 @@ typedef unsigned ( *XklGetNumGroupsHandler )( void ); typedef void ( *XklGetRealStateHandler)( XklState * curState_return ); +typedef Bool ( *XklIfCachedInfoEqualsActualHandler) ( void ); + typedef Bool ( *XklLoadAllInfoHandler )( void ); typedef void ( *XklLockGroupHandler )( int group ); @@ -120,6 +122,13 @@ typedef struct XklGetRealStateHandler xklGetRealStateHandler; /** + * Compares the cached info with the actual one, from the server + * xkb: Compares some parts of XkbDescPtr + * xmodmap: returns False + */ + XklIfCachedInfoEqualsActualHandler xklIfCachedInfoEqualsActualHandler; + + /** * Loads the configuration info from the server * xkb: loads XkbDesc, names, indicators * xmodmap: loads internal XklConfigRec from server diff --git a/libxklavier/xklavier_private_xkb.h b/libxklavier/xklavier_private_xkb.h index d0a141e..ce71002 100644 --- a/libxklavier/xklavier_private_xkb.h +++ b/libxklavier/xklavier_private_xkb.h @@ -50,6 +50,8 @@ extern unsigned _XklXkbGetNumGroups( void ); extern void _XklXkbGetRealState( XklState * curState_return ); +extern Bool _XklXkbIfCachedInfoEqualsActual( void ); + extern Bool _XklXkbLoadAllInfo( void ); extern void _XklXkbLockGroup( int group ); diff --git a/libxklavier/xklavier_private_xmm.h b/libxklavier/xklavier_private_xmm.h index 9ac4e19..e90da5d 100644 --- a/libxklavier/xklavier_private_xmm.h +++ b/libxklavier/xklavier_private_xmm.h @@ -63,6 +63,8 @@ extern unsigned _XklXmmGetNumGroups( void ); extern void _XklXmmGetRealState( XklState * curState_return ); +extern Bool _XklXmmIfCachedInfoEqualsActual( void ); + extern Bool _XklXmmLoadAllInfo( void ); extern void _XklXmmLockGroup( int group ); diff --git a/libxklavier/xklavier_xkb.c b/libxklavier/xklavier_xkb.c index ea6d080..760ba48 100644 --- a/libxklavier/xklavier_xkb.c +++ b/libxklavier/xklavier_xkb.c @@ -12,6 +12,8 @@ #ifdef XKB_HEADERS_PRESENT XkbDescPtr _xklXkb; +static XkbDescPtr precachedXkb = NULL; + char *_xklIndicatorNames[XkbNumIndicators]; unsigned _xklPhysIndicatorsMask; @@ -111,6 +113,78 @@ void _XklXkbFreeAllInfo( ) XkbFreeKeyboard( _xklXkb, XkbAllComponentsMask, True ); _xklXkb = NULL; } + + /* just in case - never actually happens...*/ + if( precachedXkb != NULL ) + { + XkbFreeKeyboard( precachedXkb, XkbAllComponentsMask, True ); + precachedXkb = NULL; + } +} + +static Bool _XklXkbLoadPrecachedXkb( void ) +{ + Bool rv = False; + Status status; + + precachedXkb = XkbGetMap( _xklDpy, KBD_MASK, XkbUseCoreKbd ); + if( precachedXkb != NULL ) + { + rv = Success == ( status = XkbGetControls( _xklDpy, CTRLS_MASK, precachedXkb ) ) && + Success == ( status = XkbGetNames( _xklDpy, NAMES_MASK, precachedXkb ) ) && + Success == ( status = XkbGetIndicatorMap( _xklDpy, XkbAllIndicatorsMask, precachedXkb ) ); + if( !rv ) + { + _xklLastErrorMsg = "Could not load controls/names/indicators"; + XklDebug( 0, "%s: %d\n", _xklLastErrorMsg, status ); + XkbFreeKeyboard( precachedXkb, XkbAllComponentsMask, True ); + } + } + return rv; +} + +Bool _XklXkbIfCachedInfoEqualsActual( ) +{ + int i; + Atom *pa1, *pa2; + Bool rv = False; + + if( _XklXkbLoadPrecachedXkb() ) + { + /* First, compare the number of groups */ + if( _xklXkb->ctrls->num_groups == precachedXkb->ctrls->num_groups ) + { + /* Then, compare group names, just atoms */ + pa1 = _xklXkb->names->groups; + pa2 = precachedXkb->names->groups; + for( i = _xklXkb->ctrls->num_groups; --i >= 0; pa1++, pa2++ ) + if( *pa1 != *pa2 ) + break; + + /* Then, compare indicator names, just atoms */ + if( i < 0 ) + { + pa1 = _xklXkb->names->indicators; + pa2 = precachedXkb->names->indicators; + for( i = XkbNumIndicators; --i >= 0; pa1++, pa2++ ) + if( *pa1 != *pa2 ) + break; + rv = i < 0; + } + } + /** + * in case of success, let's reuse - not free! + */ + if( !rv ) + { + XkbFreeKeyboard( precachedXkb, XkbAllComponentsMask, True ); + precachedXkb = NULL; + } + } else + { + XklDebug( 0, "Could not load the XkbDescPtr for comparison\n" ); + } + return rv; } /** @@ -119,43 +193,32 @@ void _XklXkbFreeAllInfo( ) Bool _XklXkbLoadAllInfo( ) { int i; - Atom *gna; - Atom *pia; + Atom *pa; char **groupName; char **pi = _xklIndicatorNames; - _xklXkb = XkbGetMap( _xklDpy, KBD_MASK, XkbUseCoreKbd ); - if( _xklXkb == NULL ) - { - _xklLastErrorMsg = "Could not load keyboard"; - return False; - } - - _xklLastErrorCode = XkbGetControls( _xklDpy, CTRLS_MASK, _xklXkb ); + if ( precachedXkb == NULL ) + if ( !_XklXkbLoadPrecachedXkb() ) + { + _xklLastErrorMsg = "Could not load keyboard"; + return False; + } - if( _xklLastErrorCode != Success ) - { - _xklLastErrorMsg = "Could not load controls"; - return False; - } + /* take it from the cache (in most cases LoadAll is called from ResetAll which in turn ...)*/ + _xklXkb = precachedXkb; + precachedXkb = NULL; + /* First, output the number of the groups */ XklDebug( 200, "found %d groups\n", _xklXkb->ctrls->num_groups ); - _xklLastErrorCode = XkbGetNames( _xklDpy, NAMES_MASK, _xklXkb ); - - if( _xklLastErrorCode != Success ) - { - _xklLastErrorMsg = "Could not load names"; - return False; - } - - gna = _xklXkb->names->groups; + /* Then, cache (and output) the names of the groups */ + pa = _xklXkb->names->groups; groupName = groupNames; - for( i = _xklXkb->ctrls->num_groups; --i >= 0; gna++, groupName++ ) + for( i = _xklXkb->ctrls->num_groups; --i >= 0; pa++, groupName++ ) { *groupName = XGetAtomName( _xklDpy, - *gna == None ? - XInternAtom( _xklDpy, "-", False ) : *gna ); + *pa == None ? + XInternAtom( _xklDpy, "-", False ) : *pa ); XklDebug( 200, "group %d has name [%s]\n", i, *groupName ); } @@ -168,10 +231,11 @@ Bool _XklXkbLoadAllInfo( ) return False; } - pia = _xklXkb->names->indicators; - for( i = XkbNumIndicators; --i>=0; pi++, pia++ ) + /* Then, cache (and output) the names of the indicators */ + pa = _xklXkb->names->indicators; + for( i = XkbNumIndicators; --i >= 0; pi++, pa++ ) { - Atom a = *pia; + Atom a = *pa; if( a != None ) *pi = XGetAtomName( _xklDpy, a ); else @@ -392,6 +456,7 @@ int _XklXkbInit( void ) _XklXkbGetMaxNumGroups, _XklXkbGetNumGroups, _XklXkbGetRealState, + _XklXkbIfCachedInfoEqualsActual, _XklXkbLoadAllInfo, _XklXkbLockGroup, _XklXkbPauseListen, diff --git a/libxklavier/xklavier_xmm.c b/libxklavier/xklavier_xmm.c index c211aac..27b8e81 100755 --- a/libxklavier/xklavier_xmm.c +++ b/libxklavier/xklavier_xmm.c @@ -150,6 +150,11 @@ void _XklXmmFreeAllInfo( ) XklConfigRecReset( ¤tXmmConfig ); } +Bool _XklXmmIfCachedInfoEqualsActual( void ) +{ + return False; +} + Bool _XklXmmLoadAllInfo( ) { return _XklConfigGetFullFromServer( ¤tXmmRules, ¤tXmmConfig ); @@ -245,6 +250,7 @@ int _XklXmmInit( void ) _XklXmmGetMaxNumGroups, _XklXmmGetNumGroups, _XklXmmGetRealState, + _XklXmmIfCachedInfoEqualsActual, _XklXmmLoadAllInfo, _XklXmmLockGroup, _XklXmmPauseListen, |