Merge branch 'master' into treeview-refactor

This commit is contained in:
Tristan Van Berkom 2010-10-26 11:37:27 +09:00
commit 8679563247
36 changed files with 3052 additions and 2507 deletions

21
NEWS
View File

@ -22,17 +22,32 @@ Overview of Changes from GTK+ 2.91.1 to 2.91.2
* GtkIconView allows tree models (ignoring anything below the root level) * GtkIconView allows tree models (ignoring anything below the root level)
* GtkProgressBar, GtkSpinButton and GtkEntry no longer have their own * GtkProgressBar, GtkSpinButton, GtkEntry and GtkCalendar no longer have
input-output window their own input-output window
* gtk_widget_hide_all() has been removed * gtk_widget_hide_all() has been removed
* GtkGrid: A legacy-free, height-for-width grid container * GtkGrid: A legacy-free, height-for-width grid container
* GDK gained a GdkRGBA color struct containing 4 doubles, and various
GdkColor APIs have GdkRGBA counterparts now.
* Bugs fixed: * Bugs fixed:
632381 438318 632538 632539 632677 632736 324899 524304 617174 324899 GtkComboBoxText needs API to remove all items
438318 Deprecate and remove hide_all()
524304 Use XDG_USER_DATA to store the recent files
617174 gtkrecentinfo & GIcon
632381 gtk_combo_box_text_new_with_entry() adds two text cell renderers
632538 Move setting property registration in gtksettings.c
632539 Do not install gtkprivate.h
632677 restore copyright header
632736 change the window class of entry from INPUT_OUTPUT to INPUT_ONLY
632936 gtkcellrenderer gdkrgba changes not correct
* Translation updates: * Translation updates:
Arabic
Galician
Hebrew
Japanese Japanese
Norwegian bokmål Norwegian bokmål
Spanish Spanish

View File

@ -20,7 +20,7 @@ AC_CONFIG_MACRO_DIR([m4])
m4_define([gtk_major_version], [2]) m4_define([gtk_major_version], [2])
m4_define([gtk_minor_version], [91]) m4_define([gtk_minor_version], [91])
m4_define([gtk_micro_version], [2]) m4_define([gtk_micro_version], [3])
m4_define([gtk_interface_age], [0]) m4_define([gtk_interface_age], [0])
m4_define([gtk_binary_age], m4_define([gtk_binary_age],
[m4_eval(100 * gtk_minor_version + gtk_micro_version)]) [m4_eval(100 * gtk_minor_version + gtk_micro_version)])

View File

@ -117,7 +117,7 @@ main (int argc, char *argv[])
</para> </para>
<para> <para>
One the other hand, GApplication supports passing entire On the other hand, GApplication supports passing entire
commandlines to the running instance, which reduces the need commandlines to the running instance, which reduces the need
for user-defined commands. And GDBus makes it very easy to for user-defined commands. And GDBus makes it very easy to
implement D-Bus interfaces for communication between implement D-Bus interfaces for communication between

View File

@ -49,6 +49,7 @@
#include <gdk/gdkpixbuf.h> #include <gdk/gdkpixbuf.h>
#include <gdk/gdkproperty.h> #include <gdk/gdkproperty.h>
#include <gdk/gdkrectangle.h> #include <gdk/gdkrectangle.h>
#include <gdk/gdkrgba.h>
#include <gdk/gdkscreen.h> #include <gdk/gdkscreen.h>
#include <gdk/gdkselection.h> #include <gdk/gdkselection.h>
#include <gdk/gdkspawn.h> #include <gdk/gdkspawn.h>

View File

@ -290,6 +290,7 @@ gdk_cairo_create
gdk_cairo_reset_clip gdk_cairo_reset_clip
gdk_cairo_get_clip_rectangle gdk_cairo_get_clip_rectangle
gdk_cairo_set_source_color gdk_cairo_set_source_color
gdk_cairo_set_source_rgba
gdk_cairo_set_source_pixbuf gdk_cairo_set_source_pixbuf
gdk_cairo_set_source_window gdk_cairo_set_source_window
gdk_cairo_rectangle gdk_cairo_rectangle
@ -310,6 +311,18 @@ gdk_color_to_string
#endif #endif
#endif #endif
#if IN_HEADER(__GDK_RGBA_H__)
#if IN_FILE(__GDK_RGBA_H__)
gdk_rgba_copy
gdk_rgba_equal
gdk_rgba_free
gdk_rgba_get_type
gdk_rgba_hash
gdk_rgba_parse
gdk_rgba_to_string
#endif
#endif
#if IN_HEADER(__GDK_CURSOR_H__) #if IN_HEADER(__GDK_CURSOR_H__)
#if IN_FILE(__GDK_CURSOR_C__) #if IN_FILE(__GDK_CURSOR_C__)
gdk_cursor_get_type G_GNUC_CONST gdk_cursor_get_type G_GNUC_CONST
@ -571,6 +584,7 @@ gdk_window_get_width
gdk_window_has_native gdk_window_has_native
gdk_window_set_background gdk_window_set_background
gdk_window_set_background_pattern gdk_window_set_background_pattern
gdk_window_set_background_rgba
gdk_window_set_cursor gdk_window_set_cursor
gdk_window_shape_combine_region gdk_window_shape_combine_region
gdk_window_set_child_shapes gdk_window_set_child_shapes

View File

@ -269,9 +269,15 @@ gdk_rgba_equal (gconstpointer p1,
gchar * gchar *
gdk_rgba_to_string (GdkRGBA *rgba) gdk_rgba_to_string (GdkRGBA *rgba)
{ {
return g_strdup_printf ("rgba(%f,%f,%f,%f)", gchar red[G_ASCII_DTOSTR_BUF_SIZE];
CLAMP (rgba->red, 0, 1), gchar green[G_ASCII_DTOSTR_BUF_SIZE];
CLAMP (rgba->green, 0, 1), gchar blue[G_ASCII_DTOSTR_BUF_SIZE];
CLAMP (rgba->blue, 0, 1), gchar alpha[G_ASCII_DTOSTR_BUF_SIZE];
CLAMP (rgba->alpha, 0, 1));
g_ascii_dtostr (red, G_ASCII_DTOSTR_BUF_SIZE, CLAMP (rgba->red, 0, 1));
g_ascii_dtostr (green, G_ASCII_DTOSTR_BUF_SIZE, CLAMP (rgba->green, 0, 1));
g_ascii_dtostr (blue, G_ASCII_DTOSTR_BUF_SIZE, CLAMP (rgba->blue, 0, 1));
g_ascii_dtostr (alpha, G_ASCII_DTOSTR_BUF_SIZE, CLAMP (rgba->alpha, 0, 1));
return g_strdup_printf ("rgba(%s,%s,%s,%s)", red, green, blue, alpha);
} }

View File

@ -2,26 +2,27 @@ include $(top_srcdir)/Makefile.decl
NULL= NULL=
# check_PROGRAMS=check-gdk-cairo noinst_PROGRAMS = $(TEST_PROGS)
check_PROGRAMS=
TESTS=$(check_PROGRAMS)
TESTS_ENVIRONMENT=GDK_PIXBUF_MODULE_FILE=$(top_builddir)/gdk-pixbuf/loaders.cache
AM_CPPFLAGS=\ AM_CPPFLAGS = \
$(GDK_DEP_CFLAGS) \ $(GDK_DEP_CFLAGS) \
-I$(top_srcdir) \ -I$(top_srcdir) \
-I$(top_builddir)/gdk \ -I$(top_builddir)/gdk \
$(NULL) $(NULL)
check_gdk_cairo_SOURCES=\ progs_ldadd = \
check-gdk-cairo.c \
$(NULL)
check_gdk_cairo_LDADD=\
$(GDK_DEP_LIBS) \ $(GDK_DEP_LIBS) \
$(top_builddir)/gdk-pixbuf/libgdk_pixbuf-$(GTK_API_VERSION).la \
$(top_builddir)/gdk/libgdk-$(gdktarget)-$(GTK_API_VERSION).la \ $(top_builddir)/gdk/libgdk-$(gdktarget)-$(GTK_API_VERSION).la \
$(NULL) $(NULL)
#TEST_PROGS += check-gdk-cairo
check_gdk_cairo_SOURCES = check-gdk-cairo.c
check_gdk_cairo_LDADD = $(progs_ldadd)
TEST_PROGS += gdk-color
gdk_color_SOURCES = gdk-color.c
gdk_color_LDADD = $(progs_ldadd)
CLEANFILES = \ CLEANFILES = \
cairosurface.png \ cairosurface.png \
gdksurface.png gdksurface.png

100
gdk/tests/gdk-color.c Normal file
View File

@ -0,0 +1,100 @@
#include <locale.h>
#include <gdk/gdk.h>
static void
test_color_parse (void)
{
GdkRGBA color;
GdkRGBA expected;
gboolean res;
res = gdk_rgba_parse ("foo", &color);
g_assert (!res);
res = gdk_rgba_parse ("", &color);
g_assert (!res);
expected.red = 0.4;
expected.green = 0.3;
expected.blue = 0.2;
expected.alpha = 0.1;
res = gdk_rgba_parse ("rgba(0.4,0.3,0.2,0.1)", &color);
g_assert (res);
g_assert (gdk_rgba_equal (&color, &expected));
res = gdk_rgba_parse ("rgba ( 0.4 , 0.3 , 0.2 , 0.1 )", &color);
g_assert (res);
g_assert (gdk_rgba_equal (&color, &expected));
expected.red = 0.4;
expected.green = 0.3;
expected.blue = 0.2;
expected.alpha = 1.0;
res = gdk_rgba_parse ("rgb(0.4,0.3,0.2)", &color);
g_assert (res);
g_assert (gdk_rgba_equal (&color, &expected));
expected.red = 1.0;
expected.green = 0.0;
expected.blue = 0.0;
expected.alpha = 1.0;
res = gdk_rgba_parse ("red", &color);
g_assert (res);
g_assert (gdk_rgba_equal (&color, &expected));
expected.red = 0.0;
expected.green = 0x8080 / 65535.;
expected.blue = 1.0;
expected.alpha = 1.0;
res = gdk_rgba_parse ("#0080ff", &color);
g_assert (res);
g_assert (gdk_rgba_equal (&color, &expected));
}
static void
test_color_to_string (void)
{
GdkRGBA rgba;
GdkRGBA out;
gchar *res;
gchar *res_de;
gchar *res_en;
gchar *orig;
rgba.red = 1.0;
rgba.green = 0.5;
rgba.blue = 0.1;
rgba.alpha = 1.0;
orig = g_strdup (setlocale (LC_ALL, NULL));
res = gdk_rgba_to_string (&rgba);
gdk_rgba_parse (res, &out);
g_assert (gdk_rgba_equal (&rgba, &out));
setlocale (LC_ALL, "de_DE.utf-8");
res_de = gdk_rgba_to_string (&rgba);
g_assert_cmpstr (res, ==, res_de);
setlocale (LC_ALL, "en_US.utf-8");
res_en = gdk_rgba_to_string (&rgba);
g_assert_cmpstr (res, ==, res_en);
g_free (res);
g_free (res_de);
g_free (res_en);
setlocale (LC_ALL, orig);
g_free (orig);
}
int
main (int argc, char *argv[])
{
g_test_init (&argc, &argv, NULL);
gdk_init (&argc, &argv);
g_test_add_func ("/color/parse", test_color_parse);
g_test_add_func ("/color/to-string", test_color_to_string);
return g_test_run ();
}

View File

@ -681,6 +681,7 @@ gtk_cell_view_new_with_markup
gtk_cell_view_new_with_pixbuf gtk_cell_view_new_with_pixbuf
gtk_cell_view_new_with_text gtk_cell_view_new_with_text
gtk_cell_view_set_background_color gtk_cell_view_set_background_color
gtk_cell_view_set_background_rgba
gtk_cell_view_set_displayed_row gtk_cell_view_set_displayed_row
gtk_cell_view_set_model gtk_cell_view_set_model
#endif #endif
@ -749,6 +750,7 @@ gtk_clipboard_wait_is_target_available
#if IN_FILE(__GTK_COLOR_BUTTON_C__) #if IN_FILE(__GTK_COLOR_BUTTON_C__)
gtk_color_button_get_alpha gtk_color_button_get_alpha
gtk_color_button_get_color gtk_color_button_get_color
gtk_color_button_get_rgba
gtk_color_button_get_title gtk_color_button_get_title
gtk_color_button_get_type G_GNUC_CONST gtk_color_button_get_type G_GNUC_CONST
gtk_color_button_get_use_alpha gtk_color_button_get_use_alpha
@ -757,6 +759,7 @@ gtk_color_button_new_with_color
gtk_color_button_new_with_rgba gtk_color_button_new_with_rgba
gtk_color_button_set_alpha gtk_color_button_set_alpha
gtk_color_button_set_color gtk_color_button_set_color
gtk_color_button_set_rgba
gtk_color_button_set_title gtk_color_button_set_title
gtk_color_button_set_use_alpha gtk_color_button_set_use_alpha
#endif #endif
@ -766,10 +769,12 @@ gtk_color_button_set_use_alpha
#if IN_FILE(__GTK_COLOR_SELECTION_C__) #if IN_FILE(__GTK_COLOR_SELECTION_C__)
gtk_color_selection_get_current_alpha gtk_color_selection_get_current_alpha
gtk_color_selection_get_current_color gtk_color_selection_get_current_color
gtk_color_selection_get_current_rgba
gtk_color_selection_get_has_opacity_control gtk_color_selection_get_has_opacity_control
gtk_color_selection_get_has_palette gtk_color_selection_get_has_palette
gtk_color_selection_get_previous_alpha gtk_color_selection_get_previous_alpha
gtk_color_selection_get_previous_color gtk_color_selection_get_previous_color
gtk_color_selection_get_previous_rgba
gtk_color_selection_get_type G_GNUC_CONST gtk_color_selection_get_type G_GNUC_CONST
gtk_color_selection_is_adjusting gtk_color_selection_is_adjusting
gtk_color_selection_new gtk_color_selection_new
@ -778,10 +783,12 @@ gtk_color_selection_palette_to_string
gtk_color_selection_set_change_palette_with_screen_hook gtk_color_selection_set_change_palette_with_screen_hook
gtk_color_selection_set_current_alpha gtk_color_selection_set_current_alpha
gtk_color_selection_set_current_color gtk_color_selection_set_current_color
gtk_color_selection_set_current_rgba
gtk_color_selection_set_has_opacity_control gtk_color_selection_set_has_opacity_control
gtk_color_selection_set_has_palette gtk_color_selection_set_has_palette
gtk_color_selection_set_previous_alpha gtk_color_selection_set_previous_alpha
gtk_color_selection_set_previous_color gtk_color_selection_set_previous_color
gtk_color_selection_set_previous_rgba
#endif #endif
#endif #endif

View File

@ -239,7 +239,7 @@
#include "config.h" #include "config.h"
#include <errno.h> /* errno */ #include <errno.h> /* errno */
#include <stdlib.h> /* strtol, strtoul */ #include <stdlib.h>
#include <string.h> /* strlen */ #include <string.h> /* strlen */
#include "gtkbuilder.h" #include "gtkbuilder.h"
@ -1451,9 +1451,9 @@ gtk_builder_value_from_string_type (GtkBuilder *builder,
case G_TYPE_LONG: case G_TYPE_LONG:
{ {
long l; long l;
gchar *endptr; gchar *endptr = NULL;
errno = 0; errno = 0;
l = strtol (string, &endptr, 0); l = g_ascii_strtoll (string, &endptr, 0);
if (errno || endptr == string) if (errno || endptr == string)
{ {
g_set_error (error, g_set_error (error,
@ -1474,9 +1474,9 @@ gtk_builder_value_from_string_type (GtkBuilder *builder,
case G_TYPE_ULONG: case G_TYPE_ULONG:
{ {
gulong ul; gulong ul;
gchar *endptr; gchar *endptr = NULL;
errno = 0; errno = 0;
ul = strtoul (string, &endptr, 0); ul = g_ascii_strtoull (string, &endptr, 0);
if (errno || endptr == string) if (errno || endptr == string)
{ {
g_set_error (error, g_set_error (error,
@ -1520,7 +1520,7 @@ gtk_builder_value_from_string_type (GtkBuilder *builder,
case G_TYPE_DOUBLE: case G_TYPE_DOUBLE:
{ {
gdouble d; gdouble d;
gchar *endptr; gchar *endptr = NULL;
errno = 0; errno = 0;
d = g_ascii_strtod (string, &endptr); d = g_ascii_strtod (string, &endptr);
if (errno || endptr == string) if (errno || endptr == string)
@ -1676,8 +1676,10 @@ _gtk_builder_enum_from_string (GType type,
ret = TRUE; ret = TRUE;
value = strtoul (string, &endptr, 0); endptr = NULL;
if (endptr != string) /* parsed a number */ errno = 0;
value = g_ascii_strtoull (string, &endptr, 0);
if (errno == 0 && endptr != string) /* parsed a number */
*enum_value = value; *enum_value = value;
else else
{ {
@ -1723,9 +1725,11 @@ _gtk_builder_flags_from_string (GType type,
g_return_val_if_fail (string != 0, FALSE); g_return_val_if_fail (string != 0, FALSE);
ret = TRUE; ret = TRUE;
value = strtoul (string, &endptr, 0); endptr = NULL;
if (endptr != string) /* parsed a number */ errno = 0;
value = g_ascii_strtoull (string, &endptr, 0);
if (errno == 0 && endptr != string) /* parsed a number */
*flags_value = value; *flags_value = value;
else else
{ {

File diff suppressed because it is too large Load Diff

View File

@ -335,9 +335,9 @@ attributes_text_element (GMarkupParseContext *context,
if (!parser_data->attr_name) if (!parser_data->attr_name)
return; return;
errno = 0;
string = g_strndup (text, text_len); string = g_strndup (text, text_len);
l = strtol (string, &endptr, 0); errno = 0;
l = g_ascii_strtoll (string, &endptr, 0);
if (errno || endptr == string) if (errno || endptr == string)
{ {
g_set_error (error, g_set_error (error,

View File

@ -493,28 +493,36 @@ gtk_cell_renderer_set_property (GObject *object,
{ {
GdkRGBA rgba; GdkRGBA rgba;
if (!g_value_get_string (value)) if (!g_value_get_string (value))
set_cell_bg_color (cell, NULL); set_cell_bg_color (cell, NULL);
else if (gdk_rgba_parse (g_value_get_string (value), &rgba)) else if (gdk_rgba_parse (g_value_get_string (value), &rgba))
set_cell_bg_color (cell, &rgba); set_cell_bg_color (cell, &rgba);
else else
g_warning ("Don't know color `%s'", g_value_get_string (value)); g_warning ("Don't know color `%s'", g_value_get_string (value));
g_object_notify (object, "cell-background-gdk"); g_object_notify (object, "cell-background-gdk");
} }
break; break;
case PROP_CELL_BACKGROUND_GDK: case PROP_CELL_BACKGROUND_GDK:
{ {
GdkColor *color; GdkColor *color;
GdkRGBA rgba;
color = g_value_get_boxed (value); color = g_value_get_boxed (value);
rgba.red = color->red / 65535.; if (color)
rgba.green = color->green / 65535.; {
rgba.blue = color->blue / 65535.; GdkRGBA rgba;
rgba.alpha = 1;
set_cell_bg_color (cell, &rgba); rgba.red = color->red / 65535.;
rgba.green = color->green / 65535.;
rgba.blue = color->blue / 65535.;
rgba.alpha = 1;
set_cell_bg_color (cell, &rgba);
}
else
{
set_cell_bg_color (cell, NULL);
}
} }
break; break;
case PROP_CELL_BACKGROUND_RGBA: case PROP_CELL_BACKGROUND_RGBA:
@ -539,9 +547,9 @@ set_cell_bg_color (GtkCellRenderer *cell,
{ {
if (!priv->cell_background_set) if (!priv->cell_background_set)
{ {
priv->cell_background_set = TRUE; priv->cell_background_set = TRUE;
g_object_notify (G_OBJECT (cell), "cell-background-set"); g_object_notify (G_OBJECT (cell), "cell-background-set");
} }
priv->cell_background = *rgba; priv->cell_background = *rgba;
} }

View File

@ -1206,28 +1206,46 @@ gtk_cell_renderer_text_set_property (GObject *object,
case PROP_BACKGROUND_GDK: case PROP_BACKGROUND_GDK:
{ {
GdkColor *color; GdkColor *color;
GdkRGBA rgba;
color = g_value_get_boxed (value); color = g_value_get_boxed (value);
rgba.red = color->red / 65535.; if (color)
rgba.green = color->green / 65535.; {
rgba.blue = color->blue / 65535.; GdkRGBA rgba;
set_bg_color (celltext, &rgba); rgba.red = color->red / 65535.;
rgba.green = color->green / 65535.;
rgba.blue = color->blue / 65535.;
rgba.alpha = 1;
set_bg_color (celltext, &rgba);
}
else
{
set_bg_color (celltext, NULL);
}
} }
break; break;
case PROP_FOREGROUND_GDK: case PROP_FOREGROUND_GDK:
{ {
GdkColor *color; GdkColor *color;
GdkRGBA rgba;
color = g_value_get_boxed (value); color = g_value_get_boxed (value);
rgba.red = color->red / 65535.; if (color)
rgba.green = color->green / 65535.; {
rgba.blue = color->blue / 65535.; GdkRGBA rgba;
set_fg_color (celltext, &rgba); rgba.red = color->red / 65535.;
rgba.green = color->green / 65535.;
rgba.blue = color->blue / 65535.;
rgba.alpha = 1;
set_fg_color (celltext, &rgba);
}
else
{
set_fg_color (celltext, NULL);
}
} }
break; break;

View File

@ -1357,7 +1357,7 @@ gtk_dialog_buildable_custom_finished (GtkBuildable *buildable,
} }
ad = get_response_data (GTK_WIDGET (object), TRUE); ad = get_response_data (GTK_WIDGET (object), TRUE);
ad->response_id = atoi (item->response_id); ad->response_id = g_ascii_strtoll (item->response_id, NULL, 10);
if (GTK_IS_BUTTON (object)) if (GTK_IS_BUTTON (object))
signal_id = g_signal_lookup ("clicked", GTK_TYPE_BUTTON); signal_id = g_signal_lookup ("clicked", GTK_TYPE_BUTTON);

View File

@ -541,6 +541,21 @@ typedef enum
GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT
} GtkSizeRequestMode; } GtkSizeRequestMode;
/**
* GtkScrollablePolicy:
* @GTK_SCROLL_MINIMUM: Scrollable adjustments are based on the minimum size
* @GTK_SCROLL_NATURAL: Scrollable adjustments are based on the natural size
*
* Defines the policy to be used in a scrollable widget when updating
* the scrolled window adjustments in a given orientation.
*/
typedef enum
{
GTK_SCROLL_MINIMUM = 0,
GTK_SCROLL_NATURAL
} GtkScrollablePolicy;
G_END_DECLS G_END_DECLS

View File

@ -205,6 +205,11 @@ struct _GtkIconViewPrivate
guint shift_pressed : 1; guint shift_pressed : 1;
guint draw_focus : 1; guint draw_focus : 1;
/* GtkScrollablePolicy needs to be checked when
* driving the scrollable adjustment values */
guint hscroll_policy : 1;
guint vscroll_policy : 1;
}; };
/* Signals */ /* Signals */
@ -243,7 +248,9 @@ enum
/* For scrollable interface */ /* For scrollable interface */
PROP_HADJUSTMENT, PROP_HADJUSTMENT,
PROP_VADJUSTMENT PROP_VADJUSTMENT,
PROP_HSCROLL_POLICY,
PROP_VSCROLL_POLICY
}; };
/* GObject vfuncs */ /* GObject vfuncs */
@ -794,8 +801,10 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
GTK_PARAM_READWRITE)); GTK_PARAM_READWRITE));
/* Scrollable interface properties */ /* Scrollable interface properties */
g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment"); g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment");
g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment"); g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment");
g_object_class_override_property (gobject_class, PROP_HSCROLL_POLICY, "hscroll-policy");
g_object_class_override_property (gobject_class, PROP_VSCROLL_POLICY, "vscroll-policy");
/* Style properties */ /* Style properties */
gtk_widget_class_install_style_property (widget_class, gtk_widget_class_install_style_property (widget_class,
@ -1205,6 +1214,14 @@ gtk_icon_view_set_property (GObject *object,
case PROP_VADJUSTMENT: case PROP_VADJUSTMENT:
gtk_icon_view_set_vadjustment (icon_view, g_value_get_object (value)); gtk_icon_view_set_vadjustment (icon_view, g_value_get_object (value));
break; break;
case PROP_HSCROLL_POLICY:
icon_view->priv->hscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (icon_view));
break;
case PROP_VSCROLL_POLICY:
icon_view->priv->vscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (icon_view));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -1277,6 +1294,12 @@ gtk_icon_view_get_property (GObject *object,
case PROP_VADJUSTMENT: case PROP_VADJUSTMENT:
g_value_set_object (value, icon_view->priv->vadjustment); g_value_set_object (value, icon_view->priv->vadjustment);
break; break;
case PROP_HSCROLL_POLICY:
g_value_set_enum (value, icon_view->priv->hscroll_policy);
break;
case PROP_VSCROLL_POLICY:
g_value_set_enum (value, icon_view->priv->vscroll_policy);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);

View File

@ -53,6 +53,11 @@ struct _GtkLayoutPrivate
GtkAdjustment *hadjustment; GtkAdjustment *hadjustment;
GtkAdjustment *vadjustment; GtkAdjustment *vadjustment;
/* GtkScrollablePolicy needs to be checked when
* driving the scrollable adjustment values */
guint hscroll_policy : 1;
guint vscroll_policy : 1;
/* Properties */ /* Properties */
GdkVisibilityState visibility; GdkVisibilityState visibility;
@ -75,7 +80,9 @@ struct _GtkLayoutChild {
enum { enum {
PROP_0, PROP_0,
PROP_HADJUSTMENT, PROP_HADJUSTMENT,
PROP_VADJUSTMENT, PROP_VADJUSTMENT,
PROP_HSCROLL_POLICY,
PROP_VSCROLL_POLICY,
PROP_WIDTH, PROP_WIDTH,
PROP_HEIGHT PROP_HEIGHT
}; };
@ -618,8 +625,10 @@ gtk_layout_class_init (GtkLayoutClass *class)
GTK_PARAM_READWRITE)); GTK_PARAM_READWRITE));
/* Scrollable interface */ /* Scrollable interface */
g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment"); g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment");
g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment"); g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment");
g_object_class_override_property (gobject_class, PROP_HSCROLL_POLICY, "hscroll-policy");
g_object_class_override_property (gobject_class, PROP_VSCROLL_POLICY, "vscroll-policy");
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_WIDTH, PROP_WIDTH,
@ -671,6 +680,12 @@ gtk_layout_get_property (GObject *object,
case PROP_VADJUSTMENT: case PROP_VADJUSTMENT:
g_value_set_object (value, priv->vadjustment); g_value_set_object (value, priv->vadjustment);
break; break;
case PROP_HSCROLL_POLICY:
g_value_set_enum (value, priv->hscroll_policy);
break;
case PROP_VSCROLL_POLICY:
g_value_set_enum (value, priv->vscroll_policy);
break;
case PROP_WIDTH: case PROP_WIDTH:
g_value_set_uint (value, priv->width); g_value_set_uint (value, priv->width);
break; break;
@ -702,6 +717,14 @@ gtk_layout_set_property (GObject *object,
gtk_layout_set_vadjustment (layout, gtk_layout_set_vadjustment (layout,
(GtkAdjustment*) g_value_get_object (value)); (GtkAdjustment*) g_value_get_object (value));
break; break;
case PROP_HSCROLL_POLICY:
priv->hscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (layout));
break;
case PROP_VSCROLL_POLICY:
priv->vscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (layout));
break;
case PROP_WIDTH: case PROP_WIDTH:
gtk_layout_set_size (layout, g_value_get_uint (value), gtk_layout_set_size (layout, g_value_get_uint (value),
priv->height); priv->height);

View File

@ -63,6 +63,7 @@
#include "config.h" #include "config.h"
#include "gtkscrollable.h" #include "gtkscrollable.h"
#include "gtktypeutils.h"
#include "gtkprivate.h" #include "gtkprivate.h"
#include "gtkintl.h" #include "gtkintl.h"
@ -106,6 +107,38 @@ gtk_scrollable_default_init (GtkScrollableInterface *iface)
GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT,
GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT); GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT);
g_object_interface_install_property (iface, pspec); g_object_interface_install_property (iface, pspec);
/**
* GtkScrollable:hscroll-policy:
*
* Determines whether horizontal scrolling should commence once the scrollable
* widget is allocated less than it's minimum width or less than it's natural width.
*
* Since: 3.0
*/
pspec = g_param_spec_enum ("hscroll-policy",
P_("Horizontal Scrollable Policy"),
P_("How the size of the content should be determined"),
GTK_TYPE_SCROLLABLE_POLICY,
GTK_SCROLL_MINIMUM,
GTK_PARAM_READWRITE);
g_object_interface_install_property (iface, pspec);
/**
* GtkScrollable:vscroll-policy:
*
* Determines whether vertical scrolling should commence once the scrollable
* widget is allocated less than it's minimum height or less than it's natural height.
*
* Since: 3.0
*/
pspec = g_param_spec_enum ("vscroll-policy",
P_("Vertical Scrollable Policy"),
P_("How the size of the content should be determined"),
GTK_TYPE_SCROLLABLE_POLICY,
GTK_SCROLL_MINIMUM,
GTK_PARAM_READWRITE);
g_object_interface_install_property (iface, pspec);
} }
/** /**
@ -203,3 +236,88 @@ gtk_scrollable_set_vadjustment (GtkScrollable *scrollable,
g_object_set (scrollable, "vadjustment", vadjustment, NULL); g_object_set (scrollable, "vadjustment", vadjustment, NULL);
} }
/**
* gtk_scrollable_get_hscroll_policy:
* @scrollable: a #GtkScrollable
*
* Gets the horizontal #GtkScrollablePolicy.
*
* Return value: The horizontal #GtkScrollablePolicy.
*
* Since: 3.0
**/
GtkScrollablePolicy
gtk_scrollable_get_hscroll_policy (GtkScrollable *scrollable)
{
GtkScrollablePolicy policy;
g_return_val_if_fail (GTK_IS_SCROLLABLE (scrollable), GTK_SCROLL_MINIMUM);
g_object_get (scrollable, "hscroll-policy", &policy, NULL);
return policy;
}
/**
* gtk_scrollable_set_hscroll_policy:
* @scrollable: a #GtkScrollable
* @policy: the horizontal #GtkScrollablePolicy
*
* Sets the #GtkScrollablePolicy to determine whether
* horizontal scrolling should commence below minimum or
* below natural width.
*
* Since: 3.0
**/
void
gtk_scrollable_set_hscroll_policy (GtkScrollable *scrollable,
GtkScrollablePolicy policy)
{
g_return_if_fail (GTK_IS_SCROLLABLE (scrollable));
g_object_set (scrollable, "hscroll-policy", policy, NULL);
}
/**
* gtk_scrollable_get_vscroll_policy:
* @scrollable: a #GtkScrollable
*
* Gets the vertical #GtkScrollablePolicy.
*
* Return value: The vertical #GtkScrollablePolicy.
*
* Since: 3.0
**/
GtkScrollablePolicy
gtk_scrollable_get_vscroll_policy (GtkScrollable *scrollable)
{
GtkScrollablePolicy policy;
g_return_val_if_fail (GTK_IS_SCROLLABLE (scrollable), GTK_SCROLL_MINIMUM);
g_object_get (scrollable, "vscroll-policy", &policy, NULL);
return policy;
}
/**
* gtk_scrollable_set_vscroll_policy:
* @scrollable: a #GtkScrollable
* @policy: the vertical #GtkScrollablePolicy
*
* Sets the #GtkScrollablePolicy to determine whether
* vertical scrolling should commence below minimum or
* below natural height.
*
* Since: 3.0
**/
void
gtk_scrollable_set_vscroll_policy (GtkScrollable *scrollable,
GtkScrollablePolicy policy)
{
g_return_if_fail (GTK_IS_SCROLLABLE (scrollable));
g_object_set (scrollable, "vscroll-policy", policy, NULL);
}

View File

@ -25,6 +25,7 @@
#define __GTK_SCROLLABLE_H__ #define __GTK_SCROLLABLE_H__
#include <gtk/gtkadjustment.h> #include <gtk/gtkadjustment.h>
#include <gtk/gtkenums.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@ -42,13 +43,19 @@ struct _GtkScrollableInterface
}; };
/* Public API */ /* Public API */
GType gtk_scrollable_get_type (void) G_GNUC_CONST; GType gtk_scrollable_get_type (void) G_GNUC_CONST;
GtkAdjustment *gtk_scrollable_get_hadjustment (GtkScrollable *scrollable); GtkAdjustment *gtk_scrollable_get_hadjustment (GtkScrollable *scrollable);
void gtk_scrollable_set_hadjustment (GtkScrollable *scrollable, void gtk_scrollable_set_hadjustment (GtkScrollable *scrollable,
GtkAdjustment *hadjustment); GtkAdjustment *hadjustment);
GtkAdjustment *gtk_scrollable_get_vadjustment (GtkScrollable *scrollable); GtkAdjustment *gtk_scrollable_get_vadjustment (GtkScrollable *scrollable);
void gtk_scrollable_set_vadjustment (GtkScrollable *scrollable, void gtk_scrollable_set_vadjustment (GtkScrollable *scrollable,
GtkAdjustment *vadjustment); GtkAdjustment *vadjustment);
GtkScrollablePolicy gtk_scrollable_get_hscroll_policy (GtkScrollable *scrollable);
void gtk_scrollable_set_hscroll_policy (GtkScrollable *scrollable,
GtkScrollablePolicy policy);
GtkScrollablePolicy gtk_scrollable_get_vscroll_policy (GtkScrollable *scrollable);
void gtk_scrollable_set_vscroll_policy (GtkScrollable *scrollable,
GtkScrollablePolicy policy);
G_END_DECLS G_END_DECLS

View File

@ -1460,8 +1460,6 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget,
gint sb_width; gint sb_width;
gint sb_height; gint sb_height;
g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget)); g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
g_return_if_fail (allocation != NULL); g_return_if_fail (allocation != NULL);
@ -1491,8 +1489,8 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget,
child = gtk_bin_get_child (bin); child = gtk_bin_get_child (bin);
if (child && gtk_widget_get_visible (child)) if (child && gtk_widget_get_visible (child))
{ {
gint child_min_width; gint child_scroll_width;
gint child_min_height; gint child_scroll_height;
gboolean previous_hvis; gboolean previous_hvis;
gboolean previous_vvis; gboolean previous_vvis;
guint count = 0; guint count = 0;
@ -1509,41 +1507,50 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget,
/* Determine scrollbar visibility first via hfw apis */ /* Determine scrollbar visibility first via hfw apis */
if (gtk_widget_get_request_mode (child) == GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH) if (gtk_widget_get_request_mode (child) == GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH)
{ {
gtk_widget_get_preferred_width (child, &child_min_width, NULL); if (gtk_scrollable_get_hscroll_policy (GTK_SCROLLABLE (child)) == GTK_SCROLL_MINIMUM)
gtk_widget_get_preferred_width (child, &child_scroll_width, NULL);
else
gtk_widget_get_preferred_width (child, NULL, &child_scroll_width);
if (priv->vscrollbar_policy == GTK_POLICY_AUTOMATIC) if (priv->vscrollbar_policy == GTK_POLICY_AUTOMATIC)
{ {
/* First try without a vertical scrollbar if the content will fit the height /* First try without a vertical scrollbar if the content will fit the height
* given the extra width of the scrollbar */ * given the extra width of the scrollbar */
gtk_widget_get_preferred_height_for_width (child, allocation->width, if (gtk_scrollable_get_vscroll_policy (GTK_SCROLLABLE (child)) == GTK_SCROLL_MINIMUM)
&child_min_height, NULL); gtk_widget_get_preferred_height_for_width (child,
MAX (allocation->width, child_scroll_width),
&child_scroll_height, NULL);
else
gtk_widget_get_preferred_height_for_width (child,
MAX (allocation->width, child_scroll_width),
NULL, &child_scroll_height);
if (priv->hscrollbar_policy == GTK_POLICY_AUTOMATIC) if (priv->hscrollbar_policy == GTK_POLICY_AUTOMATIC)
{ {
/* Does the content height fit the allocation height ? */ /* Does the content height fit the allocation height ? */
priv->vscrollbar_visible = child_min_height > allocation->height; priv->vscrollbar_visible = child_scroll_height > allocation->height;
/* Does the content width fit the allocation with minus a possible scrollbar ? */ /* Does the content width fit the allocation with minus a possible scrollbar ? */
priv->hscrollbar_visible = priv->hscrollbar_visible =
child_min_width > allocation->width - child_scroll_width > allocation->width -
(priv->vscrollbar_visible ? sb_width + sb_spacing : 0); (priv->vscrollbar_visible ? sb_width + sb_spacing : 0);
/* Now that we've guessed the hscrollbar, does the content height fit /* Now that we've guessed the hscrollbar, does the content height fit
* the possible new allocation height ? */ * the possible new allocation height ? */
priv->vscrollbar_visible = priv->vscrollbar_visible =
child_min_height > allocation->height - child_scroll_height > allocation->height -
(priv->hscrollbar_visible ? sb_height + sb_spacing : 0); (priv->hscrollbar_visible ? sb_height + sb_spacing : 0);
/* Now that we've guessed the vscrollbar, does the content width fit /* Now that we've guessed the vscrollbar, does the content width fit
* the possible new allocation width ? */ * the possible new allocation width ? */
priv->hscrollbar_visible = priv->hscrollbar_visible =
child_min_width > allocation->width - child_scroll_width > allocation->width -
(priv->vscrollbar_visible ? sb_width + sb_spacing : 0); (priv->vscrollbar_visible ? sb_width + sb_spacing : 0);
} }
else /* priv->hscrollbar_policy != GTK_POLICY_AUTOMATIC */ else /* priv->hscrollbar_policy != GTK_POLICY_AUTOMATIC */
{ {
priv->hscrollbar_visible = priv->hscrollbar_policy != GTK_POLICY_NEVER; priv->hscrollbar_visible = priv->hscrollbar_policy != GTK_POLICY_NEVER;
priv->vscrollbar_visible = child_min_height > allocation->height - priv->vscrollbar_visible = child_scroll_height > allocation->height -
(priv->hscrollbar_visible ? sb_height + sb_spacing : 0); (priv->hscrollbar_visible ? sb_height + sb_spacing : 0);
} }
} }
@ -1553,7 +1560,7 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget,
if (priv->hscrollbar_policy == GTK_POLICY_AUTOMATIC) if (priv->hscrollbar_policy == GTK_POLICY_AUTOMATIC)
priv->hscrollbar_visible = priv->hscrollbar_visible =
child_min_width > allocation->width - child_scroll_width > allocation->width -
(priv->vscrollbar_visible ? 0 : sb_width + sb_spacing); (priv->vscrollbar_visible ? 0 : sb_width + sb_spacing);
else else
priv->hscrollbar_visible = priv->hscrollbar_policy != GTK_POLICY_NEVER; priv->hscrollbar_visible = priv->hscrollbar_policy != GTK_POLICY_NEVER;
@ -1561,41 +1568,50 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget,
} }
else /* GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT */ else /* GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT */
{ {
gtk_widget_get_preferred_height (child, &child_min_height, NULL); if (gtk_scrollable_get_vscroll_policy (GTK_SCROLLABLE (child)) == GTK_SCROLL_MINIMUM)
gtk_widget_get_preferred_height (child, &child_scroll_height, NULL);
else
gtk_widget_get_preferred_height (child, NULL, &child_scroll_height);
if (priv->hscrollbar_policy == GTK_POLICY_AUTOMATIC) if (priv->hscrollbar_policy == GTK_POLICY_AUTOMATIC)
{ {
/* First try without a horizontal scrollbar if the content will fit the width /* First try without a horizontal scrollbar if the content will fit the width
* given the extra height of the scrollbar */ * given the extra height of the scrollbar */
gtk_widget_get_preferred_width_for_height (child, allocation->height, if (gtk_scrollable_get_hscroll_policy (GTK_SCROLLABLE (child)) == GTK_SCROLL_MINIMUM)
&child_min_width, NULL); gtk_widget_get_preferred_width_for_height (child,
MAX (allocation->height, child_scroll_height),
&child_scroll_width, NULL);
else
gtk_widget_get_preferred_width_for_height (child,
MAX (allocation->height, child_scroll_height),
NULL, &child_scroll_width);
if (priv->vscrollbar_policy == GTK_POLICY_AUTOMATIC) if (priv->vscrollbar_policy == GTK_POLICY_AUTOMATIC)
{ {
/* Does the content width fit the allocation width ? */ /* Does the content width fit the allocation width ? */
priv->hscrollbar_visible = child_min_width > allocation->width; priv->hscrollbar_visible = child_scroll_width > allocation->width;
/* Does the content height fit the allocation with minus a possible scrollbar ? */ /* Does the content height fit the allocation with minus a possible scrollbar ? */
priv->vscrollbar_visible = priv->vscrollbar_visible =
child_min_height > allocation->height - child_scroll_height > allocation->height -
(priv->hscrollbar_visible ? sb_height + sb_spacing : 0); (priv->hscrollbar_visible ? sb_height + sb_spacing : 0);
/* Now that we've guessed the vscrollbar, does the content width fit /* Now that we've guessed the vscrollbar, does the content width fit
* the possible new allocation width ? */ * the possible new allocation width ? */
priv->hscrollbar_visible = priv->hscrollbar_visible =
child_min_width > allocation->width - child_scroll_width > allocation->width -
(priv->vscrollbar_visible ? sb_width + sb_spacing : 0); (priv->vscrollbar_visible ? sb_width + sb_spacing : 0);
/* Now that we've guessed the hscrollbar, does the content height fit /* Now that we've guessed the hscrollbar, does the content height fit
* the possible new allocation height ? */ * the possible new allocation height ? */
priv->vscrollbar_visible = priv->vscrollbar_visible =
child_min_height > allocation->height - child_scroll_height > allocation->height -
(priv->hscrollbar_visible ? sb_height + sb_spacing : 0); (priv->hscrollbar_visible ? sb_height + sb_spacing : 0);
} }
else /* priv->vscrollbar_policy != GTK_POLICY_AUTOMATIC */ else /* priv->vscrollbar_policy != GTK_POLICY_AUTOMATIC */
{ {
priv->vscrollbar_visible = priv->vscrollbar_policy != GTK_POLICY_NEVER; priv->vscrollbar_visible = priv->vscrollbar_policy != GTK_POLICY_NEVER;
priv->hscrollbar_visible = child_min_width > allocation->width - priv->hscrollbar_visible = child_scroll_width > allocation->width -
(priv->vscrollbar_visible ? sb_width + sb_spacing : 0); (priv->vscrollbar_visible ? sb_width + sb_spacing : 0);
} }
} }
@ -1605,7 +1621,7 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget,
if (priv->vscrollbar_policy == GTK_POLICY_AUTOMATIC) if (priv->vscrollbar_policy == GTK_POLICY_AUTOMATIC)
priv->vscrollbar_visible = priv->vscrollbar_visible =
child_min_height > allocation->height - child_scroll_height > allocation->height -
(priv->hscrollbar_visible ? 0 : sb_height + sb_spacing); (priv->hscrollbar_visible ? 0 : sb_height + sb_spacing);
else else
priv->vscrollbar_visible = priv->vscrollbar_policy != GTK_POLICY_NEVER; priv->vscrollbar_visible = priv->vscrollbar_policy != GTK_POLICY_NEVER;

View File

@ -28,6 +28,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <errno.h>
#include "gdk-pixbuf/gdk-pixdata.h" #include "gdk-pixbuf/gdk-pixdata.h"
#include "gtktextbufferserialize.h" #include "gtktextbufferserialize.h"
@ -113,9 +114,10 @@ deserialize_value (const gchar *str,
gchar *tmp; gchar *tmp;
int v; int v;
v = strtol (str, &tmp, 10); errno = 0;
v = g_ascii_strtoll (str, &tmp, 10);
if (tmp == NULL || tmp == str) if (errno || tmp == NULL || tmp == str)
return FALSE; return FALSE;
g_value_set_int (value, v); g_value_set_int (value, v);
@ -143,26 +145,32 @@ deserialize_value (const gchar *str,
gchar *tmp; gchar *tmp;
old = str; old = str;
color.red = strtol (old, &tmp, 16); tmp = NULL;
errno = 0;
color.red = g_ascii_strtoll (old, &tmp, 16);
if (tmp == NULL || tmp == old) if (errno || tmp == old)
return FALSE; return FALSE;
old = tmp; old = tmp;
if (*old++ != ':') if (*old++ != ':')
return FALSE; return FALSE;
color.green = strtol (old, &tmp, 16); tmp = NULL;
if (tmp == NULL || tmp == old) errno = 0;
color.green = g_ascii_strtoll (old, &tmp, 16);
if (errno || tmp == old)
return FALSE; return FALSE;
old = tmp; old = tmp;
if (*old++ != ':') if (*old++ != ':')
return FALSE; return FALSE;
color.blue = strtol (old, &tmp, 16); tmp = NULL;
errno = 0;
color.blue = g_ascii_strtoll (old, &tmp, 16);
if (tmp == NULL || tmp == old || *tmp != '\0') if (errno || tmp == old || *tmp != '\0')
return FALSE; return FALSE;
g_value_set_boxed (value, &color); g_value_set_boxed (value, &color);
@ -836,9 +844,11 @@ check_id_or_name (GMarkupParseContext *context,
has_id = TRUE; has_id = TRUE;
/* Try parsing the integer */ /* Try parsing the integer */
*id = strtol (attribute_values[i], &tmp, 10); tmp = NULL;
errno = 0;
*id = g_ascii_strtoll (attribute_values[i], &tmp, 10);
if (tmp == NULL || tmp == attribute_values[i]) if (errno || tmp == attribute_values[i])
{ {
set_error (error, context, set_error (error, context,
G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
@ -1291,9 +1301,11 @@ parse_tag_element (GMarkupParseContext *context,
} }
} }
prio = strtol (priority, &tmp, 10); tmp = NULL;
errno = 0;
prio = g_ascii_strtoll (priority, &tmp, 10);
if (tmp == NULL || tmp == priority) if (errno || tmp == priority)
{ {
set_error (error, context, set_error (error, context,
G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,

View File

@ -210,6 +210,11 @@ struct _GtkTextViewPrivate
guint mouse_cursor_obscured : 1; guint mouse_cursor_obscured : 1;
guint scroll_after_paste : 1; guint scroll_after_paste : 1;
/* GtkScrollablePolicy needs to be checked when
* driving the scrollable adjustment values */
guint hscroll_policy : 1;
guint vscroll_policy : 1;
}; };
struct _GtkTextPendingScroll struct _GtkTextPendingScroll
@ -260,7 +265,9 @@ enum
PROP_ACCEPTS_TAB, PROP_ACCEPTS_TAB,
PROP_IM_MODULE, PROP_IM_MODULE,
PROP_HADJUSTMENT, PROP_HADJUSTMENT,
PROP_VADJUSTMENT PROP_VADJUSTMENT,
PROP_HSCROLL_POLICY,
PROP_VSCROLL_POLICY
}; };
static void gtk_text_view_finalize (GObject *object); static void gtk_text_view_finalize (GObject *object);
@ -771,8 +778,10 @@ gtk_text_view_class_init (GtkTextViewClass *klass)
GTK_PARAM_READWRITE)); GTK_PARAM_READWRITE));
/* GtkScrollable interface */ /* GtkScrollable interface */
g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment"); g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment");
g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment"); g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment");
g_object_class_override_property (gobject_class, PROP_HSCROLL_POLICY, "hscroll-policy");
g_object_class_override_property (gobject_class, PROP_VSCROLL_POLICY, "vscroll-policy");
/* /*
* Style properties * Style properties
@ -3092,6 +3101,16 @@ gtk_text_view_set_property (GObject *object,
gtk_text_view_set_vadjustment (text_view, g_value_get_object (value)); gtk_text_view_set_vadjustment (text_view, g_value_get_object (value));
break; break;
case PROP_HSCROLL_POLICY:
priv->hscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (text_view));
break;
case PROP_VSCROLL_POLICY:
priv->vscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (text_view));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -3180,6 +3199,14 @@ gtk_text_view_get_property (GObject *object,
g_value_set_object (value, priv->vadjustment); g_value_set_object (value, priv->vadjustment);
break; break;
case PROP_HSCROLL_POLICY:
g_value_set_enum (value, priv->hscroll_policy);
break;
case PROP_VSCROLL_POLICY:
g_value_set_enum (value, priv->vscroll_policy);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;

View File

@ -122,7 +122,9 @@ enum
PROP_ORIENTATION, PROP_ORIENTATION,
PROP_TOOLBAR_STYLE, PROP_TOOLBAR_STYLE,
PROP_HADJUSTMENT, PROP_HADJUSTMENT,
PROP_VADJUSTMENT PROP_VADJUSTMENT,
PROP_HSCROLL_POLICY,
PROP_VSCROLL_POLICY
}; };
enum enum
@ -159,10 +161,15 @@ struct _GtkToolPalettePrivate
GtkSizeGroup *text_size_group; GtkSizeGroup *text_size_group;
GtkSettings *settings; GtkSettings *settings;
gulong settings_connection; gulong settings_connection;
guint drag_source : 2; guint drag_source : 2;
/* GtkScrollablePolicy needs to be checked when
* driving the scrollable adjustment values */
guint hscroll_policy : 1;
guint vscroll_policy : 1;
}; };
struct _GtkToolPaletteDragData struct _GtkToolPaletteDragData
@ -276,6 +283,16 @@ gtk_tool_palette_set_property (GObject *object,
gtk_tool_palette_set_vadjustment (palette, g_value_get_object (value)); gtk_tool_palette_set_vadjustment (palette, g_value_get_object (value));
break; break;
case PROP_HSCROLL_POLICY:
palette->priv->hscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (palette));
break;
case PROP_VSCROLL_POLICY:
palette->priv->vscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (palette));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -316,6 +333,14 @@ gtk_tool_palette_get_property (GObject *object,
g_value_set_object (value, palette->priv->vadjustment); g_value_set_object (value, palette->priv->vadjustment);
break; break;
case PROP_HSCROLL_POLICY:
g_value_set_enum (value, palette->priv->hscroll_policy);
break;
case PROP_VSCROLL_POLICY:
g_value_set_enum (value, palette->priv->vscroll_policy);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -952,10 +977,12 @@ gtk_tool_palette_class_init (GtkToolPaletteClass *cls)
*/ */
wclass->screen_changed = gtk_tool_palette_screen_changed; wclass->screen_changed = gtk_tool_palette_screen_changed;
g_object_class_override_property (oclass, PROP_ORIENTATION, "orientation"); g_object_class_override_property (oclass, PROP_ORIENTATION, "orientation");
g_object_class_override_property (oclass, PROP_HADJUSTMENT, "hadjustment"); g_object_class_override_property (oclass, PROP_HADJUSTMENT, "hadjustment");
g_object_class_override_property (oclass, PROP_VADJUSTMENT, "vadjustment"); g_object_class_override_property (oclass, PROP_VADJUSTMENT, "vadjustment");
g_object_class_override_property (oclass, PROP_HSCROLL_POLICY, "hscroll-policy");
g_object_class_override_property (oclass, PROP_VSCROLL_POLICY, "vscroll-policy");
/** /**
* GtkToolPalette:icon-size: * GtkToolPalette:icon-size:

View File

@ -302,6 +302,11 @@ struct _GtkTreeViewPrivate
/* Whether our key press handler is to avoid sending an unhandled binding to the search entry */ /* Whether our key press handler is to avoid sending an unhandled binding to the search entry */
guint search_entry_avoid_unhandled_binding : 1; guint search_entry_avoid_unhandled_binding : 1;
/* GtkScrollablePolicy needs to be checked when
* driving the scrollable adjustment values */
guint hscroll_policy : 1;
guint vscroll_policy : 1;
}; };
#ifdef __GNUC__ #ifdef __GNUC__

View File

@ -131,6 +131,8 @@ enum {
PROP_MODEL, PROP_MODEL,
PROP_HADJUSTMENT, PROP_HADJUSTMENT,
PROP_VADJUSTMENT, PROP_VADJUSTMENT,
PROP_HSCROLL_POLICY,
PROP_VSCROLL_POLICY,
PROP_HEADERS_VISIBLE, PROP_HEADERS_VISIBLE,
PROP_HEADERS_CLICKABLE, PROP_HEADERS_CLICKABLE,
PROP_EXPANDER_COLUMN, PROP_EXPANDER_COLUMN,
@ -568,8 +570,10 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
GTK_TYPE_TREE_MODEL, GTK_TYPE_TREE_MODEL,
GTK_PARAM_READWRITE)); GTK_PARAM_READWRITE));
g_object_class_override_property (o_class, PROP_HADJUSTMENT, "hadjustment"); g_object_class_override_property (o_class, PROP_HADJUSTMENT, "hadjustment");
g_object_class_override_property (o_class, PROP_VADJUSTMENT, "vadjustment"); g_object_class_override_property (o_class, PROP_VADJUSTMENT, "vadjustment");
g_object_class_override_property (o_class, PROP_HSCROLL_POLICY, "hscroll-policy");
g_object_class_override_property (o_class, PROP_VSCROLL_POLICY, "vscroll-policy");
g_object_class_install_property (o_class, g_object_class_install_property (o_class,
PROP_HEADERS_VISIBLE, PROP_HEADERS_VISIBLE,
@ -1366,6 +1370,14 @@ gtk_tree_view_set_property (GObject *object,
case PROP_VADJUSTMENT: case PROP_VADJUSTMENT:
gtk_tree_view_set_vadjustment (tree_view, g_value_get_object (value)); gtk_tree_view_set_vadjustment (tree_view, g_value_get_object (value));
break; break;
case PROP_HSCROLL_POLICY:
tree_view->priv->hscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
break;
case PROP_VSCROLL_POLICY:
tree_view->priv->vscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
break;
case PROP_HEADERS_VISIBLE: case PROP_HEADERS_VISIBLE:
gtk_tree_view_set_headers_visible (tree_view, g_value_get_boolean (value)); gtk_tree_view_set_headers_visible (tree_view, g_value_get_boolean (value));
break; break;
@ -1441,6 +1453,12 @@ gtk_tree_view_get_property (GObject *object,
case PROP_VADJUSTMENT: case PROP_VADJUSTMENT:
g_value_set_object (value, tree_view->priv->vadjustment); g_value_set_object (value, tree_view->priv->vadjustment);
break; break;
case PROP_HSCROLL_POLICY:
g_value_set_enum (value, tree_view->priv->hscroll_policy);
break;
case PROP_VSCROLL_POLICY:
g_value_set_enum (value, tree_view->priv->vscroll_policy);
break;
case PROP_HEADERS_VISIBLE: case PROP_HEADERS_VISIBLE:
g_value_set_boolean (value, gtk_tree_view_get_headers_visible (tree_view)); g_value_set_boolean (value, gtk_tree_view_get_headers_visible (tree_view));
break; break;

View File

@ -66,14 +66,19 @@ struct _GtkViewportPrivate
GdkWindow *bin_window; GdkWindow *bin_window;
GdkWindow *view_window; GdkWindow *view_window;
/* GtkScrollablePolicy needs to be checked when
* driving the scrollable adjustment values */
guint hscroll_policy : 1;
guint vscroll_policy : 1;
}; };
enum { enum {
PROP_0, PROP_0,
PROP_HADJUSTMENT, PROP_HADJUSTMENT,
PROP_VADJUSTMENT, PROP_VADJUSTMENT,
PROP_MIN_DISPLAY_WIDTH, PROP_HSCROLL_POLICY,
PROP_MIN_DISPLAY_HEIGHT, PROP_VSCROLL_POLICY,
PROP_SHADOW_TYPE PROP_SHADOW_TYPE
}; };
@ -139,8 +144,10 @@ gtk_viewport_class_init (GtkViewportClass *class)
container_class->add = gtk_viewport_add; container_class->add = gtk_viewport_add;
/* GtkScrollable implementation */ /* GtkScrollable implementation */
g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment"); g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment");
g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment"); g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment");
g_object_class_override_property (gobject_class, PROP_HSCROLL_POLICY, "hscroll-policy");
g_object_class_override_property (gobject_class, PROP_VSCROLL_POLICY, "vscroll-policy");
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_SHADOW_TYPE, PROP_SHADOW_TYPE,
@ -172,6 +179,14 @@ gtk_viewport_set_property (GObject *object,
case PROP_VADJUSTMENT: case PROP_VADJUSTMENT:
gtk_viewport_set_vadjustment (viewport, g_value_get_object (value)); gtk_viewport_set_vadjustment (viewport, g_value_get_object (value));
break; break;
case PROP_HSCROLL_POLICY:
viewport->priv->hscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (viewport));
break;
case PROP_VSCROLL_POLICY:
viewport->priv->vscroll_policy = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (viewport));
break;
case PROP_SHADOW_TYPE: case PROP_SHADOW_TYPE:
gtk_viewport_set_shadow_type (viewport, g_value_get_enum (value)); gtk_viewport_set_shadow_type (viewport, g_value_get_enum (value));
break; break;
@ -198,6 +213,12 @@ gtk_viewport_get_property (GObject *object,
case PROP_VADJUSTMENT: case PROP_VADJUSTMENT:
g_value_set_object (value, priv->vadjustment); g_value_set_object (value, priv->vadjustment);
break; break;
case PROP_HSCROLL_POLICY:
g_value_set_enum (value, priv->hscroll_policy);
break;
case PROP_VSCROLL_POLICY:
g_value_set_enum (value, priv->vscroll_policy);
break;
case PROP_SHADOW_TYPE: case PROP_SHADOW_TYPE:
g_value_set_enum (value, priv->shadow_type); g_value_set_enum (value, priv->shadow_type);
break; break;
@ -414,13 +435,23 @@ viewport_set_hadjustment_values (GtkViewport *viewport,
child = gtk_bin_get_child (bin); child = gtk_bin_get_child (bin);
if (child && gtk_widget_get_visible (child)) if (child && gtk_widget_get_visible (child))
{ {
gint minimum_width; gint minimum_width, natural_width;
gint scroll_height;
if (viewport->priv->vscroll_policy == GTK_SCROLL_MINIMUM)
gtk_widget_get_preferred_height (child, &scroll_height, NULL);
else
gtk_widget_get_preferred_height (child, NULL, &scroll_height);
gtk_widget_get_preferred_width_for_height (child, gtk_widget_get_preferred_width_for_height (child,
view_allocation.height, MAX (view_allocation.height, scroll_height),
&minimum_width, &minimum_width,
NULL); &natural_width);
hadjustment->upper = MAX (minimum_width, view_allocation.width);
if (viewport->priv->hscroll_policy == GTK_SCROLL_MINIMUM)
hadjustment->upper = MAX (minimum_width, view_allocation.width);
else
hadjustment->upper = MAX (natural_width, view_allocation.width);
} }
else else
hadjustment->upper = view_allocation.width; hadjustment->upper = view_allocation.width;
@ -456,14 +487,23 @@ viewport_set_vadjustment_values (GtkViewport *viewport,
child = gtk_bin_get_child (bin); child = gtk_bin_get_child (bin);
if (child && gtk_widget_get_visible (child)) if (child && gtk_widget_get_visible (child))
{ {
gint minimum_height; gint minimum_height, natural_height;
gint scroll_width;
if (viewport->priv->hscroll_policy == GTK_SCROLL_MINIMUM)
gtk_widget_get_preferred_width (child, &scroll_width, NULL);
else
gtk_widget_get_preferred_width (child, NULL, &scroll_width);
gtk_widget_get_preferred_height_for_width (child, gtk_widget_get_preferred_height_for_width (child,
view_allocation.width, MAX (view_allocation.width, scroll_width),
&minimum_height, &minimum_height,
NULL); &natural_height);
vadjustment->upper = MAX (minimum_height, view_allocation.height); if (viewport->priv->vscroll_policy == GTK_SCROLL_MINIMUM)
vadjustment->upper = MAX (minimum_height, view_allocation.height);
else
vadjustment->upper = MAX (natural_height, view_allocation.height);
} }
else else
vadjustment->upper = view_allocation.height; vadjustment->upper = view_allocation.height;

View File

@ -531,9 +531,10 @@ extract_time_from_startup_id (const gchar* startup_id)
/* Skip past the "_TIME" part */ /* Skip past the "_TIME" part */
timestr += 5; timestr += 5;
end = NULL;
errno = 0; errno = 0;
timestamp = strtoul (timestr, &end, 0); timestamp = g_ascii_strtoull (timestr, &end, 0);
if (end != timestr && errno == 0) if (errno == 0 && end != timestr)
retval = timestamp; retval = timestamp;
} }

View File

@ -55,7 +55,6 @@ gtk/gtkcolorbutton.c
gtk/gtkcolorsel.c gtk/gtkcolorsel.c
gtk/gtkcolorseldialog.c gtk/gtkcolorseldialog.c
gtk/gtkcombobox.c gtk/gtkcombobox.c
gtk/gtkcomboboxentry.c
gtk/gtkcontainer.c gtk/gtkcontainer.c
gtk/gtkcustompaperunixdialog.c gtk/gtkcustompaperunixdialog.c
gtk/gtkdialog.c gtk/gtkdialog.c

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2107,7 +2107,6 @@ msgid "_Cancel"
msgstr "أل_غِ" msgstr "أل_غِ"
#: gtk/gtkstock.c:326 #: gtk/gtkstock.c:326
#, fuzzy
msgctxt "Stock label" msgctxt "Stock label"
msgid "_CD-ROM" msgid "_CD-ROM"
msgstr "ا_سطوانة" msgstr "ا_سطوانة"
@ -2246,7 +2245,6 @@ msgid "_Up"
msgstr "ف_وق" msgstr "ف_وق"
#: gtk/gtkstock.c:360 #: gtk/gtkstock.c:360
#, fuzzy
msgctxt "Stock label" msgctxt "Stock label"
msgid "_Hard Disk" msgid "_Hard Disk"
msgstr "قرص _صلب" msgstr "قرص _صلب"
@ -3898,7 +3896,7 @@ msgid "Printer '%s' is out of paper."
msgstr "نفذ الورق من الطابعة '%s'." msgstr "نفذ الورق من الطابعة '%s'."
#: modules/printbackends/cups/gtkprintbackendcups.c:1686 #: modules/printbackends/cups/gtkprintbackendcups.c:1686
#, fuzzy, c-format #, c-format
msgid "Printer '%s' is currently offline." msgid "Printer '%s' is currently offline."
msgstr "الطابعة '%s' غير متصلة حاليا." msgstr "الطابعة '%s' غير متصلة حاليا."

601
po/gl.po

File diff suppressed because it is too large Load Diff

View File

@ -93,7 +93,8 @@ noinst_PROGRAMS = $(TEST_PROGS) \
testtooltips \ testtooltips \
testexpand \ testexpand \
testexpander \ testexpander \
testvolumebutton testvolumebutton \
testscrolledwindow
if USE_X11 if USE_X11
noinst_PROGRAMS += testerrors noinst_PROGRAMS += testerrors
@ -177,6 +178,7 @@ testactions_DEPENDENCIES = $(TEST_DEPS)
testgrouping_DEPENDENCIES = $(TEST_DEPS) testgrouping_DEPENDENCIES = $(TEST_DEPS)
testtooltips_DEPENDENCIES = $(TEST_DEPS) testtooltips_DEPENDENCIES = $(TEST_DEPS)
testvolumebutton_DEPENDENCIES = $(TEST_DEPS) testvolumebutton_DEPENDENCIES = $(TEST_DEPS)
testscrolledwindow_DEPENDENCIES = $(TEST_DEPS)
testwindows_DEPENDENCIES = $(TEST_DEPS) testwindows_DEPENDENCIES = $(TEST_DEPS)
testexpand_DEPENDENCIES = $(TEST_DEPS) testexpand_DEPENDENCIES = $(TEST_DEPS)
testexpander_DEPENDENCIES = $(TEST_DEPS) testexpander_DEPENDENCIES = $(TEST_DEPS)
@ -249,6 +251,7 @@ testactions_LDADD = $(LDADDS)
testgrouping_LDADD = $(LDADDS) testgrouping_LDADD = $(LDADDS)
testtooltips_LDADD = $(LDADDS) testtooltips_LDADD = $(LDADDS)
testvolumebutton_LDADD = $(LDADDS) testvolumebutton_LDADD = $(LDADDS)
testscrolledwindow_LDADD = $(LDADDS)
testwindows_LDADD = $(LDADDS) testwindows_LDADD = $(LDADDS)
testexpand_LDADD = $(LDADDS) testexpand_LDADD = $(LDADDS)
testexpander_LDADD = $(LDADDS) testexpander_LDADD = $(LDADDS)
@ -355,6 +358,9 @@ testrecentchoosermenu_SOURCES = \
testvolumebutton_SOURCES = \ testvolumebutton_SOURCES = \
testvolumebutton.c testvolumebutton.c
testscrolledwindow_SOURCES = \
testscrolledwindow.c
testoffscreen_SOURCES = \ testoffscreen_SOURCES = \
gtkoffscreenbox.c \ gtkoffscreenbox.c \
gtkoffscreenbox.h \ gtkoffscreenbox.h \

View File

@ -158,9 +158,17 @@ calendar_day_selected_double_click (GtkWidget *widget,
CalendarData *data) CalendarData *data)
{ {
char buffer[256] = "day_selected_double_click: "; char buffer[256] = "day_selected_double_click: ";
guint day;
calendar_date_to_string (data, buffer+27, 256-27); calendar_date_to_string (data, buffer+27, 256-27);
calendar_set_signal_strings (buffer, data); calendar_set_signal_strings (buffer, data);
gtk_calendar_get_date (GTK_CALENDAR (data->window),
NULL, NULL, &day);
if (gtk_calendar_get_day_is_marked (GTK_CALENDAR (data->window), day))
gtk_calendar_unmark_day (GTK_CALENDAR (data->window), day);
else
gtk_calendar_mark_day (GTK_CALENDAR (data->window), day);
} }
static void static void
@ -664,6 +672,9 @@ int main(int argc,
{ {
gtk_init (&argc, &argv); gtk_init (&argc, &argv);
if (g_getenv ("GTK_RTL"))
gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);
create_calendar(); create_calendar();
gtk_main(); gtk_main();

165
tests/testscrolledwindow.c Normal file
View File

@ -0,0 +1,165 @@
#include <gtk/gtk.h>
static void
horizontal_policy_changed (GtkComboBox *combo_box,
GtkViewport *viewport)
{
GtkScrollablePolicy policy = gtk_combo_box_get_active (combo_box);
gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (viewport), policy);
}
static void
vertical_policy_changed (GtkComboBox *combo_box,
GtkViewport *viewport)
{
GtkScrollablePolicy policy = gtk_combo_box_get_active (combo_box);
gtk_scrollable_set_vscroll_policy (GTK_SCROLLABLE (viewport), policy);
}
static void
label_flip_changed (GtkComboBox *combo_box,
GtkLabel *label)
{
gint active = gtk_combo_box_get_active (combo_box);
if (active == 0)
gtk_label_set_angle (label, 0.0);
else
gtk_label_set_angle (label, 90.0);
}
static void
scrollable_policy (void)
{
GtkWidget *window, *swindow, *hbox, *vbox, *frame, *cntl;
GtkWidget *viewport, *label, *expander, *widget;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
hbox = gtk_hbox_new (FALSE, 2);
vbox = gtk_vbox_new (FALSE, 6);
gtk_container_set_border_width (GTK_CONTAINER (window), 8);
gtk_widget_show (vbox);
gtk_widget_show (hbox);
gtk_container_add (GTK_CONTAINER (window), hbox);
gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
frame = gtk_frame_new ("Scrolled Window");
gtk_widget_show (frame);
gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
swindow = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_widget_show (swindow);
gtk_container_add (GTK_CONTAINER (frame), swindow);
viewport = gtk_viewport_new (NULL, NULL);
label = gtk_label_new ("Here is a wrapping label with a minimum width-chars of 40 and "
"a natural max-width-chars of 100 to demonstrate the usage of "
"scrollable widgets \"hscroll-policy\" and \"vscroll-policy\" "
"properties. Note also that when playing with the window height, "
"one can observe that the vscrollbar disappears as soon as there "
"is enough height to fit the content vertically if the window were "
"to be allocated a width without a vscrollbar present");
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
gtk_label_set_width_chars (GTK_LABEL (label), 40);
gtk_label_set_max_width_chars (GTK_LABEL (label), 100);
gtk_widget_show (label);
gtk_widget_show (viewport);
gtk_container_add (GTK_CONTAINER (viewport), label);
gtk_container_add (GTK_CONTAINER (swindow), viewport);
/* Add controls here */
expander = gtk_expander_new ("Controls");
gtk_expander_set_expanded (GTK_EXPANDER (expander), TRUE);
cntl = gtk_vbox_new (FALSE, 2);
gtk_widget_show (cntl);
gtk_widget_show (expander);
gtk_container_add (GTK_CONTAINER (expander), cntl);
gtk_box_pack_start (GTK_BOX (vbox), expander, FALSE, FALSE, 0);
/* Add Horizontal policy control here */
hbox = gtk_hbox_new (FALSE, 2);
gtk_widget_show (hbox);
widget = gtk_label_new ("hscroll-policy");
gtk_widget_show (widget);
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
widget = gtk_combo_box_text_new ();
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Minimum");
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Natural");
gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
gtk_widget_show (widget);
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (cntl), hbox, FALSE, FALSE, 0);
g_signal_connect (G_OBJECT (widget), "changed",
G_CALLBACK (horizontal_policy_changed), viewport);
/* Add Vertical policy control here */
hbox = gtk_hbox_new (FALSE, 2);
gtk_widget_show (hbox);
widget = gtk_label_new ("vscroll-policy");
gtk_widget_show (widget);
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
widget = gtk_combo_box_text_new ();
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Minimum");
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Natural");
gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
gtk_widget_show (widget);
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (cntl), hbox, FALSE, FALSE, 0);
g_signal_connect (G_OBJECT (widget), "changed",
G_CALLBACK (vertical_policy_changed), viewport);
/* Add Label orientation control here */
hbox = gtk_hbox_new (FALSE, 2);
gtk_widget_show (hbox);
widget = gtk_label_new ("label-flip");
gtk_widget_show (widget);
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
widget = gtk_combo_box_text_new ();
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Horizontal");
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Vertical");
gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
gtk_widget_show (widget);
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (cntl), hbox, FALSE, FALSE, 0);
g_signal_connect (G_OBJECT (widget), "changed",
G_CALLBACK (label_flip_changed), label);
gtk_widget_show (window);
}
int
main (int argc, char *argv[])
{
gtk_init (NULL, NULL);
scrollable_policy ();
gtk_main ();
return 0;
}