From d3bf654b118e6d6b199732012009a5a19a8fb2e2 Mon Sep 17 00:00:00 2001 From: Richard Cohen Date: Thu, 4 May 2023 17:31:57 +0100 Subject: [PATCH 1/3] Refactor: DECLARE/DEFINE_INTERFACE GncWindow < GObject --- gnucash/gnome-utils/gnc-embedded-window.c | 4 +-- gnucash/gnome-utils/gnc-main-window.cpp | 4 +-- gnucash/gnome-utils/gnc-window.c | 30 +++-------------------- gnucash/gnome-utils/gnc-window.h | 12 +++------ 4 files changed, 11 insertions(+), 39 deletions(-) diff --git a/gnucash/gnome-utils/gnc-embedded-window.c b/gnucash/gnome-utils/gnc-embedded-window.c index b35233759c..a6588f3a44 100644 --- a/gnucash/gnome-utils/gnc-embedded-window.c +++ b/gnucash/gnome-utils/gnc-embedded-window.c @@ -58,7 +58,7 @@ static QofLogModule log_module = GNC_MOD_GUI; static void gnc_embedded_window_finalize (GObject *object); static void gnc_embedded_window_dispose (GObject *object); -static void gnc_window_embedded_window_init (GncWindowIface *iface); +static void gnc_window_embedded_window_init (GncWindowInterface *iface); static void gnc_embedded_window_setup_window (GncEmbeddedWindow *window); @@ -499,7 +499,7 @@ gnc_embedded_window_get_accel_group (GncWindow *window) * @param iface A pointer to the interface data structure to * populate. */ static void -gnc_window_embedded_window_init (GncWindowIface *iface) +gnc_window_embedded_window_init (GncWindowInterface *iface) { iface->get_gtk_window = gnc_embedded_window_get_gtk_window; iface->get_statusbar = gnc_embedded_window_get_statusbar; diff --git a/gnucash/gnome-utils/gnc-main-window.cpp b/gnucash/gnome-utils/gnc-main-window.cpp index 845d1e250f..51540ea424 100644 --- a/gnucash/gnome-utils/gnc-main-window.cpp +++ b/gnucash/gnome-utils/gnc-main-window.cpp @@ -154,7 +154,7 @@ static void gnc_main_window_finalize (GObject *object); static void gnc_main_window_destroy (GtkWidget *widget); static void gnc_main_window_setup_window (GncMainWindow *window); -static void gnc_window_main_window_init (GncWindowIface *iface); +static void gnc_window_main_window_init (GncWindowInterface *iface); #ifndef MAC_INTEGRATION static void gnc_main_window_update_all_menu_items (void); #endif @@ -5453,7 +5453,7 @@ gnc_main_window_get_accel_group (GncWindow *window) * @param iface A pointer to the interface data structure to * populate. */ static void -gnc_window_main_window_init (GncWindowIface *iface) +gnc_window_main_window_init (GncWindowInterface *iface) { iface->get_gtk_window = gnc_main_window_get_gtk_window; iface->get_statusbar = gnc_main_window_get_statusbar; diff --git a/gnucash/gnome-utils/gnc-window.c b/gnucash/gnome-utils/gnc-window.c index 92568b8cd4..e58ffd4d26 100644 --- a/gnucash/gnome-utils/gnc-window.c +++ b/gnucash/gnome-utils/gnc-window.c @@ -34,33 +34,11 @@ static QofLogModule log_module = GNC_MOD_GUI; -GType -gnc_window_get_type (void) -{ - static GType gnc_window_type = 0; - - if (gnc_window_type == 0) - { - static const GTypeInfo our_info = - { - sizeof (GncWindowIface), - NULL, - NULL, - NULL, - NULL, - NULL, - 0, - 0, - NULL - }; - - gnc_window_type = g_type_register_static (G_TYPE_INTERFACE, - "GncWindow", - &our_info, 0); - g_type_interface_add_prerequisite (gnc_window_type, G_TYPE_OBJECT); - } +G_DEFINE_INTERFACE (GncWindow, gnc_window, G_TYPE_OBJECT) - return gnc_window_type; +static void +gnc_window_default_init (GncWindowInterface *klass) +{ } /************************************************************ diff --git a/gnucash/gnome-utils/gnc-window.h b/gnucash/gnome-utils/gnc-window.h index 01978346fa..63db5760f8 100644 --- a/gnucash/gnome-utils/gnc-window.h +++ b/gnucash/gnome-utils/gnc-window.h @@ -48,14 +48,10 @@ G_BEGIN_DECLS /* type macros */ #define GNC_TYPE_WINDOW (gnc_window_get_type ()) -#define GNC_WINDOW(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GNC_TYPE_WINDOW, GncWindow)) -#define GNC_IS_WINDOW(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNC_TYPE_WINDOW)) -#define GNC_WINDOW_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), GNC_TYPE_WINDOW, GncWindowIface)) +G_DECLARE_INTERFACE (GncWindow, gnc_window, GNC, WINDOW, GObject) /* typedefs & structures */ -typedef struct GncWindow GncWindow; /* dummy typedef */ - -typedef struct +struct _GncWindowInterface { GTypeInterface parent; @@ -68,11 +64,9 @@ typedef struct GMenuModel * (* get_menubar_model) (GncWindow *window); GtkAccelGroup * (* get_accel_group) (GncWindow *window); void (* ui_set_sensitive) (GncWindow *window, gboolean sensitive); -} GncWindowIface; +}; /* function prototypes */ -GType gnc_window_get_type (void); - GtkWindow *gnc_window_get_gtk_window (GncWindow *window); void gnc_window_update_status (GncWindow *window, GncPluginPage *page); From e70880de1a9107bd30119aaa3abb1af982f77bf9 Mon Sep 17 00:00:00 2001 From: Richard Cohen Date: Wed, 24 May 2023 15:28:55 +0100 Subject: [PATCH 2/3] Refactor: DECLARE/DEFINE_INTERFACE GncDenseCalModel < GObject - use _default_init() (always called only once) to create the signals instead of _base_init() - remove unused signal vfuncs --- gnucash/gnome-utils/gnc-dense-cal-model.c | 51 ++++--------------- gnucash/gnome-utils/gnc-dense-cal-model.h | 16 ++---- gnucash/gnome-utils/gnc-dense-cal-store.c | 4 +- .../gnc-sx-instance-dense-cal-adapter.c | 4 +- 4 files changed, 17 insertions(+), 58 deletions(-) diff --git a/gnucash/gnome-utils/gnc-dense-cal-model.c b/gnucash/gnome-utils/gnc-dense-cal-model.c index 205f625b48..0748fbf96e 100644 --- a/gnucash/gnome-utils/gnc-dense-cal-model.c +++ b/gnucash/gnome-utils/gnc-dense-cal-model.c @@ -41,14 +41,9 @@ enum { GDCM_ADDED, GDCM_UPDATE, GDCM_REMOVE, LAST_SIGNAL }; static guint gnc_dense_cal_model_signals[LAST_SIGNAL] = { 0 }; static void -gnc_dense_cal_model_base_init(gpointer g_class) +gnc_dense_cal_model_default_init(GncDenseCalModelInterface *g_class) { - static gboolean initialized = FALSE; - - if (!initialized) - { - gnc_dense_cal_model_signals[GDCM_ADDED] - = g_signal_new("added", + gnc_dense_cal_model_signals[GDCM_ADDED] = g_signal_new("added", G_TYPE_FROM_CLASS(g_class), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0 /* default offset */, @@ -60,8 +55,7 @@ gnc_dense_cal_model_base_init(gpointer g_class) G_TYPE_UINT /* param types */ ); - gnc_dense_cal_model_signals[GDCM_UPDATE] - = g_signal_new("update", + gnc_dense_cal_model_signals[GDCM_UPDATE] = g_signal_new("update", G_TYPE_FROM_CLASS(g_class), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0 /* default offset */, @@ -73,8 +67,7 @@ gnc_dense_cal_model_base_init(gpointer g_class) G_TYPE_UINT /* param types */ ); - gnc_dense_cal_model_signals[GDCM_REMOVE] - = g_signal_new("removing", + gnc_dense_cal_model_signals[GDCM_REMOVE] = g_signal_new("removing", G_TYPE_FROM_CLASS(g_class), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0 /* default offset */, @@ -85,60 +78,36 @@ gnc_dense_cal_model_base_init(gpointer g_class) 1 /* n_params */, G_TYPE_UINT /* param types */ ); - - initialized = TRUE; - } } -GType -gnc_dense_cal_model_get_type(void) -{ - static GType type = 0; - if (type == 0) - { - static const GTypeInfo info = - { - sizeof(GncDenseCalModelIface), - gnc_dense_cal_model_base_init, /* base_init */ - NULL, /* base_finalize */ - NULL, /* class_init */ - NULL, /* class_finalize */ - NULL, /* class_data */ - 0, - 0, /* n_preallocs */ - NULL /* instance_init */ - }; - type = g_type_register_static(G_TYPE_INTERFACE, "GncDenseCalModel", &info, 0); - } - return type; -} +G_DEFINE_INTERFACE (GncDenseCalModel, gnc_dense_cal_model, G_TYPE_OBJECT) GList* gnc_dense_cal_model_get_contained(GncDenseCalModel *model) { - return (*GNC_DENSE_CAL_MODEL_GET_INTERFACE(model)->get_contained)(model); + return (*GNC_DENSE_CAL_MODEL_GET_IFACE(model)->get_contained)(model); } gchar* gnc_dense_cal_model_get_name(GncDenseCalModel *model, guint tag) { - return (*GNC_DENSE_CAL_MODEL_GET_INTERFACE(model)->get_name)(model, tag); + return (*GNC_DENSE_CAL_MODEL_GET_IFACE(model)->get_name)(model, tag); } gchar* gnc_dense_cal_model_get_info(GncDenseCalModel *model, guint tag) { - return (*GNC_DENSE_CAL_MODEL_GET_INTERFACE(model)->get_info)(model, tag); + return (*GNC_DENSE_CAL_MODEL_GET_IFACE(model)->get_info)(model, tag); } gint gnc_dense_cal_model_get_instance_count(GncDenseCalModel *model, guint tag) { - return (*GNC_DENSE_CAL_MODEL_GET_INTERFACE(model)->get_instance_count)(model, tag); + return (*GNC_DENSE_CAL_MODEL_GET_IFACE(model)->get_instance_count)(model, tag); } void gnc_dense_cal_model_get_instance(GncDenseCalModel *model, guint tag, gint instance_index, GDate *date) { - (*GNC_DENSE_CAL_MODEL_GET_INTERFACE(model)->get_instance)(model, tag, instance_index, date); + (*GNC_DENSE_CAL_MODEL_GET_IFACE(model)->get_instance)(model, tag, instance_index, date); } diff --git a/gnucash/gnome-utils/gnc-dense-cal-model.h b/gnucash/gnome-utils/gnc-dense-cal-model.h index 92cbbac791..e0c4abfeef 100644 --- a/gnucash/gnome-utils/gnc-dense-cal-model.h +++ b/gnucash/gnome-utils/gnc-dense-cal-model.h @@ -30,29 +30,19 @@ G_BEGIN_DECLS #define GNC_TYPE_DENSE_CAL_MODEL (gnc_dense_cal_model_get_type()) -#define GNC_DENSE_CAL_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNC_TYPE_DENSE_CAL_MODEL, GncDenseCalModel)) -#define GNC_IS_DENSE_CAL_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNC_TYPE_DENSE_CAL_MODEL)) -#define GNC_DENSE_CAL_MODEL_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GNC_TYPE_DENSE_CAL_MODEL, GncDenseCalModelIface)) +G_DECLARE_INTERFACE (GncDenseCalModel, gnc_dense_cal_model, GNC, DENSE_CAL_MODEL, GObject) -typedef struct _GncDenseCalModel GncDenseCalModel; /* non existent */ -typedef struct _GncDenseCalModelIface +struct _GncDenseCalModelInterface { GTypeInterface parent; - /* signals */ - void (*insert)(GncDenseCalModel *mdl, gint tag); - void (*update)(GncDenseCalModel *mdl, gint tag); - void (*remove)(GncDenseCalModel *mdl, gint tag); - /* virtual table */ GList* (*get_contained)(GncDenseCalModel *model); gchar* (*get_name)(GncDenseCalModel *model, guint tag); gchar* (*get_info)(GncDenseCalModel *model, guint tag); gint (*get_instance_count)(GncDenseCalModel *model, guint tag); void (*get_instance)(GncDenseCalModel *model, guint tag, gint instance_index, GDate *date); -} GncDenseCalModelIface; - -GType gnc_dense_cal_model_get_type(void); +}; /** @return Caller-owned GList (but not elements). The Model-user will free. **/ GList* gnc_dense_cal_model_get_contained(GncDenseCalModel *model); diff --git a/gnucash/gnome-utils/gnc-dense-cal-store.c b/gnucash/gnome-utils/gnc-dense-cal-store.c index 86a91c525c..98a2898f1b 100644 --- a/gnucash/gnome-utils/gnc-dense-cal-store.c +++ b/gnucash/gnome-utils/gnc-dense-cal-store.c @@ -59,7 +59,7 @@ struct _GncDenseCalStoreClass GObjectClass parent_class; }; -static void gnc_dense_cal_store_iface_init(GncDenseCalModelIface *iface); +static void gnc_dense_cal_store_iface_init(GncDenseCalModelInterface *iface); static void gnc_dense_cal_store_finalize(GObject *obj); static GList* gdcs_get_contained(GncDenseCalModel *model); @@ -85,7 +85,7 @@ gnc_dense_cal_store_init(GncDenseCalStore *self) } static void -gnc_dense_cal_store_iface_init(GncDenseCalModelIface *iface) +gnc_dense_cal_store_iface_init(GncDenseCalModelInterface *iface) { iface->get_contained = gdcs_get_contained; iface->get_name = gdcs_get_name; diff --git a/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c b/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c index e5ff0d602b..a0ee9b5afc 100644 --- a/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c +++ b/gnucash/gnome-utils/gnc-sx-instance-dense-cal-adapter.c @@ -40,7 +40,7 @@ #define G_LOG_DOMAIN "gnc.gui.sx.adapter.sx-dense-cal" static const QofLogModule log_module = G_LOG_DOMAIN; -static void gnc_sx_instance_dense_cal_adapter_interface_init(GncDenseCalModelIface *iface); +static void gnc_sx_instance_dense_cal_adapter_interface_init(GncDenseCalModelInterface *iface); static void gnc_sx_instance_dense_cal_adapter_dispose(GObject *obj); static void gnc_sx_instance_dense_cal_adapter_finalize(GObject *obj); @@ -82,7 +82,7 @@ gnc_sx_instance_dense_cal_adapter_init(GncSxInstanceDenseCalAdapter *instance) } static void -gnc_sx_instance_dense_cal_adapter_interface_init(GncDenseCalModelIface *iface) +gnc_sx_instance_dense_cal_adapter_interface_init(GncDenseCalModelInterface *iface) { iface->get_contained = gsidca_get_contained; iface->get_name = gsidca_get_name; From 680fe47bac670bcf1bf1d68b28ce35ff8b4f0f2a Mon Sep 17 00:00:00 2001 From: Richard Cohen Date: Tue, 30 May 2023 10:18:41 +0100 Subject: [PATCH 3/3] Refactor: Remove unused macros GNC_BASIC_GOBJECT_* --- libgnucash/app-utils/CMakeLists.txt | 1 - libgnucash/app-utils/gnc-basic-gobject.h | 61 ------------------------ 2 files changed, 62 deletions(-) delete mode 100644 libgnucash/app-utils/gnc-basic-gobject.h diff --git a/libgnucash/app-utils/CMakeLists.txt b/libgnucash/app-utils/CMakeLists.txt index 08d0cf03a1..a9ca0acad1 100644 --- a/libgnucash/app-utils/CMakeLists.txt +++ b/libgnucash/app-utils/CMakeLists.txt @@ -9,7 +9,6 @@ include (GncFindLibm) set (app_utils_HEADERS QuickFill.h file-utils.h - gnc-basic-gobject.h gnc-account-merge.h gnc-addr-quickfill.h gnc-entry-quickfill.h diff --git a/libgnucash/app-utils/gnc-basic-gobject.h b/libgnucash/app-utils/gnc-basic-gobject.h deleted file mode 100644 index de07e9db2c..0000000000 --- a/libgnucash/app-utils/gnc-basic-gobject.h +++ /dev/null @@ -1,61 +0,0 @@ -/********************************************************************\ - * gnc-basic-gobject.h * - * * - * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * -\********************************************************************/ - - -#ifndef GNC_BASIC_GOBJECT_H -#define GNC_BASIC_GOBJECT_H - -/* A simple macro to define simple gobjects */ - -#define GNC_BASIC_GOBJECT_TYPE(type_struct,klass_struct,parent,klass_init,inst_init,get_type_fcn) \ -GType \ -get_type_fcn (void) \ -{ \ - static GType type = 0; \ - \ - if (type == 0) { \ - GTypeInfo type_info = { \ - sizeof (klass_struct), \ - NULL, \ - NULL, \ - (GClassInitFunc) klass_init, \ - NULL, \ - NULL, \ - sizeof (type_struct), \ - 0, \ - (GInstanceInitFunc) inst_init, \ - }; \ - \ - type = g_type_register_static (parent, #type_struct, &type_info, 0); \ - } \ - \ - return type; \ -} - -#define GNC_BASIC_GOBJECT_NEW(type_struct,new_fcn,get_type_fcn) \ -type_struct * \ -new_fcn (void) \ -{ \ - return (type_struct *) g_object_new(get_type_fcn (), NULL); \ -} - -#define GNC_BASIC_GOBJECT(type_struct,klass_struct,parent,klass_init,inst_init,get_type_fcn,new_fcn) \ -GNC_BASIC_GOBJECT_TYPE(type_struct,klass_struct,parent,klass_init,inst_init,get_type_fcn) \ -GNC_BASIC_GOBJECT_NEW(type_struct,new_fcn,get_type_fcn) - -#endif /* GNC_BASIC_GOBJECT_H */