widget: Use the actor's style context.

This commit is contained in:
Benjamin Otte
2012-12-17 16:44:28 +01:00
parent 37fa22c608
commit 2081d36e88
3 changed files with 85 additions and 160 deletions

View File

@@ -21,18 +21,64 @@
#include "gtkwidgetactorprivate.h"
#include "gtkwidgetprivate.h"
#include <math.h>
struct _GtkWidgetActorPrivate {
gpointer dummy;
};
G_DEFINE_TYPE (GtkWidgetActor, _gtk_widget_actor, GTK_TYPE_CSS_BOX)
static void
gtk_widget_actor_real_queue_redraw (GtkActor *actor,
const cairo_rectangle_t *box)
{
GtkWidget *widget;
int x, y, w, h;
if (_gtk_actor_get_parent (actor))
{
GTK_ACTOR_CLASS (_gtk_widget_actor_parent_class)->queue_redraw (actor, box);
return;
}
widget = _gtk_actor_get_widget (actor);
x = floor (box->x);
y = floor (box->y);
w = ceil (box->x + box->width) - x;
h = ceil (box->y + box->height) - y;
if (!gtk_widget_get_has_window (widget))
{
GtkAllocation allocation;
gtk_widget_get_allocation (widget, &allocation);
x += allocation.x;
y += allocation.y;
}
gtk_widget_queue_draw_area (widget, x, y, w, h);
}
static void
gtk_widget_actor_real_style_updated (GtkCssActor *actor,
const GtkBitmask *changed)
{
_gtk_widget_emit_style_updated (_gtk_actor_get_widget (GTK_ACTOR (actor)));
GTK_CSS_ACTOR_CLASS (_gtk_widget_actor_parent_class)->style_updated (actor, changed);
}
static void
_gtk_widget_actor_class_init (GtkWidgetActorClass *klass)
{
GtkActorClass *actor_class = GTK_ACTOR_CLASS (klass);
GtkCssActorClass *css_actor_class = GTK_CSS_ACTOR_CLASS (klass);
#if 0
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkActorClass *actor_class = GTK_ACTOR_CLASS (klass);
actor_class->parent_set = gtk_widget_actor_real_parent_set;
actor_class->show = gtk_css_box_real_show;
@@ -43,9 +89,10 @@ _gtk_widget_actor_class_init (GtkWidgetActorClass *klass)
actor_class->parent_set = gtk_css_box_real_parent_set;
actor_class->get_preferred_size = gtk_css_box_real_get_preferred_size;
actor_class->allocate = gtk_css_box_real_allocate;
klass->style_updated = gtk_widget_actor_real_style_updated;
#endif
actor_class->queue_redraw = gtk_widget_actor_real_queue_redraw;
css_actor_class->style_updated = gtk_widget_actor_real_style_updated;
g_type_class_add_private (klass, sizeof (GtkWidgetActorPrivate));
}

View File

@@ -369,7 +369,6 @@ struct _GtkWidgetPrivate
* the font to use for text.
*/
GtkStyle *style;
GtkStyleContext *context;
/* Widget's path for styling */
GtkWidgetPath *path;
@@ -3922,8 +3921,7 @@ gtk_widget_unparent (GtkWidget *widget)
/* Unset BACKDROP since we are no longer inside a toplevel window */
gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_BACKDROP);
if (priv->context)
gtk_style_context_set_parent (priv->context, NULL);
gtk_style_context_set_parent (_gtk_css_actor_get_style_context (GTK_CSS_ACTOR (priv->actor)), NULL);
_gtk_widget_update_parent_muxer (widget);
@@ -4242,9 +4240,6 @@ gtk_widget_map (GtkWidget *widget)
if (!gtk_widget_get_has_window (widget))
gdk_window_invalidate_rect (priv->window, &priv->allocation, FALSE);
if (widget->priv->context)
_gtk_style_context_update_animating (widget->priv->context);
gtk_widget_pop_verify_invariants (widget);
}
}
@@ -4273,9 +4268,6 @@ gtk_widget_unmap (GtkWidget *widget)
gdk_window_invalidate_rect (priv->window, &priv->allocation, FALSE);
_gtk_tooltip_hide (widget);
if (widget->priv->context)
_gtk_style_context_update_animating (widget->priv->context);
g_signal_emit (widget, widget_signals[UNMAP], 0);
gtk_widget_pop_verify_invariants (widget);
@@ -6707,6 +6699,7 @@ static void
gtk_widget_real_style_updated (GtkWidget *widget)
{
GtkWidgetPrivate *priv = widget->priv;
const GtkBitmask *changes;
gtk_widget_update_pango_context (widget);
@@ -6722,28 +6715,20 @@ gtk_widget_real_style_updated (GtkWidget *widget)
widget->priv->style);
}
if (widget->priv->context)
{
const GtkBitmask *changes = _gtk_style_context_get_changes (widget->priv->context);
changes = _gtk_style_context_get_changes (gtk_widget_get_style_context (widget));
if (gtk_widget_get_realized (widget) &&
gtk_widget_get_has_window (widget) &&
!gtk_widget_get_app_paintable (widget))
gtk_style_context_set_background (widget->priv->context,
widget->priv->window);
if (gtk_widget_get_realized (widget) &&
gtk_widget_get_has_window (widget) &&
!gtk_widget_get_app_paintable (widget))
gtk_style_context_set_background (gtk_widget_get_style_context (widget),
widget->priv->window);
if (widget->priv->anchored)
{
if (changes && _gtk_css_style_property_changes_affect_size (changes))
gtk_widget_queue_resize (widget);
else
gtk_widget_queue_draw (widget);
}
}
else
if (widget->priv->anchored)
{
if (widget->priv->anchored)
if (changes && _gtk_css_style_property_changes_affect_size (changes))
gtk_widget_queue_resize (widget);
else
gtk_widget_queue_draw (widget);
}
}
@@ -8046,9 +8031,8 @@ gtk_widget_set_parent (GtkWidget *widget,
data.flags_to_unset = 0;
gtk_widget_propagate_state (widget, &data);
if (priv->context)
gtk_style_context_set_parent (priv->context,
gtk_widget_get_style_context (parent));
gtk_style_context_set_parent (_gtk_css_actor_get_style_context (GTK_CSS_ACTOR (priv->actor)),
gtk_widget_get_style_context (parent));
_gtk_widget_update_parent_muxer (widget);
@@ -8348,9 +8332,6 @@ do_screen_change (GtkWidget *widget,
_gtk_tooltip_hide (widget);
if (new_screen && priv->context)
gtk_style_context_set_screen (priv->context, new_screen);
_gtk_widget_actor_screen_changed (priv->actor, new_screen, old_screen);
g_signal_emit (widget, widget_signals[SCREEN_CHANGED], 0, old_screen);
@@ -10434,12 +10415,6 @@ gtk_widget_finalize (GObject *object)
if (priv->path)
gtk_widget_path_free (priv->path);
if (priv->context)
{
_gtk_style_context_set_source (priv->context, NULL, NULL);
g_object_unref (priv->context);
}
_gtk_size_request_cache_free (&priv->requests);
if (g_object_is_floating (object))
@@ -10986,7 +10961,7 @@ gtk_widget_propagate_state (GtkWidget *widget,
if (!gtk_widget_is_sensitive (widget) && gtk_widget_has_grab (widget))
gtk_grab_remove (widget);
gtk_style_context_set_state (gtk_widget_get_style_context (widget), new_flags);
_gtk_css_box_set_state (GTK_CSS_BOX (priv->actor), new_flags);
g_signal_emit (widget, widget_signals[STATE_CHANGED], 0, old_state);
g_signal_emit (widget, widget_signals[STATE_FLAGS_CHANGED], 0, old_flags);
@@ -13916,6 +13891,7 @@ gint
gtk_widget_path_append_for_widget (GtkWidgetPath *path,
GtkWidget *widget)
{
GList *classes, *l;
const char *name;
gint pos;
@@ -13928,20 +13904,15 @@ gtk_widget_path_append_for_widget (GtkWidgetPath *path,
if (name)
gtk_widget_path_iter_set_name (path, pos, name);
if (widget->priv->context)
{
GList *classes, *l;
/* Also add any persistent classes in
* the style context the widget path
*/
classes = gtk_style_context_list_classes (gtk_widget_get_style_context (widget));
/* Also add any persistent classes in
* the style context the widget path
*/
classes = gtk_style_context_list_classes (widget->priv->context);
for (l = classes; l; l = l->next)
gtk_widget_path_iter_add_class (path, pos, l->data);
for (l = classes; l; l = l->next)
gtk_widget_path_iter_add_class (path, pos, l->data);
g_list_free (classes);
}
g_list_free (classes);
return pos;
}
@@ -14000,30 +13971,9 @@ gtk_widget_get_path (GtkWidget *widget)
return widget->priv->path;
}
static gboolean
gtk_widget_source_init_css_matcher (GtkCssMatcher *matcher,
gpointer data)
void
_gtk_widget_emit_style_updated (GtkWidget *widget)
{
return FALSE;
}
static GtkWidgetPath *
gtk_widget_source_create_query_path (gpointer widget)
{
return _gtk_widget_create_path (widget);
}
static const GtkWidgetPath *
gtk_widget_source_get_path (gpointer data)
{
return gtk_widget_get_path (data);
}
static void
gtk_widget_source_invalidate (gpointer data)
{
GtkWidget *widget = data;
if (widget->priv->path)
{
gtk_widget_path_free (widget->priv->path);
@@ -14041,59 +13991,15 @@ gtk_widget_source_invalidate (gpointer data)
}
}
static void
gtk_widget_source_queue_invalidate (gpointer widget)
/* actor is guaranteed to be a GtkCssBox */
GtkActor *
_gtk_widget_get_actor (GtkWidget *widget)
{
if (GTK_IS_RESIZE_CONTAINER (widget))
_gtk_container_queue_restyle (GTK_CONTAINER (widget));
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
return widget->priv->actor;
}
static gboolean
gtk_widget_source_should_animate (gpointer data)
{
GtkWidget *widget = data;
gboolean animate;
if (!gtk_widget_get_mapped (widget))
return FALSE;
g_object_get (gtk_widget_get_settings (widget),
"gtk-enable-animations", &animate,
NULL);
return animate;
}
static GType
gtk_widget_source_get_widget_type (gpointer widget)
{
return G_OBJECT_TYPE (widget);
}
static void
gtk_widget_source_no_destroy (gpointer data)
{
/* The style context doesn't hold a reference to us.
* This is necessary to avoid reference loops.
* And it is not a problem because the widget will unset
* itself as the source before it becomes invalid.
*/
}
static const GtkStyleContextSource gtk_widget_source = {
TRUE,
FALSE,
gtk_widget_source_init_css_matcher,
gtk_widget_source_create_query_path,
gtk_widget_source_get_path,
gtk_widget_source_invalidate,
gtk_widget_source_queue_invalidate,
gtk_widget_source_should_animate,
gtk_widget_source_get_widget_type,
gtk_widget_source_no_destroy
};
/**
* gtk_widget_get_style_context:
* @widget: a #GtkWidget
@@ -14106,46 +14012,16 @@ static const GtkStyleContextSource gtk_widget_source = {
GtkStyleContext *
gtk_widget_get_style_context (GtkWidget *widget)
{
GtkWidgetPrivate *priv;
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
priv = widget->priv;
if (G_UNLIKELY (priv->context == NULL))
{
GdkScreen *screen;
priv->context = gtk_style_context_new ();
gtk_style_context_set_state (priv->context, priv->state_flags);
screen = gtk_widget_get_screen (widget);
if (screen)
gtk_style_context_set_screen (priv->context, screen);
if (priv->parent)
gtk_style_context_set_parent (priv->context,
gtk_widget_get_style_context (priv->parent));
_gtk_style_context_set_source (priv->context, &gtk_widget_source, widget);
}
return widget->priv->context;
return _gtk_css_actor_get_style_context (GTK_CSS_ACTOR (widget->priv->actor));
}
void
_gtk_widget_invalidate_style_context (GtkWidget *widget,
GtkCssChange change)
{
GtkWidgetPrivate *priv;
priv = widget->priv;
if (priv->context == NULL)
return;
_gtk_style_context_queue_invalidate (priv->context, change);
_gtk_style_context_queue_invalidate (gtk_widget_get_style_context (widget), change);
}
/**

View File

@@ -134,6 +134,8 @@ gboolean _gtk_widget_captured_event (GtkWidget *widget,
GtkActor * _gtk_widget_get_actor (GtkWidget *widget);
void _gtk_widget_emit_style_updated (GtkWidget *widget);
GtkWidgetPath * _gtk_widget_create_path (GtkWidget *widget);
void _gtk_widget_invalidate_style_context (GtkWidget *widget,
GtkCssChange change);