--- a/pidgin/meson.build Fri Nov 18 00:56:22 2022 -0600
+++ b/pidgin/meson.build Fri Nov 18 00:58:22 2022 -0600
@@ -58,7 +58,6 @@
'pidginstatusprimitivechooser.c',
- 'pidginstatusprimitivestore.c',
@@ -126,7 +125,6 @@
'pidginstatusprimitivechooser.h',
- 'pidginstatusprimitivestore.h',
--- a/pidgin/pidginstatusprimitivechooser.c Fri Nov 18 00:56:22 2022 -0600
+++ b/pidgin/pidginstatusprimitivechooser.c Fri Nov 18 00:58:22 2022 -0600
@@ -22,17 +22,81 @@
#include <pidgin/pidginstatusprimitivechooser.h>
+#include <pidgin/pidginiconname.h> struct _PidginStatusPrimitiveChooser {
G_DEFINE_TYPE(PidginStatusPrimitiveChooser, pidgin_status_primitive_chooser,
+/****************************************************************************** + *****************************************************************************/ +static PurpleStatusPrimitive +pidgin_status_primitive_chooser_primitive_from_string(const char *str) { + if(purple_strequal(str, "offline")) { + return PURPLE_STATUS_OFFLINE; + } else if(purple_strequal(str, "available")) { + return PURPLE_STATUS_AVAILABLE; + } else if(purple_strequal(str, "unavailable")) { + return PURPLE_STATUS_UNAVAILABLE; + } else if(purple_strequal(str, "invisible")) { + return PURPLE_STATUS_INVISIBLE; + } else if(purple_strequal(str, "away")) { + return PURPLE_STATUS_AWAY; + } else if(purple_strequal(str, "extended-away")) { + return PURPLE_STATUS_EXTENDED_AWAY; + return PURPLE_STATUS_UNSET; +/****************************************************************************** + *****************************************************************************/ +pidgin_status_primitive_chooser_icon_name_cb(G_GNUC_UNUSED GObject *self, + GtkStringObject *object, + G_GNUC_UNUSED gpointer data) + PurpleStatusPrimitive primitive = PURPLE_STATUS_UNSET; + const char *value = NULL; + if(!GTK_IS_STRING_OBJECT(object)) { + value = gtk_string_object_get_string(object); + primitive = pidgin_status_primitive_chooser_primitive_from_string(value); + return g_strdup(pidgin_icon_name_from_status_primitive(primitive, NULL)); +pidgin_status_primitive_chooser_label_cb(G_GNUC_UNUSED GObject *self, + GtkStringObject *object, + G_GNUC_UNUSED gpointer data) + PurpleStatusPrimitive primitive = PURPLE_STATUS_UNSET; + const char *value = NULL; + if(!GTK_IS_STRING_OBJECT(object)) { + value = gtk_string_object_get_string(object); + primitive = pidgin_status_primitive_chooser_primitive_from_string(value); + return g_strdup(purple_primitive_get_name_from_type(primitive)); /******************************************************************************
*****************************************************************************/
pidgin_status_primitive_chooser_init(PidginStatusPrimitiveChooser *chooser) {
gtk_widget_init_template(GTK_WIDGET(chooser));
@@ -45,6 +109,15 @@
gtk_widget_class_set_template_from_resource(
widget_class, "/im/pidgin/Pidgin3/statusprimitivechooser.ui");
+ gtk_widget_class_bind_template_child(widget_class, + PidginStatusPrimitiveChooser, + gtk_widget_class_bind_template_callback(widget_class, + pidgin_status_primitive_chooser_icon_name_cb); + gtk_widget_class_bind_template_callback(widget_class, + pidgin_status_primitive_chooser_label_cb); /******************************************************************************
@@ -57,25 +130,40 @@
pidgin_status_primitive_chooser_get_selected(PidginStatusPrimitiveChooser *chooser) {
- const gchar *active_id = NULL;
+ GtkStringObject *selected = NULL; + const char *value = NULL; - g_return_val_if_fail(PIDGIN_IS_STATUS_PRIMITIVE_CHOOSER(chooser),
+ g_return_val_if_fail(PIDGIN_IS_STATUS_PRIMITIVE_CHOOSER(chooser), - active_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(chooser));
+ selected = gtk_drop_down_get_selected_item(chooser->chooser); + value = gtk_string_object_get_string(selected); - return purple_primitive_get_type_from_id(active_id);
+ return pidgin_status_primitive_chooser_primitive_from_string(value); pidgin_status_primitive_chooser_set_selected(PidginStatusPrimitiveChooser *chooser,
PurpleStatusPrimitive primitive)
- const gchar *active_id = NULL;
+ GListModel *model = NULL; + g_return_if_fail(PIDGIN_IS_STATUS_PRIMITIVE_CHOOSER(chooser)); - g_return_if_fail(PIDGIN_IS_STATUS_PRIMITIVE_CHOOSER(chooser));
+ model = gtk_drop_down_get_model(chooser->chooser); + for(guint i = 0; i < g_list_model_get_n_items(model); i++) { + PurpleStatusPrimitive candidate = PURPLE_STATUS_UNSET; + GtkStringObject *str = NULL; + const char *value = NULL; - active_id = purple_primitive_get_id_from_type(primitive);
+ str = g_list_model_get_item(model, i); + value = gtk_string_object_get_string(str); + candidate = pidgin_status_primitive_chooser_primitive_from_string(value); - gtk_combo_box_set_active_id(GTK_COMBO_BOX(chooser), active_id);
+ if(primitive == candidate) { + gtk_drop_down_set_selected(chooser->chooser, i); --- a/pidgin/pidginstatusprimitivechooser.h Fri Nov 18 00:56:22 2022 -0600
+++ b/pidgin/pidginstatusprimitivechooser.h Fri Nov 18 00:58:22 2022 -0600
@@ -29,6 +29,8 @@
@@ -45,7 +47,7 @@
#define PIDGIN_TYPE_STATUS_PRIMITIVE_CHOOSER (pidgin_status_primitive_chooser_get_type())
G_DECLARE_FINAL_TYPE(PidginStatusPrimitiveChooser,
pidgin_status_primitive_chooser, PIDGIN,
- STATUS_PRIMITIVE_CHOOSER, GtkComboBox)
+ STATUS_PRIMITIVE_CHOOSER, AdwBin) * pidgin_status_primitive_chooser_new:
--- a/pidgin/pidginstatusprimitivestore.c Fri Nov 18 00:56:22 2022 -0600
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,254 +0,0 @@
- * 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
- * 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/>.
-#include <pidgin/pidginstatusprimitivestore.h>
-#include <pidgin/pidginiconname.h>
-struct _PidginStatusPrimitiveStore {
- PurpleAccount *account;
-static GParamSpec *properties[N_PROPERTIES] = { NULL, };
-G_DEFINE_TYPE(PidginStatusPrimitiveStore, pidgin_status_primitive_store,
-/******************************************************************************
- *****************************************************************************/
-pidgin_status_primitive_store_get_primitives_from_account(PidginStatusPrimitiveStore *store)
- GList *primitives = NULL;
- GList *list = purple_account_get_status_types(store->account);
- PurpleStatusType *type = (PurpleStatusType *)list->data;
- PurpleStatusPrimitive primitive;
- gboolean user_settable = FALSE, independent = FALSE;
- /* iterate to the next item as we already have the data in type. */
- user_settable = purple_status_type_is_user_settable(type);
- independent = purple_status_type_is_independent(type);
- if(!user_settable || independent) {
- primitive = purple_status_type_get_primitive(type);
- primitives = g_list_append(primitives, GINT_TO_POINTER(primitive));
-pidgin_status_primitive_store_get_primitives(PidginStatusPrimitiveStore *store)
- GList *primitives = NULL;
- primitives = g_list_append(primitives,
- GINT_TO_POINTER(PURPLE_STATUS_OFFLINE));
- primitives = g_list_append(primitives,
- GINT_TO_POINTER(PURPLE_STATUS_AVAILABLE));
- primitives = g_list_append(primitives,
- GINT_TO_POINTER(PURPLE_STATUS_UNAVAILABLE));
- primitives = g_list_append(primitives,
- GINT_TO_POINTER(PURPLE_STATUS_INVISIBLE));
- primitives = g_list_append(primitives,
- GINT_TO_POINTER(PURPLE_STATUS_AWAY));
- primitives = g_list_append(primitives,
- GINT_TO_POINTER(PURPLE_STATUS_EXTENDED_AWAY));
-pidgin_status_primitive_store_populate(PidginStatusPrimitiveStore *store) {
- GList *primitives = NULL;
- /* clear out the list */
- gtk_list_store_clear(GTK_LIST_STORE(store));
- /* Get all the primitives and add them. */
- if(PURPLE_IS_ACCOUNT(store->account)) {
- primitives = pidgin_status_primitive_store_get_primitives_from_account(store);
- primitives = pidgin_status_primitive_store_get_primitives(store);
- while(primitives != NULL) {
- PurpleStatusPrimitive primitive = GPOINTER_TO_INT(primitives->data);
- gtk_list_store_append(GTK_LIST_STORE(store), &iter);
- GTK_LIST_STORE(store), &iter,
- COL_ID, purple_primitive_get_id_from_type(primitive),
- COL_ICON, pidgin_icon_name_from_status_primitive(primitive, NULL),
- COL_TEXT, purple_primitive_get_name_from_type(primitive),
- primitives = g_list_delete_link(primitives, primitives);
-/******************************************************************************
- * GObject Implementation
- *****************************************************************************/
-pidgin_status_primitive_store_get_property(GObject *obj, guint param_id,
- GValue *value, GParamSpec *pspec)
- PidginStatusPrimitiveStore *store = PIDGIN_STATUS_PRIMITIVE_STORE(obj);
- g_value_set_object(value,
- pidgin_status_primitive_store_get_account(store));
- G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
-pidgin_status_primitive_store_set_property(GObject *obj, guint param_id,
- PidginStatusPrimitiveStore *store = PIDGIN_STATUS_PRIMITIVE_STORE(obj);
- pidgin_status_primitive_store_set_account(store,
- g_value_get_object(value));
- G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
-pidgin_status_primitive_store_dispose(GObject *obj) {
- PidginStatusPrimitiveStore *store = PIDGIN_STATUS_PRIMITIVE_STORE(obj);
- g_clear_object(&store->account);
- G_OBJECT_CLASS(pidgin_status_primitive_store_parent_class)->dispose(obj);
-pidgin_status_primitive_store_constructed(GObject *obj) {
- PidginStatusPrimitiveStore *store = PIDGIN_STATUS_PRIMITIVE_STORE(obj);
- G_OBJECT_CLASS(pidgin_status_primitive_store_parent_class)->constructed(obj);
- /* This exists to populate the store if it was created without a value for
- * the account property.
- pidgin_status_primitive_store_populate(store);
-pidgin_status_primitive_store_init(PidginStatusPrimitiveStore *store) {
- GType types[N_COLUMNS] = { G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING };
- gtk_list_store_set_column_types(GTK_LIST_STORE(store), N_COLUMNS, types);
-pidgin_status_primitive_store_class_init(PidginStatusPrimitiveStoreClass *klass) {
- GObjectClass *obj_class = G_OBJECT_CLASS(klass);
- obj_class->get_property = pidgin_status_primitive_store_get_property;
- obj_class->set_property = pidgin_status_primitive_store_set_property;
- obj_class->constructed = pidgin_status_primitive_store_constructed;
- obj_class->dispose = pidgin_status_primitive_store_dispose;
- * PidginStatusPrimitiveStore:account:
- * The account whose statuses to display.
- properties[PROP_ACCOUNT] = g_param_spec_object(
- "The account whose statuses to display",
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
- g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
-/******************************************************************************
- *****************************************************************************/
-pidgin_status_primitive_store_new(void) {
- return g_object_new(PIDGIN_TYPE_STATUS_PRIMITIVE_STORE, NULL);
-pidgin_status_primitive_store_set_account(PidginStatusPrimitiveStore *store,
- PurpleAccount *account)
- g_return_if_fail(PIDGIN_IS_STATUS_PRIMITIVE_STORE(store));
- if(g_set_object(&store->account, account)) {
- pidgin_status_primitive_store_populate(store);
- g_object_notify_by_pspec(G_OBJECT(store), properties[PROP_ACCOUNT]);
-pidgin_status_primitive_store_get_account(PidginStatusPrimitiveStore *store) {
- g_return_val_if_fail(PIDGIN_IS_STATUS_PRIMITIVE_STORE(store), NULL);
--- a/pidgin/pidginstatusprimitivestore.h Fri Nov 18 00:56:22 2022 -0600
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
- * 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
- * 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"
-#ifndef PIDGIN_STATUS_PRIMITIVE_STORE_H
-#define PIDGIN_STATUS_PRIMITIVE_STORE_H
- * PidginStatusPrimitiveStore:
- * A [class@Gtk.ListStore] for use with [class@PidginStatusPrimitiveChooser].
-#define PIDGIN_TYPE_STATUS_PRIMITIVE_STORE (pidgin_status_primitive_store_get_type())
-G_DECLARE_FINAL_TYPE(PidginStatusPrimitiveStore, pidgin_status_primitive_store,
- PIDGIN, STATUS_PRIMITIVE_STORE, GtkListStore)
- * pidgin_status_primitive_store_new:
- * Creates a new [class@Gtk.ListStore] that contains status primitives in
- * Returns: (transfer full): The new list store.
-GtkListStore *pidgin_status_primitive_store_new(void);
- * pidgin_status_primitive_store_set_account:
- * @store: The status primitive store instance.
- * @account: (nullable): The account to use.
- * Sets the [class@Purple.Account] whose status primitives to show. If %NULL,
- * all status primitives will be displayed.
-void pidgin_status_primitive_store_set_account(PidginStatusPrimitiveStore *store, PurpleAccount *account);
- * pidgin_status_primitive_store_get_account:
- * @store: The store instance.
- * Gets the [class@Purple.Account] that's associated with @store.
- * Returns: (transfer none): The account of %NULL.
-PurpleAccount *pidgin_status_primitive_store_get_account(PidginStatusPrimitiveStore *store);
-#endif /* PIDGIN_STATUS_PRIMITIVE_STORE_H */
--- a/pidgin/resources/Status/editor.ui Fri Nov 18 00:56:22 2022 -0600
+++ b/pidgin/resources/Status/editor.ui Fri Nov 18 00:58:22 2022 -0600
@@ -72,8 +72,6 @@
<object class="PidginStatusPrimitiveChooser" id="primitive">
<property name="hexpand">1</property>
- <property name="id-column">0</property>
- <property name="model">primitive_store</property>
@@ -160,5 +158,4 @@
<object class="TalkatuHtmlBuffer" id="buffer"/>
- <object class="PidginStatusPrimitiveStore" id="primitive_store"/>
--- a/pidgin/resources/statusprimitivechooser.ui Fri Nov 18 00:56:22 2022 -0600
+++ b/pidgin/resources/statusprimitivechooser.ui Fri Nov 18 00:58:22 2022 -0600
@@ -24,19 +24,60 @@
<!-- interface-name Pidgin -->
<!-- interface-description Internet Messenger -->
<!-- interface-copyright Pidgin Developers <devel@pidgin.im> -->
- <template class="PidginStatusPrimitiveChooser" parent="GtkComboBox">
- <property name="id-column">0</property>
- <object class="GtkCellRendererPixbuf"/>
- <attribute name="icon-name">1</attribute>
- <object class="GtkCellRendererText"/>
- <attribute name="markup">2</attribute>
+ <template class="PidginStatusPrimitiveChooser" parent="AdwBin"> + <property name="child"> + <object class="GtkDropDown" id="chooser"> + <property name="factory"> + <object class="GtkBuilderListItemFactory"> + <property name="bytes"> +<?xml version="1.0" encoding="UTF-8"?> + <template class="GtkListItem"> + <property name="child"> + <object class="GtkBox"> + <property name="orientation">horizontal</property> + <property name="spacing">6</property> + <object class="GtkImage"> + <binding name="icon-name"> + <closure type="gchararray" function="pidgin_status_primitive_chooser_icon_name_cb"> + <lookup name="item">GtkListItem</lookup> + <object class="GtkLabel"> + <property name="xalign">0</property> + <closure type="gchararray" function="pidgin_status_primitive_chooser_label_cb"> + <lookup name="item">GtkListItem</lookup> + <property name="model"> + <object class="GtkStringList"> + <item>unavailable</item> + <item>extended-away</item> --- a/po/POTFILES.in Fri Nov 18 00:56:22 2022 -0600
+++ b/po/POTFILES.in Fri Nov 18 00:58:22 2022 -0600
@@ -294,7 +294,6 @@
pidgin/pidginstatuseditor.c
pidgin/pidginstatusmanager.c
pidgin/pidginstatusprimitivechooser.c
-pidgin/pidginstatusprimitivestore.c
pidgin/plugins/disco/gtkdisco.c
pidgin/plugins/disco/resources/disco.ui