|
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 |
}
|