Created
November 2, 2013 02:41
-
-
Save codebrainz/7274867 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* geanyobject.c - this file is part of Geany, a fast and lightweight IDE | |
* | |
* Copyright 2007-2012 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> | |
* Copyright 2007-2012 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> | |
* | |
* This program is free software; you can redistribute it and/or modify | |
* it under the terms of the GNU General Public License as published by | |
* the Free Software Foundation; either version 2 of the License, or | |
* (at your option) any later version. | |
* | |
* This program is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
* GNU General Public License for more details. | |
* | |
* You should have received a copy of the GNU General Public License along | |
* with this program; if not, write to the Free Software Foundation, Inc., | |
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
*/ | |
/* A GObject used for connecting and emitting signals when certain events happen, | |
* e.g. opening a document. | |
* Mainly used for plugins - see the API docs. | |
* | |
* Core-only signals: | |
* | |
* signal void save_settings(GObject *obj, GKeyFile *keyfile, gpointer user_data); | |
* Emitted just before saving main keyfile settings. | |
* signal void load_settings(GObject *obj, GKeyFile *keyfile, gpointer user_data); | |
* Emitted just after loading main keyfile settings. | |
*/ | |
#include "geany.h" | |
#include "geanyobject.h" | |
/* extern in geany.h */ | |
GObject *geany_object; | |
static guint geany_object_signals[GCB_MAX] = { 0 }; | |
typedef struct _GeanyObjectPrivate GeanyObjectPrivate; | |
struct _GeanyObjectPrivate | |
{ | |
/* to avoid warnings (g_type_class_add_private: assertion `private_size > 0' failed) */ | |
gchar dummy; | |
}; | |
G_DEFINE_TYPE(GeanyObject, geany_object, G_TYPE_OBJECT) | |
static void geany_cclosure_marshal_VOID__STRING_INT_POINTER(GClosure *closure, GValue *ret_val, | |
guint n_param_vals, const GValue *param_values, gpointer hint, gpointer mdata) | |
{ | |
typedef gboolean (*GeanyMarshalFunc_VOID__STRING_INT_POINTER) | |
(gpointer data1, gconstpointer arg_1, gint arg_2, gpointer arg_3, gpointer data2); | |
register GeanyMarshalFunc_VOID__STRING_INT_POINTER callback; | |
register GCClosure* cc = (GCClosure*) closure; | |
register gpointer data1, data2; | |
g_return_if_fail(n_param_vals == 4); | |
if (G_CCLOSURE_SWAP_DATA(closure)) | |
{ | |
data1 = closure->data; | |
data2 = g_value_peek_pointer(param_values + 0); | |
} | |
else | |
{ | |
data1 = g_value_peek_pointer(param_values + 0); | |
data2 = closure->data; | |
} | |
callback = (GeanyMarshalFunc_VOID__STRING_INT_POINTER) (mdata ? mdata : cc->callback); | |
callback(data1, | |
g_value_get_string(param_values + 1), | |
g_value_get_int(param_values + 2), | |
g_value_get_pointer(param_values + 3), | |
data2); | |
} | |
static void geany_cclosure_marshal_VOID__POINTER_POINTER(GClosure *closure, GValue *ret_val, | |
guint n_param_vals, const GValue *param_values, gpointer hint, gpointer mdata) | |
{ | |
typedef gboolean (*GeanyMarshalFunc_VOID__POINTER_POINTER) | |
(gpointer data1, gconstpointer arg_1, gconstpointer arg_2, gpointer data2); | |
register GeanyMarshalFunc_VOID__POINTER_POINTER callback; | |
register GCClosure* cc = (GCClosure*) closure; | |
register gpointer data1, data2; | |
g_return_if_fail(n_param_vals == 3); | |
if (G_CCLOSURE_SWAP_DATA(closure)) | |
{ | |
data1 = closure->data; | |
data2 = g_value_peek_pointer(param_values + 0); | |
} | |
else | |
{ | |
data1 = g_value_peek_pointer(param_values + 0); | |
data2 = closure->data; | |
} | |
callback = (GeanyMarshalFunc_VOID__POINTER_POINTER) (mdata ? mdata : cc->callback); | |
callback(data1, | |
g_value_get_pointer(param_values + 1), | |
g_value_get_pointer(param_values + 2), | |
data2); | |
} | |
static gboolean boolean_handled_accumulator(GSignalInvocationHint *ihint, GValue *return_accu, | |
const GValue *handler_return, gpointer dummy) | |
{ | |
gboolean continue_emission, signal_handled; | |
signal_handled = g_value_get_boolean(handler_return); | |
g_value_set_boolean(return_accu, signal_handled); | |
continue_emission = !signal_handled; | |
return continue_emission; | |
} | |
static void geany_cclosure_marshal_BOOL__POINTER_POINTER(GClosure *closure, GValue *return_value, | |
guint n_param_values, const GValue *param_values, | |
gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) | |
{ | |
typedef gboolean (*GeanyMarshalFunc_BOOLEAN__POINTER_POINTER) | |
(gpointer data1, gpointer arg_1, gpointer arg_2, gpointer data2); | |
register GeanyMarshalFunc_BOOLEAN__POINTER_POINTER callback; | |
register GCClosure *cc = (GCClosure*) closure; | |
register gpointer data1, data2; | |
gboolean v_return; | |
g_return_if_fail(return_value != NULL); | |
g_return_if_fail(n_param_values == 3); | |
if (G_CCLOSURE_SWAP_DATA(closure)) | |
{ | |
data1 = closure->data; | |
data2 = g_value_peek_pointer(param_values + 0); | |
} | |
else | |
{ | |
data1 = g_value_peek_pointer(param_values + 0); | |
data2 = closure->data; | |
} | |
callback = (GeanyMarshalFunc_BOOLEAN__POINTER_POINTER) | |
(marshal_data ? marshal_data : cc->callback); | |
v_return = callback(data1, | |
g_value_get_pointer(param_values + 1), | |
g_value_get_pointer(param_values + 2), | |
data2); | |
g_value_set_boolean(return_value, v_return); | |
} | |
static void create_signals(GObjectClass *g_object_class) | |
{ | |
/* Document signals */ | |
geany_object_signals[GCB_DOCUMENT_NEW] = g_signal_new ( | |
"document-new", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, document_new), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
geany_object_signals[GCB_DOCUMENT_OPEN] = g_signal_new ( | |
"document-open", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, document_open), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
geany_object_signals[GCB_DOCUMENT_RELOAD] = g_signal_new ( | |
"document-reload", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, document_reload), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
geany_object_signals[GCB_DOCUMENT_BEFORE_SAVE] = g_signal_new ( | |
"document-before-save", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, document_before_save), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
geany_object_signals[GCB_DOCUMENT_SAVE] = g_signal_new ( | |
"document-save", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, document_save), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
geany_object_signals[GCB_DOCUMENT_FILETYPE_SET] = g_signal_new ( | |
"document-filetype-set", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, document_filetype_set), | |
NULL, NULL, | |
geany_cclosure_marshal_VOID__POINTER_POINTER, | |
G_TYPE_NONE, 2, | |
G_TYPE_POINTER, G_TYPE_POINTER); | |
geany_object_signals[GCB_DOCUMENT_ACTIVATE] = g_signal_new ( | |
"document-activate", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, document_activate), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
geany_object_signals[GCB_DOCUMENT_CLOSE] = g_signal_new ( | |
"document-close", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, document_close), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
/* Project signals */ | |
geany_object_signals[GCB_PROJECT_OPEN] = g_signal_new ( | |
"project-open", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, project_open), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
geany_object_signals[GCB_PROJECT_SAVE] = g_signal_new ( | |
"project-save", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, project_save), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
geany_object_signals[GCB_PROJECT_CLOSE] = g_signal_new ( | |
"project-close", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, project_close), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__VOID, | |
G_TYPE_NONE, 0); | |
geany_object_signals[GCB_PROJECT_DIALOG_OPEN] = g_signal_new ( | |
"project-dialog-open", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, project_dialog_open), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
geany_object_signals[GCB_PROJECT_DIALOG_CONFIRMED] = g_signal_new ( | |
"project-dialog-confirmed", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, project_dialog_confirmed), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
geany_object_signals[GCB_PROJECT_DIALOG_CLOSE] = g_signal_new ( | |
"project-dialog-close", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, project_dialog_close), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
/* Editor signals */ | |
geany_object_signals[GCB_UPDATE_EDITOR_MENU] = g_signal_new ( | |
"update-editor-menu", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, update_editor_menu), | |
NULL, NULL, | |
geany_cclosure_marshal_VOID__STRING_INT_POINTER, | |
G_TYPE_NONE, 3, | |
G_TYPE_STRING, G_TYPE_INT, G_TYPE_POINTER); | |
geany_object_signals[GCB_EDITOR_NOTIFY] = g_signal_new ( | |
"editor-notify", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_LAST, | |
G_STRUCT_OFFSET (GeanyObjectClass, update_editor_menu), | |
boolean_handled_accumulator, NULL, | |
geany_cclosure_marshal_BOOL__POINTER_POINTER, | |
G_TYPE_BOOLEAN, 2, | |
G_TYPE_POINTER, G_TYPE_POINTER); | |
/* General signals */ | |
geany_object_signals[GCB_GEANY_STARTUP_COMPLETE] = g_signal_new ( | |
"geany-startup-complete", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, geany_startup_complete), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__VOID, | |
G_TYPE_NONE, 0); | |
geany_object_signals[GCB_BUILD_START] = g_signal_new ( | |
"build-start", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, build_start), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__VOID, | |
G_TYPE_NONE, 0); | |
/* Core-only signals */ | |
geany_object_signals[GCB_SAVE_SETTINGS] = g_signal_new ( | |
"save-settings", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, save_settings), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
geany_object_signals[GCB_LOAD_SETTINGS] = g_signal_new ( | |
"load-settings", | |
G_OBJECT_CLASS_TYPE (g_object_class), | |
G_SIGNAL_RUN_FIRST, | |
G_STRUCT_OFFSET (GeanyObjectClass, load_settings), | |
NULL, NULL, | |
g_cclosure_marshal_VOID__POINTER, | |
G_TYPE_NONE, 1, | |
G_TYPE_POINTER); | |
} | |
static void geany_object_class_init(GeanyObjectClass *klass) | |
{ | |
GObjectClass *g_object_class; | |
g_object_class = G_OBJECT_CLASS(klass); | |
g_type_class_add_private(klass, sizeof(GeanyObjectPrivate)); | |
create_signals(g_object_class); | |
} | |
static void geany_object_init(GeanyObject *self) | |
{ | |
/* nothing to do */ | |
} | |
GObject *geany_object_new(void) | |
{ | |
return g_object_new(GEANY_OBJECT_TYPE, NULL); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* geanyobject.h - this file is part of Geany, a fast and lightweight IDE | |
* | |
* Copyright 2007-2012 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> | |
* Copyright 2007-2012 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> | |
* | |
* This program is free software; you can redistribute it and/or modify | |
* it under the terms of the GNU General Public License as published by | |
* the Free Software Foundation; either version 2 of the License, or | |
* (at your option) any later version. | |
* | |
* This program is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
* GNU General Public License for more details. | |
* | |
* You should have received a copy of the GNU General Public License along | |
* with this program; if not, write to the Free Software Foundation, Inc., | |
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
*/ | |
#ifndef GEANYOBJECT_H | |
#define GEANYOBJECT_H | |
#include <glib-object.h> | |
G_BEGIN_DECLS | |
typedef enum | |
{ | |
GCB_DOCUMENT_NEW, | |
GCB_DOCUMENT_OPEN, | |
GCB_DOCUMENT_RELOAD, | |
GCB_DOCUMENT_BEFORE_SAVE, | |
GCB_DOCUMENT_SAVE, | |
GCB_DOCUMENT_FILETYPE_SET, | |
GCB_DOCUMENT_ACTIVATE, | |
GCB_DOCUMENT_CLOSE, | |
GCB_PROJECT_OPEN, | |
GCB_PROJECT_SAVE, | |
GCB_PROJECT_CLOSE, | |
GCB_PROJECT_DIALOG_OPEN, | |
GCB_PROJECT_DIALOG_CONFIRMED, | |
GCB_PROJECT_DIALOG_CLOSE, | |
GCB_UPDATE_EDITOR_MENU, | |
GCB_EDITOR_NOTIFY, | |
GCB_GEANY_STARTUP_COMPLETE, | |
GCB_BUILD_START, | |
GCB_SAVE_SETTINGS, | |
GCB_LOAD_SETTINGS, | |
GCB_MAX | |
} | |
GeanyCallbackId; | |
#define GEANY_OBJECT_TYPE (geany_object_get_type()) | |
#define GEANY_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ | |
GEANY_OBJECT_TYPE, GeanyObject)) | |
#define GEANY_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ | |
GEANY_OBJECT_TYPE, GeanyObjectClass)) | |
#define IS_GEANY_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ | |
GEANY_OBJECT_TYPE)) | |
#define IS_GEANY_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ | |
GEANY_OBJECT_TYPE)) | |
typedef struct _GeanyObject GeanyObject; | |
typedef struct _GeanyObjectClass GeanyObjectClass; | |
struct _GeanyObject | |
{ | |
GObject parent; | |
/* add your public declarations here */ | |
}; | |
struct SCNotification; | |
struct _GeanyObjectClass | |
{ | |
GObjectClass parent_class; | |
void (*document_new)(GeanyDocument *doc); | |
void (*document_open)(GeanyDocument *doc); | |
void (*document_reload)(GeanyDocument *doc); | |
void (*document_before_save)(GeanyDocument *doc); | |
void (*document_save)(GeanyDocument *doc); | |
void (*document_filetype_set)(GeanyDocument *doc, GeanyFiletype *filetype_old); | |
void (*document_activate)(GeanyDocument *doc); | |
void (*document_close)(GeanyDocument *doc); | |
void (*project_open)(GKeyFile *keyfile); | |
void (*project_save)(GKeyFile *keyfile); | |
void (*project_close)(void); | |
void (*project_dialog_open)(GtkWidget *notebook); | |
void (*project_dialog_confirmed)(GtkWidget *notebook); | |
void (*project_dialog_close)(GtkWidget *notebook); | |
void (*update_editor_menu)(const gchar *word, gint click_pos, GeanyDocument *doc); | |
gboolean (*editor_notify)(GeanyEditor *editor, gpointer scnt); | |
void (*geany_startup_complete)(void); | |
void (*build_start)(void); | |
void (*save_settings)(GKeyFile *keyfile); | |
void (*load_settings)(GKeyFile *keyfile); | |
}; | |
GType geany_object_get_type (void); | |
GObject* geany_object_new (void); | |
G_END_DECLS | |
#endif /* GEANYOBJECT_H */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment