Blame tests/test_config.c

Packit Service 93d855
/*
Packit Service 93d855
 * Copyright (C) 2002-2006 Sergey V. Udaltsov <svu@gnome.org>
Packit Service 93d855
 *
Packit Service 93d855
 * This library is free software; you can redistribute it and/or
Packit Service 93d855
 * modify it under the terms of the GNU Lesser General Public
Packit Service 93d855
 * License as published by the Free Software Foundation; either
Packit Service 93d855
 * version 2 of the License, or (at your option) any later version.
Packit Service 93d855
 *
Packit Service 93d855
 * This library is distributed in the hope that it will be useful,
Packit Service 93d855
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 93d855
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 93d855
 * Lesser General Public License for more details.
Packit Service 93d855
 *
Packit Service 93d855
 * You should have received a copy of the GNU Lesser General Public
Packit Service 93d855
 * License along with this library; if not, write to the
Packit Service 93d855
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service 93d855
 * Boston, MA 02111-1307, USA.
Packit Service 93d855
 */
Packit Service 93d855
Packit Service 93d855
#include <config.h>
Packit Service 93d855
#include <stdio.h>
Packit Service 93d855
#include <unistd.h>
Packit Service 93d855
#include <getopt.h>
Packit Service 93d855
#include <stdlib.h>
Packit Service 93d855
#include <string.h>
Packit Service 93d855
#include <X11/Xlib.h>
Packit Service 93d855
#include <libxklavier/xklavier.h>
Packit Service 93d855
Packit Service 93d855
#ifdef HAVE_SETLOCALE
Packit Service 93d855
# include <locale.h>
Packit Service 93d855
#endif
Packit Service 93d855
Packit Service 93d855
extern void xkl_config_rec_dump(FILE * file, XklConfigRec * data);
Packit Service 93d855
Packit Service 93d855
enum { ACTION_NONE, ACTION_LIST, ACTION_GET, ACTION_SET,
Packit Service 93d855
	ACTION_WRITE, ACTION_SEARCH
Packit Service 93d855
};
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
print_usage(void)
Packit Service 93d855
{
Packit Service 93d855
	printf
Packit Service 93d855
	    ("Usage: test_config (-g)|(-s -m <model> -l <layouts> -o <options>)|(-h)|(-ws)|(-wb)(-d <debugLevel>)|(-p pattern)\n");
Packit Service 93d855
	printf("Options:\n");
Packit Service 93d855
	printf("         -al - list all available layouts and variants\n");
Packit Service 93d855
	printf("         -am - list all available models\n");
Packit Service 93d855
	printf
Packit Service 93d855
	    ("         -ao - list all available options groups and options\n");
Packit Service 93d855
	printf("         -ac - list all available ISO country codes\n");
Packit Service 93d855
	printf("         -ag - list all available ISO language codes\n");
Packit Service 93d855
	printf
Packit Service 93d855
	    ("         -g - Dump the current config, load original system settings and revert back\n");
Packit Service 93d855
	printf
Packit Service 93d855
	    ("         -s - Set the configuration given my -m -l -o options. Similar to setxkbmap\n");
Packit Service 93d855
	printf("         -ws - Write the binary XKB config file (" PACKAGE
Packit Service 93d855
	       ".xkm)\n");
Packit Service 93d855
	printf("         -wb - Write the source XKB config file (" PACKAGE
Packit Service 93d855
	       ".xkb)\n");
Packit Service 93d855
	printf("         -d - Set the debug level (by default, 0)\n");
Packit Service 93d855
	printf("         -p - Search by pattern\n");
Packit Service 93d855
	printf("         -h - Show this help\n");
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
print_option(XklConfigRegistry * config, const XklConfigItem * item,
Packit Service 93d855
	     gpointer data)
Packit Service 93d855
{
Packit Service 93d855
	printf("  [%s][%s][%s]\n", item->name,
Packit Service 93d855
	       item->description, item->short_description);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
print_option_group(XklConfigRegistry * config, const XklConfigItem * item,
Packit Service 93d855
		   gpointer data)
Packit Service 93d855
{
Packit Service 93d855
	printf("[%s][%s][%s] %s multiple selection\n", item->name,
Packit Service 93d855
	       item->description, item->short_description,
Packit Service 93d855
	       GPOINTER_TO_INT(g_object_get_data
Packit Service 93d855
			       (G_OBJECT(item),
Packit Service 93d855
				XCI_PROP_ALLOW_MULTIPLE_SELECTION)) ?
Packit Service 93d855
	       "Allows" : "Does not allow");
Packit Service 93d855
	xkl_config_registry_foreach_option(config, item->name,
Packit Service 93d855
					   print_option, data);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
print_model(XklConfigRegistry * config, const XklConfigItem * item,
Packit Service 93d855
	    gpointer data)
Packit Service 93d855
{
Packit Service 93d855
	gchar *vendor =
Packit Service 93d855
	    (gchar *) g_object_get_data(G_OBJECT(item), XCI_PROP_VENDOR);
Packit Service 93d855
	printf("[%s][%s][%s] by %s\n", item->name, item->description,
Packit Service 93d855
	       item->short_description,
Packit Service 93d855
	       vendor == NULL ? "unknown" : vendor);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
print_xci(XklConfigRegistry * config, const XklConfigItem * item,
Packit Service 93d855
	  gint indent)
Packit Service 93d855
{
Packit Service 93d855
	gboolean is_extra = (gboolean)
Packit Service 93d855
	    GPOINTER_TO_INT(g_object_get_data
Packit Service 93d855
			    (G_OBJECT(item), XCI_PROP_EXTRA_ITEM));
Packit Service 93d855
	gchar **countries = (gchar **) g_object_get_data(G_OBJECT(item),
Packit Service 93d855
							 XCI_PROP_COUNTRY_LIST);
Packit Service 93d855
	gchar **languages = (gchar **) g_object_get_data(G_OBJECT(item),
Packit Service 93d855
							 XCI_PROP_LANGUAGE_LIST);
Packit Service 93d855
	gint i;
Packit Service 93d855
	printf("%*s[%s][%s][%s]%s\n", indent, "", item->name,
Packit Service 93d855
	       item->description, item->short_description,
Packit Service 93d855
	       is_extra ? ":extra" : "");
Packit Service 93d855
	if (countries != NULL)
Packit Service 93d855
		for (i = 0; i < g_strv_length(countries); i++)
Packit Service 93d855
			printf("%*s  country: [%s]\n", indent, "",
Packit Service 93d855
			       countries[i]);
Packit Service 93d855
	if (languages != NULL)
Packit Service 93d855
		for (i = 0; i < g_strv_length(languages); i++)
Packit Service 93d855
			printf("%*s  language: [%s]\n", indent, "",
Packit Service 93d855
			       languages[i]);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
print_variant(XklConfigRegistry * config, const XklConfigItem * item,
Packit Service 93d855
	      gpointer data)
Packit Service 93d855
{
Packit Service 93d855
	print_xci(config, item, 2);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
print_layout(XklConfigRegistry * config, const XklConfigItem * item,
Packit Service 93d855
	     gpointer data)
Packit Service 93d855
{
Packit Service 93d855
	print_xci(config, item, 0);
Packit Service 93d855
Packit Service 93d855
	xkl_config_registry_foreach_layout_variant(config, item->name,
Packit Service 93d855
						   print_variant, data);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
print_iso_variant(XklConfigRegistry * config,
Packit Service 93d855
		  const XklConfigItem * item,
Packit Service 93d855
		  const XklConfigItem * subitem, gpointer data)
Packit Service 93d855
{
Packit Service 93d855
	print_xci(config, item, 2);
Packit Service 93d855
	if (subitem)
Packit Service 93d855
		print_xci(config, subitem, 4);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
print_country(XklConfigRegistry * config, const XklConfigItem * item,
Packit Service 93d855
	      gpointer data)
Packit Service 93d855
{
Packit Service 93d855
	printf("country: ");
Packit Service 93d855
	print_xci(config, item, 0);
Packit Service 93d855
Packit Service 93d855
	xkl_config_registry_foreach_country_variant(config, item->name,
Packit Service 93d855
						    print_iso_variant,
Packit Service 93d855
						    data);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
print_language(XklConfigRegistry * config, const XklConfigItem * item,
Packit Service 93d855
	       gpointer data)
Packit Service 93d855
{
Packit Service 93d855
	printf("language: ");
Packit Service 93d855
	print_xci(config, item, 0);
Packit Service 93d855
Packit Service 93d855
	xkl_config_registry_foreach_language_variant(config, item->name,
Packit Service 93d855
						     print_iso_variant,
Packit Service 93d855
						     data);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
print_found_variants(XklConfigRegistry * config,
Packit Service 93d855
		     const XklConfigItem * parent_item,
Packit Service 93d855
		     const XklConfigItem * child_item)
Packit Service 93d855
{
Packit Service 93d855
	if (child_item == NULL)
Packit Service 93d855
		printf("found layout: [%s]\n", parent_item->name);
Packit Service 93d855
	else
Packit Service 93d855
		printf("found variant: [%s][%s]\n", parent_item->name,
Packit Service 93d855
		       child_item->name);
Packit Service 93d855
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
int
Packit Service 93d855
main(int argc, char *const argv[])
Packit Service 93d855
{
Packit Service 93d855
	int c;
Packit Service 93d855
	gchar which_list = 0;
Packit Service 93d855
	int action = ACTION_NONE;
Packit Service 93d855
	const gchar *model = NULL;
Packit Service 93d855
	const gchar *layouts = NULL;
Packit Service 93d855
	const gchar *options = NULL;
Packit Service 93d855
	const gchar *pattern = NULL;
Packit Service 93d855
	int debug_level = -1;
Packit Service 93d855
	int binary = 0;
Packit Service 93d855
	Display *dpy;
Packit Service 93d855
	XklEngine *engine;
Packit Service 93d855
Packit Service 93d855
	g_type_init_with_debug_flags(G_TYPE_DEBUG_OBJECTS |
Packit Service 93d855
				     G_TYPE_DEBUG_SIGNALS);
Packit Service 93d855
Packit Service 93d855
	while (1) {
Packit Service 93d855
		c = getopt(argc, argv, "ha:sgm:l:o:d:w:c:p:");
Packit Service 93d855
		if (c == -1)
Packit Service 93d855
			break;
Packit Service 93d855
		switch (c) {
Packit Service 93d855
		case 'a':
Packit Service 93d855
			which_list = optarg[0];
Packit Service 93d855
			printf("List the registry\n");
Packit Service 93d855
			action = ACTION_LIST;
Packit Service 93d855
			break;
Packit Service 93d855
		case 's':
Packit Service 93d855
			printf("Set the config\n");
Packit Service 93d855
			action = ACTION_SET;
Packit Service 93d855
			break;
Packit Service 93d855
		case 'g':
Packit Service 93d855
			printf("Get the config\n");
Packit Service 93d855
			action = ACTION_GET;
Packit Service 93d855
			break;
Packit Service 93d855
		case 'm':
Packit Service 93d855
			printf("Model: [%s]\n", model = optarg);
Packit Service 93d855
			break;
Packit Service 93d855
		case 'l':
Packit Service 93d855
			printf("Layouts: [%s]\n", layouts = optarg);
Packit Service 93d855
			break;
Packit Service 93d855
		case 'o':
Packit Service 93d855
			printf("Options: [%s]\n", options = optarg);
Packit Service 93d855
			break;
Packit Service 93d855
		case 'p':
Packit Service 93d855
			action = ACTION_SEARCH;
Packit Service 93d855
			printf("Pattern: [%s]\n", pattern = optarg);
Packit Service 93d855
			break;
Packit Service 93d855
		case 'h':
Packit Service 93d855
			print_usage();
Packit Service 93d855
			exit(0);
Packit Service 93d855
		case 'd':
Packit Service 93d855
			debug_level = atoi(optarg);
Packit Service 93d855
			break;
Packit Service 93d855
		case 'w':
Packit Service 93d855
			action = ACTION_WRITE;
Packit Service 93d855
			binary = ('b' == optarg[0]);
Packit Service 93d855
		default:
Packit Service 93d855
			fprintf(stderr,
Packit Service 93d855
				"?? getopt returned character code 0%o ??\n",
Packit Service 93d855
				c);
Packit Service 93d855
			print_usage();
Packit Service 93d855
		}
Packit Service 93d855
	}
Packit Service 93d855
Packit Service 93d855
	if (action == ACTION_NONE) {
Packit Service 93d855
		print_usage();
Packit Service 93d855
		exit(0);
Packit Service 93d855
	}
Packit Service 93d855
#ifdef HAVE_SETLOCALE
Packit Service 93d855
	setlocale(LC_ALL, "");
Packit Service 93d855
#endif
Packit Service 93d855
Packit Service 93d855
	dpy = XOpenDisplay(NULL);
Packit Service 93d855
	if (dpy == NULL) {
Packit Service 93d855
		fprintf(stderr, "Could not open display\n");
Packit Service 93d855
		exit(1);
Packit Service 93d855
	}
Packit Service 93d855
	if (debug_level != -1)
Packit Service 93d855
		xkl_set_debug_level(debug_level);
Packit Service 93d855
	engine = xkl_engine_get_instance(dpy);
Packit Service 93d855
	if (engine != NULL) {
Packit Service 93d855
		XklConfigRec *current_config, *r2;
Packit Service 93d855
		XklConfigRegistry *config;
Packit Service 93d855
Packit Service 93d855
		xkl_debug(0, "Xklavier initialized\n");
Packit Service 93d855
		config = xkl_config_registry_get_instance(engine);
Packit Service 93d855
		xkl_config_registry_load(config, TRUE);
Packit Service 93d855
Packit Service 93d855
		xkl_debug(0, "Xklavier registry loaded\n");
Packit Service 93d855
		xkl_debug(0, "Backend: [%s]\n",
Packit Service 93d855
			  xkl_engine_get_backend_name(engine));
Packit Service 93d855
		xkl_debug(0, "Supported features: 0x0%X\n",
Packit Service 93d855
			  xkl_engine_get_features(engine));
Packit Service 93d855
		xkl_debug(0, "Max number of groups: %d\n",
Packit Service 93d855
			  xkl_engine_get_max_num_groups(engine));
Packit Service 93d855
Packit Service 93d855
		current_config = xkl_config_rec_new();
Packit Service 93d855
		xkl_config_rec_get_from_server(current_config, engine);
Packit Service 93d855
Packit Service 93d855
		switch (action) {
Packit Service 93d855
		case ACTION_LIST:
Packit Service 93d855
			switch (which_list) {
Packit Service 93d855
			case 'l':
Packit Service 93d855
				xkl_config_registry_foreach_layout(config,
Packit Service 93d855
								   print_layout,
Packit Service 93d855
								   NULL);
Packit Service 93d855
				break;
Packit Service 93d855
			case 'm':
Packit Service 93d855
				xkl_config_registry_foreach_model(config,
Packit Service 93d855
								  print_model,
Packit Service 93d855
								  NULL);
Packit Service 93d855
				break;
Packit Service 93d855
			case 'o':
Packit Service 93d855
				xkl_config_registry_foreach_option_group
Packit Service 93d855
				    (config, print_option_group, NULL);
Packit Service 93d855
				break;
Packit Service 93d855
			case 'c':
Packit Service 93d855
				xkl_config_registry_foreach_country
Packit Service 93d855
				    (config, print_country, NULL);
Packit Service 93d855
				break;
Packit Service 93d855
			case 'g':
Packit Service 93d855
				xkl_config_registry_foreach_language
Packit Service 93d855
				    (config, print_language, NULL);
Packit Service 93d855
				break;
Packit Service 93d855
			default:
Packit Service 93d855
				printf("Unknown list: %c\n", which_list);
Packit Service 93d855
				print_usage();
Packit Service 93d855
				break;
Packit Service 93d855
			}
Packit Service 93d855
			break;
Packit Service 93d855
		case ACTION_GET:
Packit Service 93d855
			xkl_debug(0, "Got config from the server\n");
Packit Service 93d855
			xkl_config_rec_dump(stdout, current_config);
Packit Service 93d855
Packit Service 93d855
			r2 = xkl_config_rec_new();
Packit Service 93d855
Packit Service 93d855
			if (xkl_config_rec_get_from_backup(r2, engine)) {
Packit Service 93d855
				xkl_debug(0,
Packit Service 93d855
					  "Got config from the backup\n");
Packit Service 93d855
				xkl_config_rec_dump(stdout, r2);
Packit Service 93d855
			}
Packit Service 93d855
Packit Service 93d855
			if (xkl_config_rec_activate(r2, engine)) {
Packit Service 93d855
				xkl_debug(0,
Packit Service 93d855
					  "The backup configuration restored\n");
Packit Service 93d855
				if (xkl_config_rec_activate
Packit Service 93d855
				    (current_config, engine)) {
Packit Service 93d855
					xkl_debug(0,
Packit Service 93d855
						  "Reverting the configuration change\n");
Packit Service 93d855
				} else {
Packit Service 93d855
					xkl_debug(0,
Packit Service 93d855
						  "The configuration could not be reverted: %s\n",
Packit Service 93d855
						  xkl_get_last_error());
Packit Service 93d855
				}
Packit Service 93d855
			} else {
Packit Service 93d855
				xkl_debug(0,
Packit Service 93d855
					  "The backup configuration could not be restored: %s\n",
Packit Service 93d855
					  xkl_get_last_error());
Packit Service 93d855
			}
Packit Service 93d855
Packit Service 93d855
			g_object_unref(G_OBJECT(r2));
Packit Service 93d855
			break;
Packit Service 93d855
		case ACTION_SET:
Packit Service 93d855
			if (model != NULL) {
Packit Service 93d855
				if (current_config->model != NULL)
Packit Service 93d855
					g_free(current_config->model);
Packit Service 93d855
				current_config->model = g_strdup(model);
Packit Service 93d855
			}
Packit Service 93d855
Packit Service 93d855
			if (layouts != NULL) {
Packit Service 93d855
				if (current_config->layouts != NULL)
Packit Service 93d855
					g_strfreev
Packit Service 93d855
					    (current_config->layouts);
Packit Service 93d855
				if (current_config->variants != NULL)
Packit Service 93d855
					g_strfreev
Packit Service 93d855
					    (current_config->variants);
Packit Service 93d855
Packit Service 93d855
				current_config->layouts =
Packit Service 93d855
				    g_new0(char *, 2);
Packit Service 93d855
				current_config->layouts[0] =
Packit Service 93d855
				    g_strdup(layouts);
Packit Service 93d855
				current_config->variants =
Packit Service 93d855
				    g_new0(char *, 2);
Packit Service 93d855
				current_config->variants[0] = g_strdup("");
Packit Service 93d855
			}
Packit Service 93d855
Packit Service 93d855
			if (options != NULL) {
Packit Service 93d855
				if (current_config->options != NULL)
Packit Service 93d855
					g_strfreev
Packit Service 93d855
					    (current_config->options);
Packit Service 93d855
Packit Service 93d855
				current_config->options =
Packit Service 93d855
				    g_new0(char *, 2);
Packit Service 93d855
				current_config->options[0] =
Packit Service 93d855
				    g_strdup(options);
Packit Service 93d855
			}
Packit Service 93d855
Packit Service 93d855
			xkl_debug(0, "New config:\n");
Packit Service 93d855
			xkl_config_rec_dump(stdout, current_config);
Packit Service 93d855
			if (xkl_config_rec_activate
Packit Service 93d855
			    (current_config, engine))
Packit Service 93d855
				xkl_debug(0, "Set the config\n");
Packit Service 93d855
			else
Packit Service 93d855
				xkl_debug(0,
Packit Service 93d855
					  "Could not set the config: %s\n",
Packit Service 93d855
					  xkl_get_last_error());
Packit Service 93d855
			break;
Packit Service 93d855
		case ACTION_WRITE:
Packit Service 93d855
			xkl_config_rec_write_to_file(engine,
Packit Service 93d855
						     binary ? (PACKAGE
Packit Service 93d855
							       ".xkm")
Packit Service 93d855
						     : (PACKAGE ".xkb"),
Packit Service 93d855
						     current_config,
Packit Service 93d855
						     binary);
Packit Service 93d855
			xkl_debug(0, "The file " PACKAGE "%s is written\n",
Packit Service 93d855
				  binary ? ".xkm" : ".xkb");
Packit Service 93d855
			break;
Packit Service 93d855
		case ACTION_SEARCH:
Packit Service 93d855
			xkl_config_registry_search_by_pattern(config,
Packit Service 93d855
							      pattern,
Packit Service 93d855
							      (TwoConfigItemsProcessFunc)
Packit Service 93d855
							      print_found_variants,
Packit Service 93d855
							      NULL);
Packit Service 93d855
		}
Packit Service 93d855
Packit Service 93d855
		g_object_unref(G_OBJECT(current_config));
Packit Service 93d855
Packit Service 93d855
		g_object_unref(G_OBJECT(config));
Packit Service 93d855
		xkl_debug(0, "Xklavier registry freed\n");
Packit Service 93d855
		xkl_debug(0, "Xklavier terminating\n");
Packit Service 93d855
		g_object_unref(G_OBJECT(engine));
Packit Service 93d855
	} else {
Packit Service 93d855
		fprintf(stderr, "Could not init _xklavier\n");
Packit Service 93d855
		exit(2);
Packit Service 93d855
	}
Packit Service 93d855
	printf("closing display: %p\n", dpy);
Packit Service 93d855
	XCloseDisplay(dpy);
Packit Service 93d855
	return 0;
Packit Service 93d855
}