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.
36 #include "geanyobject.h"
38 /* extern in geany.h */
39 GObject
*geany_object
;
41 static guint geany_object_signals
[GCB_MAX
] = { 0 };
44 typedef struct _GeanyObjectPrivate GeanyObjectPrivate
;
46 struct _GeanyObjectPrivate
48 /* to avoid warnings (g_type_class_add_private: assertion `private_size > 0' failed) */
53 G_DEFINE_TYPE(GeanyObject
, geany_object
, G_TYPE_OBJECT
)
57 static void geany_cclosure_marshal_VOID__STRING_INT_POINTER(GClosure
*closure
, GValue
*ret_val
,
58 guint n_param_vals
, const GValue
*param_values
, gpointer hint
, gpointer mdata
)
60 typedef gboolean (*GeanyMarshalFunc_VOID__STRING_INT_POINTER
)
61 (gpointer data1
, gconstpointer arg_1
, gint arg_2
, gpointer arg_3
, gpointer data2
);
63 register GeanyMarshalFunc_VOID__STRING_INT_POINTER callback
;
64 register GCClosure
* cc
= (GCClosure
*) closure
;
65 register gpointer data1
, data2
;
67 g_return_if_fail(n_param_vals
== 4);
69 if (G_CCLOSURE_SWAP_DATA(closure
))
71 data1
= closure
->data
;
72 data2
= g_value_peek_pointer(param_values
+ 0);
76 data1
= g_value_peek_pointer(param_values
+ 0);
77 data2
= closure
->data
;
79 callback
= (GeanyMarshalFunc_VOID__STRING_INT_POINTER
) (mdata
? mdata
: cc
->callback
);
81 g_value_get_string(param_values
+ 1),
82 g_value_get_int(param_values
+ 2),
83 g_value_get_pointer(param_values
+ 3),
88 static void geany_cclosure_marshal_VOID__POINTER_POINTER(GClosure
*closure
, GValue
*ret_val
,
89 guint n_param_vals
, const GValue
*param_values
, gpointer hint
, gpointer mdata
)
91 typedef gboolean (*GeanyMarshalFunc_VOID__POINTER_POINTER
)
92 (gpointer data1
, gconstpointer arg_1
, gconstpointer arg_2
, gpointer data2
);
94 register GeanyMarshalFunc_VOID__POINTER_POINTER callback
;
95 register GCClosure
* cc
= (GCClosure
*) closure
;
96 register gpointer data1
, data2
;
98 g_return_if_fail(n_param_vals
== 3);
100 if (G_CCLOSURE_SWAP_DATA(closure
))
102 data1
= closure
->data
;
103 data2
= g_value_peek_pointer(param_values
+ 0);
107 data1
= g_value_peek_pointer(param_values
+ 0);
108 data2
= closure
->data
;
110 callback
= (GeanyMarshalFunc_VOID__POINTER_POINTER
) (mdata
? mdata
: cc
->callback
);
112 g_value_get_pointer(param_values
+ 1),
113 g_value_get_pointer(param_values
+ 2),
118 static gboolean
boolean_handled_accumulator(GSignalInvocationHint
*ihint
, GValue
*return_accu
,
119 const GValue
*handler_return
, gpointer dummy
)
121 gboolean continue_emission
, signal_handled
;
123 signal_handled
= g_value_get_boolean(handler_return
);
124 g_value_set_boolean(return_accu
, signal_handled
);
125 continue_emission
= !signal_handled
;
127 return continue_emission
;
131 static void geany_cclosure_marshal_BOOL__POINTER_POINTER(GClosure
*closure
, GValue
*return_value
,
132 guint n_param_values
, const GValue
*param_values
,
133 gpointer invocation_hint G_GNUC_UNUSED
, gpointer marshal_data
)
135 typedef gboolean (*GeanyMarshalFunc_BOOLEAN__POINTER_POINTER
)
136 (gpointer data1
, gpointer arg_1
, gpointer arg_2
, gpointer data2
);
138 register GeanyMarshalFunc_BOOLEAN__POINTER_POINTER callback
;
139 register GCClosure
*cc
= (GCClosure
*) closure
;
140 register gpointer data1
, data2
;
143 g_return_if_fail(return_value
!= NULL
);
144 g_return_if_fail(n_param_values
== 3);
146 if (G_CCLOSURE_SWAP_DATA(closure
))
148 data1
= closure
->data
;
149 data2
= g_value_peek_pointer(param_values
+ 0);
153 data1
= g_value_peek_pointer(param_values
+ 0);
154 data2
= closure
->data
;
156 callback
= (GeanyMarshalFunc_BOOLEAN__POINTER_POINTER
)
157 (marshal_data
? marshal_data
: cc
->callback
);
159 v_return
= callback(data1
,
160 g_value_get_pointer(param_values
+ 1),
161 g_value_get_pointer(param_values
+ 2),
164 g_value_set_boolean(return_value
, v_return
);
168 static void create_signals(GObjectClass
*g_object_class
)
170 /* Document signals */
171 geany_object_signals
[GCB_DOCUMENT_NEW
] = g_signal_new (
173 G_OBJECT_CLASS_TYPE (g_object_class
),
175 G_STRUCT_OFFSET (GeanyObjectClass
, document_new
),
177 g_cclosure_marshal_VOID__POINTER
,
180 geany_object_signals
[GCB_DOCUMENT_OPEN
] = g_signal_new (
182 G_OBJECT_CLASS_TYPE (g_object_class
),
184 G_STRUCT_OFFSET (GeanyObjectClass
, document_open
),
186 g_cclosure_marshal_VOID__POINTER
,
189 geany_object_signals
[GCB_DOCUMENT_RELOAD
] = g_signal_new (
191 G_OBJECT_CLASS_TYPE (g_object_class
),
193 G_STRUCT_OFFSET (GeanyObjectClass
, document_reload
),
195 g_cclosure_marshal_VOID__POINTER
,
198 geany_object_signals
[GCB_DOCUMENT_BEFORE_SAVE
] = g_signal_new (
199 "document-before-save",
200 G_OBJECT_CLASS_TYPE (g_object_class
),
202 G_STRUCT_OFFSET (GeanyObjectClass
, document_before_save
),
204 g_cclosure_marshal_VOID__POINTER
,
207 geany_object_signals
[GCB_DOCUMENT_SAVE
] = g_signal_new (
209 G_OBJECT_CLASS_TYPE (g_object_class
),
211 G_STRUCT_OFFSET (GeanyObjectClass
, document_save
),
213 g_cclosure_marshal_VOID__POINTER
,
216 geany_object_signals
[GCB_DOCUMENT_FILETYPE_SET
] = g_signal_new (
217 "document-filetype-set",
218 G_OBJECT_CLASS_TYPE (g_object_class
),
220 G_STRUCT_OFFSET (GeanyObjectClass
, document_filetype_set
),
222 geany_cclosure_marshal_VOID__POINTER_POINTER
,
224 G_TYPE_POINTER
, G_TYPE_POINTER
);
225 geany_object_signals
[GCB_DOCUMENT_ACTIVATE
] = g_signal_new (
227 G_OBJECT_CLASS_TYPE (g_object_class
),
229 G_STRUCT_OFFSET (GeanyObjectClass
, document_activate
),
231 g_cclosure_marshal_VOID__POINTER
,
234 geany_object_signals
[GCB_DOCUMENT_CLOSE
] = g_signal_new (
236 G_OBJECT_CLASS_TYPE (g_object_class
),
238 G_STRUCT_OFFSET (GeanyObjectClass
, document_close
),
240 g_cclosure_marshal_VOID__POINTER
,
244 /* Project signals */
245 geany_object_signals
[GCB_PROJECT_OPEN
] = g_signal_new (
247 G_OBJECT_CLASS_TYPE (g_object_class
),
249 G_STRUCT_OFFSET (GeanyObjectClass
, project_open
),
251 g_cclosure_marshal_VOID__POINTER
,
254 geany_object_signals
[GCB_PROJECT_SAVE
] = g_signal_new (
256 G_OBJECT_CLASS_TYPE (g_object_class
),
258 G_STRUCT_OFFSET (GeanyObjectClass
, project_save
),
260 g_cclosure_marshal_VOID__POINTER
,
263 geany_object_signals
[GCB_PROJECT_CLOSE
] = g_signal_new (
265 G_OBJECT_CLASS_TYPE (g_object_class
),
267 G_STRUCT_OFFSET (GeanyObjectClass
, project_close
),
269 g_cclosure_marshal_VOID__VOID
,
271 geany_object_signals
[GCB_PROJECT_DIALOG_OPEN
] = g_signal_new (
272 "project-dialog-open",
273 G_OBJECT_CLASS_TYPE (g_object_class
),
275 G_STRUCT_OFFSET (GeanyObjectClass
, project_dialog_open
),
277 g_cclosure_marshal_VOID__POINTER
,
280 geany_object_signals
[GCB_PROJECT_DIALOG_CONFIRMED
] = g_signal_new (
281 "project-dialog-confirmed",
282 G_OBJECT_CLASS_TYPE (g_object_class
),
284 G_STRUCT_OFFSET (GeanyObjectClass
, project_dialog_confirmed
),
286 g_cclosure_marshal_VOID__POINTER
,
289 geany_object_signals
[GCB_PROJECT_DIALOG_CLOSE
] = g_signal_new (
290 "project-dialog-close",
291 G_OBJECT_CLASS_TYPE (g_object_class
),
293 G_STRUCT_OFFSET (GeanyObjectClass
, project_dialog_close
),
295 g_cclosure_marshal_VOID__POINTER
,
300 geany_object_signals
[GCB_UPDATE_EDITOR_MENU
] = g_signal_new (
301 "update-editor-menu",
302 G_OBJECT_CLASS_TYPE (g_object_class
),
304 G_STRUCT_OFFSET (GeanyObjectClass
, update_editor_menu
),
306 geany_cclosure_marshal_VOID__STRING_INT_POINTER
,
308 G_TYPE_STRING
, G_TYPE_INT
, G_TYPE_POINTER
);
309 geany_object_signals
[GCB_EDITOR_NOTIFY
] = g_signal_new (
311 G_OBJECT_CLASS_TYPE (g_object_class
),
313 G_STRUCT_OFFSET (GeanyObjectClass
, update_editor_menu
),
314 boolean_handled_accumulator
, NULL
,
315 geany_cclosure_marshal_BOOL__POINTER_POINTER
,
317 G_TYPE_POINTER
, G_TYPE_POINTER
);
319 /* General signals */
320 geany_object_signals
[GCB_GEANY_STARTUP_COMPLETE
] = g_signal_new (
321 "geany-startup-complete",
322 G_OBJECT_CLASS_TYPE (g_object_class
),
324 G_STRUCT_OFFSET (GeanyObjectClass
, geany_startup_complete
),
326 g_cclosure_marshal_VOID__VOID
,
328 geany_object_signals
[GCB_BUILD_START
] = g_signal_new (
330 G_OBJECT_CLASS_TYPE (g_object_class
),
332 G_STRUCT_OFFSET (GeanyObjectClass
, build_start
),
334 g_cclosure_marshal_VOID__VOID
,
337 /* Core-only signals */
338 geany_object_signals
[GCB_SAVE_SETTINGS
] = g_signal_new (
340 G_OBJECT_CLASS_TYPE (g_object_class
),
342 G_STRUCT_OFFSET (GeanyObjectClass
, save_settings
),
344 g_cclosure_marshal_VOID__POINTER
,
347 geany_object_signals
[GCB_LOAD_SETTINGS
] = g_signal_new (
349 G_OBJECT_CLASS_TYPE (g_object_class
),
351 G_STRUCT_OFFSET (GeanyObjectClass
, load_settings
),
353 g_cclosure_marshal_VOID__POINTER
,
359 static void geany_object_class_init(GeanyObjectClass
*klass
)
361 GObjectClass
*g_object_class
;
362 g_object_class
= G_OBJECT_CLASS(klass
);
364 g_type_class_add_private(klass
, sizeof(GeanyObjectPrivate
));
366 create_signals(g_object_class
);
370 static void geany_object_init(GeanyObject
*self
)
376 GObject
*geany_object_new(void)
378 return g_object_new(GEANY_OBJECT_TYPE
, NULL
);