]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix frame invalidation on Haiku
authorPo Lu <luangruo@yahoo.com>
Wed, 11 May 2022 03:48:36 +0000 (03:48 +0000)
committerPo Lu <luangruo@yahoo.com>
Wed, 11 May 2022 03:48:36 +0000 (03:48 +0000)
* src/haiku_support.cc (FlipBuffers): Only set view bitmap if it
actually changed.

* src/haikuterm.c (haiku_clip_to_string_exactly)
(haiku_draw_window_cursor, haiku_draw_fringe_bitmap): Fix region
invalidation.

src/haiku_support.cc
src/haikuterm.c

index cb9dfabc4e719cba644e8cafe9a8759189e3c97b..6caf8049d1f4c75a58a7a918d81b13de70d8ba22 100644 (file)
@@ -1619,16 +1619,17 @@ public:
        copy_bitmap = NULL;
       }
     if (!copy_bitmap)
-      copy_bitmap = new BBitmap (offscreen_draw_bitmap_1);
+      {
+       copy_bitmap = new BBitmap (offscreen_draw_bitmap_1);
+       SetViewBitmap (copy_bitmap, Frame (),
+                      Frame (), B_FOLLOW_NONE, 0);
+      }
     else
       copy_bitmap->ImportBits (offscreen_draw_bitmap_1);
 
     if (copy_bitmap->InitCheck () != B_OK)
       gui_abort ("Failed to init copy bitmap during buffer flip");
 
-    SetViewBitmap (copy_bitmap,
-                  Frame (), Frame (), B_FOLLOW_NONE, 0);
-
     Invalidate (&invalid_region);
     invalid_region.MakeEmpty ();
     UnlockLooper ();
index 28ab66c9bcedef8046d1389077b0a60ad7bc75c6..a7403314823d83d244c5e0b312bdc66b1b88b068 100644 (file)
@@ -204,6 +204,8 @@ haiku_clip_to_string_exactly (struct glyph_string *s, struct glyph_string *dst)
 {
   BView_ClipToRect (FRAME_HAIKU_VIEW (s->f), s->x, s->y,
                    s->width, s->height);
+  BView_invalidate_region (FRAME_HAIKU_VIEW (s->f), s->x,
+                          s->y, s->width, s->height);
 }
 
 static void
@@ -2087,10 +2089,12 @@ haiku_draw_window_cursor (struct window *w,
     case DEFAULT_CURSOR:
     case NO_CURSOR:
       break;
+
     case HBAR_CURSOR:
       BView_FillRectangle (view, fx, fy, w->phys_cursor_width, h);
       BView_invalidate_region (view, fx, fy, w->phys_cursor_width, h);
       break;
+
     case BAR_CURSOR:
       if (cursor_glyph->resolved_level & 1)
        {
@@ -2104,6 +2108,7 @@ haiku_draw_window_cursor (struct window *w,
 
       BView_invalidate_region (view, fx, fy, w->phys_cursor_width, h);
       break;
+
     case HOLLOW_BOX_CURSOR:
       if (phys_cursor_glyph->type != IMAGE_GLYPH)
        {
@@ -2115,6 +2120,7 @@ haiku_draw_window_cursor (struct window *w,
 
       BView_invalidate_region (view, fx, fy, w->phys_cursor_width, h);
       break;
+
     case FILLED_BOX_CURSOR:
       draw_phys_cursor_glyph (w, glyph_row, DRAW_CURSOR);
     }
@@ -2575,13 +2581,18 @@ haiku_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
   face = p->face;
 
   block_input ();
-  BView_draw_lock (view, true, p->x, p->y, p->wd, p->h);
+  BView_draw_lock (view, true, 0, 0, 0, 0);
   BView_StartClip (view);
 
+  if (p->wd && p->h)
+    BView_invalidate_region (view, p->x, p->y, p->wd, p->h);
+
   haiku_clip_to_row (w, row, ANY_AREA);
 
   if (p->bx >= 0 && !p->overlay_p)
     {
+      BView_invalidate_region (view, p->bx, p->by, p->nx, p->ny);
+
       if (!face->stipple)
        {
          BView_SetHighColor (view, face->background);