=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/grid.c,v retrieving revision 1.109 retrieving revision 1.110 diff -c -r1.109 -r1.110 *** src/usr.bin/tmux/grid.c 2020/05/16 16:22:01 1.109 --- src/usr.bin/tmux/grid.c 2020/05/25 09:32:10 1.110 *************** *** 1,4 **** ! /* $OpenBSD: grid.c,v 1.109 2020/05/16 16:22:01 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: grid.c,v 1.110 2020/05/25 09:32:10 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 100,110 **** } /* Set cell as extended. */ ! static struct grid_cell * grid_extended_cell(struct grid_line *gl, struct grid_cell_entry *gce, const struct grid_cell *gc) { ! struct grid_cell *gcp; int flags = (gc->flags & ~GRID_FLAG_CLEARED); if (~gce->flags & GRID_FLAG_EXTENDED) --- 100,110 ---- } /* Set cell as extended. */ ! static struct grid_extd_entry * grid_extended_cell(struct grid_line *gl, struct grid_cell_entry *gce, const struct grid_cell *gc) { ! struct grid_extd_entry *gee; int flags = (gc->flags & ~GRID_FLAG_CLEARED); if (~gce->flags & GRID_FLAG_EXTENDED) *************** *** 113,122 **** fatalx("offset too big"); gl->flags |= GRID_LINE_EXTENDED; ! gcp = &gl->extddata[gce->offset]; ! memcpy(gcp, gc, sizeof *gcp); ! gcp->flags = flags; ! return (gcp); } /* Free up unused extended cells. */ --- 113,126 ---- fatalx("offset too big"); gl->flags |= GRID_LINE_EXTENDED; ! gee = &gl->extddata[gce->offset]; ! gee->data = utf8_map_big(&gc->data); ! gee->attr = gc->attr; ! gee->flags = flags; ! gee->fg = gc->fg; ! gee->bg = gc->bg; ! gee->us = gc->us; ! return (gee); } /* Free up unused extended cells. */ *************** *** 124,132 **** grid_compact_line(struct grid_line *gl) { int new_extdsize = 0; ! struct grid_cell *new_extddata; struct grid_cell_entry *gce; ! struct grid_cell *gc; u_int px, idx; if (gl->extdsize == 0) --- 128,136 ---- grid_compact_line(struct grid_line *gl) { int new_extdsize = 0; ! struct grid_extd_entry *new_extddata; struct grid_cell_entry *gce; ! struct grid_extd_entry *gee; u_int px, idx; if (gl->extdsize == 0) *************** *** 150,157 **** for (px = 0; px < gl->cellsize; px++) { gce = &gl->celldata[px]; if (gce->flags & GRID_FLAG_EXTENDED) { ! gc = &gl->extddata[gce->offset]; ! memcpy(&new_extddata[idx], gc, sizeof *gc); gce->offset = idx++; } } --- 154,161 ---- for (px = 0; px < gl->cellsize; px++) { gce = &gl->celldata[px]; if (gce->flags & GRID_FLAG_EXTENDED) { ! gee = &gl->extddata[gce->offset]; ! memcpy(&new_extddata[idx], gee, sizeof *gee); gce->offset = idx++; } } *************** *** 181,197 **** { struct grid_line *gl = &gd->linedata[py]; struct grid_cell_entry *gce = &gl->celldata[px]; ! struct grid_cell *gc; memcpy(gce, &grid_cleared_entry, sizeof *gce); if (bg != 8) { if (bg & COLOUR_FLAG_RGB) { grid_get_extended_cell(gl, gce, gce->flags); ! gl->flags |= GRID_LINE_EXTENDED; ! ! gc = &gl->extddata[gce->offset]; ! memcpy(gc, &grid_cleared_cell, sizeof *gc); ! gc->bg = bg; } else { if (bg & COLOUR_FLAG_256) gce->flags |= GRID_FLAG_BG256; --- 185,198 ---- { struct grid_line *gl = &gd->linedata[py]; struct grid_cell_entry *gce = &gl->celldata[px]; ! struct grid_extd_entry *gee; memcpy(gce, &grid_cleared_entry, sizeof *gce); if (bg != 8) { if (bg & COLOUR_FLAG_RGB) { grid_get_extended_cell(gl, gce, gce->flags); ! gee = grid_extended_cell(gl, gce, &grid_cleared_cell); ! gee->bg = bg; } else { if (bg & COLOUR_FLAG_256) gce->flags |= GRID_FLAG_BG256; *************** *** 483,494 **** grid_get_cell1(struct grid_line *gl, u_int px, struct grid_cell *gc) { struct grid_cell_entry *gce = &gl->celldata[px]; if (gce->flags & GRID_FLAG_EXTENDED) { if (gce->offset >= gl->extdsize) memcpy(gc, &grid_default_cell, sizeof *gc); ! else ! memcpy(gc, &gl->extddata[gce->offset], sizeof *gc); return; } --- 484,503 ---- grid_get_cell1(struct grid_line *gl, u_int px, struct grid_cell *gc) { struct grid_cell_entry *gce = &gl->celldata[px]; + struct grid_extd_entry *gee; if (gce->flags & GRID_FLAG_EXTENDED) { if (gce->offset >= gl->extdsize) memcpy(gc, &grid_default_cell, sizeof *gc); ! else { ! gee = &gl->extddata[gce->offset]; ! gc->flags = gee->flags; ! gc->attr = gee->attr; ! gc->fg = gee->fg; ! gc->bg = gee->bg; ! gc->us = gee->us; ! utf8_get_big(gee->data, &gc->data); ! } return; } *************** *** 545,551 **** { struct grid_line *gl; struct grid_cell_entry *gce; ! struct grid_cell *gcp; u_int i; if (grid_check_y(gd, __func__, py) != 0) --- 554,560 ---- { struct grid_line *gl; struct grid_cell_entry *gce; ! struct grid_extd_entry *gee; u_int i; if (grid_check_y(gd, __func__, py) != 0) *************** *** 560,567 **** for (i = 0; i < slen; i++) { gce = &gl->celldata[px + i]; if (grid_need_extended_cell(gce, gc)) { ! gcp = grid_extended_cell(gl, gce, gc); ! utf8_set(&gcp->data, s[i]); } else grid_store_cell(gce, gc, s[i]); } --- 569,576 ---- for (i = 0; i < slen; i++) { gce = &gl->celldata[px + i]; if (grid_need_extended_cell(gce, gc)) { ! gee = grid_extended_cell(gl, gce, gc); ! gee->data = utf8_set_big(s[i], 1); } else grid_store_cell(gce, gc, s[i]); }