pidgin/pidgin

Make PurpleRequestFieldDatasheet into a GObject

14 months ago, Elliott Sales de Andrade
f4538cc1cb27
Parents 809019093568
Children 92dd14dc8a73
Make PurpleRequestFieldDatasheet into a GObject

Not sure that we want to keep all of this, but probably we don't need this extra wrapper object long term, and `PurpleRequestDatasheet` (once made into a `GObject`) and `PurpleRequestFieldDatasheet` could merge.

Testing Done:
Compiled only.

Reviewed at https://reviews.imfreedom.org/r/2340/
--- a/libpurple/meson.build Fri Mar 10 17:37:15 2023 -0600
+++ b/libpurple/meson.build Fri Mar 10 17:42:23 2023 -0600
@@ -100,6 +100,7 @@
'request/purplerequestfieldaccount.c',
'request/purplerequestfieldbool.c',
'request/purplerequestfieldchoice.c',
+ 'request/purplerequestfielddatasheet.c',
'request/purplerequestfieldimage.c',
'request/purplerequestfieldint.c',
'request/purplerequestfieldlabel.c',
@@ -231,6 +232,7 @@
'request/purplerequestfieldaccount.h',
'request/purplerequestfieldbool.h',
'request/purplerequestfieldchoice.h',
+ 'request/purplerequestfielddatasheet.h',
'request/purplerequestfieldimage.h',
'request/purplerequestfieldint.h',
'request/purplerequestfieldlabel.h',
--- a/libpurple/purplerequestfield.c Fri Mar 10 17:37:15 2023 -0600
+++ b/libpurple/purplerequestfield.c Fri Mar 10 17:42:23 2023 -0600
@@ -40,12 +40,6 @@
gboolean required;
gboolean sensitive;
- union {
- struct {
- PurpleRequestDatasheet *sheet;
- } datasheet;
- } u;
-
void *ui_data;
char *tooltip;
@@ -189,10 +183,6 @@
g_free(priv->type_hint);
g_free(priv->tooltip);
- if(priv->type == PURPLE_REQUEST_FIELD_DATASHEET) {
- purple_request_datasheet_free(priv->u.datasheet.sheet);
- }
-
G_OBJECT_CLASS(purple_request_field_parent_class)->finalize(obj);
}
@@ -624,34 +614,3 @@
return priv->sensitive;
}
-
-PurpleRequestField *
-purple_request_field_datasheet_new(const char *id,
- const gchar *text, PurpleRequestDatasheet *sheet)
-{
- PurpleRequestField *field;
- PurpleRequestFieldPrivate *priv = NULL;
-
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(sheet != NULL, NULL);
-
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_DATASHEET);
- priv = purple_request_field_get_instance_private(field);
-
- priv->u.datasheet.sheet = sheet;
-
- return field;
-}
-
-PurpleRequestDatasheet *
-purple_request_field_datasheet_get_sheet(PurpleRequestField *field)
-{
- PurpleRequestFieldPrivate *priv = NULL;
-
- g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), NULL);
-
- priv = purple_request_field_get_instance_private(field);
- g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_DATASHEET, NULL);
-
- return priv->u.datasheet.sheet;
-}
--- a/libpurple/purplerequestfield.h Fri Mar 10 17:37:15 2023 -0600
+++ b/libpurple/purplerequestfield.h Fri Mar 10 17:42:23 2023 -0600
@@ -64,14 +64,12 @@
/**
* PurpleRequestFieldType:
* @PURPLE_REQUEST_FIELD_NONE: No field.
- * @PURPLE_REQUEST_FIELD_DATASHEET: Datasheet field.
*
* A type of field.
*/
typedef enum
{
PURPLE_REQUEST_FIELD_NONE,
- PURPLE_REQUEST_FIELD_DATASHEET
} PurpleRequestFieldType;
@@ -305,34 +303,6 @@
gboolean purple_request_field_is_sensitive(PurpleRequestField *field);
/**************************************************************************/
-/* Datasheet Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_datasheet_new:
- * @id: The field ID.
- * @text: The label of the field, may be %NULL.
- * @sheet: The datasheet.
- *
- * Creates a datasheet item field.
- *
- * Returns: (transfer full): The new field.
- */
-PurpleRequestField *purple_request_field_datasheet_new(const char *id,
- const gchar *text, PurpleRequestDatasheet *sheet);
-
-/**
- * purple_request_field_datasheet_get_sheet:
- * @field: The field.
- *
- * Returns a datasheet for a field.
- *
- * Returns: (transfer none): The datasheet object.
- */
-PurpleRequestDatasheet *purple_request_field_datasheet_get_sheet(
- PurpleRequestField *field);
-
-/**************************************************************************/
/* Validators for request fields. */
/**************************************************************************/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/request/purplerequestfielddatasheet.c Fri Mar 10 17:42:23 2023 -0600
@@ -0,0 +1,153 @@
+/* purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here. Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * 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 02111-1301 USA
+ */
+
+#include <glib/gi18n-lib.h>
+
+#include "glibcompat.h"
+#include "purplerequestfield.h"
+#include "purplerequestfielddatasheet.h"
+
+struct _PurpleRequestFieldDatasheet {
+ PurpleRequestField parent;
+
+ PurpleRequestDatasheet *sheet;
+};
+
+enum {
+ PROP_0,
+ PROP_SHEET,
+ N_PROPERTIES,
+};
+static GParamSpec *properties[N_PROPERTIES] = {NULL, };
+
+/******************************************************************************
+ * Helpers
+ *****************************************************************************/
+static void
+purple_request_field_datasheet_set_sheet(PurpleRequestFieldDatasheet *field,
+ PurpleRequestDatasheet *sheet)
+{
+ g_clear_pointer(&field->sheet, purple_request_datasheet_free);
+ field->sheet = sheet;
+
+ g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_SHEET]);
+}
+
+/******************************************************************************
+ * GObject Implementation
+ *****************************************************************************/
+G_DEFINE_TYPE(PurpleRequestFieldDatasheet, purple_request_field_datasheet,
+ PURPLE_TYPE_REQUEST_FIELD)
+
+static void
+purple_request_field_datasheet_get_property(GObject *obj, guint param_id,
+ GValue *value, GParamSpec *pspec)
+{
+ PurpleRequestFieldDatasheet *field = PURPLE_REQUEST_FIELD_DATASHEET(obj);
+
+ switch(param_id) {
+ case PROP_SHEET:
+ g_value_set_pointer(value,
+ purple_request_field_datasheet_get_sheet(field));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
+ break;
+ }
+}
+
+static void
+purple_request_field_datasheet_set_property(GObject *obj, guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ PurpleRequestFieldDatasheet *field = PURPLE_REQUEST_FIELD_DATASHEET(obj);
+
+ switch(param_id) {
+ case PROP_SHEET:
+ purple_request_field_datasheet_set_sheet(field,
+ g_value_get_pointer(value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
+ break;
+ }
+}
+
+static void
+purple_request_field_datasheet_finalize(GObject *obj) {
+ PurpleRequestFieldDatasheet *field = PURPLE_REQUEST_FIELD_DATASHEET(obj);
+
+ g_clear_pointer(&field->sheet, purple_request_datasheet_free);
+
+ G_OBJECT_CLASS(purple_request_field_datasheet_parent_class)->finalize(obj);
+}
+
+static void
+purple_request_field_datasheet_init(G_GNUC_UNUSED PurpleRequestFieldDatasheet *field) {
+}
+
+static void
+purple_request_field_datasheet_class_init(PurpleRequestFieldDatasheetClass *klass) {
+ GObjectClass *obj_class = G_OBJECT_CLASS(klass);
+
+ obj_class->finalize = purple_request_field_datasheet_finalize;
+ obj_class->get_property = purple_request_field_datasheet_get_property;
+ obj_class->set_property = purple_request_field_datasheet_set_property;
+
+ /**
+ * PurpleRequestFieldDatasheet:sheet:
+ *
+ * The datasheet of the field.
+ *
+ * Since: 3.0.0
+ */
+ properties[PROP_SHEET] = g_param_spec_pointer(
+ "sheet", "sheet",
+ "The datasheet of the field.",
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
+}
+
+/******************************************************************************
+ * Public API
+ *****************************************************************************/
+PurpleRequestField *
+purple_request_field_datasheet_new(const char *id, const char *text,
+ PurpleRequestDatasheet *sheet)
+{
+ g_return_val_if_fail(id != NULL, NULL);
+ g_return_val_if_fail(sheet != NULL, NULL);
+
+ return g_object_new(PURPLE_TYPE_REQUEST_FIELD_DATASHEET,
+ "id", id,
+ "label", text,
+ "sheet", sheet,
+ NULL);
+}
+
+PurpleRequestDatasheet *
+purple_request_field_datasheet_get_sheet(PurpleRequestFieldDatasheet *field) {
+ g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_DATASHEET(field), NULL);
+
+ return field->sheet;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/request/purplerequestfielddatasheet.h Fri Mar 10 17:42:23 2023 -0600
@@ -0,0 +1,77 @@
+/*
+ * Purple - Internet Messaging Library
+ * Copyright (C) Pidgin Developers <devel@pidgin.im>
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here. Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * 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, see <https://www.gnu.org/licenses/>.
+ */
+
+#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION)
+# error "only <purple.h> may be included directly"
+#endif
+
+#ifndef PURPLE_REQUEST_FIELD_DATASHEET_H
+#define PURPLE_REQUEST_FIELD_DATASHEET_H
+
+#include <stdlib.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+/**
+ * PurpleRequestField:
+ *
+ * A request field.
+ */
+typedef struct _PurpleRequestField PurpleRequestField;
+
+#include "request.h"
+#include "request-datasheet.h"
+
+#define PURPLE_DEFAULT_ACTION_NONE -1
+
+G_BEGIN_DECLS
+
+#define PURPLE_TYPE_REQUEST_FIELD_DATASHEET (purple_request_field_datasheet_get_type())
+G_DECLARE_FINAL_TYPE(PurpleRequestFieldDatasheet, purple_request_field_datasheet,
+ PURPLE, REQUEST_FIELD_DATASHEET, PurpleRequestField)
+
+/**
+ * purple_request_field_datasheet_new:
+ * @id: The field ID.
+ * @text: The label of the field, may be %NULL.
+ * @sheet: The datasheet.
+ *
+ * Creates a datasheet item field.
+ *
+ * Returns: (transfer full): The new field.
+ */
+PurpleRequestField *purple_request_field_datasheet_new(const char *id, const gchar *text, PurpleRequestDatasheet *sheet);
+
+/**
+ * purple_request_field_datasheet_get_sheet:
+ * @field: The field.
+ *
+ * Returns a datasheet for a field.
+ *
+ * Returns: (transfer none): The datasheet object.
+ */
+PurpleRequestDatasheet *purple_request_field_datasheet_get_sheet(PurpleRequestFieldDatasheet *field);
+
+G_END_DECLS
+
+#endif /* PURPLE_REQUEST_FIELD_DATASHEET_H */
--- a/pidgin/gtkrequest.c Fri Mar 10 17:37:15 2023 -0600
+++ b/pidgin/gtkrequest.c Fri Mar 10 17:42:23 2023 -0600
@@ -1772,6 +1772,7 @@
static GtkWidget *
create_datasheet_field(PurpleRequestField *field, GtkSizeGroup *buttons_sg)
{
+ PurpleRequestFieldDatasheet *dfield = PURPLE_REQUEST_FIELD_DATASHEET(field);
PurpleRequestDatasheet *sheet;
guint i, col_count;
GType *col_types;
@@ -1785,7 +1786,7 @@
GtkWidget *buttons_box;
const GList *it;
- sheet = purple_request_field_datasheet_get_sheet(field);
+ sheet = purple_request_field_datasheet_get_sheet(dfield);
main_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
col_count = purple_request_datasheet_get_column_count(sheet);
@@ -2044,12 +2045,10 @@
for (fl = field_list; fl != NULL; fl = fl->next)
{
PurpleRequestField *field = PURPLE_REQUEST_FIELD(fl->data);
- PurpleRequestFieldType type;
-
- type = purple_request_field_get_field_type(field);
-
- if (type == PURPLE_REQUEST_FIELD_DATASHEET)
+
+ if(PURPLE_IS_REQUEST_FIELD_DATASHEET(field)) {
contains_resizable = TRUE;
+ }
if(PURPLE_IS_REQUEST_FIELD_LABEL(field)) {
rows++;
@@ -2089,7 +2088,6 @@
{
size_t col_offset = 0;
PurpleRequestField *field = PURPLE_REQUEST_FIELD(fl->data);
- PurpleRequestFieldType type;
GtkWidget *widget = NULL;
gchar *field_label;
@@ -2099,7 +2097,6 @@
continue;
}
- type = purple_request_field_get_field_type(field);
field_label = pidgin_request_escape(cpar,
purple_request_field_get_label(field));
@@ -2160,10 +2157,11 @@
widget = create_image_field(field);
} else if(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field)) {
widget = create_account_field(field);
- } else if (type == PURPLE_REQUEST_FIELD_DATASHEET)
+ } else if(PURPLE_IS_REQUEST_FIELD_DATASHEET(field)) {
widget = create_datasheet_field(field, datasheet_buttons_sg);
- else
+ } else {
continue;
+ }
}
gtk_widget_set_sensitive(widget,