diff options
author | Sergey Udaltsov <svu@gnome.org> | 2004-11-02 01:36:25 +0000 |
---|---|---|
committer | Sergey Udaltsov <svu@gnome.org> | 2004-11-02 01:36:25 +0000 |
commit | 6b41cdb4b6d67d8095c6b9eefa7003ec8a44ca87 (patch) | |
tree | 6453f0bc477745ecc84834869bd4ba276ad2a02a | |
parent | 253e818f948d458efd1d9df8558be22db9c161b1 (diff) | |
download | libxklavier-6b41cdb4b6d67d8095c6b9eefa7003ec8a44ca87.tar.gz |
Ensuring VTable is initialized - before using it.
-rw-r--r-- | libxklavier/xklavier.c | 19 | ||||
-rw-r--r-- | libxklavier/xklavier_config.c | 3 | ||||
-rw-r--r-- | libxklavier/xklavier_private.h | 2 | ||||
-rw-r--r-- | libxklavier/xklavier_xkb.c | 2 |
4 files changed, 24 insertions, 2 deletions
diff --git a/libxklavier/xklavier.c b/libxklavier/xklavier.c index a9c718a..0ce8a53 100644 --- a/libxklavier/xklavier.c +++ b/libxklavier/xklavier.c @@ -37,7 +37,7 @@ int _xklDebugLevel = 0; Window _xklPrevAppWindow; -XklVTable *xklVTable; +XklVTable *xklVTable = NULL; XklConfigCallback _xklConfigCallback = NULL; void *_xklConfigCallbackData; @@ -698,41 +698,58 @@ Bool _XklIsTransparentAppWindow( Window appWin ) return False; } +void _XklEnsureVTableInited( void ) +{ + if ( xklVTable == NULL ) + { + XklDebug( 0, "ERROR: XKL VTable is NOT initialized.\n" ); + /* force the crash! */ + char *p = NULL; *p = '\0'; + } +} + /** * Calling through vtable */ const char **XklGetGroupNames( void ) { + _XklEnsureVTableInited(); return (*xklVTable->xklGetGroupNamesHandler)(); } unsigned XklGetNumGroups( void ) { + _XklEnsureVTableInited(); return (*xklVTable->xklGetNumGroupsHandler)(); } void XklLockGroup( int group ) { + _XklEnsureVTableInited(); (*xklVTable->xklLockGroupHandler)( group ); } int XklPauseListen( void ) { + _XklEnsureVTableInited(); return (*xklVTable->xklPauseListenHandler)(); } int XklResumeListen( void ) { + _XklEnsureVTableInited(); return (*xklVTable->xklResumeListenHandler)(); } Bool _XklLoadAllInfo( void ) { + _XklEnsureVTableInited(); return (*xklVTable->xklLoadAllInfoHandler)(); } void _XklFreeAllInfo( void ) { + _XklEnsureVTableInited(); (*xklVTable->xklFreeAllInfoHandler)(); } diff --git a/libxklavier/xklavier_config.c b/libxklavier/xklavier_config.c index 8da1bdd..239742a 100644 --- a/libxklavier/xklavier_config.c +++ b/libxklavier/xklavier_config.c @@ -521,11 +521,13 @@ Bool XklConfigFindOption( const char *optionGroupName, */ Bool XklConfigActivate( const XklConfigRecPtr data ) { + _XklEnsureVTableInited(); return (*xklVTable->xklConfigActivateHandler)( data ); } Bool XklMultipleLayoutsSupported( void ) { + _XklEnsureVTableInited(); return (*xklVTable->xklConfigMultipleLayoutsSupportedHandler)(); } @@ -533,6 +535,7 @@ Bool XklConfigWriteFile( const char *fileName, const XklConfigRecPtr data, const Bool binary ) { + _XklEnsureVTableInited(); return (*xklVTable->xklConfigWriteFileHandler)( fileName, data, binary ); } diff --git a/libxklavier/xklavier_private.h b/libxklavier/xklavier_private.h index 66ca5bd..5d7d79d 100644 --- a/libxklavier/xklavier_private.h +++ b/libxklavier/xklavier_private.h @@ -42,6 +42,8 @@ typedef struct XklPauseResumeListenHandler xklResumeListenHandler; } XklVTable; +extern void _XklEnsureVTableInited( void ); + extern void _XklGetRealState( XklState * curState_return ); extern void _XklAddAppWindow( Window win, Window parent, Bool force, XklState * initState ); diff --git a/libxklavier/xklavier_xkb.c b/libxklavier/xklavier_xkb.c index 4efdec2..df7554f 100644 --- a/libxklavier/xklavier_xkb.c +++ b/libxklavier/xklavier_xkb.c @@ -398,7 +398,7 @@ int _XklXkbInit( void ) xklVTable = &xklXkbVTable; - return _XklLoadAllInfo( )? 0 : _xklLastErrorCode; + return _XklLoadAllInfo( ) ? 0 : _xklLastErrorCode; #else XklDebug( 160, "NO XKB LIBS, display: %p, root: " WINID_FORMAT |