Fix for #104811, Padraig O'Briain:
Fri Feb 13 00:54:59 2004 Matthias Clasen <maclas@gmx.de> Fix for #104811, Padraig O'Briain: * gtk/gtkscale.h: * gtk/gtkscale.c (_gtk_scale_clear_layout): * gtk/gtkscale.c (gtk_scale_get_layout_offsets): * gtk/gtkscale.c (gtk_scale_get_layout): New functions to determine the text and its position from a GtkScale, to make it more accessible. * gtk/gtkhscale.c (gtk_hscale_get_layout_offsets): * gtk/gtkvscale.c (gtk_vscale_get_layout_offsets): Implementations of the new GtkScale vfunc.
This commit is contained in:

committed by
Matthias Clasen

parent
0c4c9f0d1c
commit
f6a32cf0d1
13
ChangeLog
13
ChangeLog
@ -1,3 +1,16 @@
|
|||||||
|
Fri Feb 13 00:54:59 2004 Matthias Clasen <maclas@gmx.de>
|
||||||
|
|
||||||
|
Fix for #104811, Padraig O'Briain:
|
||||||
|
|
||||||
|
* gtk/gtkscale.h:
|
||||||
|
* gtk/gtkscale.c (_gtk_scale_clear_layout):
|
||||||
|
* gtk/gtkscale.c (gtk_scale_get_layout_offsets):
|
||||||
|
* gtk/gtkscale.c (gtk_scale_get_layout): New functions to determine the
|
||||||
|
text and its position from a GtkScale, to make it more accessible.
|
||||||
|
* gtk/gtkhscale.c (gtk_hscale_get_layout_offsets):
|
||||||
|
* gtk/gtkvscale.c (gtk_vscale_get_layout_offsets): Implementations of the
|
||||||
|
new GtkScale vfunc.
|
||||||
|
|
||||||
Thu Feb 12 17:59:52 2004 Owen Taylor <otaylor@redhat.com>
|
Thu Feb 12 17:59:52 2004 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkicontheme.c (gtk_icon_theme_get_search_path):
|
* gtk/gtkicontheme.c (gtk_icon_theme_get_search_path):
|
||||||
|
@ -1,3 +1,16 @@
|
|||||||
|
Fri Feb 13 00:54:59 2004 Matthias Clasen <maclas@gmx.de>
|
||||||
|
|
||||||
|
Fix for #104811, Padraig O'Briain:
|
||||||
|
|
||||||
|
* gtk/gtkscale.h:
|
||||||
|
* gtk/gtkscale.c (_gtk_scale_clear_layout):
|
||||||
|
* gtk/gtkscale.c (gtk_scale_get_layout_offsets):
|
||||||
|
* gtk/gtkscale.c (gtk_scale_get_layout): New functions to determine the
|
||||||
|
text and its position from a GtkScale, to make it more accessible.
|
||||||
|
* gtk/gtkhscale.c (gtk_hscale_get_layout_offsets):
|
||||||
|
* gtk/gtkvscale.c (gtk_vscale_get_layout_offsets): Implementations of the
|
||||||
|
new GtkScale vfunc.
|
||||||
|
|
||||||
Thu Feb 12 17:59:52 2004 Owen Taylor <otaylor@redhat.com>
|
Thu Feb 12 17:59:52 2004 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkicontheme.c (gtk_icon_theme_get_search_path):
|
* gtk/gtkicontheme.c (gtk_icon_theme_get_search_path):
|
||||||
|
@ -1,3 +1,16 @@
|
|||||||
|
Fri Feb 13 00:54:59 2004 Matthias Clasen <maclas@gmx.de>
|
||||||
|
|
||||||
|
Fix for #104811, Padraig O'Briain:
|
||||||
|
|
||||||
|
* gtk/gtkscale.h:
|
||||||
|
* gtk/gtkscale.c (_gtk_scale_clear_layout):
|
||||||
|
* gtk/gtkscale.c (gtk_scale_get_layout_offsets):
|
||||||
|
* gtk/gtkscale.c (gtk_scale_get_layout): New functions to determine the
|
||||||
|
text and its position from a GtkScale, to make it more accessible.
|
||||||
|
* gtk/gtkhscale.c (gtk_hscale_get_layout_offsets):
|
||||||
|
* gtk/gtkvscale.c (gtk_vscale_get_layout_offsets): Implementations of the
|
||||||
|
new GtkScale vfunc.
|
||||||
|
|
||||||
Thu Feb 12 17:59:52 2004 Owen Taylor <otaylor@redhat.com>
|
Thu Feb 12 17:59:52 2004 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkicontheme.c (gtk_icon_theme_get_search_path):
|
* gtk/gtkicontheme.c (gtk_icon_theme_get_search_path):
|
||||||
|
@ -1,3 +1,16 @@
|
|||||||
|
Fri Feb 13 00:54:59 2004 Matthias Clasen <maclas@gmx.de>
|
||||||
|
|
||||||
|
Fix for #104811, Padraig O'Briain:
|
||||||
|
|
||||||
|
* gtk/gtkscale.h:
|
||||||
|
* gtk/gtkscale.c (_gtk_scale_clear_layout):
|
||||||
|
* gtk/gtkscale.c (gtk_scale_get_layout_offsets):
|
||||||
|
* gtk/gtkscale.c (gtk_scale_get_layout): New functions to determine the
|
||||||
|
text and its position from a GtkScale, to make it more accessible.
|
||||||
|
* gtk/gtkhscale.c (gtk_hscale_get_layout_offsets):
|
||||||
|
* gtk/gtkvscale.c (gtk_vscale_get_layout_offsets): Implementations of the
|
||||||
|
new GtkScale vfunc.
|
||||||
|
|
||||||
Thu Feb 12 17:59:52 2004 Owen Taylor <otaylor@redhat.com>
|
Thu Feb 12 17:59:52 2004 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkicontheme.c (gtk_icon_theme_get_search_path):
|
* gtk/gtkicontheme.c (gtk_icon_theme_get_search_path):
|
||||||
|
@ -1,3 +1,16 @@
|
|||||||
|
Fri Feb 13 00:54:59 2004 Matthias Clasen <maclas@gmx.de>
|
||||||
|
|
||||||
|
Fix for #104811, Padraig O'Briain:
|
||||||
|
|
||||||
|
* gtk/gtkscale.h:
|
||||||
|
* gtk/gtkscale.c (_gtk_scale_clear_layout):
|
||||||
|
* gtk/gtkscale.c (gtk_scale_get_layout_offsets):
|
||||||
|
* gtk/gtkscale.c (gtk_scale_get_layout): New functions to determine the
|
||||||
|
text and its position from a GtkScale, to make it more accessible.
|
||||||
|
* gtk/gtkhscale.c (gtk_hscale_get_layout_offsets):
|
||||||
|
* gtk/gtkvscale.c (gtk_vscale_get_layout_offsets): Implementations of the
|
||||||
|
new GtkScale vfunc.
|
||||||
|
|
||||||
Thu Feb 12 17:59:52 2004 Owen Taylor <otaylor@redhat.com>
|
Thu Feb 12 17:59:52 2004 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkicontheme.c (gtk_icon_theme_get_search_path):
|
* gtk/gtkicontheme.c (gtk_icon_theme_get_search_path):
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
Fri Feb 13 00:54:24 2004 Matthias Clasen <maclas@gmx.de>
|
||||||
|
|
||||||
|
* gtk/gtk-sections.txt: Add gtk_scale_get_layout
|
||||||
|
and gtk_scale_get_layout_offsets.
|
||||||
|
|
||||||
Thu Feb 12 23:56:12 2004 Matthias Clasen <maclas@gmx.de>
|
Thu Feb 12 23:56:12 2004 Matthias Clasen <maclas@gmx.de>
|
||||||
|
|
||||||
* gtk/gtk-sections.txt: Add gtk_tooltips_get_info_from_tip_window.
|
* gtk/gtk-sections.txt: Add gtk_tooltips_get_info_from_tip_window.
|
||||||
|
@ -2476,6 +2476,8 @@ gtk_scale_set_value_pos
|
|||||||
gtk_scale_get_digits
|
gtk_scale_get_digits
|
||||||
gtk_scale_get_draw_value
|
gtk_scale_get_draw_value
|
||||||
gtk_scale_get_value_pos
|
gtk_scale_get_value_pos
|
||||||
|
gtk_scale_get_layout
|
||||||
|
gtk_scale_get_layout_offsets
|
||||||
<SUBSECTION Standard>
|
<SUBSECTION Standard>
|
||||||
GTK_SCALE
|
GTK_SCALE
|
||||||
GTK_IS_SCALE
|
GTK_IS_SCALE
|
||||||
|
130
gtk/gtkhscale.c
130
gtk/gtkhscale.c
@ -37,6 +37,10 @@ static void gtk_hscale_init (GtkHScale *hscale);
|
|||||||
static gboolean gtk_hscale_expose (GtkWidget *widget,
|
static gboolean gtk_hscale_expose (GtkWidget *widget,
|
||||||
GdkEventExpose *event);
|
GdkEventExpose *event);
|
||||||
|
|
||||||
|
static void gtk_hscale_get_layout_offsets (GtkScale *scale,
|
||||||
|
gint *x,
|
||||||
|
gint *y);
|
||||||
|
|
||||||
GType
|
GType
|
||||||
gtk_hscale_get_type (void)
|
gtk_hscale_get_type (void)
|
||||||
{
|
{
|
||||||
@ -69,14 +73,18 @@ gtk_hscale_class_init (GtkHScaleClass *class)
|
|||||||
{
|
{
|
||||||
GtkWidgetClass *widget_class;
|
GtkWidgetClass *widget_class;
|
||||||
GtkRangeClass *range_class;
|
GtkRangeClass *range_class;
|
||||||
|
GtkScaleClass *scale_class;
|
||||||
|
|
||||||
widget_class = GTK_WIDGET_CLASS (class);
|
widget_class = GTK_WIDGET_CLASS (class);
|
||||||
range_class = GTK_RANGE_CLASS (class);
|
range_class = GTK_RANGE_CLASS (class);
|
||||||
|
scale_class = GTK_SCALE_CLASS (class);
|
||||||
|
|
||||||
parent_class = g_type_class_peek_parent (class);
|
parent_class = g_type_class_peek_parent (class);
|
||||||
|
|
||||||
range_class->slider_detail = "hscale";
|
range_class->slider_detail = "hscale";
|
||||||
|
|
||||||
|
scale_class->get_layout_offsets = gtk_hscale_get_layout_offsets;
|
||||||
|
|
||||||
widget_class->expose_event = gtk_hscale_expose;
|
widget_class->expose_event = gtk_hscale_expose;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,13 +153,9 @@ static gboolean
|
|||||||
gtk_hscale_expose (GtkWidget *widget,
|
gtk_hscale_expose (GtkWidget *widget,
|
||||||
GdkEventExpose *event)
|
GdkEventExpose *event)
|
||||||
{
|
{
|
||||||
GtkRange *range;
|
|
||||||
GtkHScale *hscale;
|
|
||||||
GtkScale *scale;
|
GtkScale *scale;
|
||||||
|
|
||||||
range = GTK_RANGE (widget);
|
|
||||||
scale = GTK_SCALE (widget);
|
scale = GTK_SCALE (widget);
|
||||||
hscale = GTK_HSCALE (widget);
|
|
||||||
|
|
||||||
/* We need to chain up _first_ so the various geometry members of
|
/* We need to chain up _first_ so the various geometry members of
|
||||||
* GtkRange struct are updated.
|
* GtkRange struct are updated.
|
||||||
@ -162,57 +166,11 @@ gtk_hscale_expose (GtkWidget *widget,
|
|||||||
if (scale->draw_value)
|
if (scale->draw_value)
|
||||||
{
|
{
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
PangoRectangle logical_rect;
|
|
||||||
gchar *txt;
|
|
||||||
gint x, y;
|
gint x, y;
|
||||||
GtkStateType state_type;
|
GtkStateType state_type;
|
||||||
gint value_spacing;
|
|
||||||
|
|
||||||
gtk_widget_style_get (widget, "value_spacing", &value_spacing, NULL);
|
layout = gtk_scale_get_layout (scale);
|
||||||
|
gtk_scale_get_layout_offsets (scale, &x, &y);
|
||||||
txt = _gtk_scale_format_value (scale,
|
|
||||||
GTK_RANGE (scale)->adjustment->value);
|
|
||||||
|
|
||||||
layout = gtk_widget_create_pango_layout (widget, txt);
|
|
||||||
g_free (txt);
|
|
||||||
|
|
||||||
pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
|
|
||||||
|
|
||||||
switch (scale->value_pos)
|
|
||||||
{
|
|
||||||
case GTK_POS_LEFT:
|
|
||||||
x = range->range_rect.x - value_spacing - logical_rect.width;
|
|
||||||
y = range->range_rect.y + (range->range_rect.height - logical_rect.height) / 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_POS_RIGHT:
|
|
||||||
x = range->range_rect.x + range->range_rect.width + value_spacing;
|
|
||||||
y = range->range_rect.y + (range->range_rect.height - logical_rect.height) / 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_POS_TOP:
|
|
||||||
x = range->slider_start +
|
|
||||||
(range->slider_end - range->slider_start - logical_rect.width) / 2;
|
|
||||||
x = CLAMP (x, 0, widget->allocation.width - logical_rect.width);
|
|
||||||
y = range->range_rect.y - logical_rect.height - value_spacing;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_POS_BOTTOM:
|
|
||||||
x = range->slider_start +
|
|
||||||
(range->slider_end - range->slider_start - logical_rect.width) / 2;
|
|
||||||
x = CLAMP (x, 0, widget->allocation.width - logical_rect.width);
|
|
||||||
y = range->range_rect.y + range->range_rect.height + value_spacing;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
g_return_val_if_reached (FALSE);
|
|
||||||
x = 0;
|
|
||||||
y = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
x += widget->allocation.x;
|
|
||||||
y += widget->allocation.y;
|
|
||||||
|
|
||||||
state_type = GTK_STATE_NORMAL;
|
state_type = GTK_STATE_NORMAL;
|
||||||
if (!GTK_WIDGET_IS_SENSITIVE (scale))
|
if (!GTK_WIDGET_IS_SENSITIVE (scale))
|
||||||
@ -228,8 +186,74 @@ gtk_hscale_expose (GtkWidget *widget,
|
|||||||
x, y,
|
x, y,
|
||||||
layout);
|
layout);
|
||||||
|
|
||||||
g_object_unref (layout);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_hscale_get_layout_offsets (GtkScale *scale,
|
||||||
|
gint *x,
|
||||||
|
gint *y)
|
||||||
|
{
|
||||||
|
GtkWidget *widget;
|
||||||
|
GtkRange *range;
|
||||||
|
GtkScale *scale;
|
||||||
|
PangoLayout *layout;
|
||||||
|
PangoRectangle logical_rect;
|
||||||
|
gint value_spacing;
|
||||||
|
|
||||||
|
widget = GTK_WIDGET (scale);
|
||||||
|
layout = gtk_scale_get_layout (scale);
|
||||||
|
|
||||||
|
if (!layout)
|
||||||
|
{
|
||||||
|
*x = 0;
|
||||||
|
*y = 0;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_widget_style_get (widget, "value_spacing", &value_spacing, NULL);
|
||||||
|
|
||||||
|
range = GTK_RANGE (widget);
|
||||||
|
scale = GTK_SCALE (widget);
|
||||||
|
|
||||||
|
pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
|
||||||
|
|
||||||
|
switch (scale->value_pos)
|
||||||
|
{
|
||||||
|
case GTK_POS_LEFT:
|
||||||
|
*x = range->range_rect.x - value_spacing - logical_rect.width;
|
||||||
|
*y = range->range_rect.y + (range->range_rect.height - logical_rect.height) / 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GTK_POS_RIGHT:
|
||||||
|
*x = range->range_rect.x + range->range_rect.width + value_spacing;
|
||||||
|
*y = range->range_rect.y + (range->range_rect.height - logical_rect.height) / 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GTK_POS_TOP:
|
||||||
|
*x = range->slider_start +
|
||||||
|
(range->slider_end - range->slider_start - logical_rect.width) / 2;
|
||||||
|
*x = CLAMP (*x, 0, widget->allocation.width - logical_rect.width);
|
||||||
|
*y = range->range_rect.y - logical_rect.height - value_spacing;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GTK_POS_BOTTOM:
|
||||||
|
*x = range->slider_start +
|
||||||
|
(range->slider_end - range->slider_start - logical_rect.width) / 2;
|
||||||
|
*x = CLAMP (*x, 0, widget->allocation.width - logical_rect.width);
|
||||||
|
*y = range->range_rect.y + range->range_rect.height + value_spacing;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
g_return_val_if_reached (FALSE);
|
||||||
|
*x = 0;
|
||||||
|
*y = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*x += widget->allocation.x;
|
||||||
|
*y += widget->allocation.y;
|
||||||
|
}
|
||||||
|
128
gtk/gtkscale.c
128
gtk/gtkscale.c
@ -39,6 +39,15 @@
|
|||||||
* unrelated code portions otherwise
|
* unrelated code portions otherwise
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define GTK_SCALE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_SCALE, GtkScalePrivate))
|
||||||
|
|
||||||
|
typedef struct _GtkScalePrivate GtkScalePrivate;
|
||||||
|
|
||||||
|
struct _GtkScalePrivate
|
||||||
|
{
|
||||||
|
PangoLayout *layout;
|
||||||
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_DIGITS,
|
PROP_DIGITS,
|
||||||
@ -68,6 +77,9 @@ static void gtk_scale_style_set (GtkWidget *widget,
|
|||||||
GtkStyle *previous);
|
GtkStyle *previous);
|
||||||
static void gtk_scale_get_range_border (GtkRange *range,
|
static void gtk_scale_get_range_border (GtkRange *range,
|
||||||
GtkBorder *border);
|
GtkBorder *border);
|
||||||
|
static void gtk_scale_finalize (GObject *object);
|
||||||
|
static void gtk_scale_screen_changed (GtkWidget *widget,
|
||||||
|
GdkScreen *old_screen);
|
||||||
|
|
||||||
GType
|
GType
|
||||||
gtk_scale_get_type (void)
|
gtk_scale_get_type (void)
|
||||||
@ -135,8 +147,10 @@ gtk_scale_class_init (GtkScaleClass *class)
|
|||||||
|
|
||||||
gobject_class->set_property = gtk_scale_set_property;
|
gobject_class->set_property = gtk_scale_set_property;
|
||||||
gobject_class->get_property = gtk_scale_get_property;
|
gobject_class->get_property = gtk_scale_get_property;
|
||||||
|
gobject_class->finalize = gtk_scale_finalize;
|
||||||
|
|
||||||
widget_class->style_set = gtk_scale_style_set;
|
widget_class->style_set = gtk_scale_style_set;
|
||||||
|
widget_class->screen_changed = gtk_scale_screen_changed;
|
||||||
|
|
||||||
range_class->get_range_border = gtk_scale_get_range_border;
|
range_class->get_range_border = gtk_scale_get_range_border;
|
||||||
|
|
||||||
@ -312,6 +326,8 @@ gtk_scale_class_init (GtkScaleClass *class)
|
|||||||
|
|
||||||
add_slider_binding (binding_set, GDK_KP_End, 0,
|
add_slider_binding (binding_set, GDK_KP_End, 0,
|
||||||
GTK_SCROLL_END);
|
GTK_SCROLL_END);
|
||||||
|
|
||||||
|
g_type_class_add_private (gobject_class, sizeof (GtkScalePrivate));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -407,6 +423,7 @@ gtk_scale_set_digits (GtkScale *scale,
|
|||||||
if (scale->draw_value)
|
if (scale->draw_value)
|
||||||
range->round_digits = digits;
|
range->round_digits = digits;
|
||||||
|
|
||||||
|
_gtk_scale_clear_layout (scale);
|
||||||
gtk_widget_queue_resize (GTK_WIDGET (scale));
|
gtk_widget_queue_resize (GTK_WIDGET (scale));
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (scale), "digits");
|
g_object_notify (G_OBJECT (scale), "digits");
|
||||||
@ -437,6 +454,8 @@ gtk_scale_set_draw_value (GtkScale *scale,
|
|||||||
else
|
else
|
||||||
GTK_RANGE (scale)->round_digits = -1;
|
GTK_RANGE (scale)->round_digits = -1;
|
||||||
|
|
||||||
|
_gtk_scale_clear_layout (scale);
|
||||||
|
|
||||||
gtk_widget_queue_resize (GTK_WIDGET (scale));
|
gtk_widget_queue_resize (GTK_WIDGET (scale));
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (scale), "draw_value");
|
g_object_notify (G_OBJECT (scale), "draw_value");
|
||||||
@ -461,6 +480,7 @@ gtk_scale_set_value_pos (GtkScale *scale,
|
|||||||
{
|
{
|
||||||
scale->value_pos = pos;
|
scale->value_pos = pos;
|
||||||
|
|
||||||
|
_gtk_scale_clear_layout (scale);
|
||||||
if (GTK_WIDGET_VISIBLE (scale) && GTK_WIDGET_MAPPED (scale))
|
if (GTK_WIDGET_VISIBLE (scale) && GTK_WIDGET_MAPPED (scale))
|
||||||
gtk_widget_queue_resize (GTK_WIDGET (scale));
|
gtk_widget_queue_resize (GTK_WIDGET (scale));
|
||||||
|
|
||||||
@ -586,9 +606,17 @@ gtk_scale_style_set (GtkWidget *widget,
|
|||||||
|
|
||||||
range->min_slider_size = slider_length;
|
range->min_slider_size = slider_length;
|
||||||
|
|
||||||
|
_gtk_scale_clear_layout (GTK_SCALE (widget));
|
||||||
|
|
||||||
(* GTK_WIDGET_CLASS (parent_class)->style_set) (widget, previous);
|
(* GTK_WIDGET_CLASS (parent_class)->style_set) (widget, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_scale_screen_changed (GtkWidget *widget,
|
||||||
|
GdkScreen *old_screen)
|
||||||
|
{
|
||||||
|
_gtk_scale_clear_layout (GTK_SCALE (widget));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _gtk_scale_format_value:
|
* _gtk_scale_format_value:
|
||||||
@ -618,3 +646,103 @@ _gtk_scale_format_value (GtkScale *scale,
|
|||||||
return g_strdup_printf ("%0.*f", scale->digits,
|
return g_strdup_printf ("%0.*f", scale->digits,
|
||||||
value);
|
value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_scale_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
GtkScale *scale;
|
||||||
|
|
||||||
|
g_return_if_fail (GTK_IS_SCALE (object));
|
||||||
|
|
||||||
|
scale = GTK_SCALE (object);
|
||||||
|
|
||||||
|
_gtk_scale_clear_layout (scale);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gtk_scale_get_layout:
|
||||||
|
* @scale: A #GtkScale
|
||||||
|
*
|
||||||
|
* Gets the #PangoLayout used to display the scale. The returned object
|
||||||
|
* is owned by the scale so does not need to be freed by the caller.
|
||||||
|
*
|
||||||
|
* Return value: the #PangoLayout for this scale, or %NULL if the draw_value property
|
||||||
|
* is %FALSE.
|
||||||
|
*
|
||||||
|
* Since: 2.4
|
||||||
|
**/
|
||||||
|
PangoLayout *
|
||||||
|
gtk_scale_get_layout (GtkScale *scale)
|
||||||
|
{
|
||||||
|
GtkScalePrivate *priv = GTK_SCALE_GET_PRIVATE (scale);
|
||||||
|
gchar *txt;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GTK_IS_SCALE (scale), NULL);
|
||||||
|
|
||||||
|
if (!priv->layout)
|
||||||
|
{
|
||||||
|
if (scale->draw_value)
|
||||||
|
priv->layout = gtk_widget_create_pango_layout (GTK_WIDGET (scale), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scale->draw_value)
|
||||||
|
{
|
||||||
|
txt = _gtk_scale_format_value (scale,
|
||||||
|
GTK_RANGE (scale)->adjustment->value);
|
||||||
|
pango_layout_set_text (priv->layout, txt, -1);
|
||||||
|
g_free (txt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return priv->layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gtk_scale_get_layout_offsets:
|
||||||
|
* @scale: a #GtkScale
|
||||||
|
* @x: location to store X offset of layout, or %NULL
|
||||||
|
* @y: location to store Y offset of layout, or %NULL
|
||||||
|
*
|
||||||
|
* Obtains the coordinates where the scale will draw the #PangoLayout
|
||||||
|
* representing the text in the scale. Remember
|
||||||
|
* when using the #PangoLayout function you need to convert to
|
||||||
|
* and from pixels using PANGO_PIXELS() or #PANGO_SCALE.
|
||||||
|
*
|
||||||
|
* If the draw_value property is %FALSE, the return values are
|
||||||
|
* undefined.
|
||||||
|
*
|
||||||
|
* Since: 2.4
|
||||||
|
**/
|
||||||
|
void
|
||||||
|
gtk_scale_get_layout_offsets (GtkScale *scale,
|
||||||
|
gint *x,
|
||||||
|
gint *y)
|
||||||
|
{
|
||||||
|
gint local_x, local_y;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GTK_IS_SCALE (scale), NULL);
|
||||||
|
|
||||||
|
if (GTK_SCALE_GET_CLASS (scale)->get_layout_offsets)
|
||||||
|
(GTK_SCALE_GET_CLASS (scale)->get_layout_offsets) (scale, &local_x, &local_y);
|
||||||
|
|
||||||
|
if (x)
|
||||||
|
*x = local_x;
|
||||||
|
|
||||||
|
if (y)
|
||||||
|
*y = local_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _gtk_scale_clear_layout (GtkScale *scale)
|
||||||
|
{
|
||||||
|
GtkScalePrivate *priv = GTK_SCALE_GET_PRIVATE (scale);
|
||||||
|
|
||||||
|
g_return_if_fail (GTK_IS_SCALE (scale));
|
||||||
|
|
||||||
|
if (priv->layout)
|
||||||
|
{
|
||||||
|
g_object_unref (priv->layout);
|
||||||
|
priv->layout = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -66,8 +66,10 @@ struct _GtkScaleClass
|
|||||||
|
|
||||||
void (* draw_value) (GtkScale *scale);
|
void (* draw_value) (GtkScale *scale);
|
||||||
|
|
||||||
|
void (* get_layout_offsets) (GtkScale *scale,
|
||||||
|
gint *x,
|
||||||
|
gint *y);
|
||||||
/* Padding for future expansion */
|
/* Padding for future expansion */
|
||||||
void (*_gtk_reserved1) (void);
|
|
||||||
void (*_gtk_reserved2) (void);
|
void (*_gtk_reserved2) (void);
|
||||||
void (*_gtk_reserved3) (void);
|
void (*_gtk_reserved3) (void);
|
||||||
void (*_gtk_reserved4) (void);
|
void (*_gtk_reserved4) (void);
|
||||||
@ -85,6 +87,11 @@ void gtk_scale_set_value_pos (GtkScale *scale,
|
|||||||
GtkPositionType pos);
|
GtkPositionType pos);
|
||||||
GtkPositionType gtk_scale_get_value_pos (GtkScale *scale);
|
GtkPositionType gtk_scale_get_value_pos (GtkScale *scale);
|
||||||
|
|
||||||
|
PangoLayout *gtk_scale_get_layout (GtkScale *scale);
|
||||||
|
void gtk_scale_get_layout_offsets (GtkScale *scale,
|
||||||
|
gint *x,
|
||||||
|
gint *y);
|
||||||
|
void _gtk_scale_clear_layout (GtkScale *scale);
|
||||||
|
|
||||||
void _gtk_scale_get_value_size (GtkScale *scale,
|
void _gtk_scale_get_value_size (GtkScale *scale,
|
||||||
gint *width,
|
gint *width,
|
||||||
@ -92,6 +99,7 @@ void _gtk_scale_get_value_size (GtkScale *scale,
|
|||||||
gchar *_gtk_scale_format_value (GtkScale *scale,
|
gchar *_gtk_scale_format_value (GtkScale *scale,
|
||||||
gdouble value);
|
gdouble value);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
129
gtk/gtkvscale.c
129
gtk/gtkvscale.c
@ -39,6 +39,10 @@ static void gtk_vscale_init (GtkVScale *vscale);
|
|||||||
static gboolean gtk_vscale_expose (GtkWidget *widget,
|
static gboolean gtk_vscale_expose (GtkWidget *widget,
|
||||||
GdkEventExpose *event);
|
GdkEventExpose *event);
|
||||||
|
|
||||||
|
static void gtk_vscale_get_layout_offsets (GtkScale *scale,
|
||||||
|
gint *x,
|
||||||
|
gint *y);
|
||||||
|
|
||||||
GType
|
GType
|
||||||
gtk_vscale_get_type (void)
|
gtk_vscale_get_type (void)
|
||||||
{
|
{
|
||||||
@ -71,14 +75,18 @@ gtk_vscale_class_init (GtkVScaleClass *class)
|
|||||||
{
|
{
|
||||||
GtkWidgetClass *widget_class;
|
GtkWidgetClass *widget_class;
|
||||||
GtkRangeClass *range_class;
|
GtkRangeClass *range_class;
|
||||||
|
GtkScaleClass *scale_class;
|
||||||
|
|
||||||
widget_class = GTK_WIDGET_CLASS (class);
|
widget_class = GTK_WIDGET_CLASS (class);
|
||||||
range_class = GTK_RANGE_CLASS (class);
|
range_class = GTK_RANGE_CLASS (class);
|
||||||
|
scale_class = GTK_SCALE_CLASS (class);
|
||||||
|
|
||||||
parent_class = g_type_class_peek_parent (class);
|
parent_class = g_type_class_peek_parent (class);
|
||||||
|
|
||||||
range_class->slider_detail = "vscale";
|
range_class->slider_detail = "vscale";
|
||||||
|
|
||||||
|
scale_class->get_layout_offsets = gtk_vscale_get_layout_offsets;
|
||||||
|
|
||||||
widget_class->expose_event = gtk_vscale_expose;
|
widget_class->expose_event = gtk_vscale_expose;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,13 +155,9 @@ static gboolean
|
|||||||
gtk_vscale_expose (GtkWidget *widget,
|
gtk_vscale_expose (GtkWidget *widget,
|
||||||
GdkEventExpose *event)
|
GdkEventExpose *event)
|
||||||
{
|
{
|
||||||
GtkRange *range;
|
|
||||||
GtkVScale *vscale;
|
|
||||||
GtkScale *scale;
|
GtkScale *scale;
|
||||||
|
|
||||||
range = GTK_RANGE (widget);
|
|
||||||
scale = GTK_SCALE (widget);
|
scale = GTK_SCALE (widget);
|
||||||
vscale = GTK_VSCALE (widget);
|
|
||||||
|
|
||||||
/* We need to chain up _first_ so the various geometry members of
|
/* We need to chain up _first_ so the various geometry members of
|
||||||
* GtkRange struct are updated.
|
* GtkRange struct are updated.
|
||||||
@ -164,55 +168,11 @@ gtk_vscale_expose (GtkWidget *widget,
|
|||||||
if (scale->draw_value)
|
if (scale->draw_value)
|
||||||
{
|
{
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
PangoRectangle logical_rect;
|
|
||||||
gchar *txt;
|
|
||||||
gint x, y;
|
gint x, y;
|
||||||
GtkStateType state_type;
|
GtkStateType state_type;
|
||||||
gint value_spacing;
|
|
||||||
|
|
||||||
gtk_widget_style_get (widget, "value_spacing", &value_spacing, NULL);
|
layout = gtk_scale_get_layout (widget);
|
||||||
|
gtk_scale_get_layout_offsets (widget, &x, &y);
|
||||||
txt = _gtk_scale_format_value (scale,
|
|
||||||
GTK_RANGE (scale)->adjustment->value);
|
|
||||||
|
|
||||||
layout = gtk_widget_create_pango_layout (widget, txt);
|
|
||||||
g_free (txt);
|
|
||||||
|
|
||||||
pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
|
|
||||||
|
|
||||||
switch (scale->value_pos)
|
|
||||||
{
|
|
||||||
case GTK_POS_LEFT:
|
|
||||||
x = range->range_rect.x - logical_rect.width - value_spacing;
|
|
||||||
y = range->slider_start + (range->slider_end - range->slider_start - logical_rect.height) / 2;
|
|
||||||
y = CLAMP (y, 0, widget->allocation.height - logical_rect.height);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_POS_RIGHT:
|
|
||||||
x = range->range_rect.x + range->range_rect.width + value_spacing;
|
|
||||||
y = range->slider_start + (range->slider_end - range->slider_start - logical_rect.height) / 2;
|
|
||||||
y = CLAMP (y, 0, widget->allocation.height - logical_rect.height);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_POS_TOP:
|
|
||||||
x = range->range_rect.x + (range->range_rect.width - logical_rect.width) / 2;
|
|
||||||
y = range->range_rect.y - logical_rect.height - value_spacing;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GTK_POS_BOTTOM:
|
|
||||||
x = range->range_rect.x + (range->range_rect.width - logical_rect.width) / 2;
|
|
||||||
y = range->range_rect.y + range->range_rect.height + value_spacing;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
g_return_val_if_reached (FALSE);
|
|
||||||
x = 0;
|
|
||||||
y = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
x += widget->allocation.x;
|
|
||||||
y += widget->allocation.y;
|
|
||||||
|
|
||||||
state_type = GTK_STATE_NORMAL;
|
state_type = GTK_STATE_NORMAL;
|
||||||
if (!GTK_WIDGET_IS_SENSITIVE (scale))
|
if (!GTK_WIDGET_IS_SENSITIVE (scale))
|
||||||
@ -227,9 +187,74 @@ gtk_vscale_expose (GtkWidget *widget,
|
|||||||
"vscale",
|
"vscale",
|
||||||
x, y,
|
x, y,
|
||||||
layout);
|
layout);
|
||||||
|
|
||||||
g_object_unref (layout);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_vscale_get_layout_offsets (GtkScale *scale,
|
||||||
|
gint *x,
|
||||||
|
gint *y)
|
||||||
|
{
|
||||||
|
GtkWidget *widget;
|
||||||
|
GtkRange *range;
|
||||||
|
GtkScale *scale;
|
||||||
|
PangoLayout *layout;
|
||||||
|
PangoRectangle logical_rect;
|
||||||
|
gint value_spacing;
|
||||||
|
|
||||||
|
widget = GTK_WIDGET (scale);
|
||||||
|
layout = gtk_scale_get_layout (scale);
|
||||||
|
|
||||||
|
if (!layout)
|
||||||
|
{
|
||||||
|
*x = 0;
|
||||||
|
*y = 0;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
range = GTK_RANGE (widget);
|
||||||
|
scale = GTK_SCALE (widget);
|
||||||
|
|
||||||
|
gtk_widget_style_get (widget, "value_spacing", &value_spacing, NULL);
|
||||||
|
|
||||||
|
pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
|
||||||
|
|
||||||
|
switch (scale->value_pos)
|
||||||
|
{
|
||||||
|
case GTK_POS_LEFT:
|
||||||
|
*x = range->range_rect.x - logical_rect.width - value_spacing;
|
||||||
|
*y = range->slider_start + (range->slider_end - range->slider_start - logical_rect.height) / 2;
|
||||||
|
*y = CLAMP (*y, 0, widget->allocation.height - logical_rect.height);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GTK_POS_RIGHT:
|
||||||
|
*x = range->range_rect.x + range->range_rect.width + value_spacing;
|
||||||
|
*y = range->slider_start + (range->slider_end - range->slider_start - logical_rect.height) / 2;
|
||||||
|
*y = CLAMP (*y, 0, widget->allocation.height - logical_rect.height);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GTK_POS_TOP:
|
||||||
|
*x = range->range_rect.x + (range->range_rect.width - logical_rect.width) / 2;
|
||||||
|
*y = range->range_rect.y - logical_rect.height - value_spacing;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GTK_POS_BOTTOM:
|
||||||
|
*x = range->range_rect.x + (range->range_rect.width - logical_rect.width) / 2;
|
||||||
|
*y = range->range_rect.y + range->range_rect.height + value_spacing;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
g_return_val_if_reached (FALSE);
|
||||||
|
*x = 0;
|
||||||
|
*y = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*x += widget->allocation.x;
|
||||||
|
*y += widget->allocation.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user