Blame src/ibusproperty.c

Packit Service 1d8f1c
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
Packit Service 1d8f1c
/* vim:set et sts=4: */
Packit Service 1d8f1c
/* IBus - The Input Bus
Packit Service 1d8f1c
 * Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
Packit Service 1d8f1c
 * Copyright (C) 2008-2010 Red Hat, Inc.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * This library is free software; you can redistribute it and/or
Packit Service 1d8f1c
 * modify it under the terms of the GNU Lesser General Public
Packit Service 1d8f1c
 * License as published by the Free Software Foundation; either
Packit Service 1d8f1c
 * version 2.1 of the License, or (at your option) any later version.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * This library is distributed in the hope that it will be useful,
Packit Service 1d8f1c
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 1d8f1c
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 1d8f1c
 * Lesser General Public License for more details.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * You should have received a copy of the GNU Lesser General Public
Packit Service 1d8f1c
 * License along with this library; if not, write to the Free Software
Packit Service 1d8f1c
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
Packit Service 1d8f1c
 * USA
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
#include "ibusinternal.h"
Packit Service 1d8f1c
#include "ibusproperty.h"
Packit Service 1d8f1c
#include "ibusproplist.h"
Packit Service 1d8f1c
#include "ibusenumtypes.h"
Packit Service 1d8f1c
Packit Service 1d8f1c
enum {
Packit Service 1d8f1c
    LAST_SIGNAL,
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
enum {
Packit Service 1d8f1c
    PROP_0 = 0,
Packit Service 1d8f1c
    PROP_KEY,
Packit Service 1d8f1c
    PROP_ICON,
Packit Service 1d8f1c
    PROP_LABEL,
Packit Service 1d8f1c
    PROP_SYMBOL,
Packit Service 1d8f1c
    PROP_TOOLTIP,
Packit Service 1d8f1c
    PROP_SENSITIVE,
Packit Service 1d8f1c
    PROP_VISIBLE,
Packit Service 1d8f1c
    PROP_PROP_TYPE,
Packit Service 1d8f1c
    PROP_STATE,
Packit Service 1d8f1c
    PROP_SUB_PROPS,
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
/* _IBusPropertyPrivate */
Packit Service 1d8f1c
struct _IBusPropertyPrivate {
Packit Service 1d8f1c
    gchar    *key;
Packit Service 1d8f1c
    gchar    *icon;
Packit Service 1d8f1c
    IBusText *label;
Packit Service 1d8f1c
    IBusText *symbol;
Packit Service 1d8f1c
    IBusText *tooltip;
Packit Service 1d8f1c
Packit Service 1d8f1c
    gboolean sensitive;
Packit Service 1d8f1c
    gboolean visible;
Packit Service 1d8f1c
    IBusPropType type;
Packit Service 1d8f1c
    IBusPropState state;
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBusPropList *sub_props;
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
#define IBUS_PROPERTY_GET_PRIVATE(o)  \
Packit Service 1d8f1c
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_PROPERTY, IBusPropertyPrivate))
Packit Service 1d8f1c
Packit Service 1d8f1c
/* functions prototype */
Packit Service 1d8f1c
static void         ibus_property_set_property  (IBusProperty       *prop,
Packit Service 1d8f1c
                                                 guint               prop_id,
Packit Service 1d8f1c
                                                 const GValue       *value,
Packit Service 1d8f1c
                                                 GParamSpec         *pspec);
Packit Service 1d8f1c
static void         ibus_property_get_property  (IBusProperty       *prop,
Packit Service 1d8f1c
                                                 guint               prop_id,
Packit Service 1d8f1c
                                                 GValue             *value,
Packit Service 1d8f1c
                                                 GParamSpec         *pspec);
Packit Service 1d8f1c
static void         ibus_property_destroy       (IBusProperty       *prop);
Packit Service 1d8f1c
static gboolean     ibus_property_serialize     (IBusProperty       *prop,
Packit Service 1d8f1c
                                                 GVariantBuilder    *builder);
Packit Service 1d8f1c
static gint         ibus_property_deserialize   (IBusProperty       *prop,
Packit Service 1d8f1c
                                                 GVariant           *variant);
Packit Service 1d8f1c
static gboolean     ibus_property_copy          (IBusProperty       *dest,
Packit Service 1d8f1c
                                                 const IBusProperty *src);
Packit Service 1d8f1c
Packit Service 1d8f1c
G_DEFINE_TYPE (IBusProperty, ibus_property, IBUS_TYPE_SERIALIZABLE)
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_property_class_init (IBusPropertyClass *class)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GObjectClass *gobject_class = G_OBJECT_CLASS (class);
Packit Service 1d8f1c
    IBusObjectClass *object_class = IBUS_OBJECT_CLASS (class);
Packit Service 1d8f1c
    IBusSerializableClass *serializable_class = IBUS_SERIALIZABLE_CLASS (class);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_type_class_add_private (class, sizeof (IBusPropertyPrivate));
Packit Service 1d8f1c
Packit Service 1d8f1c
    gobject_class->set_property = (GObjectSetPropertyFunc) ibus_property_set_property;
Packit Service 1d8f1c
    gobject_class->get_property = (GObjectGetPropertyFunc) ibus_property_get_property;
Packit Service 1d8f1c
Packit Service 1d8f1c
    object_class->destroy = (IBusObjectDestroyFunc) ibus_property_destroy;
Packit Service 1d8f1c
Packit Service 1d8f1c
    serializable_class->serialize   = (IBusSerializableSerializeFunc) ibus_property_serialize;
Packit Service 1d8f1c
    serializable_class->deserialize = (IBusSerializableDeserializeFunc) ibus_property_deserialize;
Packit Service 1d8f1c
    serializable_class->copy        = (IBusSerializableCopyFunc) ibus_property_copy;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* install properties */
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusPropert:key:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * The key of property
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
            PROP_KEY,
Packit Service 1d8f1c
            g_param_spec_string ("key",
Packit Service 1d8f1c
                    "key",
Packit Service 1d8f1c
                    "The key of property",
Packit Service 1d8f1c
                    "",
Packit Service 1d8f1c
                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusPropert:icon:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * The icon of property
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
            PROP_ICON,
Packit Service 1d8f1c
            g_param_spec_string ("icon",
Packit Service 1d8f1c
                    "icon",
Packit Service 1d8f1c
                    "The icon of property",
Packit Service 1d8f1c
                    "",
Packit Service 1d8f1c
                    G_PARAM_READWRITE));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusPropert:label:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * The label of property
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
            PROP_LABEL,
Packit Service 1d8f1c
            g_param_spec_object("label",
Packit Service 1d8f1c
                    "label",
Packit Service 1d8f1c
                    "The label of property",
Packit Service 1d8f1c
                    IBUS_TYPE_TEXT,
Packit Service 1d8f1c
                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusPropert:symbol:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * The symbol of property
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
            PROP_SYMBOL,
Packit Service 1d8f1c
            g_param_spec_object("symbol",
Packit Service 1d8f1c
                    "symbol",
Packit Service 1d8f1c
                    "The symbol of property",
Packit Service 1d8f1c
                    IBUS_TYPE_TEXT,
Packit Service 1d8f1c
                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusPropert:tooltip:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * The tooltip of property
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
            PROP_TOOLTIP,
Packit Service 1d8f1c
            g_param_spec_object("tooltip",
Packit Service 1d8f1c
                    "tooltip",
Packit Service 1d8f1c
                    "The tooltip of property",
Packit Service 1d8f1c
                    IBUS_TYPE_TEXT,
Packit Service 1d8f1c
                    G_PARAM_READWRITE));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusPropert:sensitive:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * The sensitive of property
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
            PROP_SENSITIVE,
Packit Service 1d8f1c
            g_param_spec_boolean("sensitive",
Packit Service 1d8f1c
                    "sensitive",
Packit Service 1d8f1c
                    "The sensitive of property",
Packit Service 1d8f1c
                    TRUE,
Packit Service 1d8f1c
                    G_PARAM_READWRITE));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusPropert:visible:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * The visible of property
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
            PROP_VISIBLE,
Packit Service 1d8f1c
            g_param_spec_boolean("visible",
Packit Service 1d8f1c
                    "visible",
Packit Service 1d8f1c
                    "The visible of property",
Packit Service 1d8f1c
                    TRUE,
Packit Service 1d8f1c
                    G_PARAM_READWRITE));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusPropert:type:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * The type of property
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
            PROP_PROP_TYPE,
Packit Service 1d8f1c
            g_param_spec_enum("prop-type",
Packit Service 1d8f1c
                    "prop-type",
Packit Service 1d8f1c
                    "The type of property",
Packit Service 1d8f1c
                    IBUS_TYPE_PROP_TYPE,
Packit Service 1d8f1c
                    PROP_TYPE_NORMAL,
Packit Service 1d8f1c
                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusPropert:state:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * The state of property
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
            PROP_STATE,
Packit Service 1d8f1c
            g_param_spec_enum("state",
Packit Service 1d8f1c
                    "state",
Packit Service 1d8f1c
                    "The state of property",
Packit Service 1d8f1c
                    IBUS_TYPE_PROP_STATE,
Packit Service 1d8f1c
                    PROP_STATE_UNCHECKED,
Packit Service 1d8f1c
                    G_PARAM_READWRITE));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusPropert:sub-props:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * The sub properties of property
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
            PROP_SUB_PROPS,
Packit Service 1d8f1c
            g_param_spec_object("sub-props",
Packit Service 1d8f1c
                    "sub properties",
Packit Service 1d8f1c
                    "The sub properties of property",
Packit Service 1d8f1c
                    IBUS_TYPE_PROP_LIST,
Packit Service 1d8f1c
                    G_PARAM_READWRITE));
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_property_init (IBusProperty *prop)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    prop->priv = IBUS_PROPERTY_GET_PRIVATE (prop);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_property_set_label (prop, NULL);
Packit Service 1d8f1c
    ibus_property_set_symbol (prop, NULL);
Packit Service 1d8f1c
    ibus_property_set_tooltip (prop, NULL);
Packit Service 1d8f1c
    ibus_property_set_sub_props (prop, NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
}
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_property_set_property (IBusProperty *prop,
Packit Service 1d8f1c
                            guint         prop_id,
Packit Service 1d8f1c
                            const GValue *value,
Packit Service 1d8f1c
                            GParamSpec   *pspec)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    switch (prop_id) {
Packit Service 1d8f1c
    case PROP_KEY:
Packit Service 1d8f1c
        g_assert (prop->priv->key == NULL);
Packit Service 1d8f1c
        prop->priv->key = g_value_dup_string (value);
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_ICON:
Packit Service 1d8f1c
        ibus_property_set_icon (prop, g_value_get_string (value));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_LABEL:
Packit Service 1d8f1c
        ibus_property_set_label (prop, g_value_get_object (value));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_SYMBOL:
Packit Service 1d8f1c
        ibus_property_set_symbol (prop, g_value_get_object (value));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_TOOLTIP:
Packit Service 1d8f1c
        ibus_property_set_tooltip (prop, g_value_get_object (value));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_SENSITIVE:
Packit Service 1d8f1c
        ibus_property_set_sensitive (prop, g_value_get_boolean (value));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_VISIBLE:
Packit Service 1d8f1c
        ibus_property_set_visible (prop, g_value_get_boolean (value));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_PROP_TYPE:
Packit Service 1d8f1c
        prop->priv->type = g_value_get_enum (value);
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_STATE:
Packit Service 1d8f1c
        ibus_property_set_state (prop, g_value_get_enum (value));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_SUB_PROPS:
Packit Service 1d8f1c
        ibus_property_set_sub_props (prop,
Packit Service 1d8f1c
                (IBusPropList *)g_value_get_object (value));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    default:
Packit Service 1d8f1c
        G_OBJECT_WARN_INVALID_PROPERTY_ID (prop, prop_id, pspec);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_property_get_property (IBusProperty *prop,
Packit Service 1d8f1c
                            guint         prop_id,
Packit Service 1d8f1c
                            GValue       *value,
Packit Service 1d8f1c
                            GParamSpec   *pspec)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    switch (prop_id) {
Packit Service 1d8f1c
    case PROP_KEY:
Packit Service 1d8f1c
        g_value_set_string (value, ibus_property_get_key (prop));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_ICON:
Packit Service 1d8f1c
        g_value_set_string (value, ibus_property_get_icon (prop));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_LABEL:
Packit Service 1d8f1c
        g_value_set_object (value, ibus_property_get_label (prop));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_SYMBOL:
Packit Service 1d8f1c
        g_value_set_object (value, ibus_property_get_symbol (prop));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_TOOLTIP:
Packit Service 1d8f1c
        g_value_set_object (value, ibus_property_get_tooltip (prop));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_SENSITIVE:
Packit Service 1d8f1c
        g_value_set_boolean (value, ibus_property_get_sensitive (prop));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_VISIBLE:
Packit Service 1d8f1c
        g_value_set_boolean (value, ibus_property_get_visible (prop));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_PROP_TYPE:
Packit Service 1d8f1c
        g_value_set_enum (value, ibus_property_get_prop_type (prop));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_STATE:
Packit Service 1d8f1c
        g_value_set_enum (value, ibus_property_get_state (prop));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_SUB_PROPS:
Packit Service 1d8f1c
        g_value_set_object (value, ibus_property_get_sub_props (prop));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    default:
Packit Service 1d8f1c
        G_OBJECT_WARN_INVALID_PROPERTY_ID (prop, prop_id, pspec);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_property_destroy (IBusProperty *prop)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_free (prop->priv->key);
Packit Service 1d8f1c
    prop->priv->key = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_free (prop->priv->icon);
Packit Service 1d8f1c
    prop->priv->icon = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (prop->priv->label) {
Packit Service 1d8f1c
        g_object_unref (prop->priv->label);
Packit Service 1d8f1c
        prop->priv->label = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (prop->priv->symbol) {
Packit Service 1d8f1c
        g_object_unref (prop->priv->symbol);
Packit Service 1d8f1c
        prop->priv->symbol = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (prop->priv->tooltip) {
Packit Service 1d8f1c
        g_object_unref (prop->priv->tooltip);
Packit Service 1d8f1c
        prop->priv->tooltip = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (prop->priv->sub_props) {
Packit Service 1d8f1c
        g_object_unref (prop->priv->sub_props);
Packit Service 1d8f1c
        prop->priv->sub_props = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBUS_OBJECT_CLASS (ibus_property_parent_class)->destroy ((IBusObject *)prop);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_property_serialize (IBusProperty    *prop,
Packit Service 1d8f1c
                         GVariantBuilder *builder)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gboolean retval;
Packit Service 1d8f1c
Packit Service 1d8f1c
    retval = IBUS_SERIALIZABLE_CLASS (ibus_property_parent_class)->serialize ((IBusSerializable *) prop, builder);
Packit Service 1d8f1c
    g_return_val_if_fail (retval, FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_PROPERTY (prop), FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_variant_builder_add (builder, "s", prop->priv->key);
Packit Service 1d8f1c
    g_variant_builder_add (builder, "u", prop->priv->type);
Packit Service 1d8f1c
    g_variant_builder_add (builder, "v",
Packit Service 1d8f1c
            ibus_serializable_serialize ((IBusSerializable *)prop->priv->label));
Packit Service 1d8f1c
    g_variant_builder_add (builder, "s", prop->priv->icon);
Packit Service 1d8f1c
    g_variant_builder_add (builder, "v",
Packit Service 1d8f1c
            ibus_serializable_serialize ((IBusSerializable *)prop->priv->tooltip));
Packit Service 1d8f1c
    g_variant_builder_add (builder, "b", prop->priv->sensitive);
Packit Service 1d8f1c
    g_variant_builder_add (builder, "b", prop->priv->visible);
Packit Service 1d8f1c
    g_variant_builder_add (builder, "u", prop->priv->state);
Packit Service 1d8f1c
    g_variant_builder_add (builder, "v",
Packit Service 1d8f1c
            ibus_serializable_serialize ((IBusSerializable *)prop->priv->sub_props));
Packit Service 1d8f1c
    /* Keep the serialized order for the compatibility when add new members. */
Packit Service 1d8f1c
    g_variant_builder_add (builder, "v",
Packit Service 1d8f1c
            ibus_serializable_serialize ((IBusSerializable *)prop->priv->symbol));
Packit Service 1d8f1c
Packit Service 1d8f1c
    return TRUE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gint
Packit Service 1d8f1c
ibus_property_deserialize (IBusProperty *prop,
Packit Service 1d8f1c
                           GVariant     *variant)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gint retval;
Packit Service 1d8f1c
Packit Service 1d8f1c
    retval = IBUS_SERIALIZABLE_CLASS (ibus_property_parent_class)->deserialize ((IBusSerializable *) prop, variant);
Packit Service 1d8f1c
    g_return_val_if_fail (retval, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_g_variant_get_child_string (variant, retval++, &prop->priv->key);
Packit Service 1d8f1c
    g_variant_get_child (variant, retval++, "u", &prop->priv->type);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *subvar = g_variant_get_child_value (variant, retval++);
Packit Service 1d8f1c
    if (prop->priv->label != NULL) {
Packit Service 1d8f1c
        g_object_unref (prop->priv->label);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    prop->priv->label = IBUS_TEXT (ibus_serializable_deserialize (subvar));
Packit Service 1d8f1c
    g_object_ref_sink (prop->priv->label);
Packit Service 1d8f1c
    g_variant_unref (subvar);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_g_variant_get_child_string (variant, retval++, &prop->priv->icon);
Packit Service 1d8f1c
Packit Service 1d8f1c
    subvar = g_variant_get_child_value (variant, retval++);
Packit Service 1d8f1c
    if (prop->priv->tooltip != NULL) {
Packit Service 1d8f1c
        g_object_unref (prop->priv->tooltip);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    prop->priv->tooltip = IBUS_TEXT (ibus_serializable_deserialize (subvar));
Packit Service 1d8f1c
    g_object_ref_sink (prop->priv->tooltip);
Packit Service 1d8f1c
    g_variant_unref (subvar);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_variant_get_child (variant, retval++, "b", &prop->priv->sensitive);
Packit Service 1d8f1c
    g_variant_get_child (variant, retval++, "b", &prop->priv->visible);
Packit Service 1d8f1c
    g_variant_get_child (variant, retval++, "u", &prop->priv->state);
Packit Service 1d8f1c
Packit Service 1d8f1c
    subvar = g_variant_get_child_value (variant, retval++);
Packit Service 1d8f1c
    if (prop->priv->sub_props != NULL) {
Packit Service 1d8f1c
        g_object_unref (prop->priv->sub_props);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    prop->priv->sub_props = IBUS_PROP_LIST (ibus_serializable_deserialize (subvar));
Packit Service 1d8f1c
    g_object_ref_sink (prop->priv->sub_props);
Packit Service 1d8f1c
    g_variant_unref (subvar);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Keep the serialized order for the compatibility when add new members. */
Packit Service 1d8f1c
    subvar = g_variant_get_child_value (variant, retval++);
Packit Service 1d8f1c
    if (prop->priv->symbol != NULL) {
Packit Service 1d8f1c
        g_object_unref (prop->priv->symbol);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    prop->priv->symbol = IBUS_TEXT (ibus_serializable_deserialize (subvar));
Packit Service 1d8f1c
    g_object_ref_sink (prop->priv->symbol);
Packit Service 1d8f1c
    g_variant_unref (subvar);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
ibus_property_copy (IBusProperty       *dest,
Packit Service 1d8f1c
                    const IBusProperty *src)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gboolean retval;
Packit Service 1d8f1c
Packit Service 1d8f1c
    retval = IBUS_SERIALIZABLE_CLASS (ibus_property_parent_class)->copy ((IBusSerializable *) dest, (IBusSerializable *) src);
Packit Service 1d8f1c
    g_return_val_if_fail (retval, FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_PROPERTY (dest), FALSE);
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_PROPERTY (src), FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    dest->priv->key = g_strdup (src->priv->key);
Packit Service 1d8f1c
    dest->priv->icon = g_strdup (src->priv->icon);
Packit Service 1d8f1c
    if (src->priv->label) {
Packit Service 1d8f1c
        dest->priv->label = (IBusText *) ibus_serializable_copy ((IBusSerializable *) src->priv->label);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else
Packit Service 1d8f1c
        dest->priv->label = ibus_text_new_from_static_string ("");
Packit Service 1d8f1c
    if (src->priv->symbol) {
Packit Service 1d8f1c
        dest->priv->symbol = (IBusText *) ibus_serializable_copy ((IBusSerializable *) src->priv->symbol);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else
Packit Service 1d8f1c
        dest->priv->symbol = ibus_text_new_from_static_string ("");
Packit Service 1d8f1c
    if (src->priv->tooltip) {
Packit Service 1d8f1c
        dest->priv->tooltip = (IBusText *) ibus_serializable_copy ((IBusSerializable *) src->priv->tooltip);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else
Packit Service 1d8f1c
        dest->priv->tooltip = ibus_text_new_from_static_string ("");
Packit Service 1d8f1c
Packit Service 1d8f1c
    dest->priv->sensitive = src->priv->sensitive;
Packit Service 1d8f1c
    dest->priv->visible = src->priv->visible;
Packit Service 1d8f1c
    dest->priv->type = src->priv->type;
Packit Service 1d8f1c
    dest->priv->state = src->priv->state;
Packit Service 1d8f1c
Packit Service 1d8f1c
    dest->priv->sub_props = (IBusPropList *) ibus_serializable_copy ((IBusSerializable *) src->priv->sub_props);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return TRUE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusProperty *
Packit Service 1d8f1c
ibus_property_new (const gchar   *key,
Packit Service 1d8f1c
                   IBusPropType   type,
Packit Service 1d8f1c
                   IBusText      *label,
Packit Service 1d8f1c
                   const gchar   *icon,
Packit Service 1d8f1c
                   IBusText      *tooltip,
Packit Service 1d8f1c
                   gboolean       sensitive,
Packit Service 1d8f1c
                   gboolean       visible,
Packit Service 1d8f1c
                   IBusPropState  state,
Packit Service 1d8f1c
                   IBusPropList  *props)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (key != NULL, NULL);
Packit Service 1d8f1c
    g_return_val_if_fail (type >= PROP_TYPE_NORMAL &&
Packit Service 1d8f1c
                          type <= PROP_TYPE_SEPARATOR,
Packit Service 1d8f1c
                          NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return ibus_property_new_varargs ("key", key,
Packit Service 1d8f1c
                                      "prop-type", type,
Packit Service 1d8f1c
                                      "label", label,
Packit Service 1d8f1c
                                      "icon", icon,
Packit Service 1d8f1c
                                      "tooltip", tooltip,
Packit Service 1d8f1c
                                      "sensitive", sensitive,
Packit Service 1d8f1c
                                      "visible", visible,
Packit Service 1d8f1c
                                      "state", state,
Packit Service 1d8f1c
                                      "sub-props", props,
Packit Service 1d8f1c
                                      NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusProperty *
Packit Service 1d8f1c
ibus_property_new_varargs (const gchar *first_property_name, ...)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    va_list var_args;
Packit Service 1d8f1c
    IBusProperty *prop;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (first_property_name);
Packit Service 1d8f1c
Packit Service 1d8f1c
    va_start (var_args, first_property_name);
Packit Service 1d8f1c
    prop = (IBusProperty *) g_object_new_valist (IBUS_TYPE_PROPERTY,
Packit Service 1d8f1c
                                                 first_property_name,
Packit Service 1d8f1c
                                                 var_args);
Packit Service 1d8f1c
    va_end (var_args);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (prop->priv->key);
Packit Service 1d8f1c
    g_assert (prop->priv->type >= PROP_TYPE_NORMAL &&
Packit Service 1d8f1c
              prop->priv->type <= PROP_TYPE_SEPARATOR);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return prop;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
#define IBUS_PROPERTY_GET_FIELD(field, return_type) \
Packit Service 1d8f1c
return_type                                                             \
Packit Service 1d8f1c
ibus_property_get_ ## field (IBusProperty *prop)                        \
Packit Service 1d8f1c
{                                                                       \
Packit Service 1d8f1c
    return prop->priv->field;                                           \
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBUS_PROPERTY_GET_FIELD (key, const gchar *)
Packit Service 1d8f1c
IBUS_PROPERTY_GET_FIELD (icon, const gchar *)
Packit Service 1d8f1c
IBUS_PROPERTY_GET_FIELD (label, IBusText *)
Packit Service 1d8f1c
IBUS_PROPERTY_GET_FIELD (symbol, IBusText *)
Packit Service 1d8f1c
IBUS_PROPERTY_GET_FIELD (tooltip, IBusText *)
Packit Service 1d8f1c
IBUS_PROPERTY_GET_FIELD (sensitive, gboolean)
Packit Service 1d8f1c
IBUS_PROPERTY_GET_FIELD (visible, gboolean)
Packit Service 1d8f1c
IBUS_PROPERTY_GET_FIELD (state, IBusPropState)
Packit Service 1d8f1c
IBUS_PROPERTY_GET_FIELD (sub_props, IBusPropList *)
Packit Service 1d8f1c
#undef IBUS_PROPERTY_GET_FIELD
Packit Service 1d8f1c
Packit Service 1d8f1c
/* ibus_property_get_type() exists */
Packit Service 1d8f1c
IBusPropType
Packit Service 1d8f1c
ibus_property_get_prop_type (IBusProperty *prop)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
    return prop->priv->type;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_property_set_label (IBusProperty *prop,
Packit Service 1d8f1c
                         IBusText     *label)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
    g_return_if_fail (label == NULL || IBUS_IS_TEXT (label));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (prop->priv->label) {
Packit Service 1d8f1c
        g_object_unref (prop->priv->label);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (label == NULL) {
Packit Service 1d8f1c
        prop->priv->label = ibus_text_new_from_static_string ("");
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        prop->priv->label = g_object_ref_sink (label);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_property_set_symbol (IBusProperty *prop,
Packit Service 1d8f1c
                          IBusText     *symbol)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
    g_return_if_fail (symbol == NULL || IBUS_IS_TEXT (symbol));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (prop->priv->symbol) {
Packit Service 1d8f1c
        g_object_unref (prop->priv->symbol);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (symbol == NULL) {
Packit Service 1d8f1c
        prop->priv->symbol = ibus_text_new_from_static_string ("");
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        prop->priv->symbol = g_object_ref_sink (symbol);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_property_set_icon (IBusProperty *prop,
Packit Service 1d8f1c
                        const gchar  *icon)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_free (prop->priv->icon);
Packit Service 1d8f1c
    prop->priv->icon = g_strdup (icon != NULL ? icon : "");
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_property_set_tooltip (IBusProperty *prop,
Packit Service 1d8f1c
                           IBusText     *tooltip)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
    g_assert (tooltip == NULL || IBUS_IS_TEXT (tooltip));
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBusPropertyPrivate *priv = prop->priv;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (priv->tooltip) {
Packit Service 1d8f1c
        g_object_unref (priv->tooltip);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (tooltip == NULL) {
Packit Service 1d8f1c
        priv->tooltip = ibus_text_new_from_static_string ("");
Packit Service 1d8f1c
        g_object_ref_sink (priv->tooltip);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        priv->tooltip = tooltip;
Packit Service 1d8f1c
        g_object_ref_sink (priv->tooltip);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_property_set_sensitive (IBusProperty *prop,
Packit Service 1d8f1c
                             gboolean      sensitive)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
    prop->priv->sensitive = sensitive;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_property_set_visible (IBusProperty *prop,
Packit Service 1d8f1c
                           gboolean      visible)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
    prop->priv->visible = visible;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_property_set_state (IBusProperty  *prop,
Packit Service 1d8f1c
                         IBusPropState  state)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
    g_assert (state == PROP_STATE_UNCHECKED ||
Packit Service 1d8f1c
              state == PROP_STATE_CHECKED ||
Packit Service 1d8f1c
              state == PROP_STATE_INCONSISTENT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    prop->priv->state = state;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_property_set_sub_props (IBusProperty *prop,
Packit Service 1d8f1c
                             IBusPropList *prop_list)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROP_LIST (prop_list) || prop_list == NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBusPropertyPrivate *priv = prop->priv;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (priv->sub_props) {
Packit Service 1d8f1c
        g_object_unref (priv->sub_props);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (prop_list) {
Packit Service 1d8f1c
        priv->sub_props = prop_list;
Packit Service 1d8f1c
        g_object_ref_sink (prop_list);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        priv->sub_props = ibus_prop_list_new ();
Packit Service 1d8f1c
        g_object_ref_sink (priv->sub_props);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_property_update (IBusProperty *prop,
Packit Service 1d8f1c
                      IBusProperty *prop_update)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop_update));
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBusPropertyPrivate *priv = prop->priv;
Packit Service 1d8f1c
    IBusPropertyPrivate *priv_update = prop_update->priv;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (priv->key, priv_update->key) != 0) {
Packit Service 1d8f1c
        return ibus_prop_list_update_property (priv->sub_props, prop_update);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Do not support update prop type */
Packit Service 1d8f1c
    g_assert (priv->type == priv_update->type);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_property_set_icon (prop, ibus_property_get_icon (prop_update));
Packit Service 1d8f1c
    ibus_property_set_label (prop, ibus_property_get_label (prop_update));
Packit Service 1d8f1c
    ibus_property_set_symbol (prop, ibus_property_get_symbol (prop_update));
Packit Service 1d8f1c
    ibus_property_set_tooltip (prop, ibus_property_get_tooltip (prop_update));
Packit Service 1d8f1c
    ibus_property_set_visible (prop, ibus_property_get_visible (prop_update));
Packit Service 1d8f1c
    ibus_property_set_state (prop, ibus_property_get_state (prop_update));
Packit Service 1d8f1c
    ibus_property_set_sensitive (prop, ibus_property_get_sensitive (prop_update));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Do not support update sub props */
Packit Service 1d8f1c
Packit Service 1d8f1c
    return TRUE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c