# HG changeset patch
# Node ID ec57e0b4fd0d
# Parent  939814cb9972
diff --git a/pidgin/meson.build b/pidgin/meson.build
--- a/pidgin/meson.build
+++ b/pidgin/meson.build
@@ -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',
diff --git a/pidgin/pidginnotifiable.h b/pidgin/pidginnotifiable.h
new file mode 100644
--- /dev/null
+++ b/pidgin/pidginnotifiable.h
@@ -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 */
diff --git a/pidgin/pidginnotifiable.c b/pidgin/pidginnotifiable.c
new file mode 100644
--- /dev/null
+++ b/pidgin/pidginnotifiable.c
@@ -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;
+}
