aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/xterm.c84
1 files changed, 43 insertions, 41 deletions
diff --git a/src/xterm.c b/src/xterm.c
index 3cd95b7a65d..1608621fc49 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -4393,51 +4393,53 @@ x_scroll_run (struct window *w, struct run *run)
4393 gui_clear_cursor (w); 4393 gui_clear_cursor (w);
4394 4394
4395#ifdef USE_CAIRO 4395#ifdef USE_CAIRO
4396 if (FRAME_X_DOUBLE_BUFFERED_P (f)) 4396 if (FRAME_CR_CONTEXT (f))
4397 {
4398 cairo_t *cr = FRAME_CR_CONTEXT (f);
4399 if (cr)
4400 cairo_surface_flush (cairo_get_target (cr));
4401 XCopyArea (FRAME_X_DISPLAY (f),
4402 FRAME_X_DRAWABLE (f), FRAME_X_DRAWABLE (f),
4403 f->output_data.x->normal_gc,
4404 x, from_y,
4405 width, height,
4406 x, to_y);
4407 if (cr)
4408 cairo_surface_mark_dirty_rectangle (cairo_get_target (cr),
4409 x, to_y, width, height);
4410 }
4411 else if (FRAME_CR_CONTEXT (f))
4412 { 4397 {
4413 cairo_surface_t *s = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 4398 cairo_surface_t *surface = cairo_get_target (FRAME_CR_CONTEXT (f));
4414 width, height); 4399 if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_XLIB)
4415 cairo_t *cr = cairo_create (s); 4400 {
4416 cairo_set_source_surface (cr, cairo_get_target (FRAME_CR_CONTEXT (f)), 4401 eassert (cairo_xlib_surface_get_display (surface)
4417 -x, -from_y); 4402 == FRAME_X_DISPLAY (f));
4418 cairo_paint (cr); 4403 eassert (cairo_xlib_surface_get_drawable (surface)
4419 cairo_destroy (cr); 4404 == FRAME_X_RAW_DRAWABLE (f));
4405 cairo_surface_flush (surface);
4406 XCopyArea (FRAME_X_DISPLAY (f),
4407 FRAME_X_DRAWABLE (f), FRAME_X_DRAWABLE (f),
4408 f->output_data.x->normal_gc,
4409 x, from_y,
4410 width, height,
4411 x, to_y);
4412 cairo_surface_mark_dirty_rectangle (surface, x, to_y, width, height);
4413 }
4414 else
4415 {
4416 cairo_surface_t *s
4417 = cairo_surface_create_similar (surface,
4418 cairo_surface_get_content (surface),
4419 width, height);
4420 cairo_t *cr = cairo_create (s);
4421 cairo_set_source_surface (cr, surface, -x, -from_y);
4422 cairo_paint (cr);
4423 cairo_destroy (cr);
4420 4424
4421 cr = FRAME_CR_CONTEXT (f); 4425 cr = FRAME_CR_CONTEXT (f);
4422 cairo_save (cr); 4426 cairo_save (cr);
4423 cairo_set_source_surface (cr, s, x, to_y); 4427 cairo_set_source_surface (cr, s, x, to_y);
4424 cairo_rectangle (cr, x, to_y, width, height); 4428 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
4425 cairo_fill (cr); 4429 cairo_rectangle (cr, x, to_y, width, height);
4426 cairo_restore (cr); 4430 cairo_fill (cr);
4427 cairo_surface_destroy (s); 4431 cairo_restore (cr);
4432 cairo_surface_destroy (s);
4433 }
4428 } 4434 }
4429 else 4435 else
4430 { 4436#endif /* USE_CAIRO */
4431 SET_FRAME_GARBAGED (f); 4437 XCopyArea (FRAME_X_DISPLAY (f),
4432 } 4438 FRAME_X_DRAWABLE (f), FRAME_X_DRAWABLE (f),
4433#else 4439 f->output_data.x->normal_gc,
4434 XCopyArea (FRAME_X_DISPLAY (f), 4440 x, from_y,
4435 FRAME_X_DRAWABLE (f), FRAME_X_DRAWABLE (f), 4441 width, height,
4436 f->output_data.x->normal_gc, 4442 x, to_y);
4437 x, from_y,
4438 width, height,
4439 x, to_y);
4440#endif
4441 4443
4442 unblock_input (); 4444 unblock_input ();
4443} 4445}