diff options
author | Sergey Udaltsov <svu@gnome.org> | 2004-10-01 20:51:10 +0000 |
---|---|---|
committer | Sergey Udaltsov <svu@gnome.org> | 2004-10-01 20:51:10 +0000 |
commit | 99b638f7c435c571d27a5c5a97ef3726d43aa910 (patch) | |
tree | dafaa5db0311602448aee6de85b955f7aa2ad983 | |
parent | 781dd4c31fdfb8e034d61a9e71f78b9d055f3713 (diff) | |
download | libxklavier-99b638f7c435c571d27a5c5a97ef3726d43aa910.tar.gz |
Syncing with HEAD. Major leaks nailed. Default ruleset introduced (well, it does not help much)
-rw-r--r-- | ChangeLog | 320 | ||||
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | configure.in | 8 | ||||
-rw-r--r-- | libxklavier/xklavier_config.c | 12 | ||||
-rw-r--r-- | libxklavier/xklavier_config_xkb.c | 54 | ||||
-rw-r--r-- | libxklavier/xklavier_props.c | 66 | ||||
-rw-r--r-- | tests/.cvsignore | 1 | ||||
-rw-r--r-- | tests/Makefile.am | 10 | ||||
-rw-r--r-- | tests/test_config.c | 207 | ||||
-rw-r--r-- | tests/test_monitor.c | 112 |
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( ¤tConfig ); + XklConfigGetFromServer( ¤tConfig ); + + switch ( action ) + { + case ACTION_GET: + XklDebug( 0, "Got config from the server\n" ); + dump( ¤tConfig ); + + 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( ¤tConfig, 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( ¤tConfig ); + if ( XklConfigActivate( ¤tConfig, NULL ) ) + XklDebug( 0, "Set the config\n" ); + else + XklDebug( 0, "Could not set the config: %s\n", XklGetLastError() ); + break; + } + + XklConfigRecDestroy( ¤tConfig ); + + 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( ¤tConfig ); + XklConfigGetFromServer( ¤tConfig ); + + XklStartListen(); + + while (1) + { + int grp; + XNextEvent( dpy, &ev.core ); + if ( XklFilterEvents( &ev.core ) ) + XklDebug( 200, "Unknown event %d\n", ev.type ); + } + + XklStopListen(); + + XklConfigRecDestroy( ¤tConfig ); + + 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; +} |