Internal screen data rewrite for better 256 colour/UTF-8 support.

This commit is contained in:
Nicholas Marriott
2008-09-25 20:08:57 +00:00
parent 9edb4d4b85
commit efe557313a
24 changed files with 2474 additions and 2421 deletions

125
TODO
View File

@ -41,127 +41,10 @@
-- For 0.5 --------------------------------------------------------------------
XXX
screen contains grid
screen_write <-- write to TTY and to screen using close-to-ANSI functions
screen_redraw <-- write areas of screen to TTY
grid_view <-- write to viewable area of grid
grid <-- manipulate grid and history
XXX
grid_view has ox,oy
XXX
- FINISH UTF8: fix copy and paste
- SPLIT u_short attr into attr,flags?
- maybe rethink backend data structure?
- utf8 can be 1-4 bytes
- most common is 1 bytes
- there can be double-width characters which take n bytes but 2 columns on screen
- they are not only drawn as two characters, they also require two backspaces to remove
- three operations:
- simultaneously update screen and ttys
- redraw screen or section of screen to ttys
- write to ttys without updating screen
---
NEED to be able to:
resize screen
apply ops to both screen and tty simultaneously
both when parsing input and when eg scrolling history
draw on the top of the screen without modifying it
display arbitrary parts of the history
redraw arbitrary parts of the visible screen
---
NEVER need to draw into the history
split off grid manip:
16-bit characters
8-bit flags
8-bit attributes
8-bit fg colour
8-bit bg colour
struct grid_data {
struct grid_cell **data;
int *sizes;
int sx;
int sy;
int hsize;
int hlimit;
};
struct grid_cell {
u_short data;
u_char attr;
u_char flags;
u_char fg;
u_char bg;
};
const struct grid_default_cell = { 0x20, 0, 0, 8, 8 };
; grid logically split from
; -hlimit to 0 and 0 to sy
; ALWAYS fill with default
const struct grid_cell *grid_get(int x, int y);
void grid_set(int x, int y, const struct grid_cell *cell);
void grid_resize()
void grid_shift() /* shift lines into history */
struct grid_view {
int ox;
int oy;
int sx;
int sy;
struct grid_data *gdata;
struct grid_view *parent;
};
struct grid_cell *grid_view_get_cell(int x, int y)
void grid_view_set_cell(int x, int y, const struct grid_cell *cell);
int grid_view_absolute_x(int x);
int grid_view_absolute_y(int y);
int grid_view_relative_x(int x);
int grid_view_relative_y(int y);
void grid_view_delete_lines(int y, int ny)
void grid_view_insert_lines(int y, int ny)
void grid_view_clear_lines(int y, int ny)
void grid_view_fill_lines(int y, int ny, const struct grid_cell *cell)
void grid_view_delete_cells(int x, int y, int nx)
void grid_view_insert_cells(int x, int y, int nx)
void grid_view_clear_cells(int x, int y, int nx)
void grid_view_fill_cells(int x, int nx, const struct grid_cell *cell)
void grid_view_clear_area(int x, int y, int nx, int ny)
void grid_view_fill_area(int x, int y, int nx, int ny, const struct grid_cell *cell)
---
screen has two (both grid_view):
base and overlay
---
screen_write writes into overlay if it exists and then base, also optionally to tty
screen_draw draws overlay + base to display
---
---
Would it be better to just expand char to 16-bits and use it as an index only
for >2-byte characters? or - better - don't support entire UTF range? only the BMP?
this would get rid of UTF table and limits, but still leave double-width character annoyances
also would double memory usage
TODO -- 2 fix window-*.c
3 resizing
4 audit for leftover/unused code
5 next phase of tidying
----
21:09 < merdely> NicM: if I run 'tmux attach -t main' and there is no tmux session named main, start a new one.