X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fui%2Fgui%2Fwidget-io.c;h=da9c9cb1e868f7469c152a62307790779a5829d3;hb=2d82411f69f2a87a04ed22de78717bacf7d342de;hp=81ffd7311dea4273e4557fae687acc945dec746e;hpb=0085c7edf6d3b9c9ee2ce880893023c567886101;p=pspp diff --git a/src/ui/gui/widget-io.c b/src/ui/gui/widget-io.c index 81ffd7311d..da9c9cb1e8 100644 --- a/src/ui/gui/widget-io.c +++ b/src/ui/gui/widget-io.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2007 Free Software Foundation + Copyright (C) 2007, 2009, 2011 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,27 +26,9 @@ #include +#include "xalloc.h" -static void -ship_label (GtkBox *box, const char **s, const char_directive *dir) -{ - GtkWidget *label ; - gchar *text = g_strdup (*s); - - if ( dir ) - { - text [ dir->dir_start - *s ] = '\0'; - *s = dir->dir_end; - } - - label = gtk_label_new (text); - g_free (text); - - gtk_box_pack_start (box, label, FALSE, FALSE, 0); - gtk_widget_show (label); -} - /* Returns a string generated from FMT and a list of GtkEntry widgets. Each conversion in FMT will be replaced with the text from the corresponding GtkEntry. The normal printf semantics will be ignored. @@ -69,7 +51,7 @@ widget_printf (const gchar *fmt, ...) if ( 0 != printf_parse (fmt, &d, &a) ) return NULL; - widgets = calloc (sizeof (*widgets), d.count); + widgets = xcalloc (d.count, sizeof (*widgets)); va_start (ap, fmt); for (i = 0 ; i < d.count ; ++i ) { @@ -78,7 +60,8 @@ widget_printf (const gchar *fmt, ...) } va_end (ap); - g_free (a.arg); + if (a.arg != a.direct_alloc_arg) + free (a.arg); output = g_string_sized_new (strlen (fmt)); @@ -106,7 +89,8 @@ widget_printf (const gchar *fmt, ...) } free (widgets); - free (d.dir); + if (d.dir != d.direct_alloc_dir) + free (d.dir); if (*s) g_string_append_len (output, s, -1); @@ -115,100 +99,3 @@ widget_printf (const gchar *fmt, ...) g_string_free (output, FALSE); return text; } - -/* - Returns a GtkHBox populated with an GtkLabel and GtkEntry widgets. - Each conversion in FMT will cause a GtkEntry (possibly a GtkSpinButton) to - be created. Any text between conversions produces a GtkLabel. - There should be N arguments following FMT should be of type GtkEntry **, - where N is the number of conversions. - These arguments will be filled with a pointer to the corresponding widgets. - Their properties may be changed, but they should not be unrefed. - */ -GtkWidget * -widget_scanf (const gchar *fmt, ...) -{ - char_directives d; - arguments a; - int i; - va_list ap; - GtkWidget ***widgets = NULL; - GtkWidget *hbox = NULL; - GtkWidget **w; - const char *s = fmt; - - if ( 0 != printf_parse (fmt, &d, &a) ) - return NULL; - - g_free (a.arg); - - va_start (ap, fmt); - - if ( d.count > 0 ) - { - hbox = gtk_hbox_new (FALSE, 0); - widgets = calloc (sizeof (*widgets), d.count); - } - - for (i = 0 ; i < d.count ; ++i ) - { - if ( d.dir[i].conversion != '%') - widgets[i] = va_arg (ap, GtkWidget **); - } - va_end (ap); - - - for (i = 0 ; i < d.count ; ++i ) - { - char_directive dir = d.dir[i]; - int precision = 0; - int width = 0; - - - if ( dir.precision_start && dir.precision_end) - precision = strtol (dir.precision_start + 1, - (char **) &dir.precision_end, 10); - - if ( dir.width_start && dir.width_end ) - width = strtol (dir.width_start, (char **) &dir.width_end, 10); - - if ( dir.dir_start > s ) - ship_label (GTK_BOX (hbox), &s, &dir); - - if ( dir.conversion == '%') - { - s++; - continue; - } - - w = widgets [dir.arg_index]; - switch (dir.conversion) - { - case 'd': - case 'i': - case 'f': - { - *w = gtk_spin_button_new_with_range (0, 100.0, 1.0); - g_object_set (*w, "digits", precision, NULL); - } - break; - case 's': - *w = gtk_entry_new (); - break; - }; - - g_object_set (*w, "width-chars", width, NULL); - gtk_box_pack_start (GTK_BOX (hbox), *w, FALSE, FALSE, 0); - gtk_widget_show (*w); - } - - if ( *s ) - ship_label (GTK_BOX (hbox), &s, NULL); - - - g_free (widgets); - - free (d.dir); - - return hbox; -}