| 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." |