diff options
author | Sergey Udaltsov <svu@gnome.org> | 2003-12-31 00:59:16 +0000 |
---|---|---|
committer | Sergey Udaltsov <svu@gnome.org> | 2003-12-31 00:59:16 +0000 |
commit | bc37859dcbe282feca38d1ce359e916a76331bd8 (patch) | |
tree | c48a4a764e0eb13d8b101af02106f1943cfc8ac9 | |
parent | 4efb59b73098b2b6f2f1f67024a84fda2a597fd3 (diff) |
some staff taken from xkb-dependent C file
-rw-r--r-- | libxklavier/xklavier.c | 61 | ||||
-rw-r--r-- | libxklavier/xklavier_props.c | 199 | ||||
-rw-r--r-- | libxklavier/xklavier_xkb.c | 263 |
3 files changed, 263 insertions, 260 deletions
diff --git a/libxklavier/xklavier.c b/libxklavier/xklavier.c index 8c81b1d..ed11b0c 100644 --- a/libxklavier/xklavier.c +++ b/libxklavier/xklavier.c @@ -199,6 +199,17 @@ Bool XklUngrabKey( int key, unsigned modifiers ) return Success == XUngrabKey( _xklDpy, keyCode, 0, _xklRootWindow ); } +int XklGetNextGroup( ) +{ + return ( _xklCurState.group + 1 ) % XklGetNumGroups( ); +} + +int XklGetPrevGroup( ) +{ + int n = XklGetNumGroups( ); + return ( _xklCurState.group + n - 1 ) % n; +} + int XklGetRestoreGroup( ) { XklState state; @@ -483,6 +494,56 @@ void XklDefaultLogAppender( const char file[], const char function[], } /** + * Gets the state from the window property + */ +Bool _XklGetAppState( Window appWin, XklState * state_return ) +{ + Atom type_ret; + int format_ret; + unsigned long nitems, rest; + CARD32 *prop = NULL; + Bool ret = False; + + int grp = -1; + unsigned inds = -1; + + if( ( XGetWindowProperty + ( _xklDpy, appWin, _xklAtoms[XKLAVIER_STATE], 0L, + XKLAVIER_STATE_PROP_LENGTH, False, + XA_INTEGER, &type_ret, &format_ret, &nitems, &rest, + ( unsigned char ** ) &prop ) == Success ) + && ( type_ret == XA_INTEGER ) && ( format_ret == 32 ) ) + { + grp = prop[0]; + if( grp >= XklGetNumGroups( ) || grp < 0 ) + grp = 0; + + inds = prop[1]; + + if( state_return != NULL ) + { + state_return->group = grp; + state_return->indicators = inds; + } + if( prop != NULL ) + XFree( prop ); + + ret = True; + } + + if( ret ) + XklDebug( 150, + "Appwin " WINID_FORMAT + ", '%s' has the group %d, indicators %X\n", appWin, + _XklGetDebugWindowTitle( appWin ), grp, inds ); + else + XklDebug( 150, "Appwin " WINID_FORMAT ", '%s' does not have state\n", + appWin, _XklGetDebugWindowTitle( appWin ) ); + + return ret; +} + +/** * Deletes the state from the window properties */ void _XklDelAppState( Window appWin ) diff --git a/libxklavier/xklavier_props.c b/libxklavier/xklavier_props.c index 98a7338..5fb861c 100644 --- a/libxklavier/xklavier_props.c +++ b/libxklavier/xklavier_props.c @@ -155,3 +155,202 @@ Bool XklRestoreNamesProp( ) return rv; } + +// taken from XFree86 maprules.c +#define _XKB_RF_NAMES_PROP_MAXLEN 1024 + +Bool XklGetNamesProp( Atom rulesAtom, + char **rulesFileOut, XklConfigRecPtr data ) +{ + Atom realPropType; + int fmt; + unsigned long nitems, extraBytes; + char *propData, *out; + Status rtrn; + + // no such atom! + if( rulesAtom == None ) /* property cannot exist */ + { + _xklLastErrorMsg = "Could not find the atom"; + return False; + } + + rtrn = + XGetWindowProperty( _xklDpy, _xklRootWindow, rulesAtom, 0L, + _XKB_RF_NAMES_PROP_MAXLEN, False, XA_STRING, + &realPropType, &fmt, &nitems, &extraBytes, + ( unsigned char ** ) &propData ); + // property not found! + if( rtrn != Success ) + { + _xklLastErrorMsg = "Could not get the property"; + return False; + } + // set rules file to "" + if( rulesFileOut ) + *rulesFileOut = NULL; + + // has to be array of strings + if( ( extraBytes > 0 ) || ( realPropType != XA_STRING ) || ( fmt != 8 ) ) + { + if( propData ) + XFree( propData ); + _xklLastErrorMsg = "Wrong property format"; + return False; + } + // rules file + out = propData; + if( out && ( *out ) && rulesFileOut ) + *rulesFileOut = strdup( out ); + out += strlen( out ) + 1; + + if( ( out - propData ) < nitems ) + { + if( *out ) + data->model = strdup( out ); + out += strlen( out ) + 1; + } + + if( ( out - propData ) < nitems ) + { + _XklConfigRecSplitLayouts( data, out ); + out += strlen( out ) + 1; + } + + if( ( out - propData ) < nitems ) + { + int i; + char **theLayout, **theVariant; + _XklConfigRecSplitVariants( data, out ); + /* + Now have to ensure that number of variants matches the number of layouts + The 'remainder' is filled with NULLs (not ""s!) + */ + if( data->numVariants < data->numLayouts ) + { + data->variants = + realloc( data->variants, data->numLayouts * sizeof( char * ) ); + memset( data->variants + data->numVariants, 0, + ( data->numLayouts - data->numVariants ) * sizeof( char * ) ); + data->numVariants = data->numLayouts; + } + // take variants from layouts like ru(winkeys) + theLayout = data->layouts; + theVariant = data->variants; + for( i = data->numLayouts; --i >= 0; theLayout++, theVariant++ ) + { + if( *theLayout != NULL ) + { + char *varstart = strchr( *theLayout, '(' ); + if( varstart != NULL ) + { + char *varend = strchr( varstart, ')' ); + if( varend != NULL ) + { + int varlen = varend - varstart; + int laylen = varstart - *theLayout; + // I am not sure - but I assume variants in layout have priority + char *var = *theVariant = ( *theVariant != NULL ) ? + realloc( *theVariant, varlen ) : malloc( varlen ); + memcpy( var, varstart + 1, --varlen ); + var[varlen] = '\0'; + realloc( *theLayout, laylen + 1 ); + ( *theLayout )[laylen] = '\0'; + } + } + } + } + out += strlen( out ) + 1; + } + + if( ( out - propData ) < nitems ) + { + _XklConfigRecSplitOptions( data, out ); +// out += strlen( out ) + 1; + } + XFree( propData ); + return True; +} + +// taken from XFree86 maprules.c +Bool XklSetNamesProp( Atom rulesAtom, + char *rulesFile, const XklConfigRecPtr data ) +{ + int len, i, rv; + char *pval; + char *next; + char *allLayouts = _XklConfigRecMergeLayouts( data ); + char *allVariants = _XklConfigRecMergeVariants( data ); + char *allOptions = _XklConfigRecMergeOptions( data ); + + len = ( rulesFile ? strlen( rulesFile ) : 0 ); + len += ( data->model ? strlen( data->model ) : 0 ); + len += ( allLayouts ? strlen( allLayouts ) : 0 ); + len += ( allVariants ? strlen( allVariants ) : 0 ); + len += ( allOptions ? strlen( allOptions ) : 0 ); + if( len < 1 ) + return True; + + len += 5; /* trailing NULs */ + + pval = next = ( char * ) malloc( len + 1 ); + if( !pval ) + { + _xklLastErrorMsg = "Could not allocate buffer"; + return False; + } + if( rulesFile ) + { + strcpy( next, rulesFile ); + next += strlen( rulesFile ); + } + *next++ = '\0'; + if( data->model ) + { + strcpy( next, data->model ); + next += strlen( data->model ); + } + *next++ = '\0'; + if( data->layouts ) + { + strcpy( next, allLayouts ); + next += strlen( allLayouts ); + } + *next++ = '\0'; + if( data->variants ) + { + strcpy( next, allVariants ); + next += strlen( allVariants ); + } + *next++ = '\0'; + if( data->options ) + { + strcpy( next, allOptions ); + next += strlen( allOptions ); + } + *next++ = '\0'; + if( ( next - pval ) != len ) + { + XklDebug( 150, "Illegal final position: %d/%d\n", ( next - pval ), len ); + if( allOptions != NULL ) + free( allOptions ); + free( pval ); + _xklLastErrorMsg = "Internal property parsing error"; + return False; + } + + rv = XChangeProperty( _xklDpy, _xklRootWindow, rulesAtom, XA_STRING, 8, + PropModeReplace, ( unsigned char * ) pval, len ); + XSync( _xklDpy, False ); +#if 0 + for( i = len - 1; --i >= 0; ) + if( pval[i] == '\0' ) + pval[i] = '?'; + XklDebug( 150, "Stored [%s] of length %d to [%s] of %X: %d\n", pval, len, + propName, _xklRootWindow, rv ); +#endif + if( allOptions != NULL ) + free( allOptions ); + free( pval ); + return True; +} diff --git a/libxklavier/xklavier_xkb.c b/libxklavier/xklavier_xkb.c index 8f8176c..5dd6994 100644 --- a/libxklavier/xklavier_xkb.c +++ b/libxklavier/xklavier_xkb.c @@ -12,8 +12,6 @@ XkbDescPtr _xklXkb; char *_xklIndicatorNames[XkbNumIndicators]; -Atom _xklIndicatorAtoms[XkbNumIndicators]; - unsigned _xklPhysIndicatorsMask; int _xklXkbEventType, _xklXkbError; @@ -120,17 +118,6 @@ unsigned XklGetNumGroups( ) return _xklXkb->ctrls->num_groups; } -int XklGetNextGroup( ) -{ - return ( _xklCurState.group + 1 ) % _xklXkb->ctrls->num_groups; -} - -int XklGetPrevGroup( ) -{ - int n = _xklXkb->ctrls->num_groups; - return ( _xklCurState.group + n - 1 ) % n; -} - #define KBD_MASK \ ( 0 ) #define CTRLS_MASK \ @@ -146,7 +133,10 @@ void _XklFreeAllInfo( ) char **groupName = groupNames; for( i = _xklXkb->ctrls->num_groups; --i >= 0; groupName++ ) if( *groupName ) + { XFree( *groupName ); + *groupName = NULL; + } XkbFreeKeyboard( _xklXkb, XkbAllComponentsMask, True ); _xklXkb = NULL; } @@ -226,56 +216,6 @@ Bool _XklLoadAllInfo( ) return True; } -/** - * Gets the state from the window property - */ -Bool _XklGetAppState( Window appWin, XklState * state_return ) -{ - Atom type_ret; - int format_ret; - unsigned long nitems, rest; - CARD32 *prop = NULL; - Bool ret = False; - - int grp = -1; - unsigned inds = -1; - - if( ( XGetWindowProperty - ( _xklDpy, appWin, _xklAtoms[XKLAVIER_STATE], 0L, - XKLAVIER_STATE_PROP_LENGTH, False, - XA_INTEGER, &type_ret, &format_ret, &nitems, &rest, - ( unsigned char ** ) &prop ) == Success ) - && ( type_ret == XA_INTEGER ) && ( format_ret == 32 ) ) - { - grp = prop[0]; - if( grp >= _xklXkb->ctrls->num_groups || grp < 0 ) - grp = 0; - - inds = prop[1]; - - if( state_return != NULL ) - { - state_return->group = grp; - state_return->indicators = inds; - } - if( prop != NULL ) - XFree( prop ); - - ret = True; - } - - if( ret ) - XklDebug( 150, - "Appwin " WINID_FORMAT - ", '%s' has the group %d, indicators %X\n", appWin, - _XklGetDebugWindowTitle( appWin ), grp, inds ); - else - XklDebug( 150, "Appwin " WINID_FORMAT ", '%s' does not have state\n", - appWin, _XklGetDebugWindowTitle( appWin ) ); - - return ret; -} - void XklLockGroup( int group ) { XklDebug( 100, "Posted request for change the group to %d ##\n", group ); @@ -459,200 +399,3 @@ Bool _XklSetIndicator( int indicatorNum, Bool set ) return True; } - -// taken from XFree86 maprules.c -Bool XklGetNamesProp( Atom rulesAtom, - char **rulesFileOut, XklConfigRecPtr data ) -{ - Atom realPropType; - int fmt; - unsigned long nitems, extraBytes; - char *propData, *out; - Status rtrn; - - // no such atom! - if( rulesAtom == None ) /* property cannot exist */ - { - _xklLastErrorMsg = "Could not find the atom"; - return False; - } - - rtrn = - XGetWindowProperty( _xklDpy, _xklRootWindow, rulesAtom, 0L, - _XKB_RF_NAMES_PROP_MAXLEN, False, XA_STRING, - &realPropType, &fmt, &nitems, &extraBytes, - ( unsigned char ** ) &propData ); - // property not found! - if( rtrn != Success ) - { - _xklLastErrorMsg = "Could not get the property"; - return False; - } - // set rules file to "" - if( rulesFileOut ) - *rulesFileOut = NULL; - - // has to be array of strings - if( ( extraBytes > 0 ) || ( realPropType != XA_STRING ) || ( fmt != 8 ) ) - { - if( propData ) - XFree( propData ); - _xklLastErrorMsg = "Wrong property format"; - return False; - } - // rules file - out = propData; - if( out && ( *out ) && rulesFileOut ) - *rulesFileOut = strdup( out ); - out += strlen( out ) + 1; - - if( ( out - propData ) < nitems ) - { - if( *out ) - data->model = strdup( out ); - out += strlen( out ) + 1; - } - - if( ( out - propData ) < nitems ) - { - _XklConfigRecSplitLayouts( data, out ); - out += strlen( out ) + 1; - } - - if( ( out - propData ) < nitems ) - { - int i; - char **theLayout, **theVariant; - _XklConfigRecSplitVariants( data, out ); - /* - Now have to ensure that number of variants matches the number of layouts - The 'remainder' is filled with NULLs (not ""s!) - */ - if( data->numVariants < data->numLayouts ) - { - data->variants = - realloc( data->variants, data->numLayouts * sizeof( char * ) ); - memset( data->variants + data->numVariants, 0, - ( data->numLayouts - data->numVariants ) * sizeof( char * ) ); - data->numVariants = data->numLayouts; - } - // take variants from layouts like ru(winkeys) - theLayout = data->layouts; - theVariant = data->variants; - for( i = data->numLayouts; --i >= 0; theLayout++, theVariant++ ) - { - if( *theLayout != NULL ) - { - char *varstart = strchr( *theLayout, '(' ); - if( varstart != NULL ) - { - char *varend = strchr( varstart, ')' ); - if( varend != NULL ) - { - int varlen = varend - varstart; - int laylen = varstart - *theLayout; - // I am not sure - but I assume variants in layout have priority - char *var = *theVariant = ( *theVariant != NULL ) ? - realloc( *theVariant, varlen ) : malloc( varlen ); - memcpy( var, varstart + 1, --varlen ); - var[varlen] = '\0'; - realloc( *theLayout, laylen + 1 ); - ( *theLayout )[laylen] = '\0'; - } - } - } - } - out += strlen( out ) + 1; - } - - if( ( out - propData ) < nitems ) - { - _XklConfigRecSplitOptions( data, out ); -// out += strlen( out ) + 1; - } - XFree( propData ); - return True; -} - -// taken from XFree86 maprules.c -Bool XklSetNamesProp( Atom rulesAtom, - char *rulesFile, const XklConfigRecPtr data ) -{ - int len, i, rv; - char *pval; - char *next; - char *allLayouts = _XklConfigRecMergeLayouts( data ); - char *allVariants = _XklConfigRecMergeVariants( data ); - char *allOptions = _XklConfigRecMergeOptions( data ); - - len = ( rulesFile ? strlen( rulesFile ) : 0 ); - len += ( data->model ? strlen( data->model ) : 0 ); - len += ( allLayouts ? strlen( allLayouts ) : 0 ); - len += ( allVariants ? strlen( allVariants ) : 0 ); - len += ( allOptions ? strlen( allOptions ) : 0 ); - if( len < 1 ) - return True; - - len += 5; /* trailing NULs */ - - pval = next = ( char * ) malloc( len + 1 ); - if( !pval ) - { - _xklLastErrorMsg = "Could not allocate buffer"; - return False; - } - if( rulesFile ) - { - strcpy( next, rulesFile ); - next += strlen( rulesFile ); - } - *next++ = '\0'; - if( data->model ) - { - strcpy( next, data->model ); - next += strlen( data->model ); - } - *next++ = '\0'; - if( data->layouts ) - { - strcpy( next, allLayouts ); - next += strlen( allLayouts ); - } - *next++ = '\0'; - if( data->variants ) - { - strcpy( next, allVariants ); - next += strlen( allVariants ); - } - *next++ = '\0'; - if( data->options ) - { - strcpy( next, allOptions ); - next += strlen( allOptions ); - } - *next++ = '\0'; - if( ( next - pval ) != len ) - { - XklDebug( 150, "Illegal final position: %d/%d\n", ( next - pval ), len ); - if( allOptions != NULL ) - free( allOptions ); - free( pval ); - _xklLastErrorMsg = "Internal property parsing error"; - return False; - } - - rv = XChangeProperty( _xklDpy, _xklRootWindow, rulesAtom, XA_STRING, 8, - PropModeReplace, ( unsigned char * ) pval, len ); - XSync( _xklDpy, False ); -#if 0 - for( i = len - 1; --i >= 0; ) - if( pval[i] == '\0' ) - pval[i] = '?'; - XklDebug( 150, "Stored [%s] of length %d to [%s] of %X: %d\n", pval, len, - propName, _xklRootWindow, rv ); -#endif - if( allOptions != NULL ) - free( allOptions ); - free( pval ); - return True; -} |