mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Make U+FE0F VARIATION SELECTOR-16 change the width from 1 to 2. GitHub
issue 3409.
This commit is contained in:
		| @@ -1820,7 +1820,7 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc) | |||||||
| 	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, cx, cy; | 	u_int		 	 width = gc->data.width, xx, last, cy; | ||||||
| 	int			 selected, skip = 1; | 	int			 selected, skip = 1; | ||||||
|  |  | ||||||
| 	/* Ignore padding cells. */ | 	/* Ignore padding cells. */ | ||||||
| @@ -1853,12 +1853,12 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc) | |||||||
| 		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)) != NULL) { | ||||||
| 			cx = s->cx; 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 = cx; s->cy = cy; | 			s->cx = xx + 1 + gc->data.width; s->cy = cy; | ||||||
| 		} | 		} | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| @@ -2016,6 +2016,14 @@ screen_write_combine(struct screen_write_ctx *ctx, const struct utf8_data *ud, | |||||||
| 	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; | ||||||
|  |  | ||||||
|  | 	/* If this is U+FE0F VARIATION SELECTOR-16, force the width to 2. */ | ||||||
|  | 	if (gc.data.width == 1 && | ||||||
|  | 		ud->size == 3 && | ||||||
|  | 		memcmp(ud->data, "\357\270\217", 3) == 0) { | ||||||
|  | 		grid_view_set_padding(gd, (*xx) + 1, s->cy); | ||||||
|  | 		gc.data.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); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								utf8.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								utf8.c
									
									
									
									
									
								
							| @@ -227,12 +227,11 @@ utf8_width(struct utf8_data *ud, int *width) | |||||||
| 		return (UTF8_ERROR); | 		return (UTF8_ERROR); | ||||||
| 	} | 	} | ||||||
| 	*width = wcwidth(wc); | 	*width = wcwidth(wc); | ||||||
| 	if (*width < 0 || *width > 0xff) { | 	log_debug("UTF-8 %.*s %#x, wcwidth() %d", (int)ud->size, ud->data, | ||||||
| 		log_debug("UTF-8 %.*s, wcwidth() %d", (int)ud->size, ud->data, | 	    (u_int)wc, *width); | ||||||
| 		    *width); | 	if (*width >= 0 && *width <= 0xff) | ||||||
| 		return (UTF8_ERROR); | 		return (UTF8_DONE); | ||||||
| 	} | 	return (UTF8_ERROR); | ||||||
| 	return (UTF8_DONE); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm