pidgin/gtkutils.c

branch
cpw.resiak.disconnectreason
changeset 21323
0ad61638683f
parent 21320
047bd168d98c
child 21326
62bb702f824a
equal deleted inserted replaced
21322:d81c71e84543 21323:0ad61638683f
59 #include "gtkimhtml.h" 59 #include "gtkimhtml.h"
60 #include "gtkimhtmltoolbar.h" 60 #include "gtkimhtmltoolbar.h"
61 #include "pidginstock.h" 61 #include "pidginstock.h"
62 #include "gtkthemes.h" 62 #include "gtkthemes.h"
63 #include "gtkutils.h" 63 #include "gtkutils.h"
64 #include "pidgin/minidialog.h"
64 65
65 typedef struct { 66 typedef struct {
66 GtkWidget *menu; 67 GtkWidget *menu;
67 gint default_item; 68 gint default_item;
68 } AopMenu; 69 } AopMenu;
2906 static void alert_killed_cb(GtkWidget *widget) 2907 static void alert_killed_cb(GtkWidget *widget)
2907 { 2908 {
2908 minidialogs = g_slist_remove(minidialogs, widget); 2909 minidialogs = g_slist_remove(minidialogs, widget);
2909 } 2910 }
2910 2911
2912 struct _old_button_clicked_cb_data
2913 {
2914 PidginUtilMiniDialogCallback cb;
2915 gpointer data;
2916 };
2917
2918 static void
2919 old_mini_dialog_button_clicked_cb(PidginMiniDialog *mini_dialog,
2920 GtkButton *button,
2921 gpointer user_data)
2922 {
2923 struct _old_button_clicked_cb_data *data = user_data;
2924 data->cb(data->data, button);
2925 g_free(data);
2926 }
2927
2911 GtkWidget * 2928 GtkWidget *
2912 pidgin_make_mini_dialog(PurpleConnection *gc, 2929 pidgin_make_mini_dialog(PurpleConnection *gc,
2913 const char *icon_name, 2930 const char *icon_name,
2914 const char *primary, 2931 const char *primary,
2915 const char *secondary, 2932 const char *secondary,
2916 void *user_data, 2933 void *user_data,
2917 ...) 2934 ...)
2918 { 2935 {
2919 GtkWidget *vbox; 2936 PidginMiniDialog *mini_dialog;
2920 GtkWidget *hbox;
2921 GtkWidget *hbox2;
2922 GtkWidget *label;
2923 GtkWidget *button;
2924 GtkWidget *img = NULL;
2925 char label_text[2048];
2926 const char *button_text; 2937 const char *button_text;
2927 GCallback callback;
2928 char *primary_esc, *secondary_esc = NULL;
2929 va_list args; 2938 va_list args;
2930 static gboolean first_call = TRUE; 2939 static gboolean first_call = TRUE;
2931
2932 img = gtk_image_new_from_stock(icon_name, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
2933 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
2934
2935 vbox = gtk_vbox_new(FALSE,0);
2936 gtk_container_set_border_width(GTK_CONTAINER(vbox), PIDGIN_HIG_BOX_SPACE);
2937
2938 g_object_set_data(G_OBJECT(vbox), "gc" ,gc);
2939 minidialogs = g_slist_prepend(minidialogs, vbox);
2940 g_signal_connect(G_OBJECT(vbox), "destroy", G_CALLBACK(alert_killed_cb), NULL);
2941 2940
2942 if (first_call) { 2941 if (first_call) {
2943 first_call = FALSE; 2942 first_call = FALSE;
2944 purple_signal_connect(purple_connections_get_handle(), "signed-off", 2943 purple_signal_connect(purple_connections_get_handle(), "signed-off",
2945 pidgin_utils_get_handle(), 2944 pidgin_utils_get_handle(),
2946 PURPLE_CALLBACK(connection_signed_off_cb), NULL); 2945 PURPLE_CALLBACK(connection_signed_off_cb), NULL);
2947 } 2946 }
2948 2947
2949 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 2948 mini_dialog = pidgin_mini_dialog_new(primary, secondary, icon_name);
2950 gtk_container_add(GTK_CONTAINER(vbox), hbox); 2949 g_object_set_data(G_OBJECT(mini_dialog), "gc" ,gc);
2951 2950 g_signal_connect(G_OBJECT(mini_dialog), "destroy",
2952 if (img != NULL) 2951 G_CALLBACK(alert_killed_cb), NULL);
2953 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
2954
2955 primary_esc = g_markup_escape_text(primary, -1);
2956
2957 if (secondary)
2958 secondary_esc = g_markup_escape_text(secondary, -1);
2959 g_snprintf(label_text, sizeof(label_text),
2960 "<span weight=\"bold\" size=\"smaller\">%s</span>%s<span size=\"smaller\">%s</span>",
2961 primary_esc, secondary ? "\n" : "", secondary_esc ? secondary_esc : "");
2962 g_free(primary_esc);
2963 g_free(secondary_esc);
2964 label = gtk_label_new(NULL);
2965 gtk_widget_set_size_request(label, purple_prefs_get_int(PIDGIN_PREFS_ROOT "/blist/width")-25,-1);
2966 gtk_label_set_markup(GTK_LABEL(label), label_text);
2967 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
2968 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
2969 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
2970
2971 hbox2 = gtk_hbox_new(FALSE, 0);
2972 gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
2973 2952
2974 va_start(args, user_data); 2953 va_start(args, user_data);
2975 while ((button_text = va_arg(args, char*))) { 2954 while ((button_text = va_arg(args, char*))) {
2976 callback = va_arg(args, GCallback); 2955 PidginUtilMiniDialogCallback callback =
2977 button = gtk_button_new(); 2956 va_arg(args, PidginUtilMiniDialogCallback);
2978 2957 struct _old_button_clicked_cb_data *data =
2979 if (callback) 2958 g_new0(struct _old_button_clicked_cb_data, 1);
2980 g_signal_connect_swapped(G_OBJECT(button), "clicked", callback, user_data); 2959 data->cb = callback;
2981 g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), vbox); 2960 data->data = user_data;
2982 hbox = gtk_hbox_new(FALSE, 0); 2961 pidgin_mini_dialog_add_button(mini_dialog, button_text,
2983 gtk_container_add(GTK_CONTAINER(button), hbox); 2962 old_mini_dialog_button_clicked_cb, data);
2984 gtk_container_set_border_width(GTK_CONTAINER(hbox), 0);
2985 g_snprintf(label_text, sizeof(label_text),
2986 "<span size=\"smaller\">%s</span>", button_text);
2987 label = gtk_label_new(NULL);
2988 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), label_text);
2989 gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
2990 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
2991 gtk_box_pack_end(GTK_BOX(hbox2), button, FALSE, FALSE, 0);
2992 } 2963 }
2993 va_end(args); 2964 va_end(args);
2994 2965
2995 return vbox; 2966 return GTK_WIDGET(mini_dialog);
2996 } 2967 }
2997 2968
2998 /* 2969 /*
2999 * "This is so dead sexy." 2970 * "This is so dead sexy."
3000 * "Two thumbs up." 2971 * "Two thumbs up."

mercurial