From 251be4803be48cec0afbd755d24b0aa532c26825 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sat, 25 May 2019 21:50:48 +0200 Subject: [PATCH] Add custom GObject template --- c/.gitignore | 2 ++ c/README.MD | 3 ++ c/gobject-template/CMakeLists.txt | 17 ++++++++++ c/gobject-template/src/main.c | 20 +++++++++++ c/gobject-template/src/my_gobj.c | 55 +++++++++++++++++++++++++++++++ c/gobject-template/src/my_gobj.h | 15 +++++++++ 6 files changed, 112 insertions(+) create mode 100644 c/.gitignore create mode 100644 c/README.MD create mode 100644 c/gobject-template/CMakeLists.txt create mode 100644 c/gobject-template/src/main.c create mode 100644 c/gobject-template/src/my_gobj.c create mode 100644 c/gobject-template/src/my_gobj.h diff --git a/c/.gitignore b/c/.gitignore new file mode 100644 index 0000000..c9fbc5d --- /dev/null +++ b/c/.gitignore @@ -0,0 +1,2 @@ +*.user +build-* diff --git a/c/README.MD b/c/README.MD new file mode 100644 index 0000000..93a0f4d --- /dev/null +++ b/c/README.MD @@ -0,0 +1,3 @@ +# C Templates +## gobject_template +The basic framework of a custom GObject. Including CMakeList and everything. diff --git a/c/gobject-template/CMakeLists.txt b/c/gobject-template/CMakeLists.txt new file mode 100644 index 0000000..e8a4ec5 --- /dev/null +++ b/c/gobject-template/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 2.8) + +project(gobject-template) +#set(CMAKE_BUILD_TYPE Release) +set(CMAKE_C_FLAGS "-Wall") + +find_package(PkgConfig REQUIRED) +pkg_check_modules(GLIB2 REQUIRED glib-2.0) +pkg_check_modules(GOBJECT2 REQUIRED gobject-2.0) + +INCLUDE_DIRECTORIES (${GLIB2_INCLUDE_DIRS} ${GOBJECT2_INCLUDE_DIRS}) +LINK_DIRECTORIES (${GLIB2_LIBRARY_DIRS} ${GOBJECT2_LIBRARY_DIRS}) +add_definitions(${GLIB2_CFLAGS_OTHER} ${GOBJECT2_CFLAGS_OTHER}) + +aux_source_directory(./src SRC_LIST) +add_executable(${PROJECT_NAME} ${SRC_LIST}) +target_link_libraries(${PROJECT_NAME} ${GLIB2_LIBRARIES} ${GOBJECT2_LIBRARIES}) diff --git a/c/gobject-template/src/main.c b/c/gobject-template/src/main.c new file mode 100644 index 0000000..13c9f80 --- /dev/null +++ b/c/gobject-template/src/main.c @@ -0,0 +1,20 @@ +#include +#include "my_gobj.h" + +int main() +{ + MyGobj *obj, *obk; + + fprintf(stderr, "DECLARED.\n"); + + obj = my_gobj_new(); + obk = my_gobj_new(); + + fprintf(stderr, "CREATED.\n"); + + g_object_unref(obj); + g_object_unref(obk); + + fprintf(stderr, "DESTROYED.\n"); + return 0; +} diff --git a/c/gobject-template/src/my_gobj.c b/c/gobject-template/src/my_gobj.c new file mode 100644 index 0000000..00e0621 --- /dev/null +++ b/c/gobject-template/src/my_gobj.c @@ -0,0 +1,55 @@ +#include "my_gobj.h" + +struct _MyGobj { + GObject parent_instance; + + // Private data goes here +}; + +G_DEFINE_TYPE (MyGobj, my_gobj, G_TYPE_OBJECT) + +static void my_gobj_dispose (GObject *gobject) +{ + MyGobj *obj = my_gobj_get_instance_private(MY_GOBJ(gobject)); + + // Called multiple times after last unref + + G_OBJECT_CLASS(my_gobj_parent_class)->dispose(gobject); +} + +static void my_gobj_finalize (GObject *gobject) +{ + MyGobj *obj = my_gobj_get_instance_private(MY_GOBJ(gobject)); + + // Called once after last unref + + G_OBJECT_CLASS(my_gobj_parent_class)->finalize(gobject); +} + +static void my_gobj_constructed (GObject *gobject) +{ + // Called once per g_object_new + G_OBJECT_CLASS(my_gobj_parent_class)->constructed(gobject); +} + +static void my_gobj_class_init(MyGobjClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS(klass); + + object_class->dispose = my_gobj_dispose; + object_class->finalize = my_gobj_finalize; + object_class->constructed = my_gobj_constructed; + + // Called once upon first g_object_new of this type +} + +static void my_gobj_init(MyGobj *self) +{ + // Called once per g_object_new +} + +MyGobj *my_gobj_new(void) +{ + return g_object_new (MY_TYPE_GOBJ, + 0); +} diff --git a/c/gobject-template/src/my_gobj.h b/c/gobject-template/src/my_gobj.h new file mode 100644 index 0000000..8a58e78 --- /dev/null +++ b/c/gobject-template/src/my_gobj.h @@ -0,0 +1,15 @@ +#ifndef MY_GOBJ_H +#define MY_GOBJ_H + +#include + +G_BEGIN_DECLS + +#define MY_TYPE_GOBJ my_gobj_get_type() +G_DECLARE_FINAL_TYPE (MyGobj, my_gobj, MY, GOBJ, GObject) + +MyGobj *my_gobj_new(void); + +G_END_DECLS + +#endif // MY_GOBJ_H