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 <stdio.h>
24 #include <stdlib.h>
25
26 #include <gio/gio.h>
27 #define G_SETTINGS_ENABLE_BACKEND
28 #include <gio/gsettingsbackend.h>
29 #include <glib-object.h>
30 #include <glib.h>
31 #include <glib/gi18n.h>
32 #include <locale.h>
33
34 /* GObject Type Casting */
toGObject(void * p)35 static GObject *toGObject(void *p) { return (G_OBJECT(p)); }
36
toGAction(void * p)37 static GAction *toGAction(void *p) { return (G_ACTION(p)); }
38
toGActionGroup(void * p)39 static GActionGroup *toGActionGroup(void *p) { return (G_ACTION_GROUP(p)); }
40
toGActionMap(void * p)41 static GActionMap *toGActionMap(void *p) { return (G_ACTION_MAP(p)); }
42
toGAsyncResult(void * p)43 static GAsyncResult *toGAsyncResult(void *p) { return (G_ASYNC_RESULT(p)); }
44
toGSimpleAction(void * p)45 static GSimpleAction *toGSimpleAction(void *p) { return (G_SIMPLE_ACTION(p)); }
46
toGSimpleActionGroup(void * p)47 static GSimpleActionGroup *toGSimpleActionGroup(void *p) {
48 return (G_SIMPLE_ACTION_GROUP(p));
49 }
50
toGPropertyAction(void * p)51 static GPropertyAction *toGPropertyAction(void *p) {
52 return (G_PROPERTY_ACTION(p));
53 }
54
toGMenuModel(void * p)55 static GMenuModel *toGMenuModel(void *p) { return (G_MENU_MODEL(p)); }
56
toGMenu(void * p)57 static GMenu *toGMenu(void *p) { return (G_MENU(p)); }
58
toGMenuItem(void * p)59 static GMenuItem *toGMenuItem(void *p) { return (G_MENU_ITEM(p)); }
60
toGNotification(void * p)61 static GNotification *toGNotification(void *p) { return (G_NOTIFICATION(p)); }
62
toGPermission(void * p)63 static GPermission *toGPermission(void *p) { return (G_PERMISSION(p)); }
64
toCancellable(void * p)65 static GCancellable *toCancellable(void *p) { return (G_CANCELLABLE(p)); }
66
toGIcon(void * p)67 static GIcon *toGIcon(void *p) { return (G_ICON(p)); }
toGFileIcon(void * p)68 static GFileIcon *toGFileIcon(void *p) { return (G_FILE_ICON(p)); }
69
toGFile(void * p)70 static GFile *toGFile(void *p) { return (G_FILE(p)); }
71
toGApplication(void * p)72 static GApplication *toGApplication(void *p) { return (G_APPLICATION(p)); }
73
toGSettings(void * p)74 static GSettings *toGSettings(void *p) { return (G_SETTINGS(p)); }
75
toGSettingsBackend(void * p)76 static GSettingsBackend *toGSettingsBackend(void *p) {
77 return (G_SETTINGS_BACKEND(p));
78 }
79
toGBinding(void * p)80 static GBinding *toGBinding(void *p) { return (G_BINDING(p)); }
81
_g_type_from_instance(gpointer instance)82 static GType _g_type_from_instance(gpointer instance) {
83 return (G_TYPE_FROM_INSTANCE(instance));
84 }
85
86 /* Wrapper to avoid variable arg list */
_g_object_set_one(gpointer object,const gchar * property_name,void * val)87 static void _g_object_set_one(gpointer object, const gchar *property_name,
88 void *val) {
89 g_object_set(object, property_name, *(gpointer **)val, NULL);
90 }
91
alloc_gvalue_list(int n)92 static GValue *alloc_gvalue_list(int n) {
93 GValue *valv;
94
95 valv = g_new0(GValue, n);
96 return (valv);
97 }
98
val_list_insert(GValue * valv,int i,GValue * val)99 static void val_list_insert(GValue *valv, int i, GValue *val) {
100 valv[i] = *val;
101 }
102
103 /*
104 * GValue
105 */
106
_g_value_alloc()107 static GValue *_g_value_alloc() { return (g_new0(GValue, 1)); }
108
_g_value_init(GType g_type)109 static GValue *_g_value_init(GType g_type) {
110 GValue *value;
111
112 value = g_new0(GValue, 1);
113 return (g_value_init(value, g_type));
114 }
115
_g_type_is_value(GType g_type)116 static gboolean _g_type_is_value(GType g_type) {
117 return (G_TYPE_IS_VALUE(g_type));
118 }
119
_g_is_value(GValue * val)120 static gboolean _g_is_value(GValue *val) { return (G_IS_VALUE(val)); }
121
_g_value_type(GValue * val)122 static GType _g_value_type(GValue *val) { return (G_VALUE_TYPE(val)); }
123
_g_value_type_name(GValue * val)124 static const gchar *_g_value_type_name(GValue *val) {
125 return (G_VALUE_TYPE_NAME(val));
126 }
127
_g_value_fundamental(GType type)128 static GType _g_value_fundamental(GType type) {
129 return (G_TYPE_FUNDAMENTAL(type));
130 }
131
_g_object_get_class(GObject * object)132 static GObjectClass *_g_object_get_class(GObject *object) {
133 return (G_OBJECT_GET_CLASS(object));
134 }
135
136 /*
137 * Closure support
138 */
139
140 extern void removeSourceFunc(gpointer data);
141 extern gboolean sourceFunc(gpointer data);
142
143 extern void goMarshal(GClosure *, GValue *, guint, GValue *, gpointer,
144 GValue *);
145 extern void removeClosure(gpointer, GClosure *);
146
_g_closure_new()147 static inline GClosure *_g_closure_new() {
148 GClosure *closure;
149
150 closure = g_closure_new_simple(sizeof(GClosure), NULL);
151 g_closure_set_marshal(closure, (GClosureMarshal)(goMarshal));
152 g_closure_add_finalize_notifier(closure, NULL,
153 (GClosureNotify)(removeClosure));
154 return closure;
155 }
156
_g_signal_new(const gchar * name)157 static inline guint _g_signal_new(const gchar *name) {
158 return g_signal_new(name, G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
159 0, NULL, NULL, g_cclosure_marshal_VOID__POINTER,
160 G_TYPE_NONE, 0);
161 }
162
init_i18n(const char * domain,const char * dir)163 static void init_i18n(const char *domain, const char *dir) {
164 setlocale(LC_ALL, "");
165 bindtextdomain(domain, dir);
166 bind_textdomain_codeset(domain, "UTF-8");
167 textdomain(domain);
168 }
169
localize(const char * string)170 static const char *localize(const char *string) { return _(string); }
171
make_strings(int count)172 static inline char **make_strings(int count) {
173 return (char **)malloc(sizeof(char *) * count);
174 }
175
destroy_strings(char ** strings)176 static inline void destroy_strings(char **strings) { free(strings); }
177
get_string(char ** strings,int n)178 static inline char *get_string(char **strings, int n) { return strings[n]; }
179
set_string(char ** strings,int n,char * str)180 static inline void set_string(char **strings, int n, char *str) {
181 strings[n] = str;
182 }
183
next_gcharptr(gchar ** s)184 static inline gchar **next_gcharptr(gchar **s) { return (s + 1); }
185
186 extern gint goCompareDataFuncs(gconstpointer a, gconstpointer b,
187 gpointer user_data);
188
189 #endif
190