1 /*
2  * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
3  *
4  * This file originated from: http://opensource.conformal.com/
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef __GLIB_GO_H__
20 #define __GLIB_GO_H__
21 
22 #include <stdint.h>
23 #include <stdlib.h>
24 #include <stdio.h>
25 
26 #include <gio/gio.h>
27 #define G_SETTINGS_ENABLE_BACKEND
28 #include <gio/gsettingsbackend.h>
29 #include <glib.h>
30 #include <glib-object.h>
31 #include <glib/gi18n.h>
32 #include <locale.h>
33 
34 /* GObject Type Casting */
35 static GObject *
toGObject(void * p)36 toGObject(void *p)
37 {
38 	return (G_OBJECT(p));
39 }
40 
41 static GAction *
toGAction(void * p)42 toGAction(void *p)
43 {
44 	return (G_ACTION(p));
45 }
46 
47 static GActionGroup *
toGActionGroup(void * p)48 toGActionGroup(void *p)
49 {
50 	return (G_ACTION_GROUP(p));
51 }
52 
53 static GActionMap *
toGActionMap(void * p)54 toGActionMap(void *p)
55 {
56 	return (G_ACTION_MAP(p));
57 }
58 
59 static GSimpleAction *
toGSimpleAction(void * p)60 toGSimpleAction(void *p)
61 {
62 	return (G_SIMPLE_ACTION(p));
63 }
64 
65 static GSimpleActionGroup *
toGSimpleActionGroup(void * p)66 toGSimpleActionGroup(void *p)
67 {
68 	return (G_SIMPLE_ACTION_GROUP(p));
69 }
70 
71 static GPropertyAction *
toGPropertyAction(void * p)72 toGPropertyAction(void *p)
73 {
74 	return (G_PROPERTY_ACTION(p));
75 }
76 
77 static GMenuModel *
toGMenuModel(void * p)78 toGMenuModel(void *p)
79 {
80 	return (G_MENU_MODEL(p));
81 }
82 
83 static GMenu *
toGMenu(void * p)84 toGMenu(void *p)
85 {
86 	return (G_MENU(p));
87 }
88 
89 static GMenuItem *
toGMenuItem(void * p)90 toGMenuItem(void *p)
91 {
92 	return (G_MENU_ITEM(p));
93 }
94 
95 static GNotification *
toGNotification(void * p)96 toGNotification(void *p)
97 {
98 	return (G_NOTIFICATION(p));
99 }
100 
101 static GApplication *
toGApplication(void * p)102 toGApplication(void *p)
103 {
104 	return (G_APPLICATION(p));
105 }
106 
107 static GSettings *
toGSettings(void * p)108 toGSettings(void *p)
109 {
110 	return (G_SETTINGS(p));
111 }
112 
113 static GSettingsBackend *
toGSettingsBackend(void * p)114 toGSettingsBackend(void *p)
115 {
116 	return (G_SETTINGS_BACKEND(p));
117 }
118 
119 static GBinding*
toGBinding(void * p)120 toGBinding(void *p)
121 {
122         return (G_BINDING(p));
123 }
124 
125 static GType
_g_type_from_instance(gpointer instance)126 _g_type_from_instance(gpointer instance)
127 {
128 	return (G_TYPE_FROM_INSTANCE(instance));
129 }
130 
131 /* Wrapper to avoid variable arg list */
132 static void
_g_object_set_one(gpointer object,const gchar * property_name,void * val)133 _g_object_set_one(gpointer object, const gchar *property_name, void *val)
134 {
135 	g_object_set(object, property_name, *(gpointer **)val, NULL);
136 }
137 
138 static GValue *
alloc_gvalue_list(int n)139 alloc_gvalue_list(int n)
140 {
141 	GValue		*valv;
142 
143 	valv = g_new0(GValue, n);
144 	return (valv);
145 }
146 
147 static void
val_list_insert(GValue * valv,int i,GValue * val)148 val_list_insert(GValue *valv, int i, GValue *val)
149 {
150 	valv[i] = *val;
151 }
152 
153 /*
154  * GValue
155  */
156 
157 static GValue *
_g_value_alloc()158 _g_value_alloc()
159 {
160 	return (g_new0(GValue, 1));
161 }
162 
163 static GValue *
_g_value_init(GType g_type)164 _g_value_init(GType g_type)
165 {
166 	GValue          *value;
167 
168 	value = g_new0(GValue, 1);
169 	return (g_value_init(value, g_type));
170 }
171 
172 static gboolean
_g_is_value(GValue * val)173 _g_is_value(GValue *val)
174 {
175 	return (G_IS_VALUE(val));
176 }
177 
178 static GType
_g_value_type(GValue * val)179 _g_value_type(GValue *val)
180 {
181 	return (G_VALUE_TYPE(val));
182 }
183 
184 static GType
_g_value_fundamental(GType type)185 _g_value_fundamental(GType type)
186 {
187 	return (G_TYPE_FUNDAMENTAL(type));
188 }
189 
190 static GObjectClass *
_g_object_get_class(GObject * object)191 _g_object_get_class (GObject *object)
192 {
193 	return (G_OBJECT_GET_CLASS(object));
194 }
195 
196 /*
197  * Closure support
198  */
199 
200 extern void	goMarshal(GClosure *, GValue *, guint, GValue *, gpointer, GValue *);
201 
202 static GClosure *
_g_closure_new()203 _g_closure_new()
204 {
205 	GClosure	*closure;
206 
207 	closure = g_closure_new_simple(sizeof(GClosure), NULL);
208 	g_closure_set_marshal(closure, (GClosureMarshal)(goMarshal));
209 	return (closure);
210 }
211 
212 extern void	removeClosure(gpointer, GClosure *);
213 
214 static void
_g_closure_add_finalize_notifier(GClosure * closure)215 _g_closure_add_finalize_notifier(GClosure *closure)
216 {
217 	g_closure_add_finalize_notifier(closure, NULL, removeClosure);
218 }
219 
_g_signal_new(const gchar * name)220 static inline guint _g_signal_new(const gchar *name) {
221 	return g_signal_new(name,
222 		G_TYPE_OBJECT,
223 		G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
224 		0, NULL, NULL,
225 		g_cclosure_marshal_VOID__POINTER,
226 		G_TYPE_NONE,
227 		0);
228 }
229 
init_i18n(const char * domain,const char * dir)230 static void init_i18n(const char *domain, const char *dir) {
231   setlocale(LC_ALL, "");
232   bindtextdomain(domain, dir);
233   bind_textdomain_codeset(domain, "UTF-8");
234   textdomain(domain);
235 }
236 
localize(const char * string)237 static const char* localize(const char *string) {
238   return _(string);
239 }
240 
make_strings(int count)241 static inline char** make_strings(int count) {
242 	return (char**)malloc(sizeof(char*) * count);
243 }
244 
destroy_strings(char ** strings)245 static inline void destroy_strings(char** strings) {
246 	free(strings);
247 }
248 
get_string(char ** strings,int n)249 static inline char* get_string(char** strings, int n) {
250 	return strings[n];
251 }
252 
set_string(char ** strings,int n,char * str)253 static inline void set_string(char** strings, int n, char* str) {
254 	strings[n] = str;
255 }
256 
next_gcharptr(gchar ** s)257 static inline gchar** next_gcharptr(gchar** s) { return (s+1); }
258 
259 #endif
260