--- a/pidgin/minidialog.c Fri Jul 02 21:33:49 2021 -0500
+++ b/pidgin/minidialog.c Sat Jul 03 02:44:56 2021 -0500
@@ -25,57 +25,19 @@
-static void pidgin_mini_dialog_init (PidginMiniDialog *self);
-static void pidgin_mini_dialog_class_init (PidginMiniDialogClass *klass);
-static gpointer pidgin_mini_dialog_parent_class = NULL;
-pidgin_mini_dialog_class_intern_init (gpointer klass)
- pidgin_mini_dialog_parent_class = g_type_class_peek_parent (klass);
- pidgin_mini_dialog_class_init ((PidginMiniDialogClass*) klass);
-pidgin_mini_dialog_get_type (void)
- static GType g_define_type_id = 0;
- if (g_define_type_id == 0)
- static const GTypeInfo g_define_type_info = {
- sizeof (PidginMiniDialogClass),
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) pidgin_mini_dialog_class_intern_init,
- (GClassFinalizeFunc) NULL,
- sizeof (PidginMiniDialog),
- (GInstanceInitFunc) pidgin_mini_dialog_init,
- g_define_type_id = g_type_register_static(GTK_TYPE_BOX,
- "PidginMiniDialog", &g_define_type_info, 0);
- return g_define_type_id;
PROP_ENABLE_DESCRIPTION_MARKUP,
-} HazeConnectionProperties;
-static GParamSpec *properties[LAST_PROPERTY];
+static GParamSpec *properties[PROP_LAST] = {NULL};
@@ -86,94 +48,18 @@
guint idle_destroy_cb_id;
} PidginMiniDialogPrivate;
-#define PIDGIN_MINI_DIALOG_GET_PRIVATE(dialog) \
- ((PidginMiniDialogPrivate *) ((dialog)->priv))
-static PidginMiniDialog *
-mini_dialog_new(const gchar *title, const gchar *description)
- return g_object_new(PIDGIN_TYPE_MINI_DIALOG,
- "description", description,
-pidgin_mini_dialog_new(const gchar *title,
- const gchar *description,
- const gchar *icon_name)
- PidginMiniDialog *mini_dialog = mini_dialog_new(title, description);
- pidgin_mini_dialog_set_icon_name(mini_dialog, icon_name);
-pidgin_mini_dialog_new_with_custom_icon(const gchar *title,
- const gchar *description,
- GdkPixbuf *custom_icon)
- PidginMiniDialog *mini_dialog = mini_dialog_new(title, description);
- pidgin_mini_dialog_set_custom_icon(mini_dialog, custom_icon);
+G_DEFINE_TYPE_WITH_PRIVATE(PidginMiniDialog, pidgin_mini_dialog, GTK_TYPE_BOX)
-pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialog,
- g_object_set(G_OBJECT(mini_dialog), "title", title, NULL);
-pidgin_mini_dialog_set_description(PidginMiniDialog *mini_dialog,
- const char *description)
- g_object_set(G_OBJECT(mini_dialog), "description", description, NULL);
-pidgin_mini_dialog_enable_description_markup(PidginMiniDialog *mini_dialog)
- g_object_set(G_OBJECT(mini_dialog), "enable-description-markup", TRUE, NULL);
-void pidgin_mini_dialog_set_link_callback(PidginMiniDialog *mini_dialog, GCallback cb, gpointer user_data)
- g_signal_connect(PIDGIN_MINI_DIALOG_GET_PRIVATE(mini_dialog)->desc, "activate-link", cb, user_data);
-pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog,
- g_object_set(G_OBJECT(mini_dialog), "icon-name", icon_name, NULL);
-pidgin_mini_dialog_set_custom_icon(PidginMiniDialog *mini_dialog, GdkPixbuf *custom_icon)
- g_object_set(G_OBJECT(mini_dialog), "custom-icon", custom_icon, NULL);
-struct _mini_dialog_button_clicked_cb_data
+struct _mini_dialog_button_clicked_cb_data { PidginMiniDialog *mini_dialog;
PidginMiniDialogCallback callback;
gboolean close_dialog_after_click;
-pidgin_mini_dialog_get_num_children(PidginMiniDialog *mini_dialog)
- tmp = gtk_container_get_children(GTK_CONTAINER(mini_dialog->contents));
- len = g_list_length(tmp);
+/****************************************************************************** + *****************************************************************************/ idle_destroy_cb(GtkWidget *mini_dialog)
@@ -188,7 +74,7 @@
struct _mini_dialog_button_clicked_cb_data *data = user_data;
PidginMiniDialogPrivate *priv =
- PIDGIN_MINI_DIALOG_GET_PRIVATE(data->mini_dialog);
+ pidgin_mini_dialog_get_instance_private(data->mini_dialog); if (data->close_dialog_after_click) {
/* Set up the destruction callback before calling the clicked callback,
@@ -196,84 +82,115 @@
* the idle_destroy_cb is correctly removed by _finalize.
priv->idle_destroy_cb_id =
- g_idle_add((GSourceFunc) idle_destroy_cb, data->mini_dialog);
+ g_idle_add((GSourceFunc)idle_destroy_cb, data->mini_dialog); - if (data->callback != NULL)
+ if (data->callback != NULL) { data->callback(data->mini_dialog, button, data->user_data);
-mini_dialog_button_destroy_cb(GtkButton *button,
- struct _mini_dialog_button_clicked_cb_data *data = user_data;
+/****************************************************************************** + *****************************************************************************/ -mini_dialog_add_button(PidginMiniDialog *self,
- PidginMiniDialogCallback clicked_cb,
+mini_dialog_add_button(PidginMiniDialog *self, const gchar *text, + PidginMiniDialogCallback clicked_cb, gpointer user_data, gboolean close_dialog_after_click)
- PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
- struct _mini_dialog_button_clicked_cb_data *callback_data
- = g_new0(struct _mini_dialog_button_clicked_cb_data, 1);
- GtkWidget *button = gtk_button_new();
- GtkWidget *label = gtk_label_new(NULL);
- g_strdup_printf("<span size=\"smaller\">%s</span>", text);
+ PidginMiniDialogPrivate *priv = + pidgin_mini_dialog_get_instance_private(self); + struct _mini_dialog_button_clicked_cb_data *callback_data = NULL; + GtkWidget *button = NULL; + GtkWidget *label = NULL; + char *button_text = NULL; + label = gtk_label_new(NULL); + button_text = g_strdup_printf("<span size=\"smaller\">%s</span>", text); gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), button_text);
+ callback_data = g_new0(struct _mini_dialog_button_clicked_cb_data, 1); callback_data->mini_dialog = self;
callback_data->callback = clicked_cb;
callback_data->user_data = user_data;
callback_data->close_dialog_after_click = close_dialog_after_click;
- g_signal_connect(G_OBJECT(button), "clicked",
- (GCallback) mini_dialog_button_clicked_cb, callback_data);
- g_signal_connect(G_OBJECT(button), "destroy",
- (GCallback) mini_dialog_button_destroy_cb, callback_data);
+ button = gtk_button_new(); gtk_container_add(GTK_CONTAINER(button), label);
+ g_signal_connect_data(G_OBJECT(button), "clicked", + G_CALLBACK(mini_dialog_button_clicked_cb), + callback_data, (GClosureNotify)g_free, 0); - gtk_box_pack_end(GTK_BOX(priv->buttons), button, FALSE, FALSE,
- gtk_widget_show_all(GTK_WIDGET(button));
+ gtk_box_pack_end(GTK_BOX(priv->buttons), button, FALSE, FALSE, 0); + gtk_widget_show_all(button);
-pidgin_mini_dialog_add_button(PidginMiniDialog *self,
- PidginMiniDialogCallback clicked_cb,
+mini_dialog_set_title(PidginMiniDialog *self, const gchar *title) - mini_dialog_add_button(self, text, clicked_cb, user_data, TRUE);
+ PidginMiniDialogPrivate *priv = + pidgin_mini_dialog_get_instance_private(self);
-pidgin_mini_dialog_add_non_closing_button(PidginMiniDialog *self,
- PidginMiniDialogCallback clicked_cb,
- mini_dialog_add_button(self, text, clicked_cb, user_data, FALSE);
+ gchar *title_esc = g_markup_escape_text(title, -1); + gchar *title_markup = g_strdup_printf( + "<span weight=\"bold\" size=\"smaller\">%s</span>", + title_esc ? title_esc : ""); + gtk_label_set_markup(priv->title, title_markup); + g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_TITLE]); -pidgin_mini_dialog_get_property(GObject *object,
+mini_dialog_set_description(PidginMiniDialog *self, const gchar *description) + PidginMiniDialogPrivate *priv = + pidgin_mini_dialog_get_instance_private(self); + gchar *desc_esc, *desc_markup; + desc_esc = priv->enable_description_markup + ? g_strdup(description) + : g_markup_escape_text(description, -1); + desc_markup = g_strdup_printf("<span size=\"smaller\">%s</span>", + gtk_label_set_markup(priv->desc, desc_markup); + gtk_widget_show(GTK_WIDGET(priv->desc)); + g_object_set(G_OBJECT(priv->desc), "no-show-all", FALSE, NULL); + gtk_label_set_text(priv->desc, NULL); + gtk_widget_hide(GTK_WIDGET(priv->desc)); + /* make calling show_all() on the minidialog not affect desc + * even though it's packed inside it. + g_object_set(G_OBJECT(priv->desc), "no-show-all", TRUE, NULL); + g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_DESCRIPTION]); +/****************************************************************************** + * GObject Implementation + *****************************************************************************/ +pidgin_mini_dialog_get_property(GObject *obj, guint param_id, GValue *value, - PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
- PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+ PidginMiniDialog *self = PIDGIN_MINI_DIALOG(obj); + PidginMiniDialogPrivate *priv = + pidgin_mini_dialog_get_instance_private(self);
g_value_set_string(value, gtk_label_get_text(priv->title));
@@ -294,71 +211,21 @@
g_value_set_boolean(value, priv->enable_description_markup);
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); -mini_dialog_set_title(PidginMiniDialog *self,
- PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
- char *title_esc = g_markup_escape_text(title, -1);
- char *title_markup = g_strdup_printf(
- "<span weight=\"bold\" size=\"smaller\">%s</span>",
- title_esc ? title_esc : "");
- gtk_label_set_markup(priv->title, title_markup);
- g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_TITLE]);
-mini_dialog_set_description(PidginMiniDialog *self,
- const char *description)
- PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
- char *desc_esc = priv->enable_description_markup ? g_strdup(description) : g_markup_escape_text(description, -1);
- char *desc_markup = g_strdup_printf(
- "<span size=\"smaller\">%s</span>", desc_esc);
- gtk_label_set_markup(priv->desc, desc_markup);
- gtk_widget_show(GTK_WIDGET(priv->desc));
- g_object_set(G_OBJECT(priv->desc), "no-show-all", FALSE, NULL);
- gtk_label_set_text(priv->desc, NULL);
- gtk_widget_hide(GTK_WIDGET(priv->desc));
- /* make calling show_all() on the minidialog not affect desc
- * even though it's packed inside it.
- g_object_set(G_OBJECT(priv->desc), "no-show-all", TRUE, NULL);
- g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_DESCRIPTION]);
-pidgin_mini_dialog_set_property(GObject *object,
+pidgin_mini_dialog_set_property(GObject *obj, guint param_id, - PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
- PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+ PidginMiniDialog *self = PIDGIN_MINI_DIALOG(obj); + PidginMiniDialogPrivate *priv = + pidgin_mini_dialog_get_instance_private(self);
mini_dialog_set_title(self, g_value_get_string(value));
@@ -377,74 +244,70 @@
priv->enable_description_markup = g_value_get_boolean(value);
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); -pidgin_mini_dialog_finalize(GObject *object)
+pidgin_mini_dialog_finalize(GObject *obj) - PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
- PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+ PidginMiniDialog *self = PIDGIN_MINI_DIALOG(obj); + PidginMiniDialogPrivate *priv = + pidgin_mini_dialog_get_instance_private(self); - if (priv->idle_destroy_cb_id)
+ if (priv->idle_destroy_cb_id) { g_source_remove(priv->idle_destroy_cb_id);
purple_prefs_disconnect_by_handle(self);
- G_OBJECT_CLASS (pidgin_mini_dialog_parent_class)->finalize (object);
+ G_OBJECT_CLASS(pidgin_mini_dialog_parent_class)->finalize(obj); pidgin_mini_dialog_class_init(PidginMiniDialogClass *klass)
- GObjectClass *object_class = G_OBJECT_CLASS(klass);
+ GObjectClass *obj_class = G_OBJECT_CLASS(klass); - object_class->get_property = pidgin_mini_dialog_get_property;
- object_class->set_property = pidgin_mini_dialog_set_property;
- object_class->finalize = pidgin_mini_dialog_finalize;
+ obj_class->get_property = pidgin_mini_dialog_get_property; + obj_class->set_property = pidgin_mini_dialog_set_property; + obj_class->finalize = pidgin_mini_dialog_finalize; - properties[PROP_TITLE] = g_param_spec_string("title",
+ properties[PROP_TITLE] = g_param_spec_string( "String specifying the mini-dialog's title", NULL,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
- properties[PROP_DESCRIPTION] = g_param_spec_string("description",
+ properties[PROP_DESCRIPTION] = g_param_spec_string( + "description", "description", "Description text for the mini-dialog, if desired", NULL,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
- properties[PROP_ICON_NAME] = g_param_spec_string("icon-name",
- "String specifying the GtkIconTheme name of the dialog's icon",
+ properties[PROP_ICON_NAME] = g_param_spec_string( + "icon-name", "icon-name", + "String specifying the GtkIconTheme name of the dialog's icon", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
- properties[PROP_CUSTOM_ICON] = g_param_spec_object("custom-icon",
- "Pixbuf to use as the dialog's icon",
+ properties[PROP_CUSTOM_ICON] = g_param_spec_object( + "custom-icon", "custom-icon", + "Pixbuf to use as the dialog's icon", GDK_TYPE_PIXBUF, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
- properties[PROP_ENABLE_DESCRIPTION_MARKUP] =
- g_param_spec_boolean("enable-description-markup",
- "enable-description-markup",
+ properties[PROP_ENABLE_DESCRIPTION_MARKUP] = g_param_spec_boolean( + "enable-description-markup", "enable-description-markup", "Use GMarkup in the description text", FALSE,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
- g_object_class_install_properties(object_class, LAST_PROPERTY, properties);
+ g_object_class_install_properties(obj_class, PROP_LAST, properties); pidgin_mini_dialog_init(PidginMiniDialog *self)
GtkBox *self_box = GTK_BOX(self);
- PidginMiniDialogPrivate *priv = g_new0(PidginMiniDialogPrivate, 1);
+ PidginMiniDialogPrivate *priv = + pidgin_mini_dialog_get_instance_private(self); gtk_orientable_set_orientation(GTK_ORIENTABLE(self), GTK_ORIENTATION_VERTICAL);
@@ -486,3 +349,124 @@
gtk_widget_show_all(GTK_WIDGET(self));
+/****************************************************************************** + *****************************************************************************/ +pidgin_mini_dialog_new(const gchar *title, + const gchar *description, + const gchar *icon_name) + PidginMiniDialog *mini_dialog = g_object_new(PIDGIN_TYPE_MINI_DIALOG, + "description", description, + "icon-name", icon_name, +pidgin_mini_dialog_new_with_custom_icon(const gchar *title, + const gchar *description, + GdkPixbuf *custom_icon) + PidginMiniDialog *mini_dialog = g_object_new(PIDGIN_TYPE_MINI_DIALOG, + "description", description, + "custom-icon", custom_icon, +pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialog, const gchar *title) + g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog)); + g_object_set(G_OBJECT(mini_dialog), "title", title, NULL); +pidgin_mini_dialog_set_description(PidginMiniDialog *mini_dialog, + const gchar *description) + g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog)); + g_object_set(G_OBJECT(mini_dialog), "description", description, NULL); +pidgin_mini_dialog_enable_description_markup(PidginMiniDialog *mini_dialog) + g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog)); + g_object_set(G_OBJECT(mini_dialog), "enable-description-markup", TRUE, NULL); +pidgin_mini_dialog_set_link_callback(PidginMiniDialog *mini_dialog, + GCallback cb, gpointer user_data) + PidginMiniDialogPrivate *priv = NULL; + g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog)); + priv = pidgin_mini_dialog_get_instance_private(mini_dialog); + g_signal_connect(priv->desc, "activate-link", cb, user_data); +pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog, + const gchar *icon_name) + g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog)); + g_object_set(G_OBJECT(mini_dialog), "icon-name", icon_name, NULL); +pidgin_mini_dialog_set_custom_icon(PidginMiniDialog *mini_dialog, + GdkPixbuf *custom_icon) + g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog)); + g_object_set(G_OBJECT(mini_dialog), "custom-icon", custom_icon, NULL); +pidgin_mini_dialog_get_num_children(PidginMiniDialog *mini_dialog) + g_return_val_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog), 0); + tmp = gtk_container_get_children(GTK_CONTAINER(mini_dialog->contents)); + len = g_list_length(tmp); +pidgin_mini_dialog_add_button(PidginMiniDialog *mini_dialog, + PidginMiniDialogCallback clicked_cb, + g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog)); + mini_dialog_add_button(mini_dialog, text, clicked_cb, user_data, TRUE); +pidgin_mini_dialog_add_non_closing_button(PidginMiniDialog *mini_dialog, + PidginMiniDialogCallback clicked_cb, + g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog)); + mini_dialog_add_button(mini_dialog, text, clicked_cb, user_data, FALSE); --- a/pidgin/minidialog.h Fri Jul 02 21:33:49 2021 -0500
+++ b/pidgin/minidialog.h Sat Jul 03 02:44:56 2021 -0500
@@ -23,8 +23,8 @@
# error "only <pidgin.h> may be included directly"
-#ifndef __PIDGIN_MINI_DIALOG_H__
-#define __PIDGIN_MINI_DIALOG_H__
+#ifndef PIDGIN_MINI_DIALOG_H +#define PIDGIN_MINI_DIALOG_H * @section_id: pidgin-minidialog
@@ -37,27 +37,8 @@
-#define PIDGIN_TYPE_MINI_DIALOG pidgin_mini_dialog_get_type()
-#define PIDGIN_MINI_DIALOG(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
- PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialog))
-#define PIDGIN_MINI_DIALOG_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), \
- PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialogClass))
-#define PIDGIN_IS_MINI_DIALOG(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
- PIDGIN_TYPE_MINI_DIALOG))
-#define PIDGIN_IS_MINI_DIALOG_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), \
- PIDGIN_TYPE_MINI_DIALOG))
-#define PIDGIN_MINI_DIALOG_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS ((obj), \
- PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialogClass))
+#define PIDGIN_TYPE_MINI_DIALOG (pidgin_mini_dialog_get_type()) +G_DECLARE_FINAL_TYPE(PidginMiniDialog, pidgin_mini_dialog, PIDGIN, MINI_DIALOG, GtkBox) @@ -93,28 +74,12 @@
+struct _PidginMiniDialog {
- * PidginMiniDialogClass:
- * The class of #PidginMiniDialog objects.
- GtkBoxClass parent_class;
- void (*_purple_reserved1) (void);
- void (*_purple_reserved2) (void);
- void (*_purple_reserved3) (void);
- void (*_purple_reserved4) (void);
-} PidginMiniDialogClass;
* PidginMiniDialogCallback:
@@ -134,7 +99,6 @@
* Get the GType of #PidginMiniDialog.
-GType pidgin_mini_dialog_get_type (void);
* pidgin_mini_dialog_new:
@@ -167,7 +131,7 @@
* Shortcut for setting a mini-dialog's title via GObject properties.
void pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialog,
* pidgin_mini_dialog_set_description:
@@ -178,7 +142,7 @@
* Shortcut for setting a mini-dialog's description via GObject properties.
void pidgin_mini_dialog_set_description(PidginMiniDialog *mini_dialog,
- const char *description);
+ const gchar *description); * pidgin_mini_dialog_enable_description_markup:
@@ -206,7 +170,7 @@
* Shortcut for setting a mini-dialog's icon via GObject properties.
void pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog,
- const char *icon_name);
+ const gchar *icon_name); * pidgin_mini_dialog_set_custom_icon:
@@ -231,7 +195,7 @@
void pidgin_mini_dialog_add_button(PidginMiniDialog *mini_dialog,
- const char *text, PidginMiniDialogCallback clicked_cb,
+ const gchar *text, PidginMiniDialogCallback clicked_cb, @@ -246,7 +210,7 @@
* is that the mini-dialog won't be closed after the button is clicked.
void pidgin_mini_dialog_add_non_closing_button(PidginMiniDialog *mini_dialog,
- const char *text, PidginMiniDialogCallback clicked_cb,
+ const gchar *text, PidginMiniDialogCallback clicked_cb, @@ -261,4 +225,4 @@
-#endif /* __PIDGIN_MINI_DIALOG_H__ */
+#endif /* PIDGIN_MINI_DIALOG_H */