Skip to content

Instantly share code, notes, and snippets.

@codebrainz
Created November 2, 2013 02:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save codebrainz/7274867 to your computer and use it in GitHub Desktop.
Save codebrainz/7274867 to your computer and use it in GitHub Desktop.
/*
* 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);
}
/*
* 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