Blame libgnomekbd/gkbd-desktop-config.c

Packit 88888e
/*
Packit 88888e
 * Copyright (C) 2006 Sergey V. Udaltsov <svu@gnome.org>
Packit 88888e
 *
Packit 88888e
 * This library is free software; you can redistribute it and/or
Packit 88888e
 * modify it under the terms of the GNU Lesser General Public
Packit 88888e
 * License as published by the Free Software Foundation; either
Packit 88888e
 * version 2 of the License, or (at your option) any later version.
Packit 88888e
 *
Packit 88888e
 * This library is distributed in the hope that it will be useful,
Packit 88888e
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 88888e
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 88888e
 * Lesser General Public License for more details.
Packit 88888e
 *
Packit 88888e
 * You should have received a copy of the GNU Lesser General Public
Packit 88888e
 * License along with this library; if not, write to the
Packit 88888e
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit 88888e
 * Boston, MA 02111-1307, USA.
Packit 88888e
 */
Packit 88888e
Packit 88888e
#include <config.h>
Packit 88888e
Packit 88888e
#include <stdio.h>
Packit 88888e
#include <string.h>
Packit 88888e
#include <stdlib.h>
Packit 88888e
#include <X11/keysym.h>
Packit 88888e
Packit 88888e
#include <glib/gi18n-lib.h>
Packit 88888e
Packit 88888e
#include <gkbd-desktop-config.h>
Packit 88888e
#include <gkbd-config-private.h>
Packit 88888e
Packit 88888e
/**
Packit 88888e
 * GkbdDesktopConfig:
Packit 88888e
 */
Packit 88888e
const gchar GKBD_DESKTOP_CONFIG_KEY_DEFAULT_GROUP[] = "default-group";
Packit 88888e
const gchar GKBD_DESKTOP_CONFIG_KEY_GROUP_PER_WINDOW[] =
Packit 88888e
    "group-per-window";
Packit 88888e
const gchar GKBD_DESKTOP_CONFIG_KEY_HANDLE_INDICATORS[] =
Packit 88888e
    "handle-indicators";
Packit 88888e
const gchar GKBD_DESKTOP_CONFIG_KEY_LAYOUT_NAMES_AS_GROUP_NAMES[]
Packit 88888e
    = "layout-names-as-group-names";
Packit 88888e
const gchar GKBD_DESKTOP_CONFIG_KEY_LOAD_EXTRA_ITEMS[]
Packit 88888e
    = "load-extra-items";
Packit 88888e
Packit 88888e
/*
Packit 88888e
 * static common functions
Packit 88888e
 */
Packit 88888e
Packit 88888e
static gboolean
Packit 88888e
    gkbd_desktop_config_get_lv_descriptions
Packit 88888e
    (GkbdDesktopConfig * config,
Packit 88888e
     XklConfigRegistry * registry,
Packit 88888e
     const gchar ** layout_ids,
Packit 88888e
     const gchar ** variant_ids,
Packit 88888e
     gchar *** short_layout_descriptions,
Packit 88888e
     gchar *** long_layout_descriptions,
Packit 88888e
     gchar *** short_variant_descriptions,
Packit 88888e
     gchar *** long_variant_descriptions) {
Packit 88888e
	const gchar **pl, **pv;
Packit 88888e
	guint total_layouts;
Packit 88888e
	gchar **sld, **lld, **svd, **lvd;
Packit 88888e
	XklConfigItem *item = xkl_config_item_new ();
Packit 88888e
Packit 88888e
	if (!
Packit 88888e
	    (xkl_engine_get_features (config->engine) &
Packit 88888e
	     XKLF_MULTIPLE_LAYOUTS_SUPPORTED))
Packit 88888e
		return FALSE;
Packit 88888e
Packit 88888e
	pl = layout_ids;
Packit 88888e
	pv = variant_ids;
Packit 88888e
	total_layouts = g_strv_length ((char **) layout_ids);
Packit 88888e
	sld = *short_layout_descriptions =
Packit 88888e
	    g_new0 (gchar *, total_layouts + 1);
Packit 88888e
	lld = *long_layout_descriptions =
Packit 88888e
	    g_new0 (gchar *, total_layouts + 1);
Packit 88888e
	svd = *short_variant_descriptions =
Packit 88888e
	    g_new0 (gchar *, total_layouts + 1);
Packit 88888e
	lvd = *long_variant_descriptions =
Packit 88888e
	    g_new0 (gchar *, total_layouts + 1);
Packit 88888e
Packit 88888e
	while (pl != NULL && *pl != NULL) {
Packit 88888e
Packit 88888e
		xkl_debug (100, "ids: [%s][%s]\n", *pl,
Packit 88888e
			   pv == NULL ? NULL : *pv);
Packit 88888e
Packit 88888e
		g_snprintf (item->name, sizeof item->name, "%s", *pl);
Packit 88888e
		if (xkl_config_registry_find_layout (registry, item)) {
Packit 88888e
			*sld = g_strdup (item->short_description);
Packit 88888e
			*lld = g_strdup (item->description);
Packit 88888e
		} else {
Packit 88888e
			*sld = g_strdup ("");
Packit 88888e
			*lld = g_strdup ("");
Packit 88888e
		}
Packit 88888e
Packit 88888e
		if (*pv != NULL) {
Packit 88888e
			g_snprintf (item->name, sizeof item->name, "%s",
Packit 88888e
				    *pv);
Packit 88888e
			if (xkl_config_registry_find_variant
Packit 88888e
			    (registry, *pl, item)) {
Packit 88888e
				*svd = g_strdup (item->short_description);
Packit 88888e
				*lvd = g_strdup (item->description);
Packit 88888e
			} else {
Packit 88888e
				*svd = g_strdup ("");
Packit 88888e
				*lvd = g_strdup ("");
Packit 88888e
			}
Packit 88888e
		} else {
Packit 88888e
			*svd = g_strdup ("");
Packit 88888e
			*lvd = g_strdup ("");
Packit 88888e
		}
Packit 88888e
Packit 88888e
		xkl_debug (100, "description: [%s][%s][%s][%s]\n",
Packit 88888e
			   *sld, *lld, *svd, *lvd);
Packit 88888e
		sld++;
Packit 88888e
		lld++;
Packit 88888e
		svd++;
Packit 88888e
		lvd++;
Packit 88888e
Packit 88888e
		pl++;
Packit 88888e
Packit 88888e
		if (*pv != NULL)
Packit 88888e
			pv++;
Packit 88888e
	}
Packit 88888e
Packit 88888e
	g_object_unref (item);
Packit 88888e
	return TRUE;
Packit 88888e
}
Packit 88888e
Packit 88888e
/*
Packit 88888e
 * extern GkbdDesktopConfig config functions
Packit 88888e
 */
Packit 88888e
void
Packit 88888e
gkbd_desktop_config_init (GkbdDesktopConfig * config, XklEngine * engine)
Packit 88888e
{
Packit 88888e
	memset (config, 0, sizeof (*config));
Packit 88888e
	config->settings = g_settings_new (GKBD_DESKTOP_SCHEMA);
Packit 88888e
	config->engine = engine;
Packit 88888e
}
Packit 88888e
Packit 88888e
void
Packit 88888e
gkbd_desktop_config_term (GkbdDesktopConfig * config)
Packit 88888e
{
Packit 88888e
	g_object_unref (config->settings);
Packit 88888e
	config->settings = NULL;
Packit 88888e
}
Packit 88888e
Packit 88888e
void
Packit 88888e
gkbd_desktop_config_load (GkbdDesktopConfig * config)
Packit 88888e
{
Packit 88888e
	config->group_per_app =
Packit 88888e
	    g_settings_get_boolean (config->settings,
Packit 88888e
				    GKBD_DESKTOP_CONFIG_KEY_GROUP_PER_WINDOW);
Packit 88888e
	xkl_debug (150, "group_per_app: %d\n", config->group_per_app);
Packit 88888e
Packit 88888e
	config->handle_indicators =
Packit 88888e
	    g_settings_get_boolean (config->settings,
Packit 88888e
				    GKBD_DESKTOP_CONFIG_KEY_HANDLE_INDICATORS);
Packit 88888e
	xkl_debug (150, "handle_indicators: %d\n",
Packit 88888e
		   config->handle_indicators);
Packit 88888e
Packit 88888e
	config->layout_names_as_group_names =
Packit 88888e
	    g_settings_get_boolean (config->settings,
Packit 88888e
				    GKBD_DESKTOP_CONFIG_KEY_LAYOUT_NAMES_AS_GROUP_NAMES);
Packit 88888e
	xkl_debug (150, "layout_names_as_group_names: %d\n",
Packit 88888e
		   config->layout_names_as_group_names);
Packit 88888e
Packit 88888e
	config->load_extra_items =
Packit 88888e
	    g_settings_get_boolean (config->settings,
Packit 88888e
				    GKBD_DESKTOP_CONFIG_KEY_LOAD_EXTRA_ITEMS);
Packit 88888e
	xkl_debug (150, "load_extra_items: %d\n",
Packit 88888e
		   config->load_extra_items);
Packit 88888e
Packit 88888e
	config->default_group =
Packit 88888e
	    g_settings_get_int (config->settings,
Packit 88888e
				GKBD_DESKTOP_CONFIG_KEY_DEFAULT_GROUP);
Packit 88888e
Packit 88888e
	if (config->default_group < -1
Packit 88888e
	    || config->default_group >=
Packit 88888e
	    xkl_engine_get_max_num_groups (config->engine))
Packit 88888e
		config->default_group = -1;
Packit 88888e
	xkl_debug (150, "default_group: %d\n", config->default_group);
Packit 88888e
}
Packit 88888e
Packit 88888e
void
Packit 88888e
gkbd_desktop_config_save (GkbdDesktopConfig * config)
Packit 88888e
{
Packit 88888e
	g_settings_delay (config->settings);
Packit 88888e
Packit 88888e
	g_settings_set_boolean (config->settings,
Packit 88888e
				GKBD_DESKTOP_CONFIG_KEY_GROUP_PER_WINDOW,
Packit 88888e
				config->group_per_app);
Packit 88888e
	g_settings_set_boolean (config->settings,
Packit 88888e
				GKBD_DESKTOP_CONFIG_KEY_HANDLE_INDICATORS,
Packit 88888e
				config->handle_indicators);
Packit 88888e
	g_settings_set_boolean (config->settings,
Packit 88888e
				GKBD_DESKTOP_CONFIG_KEY_LAYOUT_NAMES_AS_GROUP_NAMES,
Packit 88888e
				config->layout_names_as_group_names);
Packit 88888e
	g_settings_set_boolean (config->settings,
Packit 88888e
				GKBD_DESKTOP_CONFIG_KEY_LOAD_EXTRA_ITEMS,
Packit 88888e
				config->load_extra_items);
Packit 88888e
	g_settings_set_int (config->settings,
Packit 88888e
			    GKBD_DESKTOP_CONFIG_KEY_DEFAULT_GROUP,
Packit 88888e
			    config->default_group);
Packit 88888e
Packit 88888e
	g_settings_apply (config->settings);
Packit 88888e
}
Packit 88888e
Packit 88888e
gboolean
Packit 88888e
gkbd_desktop_config_activate (GkbdDesktopConfig * config)
Packit 88888e
{
Packit 88888e
	gboolean rv = TRUE;
Packit 88888e
Packit 88888e
	xkl_engine_set_group_per_toplevel_window (config->engine,
Packit 88888e
						  config->group_per_app);
Packit 88888e
	xkl_engine_set_indicators_handling (config->engine,
Packit 88888e
					    config->handle_indicators);
Packit 88888e
	xkl_engine_set_default_group (config->engine,
Packit 88888e
				      config->default_group);
Packit 88888e
Packit 88888e
	return rv;
Packit 88888e
}
Packit 88888e
Packit 88888e
void
Packit 88888e
gkbd_desktop_config_lock_next_group (GkbdDesktopConfig * config)
Packit 88888e
{
Packit 88888e
	int group = xkl_engine_get_next_group (config->engine);
Packit 88888e
	xkl_engine_lock_group (config->engine, group);
Packit 88888e
}
Packit 88888e
Packit 88888e
void
Packit 88888e
gkbd_desktop_config_lock_prev_group (GkbdDesktopConfig * config)
Packit 88888e
{
Packit 88888e
	int group = xkl_engine_get_prev_group (config->engine);
Packit 88888e
	xkl_engine_lock_group (config->engine, group);
Packit 88888e
}
Packit 88888e
Packit 88888e
void
Packit 88888e
gkbd_desktop_config_restore_group (GkbdDesktopConfig * config)
Packit 88888e
{
Packit 88888e
	int group = xkl_engine_get_current_window_group (config->engine);
Packit 88888e
	xkl_engine_lock_group (config->engine, group);
Packit 88888e
}
Packit 88888e
Packit 88888e
/**
Packit 88888e
 * gkbd_desktop_config_start_listen:
Packit 88888e
 * @func: (scope notified): a function to call when settings are changed
Packit 88888e
 */
Packit 88888e
void
Packit 88888e
gkbd_desktop_config_start_listen (GkbdDesktopConfig * config,
Packit 88888e
				  GCallback func, gpointer user_data)
Packit 88888e
{
Packit 88888e
	config->config_listener_id =
Packit 88888e
	    g_signal_connect (config->settings, "changed", func,
Packit 88888e
			      user_data);
Packit 88888e
}
Packit 88888e
Packit 88888e
void
Packit 88888e
gkbd_desktop_config_stop_listen (GkbdDesktopConfig * config)
Packit 88888e
{
Packit 88888e
	g_signal_handler_disconnect (config->settings,
Packit 88888e
				     config->config_listener_id);
Packit 88888e
	config->config_listener_id = 0;
Packit 88888e
}
Packit 88888e
Packit 88888e
gboolean
Packit 88888e
gkbd_desktop_config_load_group_descriptions (GkbdDesktopConfig
Packit 88888e
					     * config,
Packit 88888e
					     XklConfigRegistry *
Packit 88888e
					     registry,
Packit 88888e
					     const gchar **
Packit 88888e
					     layout_ids,
Packit 88888e
					     const gchar **
Packit 88888e
					     variant_ids,
Packit 88888e
					     gchar ***
Packit 88888e
					     short_group_names,
Packit 88888e
					     gchar *** full_group_names)
Packit 88888e
{
Packit 88888e
	gchar **sld, **lld, **svd, **lvd;
Packit 88888e
	gchar **psld, **plld, **plvd;
Packit 88888e
	gchar **psgn, **pfgn, **psvd;
Packit 88888e
	gint total_descriptions;
Packit 88888e
Packit 88888e
	if (!gkbd_desktop_config_get_lv_descriptions
Packit 88888e
	    (config, registry, layout_ids, variant_ids, &sld, &lld, &svd,
Packit 88888e
	     &lvd)) {
Packit 88888e
		return False;
Packit 88888e
	}
Packit 88888e
Packit 88888e
	total_descriptions = g_strv_length (sld);
Packit 88888e
Packit 88888e
	*short_group_names = psgn =
Packit 88888e
	    g_new0 (gchar *, total_descriptions + 1);
Packit 88888e
	*full_group_names = pfgn =
Packit 88888e
	    g_new0 (gchar *, total_descriptions + 1);
Packit 88888e
Packit 88888e
	plld = lld;
Packit 88888e
	psld = sld;
Packit 88888e
	plvd = lvd;
Packit 88888e
	psvd = svd;
Packit 88888e
	while (plld != NULL && *plld != NULL) {
Packit 88888e
		*psgn++ = g_strdup ((*psvd[0] == '\0') ? *psld : *psvd);
Packit 88888e
		*pfgn++ =
Packit 88888e
		    g_strdup (gkbd_keyboard_config_format_full_description
Packit 88888e
			      (*plld, *plvd));
Packit 88888e
		psld++, psvd++;
Packit 88888e
		plld++, plvd++;
Packit 88888e
	}
Packit 88888e
	g_strfreev (sld);
Packit 88888e
	g_strfreev (lld);
Packit 88888e
	g_strfreev (svd);
Packit 88888e
	g_strfreev (lvd);
Packit 88888e
Packit 88888e
	return True;
Packit 88888e
}