summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2003-12-31 00:59:16 +0000
committerSergey Udaltsov <svu@gnome.org>2003-12-31 00:59:16 +0000
commitbc37859dcbe282feca38d1ce359e916a76331bd8 (patch)
treec48a4a764e0eb13d8b101af02106f1943cfc8ac9
parent4efb59b73098b2b6f2f1f67024a84fda2a597fd3 (diff)
downloadlibxklavier-bc37859dcbe282feca38d1ce359e916a76331bd8.tar.gz
some staff taken from xkb-dependent C file
-rw-r--r--libxklavier/xklavier.c61
-rw-r--r--libxklavier/xklavier_props.c199
-rw-r--r--libxklavier/xklavier_xkb.c263
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;
-}