summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2004-10-01 20:51:10 +0000
committerSergey Udaltsov <svu@gnome.org>2004-10-01 20:51:10 +0000
commit99b638f7c435c571d27a5c5a97ef3726d43aa910 (patch)
treedafaa5db0311602448aee6de85b955f7aa2ad983
parent781dd4c31fdfb8e034d61a9e71f78b9d055f3713 (diff)
downloadlibxklavier-99b638f7c435c571d27a5c5a97ef3726d43aa910.tar.gz
Syncing with HEAD. Major leaks nailed. Default ruleset introduced (well, it does not help much)
-rw-r--r--ChangeLog320
-rw-r--r--Makefile.am2
-rw-r--r--configure.in8
-rw-r--r--libxklavier/xklavier_config.c12
-rw-r--r--libxklavier/xklavier_config_xkb.c54
-rw-r--r--libxklavier/xklavier_props.c66
-rw-r--r--tests/.cvsignore1
-rw-r--r--tests/Makefile.am10
-rw-r--r--tests/test_config.c207
-rw-r--r--tests/test_monitor.c112
10 files changed, 750 insertions, 42 deletions
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..4bf2932
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,320 @@
+2004-09-18 00:42 svu
+
+ * configure.in, libxklavier/xklavier_config_xkb.c,
+ libxklavier/xklavier_props.c: The default value for the root
+ window property is introduced. I help it will help to the poor
+ people with broken XKB - just a little...
+
+2004-08-09 23:24 svu
+
+ * libxklavier/: xklavier_config_xkb.c, xklavier_evt.c,
+ xklavier_private.h, xklavier_util.c: syncing with b_1_00
+
+2004-08-09 23:06 svu
+
+ * libxklavier/xklavier_evt.c: fixing 126200
+
+2004-07-26 20:05 svu
+
+ * libxklavier/xklavier_config_xkb.c: fixing non-compilation error
+ on non-xkb systems, reported by Albert Chin-A-Young
+
+2004-06-26 02:26 svu
+
+ * RELEASE_NOTES_1_03: preparing 1.03
+
+2004-06-13 13:26 svu
+
+ * libxklavier/: xklavier_evt.c, xklavier_private.h,
+ xklavier_util.c: a bit improved debugging
+
+2004-06-09 01:58 svu
+
+ * libxklavier/: xklavier_evt.c, xklavier_private.h,
+ xklavier_util.c: forward-porting of the bugfixes from b_1_00
+ branch
+
+2004-06-08 02:44 svu
+
+ * libxklavier/xklavier_evt.c: some improvement in the last fix -
+ really update the current state only when LockGroup is planned
+
+2004-06-08 02:20 svu
+
+ * libxklavier/: xklavier_evt.c, xklavier_private.h,
+ xklavier_util.c: Some little restructuring, more debugging - AND
+ BIG FIX for global mode - we should not read current state from
+ the window focus switched to.
+
+2004-05-27 23:41 svu
+
+ * libxklavier/: xklavier.c: VERY VERY BAD BUG. ETERNAL SHAME ON ME
+
+2004-04-30 01:02 svu
+
+ * configure.in, libxklavier/xklavier_config_xkb.c,
+ libxklavier/xklavier_evt.c: syncing with b_1_0
+
+2004-04-30 00:55 svu
+
+ * configure.in, libxklavier/xklavier_config_xkb.c: hopefully now
+ libxklavier better detects multiple layouts support
+
+2004-04-29 22:21 svu
+
+ * libxklavier/xklavier_evt.c: more correct handling of transparent
+ windows in the global switching mode
+
+2004-04-19 21:04 svu
+
+ * RELEASE_NOTES_1_02, configure.in,
+ libxklavier/xklavier_config_xkb.c,
+ libxklavier/xklavier_private.h, libxklavier/xklavier_props.c:
+ syncing with b_1_00 - do not want to get jhbuild problems any
+ more
+
+2004-04-19 20:41 svu
+
+ * libxklavier/xklavier_config_xkb.c: compilation fix for non-xkb
+ arches
+
+2004-04-13 22:33 svu
+
+ * RELEASE_NOTES_1_02: preparing one more release - without
+ redundant configure flag
+
+2004-04-13 22:21 svu
+
+ * libxklavier/: xklavier_config_xkb.c, xklavier_private.h,
+ xklavier_props.c: no memory leaks necessary - just static data
+
+2004-04-12 22:08 svu
+
+ * configure.in, libxklavier/xklavier_config_xkb.c,
+ libxklavier/xklavier_props.c: it seems we got runtime rules
+ detection working
+
+2004-04-12 18:35 svu
+
+ * configure.in: better help message
+
+2004-04-12 18:11 svu
+
+ * configure.in: better help message
+
+2004-04-09 23:09 svu
+
+ * RELEASE_NOTES_1_01, configure.in,
+ libxklavier/xklavier_config_xkb.c: synching with HEAD
+
+2004-04-09 21:15 svu
+
+ * RELEASE_NOTES_1_01: preparing urgent release
+
+2004-04-09 21:11 svu
+
+ * configure.in, libxklavier/xklavier_config_xkb.c: I suppose now
+ libxklavier should be able to live in xorg world - the name of
+ the rules files is customizable at build-time
+
+2004-03-16 22:53 svu
+
+ * RELEASE_NOTES_1_00, configure.in: preparing 1.00
+
+2004-03-16 22:37 svu
+
+ * libxklavier/xklavier_xkb.c: Cleaner patch for the improper
+ display - along with some debug print, by Jody
+
+2004-03-04 22:58 svu
+
+ * libxklavier/xklavier_evt.c: All events can just come through
+ transparently
+
+2004-03-04 22:55 svu
+
+ * libxklavier/xklavier_config.h: out-of-date param comment removed
+
+2004-03-04 22:54 svu
+
+ * libxklavier/xklavier_xkb.c: fix for Solaris by Niall - though I
+ still do not understand how dpy can be NULL
+
+2004-03-04 00:56 svu
+
+ * libxklavier/xklavier.c: Some Solaris compilation patch (thanks to
+ Glynn Foster) - overall better than it was, unsigned should not
+ be just -1
+
+2004-01-26 09:32 svu
+
+ * RELEASE_NOTES_0_97: preparing 0.97
+
+2004-01-22 08:57 svu
+
+ * libxklavier/xklavier.h: fixed preprocessor varargs for solaris
+ compiler
+
+2004-01-21 09:14 svu
+
+ * configure.in, libxklavier/xklavier_config.c,
+ libxklavier/xklavier_config.h, libxklavier/xklavier_config_xkb.c,
+ libxklavier/xklavier_dump.c, libxklavier/xklavier_private_xkb.h,
+ libxklavier/xklavier_xkb.c: The public API does not depend on XKB
+ symbols any more. The API/ABI are broken
+
+2004-01-20 08:56 svu
+
+ * libxklavier/: Makefile.am, xklavier.h, xklavier_config.h,
+ xklavier_config_xkb.c, xklavier_dump.c, xklavier_evt.c,
+ xklavier_private.h, xklavier_private_xkb.h, xklavier_props.c,
+ xklavier_xkb.c: Trying to make libxklavier buildable without xkb
+ headers, first round
+
+2004-01-20 08:55 svu
+
+ * configure.in: detecting xkb headers
+
+2004-01-19 09:06 svu
+
+ * configure.in, libxklavier/Makefile.am: trying to be smart about
+ iconv
+
+2004-01-12 00:14 svu
+
+ * libxklavier/xklavier_props.c: Some a=a checking stuff makes life
+ a bit faster. But it happens rarely
+
+2004-01-11 00:51 svu
+
+ * libxklavier/: xklavier_config.h, xklavier_props.c: One extra
+ function to compare configurations
+
+2004-01-11 00:50 svu
+
+ * libxklavier/xklavier.c: 0 debugging initially. Otherwise the
+ startup of libxklavier applications does not look nice
+
+2004-01-01 21:48 svu
+
+ * doc/html/Makefile.am: GALAXYo made me fix installation without
+ doxygen
+
+2003-12-31 00:59 svu
+
+ * libxklavier/: xklavier.c, xklavier_props.c, xklavier_xkb.c: some
+ staff taken from xkb-dependent C file
+
+2003-12-31 00:58 svu
+
+ * configure.in: The proper share library versioning is important.
+ The new interface (8) compatible with old one (age 1)
+
+2003-12-30 23:40 svu
+
+ * libxklavier/: Makefile.am, xklavier.c, xklavier_config.c,
+ xklavier_config.h, xklavier_config_xkb.c, xklavier_dump.c,
+ xklavier_evt.c, xklavier_private.h, xklavier_private_xkb.h,
+ xklavier_props.c, xklavier_util.c, xklavier_xkb.c: first step in
+ separating all xkb-related things
+
+2003-12-20 03:30 svu
+
+ * RELEASE_NOTES_0_96: little polish
+
+2003-12-20 02:44 svu
+
+ * RELEASE_NOTES_0_96: preparing 0.96
+
+2003-12-19 22:26 svu
+
+ * libxklavier/Makefile.am: AM_CFLAGS used instead of CFLAGS
+
+2003-12-19 09:40 svu
+
+ * xfree86.xml: I GOT SICK OF PEOPLE BUILDING THINGS FROM CVS
+
+2003-12-19 09:37 svu
+
+ * libxklavier/xklavier_config.c: fixes for Solaris and other OSes
+ which does not have strndup, thanks to George Sageev
+
+2003-11-17 23:32 svu
+
+ * libxklavier/: xklavier_config.c, xklavier_evt.c: a bit of cleanup
+
+2003-11-10 23:45 svu
+
+ * doc/html/Makefile.am: empty lines cause problems
+
+2003-11-10 23:44 svu
+
+ * autogen.sh: autogen should enable doxygen - maintainer mode, you
+ know
+
+2003-11-04 23:44 svu
+
+ * libxklavier/: Makefile.am, xklavier.c, xklavier_evt.c,
+ xklavier_util.c: small fixen
+
+2003-11-04 23:44 svu
+
+ * configure.in, libxklavier.spec.in, doc/html/Makefile.am: doxygen
+ disabled by default - and docs are included in tarball
+
+2003-10-31 02:47 svu
+
+ * configure.in, libxklavier/Makefile.am: now really looking for X
+ includes. Thanks to Mike Castle
+
+2003-10-20 21:23 svu
+
+ * libxklavier.spec.in: stupid me - not devel but base package
+ should include xfree86.xml
+
+2003-10-20 21:19 svu
+
+ * RELEASE_NOTES_0_95: nearly 0.95
+
+2003-10-20 21:16 svu
+
+ * .cvsignore, Makefile.am, libxklavier.spec.in,
+ libxklavier/Makefile.am, libxklavier/xklavier_config.c:
+ xfree86.xml fallback implemented - as requested by Jody
+
+2003-10-19 03:21 svu
+
+ * libxklavier.pc.in: Thanks to Jody, the include path is
+ straightened out
+
+2003-09-20 00:36 svu
+
+ * .cvsignore, AUTHORS, COPYING.LIB, CREDITS, Doxyfile.in,
+ Makefile.am, NEWS, README, RELEASE_NOTES_0_3, RELEASE_NOTES_0_4,
+ RELEASE_NOTES_0_5, RELEASE_NOTES_0_6, RELEASE_NOTES_0_7,
+ RELEASE_NOTES_0_8, RELEASE_NOTES_0_90, autogen.sh, configure.in,
+ libxklavier.pc.in, libxklavier.spec.in, doc/.cvsignore,
+ doc/Makefile.am, doc/html/.cvsignore, doc/html/Makefile.am,
+ libxklavier/.cvsignore, libxklavier/Makefile.am,
+ libxklavier/xklavier.c, libxklavier/xklavier.h,
+ libxklavier/xklavier_config.c, libxklavier/xklavier_config.h,
+ libxklavier/xklavier_config_i18n.c, libxklavier/xklavier_dump.c,
+ libxklavier/xklavier_evt.c, libxklavier/xklavier_private.h,
+ libxklavier/xklavier_props.c, libxklavier/xklavier_util.c:
+ Initial revision
+
+2003-09-20 00:36 svu
+
+ * .cvsignore, AUTHORS, COPYING.LIB, CREDITS, Doxyfile.in,
+ Makefile.am, NEWS, README, RELEASE_NOTES_0_3, RELEASE_NOTES_0_4,
+ RELEASE_NOTES_0_5, RELEASE_NOTES_0_6, RELEASE_NOTES_0_7,
+ RELEASE_NOTES_0_8, RELEASE_NOTES_0_90, autogen.sh, configure.in,
+ libxklavier.pc.in, libxklavier.spec.in, doc/.cvsignore,
+ doc/Makefile.am, doc/html/.cvsignore, doc/html/Makefile.am,
+ libxklavier/.cvsignore, libxklavier/Makefile.am,
+ libxklavier/xklavier.c, libxklavier/xklavier.h,
+ libxklavier/xklavier_config.c, libxklavier/xklavier_config.h,
+ libxklavier/xklavier_config_i18n.c, libxklavier/xklavier_dump.c,
+ libxklavier/xklavier_evt.c, libxklavier/xklavier_private.h,
+ libxklavier/xklavier_props.c, libxklavier/xklavier_util.c: start
+
diff --git a/Makefile.am b/Makefile.am
index 875840e..f531b81 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = libxklavier doc
+SUBDIRS = libxklavier doc tests
config_xml_DATA = xfree86.xml
config_xmldir = $(datadir)/$(PACKAGE)
diff --git a/configure.in b/configure.in
index 91208b2..eaf13ee 100644
--- a/configure.in
+++ b/configure.in
@@ -64,6 +64,13 @@ fi
AC_DEFINE_UNQUOTED(XKB_BASE,"${xkb_base}",Base for XKB configuration)
+AC_ARG_WITH( xkb_default_ruleset,
+ [ --with-xkb-default-ruleset=RULES XKB default set of rules (by default it is base)],
+ xkb_default_ruleset="$withval",
+ xkb_default_ruleset="base" )
+
+AC_DEFINE_UNQUOTED(XKB_DEFAULT_RULESET,"${xkb_default_ruleset}",Default XKB set of rules)
+
ac_xkblib_include="\
#include <stdio.h>
#include <X11/Xlib.h>
@@ -98,6 +105,7 @@ libxklavier.spec
Doxyfile
doc/Makefile
doc/html/Makefile
+tests/Makefile
libxklavier.pc
])
diff --git a/libxklavier/xklavier_config.c b/libxklavier/xklavier_config.c
index 040a733..00d5b4a 100644
--- a/libxklavier/xklavier_config.c
+++ b/libxklavier/xklavier_config.c
@@ -121,14 +121,22 @@ static Bool _XklReadConfigItem( xmlNodePtr iptr, XklConfigItemPtr pci )
XKL_MAX_CI_NAME_LENGTH - 1 );
if( shortDescElement != NULL && shortDescElement->children != NULL )
+ {
+ char * lsd = _XklLocaleFromUtf8( shortDescElement->children->content );
strncat( pci->shortDescription,
- _XklLocaleFromUtf8( shortDescElement->children->content ),
+ lsd,
XKL_MAX_CI_SHORT_DESC_LENGTH - 1 );
+ free( lsd );
+ }
if( descElement != NULL && descElement->children != NULL )
+ {
+ char * ld = _XklLocaleFromUtf8( descElement->children->content );
strncat( pci->description,
- _XklLocaleFromUtf8( descElement->children->content ),
+ ld,
XKL_MAX_CI_DESC_LENGTH - 1 );
+ free( ld );
+ }
return True;
}
diff --git a/libxklavier/xklavier_config_xkb.c b/libxklavier/xklavier_config_xkb.c
index eed17cd..64c04dc 100644
--- a/libxklavier/xklavier_config_xkb.c
+++ b/libxklavier/xklavier_config_xkb.c
@@ -41,7 +41,11 @@ static char* _XklGetRulesSetName( void )
{
char* rf = NULL;
if( !XklGetNamesProp( _xklAtoms[XKB_RF_NAMES_PROP_ATOM], &rf, NULL ) || ( rf == NULL ) )
- return NULL;
+ {
+ strncpy( rulesSetName, XKB_DEFAULT_RULESET, sizeof rulesSetName );
+ XklDebug( 100, "Using default rules set: [%s]\n", rulesSetName );
+ return rulesSetName;
+ }
strncpy( rulesSetName, rf, sizeof rulesSetName );
free( rf );
}
@@ -135,6 +139,16 @@ static Bool _XklConfigPrepareBeforeKbd( const XklConfigRecPtr data )
_xklLastErrorMsg = "Could not translate rules into components";
return False;
}
+
+ if ( _xklDebugLevel >= 200 )
+ {
+ XklDebug( 200, "keymap: %s\n", componentNames.keymap );
+ XklDebug( 200, "keycodes: %s\n", componentNames.keycodes );
+ XklDebug( 200, "compat: %s\n", componentNames.compat );
+ XklDebug( 200, "types: %s\n", componentNames.types );
+ XklDebug( 200, "symbols: %s\n", componentNames.symbols );
+ XklDebug( 200, "geometry: %s\n", componentNames.geometry );
+ }
#endif
return True;
}
@@ -144,21 +158,20 @@ static void _XklConfigCleanAfterKbd( )
#ifdef XKB_HEADERS_PRESENT
_XklFreeRulesSet();
- if( locale != NULL )
- {
- free( locale );
- locale = NULL;
- }
- if( _xklVarDefs.layout != NULL )
- {
- free( _xklVarDefs.layout );
- _xklVarDefs.layout = NULL;
- }
- if( _xklVarDefs.options != NULL )
- {
- free( _xklVarDefs.options );
- _xklVarDefs.options = NULL;
- }
+ free( locale );
+ locale = NULL;
+
+ free( _xklVarDefs.layout );
+ free( _xklVarDefs.variant );
+ free( _xklVarDefs.options );
+ memset( &_xklVarDefs, 0, sizeof( _xklVarDefs ) );
+
+ free(componentNames.keymap);
+ free(componentNames.keycodes);
+ free(componentNames.compat);
+ free(componentNames.types);
+ free(componentNames.symbols);
+ free(componentNames.geometry);
#endif
}
@@ -191,7 +204,16 @@ Bool XklMultipleLayoutsSupported( void )
XklDebug( 100, "!!! Multiple layouts ARE supported\n" );
supportState = SUPPORTED;
} else
+ {
XklDebug( 100, "!!! Multiple layouts ARE NOT supported\n" );
+ }
+ free(cNames.keymap);
+ free(cNames.keycodes);
+ free(cNames.compat);
+ free(cNames.types);
+ free(cNames.symbols);
+ free(cNames.geometry);
+
_XklFreeRulesSet();
}
#endif
diff --git a/libxklavier/xklavier_props.c b/libxklavier/xklavier_props.c
index f0363a6..f4dd1f9 100644
--- a/libxklavier/xklavier_props.c
+++ b/libxklavier/xklavier_props.c
@@ -13,6 +13,9 @@
#include "xklavier_config.h"
#include "xklavier_private.h"
+#define XKB_DEFAULT_MODEL "pc101"
+#define XKB_DEFAULT_LAYOUT "us"
+
void XklConfigRecInit( XklConfigRecPtr data )
{
// clear the structure VarDefsPtr...
@@ -43,6 +46,22 @@ static Bool ListsEqual( int numItems1, char** items1,
return True;
}
+static Bool _XklGetDefaultNamesProp( char **rulesFileOut, XklConfigRecPtr data )
+{
+ if ( rulesFileOut != NULL )
+ *rulesFileOut = strdup( XKB_DEFAULT_RULESET );
+ data->model = strdup( XKB_DEFAULT_MODEL );
+// keeping Nvariants = Nlayouts
+ data->numLayouts = data->numVariants = 1;
+ data->layouts = malloc( sizeof( char * ) );
+ data->layouts[0] = strdup( XKB_DEFAULT_LAYOUT );
+ data->variants = malloc( sizeof( char * ) );
+ data->variants[0] = strdup( "" );
+ data->numOptions = 0;
+ data->options = NULL;
+ return True;
+}
+
Bool XklConfigRecEquals( XklConfigRecPtr data1, XklConfigRecPtr data2 )
{
if ( data1 == data2 )
@@ -98,11 +117,11 @@ void XklConfigRecReset( XklConfigRecPtr data )
Bool XklConfigGetFromServer( XklConfigRecPtr data )
{
#ifdef XKB_HEADERS_PRESENT
- char *rulesFile = NULL;
Bool rv =
- XklGetNamesProp( _xklAtoms[XKB_RF_NAMES_PROP_ATOM], &rulesFile, data );
- if( rulesFile != NULL )
- free( rulesFile );
+ XklGetNamesProp( _xklAtoms[XKB_RF_NAMES_PROP_ATOM], NULL, data );
+
+ if( !rv )
+ rv = _XklGetDefaultNamesProp( NULL, data );
return rv;
#else
@@ -113,12 +132,8 @@ Bool XklConfigGetFromServer( XklConfigRecPtr data )
Bool XklConfigGetFromBackup( XklConfigRecPtr data )
{
#ifdef XKB_HEADERS_PRESENT
- char *rulesFile = NULL;
Bool rv =
- XklGetNamesProp( _xklAtoms[XKB_RF_NAMES_PROP_ATOM_BACKUP], &rulesFile,
- data );
- if( rulesFile != NULL )
- free( rulesFile );
+ XklGetNamesProp( _xklAtoms[XKB_RF_NAMES_PROP_ATOM_BACKUP], NULL, data );
return rv;
#else
@@ -130,21 +145,24 @@ Bool XklBackupNamesProp( )
{
Bool rv = True;
#ifdef XKB_HEADERS_PRESENT
- char *rf;
+ char *rf = NULL;
XklConfigRec data;
+ Bool cgp = False;
XklConfigRecInit( &data );
if( XklGetNamesProp
- ( _xklAtoms[XKB_RF_NAMES_PROP_ATOM_BACKUP], &rf, &data ) )
+ ( _xklAtoms[XKB_RF_NAMES_PROP_ATOM_BACKUP], NULL, &data ) )
{
XklConfigRecDestroy( &data );
- if( rf != NULL )
- free( rf );
return True;
}
// "backup" property is not defined
XklConfigRecReset( &data );
- if( XklGetNamesProp( _xklAtoms[XKB_RF_NAMES_PROP_ATOM], &rf, &data ) )
+ cgp = XklGetNamesProp( _xklAtoms[XKB_RF_NAMES_PROP_ATOM], &rf, &data );
+ if ( !cgp )
+ cgp = _XklGetDefaultNamesProp( &rf, &data );
+
+ if ( cgp )
{
#if 0
int i;
@@ -183,19 +201,16 @@ Bool XklRestoreNamesProp( )
{
Bool rv = True;
#ifdef XKB_HEADERS_PRESENT
- char *rf;
+ char *rf = NULL;
XklConfigRec data;
XklConfigRecInit( &data );
- if( !XklGetNamesProp( _xklAtoms[XKB_RF_NAMES_PROP_ATOM_BACKUP], &rf, &data ) )
+ if( !XklGetNamesProp( _xklAtoms[XKB_RF_NAMES_PROP_ATOM_BACKUP], NULL, &data ) )
{
XklConfigRecDestroy( &data );
return False;
}
- if( rf != NULL )
- free( rf );
-
if( !XklSetNamesProp( _xklAtoms[XKB_RF_NAMES_PROP_ATOM], rf, &data ) )
{
XklDebug( 150, "Could not backup the configuration" );
@@ -358,6 +373,9 @@ Bool XklSetNamesProp( Atom rulesAtom,
if( !pval )
{
_xklLastErrorMsg = "Could not allocate buffer";
+ if ( allLayouts != NULL ) free( allLayouts );
+ if ( allVariants != NULL ) free( allVariants );
+ if ( allOptions != NULL ) free( allOptions );
return False;
}
if( rulesFile )
@@ -393,8 +411,9 @@ Bool XklSetNamesProp( Atom rulesAtom,
if( ( next - pval ) != len )
{
XklDebug( 150, "Illegal final position: %d/%d\n", ( next - pval ), len );
- if( allOptions != NULL )
- free( allOptions );
+ if ( allLayouts != NULL ) free( allLayouts );
+ if ( allVariants != NULL ) free( allVariants );
+ if ( allOptions != NULL ) free( allOptions );
free( pval );
_xklLastErrorMsg = "Internal property parsing error";
return False;
@@ -410,8 +429,9 @@ Bool XklSetNamesProp( Atom rulesAtom,
XklDebug( 150, "Stored [%s] of length %d to [%s] of %X: %d\n", pval, len,
propName, _xklRootWindow, rv );
#endif
- if( allOptions != NULL )
- free( allOptions );
+ if ( allLayouts != NULL ) free( allLayouts );
+ if ( allVariants != NULL ) free( allVariants );
+ if ( allOptions != NULL ) free( allOptions );
free( pval );
return True;
}
diff --git a/tests/.cvsignore b/tests/.cvsignore
new file mode 100644
index 0000000..a731fea
--- /dev/null
+++ b/tests/.cvsignore
@@ -0,0 +1 @@
+Makefile Makefile.in *.o .libs .deps test_config test_monitor
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..70815c9
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,10 @@
+noinst_PROGRAMS=test_config test_monitor
+
+test_config_SOURCES=test_config.c
+
+test_monitor_SOURCES=test_monitor.c
+
+AM_CFLAGS=-I$(includedir) -I$(x_includes) -I$(top_srcdir)
+
+AM_LDFLAGS=$(top_builddir)/libxklavier/libxklavier.la -lX11
+
diff --git a/tests/test_config.c b/tests/test_config.c
new file mode 100644
index 0000000..ebe84dd
--- /dev/null
+++ b/tests/test_config.c
@@ -0,0 +1,207 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <X11/Xlib.h>
+#include <libxklavier/xklavier.h>
+#include <libxklavier/xklavier_config.h>
+
+enum { ACTION_NONE, ACTION_GET, ACTION_SET };
+
+static void printUsage()
+{
+ printf( "Usage: test_config (-g)|(-s -m <model> -l <layouts> -o <options>)|(-h)(-d <debugLevel>)\n" );
+ printf( "Options:\n" );
+ printf( " -g - Dump the current config, load original system settings and revert back\n" );
+ printf( " -s - Set the configuration given my -m -l -o options. Similar to setxkbmap\n" );
+ printf( " -d - Set the debug level (by default, 0)\n" );
+ printf( " -h - Show this help\n" );
+}
+
+static void dump( XklConfigRecPtr ptr )
+{
+ int i,j;
+ char**p;
+ XklDebug( 0, " model: [%s]\n", ptr->model );
+
+ XklDebug( 0, " layouts(%d):\n", ptr->numLayouts );
+ p = ptr->layouts;
+ for( i = ptr->numLayouts, j = 0; --i >= 0; )
+ XklDebug( 0, " %d: [%s]\n", j++, *p++ );
+
+ XklDebug( 0, " variants(%d):\n", ptr->numVariants );
+ p = ptr->variants;
+ for( i = ptr->numVariants, j = 0; --i >= 0; )
+ XklDebug( 0, " %d: [%s]\n", j++, *p++ );
+
+ XklDebug( 0, " options(%d):\n", ptr->numOptions );
+ p = ptr->options;
+ for( i = ptr->numOptions, j = 0; --i >= 0; )
+ XklDebug( 0, " %d: [%s]\n", j++, *p++ );
+}
+
+int main( int argc, char * const argv[] )
+{
+ int c, i;
+ int action = ACTION_NONE;
+ const char* model = NULL;
+ const char* layouts = NULL;
+ const char* options = NULL;
+ int debugLevel = 0;
+
+ while (1)
+ {
+ c = getopt( argc, argv, "hsgm:l:o:d:" );
+ if ( c == -1 )
+ break;
+ switch (c)
+ {
+ case 's':
+ printf( "Set the config\n" );
+ action = ACTION_SET;
+ break;
+ case 'g':
+ printf( "Get the config\n" );
+ action = ACTION_GET;
+ break;
+ case 'm':
+ printf( "Model: [%s]\n", model = optarg );
+ break;
+ case 'l':
+ printf( "Layouts: [%s]\n", layouts = optarg );
+ break;
+ case 'o':
+ printf( "Options: [%s]\n", options = optarg );
+ break;
+ case 'h':
+ printUsage();
+ exit(0);
+ case 'd':
+ debugLevel = atoi( optarg );
+ break;
+ default:
+ fprintf( stderr, "?? getopt returned character code 0%o ??\n", c );
+ printUsage();
+ }
+ }
+
+ if ( action == ACTION_NONE )
+ {
+ printUsage();
+ exit( 0 );
+ }
+
+ Display* dpy = XOpenDisplay( NULL );
+ if ( dpy == NULL )
+ {
+ fprintf( stderr, "Could not open display\n" );
+ exit(1);
+ }
+ printf( "opened display: %p\n", dpy );
+ if ( !XklInit( dpy ) )
+ {
+ XklConfigRec currentConfig, r2;
+ XklSetDebugLevel( debugLevel );
+ XklDebug( 0, "Xklavier initialized\n" );
+ XklConfigInit();
+ XklConfigLoadRegistry();
+ XklDebug( 0, "Xklavier registry loaded\n" );
+ XklDebug( 0, "Multiple layouts are %ssupported\n",
+ XklMultipleLayoutsSupported() ? "" : "not " );
+
+ XklConfigRecInit( &currentConfig );
+ XklConfigGetFromServer( &currentConfig );
+
+ switch ( action )
+ {
+ case ACTION_GET:
+ XklDebug( 0, "Got config from the server\n" );
+ dump( &currentConfig );
+
+ XklConfigRecInit( &r2 );
+
+ if ( XklConfigGetFromBackup( &r2 ) )
+ {
+ XklDebug( 0, "Got config from the backup\n" );
+ dump( &r2 );
+ }
+
+ if ( XklConfigActivate( &r2, NULL ) )
+ {
+ XklDebug( 0, "The backup configuration restored\n" );
+ if ( XklConfigActivate( &currentConfig, NULL ) )
+ {
+ XklDebug( 0, "Reverting the configuration change\n" );
+ } else
+ {
+ XklDebug( 0, "The configuration could not be reverted: %s\n", XklGetLastError() );
+ }
+ } else
+ {
+ XklDebug( 0, "The backup configuration could not be restored: %s\n", XklGetLastError() );
+ }
+
+ XklConfigRecDestroy( &r2 );
+ break;
+ case ACTION_SET:
+ if ( model != NULL )
+ {
+ if ( currentConfig.model != NULL ) free ( currentConfig.model );
+ currentConfig.model = strdup( model );
+ }
+
+ if ( layouts != NULL )
+ {
+ if ( currentConfig.layouts != NULL )
+ {
+ for ( i = currentConfig.numLayouts; --i >=0; )
+ free ( currentConfig.layouts[i] );
+ free ( currentConfig.layouts );
+ for ( i = currentConfig.numVariants; --i >=0; )
+ free ( currentConfig.variants[i] );
+ free ( currentConfig.variants );
+ }
+ currentConfig.numLayouts =
+ currentConfig.numVariants = 1;
+ currentConfig.layouts = malloc( sizeof ( char* ) );
+ currentConfig.layouts[0] = strdup( layouts );
+ currentConfig.variants = malloc( sizeof ( char* ) );
+ currentConfig.variants[0] = strdup( "" );
+ }
+
+ if ( options != NULL )
+ {
+ if ( currentConfig.options != NULL )
+ {
+ for ( i = currentConfig.numOptions; --i >=0; )
+ free ( currentConfig.options[i] );
+ free ( currentConfig.options );
+ }
+ currentConfig.numOptions = 1;
+ currentConfig.options = malloc( sizeof ( char* ) );
+ currentConfig.options[0] = strdup( options );
+ }
+
+ XklDebug( 0, "New config:\n" );
+ dump( &currentConfig );
+ if ( XklConfigActivate( &currentConfig, NULL ) )
+ XklDebug( 0, "Set the config\n" );
+ else
+ XklDebug( 0, "Could not set the config: %s\n", XklGetLastError() );
+ break;
+ }
+
+ XklConfigRecDestroy( &currentConfig );
+
+ XklConfigFreeRegistry();
+ XklConfigTerm();
+ XklDebug( 0, "Xklavier registry freed\n" );
+ XklDebug( 0, "Xklavier terminating\n" );
+ XklTerm();
+ } else
+ {
+ fprintf( stderr, "Could not init Xklavier\n" );
+ exit(2);
+ }
+ printf( "closing display: %p\n", dpy );
+ XCloseDisplay(dpy);
+ return 0;
+}
diff --git a/tests/test_monitor.c b/tests/test_monitor.c
new file mode 100644
index 0000000..472e07c
--- /dev/null
+++ b/tests/test_monitor.c
@@ -0,0 +1,112 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/XKBlib.h>
+#include <libxklavier/xklavier.h>
+#include <libxklavier/xklavier_config.h>
+
+static void printUsage()
+{
+ printf( "Usage: test_monitor (-h)|(-d <debugLevel>)\n" );
+ printf( "Options:\n" );
+ printf( " -d - Set the debug level (by default, 0)\n" );
+ printf( " -h - Show this help\n" );
+}
+
+static void dump( XklConfigRecPtr ptr )
+{
+ int i,j;
+ char**p;
+ XklDebug( 0, " model: [%s]\n", ptr->model );
+
+ XklDebug( 0, " layouts(%d):\n", ptr->numLayouts );
+ p = ptr->layouts;
+ for( i = ptr->numLayouts, j = 0; --i >= 0; )
+ XklDebug( 0, " %d: [%s]\n", j++, *p++ );
+
+ XklDebug( 0, " variants(%d):\n", ptr->numVariants );
+ p = ptr->variants;
+ for( i = ptr->numVariants, j = 0; --i >= 0; )
+ XklDebug( 0, " %d: [%s]\n", j++, *p++ );
+
+ XklDebug( 0, " options(%d):\n", ptr->numOptions );
+ p = ptr->options;
+ for( i = ptr->numOptions, j = 0; --i >= 0; )
+ XklDebug( 0, " %d: [%s]\n", j++, *p++ );
+}
+
+int main( int argc, char * argv[] )
+{
+ int c;
+ int debugLevel = 0;
+ XkbEvent ev;
+
+ while (1)
+ {
+ c = getopt( argc, argv, "hd:" );
+ if ( c == -1 )
+ break;
+ switch (c)
+ {
+ case 'h':
+ printUsage();
+ exit(0);
+ case 'd':
+ debugLevel = atoi( optarg );
+ break;
+ default:
+ fprintf( stderr, "?? getopt returned character code 0%o ??\n", c );
+ printUsage();
+ exit(0);
+ }
+ }
+
+ Display* dpy = XOpenDisplay( NULL );
+ if ( dpy == NULL )
+ {
+ fprintf( stderr, "Could not open display\n" );
+ exit(1);
+ }
+ printf( "opened display: %p\n", dpy );
+ if ( !XklInit( dpy ) )
+ {
+ XklConfigRec currentConfig;
+ XklSetDebugLevel( debugLevel );
+ XklDebug( 0, "Xklavier initialized\n" );
+ XklConfigInit();
+ XklConfigLoadRegistry();
+ XklDebug( 0, "Xklavier registry loaded\n" );
+
+ XklConfigRecInit( &currentConfig );
+ XklConfigGetFromServer( &currentConfig );
+
+ XklStartListen();
+
+ while (1)
+ {
+ int grp;
+ XNextEvent( dpy, &ev.core );
+ if ( XklFilterEvents( &ev.core ) )
+ XklDebug( 200, "Unknown event %d\n", ev.type );
+ }
+
+ XklStopListen();
+
+ XklConfigRecDestroy( &currentConfig );
+
+ XklConfigFreeRegistry();
+ XklConfigTerm();
+ XklDebug( 0, "Xklavier registry freed\n" );
+ XklDebug( 0, "Xklavier terminating\n" );
+ XklTerm();
+ } else
+ {
+ fprintf( stderr, "Could not init Xklavier\n" );
+ exit(2);
+ }
+ printf( "closing display: %p\n", dpy );
+ XCloseDisplay(dpy);
+ return 0;
+}