[BACK]Return to screen-write.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / tmux

Diff for /src/usr.bin/tmux/screen-write.c between version 1.212 and 1.213

version 1.212, 2022/12/16 08:19:58 version 1.213, 2023/02/10 14:01:43
Line 34 
Line 34 
 static int      screen_write_overwrite(struct screen_write_ctx *,  static int      screen_write_overwrite(struct screen_write_ctx *,
                     struct grid_cell *, u_int);                      struct grid_cell *, u_int);
 static const struct grid_cell *screen_write_combine(struct screen_write_ctx *,  static const struct grid_cell *screen_write_combine(struct screen_write_ctx *,
                     const struct utf8_data *, u_int *);                      const struct utf8_data *, u_int *, u_int *);
   
 struct screen_write_citem {  struct screen_write_citem {
         u_int                           x;          u_int                           x;
Line 1820 
Line 1820 
         struct grid_cell         tmp_gc, now_gc;          struct grid_cell         tmp_gc, now_gc;
         struct tty_ctx           ttyctx;          struct tty_ctx           ttyctx;
         u_int                    sx = screen_size_x(s), sy = screen_size_y(s);          u_int                    sx = screen_size_x(s), sy = screen_size_y(s);
         u_int                    width = gc->data.width, xx, last, cy;          u_int                    width = gc->data.width, xx, last, cx, cy;
         int                      selected, skip = 1;          int                      selected, skip = 1;
   
         /* Ignore padding cells. */          /* Ignore padding cells. */
Line 1847 
Line 1847 
          */           */
         if (ctx->flags & SCREEN_WRITE_ZWJ) {          if (ctx->flags & SCREEN_WRITE_ZWJ) {
                 screen_write_collect_flush(ctx, 0, __func__);                  screen_write_collect_flush(ctx, 0, __func__);
                 screen_write_combine(ctx, &zwj, &xx);                  screen_write_combine(ctx, &zwj, &xx, &cx);
         }          }
         if (width == 0 || (ctx->flags & SCREEN_WRITE_ZWJ)) {          if (width == 0 || (ctx->flags & SCREEN_WRITE_ZWJ)) {
                 ctx->flags &= ~SCREEN_WRITE_ZWJ;                  ctx->flags &= ~SCREEN_WRITE_ZWJ;
                 screen_write_collect_flush(ctx, 0, __func__);                  screen_write_collect_flush(ctx, 0, __func__);
                 if ((gc = screen_write_combine(ctx, ud, &xx)) != NULL) {                  if ((gc = screen_write_combine(ctx, ud, &xx, &cx)) != NULL) {
                         cy = s->cy;                          cy = s->cy;
                         screen_write_set_cursor(ctx, xx, s->cy);                          screen_write_set_cursor(ctx, xx, s->cy);
                         screen_write_initctx(ctx, &ttyctx, 0);                          screen_write_initctx(ctx, &ttyctx, 0);
                         ttyctx.cell = gc;                          ttyctx.cell = gc;
                         tty_write(tty_cmd_cell, &ttyctx);                          tty_write(tty_cmd_cell, &ttyctx);
                         s->cx = xx + 1 + gc->data.width; s->cy = cy;                          s->cx = cx; s->cy = cy;
                 }                  }
                 return;                  return;
         }          }
Line 1980 
Line 1980 
 /* Combine a UTF-8 zero-width character onto the previous. */  /* Combine a UTF-8 zero-width character onto the previous. */
 static const struct grid_cell *  static const struct grid_cell *
 screen_write_combine(struct screen_write_ctx *ctx, const struct utf8_data *ud,  screen_write_combine(struct screen_write_ctx *ctx, const struct utf8_data *ud,
     u_int *xx)      u_int *xx, u_int *cx)
 {  {
         struct screen           *s = ctx->s;          struct screen           *s = ctx->s;
         struct grid             *gd = s->grid;          struct grid             *gd = s->grid;
         static struct grid_cell  gc;          static struct grid_cell  gc;
         u_int                    n;          u_int                    n, width;
   
         /* Can't combine if at 0. */          /* Can't combine if at 0. */
         if (s->cx == 0)          if (s->cx == 0) {
                   *xx = 0;
                 return (NULL);                  return (NULL);
           }
           *xx = s->cx;
   
         /* Empty data is out. */          /* Empty data is out. */
         if (ud->size == 0)          if (ud->size == 0)
Line 2003 
Line 2006 
         }          }
         if (n > s->cx)          if (n > s->cx)
                 return (NULL);                  return (NULL);
         *xx = s->cx - n;  
   
         /* Check there is enough space. */          /* Check there is enough space. */
         if (gc.data.size + ud->size > sizeof gc.data.data)          if (gc.data.size + ud->size > sizeof gc.data.data)
                 return (NULL);                  return (NULL);
           (*xx) -= n;
   
         log_debug("%s: %.*s onto %.*s at %u,%u", __func__, (int)ud->size,          log_debug("%s: %.*s onto %.*s at %u,%u (width %u)", __func__,
             ud->data, (int)gc.data.size, gc.data.data, *xx, s->cy);              (int)ud->size, ud->data, (int)gc.data.size, gc.data.data, *xx,
               s->cy, gc.data.width);
   
         /* Append the data. */          /* Append the data. */
         memcpy(gc.data.data + gc.data.size, ud->data, ud->size);          memcpy(gc.data.data + gc.data.size, ud->data, ud->size);
         gc.data.size += ud->size;          gc.data.size += ud->size;
           width = gc.data.width;
   
         /* If this is U+FE0F VARIATION SELECTOR-16, force the width to 2. */          /* If this is U+FE0F VARIATION SELECTOR-16, force the width to 2. */
         if (gc.data.width == 1 &&          if (gc.data.width == 1 &&
                 ud->size == 3 &&              ud->size == 3 &&
                 memcmp(ud->data, "\357\270\217", 3) == 0) {              memcmp(ud->data, "\357\270\217", 3) == 0) {
                 grid_view_set_padding(gd, (*xx) + 1, s->cy);                  grid_view_set_padding(gd, (*xx) + 1, s->cy);
                 gc.data.width = 2;                  gc.data.width = 2;
                   width += 2;
         }          }
   
         /* Set the new cell. */          /* Set the new cell. */
         grid_view_set_cell(gd, *xx, s->cy, &gc);          grid_view_set_cell(gd, *xx, s->cy, &gc);
   
           *cx = (*xx) + width;
           log_debug("%s: character at %u; cursor at %u", __func__, *xx, *cx);
         return (&gc);          return (&gc);
 }  }
   

Legend:
Removed from v.1.212  
changed lines
  Added in v.1.213