static void pidgin_mini_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object); PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); switch (property_id) { case PROP_TITLE: mini_dialog_set_title(self, g_value_get_string(value)); break; case PROP_DESCRIPTION: mini_dialog_set_description(self, g_value_get_string(value)); break; case PROP_ICON_NAME: gtk_image_set_from_stock(priv->icon, g_value_get_string(value), gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); break; case PROP_CUSTOM_ICON: gtk_image_set_from_pixbuf(priv->icon, g_value_get_object(value)); break; case PROP_ENABLE_DESCRIPTION_MARKUP: priv->enable_description_markup = g_value_get_boolean(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } }
static void mini_dialog_set_description(PidginMiniDialog *self, const char *description) { PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); if(description) { 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); g_free(desc_esc); g_free(desc_markup); gtk_widget_show(GTK_WIDGET(priv->desc)); g_object_set(G_OBJECT(priv->desc), "no-show-all", FALSE, NULL); } else { 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); } }
static void pidgin_mini_dialog_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object); PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); switch (property_id) { case PROP_TITLE: g_value_set_string(value, gtk_label_get_text(priv->title)); break; case PROP_DESCRIPTION: g_value_set_string(value, gtk_label_get_text(priv->desc)); break; case PROP_ICON_NAME: { gchar *icon_name = NULL; GtkIconSize size; gtk_image_get_stock(priv->icon, &icon_name, &size); g_value_set_string(value, icon_name); break; } case PROP_CUSTOM_ICON: g_value_set_object(value, gtk_image_get_pixbuf(priv->icon)); break; case PROP_ENABLE_DESCRIPTION_MARKUP: g_value_set_boolean(value, priv->enable_description_markup); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } }
static void mini_dialog_add_button(PidginMiniDialog *self, const char *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); char *button_text = g_strdup_printf("<span size=\"smaller\">%s</span>", text); gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), button_text); g_free(button_text); 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); gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5); gtk_container_add(GTK_CONTAINER(button), label); gtk_box_pack_end(GTK_BOX(priv->buttons), button, FALSE, FALSE, 0); gtk_widget_show_all(GTK_WIDGET(button)); }
static void blist_width_changed_cb(const char *name, PurplePrefType type, gconstpointer val, gpointer data) { PidginMiniDialog *self = PIDGIN_MINI_DIALOG(data); PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); guint blist_width = GPOINTER_TO_INT(val); guint label_width = blist_width - BLIST_WIDTH_OTHER_THAN_LABEL; gtk_widget_set_size_request(GTK_WIDGET(priv->title), label_width, -1); gtk_widget_set_size_request(GTK_WIDGET(priv->desc), label_width, -1); }
static void pidgin_mini_dialog_finalize(GObject *object) { PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object); PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); if (priv->idle_destroy_cb_id) g_source_remove(priv->idle_destroy_cb_id); g_free(priv); self->priv = NULL; purple_prefs_disconnect_by_handle(self); G_OBJECT_CLASS (pidgin_mini_dialog_parent_class)->finalize (object); }
static void mini_dialog_set_title(PidginMiniDialog *self, const char *title) { 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_free(title_esc); g_free(title_markup); }
static void mini_dialog_button_clicked_cb(GtkButton *button, gpointer user_data) { struct _mini_dialog_button_clicked_cb_data *data = user_data; PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(data->mini_dialog); /* Set up the destruction callback before calling the clicked callback, * so that if the mini-dialog gets destroyed during the clicked callback * the idle_destroy_cb is correctly removed by _finalize. */ priv->idle_destroy_cb_id = g_idle_add((GSourceFunc) idle_destroy_cb, data->mini_dialog); if (data->callback != NULL) data->callback(data->mini_dialog, button, data->user_data); }
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); }