diff -r 5501dd769dc5 -r 7ebf5dd7d969 gtk/gtkutils.c
--- a/gtk/gtkutils.c Wed Nov 22 21:33:51 2006 +0000
+++ b/gtk/gtkutils.c Thu Nov 23 08:37:07 2006 +0000
@@ -2851,3 +2851,114 @@
return ret;
}
+
+GSList *minidialogs = NULL;
+
+static void *
+gaim_gtk_utils_get_handle()
+{
+ static int handle;
+
+ return &handle;
+}
+
+static void connection_signed_off_cb(GaimConnection *gc)
+{
+ GSList *list;
+ for (list = minidialogs; list; list = list->next) {
+ if (g_object_get_data(G_OBJECT(list->data), "gc") == gc) {
+ gtk_widget_destroy(GTK_WIDGET(list->data));
+ }
+ }
+}
+
+static void alert_killed_cb(GtkWidget *widget)
+{
+ minidialogs = g_slist_remove(minidialogs, widget);
+}
+
+void *gaim_gtk_make_mini_dialog(GaimConnection *gc, const char *icon_name,
+ const char *primary, const char *secondary,
+ void *user_data, ...)
+{
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *bbox;
+ GtkWidget *label;
+ GtkWidget *button;
+ GtkWidget *img = NULL;
+ char label_text[2048];
+ const char *button_text;
+ GCallback callback;
+ char *primary_esc, *secondary_esc;
+ va_list args;
+ static gboolean first_call = TRUE;
+
+ img = gtk_image_new_from_stock(icon_name, GTK_ICON_SIZE_BUTTON);
+ gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
+
+ vbox = gtk_vbox_new(FALSE,0);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
+
+ g_object_set_data(G_OBJECT(vbox), "gc" ,gc);
+ minidialogs = g_slist_prepend(minidialogs, vbox);
+ g_signal_connect(G_OBJECT(vbox), "destroy", G_CALLBACK(alert_killed_cb), NULL);
+
+ if (first_call) {
+ first_call = FALSE;
+ gaim_signal_connect(gaim_connections_get_handle(), "signed-off",
+ gaim_gtk_utils_get_handle(),
+ GAIM_CALLBACK(connection_signed_off_cb), NULL);
+ }
+
+ hbox = gtk_hbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(vbox), hbox);
+
+ if (img != NULL)
+ gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
+
+ primary_esc = g_markup_escape_text(primary, -1);
+
+ if (secondary)
+ secondary_esc = g_markup_escape_text(secondary, -1);
+ g_snprintf(label_text, sizeof(label_text),
+ "%s%s%s",
+ primary_esc, secondary ? "\n" : "", secondary?secondary_esc:"");
+ g_free(primary_esc);
+ label = gtk_label_new(NULL);
+ gtk_widget_modify_text(vbox, GTK_STATE_NORMAL, &(label->style->white));
+ gtk_label_set_markup(GTK_LABEL(label), label_text);
+ gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+#if GTK_CHECK_VERSION(2,6,0)
+ g_object_set(label, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+#endif
+
+ bbox = gtk_hbutton_box_new();
+ gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+ gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+ gtk_box_set_spacing(GTK_BOX(bbox), 6);
+
+ va_start(args, user_data);
+ while ((button_text = va_arg(args, char*))) {
+ callback = va_arg(args, GCallback);
+ button = gtk_button_new();
+ gtk_container_set_border_width(GTK_CONTAINER(button), 0);
+ if (callback)
+ g_signal_connect_swapped(G_OBJECT(button), "clicked", callback, user_data);
+ g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), vbox);
+ hbox = gtk_hbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(button), hbox);
+ g_snprintf(label_text, sizeof(label_text),
+ "%s", button_text);
+ label = gtk_label_new(NULL);
+ gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), label_text);
+ gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
+ gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+ gtk_container_add(GTK_CONTAINER(bbox), button);
+ }
+ va_end(args);
+
+ return vbox;
+}