Merge branch 'fewer-redraws' into 'master'
keyboard: Schedule widget redraw instead of gdk_window_invalidate_rect See merge request Librem5/squeekboard!75
This commit is contained in:
@ -477,45 +477,6 @@ magnify_bounds (GtkWidget *self,
|
||||
large_bounds->y = CLAMP(y, 0, allocation.height - large_bounds->height);
|
||||
}
|
||||
|
||||
/*
|
||||
* Alleviate the asymmetry between drawing a pressed key and a released key,
|
||||
* and consistently draw to the exact same area.
|
||||
*
|
||||
* By saving the dirty rectangle we can limit drawing of the backbuffer to
|
||||
* the screen as well, eg gdk_window_invalidate_rect() instead of
|
||||
* gtk_widget_queue_draw() which redraws the entire widget.
|
||||
*
|
||||
* b1 is mandatory, b2 is optional
|
||||
*/
|
||||
static GdkRectangle
|
||||
clip_bounds_to_dirty_rectangle (cairo_t *cr, EekBounds *b1, EekBounds *b2)
|
||||
{
|
||||
if (b2)
|
||||
cairo_rectangle (cr, b2->x, b2->y, b2->width, b2->height);
|
||||
|
||||
cairo_rectangle (cr, b1->x, b1->y, b1->width, b1->height);
|
||||
cairo_clip (cr);
|
||||
|
||||
/*
|
||||
* save the clipped region to a bounding box so we can limit
|
||||
* the drawing of the backbuffer to the screen to the same area
|
||||
*/
|
||||
cairo_rectangle_t bbox;
|
||||
|
||||
cairo_clip_extents (cr, &bbox.x, &bbox.y, &bbox.width, &bbox.height);
|
||||
|
||||
/* convert double to int, making sure r strictly covers bbox to avoid
|
||||
* artefacts. floor() is unnecessary, ceil() is not */
|
||||
GdkRectangle r = {
|
||||
floor (bbox.x),
|
||||
floor (bbox.y),
|
||||
ceil (bbox.width),
|
||||
ceil (bbox.height)
|
||||
};
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static void
|
||||
render_pressed_key (GtkWidget *widget,
|
||||
EekKey *key)
|
||||
@ -532,12 +493,6 @@ render_pressed_key (GtkWidget *widget,
|
||||
eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
|
||||
magnify_bounds (widget, &bounds, &large_bounds, 1.5);
|
||||
|
||||
/*
|
||||
* clip to limit drawing to backbuffer and save clip region to dirty_rect
|
||||
* to limit redrawing of the backbuffer to the same area
|
||||
*/
|
||||
GdkRectangle dirty_rect = clip_bounds_to_dirty_rectangle (cr, &bounds, &large_bounds);
|
||||
|
||||
cairo_save (cr);
|
||||
cairo_translate (cr, bounds.x, bounds.y);
|
||||
eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE);
|
||||
@ -551,9 +506,6 @@ render_pressed_key (GtkWidget *widget,
|
||||
gdk_window_end_draw_frame (window, context);
|
||||
|
||||
cairo_region_destroy (region);
|
||||
|
||||
/* force immediate drawing of the backbuffer to the screen */
|
||||
gdk_window_invalidate_rect (window, &dirty_rect, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -571,21 +523,12 @@ render_locked_key (GtkWidget *widget,
|
||||
|
||||
eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
|
||||
|
||||
/*
|
||||
* clip to limit drawing to backbuffer and save clip region to dirty_rect
|
||||
* to limit redrawing of the backbuffer to the same area
|
||||
*/
|
||||
GdkRectangle dirty_rect = clip_bounds_to_dirty_rectangle (cr, &bounds, NULL);
|
||||
|
||||
cairo_translate (cr, bounds.x, bounds.y);
|
||||
eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE);
|
||||
|
||||
gdk_window_end_draw_frame (window, context);
|
||||
|
||||
cairo_region_destroy (region);
|
||||
|
||||
/* force immediate drawing of the backbuffer to the screen */
|
||||
gdk_window_invalidate_rect (window, &dirty_rect, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -604,20 +547,11 @@ render_released_key (GtkWidget *widget,
|
||||
eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
|
||||
magnify_bounds (widget, &bounds, &large_bounds, 1.5);
|
||||
|
||||
/*
|
||||
* clip to limit drawing to backbuffer and save clip region to dirty_rect
|
||||
* to limit redrawing of the backbuffer to the same area
|
||||
*/
|
||||
GdkRectangle dirty_rect = clip_bounds_to_dirty_rectangle(cr, &bounds, &large_bounds);
|
||||
|
||||
eek_renderer_render_keyboard (priv->renderer, cr);
|
||||
|
||||
gdk_window_end_draw_frame (window, context);
|
||||
|
||||
cairo_region_destroy (region);
|
||||
|
||||
/* force immediate drawing of the backbuffer to the screen */
|
||||
gdk_window_invalidate_rect (window, &dirty_rect, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -631,6 +565,7 @@ on_key_pressed (EekKey *key,
|
||||
return;
|
||||
|
||||
render_pressed_key (GTK_WIDGET(self), key);
|
||||
gtk_widget_queue_draw (GTK_WIDGET(self));
|
||||
|
||||
#if HAVE_LIBCANBERRA
|
||||
ca_gtk_play_for_widget (widget, 0,
|
||||
@ -652,6 +587,7 @@ on_key_released (EekKey *key,
|
||||
return;
|
||||
|
||||
render_released_key (GTK_WIDGET(self), key);
|
||||
gtk_widget_queue_draw (GTK_WIDGET(self));
|
||||
|
||||
#if HAVE_LIBCANBERRA
|
||||
ca_gtk_play_for_widget (widget, 0,
|
||||
@ -675,6 +611,7 @@ on_key_locked (EekKeyboard *keyboard,
|
||||
return;
|
||||
|
||||
render_locked_key (widget, key);
|
||||
gtk_widget_queue_draw (widget);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -690,6 +627,7 @@ on_key_unlocked (EekKeyboard *keyboard,
|
||||
return;
|
||||
|
||||
render_released_key (widget, key);
|
||||
gtk_widget_queue_draw (GTK_WIDGET(widget));
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
Reference in New Issue
Block a user