pidgin/pidgin

Create PidginNotifiable interface

5 weeks ago, Gary Kramlich
7c639ab519a1
Parents 60e003f0c3fc
Children f95b932717bb
Create PidginNotifiable interface

This interface is meant to allow us to wire up a widget's properties to a
PidginDisplayItem's needs-attention and badge-number properties.

Testing Done:
Had the turtles check in on things.

Reviewed at https://reviews.imfreedom.org/r/3154/
--- a/pidgin/meson.build Mon May 06 22:30:11 2024 -0500
+++ b/pidgin/meson.build Tue May 07 22:57:09 2024 -0500
@@ -34,6 +34,7 @@
'pidginiconname.c',
'pidgininfopane.c',
'pidginkeypad.c',
+ 'pidginnotifiable.c',
'pidginnotificationaddcontact.c',
'pidginnotificationauthorizationrequest.c',
'pidginnotificationconnectionerror.c',
@@ -85,6 +86,7 @@
'pidginiconname.h',
'pidgininfopane.h',
'pidginkeypad.h',
+ 'pidginnotifiable.h',
'pidginnotificationaddcontact.h',
'pidginnotificationauthorizationrequest.h',
'pidginnotificationconnectionerror.h',
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pidginnotifiable.c Tue May 07 22:57:09 2024 -0500
@@ -0,0 +1,88 @@
+/*
+ * Pidgin - Internet Messenger
+ * Copyright (C) Pidgin Developers <devel@pidgin.im>
+ *
+ * Pidgin 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 "pidginnotifiable.h"
+
+/******************************************************************************
+ * GInterface implementation
+ *****************************************************************************/
+G_DEFINE_INTERFACE(PidginNotifiable, pidgin_notifiable, G_TYPE_INVALID)
+
+static void
+pidgin_notifiable_default_init(PidginNotifiableInterface *iface) {
+ GParamSpec *pspec = NULL;
+
+ /**
+ * PidginNotifiable:needs-attention:
+ *
+ * Whether or not this needs attention.
+ *
+ * Since: 3.0
+ */
+ pspec = g_param_spec_boolean(
+ "needs-attention", "needs-attention",
+ "Whether or not this notifiable needs attention.",
+ FALSE,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_interface_install_property(iface, pspec);
+
+ /**
+ * PidginNotifiable:notification-count:
+ *
+ * The number of notifications.
+ *
+ * Since: 3.0
+ */
+ pspec = g_param_spec_uint(
+ "notification-count", "notifications-count",
+ "The number of notifications.",
+ 0, G_MAXUINT, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_interface_install_property(iface, pspec);
+}
+
+/******************************************************************************
+ * Public API
+ *****************************************************************************/
+gboolean
+pidgin_notifiable_get_needs_attention(PidginNotifiable *notifiable) {
+ gboolean ret = FALSE;
+
+ g_return_val_if_fail(PIDGIN_IS_NOTIFIABLE(notifiable), FALSE);
+
+ g_object_get(G_OBJECT(notifiable), "needs-attention", &ret, NULL);
+
+ return ret;
+}
+
+guint
+pidgin_notifiable_get_notification_count(PidginNotifiable *notifiable) {
+ guint ret = 0;
+
+ g_return_val_if_fail(PIDGIN_IS_NOTIFIABLE(notifiable), 0);
+
+ g_object_get(G_OBJECT(notifiable), "notification-count", &ret, NULL);
+
+ return ret;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pidginnotifiable.h Tue May 07 22:57:09 2024 -0500
@@ -0,0 +1,102 @@
+/*
+ * Pidgin - Internet Messenger
+ * Copyright (C) Pidgin Developers <devel@pidgin.im>
+ *
+ * Pidgin 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(PIDGIN_GLOBAL_HEADER_INSIDE) && !defined(PIDGIN_COMPILATION)
+# error "only <pidgin.h> may be included directly"
+#endif
+
+#ifndef PIDGIN_NOTIFIABLE_H
+#define PIDGIN_NOTIFIABLE_H
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <purple.h>
+
+#include "pidginversion.h"
+
+G_BEGIN_DECLS
+
+/**
+ * PidginNotifiable:
+ *
+ * An interface for notifiable items.
+ *
+ * This should be implemented by anything that wants to show attention or a
+ * badge in a [class@DisplayWindow].
+ *
+ * The [property@Notifiable:needs-attention] property is used to determine if
+ * a badge and/or other steps should be taken to signify that the user needs to
+ * look at this item.
+ *
+ * The [property@Notifiable:notification-count] determines how many
+ * notifications there are which can be used in a badge or other elements.
+ *
+ * Since: 3.0
+ */
+
+#define PIDGIN_TYPE_NOTIFIABLE (pidgin_notifiable_get_type())
+
+PIDGIN_AVAILABLE_IN_3_0
+G_DECLARE_INTERFACE(PidginNotifiable, pidgin_notifiable, PIDGIN, NOTIFIABLE,
+ GObject)
+
+struct _PidginNotifiableInterface {
+ /*< private >*/
+ GTypeInterface parent;
+
+ /*< private >*/
+ gpointer reservered[4];
+};
+
+/**
+ * pidgin_notifiable_get_needs_attention:
+ * @notifiable: The instance.
+ *
+ * Gets whether or not this notifiable needs attention.
+ *
+ * Returns: %TRUE if attention is needed, otherwise %FALSE.
+ *
+ * Since: 3.0
+ */
+PIDGIN_AVAILABLE_IN_3_0
+gboolean pidgin_notifiable_get_needs_attention(PidginNotifiable *notifiable);
+
+/**
+ * pidgin_notifiable_get_notification_count:
+ * @notifiable: The instance.
+ *
+ * Gets the number of notifications.
+ *
+ * It's up the the consumer to decide if the exact number or an estimate, like
+ * `10+` is displayed.
+ *
+ * Returns: The number of notifications.
+ *
+ * Since: 3.0
+ */
+PIDGIN_AVAILABLE_IN_3_0
+guint pidgin_notifiable_get_notification_count(PidginNotifiable *notifiable);
+
+G_END_DECLS
+
+#endif /* PIDGIN_NOTIFIABLE_H */