2 * geanyobject.c - this file is part of Geany, a fast and lightweight IDE
4 * Copyright 2007-2012 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
5 * Copyright 2007-2012 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program 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
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 /* A GObject used for connecting and emitting signals when certain events happen,
23 * e.g. opening a document.
24 * Mainly used for plugins - see the API docs.
28 * signal void save_settings(GObject *obj, GKeyFile *keyfile, gpointer user_data);
29 * Emitted just before saving main keyfile settings.
31 * signal void load_settings(GObject *obj, GKeyFile *keyfile, gpointer user_data);
32 * Emitted just after loading main keyfile settings.
39 #include "geanyobject.h"
41 /* extern in geany.h */
42 GObject
*geany_object
;
44 static guint geany_object_signals
[GCB_MAX
] = { 0 };
47 typedef struct _GeanyObjectPrivate GeanyObjectPrivate
;
49 struct _GeanyObjectPrivate
51 /* to avoid warnings (g_type_class_add_private: assertion `private_size > 0' failed) */
56 G_DEFINE_TYPE(GeanyObject
, geany_object
, G_TYPE_OBJECT
)
60 static void geany_cclosure_marshal_VOID__STRING_INT_POINTER(GClosure
*closure
, GValue
*ret_val
,
61 guint n_param_vals
, const GValue
*param_values
, gpointer hint
, gpointer mdata
)
63 typedef gboolean (*GeanyMarshalFunc_VOID__STRING_INT_POINTER
)
64 (gpointer data1
, gconstpointer arg_1
, gint arg_2
, gpointer arg_3
, gpointer data2
);
66 register GeanyMarshalFunc_VOID__STRING_INT_POINTER callback
;
67 register GCClosure
* cc
= (GCClosure
*) closure
;
68 register gpointer data1
, data2
;
70 g_return_if_fail(n_param_vals
== 4);
72 if (G_CCLOSURE_SWAP_DATA(closure
))
74 data1
= closure
->data
;
75 data2
= g_value_peek_pointer(param_values
+ 0);
79 data1
= g_value_peek_pointer(param_values
+ 0);
80 data2
= closure
->data
;
82 callback
= (GeanyMarshalFunc_VOID__STRING_INT_POINTER
) (mdata
? mdata
: cc
->callback
);
84 g_value_get_string(param_values
+ 1),
85 g_value_get_int(param_values
+ 2),
86 g_value_get_pointer(param_values
+ 3),
91 static void geany_cclosure_marshal_VOID__POINTER_POINTER(GClosure
*closure
, GValue
*ret_val
,
92 guint n_param_vals
, const GValue
*param_values
, gpointer hint
, gpointer mdata
)
94 typedef gboolean (*GeanyMarshalFunc_VOID__POINTER_POINTER
)
95 (gpointer data1
, gconstpointer arg_1
, gconstpointer arg_2
, gpointer data2
);
97 register GeanyMarshalFunc_VOID__POINTER_POINTER callback
;
98 register GCClosure
* cc
= (GCClosure
*) closure
;
99 register gpointer data1
, data2
;
101 g_return_if_fail(n_param_vals
== 3);
103 if (G_CCLOSURE_SWAP_DATA(closure
))
105 data1
= closure
->data
;
106 data2
= g_value_peek_pointer(param_values
+ 0);
110 data1
= g_value_peek_pointer(param_values
+ 0);
111 data2
= closure
->data
;
113 callback
= (GeanyMarshalFunc_VOID__POINTER_POINTER
) (mdata
? mdata
: cc
->callback
);
115 g_value_get_pointer(param_values
+ 1),
116 g_value_get_pointer(param_values
+ 2),
121 static gboolean
boolean_handled_accumulator(GSignalInvocationHint
*ihint
, GValue
*return_accu
,
122 const GValue
*handler_return
, gpointer dummy
)
124 gboolean continue_emission
, signal_handled
;
126 signal_handled
= g_value_get_boolean(handler_return
);
127 g_value_set_boolean(return_accu
, signal_handled
);
128 continue_emission
= !signal_handled
;
130 return continue_emission
;
134 static void geany_cclosure_marshal_BOOL__POINTER_POINTER(GClosure
*closure
, GValue
*return_value
,
135 guint n_param_values
, const GValue
*param_values
,
136 gpointer invocation_hint G_GNUC_UNUSED
, gpointer marshal_data
)
138 typedef gboolean (*GeanyMarshalFunc_BOOLEAN__POINTER_POINTER
)
139 (gpointer data1
, gpointer arg_1
, gpointer arg_2
, gpointer data2
);
141 register GeanyMarshalFunc_BOOLEAN__POINTER_POINTER callback
;
142 register GCClosure
*cc
= (GCClosure
*) closure
;
143 register gpointer data1
, data2
;
146 g_return_if_fail(return_value
!= NULL
);
147 g_return_if_fail(n_param_values
== 3);
149 if (G_CCLOSURE_SWAP_DATA(closure
))
151 data1
= closure
->data
;
152 data2
= g_value_peek_pointer(param_values
+ 0);
156 data1
= g_value_peek_pointer(param_values
+ 0);
157 data2
= closure
->data
;
159 callback
= (GeanyMarshalFunc_BOOLEAN__POINTER_POINTER
)
160 (marshal_data
? marshal_data
: cc
->callback
);
162 v_return
= callback(data1
,
163 g_value_get_pointer(param_values
+ 1),
164 g_value_get_pointer(param_values
+ 2),
167 g_value_set_boolean(return_value
, v_return
);
171 static void create_signals(GObjectClass
*g_object_class
)
173 /* Document signals */
174 geany_object_signals
[GCB_DOCUMENT_NEW
] = g_signal_new (
176 G_OBJECT_CLASS_TYPE (g_object_class
),
178 G_STRUCT_OFFSET (GeanyObjectClass
, document_new
),
180 g_cclosure_marshal_VOID__POINTER
,
183 geany_object_signals
[GCB_DOCUMENT_OPEN
] = g_signal_new (
185 G_OBJECT_CLASS_TYPE (g_object_class
),
187 G_STRUCT_OFFSET (GeanyObjectClass
, document_open
),
189 g_cclosure_marshal_VOID__POINTER
,
192 geany_object_signals
[GCB_DOCUMENT_RELOAD
] = g_signal_new (
194 G_OBJECT_CLASS_TYPE (g_object_class
),
196 G_STRUCT_OFFSET (GeanyObjectClass
, document_reload
),
198 g_cclosure_marshal_VOID__POINTER
,
201 geany_object_signals
[GCB_DOCUMENT_BEFORE_SAVE
] = g_signal_new (
202 "document-before-save",
203 G_OBJECT_CLASS_TYPE (g_object_class
),
205 G_STRUCT_OFFSET (GeanyObjectClass
, document_before_save
),
207 g_cclosure_marshal_VOID__POINTER
,
210 geany_object_signals
[GCB_DOCUMENT_SAVE
] = g_signal_new (
212 G_OBJECT_CLASS_TYPE (g_object_class
),
214 G_STRUCT_OFFSET (GeanyObjectClass
, document_save
),
216 g_cclosure_marshal_VOID__POINTER
,
219 geany_object_signals
[GCB_DOCUMENT_FILETYPE_SET
] = g_signal_new (
220 "document-filetype-set",
221 G_OBJECT_CLASS_TYPE (g_object_class
),
223 G_STRUCT_OFFSET (GeanyObjectClass
, document_filetype_set
),
225 geany_cclosure_marshal_VOID__POINTER_POINTER
,
227 G_TYPE_POINTER
, G_TYPE_POINTER
);
228 geany_object_signals
[GCB_DOCUMENT_ACTIVATE
] = g_signal_new (
230 G_OBJECT_CLASS_TYPE (g_object_class
),
232 G_STRUCT_OFFSET (GeanyObjectClass
, document_activate
),
234 g_cclosure_marshal_VOID__POINTER
,
237 geany_object_signals
[GCB_DOCUMENT_CLOSE
] = g_signal_new (
239 G_OBJECT_CLASS_TYPE (g_object_class
),
241 G_STRUCT_OFFSET (GeanyObjectClass
, document_close
),
243 g_cclosure_marshal_VOID__POINTER
,
247 /* Project signals */
248 geany_object_signals
[GCB_PROJECT_OPEN
] = g_signal_new (
250 G_OBJECT_CLASS_TYPE (g_object_class
),
252 G_STRUCT_OFFSET (GeanyObjectClass
, project_open
),
254 g_cclosure_marshal_VOID__POINTER
,
257 geany_object_signals
[GCB_PROJECT_SAVE
] = g_signal_new (
259 G_OBJECT_CLASS_TYPE (g_object_class
),
261 G_STRUCT_OFFSET (GeanyObjectClass
, project_save
),
263 g_cclosure_marshal_VOID__POINTER
,
266 geany_object_signals
[GCB_PROJECT_CLOSE
] = g_signal_new (
268 G_OBJECT_CLASS_TYPE (g_object_class
),
270 G_STRUCT_OFFSET (GeanyObjectClass
, project_close
),
272 g_cclosure_marshal_VOID__VOID
,
274 geany_object_signals
[GCB_PROJECT_DIALOG_OPEN
] = g_signal_new (
275 "project-dialog-open",
276 G_OBJECT_CLASS_TYPE (g_object_class
),
278 G_STRUCT_OFFSET (GeanyObjectClass
, project_dialog_open
),
280 g_cclosure_marshal_VOID__POINTER
,
283 geany_object_signals
[GCB_PROJECT_DIALOG_CONFIRMED
] = g_signal_new (
284 "project-dialog-confirmed",
285 G_OBJECT_CLASS_TYPE (g_object_class
),
287 G_STRUCT_OFFSET (GeanyObjectClass
, project_dialog_confirmed
),
289 g_cclosure_marshal_VOID__POINTER
,
292 geany_object_signals
[GCB_PROJECT_DIALOG_CLOSE
] = g_signal_new (
293 "project-dialog-close",
294 G_OBJECT_CLASS_TYPE (g_object_class
),
296 G_STRUCT_OFFSET (GeanyObjectClass
, project_dialog_close
),
298 g_cclosure_marshal_VOID__POINTER
,
303 geany_object_signals
[GCB_UPDATE_EDITOR_MENU
] = g_signal_new (
304 "update-editor-menu",
305 G_OBJECT_CLASS_TYPE (g_object_class
),
307 G_STRUCT_OFFSET (GeanyObjectClass
, update_editor_menu
),
309 geany_cclosure_marshal_VOID__STRING_INT_POINTER
,
311 G_TYPE_STRING
, G_TYPE_INT
, G_TYPE_POINTER
);
312 geany_object_signals
[GCB_EDITOR_NOTIFY
] = g_signal_new (
314 G_OBJECT_CLASS_TYPE (g_object_class
),
316 G_STRUCT_OFFSET (GeanyObjectClass
, update_editor_menu
),
317 boolean_handled_accumulator
, NULL
,
318 geany_cclosure_marshal_BOOL__POINTER_POINTER
,
320 G_TYPE_POINTER
, G_TYPE_POINTER
);
322 /* General signals */
323 geany_object_signals
[GCB_GEANY_STARTUP_COMPLETE
] = g_signal_new (
324 "geany-startup-complete",
325 G_OBJECT_CLASS_TYPE (g_object_class
),
327 G_STRUCT_OFFSET (GeanyObjectClass
, geany_startup_complete
),
329 g_cclosure_marshal_VOID__VOID
,
331 geany_object_signals
[GCB_BUILD_START
] = g_signal_new (
333 G_OBJECT_CLASS_TYPE (g_object_class
),
335 G_STRUCT_OFFSET (GeanyObjectClass
, build_start
),
337 g_cclosure_marshal_VOID__VOID
,
340 /* Core-only signals */
341 geany_object_signals
[GCB_SAVE_SETTINGS
] = g_signal_new (
343 G_OBJECT_CLASS_TYPE (g_object_class
),
345 G_STRUCT_OFFSET (GeanyObjectClass
, save_settings
),
347 g_cclosure_marshal_VOID__POINTER
,
350 geany_object_signals
[GCB_LOAD_SETTINGS
] = g_signal_new (
352 G_OBJECT_CLASS_TYPE (g_object_class
),
354 G_STRUCT_OFFSET (GeanyObjectClass
, load_settings
),
356 g_cclosure_marshal_VOID__POINTER
,
362 static void geany_object_class_init(GeanyObjectClass
*klass
)
364 GObjectClass
*g_object_class
;
365 g_object_class
= G_OBJECT_CLASS(klass
);
367 g_type_class_add_private(klass
, sizeof(GeanyObjectPrivate
));
369 create_signals(g_object_class
);
373 static void geany_object_init(GeanyObject
*self
)
379 GObject
*geany_object_new(void)
381 return g_object_new(GEANY_OBJECT_TYPE
, NULL
);