summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2005-01-08 00:00:40 +0000
committerSergey Udaltsov <svu@gnome.org>2005-01-08 00:00:40 +0000
commit46b857188be32ad483211b36635779a0241c45ef (patch)
tree255b509274bbabf941d83148ce86992cb1496235
parent8b45c4aa4725b28ee4be1c2310874d1620690e71 (diff)
downloadlibxklavier-46b857188be32ad483211b36635779a0241c45ef.tar.gz
optimizations/fixes
-rw-r--r--ChangeLog4
-rw-r--r--libxklavier/xklavier.c11
-rw-r--r--libxklavier/xklavier_evt.c1
-rw-r--r--libxklavier/xklavier_evt_xkb.c2
-rw-r--r--libxklavier/xklavier_private.h9
-rw-r--r--libxklavier/xklavier_private_xkb.h2
-rw-r--r--libxklavier/xklavier_private_xmm.h2
-rw-r--r--libxklavier/xklavier_xkb.c125
-rwxr-xr-xlibxklavier/xklavier_xmm.c6
9 files changed, 128 insertions, 34 deletions
diff --git a/ChangeLog b/ChangeLog
index 653ebb4..eb934f3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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( &currentXmmConfig );
}
+Bool _XklXmmIfCachedInfoEqualsActual( void )
+{
+ return False;
+}
+
Bool _XklXmmLoadAllInfo( )
{
return _XklConfigGetFullFromServer( &currentXmmRules, &currentXmmConfig );
@@ -245,6 +250,7 @@ int _XklXmmInit( void )
_XklXmmGetMaxNumGroups,
_XklXmmGetNumGroups,
_XklXmmGetRealState,
+ _XklXmmIfCachedInfoEqualsActual,
_XklXmmLoadAllInfo,
_XklXmmLockGroup,
_XklXmmPauseListen,