46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/* -*- Mode: C; indent-tabs-mode:nil; tab-width:4 -*-
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Copyright (C) 2010 Robert Ancell.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Author: Robert Ancell <robert.ancell@canonical.com>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * This library is free software; you can redistribute it and/or modify it under
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * the terms of the GNU Lesser General Public License as published by the Free
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Software Foundation; either version 2 or version 3 of the License.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * See http://www.gnu.org/copyleft/lgpl.html the full text of the license.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <libxklavier/xklavier.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include "lightdm/layout.h"
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncenum {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_0,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_NAME,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_SHORT_DESCRIPTION,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_DESCRIPTION
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync};
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *short_description;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *description;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync} LightDMLayoutPrivate;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncG_DEFINE_TYPE (LightDMLayout, lightdm_layout, G_TYPE_OBJECT);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_LAYOUT, LightDMLayoutPrivate)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gboolean have_layouts = FALSE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic Display *display = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic XklEngine *xkl_engine = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic XklConfigRec *xkl_config = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic GList *layouts = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic LightDMLayout *default_layout = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncmake_layout_string (const gchar *layout, const gchar *variant)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!layout || layout[0] == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (!variant || variant[0] == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return g_strdup (layout);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return g_strdup_printf ("%s\t%s", layout, variant);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncparse_layout_string (const gchar *name, gchar **layout, gchar **variant)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar **split;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *layout = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *variant = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!name)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync split = g_strsplit (name, "\t", 2);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (split[0])
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *layout = g_strdup (split[0]);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (split[1])
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *variant = g_strdup (split[1]);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strfreev (split);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncvariant_cb (XklConfigRegistry *config,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync const XklConfigItem *item,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gpointer data)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLayout *layout;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *full_name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync full_name = make_layout_string (data, item->name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync layout = g_object_new (LIGHTDM_TYPE_LAYOUT, "name", full_name, "short-description", item->short_description, "description", item->description, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync layouts = g_list_append (layouts, layout);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (full_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclayout_cb (XklConfigRegistry *config,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync const XklConfigItem *item,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gpointer data)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLayout *layout;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync layout = g_object_new (LIGHTDM_TYPE_LAYOUT, "name", item->name, "short-description", item->short_description, "description", item->description, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync layouts = g_list_append (layouts, layout);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync xkl_config_registry_foreach_layout_variant (config, item->name, variant_cb, (gpointer) item->name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_get_layouts:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get a list of keyboard layouts to present to the user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: (element-type LightDMLayout) (transfer none): A list of #LightDMLayout that should be presented to the user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncGList *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_get_layouts (void)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync XklConfigRegistry *registry;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (have_layouts)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return layouts;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync display = XOpenDisplay (NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync xkl_engine = xkl_engine_get_instance (display);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync xkl_config = xkl_config_rec_new ();
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!xkl_config_rec_get_from_server (xkl_config, xkl_engine))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Failed to get Xkl configuration from server");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync registry = xkl_config_registry_get_instance (xkl_engine);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync xkl_config_registry_load (registry, FALSE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync xkl_config_registry_foreach_layout (registry, layout_cb, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_unref (registry);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync have_layouts = TRUE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return layouts;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_set_layout:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @layout: The layout to use
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Set the layout for this session.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncvoid
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_set_layout (LightDMLayout *dmlayout)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync XklConfigRec *config;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *layout, *variant;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_if_fail (dmlayout != NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("Setting keyboard layout to '%s'", lightdm_layout_get_name (dmlayout));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync parse_layout_string (lightdm_layout_get_name (dmlayout), &layout, &variant);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync config = xkl_config_rec_new ();
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync config->layouts = g_malloc (sizeof (gchar *) * 2);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync config->variants = g_malloc (sizeof (gchar *) * 2);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync config->model = g_strdup (xkl_config->model);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync config->layouts[0] = layout;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync config->layouts[1] = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync config->variants[0] = variant;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync config->variants[1] = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!xkl_config_rec_activate (config, xkl_engine))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Failed to activate XKL config");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_unref (config);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_get_layout:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the current keyboard layout.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: (transfer none): The currently active layout for this user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncLightDMLayout *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_get_layout (void)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync lightdm_get_layouts ();
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (layouts && xkl_config && !default_layout)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *full_name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *item;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync full_name = make_layout_string (xkl_config->layouts ? xkl_config->layouts[0] : NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync xkl_config->variants ? xkl_config->variants[0] : NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (item = layouts; item; item = item->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLayout *iter_layout = (LightDMLayout *) item->data;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_strcmp0 (lightdm_layout_get_name (iter_layout), full_name) == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync default_layout = iter_layout;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (full_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return default_layout;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_layout_get_name:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @layout: A #LightDMLayout
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the name of a layout.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The name of the layout
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_layout_get_name (LightDMLayout *layout)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_LAYOUT (layout), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_PRIVATE (layout)->name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_layout_get_short_description:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @layout: A #LightDMLayout
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the short description of a layout.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: A short description of the layout
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_layout_get_short_description (LightDMLayout *layout)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_LAYOUT (layout), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_PRIVATE (layout)->short_description;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_layout_get_description:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @layout: A #LightDMLayout
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the long description of a layout.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: A long description of the layout
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_layout_get_description (LightDMLayout *layout)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_LAYOUT (layout), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_PRIVATE (layout)->description;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_layout_init (LightDMLayout *layout)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_layout_set_property (GObject *object,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync guint prop_id,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync const GValue *value,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GParamSpec *pspec)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLayout *self = LIGHTDM_LAYOUT (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLayoutPrivate *priv = GET_PRIVATE (self);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync switch (prop_id) {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case PROP_NAME:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->name = g_strdup (g_value_get_string (value));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case PROP_SHORT_DESCRIPTION:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->short_description);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->short_description = g_strdup (g_value_get_string (value));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case PROP_DESCRIPTION:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->description);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->description = g_strdup (g_value_get_string (value));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync default:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_layout_get_property (GObject *object,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync guint prop_id,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GValue *value,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GParamSpec *pspec)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLayout *self;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync self = LIGHTDM_LAYOUT (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync switch (prop_id) {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case PROP_NAME:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_layout_get_name (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case PROP_SHORT_DESCRIPTION:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_layout_get_short_description (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case PROP_DESCRIPTION:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_layout_get_description (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync default:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_layout_class_init (LightDMLayoutClass *klass)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GObjectClass *object_class = G_OBJECT_CLASS (klass);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_type_class_add_private (klass, sizeof (LightDMLayoutPrivate));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->set_property = lightdm_layout_set_property;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->get_property = lightdm_layout_get_property;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_NAME,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Name of the layout",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_SHORT_DESCRIPTION,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("short-description",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "short-description",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Short description of the layout",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_DESCRIPTION,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("description",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "description",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Long description of the layout",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}