1/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
2/* vim:set et sts=4: */
3/* ibus - The Input Bus
4 * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
5 * Copyright (C) 2008-2013 Red Hat, Inc.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
20 * USA
21 */
22
23#if !defined (__IBUS_H_INSIDE__) && !defined (IBUS_COMPILATION)
24#error "Only <ibus.h> can be included directly"
25#endif
26
27#ifndef __IBUS_OBJECT_H_
28#define __IBUS_OBJECT_H_
29
30/**
31 * SECTION: ibusobject
32 * @short_description: Base object of IBus.
33 * @title: IBusObject
34 * @stability: Stable
35 *
36 * IBusObject is the base object for all objects in IBus.
37 */
38
39#include <glib-object.h>
40#include "ibustypes.h"
41#include "ibusdebug.h"
42
43/*
44 * Type macros.
45 */
46
47/* define GOBJECT macros */
48#define IBUS_TYPE_OBJECT \
49 (ibus_object_get_type ())
50#define IBUS_OBJECT(obj) \
51 (G_TYPE_CHECK_INSTANCE_CAST ((obj), IBUS_TYPE_OBJECT, IBusObject))
52#define IBUS_OBJECT_CLASS(klass) \
53 (G_TYPE_CHECK_CLASS_CAST ((klass), IBUS_TYPE_OBJECT, IBusObjectClass))
54#define IBUS_IS_OBJECT(obj) \
55 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IBUS_TYPE_OBJECT))
56#define IBUS_IS_OBJECT_CLASS(klass) \
57 (G_TYPE_CHECK_CLASS_TYPE ((klass), IBUS_TYPE_OBJECT))
58#define IBUS_OBJECT_GET_CLASS(obj) \
59 (G_TYPE_INSTANCE_GET_CLASS ((obj), IBUS_TYPE_OBJECT, IBusObjectClass))
60
61/**
62 * IBusObjectFlags:
63 * @IBUS_IN_DESTRUCTION: Used in GObjectClass::dispose
64 * @IBUS_DESTROYED: Used during emitting IBusObject::destroy signal.
65 * @IBUS_RESERVED_1: Reserved.
66 * @IBUS_RESERVED_2: Reserved.
67 *
68 * The flags are used internally.
69 */
70typedef enum {
71 IBUS_IN_DESTRUCTION = (1 << 0),
72 IBUS_DESTROYED = (1 << 1),
73 IBUS_RESERVED_1 = (1 << 2),
74 IBUS_RESERVED_2 = (1 << 3),
75} IBusObjectFlags;
76
77#define IBUS_OBJECT_FLAGS(obj) (IBUS_OBJECT (obj)->flags)
78#define IBUS_OBJECT_SET_FLAGS(obj,flag) G_STMT_START{ (IBUS_OBJECT_FLAGS (obj) |= (flag)); }G_STMT_END
79#define IBUS_OBJECT_UNSET_FLAGS(obj,flag) G_STMT_START{ (IBUS_OBJECT_FLAGS (obj) &= ~(flag)); }G_STMT_END
80#define IBUS_OBJECT_IN_DESTRUCTION(obj) (IBUS_OBJECT_FLAGS (obj) & IBUS_IN_DESTRUCTION)
81#define IBUS_OBJECT_DESTROYED(obj) (IBUS_OBJECT_FLAGS (obj) & IBUS_DESTROYED)
82
83G_BEGIN_DECLS
84
85typedef struct _IBusObject IBusObject;
86typedef struct _IBusObjectClass IBusObjectClass;
87typedef struct _IBusObjectPrivate IBusObjectPrivate;
88
89/**
90 * IBusObject:
91 *
92 * All the fields in the <structname>IBusObject</structname> structure are
93 * private to the #IBusObject and should never be accessed directly.
94 */
95struct _IBusObject {
96 GInitiallyUnowned parent;
97 /* instance members */
98 guint32 flags;
99
100 IBusObjectPrivate *priv;
101};
102
103typedef void ( *IBusObjectDestroyFunc) (IBusObject *object);
104
105struct _IBusObjectClass {
106 GInitiallyUnownedClass parent;
107
108 /* signals */
109 void (* destroy) (IBusObject *object);
110
111 /*< private >*/
112 /* padding */
113 gpointer pdummy[7];
114};
115
116GType ibus_object_get_type (void);
117
118/**
119 * ibus_object_new:
120 *
121 * Creates a new #IBusObject.
122 *
123 * Returns: A newly allocated #IBusObject
124 */
125IBusObject *ibus_object_new (void);
126
127/**
128 * ibus_object_destroy:
129 * @object: an #IBusObject to destroy.
130 *
131 * Emit the "destory" signal notifying all reference holders that they should
132 * release the #IBusObject.
133 *
134 * The memory for the object itself won't be deleted until its reference count
135 * actually drops to 0; ibus_object_destroy merely asks reference holders to
136 * release their references. It does not free the object.
137 */
138void ibus_object_destroy (IBusObject *object);
139
140G_END_DECLS
141#endif
142
143