From 59af4da4309e108d9579649a01ce259ab8724c7e Mon Sep 17 00:00:00 2001 From: Makise Kurisu Date: Sat, 4 Jun 2016 13:15:38 +0200 Subject: [PATCH] Imported g_object experiments for lib --- .gitignore | 1 + CMakeLists.txt | 18 ++- konaclient-gtk/CMakeLists.txt | 14 +++ .../glade}/mainWindow.glade | 0 .../glade}/previewWidget.glade | 0 .../glade}/tagItemViewport.glade | 0 kona_search.c => konaclient-gtk/kona_search.c | 0 kona_search.h => konaclient-gtk/kona_search.h | 0 konaclient-gtk/konaclient-gtk | Bin 0 -> 15912 bytes main.c => konaclient-gtk/main.c | 0 .../previewwidget.c | 0 .../previewwidget.h | 0 libkonaclient/CMakeLists.txt | 4 + libkonaclient/konaimage.c | 111 ++++++++++++++++++ libkonaclient/konaimage.h | 19 +++ libkonaclient/libkonalib.so | Bin 0 -> 11296 bytes 16 files changed, 157 insertions(+), 10 deletions(-) create mode 100644 konaclient-gtk/CMakeLists.txt rename {glade => konaclient-gtk/glade}/mainWindow.glade (100%) rename {glade => konaclient-gtk/glade}/previewWidget.glade (100%) rename {glade => konaclient-gtk/glade}/tagItemViewport.glade (100%) rename kona_search.c => konaclient-gtk/kona_search.c (100%) rename kona_search.h => konaclient-gtk/kona_search.h (100%) create mode 100755 konaclient-gtk/konaclient-gtk rename main.c => konaclient-gtk/main.c (100%) rename previewwidget.c => konaclient-gtk/previewwidget.c (100%) rename previewwidget.h => konaclient-gtk/previewwidget.h (100%) create mode 100644 libkonaclient/CMakeLists.txt create mode 100644 libkonaclient/konaimage.c create mode 100644 libkonaclient/konaimage.h create mode 100755 libkonaclient/libkonalib.so diff --git a/.gitignore b/.gitignore index 86a9ce7..408e9a2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.user *~ +Makefile diff --git a/CMakeLists.txt b/CMakeLists.txt index d8e0263..34a68aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,17 +1,15 @@ project(konaclient-gtk) - cmake_minimum_required(VERSION 2.8) -aux_source_directory(. SRC_LIST) +set(CMAKE_BUILD_TYPE Release) find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK3 REQUIRED gtk+-3.0) -pkg_check_modules(PC_LIBSOUP REQUIRED libsoup-2.4) +pkg_check_modules(GLIB2 REQUIRED glib-2.0) +pkg_check_modules(GOBJECT2 REQUIRED gobject-2.0) -include_directories(${GTK3_INCLUDE_DIRS} ${PC_LIBSOUP_INCLUDE_DIRS}) -link_directories(${GTK3_LIBRARY_DIRS} ${PC_LIBSOUP_LIBRARY_DIRS}) -add_definitions(${GTK3_CFLAGS_OTHER}) +INCLUDE_DIRECTORIES (${GLIB2_INCLUDE_DIRS} ${GOBJECT2_INCLUDE_DIRS} libkonaclient) +LINK_DIRECTORIES (${GLIB2_LIBRARY_DIRS} ${GOBJECT2_LIBRARY_DIRS}) +add_definitions(${GLIB2_CFLAGS_OTHER} ${GOBJECT2_CFLAGS_OTHER}) -add_executable(${PROJECT_NAME} ${SRC_LIST}) +add_subdirectory(libkonaclient) +add_subdirectory(konaclient-gtk) -# Link the target to the GTK+ libraries -target_link_libraries(${PROJECT_NAME} ${GTK3_LIBRARIES} ${PC_LIBSOUP_LIBRARIES}) diff --git a/konaclient-gtk/CMakeLists.txt b/konaclient-gtk/CMakeLists.txt new file mode 100644 index 0000000..3076bba --- /dev/null +++ b/konaclient-gtk/CMakeLists.txt @@ -0,0 +1,14 @@ +aux_source_directory(. SRC_LIST) + +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK3 REQUIRED gtk+-3.0) +pkg_check_modules(PC_LIBSOUP REQUIRED libsoup-2.4) + +include_directories(${GTK3_INCLUDE_DIRS} ${PC_LIBSOUP_INCLUDE_DIRS}) +link_directories(${GTK3_LIBRARY_DIRS} ${PC_LIBSOUP_LIBRARY_DIRS} libkonaclient) +add_definitions(${GTK3_CFLAGS_OTHER}) + +add_executable(${PROJECT_NAME} ${SRC_LIST}) + +# Link the target to the GTK+ libraries +target_link_libraries(${PROJECT_NAME} ${GTK3_LIBRARIES} ${PC_LIBSOUP_LIBRARIES} konaclient) diff --git a/glade/mainWindow.glade b/konaclient-gtk/glade/mainWindow.glade similarity index 100% rename from glade/mainWindow.glade rename to konaclient-gtk/glade/mainWindow.glade diff --git a/glade/previewWidget.glade b/konaclient-gtk/glade/previewWidget.glade similarity index 100% rename from glade/previewWidget.glade rename to konaclient-gtk/glade/previewWidget.glade diff --git a/glade/tagItemViewport.glade b/konaclient-gtk/glade/tagItemViewport.glade similarity index 100% rename from glade/tagItemViewport.glade rename to konaclient-gtk/glade/tagItemViewport.glade diff --git a/kona_search.c b/konaclient-gtk/kona_search.c similarity index 100% rename from kona_search.c rename to konaclient-gtk/kona_search.c diff --git a/kona_search.h b/konaclient-gtk/kona_search.h similarity index 100% rename from kona_search.h rename to konaclient-gtk/kona_search.h diff --git a/konaclient-gtk/konaclient-gtk b/konaclient-gtk/konaclient-gtk new file mode 100755 index 0000000000000000000000000000000000000000..94699cd8734e8dfcced0e7cd75f7d5c9a765a964 GIT binary patch literal 15912 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 literal 0 HcmV?d00001 diff --git a/main.c b/konaclient-gtk/main.c similarity index 100% rename from main.c rename to konaclient-gtk/main.c diff --git a/previewwidget.c b/konaclient-gtk/previewwidget.c similarity index 100% rename from previewwidget.c rename to konaclient-gtk/previewwidget.c diff --git a/previewwidget.h b/konaclient-gtk/previewwidget.h similarity index 100% rename from previewwidget.h rename to konaclient-gtk/previewwidget.h diff --git a/libkonaclient/CMakeLists.txt b/libkonaclient/CMakeLists.txt new file mode 100644 index 0000000..4102803 --- /dev/null +++ b/libkonaclient/CMakeLists.txt @@ -0,0 +1,4 @@ +# Build library +aux_source_directory(. LIBSRC_LIST) +add_library(konaclient SHARED ${LIBSRC_LIST}) +target_link_libraries(konaclient ${GLIB2_LIBRARIES} ${GOBJECT2_LIBRARIES}) diff --git a/libkonaclient/konaimage.c b/libkonaclient/konaimage.c new file mode 100644 index 0000000..f982c87 --- /dev/null +++ b/libkonaclient/konaimage.c @@ -0,0 +1,111 @@ +#include "konaimage.h" +#include + +typedef struct { + guint64 test; +} KonaImagePrivate; + +struct _KonaImage { + GObject parent_instance; // struct of parent (inherit) + guint64 id; + GList *tags; + GString *url; +}; + + +G_DEFINE_TYPE_WITH_PRIVATE(KonaImage, kona_image, G_TYPE_OBJECT) + +enum { + PROP_ID = 1, + PROP_TAGS, + PROP_URL, + PROP_COUNT +}; + +static GParamSpec *properties [PROP_COUNT]; + +static void kona_image_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { + KonaImage *self = (KonaImage*)object; + + switch (prop_id) { + case PROP_ID: + g_value_set_uint64(value, *kona_image_get_id(self)); + break; + case PROP_TAGS: + g_value_set_gtype(value, (GType) self->tags); // Returning the pointer itself may be dangerous... Rather copy it to the target value? + break; + case PROP_URL: + g_value_set_string(value, (const gchar*) self->url); + default: + break; + } +} + +static void kona_image_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { + KonaImage *self = (KonaImage*)object; + + switch (prop_id) { + case PROP_ID: + kona_image_set_id(self, g_value_get_uint64(value)); + break; + case PROP_TAGS: + g_list_free(self->tags); + self->tags = g_list_copy((GList*) g_value_get_gtype(value)); + break; + case PROP_URL: + g_free(self->url); + self->url = (GString*) g_strdup(g_value_get_string(value)); + break; + default: + break; + } +} + +static void kona_image_class_init(KonaImageClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS(klass); + + object_class->set_property = kona_image_set_property; + object_class->get_property = kona_image_get_property; + + properties [PROP_ID] = + g_param_spec_uint64("id", "id", "The ID of the image.", 0, G_MAXINT64, 22, G_PARAM_READWRITE); + + properties [PROP_TAGS] = + g_param_spec_gtype("tags", "tags", "A list of tags.", G_TYPE_NONE, G_PARAM_READWRITE); // TODO: G_TYPE_NONE for a GList(GString) a parameter? + + properties [PROP_URL] = + g_param_spec_string("url", "url", "The URL to the full picture.", "", G_PARAM_READWRITE); + + g_object_class_install_properties(object_class, PROP_COUNT, properties); +} + +static void kona_image_init (KonaImage *self) { + +} + +static void kona_image_dispose(KonaImage *self) { + // Clear privates here + G_OBJECT_CLASS (kona_image_parent_class)->dispose((GObject*) self); +} + +static void kona_image_finalize(KonaImage *self) { + // Clear public vars here + g_free(self->tags); + G_OBJECT_CLASS (kona_image_parent_class)->finalize ((GObject*) self); +} + +const guint64 *kona_image_get_id(KonaImage *self) +{ + return &(self->id); +} + +void kona_image_set_id(KonaImage *self, const guint64 id) +{ + self->id = id; +} + + +KonaImage *kona_image_new() +{ + return g_object_new(KONA_TYPE_IMAGE, 0); +} diff --git a/libkonaclient/konaimage.h b/libkonaclient/konaimage.h new file mode 100644 index 0000000..0e9a185 --- /dev/null +++ b/libkonaclient/konaimage.h @@ -0,0 +1,19 @@ +#ifndef KONAIMAGE_H +#define KONAIMAGE_H + +#include + +G_BEGIN_DECLS + +#define KONA_TYPE_IMAGE (kona_image_get_type()) + +G_DECLARE_FINAL_TYPE (KonaImage, kona_image, KONA, IMAGE, GObject) // Struct name, function prefix, Namespace, name, inherits + +KonaImage *kona_image_new (void); + +const guint64 *kona_image_get_id(KonaImage *self); +void kona_image_set_id(KonaImage *self, const guint64 id); + +G_END_DECLS + +#endif // KONAIMAGE_H diff --git a/libkonaclient/libkonalib.so b/libkonaclient/libkonalib.so new file mode 100755 index 0000000000000000000000000000000000000000..e62e15c3661dc8f5862575009e13250b80a72b23 GIT binary patch literal 11296 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 Pn*SN1Uv50h2mAjYcE0V_ literal 0 HcmV?d00001