summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2004-11-02 01:36:25 +0000
committerSergey Udaltsov <svu@gnome.org>2004-11-02 01:36:25 +0000
commit6b41cdb4b6d67d8095c6b9eefa7003ec8a44ca87 (patch)
tree6453f0bc477745ecc84834869bd4ba276ad2a02a
parent253e818f948d458efd1d9df8558be22db9c161b1 (diff)
downloadlibxklavier-6b41cdb4b6d67d8095c6b9eefa7003ec8a44ca87.tar.gz
Ensuring VTable is initialized - before using it.
-rw-r--r--libxklavier/xklavier.c19
-rw-r--r--libxklavier/xklavier_config.c3
-rw-r--r--libxklavier/xklavier_private.h2
-rw-r--r--libxklavier/xklavier_xkb.c2
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