Blame src/ibusobject.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-2013 Peng Huang <shawn.p.huang@gmail.com>
Packit Service 1d8f1c
 * Copyright (C) 2008-2013 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
Packit Service 1d8f1c
#include "ibusobject.h"
Packit Service 1d8f1c
#include "ibusmarshalers.h"
Packit Service 1d8f1c
#include "ibusinternal.h"
Packit Service 1d8f1c
Packit Service 1d8f1c
#define IBUS_OBJECT_GET_PRIVATE(o)  \
Packit Service 1d8f1c
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_OBJECT, IBusObjectPrivate))
Packit Service 1d8f1c
Packit Service 1d8f1c
enum {
Packit Service 1d8f1c
    DESTROY,
Packit Service 1d8f1c
    LAST_SIGNAL,
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
struct _IBusObjectPrivate {
Packit Service 1d8f1c
    gpointer pad;
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
static guint            object_signals[LAST_SIGNAL] = { 0 };
Packit Service 1d8f1c
Packit Service 1d8f1c
// #define DEBUG_MEMORY
Packit Service 1d8f1c
#ifdef DEBUG_MEMORY
Packit Service 1d8f1c
static GHashTable      *_count_table;
Packit Service 1d8f1c
static guint            _count = 0;
Packit Service 1d8f1c
#endif
Packit Service 1d8f1c
Packit Service 1d8f1c
/* functions prototype */
Packit Service 1d8f1c
static GObject  *ibus_object_constructor    (GType               type,
Packit Service 1d8f1c
                                             guint               n,
Packit Service 1d8f1c
                                             GObjectConstructParam
Packit Service 1d8f1c
                                                                *args);
Packit Service 1d8f1c
static void      ibus_object_dispose        (IBusObject         *obj);
Packit Service 1d8f1c
static void      ibus_object_finalize       (IBusObject         *obj);
Packit Service 1d8f1c
static void      ibus_object_real_destroy   (IBusObject         *obj);
Packit Service 1d8f1c
Packit Service 1d8f1c
G_DEFINE_TYPE (IBusObject, ibus_object, G_TYPE_INITIALLY_UNOWNED)
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_object_class_init     (IBusObjectClass *class)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GObjectClass *gobject_class = G_OBJECT_CLASS (class);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gobject_class->constructor = ibus_object_constructor;
Packit Service 1d8f1c
    gobject_class->dispose = (GObjectFinalizeFunc) ibus_object_dispose;
Packit Service 1d8f1c
    gobject_class->finalize = (GObjectFinalizeFunc) ibus_object_finalize;
Packit Service 1d8f1c
Packit Service 1d8f1c
    class->destroy = ibus_object_real_destroy;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* install signals */
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusObject::destroy:
Packit Service 1d8f1c
     * @object: An IBusObject.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Destroy and free an IBusObject
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * See also:  ibus_object_destroy().
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    object_signals[DESTROY] =
Packit Service 1d8f1c
        g_signal_new (I_("destroy"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusObjectClass, destroy),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_type_class_add_private (class, sizeof (IBusObjectPrivate));
Packit Service 1d8f1c
Packit Service 1d8f1c
#ifdef DEBUG_MEMORY
Packit Service 1d8f1c
    _count_table = g_hash_table_new (g_direct_hash, g_direct_equal);
Packit Service 1d8f1c
#endif
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_object_init (IBusObject *obj)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    obj->flags = 0;
Packit Service 1d8f1c
    obj->priv = IBUS_OBJECT_GET_PRIVATE (obj);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
static GObject *
Packit Service 1d8f1c
ibus_object_constructor (GType                   type,
Packit Service 1d8f1c
                         guint                   n,
Packit Service 1d8f1c
                         GObjectConstructParam  *args)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GObject *object;
Packit Service 1d8f1c
Packit Service 1d8f1c
    object = G_OBJECT_CLASS (ibus_object_parent_class)->constructor (type, n ,args);
Packit Service 1d8f1c
Packit Service 1d8f1c
#ifdef DEBUG_MEMORY
Packit Service 1d8f1c
    if (object != NULL) {
Packit Service 1d8f1c
        guint count;
Packit Service 1d8f1c
        _count ++;
Packit Service 1d8f1c
Packit Service 1d8f1c
        count = GPOINTER_TO_UINT (g_hash_table_lookup (_count_table, (gpointer) type));
Packit Service 1d8f1c
        g_hash_table_replace (_count_table, (gpointer) type, GUINT_TO_POINTER (++count));
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_debug ("new %s, count = %d, all = %d", g_type_name (type), count, _count);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
#endif
Packit Service 1d8f1c
Packit Service 1d8f1c
    return object;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_object_dispose (IBusObject *obj)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (! (IBUS_OBJECT_FLAGS (obj) & IBUS_IN_DESTRUCTION)) {
Packit Service 1d8f1c
        IBUS_OBJECT_SET_FLAGS (obj, IBUS_IN_DESTRUCTION);
Packit Service 1d8f1c
        if (! (IBUS_OBJECT_FLAGS (obj) & IBUS_DESTROYED)) {
Packit Service 1d8f1c
            g_signal_emit (obj, object_signals[DESTROY], 0);
Packit Service 1d8f1c
            IBUS_OBJECT_SET_FLAGS (obj, IBUS_DESTROYED);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        IBUS_OBJECT_UNSET_FLAGS (obj, IBUS_IN_DESTRUCTION);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    G_OBJECT_CLASS(ibus_object_parent_class)->dispose (G_OBJECT (obj));
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_object_finalize (IBusObject *obj)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
#ifdef DEBUG_MEMORY
Packit Service 1d8f1c
    guint count;
Packit Service 1d8f1c
Packit Service 1d8f1c
    _count --;
Packit Service 1d8f1c
    count = GPOINTER_TO_UINT (g_hash_table_lookup (_count_table, (gpointer)G_OBJECT_TYPE (obj)));
Packit Service 1d8f1c
    g_hash_table_replace (_count_table, (gpointer)G_OBJECT_TYPE (obj), GUINT_TO_POINTER (--count));
Packit Service 1d8f1c
    g_debug ("Finalize %s, count = %d, all = %d", G_OBJECT_TYPE_NAME (obj), count, _count);
Packit Service 1d8f1c
#endif
Packit Service 1d8f1c
Packit Service 1d8f1c
    G_OBJECT_CLASS(ibus_object_parent_class)->finalize (G_OBJECT (obj));
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_object_real_destroy (IBusObject *obj)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_signal_handlers_destroy (obj);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusObject *
Packit Service 1d8f1c
ibus_object_new (void)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GObject *object = g_object_new (IBUS_TYPE_OBJECT, NULL);
Packit Service 1d8f1c
    return IBUS_OBJECT (object);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_object_destroy (IBusObject *obj)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_OBJECT (obj));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (! (IBUS_OBJECT_FLAGS (obj) & IBUS_IN_DESTRUCTION)) {
Packit Service 1d8f1c
        g_object_run_dispose (G_OBJECT (obj));
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}