Merge pull request #3823 from ntrel/msg-tree-search
[geany-mirror.git] / src / geanyobject.c
blob0b3d9969035e085f953ef9f7c013ab74b194f0ff
1 /*
2 * geanyobject.c - this file is part of Geany, a fast and lightweight IDE
4 * Copyright 2007 The Geany contributors
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 /* A GObject used for connecting and emitting signals when certain events happen,
22 * e.g. opening a document.
23 * Mainly used for plugins - see the API docs.
25 * Core-only signals:
27 * signal void save_settings(GObject *obj, GKeyFile *keyfile, gpointer user_data);
28 * Emitted just before saving main keyfile settings.
30 * signal void load_settings(GObject *obj, GKeyFile *keyfile, gpointer user_data);
31 * Emitted just after loading main keyfile settings.
34 #ifdef HAVE_CONFIG_H
35 # include "config.h"
36 #endif
38 #include "geanyobject.h"
40 /* extern in geany.h */
41 GObject *geany_object;
43 static guint geany_object_signals[GCB_MAX] = { 0 };
46 typedef struct _GeanyObjectPrivate GeanyObjectPrivate;
48 struct _GeanyObjectPrivate
50 /* to avoid warnings (g_type_class_add_private: assertion `private_size > 0' failed) */
51 gchar dummy;
54 /** @gironly
55 * Get the GObject-derived GType for GeanyObject
57 * @return GeanyObject type */
58 GEANY_API_SYMBOL
59 GType geany_object_get_type(void);
61 G_DEFINE_TYPE(GeanyObject, geany_object, G_TYPE_OBJECT)
64 static gboolean boolean_handled_accumulator(GSignalInvocationHint *ihint, GValue *return_accu,
65 const GValue *handler_return, gpointer dummy)
67 gboolean continue_emission, signal_handled;
69 signal_handled = g_value_get_boolean(handler_return);
70 g_value_set_boolean(return_accu, signal_handled);
71 continue_emission = !signal_handled;
73 return continue_emission;
77 static void create_signals(GObjectClass *g_object_class)
79 /* Document signals */
80 geany_object_signals[GCB_DOCUMENT_NEW] = g_signal_new (
81 "document-new",
82 G_OBJECT_CLASS_TYPE (g_object_class),
83 G_SIGNAL_RUN_FIRST,
84 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
85 G_TYPE_NONE, 1,
86 GEANY_TYPE_DOCUMENT);
87 geany_object_signals[GCB_DOCUMENT_OPEN] = g_signal_new (
88 "document-open",
89 G_OBJECT_CLASS_TYPE (g_object_class),
90 G_SIGNAL_RUN_FIRST,
91 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
92 G_TYPE_NONE, 1,
93 GEANY_TYPE_DOCUMENT);
94 geany_object_signals[GCB_DOCUMENT_RELOAD] = g_signal_new (
95 "document-reload",
96 G_OBJECT_CLASS_TYPE (g_object_class),
97 G_SIGNAL_RUN_FIRST,
98 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
99 G_TYPE_NONE, 1,
100 GEANY_TYPE_DOCUMENT);
101 geany_object_signals[GCB_DOCUMENT_BEFORE_SAVE] = g_signal_new (
102 "document-before-save",
103 G_OBJECT_CLASS_TYPE (g_object_class),
104 G_SIGNAL_RUN_FIRST,
105 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
106 G_TYPE_NONE, 1,
107 GEANY_TYPE_DOCUMENT);
108 geany_object_signals[GCB_DOCUMENT_BEFORE_SAVE_AS] = g_signal_new (
109 "document-before-save-as",
110 G_OBJECT_CLASS_TYPE (g_object_class),
111 G_SIGNAL_RUN_FIRST,
112 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
113 G_TYPE_NONE, 1,
114 GEANY_TYPE_DOCUMENT);
115 geany_object_signals[GCB_DOCUMENT_SAVE] = g_signal_new (
116 "document-save",
117 G_OBJECT_CLASS_TYPE (g_object_class),
118 G_SIGNAL_RUN_FIRST,
119 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
120 G_TYPE_NONE, 1,
121 GEANY_TYPE_DOCUMENT);
122 geany_object_signals[GCB_DOCUMENT_FILETYPE_SET] = g_signal_new (
123 "document-filetype-set",
124 G_OBJECT_CLASS_TYPE (g_object_class),
125 G_SIGNAL_RUN_FIRST,
126 0, NULL, NULL, NULL,
127 G_TYPE_NONE, 2,
128 GEANY_TYPE_DOCUMENT, GEANY_TYPE_FILETYPE);
129 geany_object_signals[GCB_DOCUMENT_ACTIVATE] = g_signal_new (
130 "document-activate",
131 G_OBJECT_CLASS_TYPE (g_object_class),
132 G_SIGNAL_RUN_FIRST,
133 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
134 G_TYPE_NONE, 1,
135 GEANY_TYPE_DOCUMENT);
136 geany_object_signals[GCB_DOCUMENT_CLOSE] = g_signal_new (
137 "document-close",
138 G_OBJECT_CLASS_TYPE (g_object_class),
139 G_SIGNAL_RUN_FIRST,
140 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
141 G_TYPE_NONE, 1,
142 GEANY_TYPE_DOCUMENT);
144 /* Project signals */
145 geany_object_signals[GCB_PROJECT_OPEN] = g_signal_new (
146 "project-open",
147 G_OBJECT_CLASS_TYPE (g_object_class),
148 G_SIGNAL_RUN_FIRST,
149 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
150 G_TYPE_NONE, 1,
151 G_TYPE_KEY_FILE);
152 geany_object_signals[GCB_PROJECT_SAVE] = g_signal_new (
153 "project-save",
154 G_OBJECT_CLASS_TYPE (g_object_class),
155 G_SIGNAL_RUN_FIRST,
156 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
157 G_TYPE_NONE, 1,
158 G_TYPE_KEY_FILE);
159 geany_object_signals[GCB_PROJECT_CLOSE] = g_signal_new (
160 "project-close",
161 G_OBJECT_CLASS_TYPE (g_object_class),
162 G_SIGNAL_RUN_FIRST,
163 0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
164 G_TYPE_NONE, 0);
165 geany_object_signals[GCB_PROJECT_BEFORE_CLOSE] = g_signal_new (
166 "project-before-close",
167 G_OBJECT_CLASS_TYPE (g_object_class),
168 G_SIGNAL_RUN_FIRST,
169 0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
170 G_TYPE_NONE, 0);
171 geany_object_signals[GCB_PROJECT_DIALOG_OPEN] = g_signal_new (
172 "project-dialog-open",
173 G_OBJECT_CLASS_TYPE (g_object_class),
174 G_SIGNAL_RUN_FIRST,
175 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT,
176 G_TYPE_NONE, 1,
177 GTK_TYPE_NOTEBOOK);
178 geany_object_signals[GCB_PROJECT_DIALOG_CONFIRMED] = g_signal_new (
179 "project-dialog-confirmed",
180 G_OBJECT_CLASS_TYPE (g_object_class),
181 G_SIGNAL_RUN_FIRST,
182 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT,
183 G_TYPE_NONE, 1,
184 GTK_TYPE_NOTEBOOK);
185 geany_object_signals[GCB_PROJECT_DIALOG_CLOSE] = g_signal_new (
186 "project-dialog-close",
187 G_OBJECT_CLASS_TYPE (g_object_class),
188 G_SIGNAL_RUN_FIRST,
189 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT,
190 G_TYPE_NONE, 1,
191 GTK_TYPE_NOTEBOOK);
193 /* Editor signals */
194 geany_object_signals[GCB_UPDATE_EDITOR_MENU] = g_signal_new (
195 "update-editor-menu",
196 G_OBJECT_CLASS_TYPE (g_object_class),
197 G_SIGNAL_RUN_FIRST,
198 0, NULL, NULL, NULL,
199 G_TYPE_NONE, 3,
200 G_TYPE_STRING, G_TYPE_INT, GEANY_TYPE_DOCUMENT);
201 geany_object_signals[GCB_EDITOR_NOTIFY] = g_signal_new (
202 "editor-notify",
203 G_OBJECT_CLASS_TYPE (g_object_class),
204 G_SIGNAL_RUN_LAST,
205 0, boolean_handled_accumulator, NULL, NULL,
206 G_TYPE_BOOLEAN, 2,
207 GEANY_TYPE_EDITOR, SCINTILLA_TYPE_NOTIFICATION);
209 /* General signals */
210 geany_object_signals[GCB_GEANY_STARTUP_COMPLETE] = g_signal_new (
211 "geany-startup-complete",
212 G_OBJECT_CLASS_TYPE (g_object_class),
213 G_SIGNAL_RUN_FIRST,
214 0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
215 G_TYPE_NONE, 0);
216 geany_object_signals[GCB_BUILD_START] = g_signal_new (
217 "build-start",
218 G_OBJECT_CLASS_TYPE (g_object_class),
219 G_SIGNAL_RUN_FIRST,
220 0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
221 G_TYPE_NONE, 0);
223 /* Core-only signals */
224 geany_object_signals[GCB_SAVE_SETTINGS] = g_signal_new (
225 "save-settings",
226 G_OBJECT_CLASS_TYPE (g_object_class),
227 G_SIGNAL_RUN_FIRST,
228 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
229 G_TYPE_NONE, 1,
230 G_TYPE_KEY_FILE);
231 geany_object_signals[GCB_LOAD_SETTINGS] = g_signal_new (
232 "load-settings",
233 G_OBJECT_CLASS_TYPE (g_object_class),
234 G_SIGNAL_RUN_FIRST,
235 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED,
236 G_TYPE_NONE, 1,
237 G_TYPE_KEY_FILE);
239 /* Key press signal */
240 geany_object_signals[GCB_KEY_PRESS_NOTIFY] = g_signal_new (
241 "key-press",
242 G_OBJECT_CLASS_TYPE (g_object_class),
243 G_SIGNAL_RUN_LAST,
244 0, boolean_handled_accumulator, NULL, NULL,
245 G_TYPE_BOOLEAN, 1,
246 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
250 static void geany_object_class_init(GeanyObjectClass *klass)
252 GObjectClass *g_object_class;
253 g_object_class = G_OBJECT_CLASS(klass);
255 g_type_class_add_private(klass, sizeof(GeanyObjectPrivate));
257 create_signals(g_object_class);
261 static void geany_object_init(GeanyObject *self)
263 /* nothing to do */
267 GObject *geany_object_new(void)
269 return g_object_new(GEANY_OBJECT_TYPE, NULL);