If the current word's tag is on the current line, make Go to Tag
[geany-mirror.git] / src / geanyobject.c
blob89f09c2b89db750dfcf1b01b8044ab5099fa86e8
1 /*
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,
20 * MA 02110-1301, USA.
22 * $Id$
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.
29 * Core-only signals:
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.
38 #include "geany.h"
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) */
52 gchar dummy;
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);
77 else
79 data1 = g_value_peek_pointer(param_values + 0);
80 data2 = closure->data;
82 callback = (GeanyMarshalFunc_VOID__STRING_INT_POINTER) (mdata ? mdata : cc->callback);
83 callback(data1,
84 g_value_get_string(param_values + 1),
85 g_value_get_int(param_values + 2),
86 g_value_get_pointer(param_values + 3),
87 data2);
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);
108 else
110 data1 = g_value_peek_pointer(param_values + 0);
111 data2 = closure->data;
113 callback = (GeanyMarshalFunc_VOID__POINTER_POINTER) (mdata ? mdata : cc->callback);
114 callback(data1,
115 g_value_get_pointer(param_values + 1),
116 g_value_get_pointer(param_values + 2),
117 data2);
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;
144 gboolean v_return;
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);
154 else
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),
165 data2);
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 (
175 "document-new",
176 G_OBJECT_CLASS_TYPE (g_object_class),
177 G_SIGNAL_RUN_FIRST,
178 G_STRUCT_OFFSET (GeanyObjectClass, document_new),
179 NULL, NULL,
180 g_cclosure_marshal_VOID__POINTER,
181 G_TYPE_NONE, 1,
182 G_TYPE_POINTER);
183 geany_object_signals[GCB_DOCUMENT_OPEN] = g_signal_new (
184 "document-open",
185 G_OBJECT_CLASS_TYPE (g_object_class),
186 G_SIGNAL_RUN_FIRST,
187 G_STRUCT_OFFSET (GeanyObjectClass, document_open),
188 NULL, NULL,
189 g_cclosure_marshal_VOID__POINTER,
190 G_TYPE_NONE, 1,
191 G_TYPE_POINTER);
192 geany_object_signals[GCB_DOCUMENT_BEFORE_SAVE] = g_signal_new (
193 "document-before-save",
194 G_OBJECT_CLASS_TYPE (g_object_class),
195 G_SIGNAL_RUN_FIRST,
196 G_STRUCT_OFFSET (GeanyObjectClass, document_before_save),
197 NULL, NULL,
198 g_cclosure_marshal_VOID__POINTER,
199 G_TYPE_NONE, 1,
200 G_TYPE_POINTER);
201 geany_object_signals[GCB_DOCUMENT_SAVE] = g_signal_new (
202 "document-save",
203 G_OBJECT_CLASS_TYPE (g_object_class),
204 G_SIGNAL_RUN_FIRST,
205 G_STRUCT_OFFSET (GeanyObjectClass, document_save),
206 NULL, NULL,
207 g_cclosure_marshal_VOID__POINTER,
208 G_TYPE_NONE, 1,
209 G_TYPE_POINTER);
210 geany_object_signals[GCB_DOCUMENT_FILETYPE_SET] = g_signal_new (
211 "document-filetype-set",
212 G_OBJECT_CLASS_TYPE (g_object_class),
213 G_SIGNAL_RUN_FIRST,
214 G_STRUCT_OFFSET (GeanyObjectClass, document_filetype_set),
215 NULL, NULL,
216 geany_cclosure_marshal_VOID__POINTER_POINTER,
217 G_TYPE_NONE, 2,
218 G_TYPE_POINTER, G_TYPE_POINTER);
219 geany_object_signals[GCB_DOCUMENT_ACTIVATE] = g_signal_new (
220 "document-activate",
221 G_OBJECT_CLASS_TYPE (g_object_class),
222 G_SIGNAL_RUN_FIRST,
223 G_STRUCT_OFFSET (GeanyObjectClass, document_activate),
224 NULL, NULL,
225 g_cclosure_marshal_VOID__POINTER,
226 G_TYPE_NONE, 1,
227 G_TYPE_POINTER);
228 geany_object_signals[GCB_DOCUMENT_CLOSE] = g_signal_new (
229 "document-close",
230 G_OBJECT_CLASS_TYPE (g_object_class),
231 G_SIGNAL_RUN_FIRST,
232 G_STRUCT_OFFSET (GeanyObjectClass, document_close),
233 NULL, NULL,
234 g_cclosure_marshal_VOID__POINTER,
235 G_TYPE_NONE, 1,
236 G_TYPE_POINTER);
238 /* Project signals */
239 geany_object_signals[GCB_PROJECT_OPEN] = g_signal_new (
240 "project-open",
241 G_OBJECT_CLASS_TYPE (g_object_class),
242 G_SIGNAL_RUN_FIRST,
243 G_STRUCT_OFFSET (GeanyObjectClass, project_open),
244 NULL, NULL,
245 g_cclosure_marshal_VOID__POINTER,
246 G_TYPE_NONE, 1,
247 G_TYPE_POINTER);
248 geany_object_signals[GCB_PROJECT_SAVE] = g_signal_new (
249 "project-save",
250 G_OBJECT_CLASS_TYPE (g_object_class),
251 G_SIGNAL_RUN_FIRST,
252 G_STRUCT_OFFSET (GeanyObjectClass, project_save),
253 NULL, NULL,
254 g_cclosure_marshal_VOID__POINTER,
255 G_TYPE_NONE, 1,
256 G_TYPE_POINTER);
257 geany_object_signals[GCB_PROJECT_CLOSE] = g_signal_new (
258 "project-close",
259 G_OBJECT_CLASS_TYPE (g_object_class),
260 G_SIGNAL_RUN_FIRST,
261 G_STRUCT_OFFSET (GeanyObjectClass, project_close),
262 NULL, NULL,
263 g_cclosure_marshal_VOID__VOID,
264 G_TYPE_NONE, 0);
265 geany_object_signals[GCB_PROJECT_DIALOG_CREATE] = g_signal_new (
266 "project-dialog-create",
267 G_OBJECT_CLASS_TYPE (g_object_class),
268 G_SIGNAL_RUN_FIRST,
269 G_STRUCT_OFFSET (GeanyObjectClass, project_dialog_create),
270 NULL, NULL,
271 g_cclosure_marshal_VOID__POINTER,
272 G_TYPE_NONE, 1,
273 G_TYPE_POINTER);
274 geany_object_signals[GCB_PROJECT_DIALOG_CONFIRMED] = g_signal_new (
275 "project-dialog-confirmed",
276 G_OBJECT_CLASS_TYPE (g_object_class),
277 G_SIGNAL_RUN_FIRST,
278 G_STRUCT_OFFSET (GeanyObjectClass, project_dialog_confirmed),
279 NULL, NULL,
280 g_cclosure_marshal_VOID__POINTER,
281 G_TYPE_NONE, 1,
282 G_TYPE_POINTER);
284 /* Editor signals */
285 geany_object_signals[GCB_UPDATE_EDITOR_MENU] = g_signal_new (
286 "update-editor-menu",
287 G_OBJECT_CLASS_TYPE (g_object_class),
288 G_SIGNAL_RUN_FIRST,
289 G_STRUCT_OFFSET (GeanyObjectClass, update_editor_menu),
290 NULL, NULL,
291 geany_cclosure_marshal_VOID__STRING_INT_POINTER,
292 G_TYPE_NONE, 3,
293 G_TYPE_STRING, G_TYPE_INT, G_TYPE_POINTER);
294 geany_object_signals[GCB_EDITOR_NOTIFY] = g_signal_new (
295 "editor-notify",
296 G_OBJECT_CLASS_TYPE (g_object_class),
297 G_SIGNAL_RUN_LAST,
298 G_STRUCT_OFFSET (GeanyObjectClass, update_editor_menu),
299 boolean_handled_accumulator, NULL,
300 geany_cclosure_marshal_BOOL__POINTER_POINTER,
301 G_TYPE_BOOLEAN, 2,
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),
308 G_SIGNAL_RUN_FIRST,
309 G_STRUCT_OFFSET (GeanyObjectClass, geany_startup_complete),
310 NULL, NULL,
311 g_cclosure_marshal_VOID__VOID,
312 G_TYPE_NONE, 0);
313 geany_object_signals[GCB_BUILD_START] = g_signal_new (
314 "build-start",
315 G_OBJECT_CLASS_TYPE (g_object_class),
316 G_SIGNAL_RUN_FIRST,
317 G_STRUCT_OFFSET (GeanyObjectClass, build_start),
318 NULL, NULL,
319 g_cclosure_marshal_VOID__VOID,
320 G_TYPE_NONE, 0);
322 /* Core-only signals */
323 geany_object_signals[GCB_SAVE_SETTINGS] = g_signal_new (
324 "save-settings",
325 G_OBJECT_CLASS_TYPE (g_object_class),
326 G_SIGNAL_RUN_FIRST,
327 G_STRUCT_OFFSET (GeanyObjectClass, save_settings),
328 NULL, NULL,
329 g_cclosure_marshal_VOID__POINTER,
330 G_TYPE_NONE, 1,
331 G_TYPE_POINTER);
332 geany_object_signals[GCB_LOAD_SETTINGS] = g_signal_new (
333 "load-settings",
334 G_OBJECT_CLASS_TYPE (g_object_class),
335 G_SIGNAL_RUN_FIRST,
336 G_STRUCT_OFFSET (GeanyObjectClass, load_settings),
337 NULL, NULL,
338 g_cclosure_marshal_VOID__POINTER,
339 G_TYPE_NONE, 1,
340 G_TYPE_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)
357 /* nothing to do */
361 GObject *geany_object_new(void)
363 return g_object_new(GEANY_OBJECT_TYPE, NULL);