2 * geanyobject.c - this file is part of Geany, a fast and lightweight IDE
4 * Copyright 2007-2010 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
5 * Copyright 2007-2010 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
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 /* A GObject used for connecting and emitting signals when certain events happen,
26 * e.g. opening a document.
27 * Mainly used for plugins - see the API docs.
31 * signal void save_settings(GObject *obj, GKeyFile *keyfile, gpointer user_data);
32 * Emitted just before saving main keyfile settings.
34 * signal void load_settings(GObject *obj, GKeyFile *keyfile, gpointer user_data);
35 * 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_BEFORE_SAVE
] = g_signal_new (
193 "document-before-save",
194 G_OBJECT_CLASS_TYPE (g_object_class
),
196 G_STRUCT_OFFSET (GeanyObjectClass
, document_before_save
),
198 g_cclosure_marshal_VOID__POINTER
,
201 geany_object_signals
[GCB_DOCUMENT_SAVE
] = g_signal_new (
203 G_OBJECT_CLASS_TYPE (g_object_class
),
205 G_STRUCT_OFFSET (GeanyObjectClass
, document_save
),
207 g_cclosure_marshal_VOID__POINTER
,
210 geany_object_signals
[GCB_DOCUMENT_FILETYPE_SET
] = g_signal_new (
211 "document-filetype-set",
212 G_OBJECT_CLASS_TYPE (g_object_class
),
214 G_STRUCT_OFFSET (GeanyObjectClass
, document_filetype_set
),
216 geany_cclosure_marshal_VOID__POINTER_POINTER
,
218 G_TYPE_POINTER
, G_TYPE_POINTER
);
219 geany_object_signals
[GCB_DOCUMENT_ACTIVATE
] = g_signal_new (
221 G_OBJECT_CLASS_TYPE (g_object_class
),
223 G_STRUCT_OFFSET (GeanyObjectClass
, document_activate
),
225 g_cclosure_marshal_VOID__POINTER
,
228 geany_object_signals
[GCB_DOCUMENT_CLOSE
] = g_signal_new (
230 G_OBJECT_CLASS_TYPE (g_object_class
),
232 G_STRUCT_OFFSET (GeanyObjectClass
, document_close
),
234 g_cclosure_marshal_VOID__POINTER
,
238 /* Project signals */
239 geany_object_signals
[GCB_PROJECT_OPEN
] = g_signal_new (
241 G_OBJECT_CLASS_TYPE (g_object_class
),
243 G_STRUCT_OFFSET (GeanyObjectClass
, project_open
),
245 g_cclosure_marshal_VOID__POINTER
,
248 geany_object_signals
[GCB_PROJECT_SAVE
] = g_signal_new (
250 G_OBJECT_CLASS_TYPE (g_object_class
),
252 G_STRUCT_OFFSET (GeanyObjectClass
, project_save
),
254 g_cclosure_marshal_VOID__POINTER
,
257 geany_object_signals
[GCB_PROJECT_CLOSE
] = g_signal_new (
259 G_OBJECT_CLASS_TYPE (g_object_class
),
261 G_STRUCT_OFFSET (GeanyObjectClass
, project_close
),
263 g_cclosure_marshal_VOID__VOID
,
265 geany_object_signals
[GCB_PROJECT_DIALOG_CREATE
] = g_signal_new (
266 "project-dialog-create",
267 G_OBJECT_CLASS_TYPE (g_object_class
),
269 G_STRUCT_OFFSET (GeanyObjectClass
, project_dialog_create
),
271 g_cclosure_marshal_VOID__POINTER
,
274 geany_object_signals
[GCB_PROJECT_DIALOG_CONFIRMED
] = g_signal_new (
275 "project-dialog-confirmed",
276 G_OBJECT_CLASS_TYPE (g_object_class
),
278 G_STRUCT_OFFSET (GeanyObjectClass
, project_dialog_confirmed
),
280 g_cclosure_marshal_VOID__POINTER
,
285 geany_object_signals
[GCB_UPDATE_EDITOR_MENU
] = g_signal_new (
286 "update-editor-menu",
287 G_OBJECT_CLASS_TYPE (g_object_class
),
289 G_STRUCT_OFFSET (GeanyObjectClass
, update_editor_menu
),
291 geany_cclosure_marshal_VOID__STRING_INT_POINTER
,
293 G_TYPE_STRING
, G_TYPE_INT
, G_TYPE_POINTER
);
294 geany_object_signals
[GCB_EDITOR_NOTIFY
] = g_signal_new (
296 G_OBJECT_CLASS_TYPE (g_object_class
),
298 G_STRUCT_OFFSET (GeanyObjectClass
, update_editor_menu
),
299 boolean_handled_accumulator
, NULL
,
300 geany_cclosure_marshal_BOOL__POINTER_POINTER
,
302 G_TYPE_POINTER
, G_TYPE_POINTER
);
304 /* General signals */
305 geany_object_signals
[GCB_GEANY_STARTUP_COMPLETE
] = g_signal_new (
306 "geany-startup-complete",
307 G_OBJECT_CLASS_TYPE (g_object_class
),
309 G_STRUCT_OFFSET (GeanyObjectClass
, geany_startup_complete
),
311 g_cclosure_marshal_VOID__VOID
,
313 geany_object_signals
[GCB_BUILD_START
] = g_signal_new (
315 G_OBJECT_CLASS_TYPE (g_object_class
),
317 G_STRUCT_OFFSET (GeanyObjectClass
, build_start
),
319 g_cclosure_marshal_VOID__VOID
,
322 /* Core-only signals */
323 geany_object_signals
[GCB_SAVE_SETTINGS
] = g_signal_new (
325 G_OBJECT_CLASS_TYPE (g_object_class
),
327 G_STRUCT_OFFSET (GeanyObjectClass
, save_settings
),
329 g_cclosure_marshal_VOID__POINTER
,
332 geany_object_signals
[GCB_LOAD_SETTINGS
] = g_signal_new (
334 G_OBJECT_CLASS_TYPE (g_object_class
),
336 G_STRUCT_OFFSET (GeanyObjectClass
, load_settings
),
338 g_cclosure_marshal_VOID__POINTER
,
344 static void geany_object_class_init(GeanyObjectClass
*klass
)
346 GObjectClass
*g_object_class
;
347 g_object_class
= G_OBJECT_CLASS(klass
);
349 g_type_class_add_private(klass
, sizeof(GeanyObjectPrivate
));
351 create_signals(g_object_class
);
355 static void geany_object_init(GeanyObject
*self
)
361 GObject
*geany_object_new(void)
363 return g_object_new(GEANY_OBJECT_TYPE
, NULL
);