diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index a7be2d90899..9a3d245e6ea 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -117,6 +117,13 @@ #define FRAME_CR_SURFACE(f)		(cairo_get_target (FRAME_CR_CONTEXT (f)))
 static struct frame *pgtk_any_window_to_frame (GdkWindow *);
 static void pgtk_regenerate_devices (struct pgtk_display_info *);
 
+static void
+push_rect (struct frame *f, int x, int y, int width, int height)
+{
+  if (f != NULL && FRAME_GTK_WIDGET (f) != NULL)
+    gtk_widget_queue_draw_area (FRAME_GTK_WIDGET (f), x, y, width, height);
+}
+
 static void
 pgtk_device_added_or_removal_cb (GdkSeat *seat, GdkDevice *device,
 				 gpointer user_data)
@@ -1239,6 +1246,7 @@ pgtk_set_glyph_string_clipping (struct glyph_string *s, cairo_t *cr)
       for (int i = 0; i < n; i++)
 	{
 	  cairo_rectangle (cr, r[i].x, r[i].y, r[i].width, r[i].height);
+	  push_rect(s->f, r[i].x, r[i].y, r[i].width, r[i].height);
 	}
       cairo_clip (cr);
     }
@@ -1259,6 +1267,7 @@ pgtk_set_glyph_string_clipping_exactly (struct glyph_string *src,
   dst->num_clips = 1;
 
   cairo_rectangle (cr, src->x, src->y, src->width, src->height);
+  push_rect(dst->f, src->x, src->y, src->width, src->height);
   cairo_clip (cr);
 }
 
@@ -1322,6 +1331,7 @@ fill_background_by_face (struct frame *f, struct face *face, int x, int y,
 
   cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
   cairo_rectangle (cr, x, y, width, height);
+  push_rect(f, x, y, width, height);
   cairo_clip (cr);
 
   r = ((face->background >> 16) & 0xff) / 255.0;
@@ -1828,9 +1838,12 @@ pgtk_set_clip_rectangles (struct frame *f, cairo_t *cr,
 {
   if (n > 0)
     {
-      for (int i = 0; i < n; i++)
+      for (int i = 0; i < n; i++) {
 	cairo_rectangle (cr, rectangles[i].x, rectangles[i].y,
 			 rectangles[i].width, rectangles[i].height);
+	push_rect(f, rectangles[i].x, rectangles[i].y,
+		  rectangles[i].width, rectangles[i].height);
+      }
       cairo_clip (cr);
     }
 }
@@ -2028,6 +2041,7 @@ pgtk_draw_horizontal_wave (struct frame *f, unsigned long color, int x, int y,
   cr = pgtk_begin_cr_clip (f);
   pgtk_set_cr_source_with_color (f, color, false);
   cairo_rectangle (cr, x, y, width, height);
+  push_rect(f, x, y, width, height);
   cairo_clip (cr);
 
   if (x >= 0)
@@ -3063,6 +3077,7 @@ pgtk_copy_bits (struct frame *f, cairo_rectangle_t *src_rect,
   cairo_set_source_surface (cr, FRAME_CR_SURFACE (f), -src_rect->x,
 			    -src_rect->y);
   cairo_rectangle (cr, 0, 0, src_rect->width, src_rect->height);
+  push_rect(f, 0, 0, src_rect->width, src_rect->height);
   cairo_clip (cr);
   cairo_paint (cr);
   cairo_destroy (cr);
@@ -3072,6 +3087,7 @@ pgtk_copy_bits (struct frame *f, cairo_rectangle_t *src_rect,
   cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
   cairo_rectangle (cr, dst_rect->x, dst_rect->y, dst_rect->width,
 		   dst_rect->height);
+  push_rect (f, dst_rect->x, dst_rect->y, dst_rect->width, dst_rect->height);
   cairo_clip (cr);
   cairo_paint (cr);
   pgtk_end_cr_clip (f);
@@ -3419,7 +3435,7 @@ pgtk_frame_up_to_date (struct frame *f)
   if (!buffer_flipping_blocked_p ())
     {
       flip_cr_context (f);
-      gtk_widget_queue_draw (FRAME_GTK_WIDGET (f));
+      //      gtk_widget_queue_draw (FRAME_GTK_WIDGET (f));
     }
   unblock_input ();
 }
@@ -3601,6 +3617,7 @@ pgtk_clip_to_row (struct window *w, struct glyph_row *row,
   rect.height = row->visible_height;
 
   cairo_rectangle (cr, rect.x, rect.y, rect.width, rect.height);
+  push_rect(WINDOW_XFRAME(w), rect.x, rect.y, rect.width, rect.height);
   cairo_clip (cr);
 }
 
@@ -3770,6 +3787,10 @@ recover_from_visible_bell (struct atimer *timer)
 
   if (FRAME_X_OUTPUT (f)->atimer_visible_bell != NULL)
     FRAME_X_OUTPUT (f)->atimer_visible_bell = NULL;
+
+  int width = FRAME_CR_SURFACE_DESIRED_WIDTH (f);
+  int height = FRAME_CR_SURFACE_DESIRED_HEIGHT (f);
+  push_rect(f, 0, 0, width, height);
 }
 
 /* Invert the middle quarter of the frame for .15 sec.  */
@@ -3798,6 +3819,7 @@ pgtk_flash (struct frame *f)
   cr = cairo_create (surface);
   cairo_set_source_surface (cr, surface_orig, 0, 0);
   cairo_rectangle (cr, 0, 0, width, height);
+  push_rect(f, 0, 0, width, height);
   cairo_clip (cr);
   cairo_paint (cr);
 
@@ -3822,6 +3844,11 @@ pgtk_flash (struct frame *f)
 		       (FRAME_INTERNAL_BORDER_WIDTH (f)
 			+ FRAME_TOP_MARGIN_HEIGHT (f)),
 		       width, flash_height);
+      push_rect(f,
+		flash_left,
+		(FRAME_INTERNAL_BORDER_WIDTH (f)
+		 + FRAME_TOP_MARGIN_HEIGHT (f)),
+		width, flash_height);
       cairo_fill (cr);
 
       cairo_rectangle (cr,
@@ -3830,6 +3857,12 @@ pgtk_flash (struct frame *f)
 			- FRAME_INTERNAL_BORDER_WIDTH (f)
 			- FRAME_BOTTOM_MARGIN_HEIGHT (f)),
 		       width, flash_height);
+      push_rect(f,
+		flash_left,
+		(height - flash_height
+		 - FRAME_INTERNAL_BORDER_WIDTH (f)
+		 - FRAME_BOTTOM_MARGIN_HEIGHT (f)),
+		width, flash_height);
       cairo_fill (cr);
     }
   else
@@ -3838,6 +3871,9 @@ pgtk_flash (struct frame *f)
       cairo_rectangle (cr,
 		       flash_left, FRAME_INTERNAL_BORDER_WIDTH (f),
 		       width, height - 2 * FRAME_INTERNAL_BORDER_WIDTH (f));
+      push_rect(f,
+		flash_left, FRAME_INTERNAL_BORDER_WIDTH (f),
+		width, height - 2 * FRAME_INTERNAL_BORDER_WIDTH (f));
       cairo_fill (cr);
     }
 
@@ -4821,7 +4857,7 @@ pgtk_buffer_flipping_unblocked_hook (struct frame *f)
 {
   block_input ();
   flip_cr_context (f);
-  gtk_widget_queue_draw (FRAME_GTK_WIDGET (f));
+  //  gtk_widget_queue_draw (FRAME_GTK_WIDGET (f));
   unblock_input ();
 }
 
@@ -4998,6 +5034,7 @@ pgtk_fill_rectangle (struct frame *f, unsigned long color, int x, int y,
   cr = pgtk_begin_cr_clip (f);
   pgtk_set_cr_source_with_color (f, color, respect_alpha_background);
   cairo_rectangle (cr, x, y, width, height);
+  push_rect(f, x, y, width, height);
   cairo_fill (cr);
   pgtk_end_cr_clip (f);
 }
@@ -7421,6 +7458,7 @@ pgtk_clear_area (struct frame *f, int x, int y, int width, int height)
   pgtk_set_cr_source_with_color (f, FRAME_X_OUTPUT (f)->background_color,
 				 true);
   cairo_rectangle (cr, x, y, width, height);
+  push_rect(f, x, y, width, height);
   cairo_fill (cr);
   pgtk_end_cr_clip (f);
 }
