renamed gimp_mem_size_entry_new() to gimp_memsize_entry_new() for

2002-05-29  Sven Neumann  <sven@gimp.org>

	* libgimpwidgets/gimpwidgets.[ch]: renamed gimp_mem_size_entry_new()
	to gimp_memsize_entry_new() for consistency. Rewrote using bitshifts.
	Should work correctly for sizeof (gulong) > 32 now. Added new unit
	GigaBytes.

	* app/gui/preferences-dialog.c
	* app/gui/user-install-dialog.c: changed accordingly.

	* app/config/gimpconfig-types.[ch]: added new function
	gimp_memsize_set_from_string() that allows to check if the
	conversion succeeded.

	* app/config/gimpconfig-deserialize.c
	(gimp_config_deserialize_memsize): use gimp_memsize_set_from_string().
This commit is contained in:
Sven Neumann 2002-05-29 09:20:56 +00:00 committed by Sven Neumann
parent bb32c3c267
commit 4c55933dea
15 changed files with 198 additions and 175 deletions

View File

@ -1,3 +1,20 @@
2002-05-29 Sven Neumann <sven@gimp.org>
* libgimpwidgets/gimpwidgets.[ch]: renamed gimp_mem_size_entry_new()
to gimp_memsize_entry_new() for consistency. Rewrote using bitshifts.
Should work correctly for sizeof (gulong) > 32 now. Added new unit
GigaBytes.
* app/gui/preferences-dialog.c
* app/gui/user-install-dialog.c: changed accordingly.
* app/config/gimpconfig-types.[ch]: added new function
gimp_memsize_set_from_string() that allows to check if the
conversion succeeded.
* app/config/gimpconfig-deserialize.c
(gimp_config_deserialize_memsize): use gimp_memsize_set_from_string().
2002-05-28 Sven Neumann <sven@gimp.org>
* app/core/gimplayer.c (gimp_layer_new_from_drawable): determine

View File

@ -459,24 +459,24 @@ gimp_config_deserialize_memsize (GValue *value,
GParamSpec *prop_spec,
GScanner *scanner)
{
GTokenType token;
gchar *orig_cset_first = NULL;
gchar *orig_cset_nth = NULL;
gchar *orig_cset_first = scanner->config->cset_identifier_first;
gchar *orig_cset_nth = scanner->config->cset_identifier_nth;
orig_cset_first = scanner->config->cset_identifier_first;
orig_cset_nth = scanner->config->cset_identifier_nth;
scanner->config->cset_identifier_first = G_CSET_DIGITS;
scanner->config->cset_identifier_nth = G_CSET_DIGITS "gGmMkKbB";
token = gimp_config_deserialize_any (value, prop_spec, scanner);
if (g_scanner_peek_next_token (scanner) != G_TOKEN_IDENTIFIER)
return G_TOKEN_IDENTIFIER;
if (orig_cset_first)
scanner->config->cset_identifier_first = orig_cset_first;
if (orig_cset_nth)
scanner->config->cset_identifier_nth = orig_cset_nth;
g_scanner_get_next_token (scanner);
scanner->config->cset_identifier_first = orig_cset_first;
scanner->config->cset_identifier_nth = orig_cset_nth;
return token;
if (gimp_memsize_set_from_string (value, scanner->value.v_identifier))
return G_TOKEN_RIGHT_PAREN;
else
return G_TOKEN_NONE;
}
static GTokenType

View File

@ -81,6 +81,60 @@ gimp_memsize_get_type (void)
return memsize_type;
}
gboolean
gimp_memsize_set_from_string (GValue *value,
const gchar *string)
{
gchar *end;
gulong size;
g_return_val_if_fail (GIMP_VALUE_HOLDS_MEMSIZE (value), FALSE);
g_return_val_if_fail (string != NULL, FALSE);
size = strtoul (string, &end, 0);
if (size == ULONG_MAX && errno == ERANGE)
return FALSE;
if (end && *end)
{
guint shift;
switch (g_ascii_tolower (*end))
{
case 'b':
shift = 0;
break;
case 'k':
shift = 10;
break;
case 'm':
shift = 20;
break;
case 'g':
shift = 30;
break;
default:
return FALSE;
}
/* protect against overflow */
if (shift)
{
gulong limit = G_MAXULONG >> (shift);
if (size != (size & limit))
return FALSE;
size <<= shift;
}
}
g_value_set_ulong (value, size);
return TRUE;
}
GType
gimp_path_get_type (void)
{
@ -157,61 +211,10 @@ static void
string_to_memsize (const GValue *src_value,
GValue *dest_value)
{
const gchar *str;
gchar *end;
gulong size;
const gchar *str = g_value_get_string (src_value);
str = g_value_get_string (src_value);
if (!str || !*str)
goto error;
size = strtoul (str, &end, 0);
if (size == ULONG_MAX && errno == ERANGE)
goto error;
if (end && *end)
{
guint shift;
switch (g_ascii_tolower (*end))
{
case 'b':
shift = 0;
break;
case 'k':
shift = 10;
break;
case 'm':
shift = 20;
break;
case 'g':
shift = 30;
break;
default:
goto error;
}
/* protect against overflow */
if (shift)
{
gulong limit = G_MAXULONG >> (shift);
if (size != (size & limit))
goto error;
size <<= shift;
}
}
g_value_set_ulong (dest_value, size);
return;
error:
g_value_set_ulong (dest_value, 0);
g_warning ("Can't convert string to GimpMemsize.");
if (!str || !gimp_memsize_set_from_string (dest_value, str))
g_warning ("Can't convert string to GimpMemsize.");
};
@ -219,9 +222,7 @@ static void
unit_to_string (const GValue *src_value,
GValue *dest_value)
{
GimpUnit unit;
unit = (GimpUnit) g_value_get_int (src_value);
GimpUnit unit = (GimpUnit) g_value_get_int (src_value);
g_value_set_string (dest_value, gimp_unit_get_identifier (unit));
};

View File

@ -32,7 +32,9 @@ GType gimp_color_get_type (void) G_GNUC_CONST;
#define GIMP_TYPE_MEMSIZE (gimp_memsize_get_type ())
#define GIMP_VALUE_HOLDS_MEMSIZE(value) (G_TYPE_CHECK_VALUE_TYPE ((value), GIMP_TYPE_MEMSIZE))
GType gimp_memsize_get_type (void) G_GNUC_CONST;
GType gimp_memsize_get_type (void) G_GNUC_CONST;
gboolean gimp_memsize_set_from_string (GValue *value,
const gchar *string);
#define GIMP_TYPE_PATH (gimp_path_get_type ())
@ -42,6 +44,7 @@ GType gimp_path_get_type (void) G_GNUC_CONST;
#define GIMP_TYPE_UNIT (gimp_unit_get_type ())
#define GIMP_VALUE_HOLDS_UNIT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), GIMP_TYPE_UNIT))
GType gimp_unit_get_type (void) G_GNUC_CONST;

View File

@ -1977,7 +1977,7 @@ preferences_dialog_create (Gimp *gimp)
adjustment = gtk_adjustment_new (gimprc.max_new_image_size,
0, G_MAXULONG,
1.0, 1.0, 0.0);
hbox = gimp_mem_size_entry_new (GTK_ADJUSTMENT (adjustment));
hbox = gimp_memsize_entry_new (GTK_ADJUSTMENT (adjustment));
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
_("Maximum Image Size:"), 1.0, 0.5,
hbox, 1, TRUE);
@ -2634,7 +2634,7 @@ preferences_dialog_create (Gimp *gimp)
adjustment = gtk_adjustment_new (edit_tile_cache_size,
0, G_MAXULONG,
1.0, 1.0, 0.0);
hbox = gimp_mem_size_entry_new (GTK_ADJUSTMENT (adjustment));
hbox = gimp_memsize_entry_new (GTK_ADJUSTMENT (adjustment));
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
_("Tile Cache Size:"), 1.0, 0.5,
hbox, 1, TRUE);

View File

@ -1129,7 +1129,7 @@ user_install_tuning (void)
tile_cache_adj = gtk_adjustment_new (base_config->tile_cache_size,
0, G_MAXULONG, 1.0, 1.0, 0.0);
memsize = gimp_mem_size_entry_new (GTK_ADJUSTMENT (tile_cache_adj));
memsize = gimp_memsize_entry_new (GTK_ADJUSTMENT (tile_cache_adj));
gtk_box_pack_end (GTK_BOX (hbox), memsize, FALSE, FALSE, 0);
gtk_widget_show (memsize);

View File

@ -1977,7 +1977,7 @@ preferences_dialog_create (Gimp *gimp)
adjustment = gtk_adjustment_new (gimprc.max_new_image_size,
0, G_MAXULONG,
1.0, 1.0, 0.0);
hbox = gimp_mem_size_entry_new (GTK_ADJUSTMENT (adjustment));
hbox = gimp_memsize_entry_new (GTK_ADJUSTMENT (adjustment));
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
_("Maximum Image Size:"), 1.0, 0.5,
hbox, 1, TRUE);
@ -2634,7 +2634,7 @@ preferences_dialog_create (Gimp *gimp)
adjustment = gtk_adjustment_new (edit_tile_cache_size,
0, G_MAXULONG,
1.0, 1.0, 0.0);
hbox = gimp_mem_size_entry_new (GTK_ADJUSTMENT (adjustment));
hbox = gimp_memsize_entry_new (GTK_ADJUSTMENT (adjustment));
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
_("Tile Cache Size:"), 1.0, 0.5,
hbox, 1, TRUE);

View File

@ -1129,7 +1129,7 @@ user_install_tuning (void)
tile_cache_adj = gtk_adjustment_new (base_config->tile_cache_size,
0, G_MAXULONG, 1.0, 1.0, 0.0);
memsize = gimp_mem_size_entry_new (GTK_ADJUSTMENT (tile_cache_adj));
memsize = gimp_memsize_entry_new (GTK_ADJUSTMENT (tile_cache_adj));
gtk_box_pack_end (GTK_BOX (hbox), memsize, FALSE, FALSE, 0);
gtk_widget_show (memsize);

View File

@ -1,3 +1,9 @@
2002-05-29 Sven Neumann <sven@gimp.org>
* libgimpwidgets/libgimpwidgets-sections.txt
* libgimpwidgets/tmpl/gimpstock.sgml
* libgimpwidgets/tmpl/gimpwidgets.sgml: updated.
2002-05-16 Michael Natterer <mitch@gimp.org>
* libgimpbase/tmpl/gimpprotocol.sgml

View File

@ -309,6 +309,7 @@ GIMP_STOCK_TOOL_ISCISSORS
GIMP_STOCK_TOOL_LEVELS
GIMP_STOCK_TOOL_MEASURE
GIMP_STOCK_TOOL_MOVE
GIMP_STOCK_TOOL_OPTIONS
GIMP_STOCK_TOOL_PAINTBRUSH
GIMP_STOCK_TOOL_PATH
GIMP_STOCK_TOOL_PENCIL
@ -350,10 +351,10 @@ GIMP_RANDOM_SEED_TOGGLEBUTTON
gimp_random_seed_new
GIMP_COORDINATES_CHAINBUTTON
gimp_coordinates_new
GIMP_MEM_SIZE_ENTRY_SPINBUTTON
GIMP_MEM_SIZE_ENTRY_SPINBUTTON_ADJ
GIMP_MEM_SIZE_ENTRY_OPTIONMENU
gimp_mem_size_entry_new
GIMP_MEMSIZE_ENTRY_SPINBUTTON
GIMP_MEMSIZE_ENTRY_SPINBUTTON_ADJ
GIMP_MEMSIZE_ENTRY_OPTIONMENU
gimp_memsize_entry_new
gimp_pixmap_button_new
gimp_toggle_button_sensitive_update
gimp_toggle_button_update

View File

@ -448,6 +448,13 @@ GimpStock
<!-- ##### MACRO GIMP_STOCK_TOOL_OPTIONS ##### -->
<para>
</para>
<!-- ##### MACRO GIMP_STOCK_TOOL_PAINTBRUSH ##### -->
<para>

View File

@ -403,7 +403,7 @@ Returns the #GimpChainButton which is attached to the #GimpSizeEntry.
@spinbutton_usize:
<!-- ##### MACRO GIMP_MEM_SIZE_ENTRY_SPINBUTTON ##### -->
<!-- ##### MACRO GIMP_MEMSIZE_ENTRY_SPINBUTTON ##### -->
<para>
</para>
@ -411,7 +411,7 @@ Returns the #GimpChainButton which is attached to the #GimpSizeEntry.
@memsize:
<!-- ##### MACRO GIMP_MEM_SIZE_ENTRY_SPINBUTTON_ADJ ##### -->
<!-- ##### MACRO GIMP_MEMSIZE_ENTRY_SPINBUTTON_ADJ ##### -->
<para>
</para>
@ -419,7 +419,7 @@ Returns the #GimpChainButton which is attached to the #GimpSizeEntry.
@memsize:
<!-- ##### MACRO GIMP_MEM_SIZE_ENTRY_OPTIONMENU ##### -->
<!-- ##### MACRO GIMP_MEMSIZE_ENTRY_OPTIONMENU ##### -->
<para>
</para>
@ -427,7 +427,7 @@ Returns the #GimpChainButton which is attached to the #GimpSizeEntry.
@memsize:
<!-- ##### FUNCTION gimp_mem_size_entry_new ##### -->
<!-- ##### FUNCTION gimp_memsize_entry_new ##### -->
<para>
</para>

View File

@ -459,24 +459,24 @@ gimp_config_deserialize_memsize (GValue *value,
GParamSpec *prop_spec,
GScanner *scanner)
{
GTokenType token;
gchar *orig_cset_first = NULL;
gchar *orig_cset_nth = NULL;
gchar *orig_cset_first = scanner->config->cset_identifier_first;
gchar *orig_cset_nth = scanner->config->cset_identifier_nth;
orig_cset_first = scanner->config->cset_identifier_first;
orig_cset_nth = scanner->config->cset_identifier_nth;
scanner->config->cset_identifier_first = G_CSET_DIGITS;
scanner->config->cset_identifier_nth = G_CSET_DIGITS "gGmMkKbB";
token = gimp_config_deserialize_any (value, prop_spec, scanner);
if (g_scanner_peek_next_token (scanner) != G_TOKEN_IDENTIFIER)
return G_TOKEN_IDENTIFIER;
if (orig_cset_first)
scanner->config->cset_identifier_first = orig_cset_first;
if (orig_cset_nth)
scanner->config->cset_identifier_nth = orig_cset_nth;
g_scanner_get_next_token (scanner);
scanner->config->cset_identifier_first = orig_cset_first;
scanner->config->cset_identifier_nth = orig_cset_nth;
return token;
if (gimp_memsize_set_from_string (value, scanner->value.v_identifier))
return G_TOKEN_RIGHT_PAREN;
else
return G_TOKEN_NONE;
}
static GTokenType

View File

@ -607,7 +607,7 @@ gimp_radio_group_set_active (GtkRadioButton *radio_button,
*
* This function is a shortcut for gtk_adjustment_new() and a subsequent
* gtk_spin_button_new() and does some more initialisation stuff like
* setting a standard minimun horizontal size.
* setting a standard minimum horizontal size.
*
* Returns: A #GtkSpinbutton and it's #GtkAdjustment.
**/
@ -1086,127 +1086,115 @@ gimp_coordinates_new (GimpUnit unit,
typedef struct
{
GtkAdjustment *adjustment;
GtkAdjustment *divided_adj;
guint mem_size_unit;
} GimpMemSizeEntryData;
GtkAdjustment *shifted_adj;
guint shift;
} GimpMemsizeEntryData;
static void
gimp_mem_size_entry_callback (GtkAdjustment *adj,
gpointer data)
gimp_memsize_entry_callback (GtkAdjustment *adj,
gpointer data)
{
GimpMemSizeEntryData *gmsed;
gulong new_value;
GimpMemsizeEntryData *gmed = (GimpMemsizeEntryData *) data;
gmsed = (GimpMemSizeEntryData *)data;
new_value = (gulong) adj->value * gmsed->mem_size_unit;
gtk_adjustment_set_value (gmsed->adjustment, new_value);
gtk_adjustment_set_value (gmed->adjustment,
(gulong) adj->value << gmed->shift);
}
static void
gimp_mem_size_unit_callback (GtkWidget *widget,
gpointer data)
gimp_memsize_unit_callback (GtkWidget *widget,
gpointer data)
{
GimpMemSizeEntryData *gmsed;
gulong divided_mem_size;
guint new_unit;
GimpMemsizeEntryData *gmed = (GimpMemsizeEntryData *) data;
guint shift;
gmsed = (GimpMemSizeEntryData *)data;
shift = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget),
"gimp-item-data"));
new_unit = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget),
"gimp-item-data"));
if (new_unit && new_unit != gmsed->mem_size_unit)
if (shift && shift != gmed->shift)
{
GtkAdjustment *div_adj = GTK_ADJUSTMENT (gmsed->divided_adj);
gulong size = (gulong) gmed->adjustment->value >> shift;
divided_mem_size = (gulong) gmsed->adjustment->value / new_unit;
gmsed->mem_size_unit = new_unit;
gmed->shift = shift;
div_adj->lower = gmsed->adjustment->lower / new_unit;
div_adj->upper = gmsed->adjustment->upper / new_unit;
gmed->shifted_adj->lower = (gulong) gmed->adjustment->lower >> shift;
gmed->shifted_adj->upper = (gulong) gmed->adjustment->upper >> shift;
gtk_adjustment_changed (div_adj);
gtk_adjustment_changed (gmed->shifted_adj);
gtk_adjustment_set_value (GTK_ADJUSTMENT (gmsed->divided_adj),
divided_mem_size);
gtk_adjustment_set_value (GTK_ADJUSTMENT (gmed->shifted_adj), size);
}
}
/**
* gimp_mem_size_entry_new:
* gimp_memsize_entry_new:
* @adjustment: The adjustment containing the memsize and it's limits.
*
* Returns: A #GtkHBox with a #GtkSpinButton and a #GtkOptionMenu.
**/
GtkWidget *
gimp_mem_size_entry_new (GtkAdjustment *adjustment)
gimp_memsize_entry_new (GtkAdjustment *adjustment)
{
GimpMemsizeEntryData *gmed;
GtkWidget *hbox;
GtkObject *divided_adj;
GtkWidget *spinbutton;
GtkWidget *optionmenu;
GimpMemSizeEntryData *gmsed;
gulong mem_size_unit;
gulong divided_mem_size;
gint i;
GtkWidget *menu;
GtkObject *shifted_adj;
guint shift;
g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), NULL);
g_return_val_if_fail (adjustment->lower >= 0, NULL);
g_return_val_if_fail (adjustment->value >= 0, NULL);
g_return_val_if_fail (adjustment->upper <= G_MAXULONG, NULL);
gmsed = g_new (GimpMemSizeEntryData, 1);
gmed = g_new (GimpMemsizeEntryData, 1);
for (i = 0, mem_size_unit = 1; i < 2; i++)
for (shift = 30; shift > 0; shift -= 10)
{
if ( (gulong) adjustment->value % (mem_size_unit << 10) != 0 )
break;
mem_size_unit <<= 10;
gulong size = adjustment->value;
if (size > (1 << shift) && size % (1 << shift) == 0)
break;
}
divided_mem_size = (gulong) adjustment->value / mem_size_unit;
hbox = gtk_hbox_new (FALSE, 2);
spinbutton =
gimp_spin_button_new (&divided_adj, divided_mem_size,
adjustment->lower / mem_size_unit,
adjustment->upper / mem_size_unit,
1.0, 16.0, 0.0, 1.0, 0.0);
g_signal_connect (G_OBJECT (divided_adj), "value_changed",
G_CALLBACK (gimp_mem_size_entry_callback),
gmsed);
spinbutton = gimp_spin_button_new (&shifted_adj,
(gulong) adjustment->value >> shift,
(gulong) adjustment->lower >> shift,
(gulong) adjustment->upper >> shift,
1, 8, 0, 1, 0);
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
gtk_widget_show (spinbutton);
optionmenu =
gimp_option_menu_new2 (FALSE, G_CALLBACK (gimp_mem_size_unit_callback),
gmsed, (gpointer) mem_size_unit,
g_signal_connect (G_OBJECT (shifted_adj), "value_changed",
G_CALLBACK (gimp_memsize_entry_callback),
gmed);
_("Bytes"), GINT_TO_POINTER (1 << 0), NULL,
_("KiloBytes"), GINT_TO_POINTER (1 << 10), NULL,
_("MegaBytes"), GINT_TO_POINTER (1 << 20), NULL,
menu = gimp_option_menu_new2 (FALSE, G_CALLBACK (gimp_memsize_unit_callback),
gmed,
GUINT_TO_POINTER (shift),
_("Bytes"), GUINT_TO_POINTER (0), NULL,
_("KiloBytes"), GUINT_TO_POINTER (10), NULL,
_("MegaBytes"), GUINT_TO_POINTER (20), NULL,
_("GigaBytes"), GUINT_TO_POINTER (30), NULL,
NULL);
NULL);
gtk_box_pack_start (GTK_BOX (hbox), optionmenu, FALSE, FALSE, 0);
gtk_widget_show (optionmenu);
gtk_box_pack_start (GTK_BOX (hbox), menu, FALSE, FALSE, 0);
gtk_widget_show (menu);
g_object_ref (adjustment);
gtk_object_sink (GTK_OBJECT (adjustment));
g_signal_connect_swapped (G_OBJECT (hbox), "destroy",
G_CALLBACK (g_object_unref),
adjustment);
g_signal_connect_swapped (G_OBJECT (hbox), "destroy",
G_CALLBACK (g_free),
gmsed);
gmsed->adjustment = adjustment;
gmsed->divided_adj = GTK_ADJUSTMENT (divided_adj);
gmsed->mem_size_unit = mem_size_unit;
g_signal_connect_swapped (G_OBJECT (hbox), "destroy",
G_CALLBACK (g_object_unref), adjustment);
g_signal_connect_swapped (G_OBJECT (hbox), "destroy",
G_CALLBACK (g_free), gmed);
gmed->adjustment = adjustment;
gmed->shifted_adj = GTK_ADJUSTMENT (shifted_adj);
gmed->shift = shift;
g_object_set_data (G_OBJECT (hbox), "spinbutton", spinbutton);
g_object_set_data (G_OBJECT (hbox), "optionmenu", optionmenu);
g_object_set_data (G_OBJECT (hbox), "optionmenu", menu);
return hbox;
}

View File

@ -208,15 +208,15 @@ GtkWidget * gimp_coordinates_new (GimpUnit unit,
gdouble ysize_0, /* % */
gdouble ysize_100 /* % */);
#define GIMP_MEM_SIZE_ENTRY_SPINBUTTON(memsize) \
#define GIMP_MEMSIZE_ENTRY_SPINBUTTON(memsize) \
(g_object_get_data (G_OBJECT (memsize), "spinbutton"))
#define GIMP_MEM_SIZE_ENTRY_SPINBUTTON_ADJ(memsize) \
#define GIMP_MEMSIZE_ENTRY_SPINBUTTON_ADJ(memsize) \
gtk_spin_button_get_adjustment \
(GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (memsize), "spinbutton")))
#define GIMP_MEM_SIZE_ENTRY_OPTIONMENU(memsize) \
#define GIMP_MEMSIZE_ENTRY_OPTIONMENU(memsize) \
(g_object_get_data (G_OBJECT (memsize), "optionmenu"))
GtkWidget * gimp_mem_size_entry_new (GtkAdjustment *adjustment);
GtkWidget * gimp_memsize_entry_new (GtkAdjustment *adjustment);
GtkWidget * gimp_pixmap_button_new (gchar **xpm_data,