| 2849 ret = g_strjoinv("\342\207\246", split); |
2849 ret = g_strjoinv("\342\207\246", split); |
| 2850 g_strfreev(split); |
2850 g_strfreev(split); |
| 2851 |
2851 |
| 2852 return ret; |
2852 return ret; |
| 2853 } |
2853 } |
| |
2854 |
| |
2855 GSList *minidialogs = NULL; |
| |
2856 |
| |
2857 static void * |
| |
2858 gaim_gtk_utils_get_handle() |
| |
2859 { |
| |
2860 static int handle; |
| |
2861 |
| |
2862 return &handle; |
| |
2863 } |
| |
2864 |
| |
2865 static void connection_signed_off_cb(GaimConnection *gc) |
| |
2866 { |
| |
2867 GSList *list; |
| |
2868 for (list = minidialogs; list; list = list->next) { |
| |
2869 if (g_object_get_data(G_OBJECT(list->data), "gc") == gc) { |
| |
2870 gtk_widget_destroy(GTK_WIDGET(list->data)); |
| |
2871 } |
| |
2872 } |
| |
2873 } |
| |
2874 |
| |
2875 static void alert_killed_cb(GtkWidget *widget) |
| |
2876 { |
| |
2877 minidialogs = g_slist_remove(minidialogs, widget); |
| |
2878 } |
| |
2879 |
| |
2880 void *gaim_gtk_make_mini_dialog(GaimConnection *gc, const char *icon_name, |
| |
2881 const char *primary, const char *secondary, |
| |
2882 void *user_data, ...) |
| |
2883 { |
| |
2884 GtkWidget *vbox; |
| |
2885 GtkWidget *hbox; |
| |
2886 GtkWidget *bbox; |
| |
2887 GtkWidget *label; |
| |
2888 GtkWidget *button; |
| |
2889 GtkWidget *img = NULL; |
| |
2890 char label_text[2048]; |
| |
2891 const char *button_text; |
| |
2892 GCallback callback; |
| |
2893 char *primary_esc, *secondary_esc; |
| |
2894 va_list args; |
| |
2895 static gboolean first_call = TRUE; |
| |
2896 |
| |
2897 img = gtk_image_new_from_stock(icon_name, GTK_ICON_SIZE_BUTTON); |
| |
2898 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
| |
2899 |
| |
2900 vbox = gtk_vbox_new(FALSE,0); |
| |
2901 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); |
| |
2902 |
| |
2903 g_object_set_data(G_OBJECT(vbox), "gc" ,gc); |
| |
2904 minidialogs = g_slist_prepend(minidialogs, vbox); |
| |
2905 g_signal_connect(G_OBJECT(vbox), "destroy", G_CALLBACK(alert_killed_cb), NULL); |
| |
2906 |
| |
2907 if (first_call) { |
| |
2908 first_call = FALSE; |
| |
2909 gaim_signal_connect(gaim_connections_get_handle(), "signed-off", |
| |
2910 gaim_gtk_utils_get_handle(), |
| |
2911 GAIM_CALLBACK(connection_signed_off_cb), NULL); |
| |
2912 } |
| |
2913 |
| |
2914 hbox = gtk_hbox_new(FALSE, 0); |
| |
2915 gtk_container_add(GTK_CONTAINER(vbox), hbox); |
| |
2916 |
| |
2917 if (img != NULL) |
| |
2918 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
| |
2919 |
| |
2920 primary_esc = g_markup_escape_text(primary, -1); |
| |
2921 |
| |
2922 if (secondary) |
| |
2923 secondary_esc = g_markup_escape_text(secondary, -1); |
| |
2924 g_snprintf(label_text, sizeof(label_text), |
| |
2925 "<span weight=\"bold\" size=\"smaller\">%s</span>%s<span size=\"smaller\">%s</span>", |
| |
2926 primary_esc, secondary ? "\n" : "", secondary?secondary_esc:""); |
| |
2927 g_free(primary_esc); |
| |
2928 label = gtk_label_new(NULL); |
| |
2929 gtk_widget_modify_text(vbox, GTK_STATE_NORMAL, &(label->style->white)); |
| |
2930 gtk_label_set_markup(GTK_LABEL(label), label_text); |
| |
2931 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); |
| |
2932 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); |
| |
2933 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); |
| |
2934 #if GTK_CHECK_VERSION(2,6,0) |
| |
2935 g_object_set(label, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
| |
2936 #endif |
| |
2937 |
| |
2938 bbox = gtk_hbutton_box_new(); |
| |
2939 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); |
| |
2940 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); |
| |
2941 gtk_box_set_spacing(GTK_BOX(bbox), 6); |
| |
2942 |
| |
2943 va_start(args, user_data); |
| |
2944 while ((button_text = va_arg(args, char*))) { |
| |
2945 callback = va_arg(args, GCallback); |
| |
2946 button = gtk_button_new(); |
| |
2947 gtk_container_set_border_width(GTK_CONTAINER(button), 0); |
| |
2948 if (callback) |
| |
2949 g_signal_connect_swapped(G_OBJECT(button), "clicked", callback, user_data); |
| |
2950 g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), vbox); |
| |
2951 hbox = gtk_hbox_new(FALSE, 0); |
| |
2952 gtk_container_add(GTK_CONTAINER(button), hbox); |
| |
2953 g_snprintf(label_text, sizeof(label_text), |
| |
2954 "<span size=\"smaller\">%s</span>", button_text); |
| |
2955 label = gtk_label_new(NULL); |
| |
2956 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), label_text); |
| |
2957 gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5); |
| |
2958 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); |
| |
2959 gtk_container_add(GTK_CONTAINER(bbox), button); |
| |
2960 } |
| |
2961 va_end(args); |
| |
2962 |
| |
2963 return vbox; |
| |
2964 } |