gtk/gtkutils.c

changeset 15094
7ebf5dd7d969
parent 15084
6cb675dea5fb
child 15096
128dd2bdf71d
equal deleted inserted replaced
15093:5501dd769dc5 15094:7ebf5dd7d969
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 }

mercurial