Blame src/ibusproperty.c

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