Another poor attempt to fix vim
At least I think I'm geting closer?
This commit is contained in:
parent
d8c40cb367
commit
dc7562af52
34
cowterm.c
34
cowterm.c
@ -308,6 +308,9 @@ static void draw_char(Display *display, Drawable d, int x, int y) {
|
|||||||
unsigned long fg_color = color_buffer[y][x];
|
unsigned long fg_color = color_buffer[y][x];
|
||||||
unsigned long bg_color = bg_color_buffer[y][x];
|
unsigned long bg_color = bg_color_buffer[y][x];
|
||||||
int attrs = attr_buffer[y][x];
|
int attrs = attr_buffer[y][x];
|
||||||
|
static unsigned long last_bg_color = 0;
|
||||||
|
static int last_x = -1;
|
||||||
|
static int last_y = -1;
|
||||||
|
|
||||||
if (attrs & ATTR_REVERSE) {
|
if (attrs & ATTR_REVERSE) {
|
||||||
unsigned long temp = fg_color;
|
unsigned long temp = fg_color;
|
||||||
@ -315,19 +318,24 @@ static void draw_char(Display *display, Drawable d, int x, int y) {
|
|||||||
bg_color = temp;
|
bg_color = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear the character position first
|
if (last_x != x || last_y != y || last_bg_color != bg_color) {
|
||||||
XSetForeground(display, gc, bg_color);
|
XSetForeground(display, gc, bg_color);
|
||||||
XFillRectangle(display, d, gc, x * CHAR_WIDTH, y * CHAR_HEIGHT, CHAR_WIDTH,
|
XFillRectangle(display, d, gc, x * CHAR_WIDTH, y * CHAR_HEIGHT, CHAR_WIDTH,
|
||||||
CHAR_HEIGHT);
|
CHAR_HEIGHT);
|
||||||
|
last_x = x;
|
||||||
|
last_y = y;
|
||||||
|
last_bg_color = bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
XSetForeground(display, gc, fg_color);
|
XSetForeground(display, gc, fg_color);
|
||||||
|
|
||||||
char str[2] = {terminal_buffer[y][x], '\0'};
|
char str[2] = {terminal_buffer[y][x], '\0'};
|
||||||
|
|
||||||
// Select appropriate font based on attributes
|
// Select appropriate font based on attributes
|
||||||
XFontStruct *font = regular_font;
|
XFontStruct *font = regular_font;
|
||||||
if (attr_buffer[y][x] & ATTR_BOLD) {
|
if (attrs & ATTR_BOLD) {
|
||||||
font = bold_font;
|
font = bold_font;
|
||||||
} else if (attr_buffer[y][x] & ATTR_ITALIC) {
|
} else if (attrs & ATTR_ITALIC) {
|
||||||
font = italic_font;
|
font = italic_font;
|
||||||
}
|
}
|
||||||
XSetFont(display, gc, font->fid);
|
XSetFont(display, gc, font->fid);
|
||||||
@ -368,12 +376,14 @@ static void draw_terminal(Display *display, Window window) {
|
|||||||
term_rows * CHAR_HEIGHT, DefaultDepth(display, DefaultScreen(display)));
|
term_rows * CHAR_HEIGHT, DefaultDepth(display, DefaultScreen(display)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw to buffer first
|
// Only draw the changed parts of the terminal to the buffer
|
||||||
|
if (needs_refresh) {
|
||||||
for (int y = 0; y < term_rows; y++) {
|
for (int y = 0; y < term_rows; y++) {
|
||||||
for (int x = 0; x < term_cols; x++) {
|
for (int x = 0; x < term_cols; x++) {
|
||||||
draw_char(display, buffer_pixmap, x, y);
|
draw_char(display, buffer_pixmap, x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Copy buffer to window
|
// Copy buffer to window
|
||||||
XCopyArea(display, buffer_pixmap, window, gc, 0, 0, term_cols * CHAR_WIDTH,
|
XCopyArea(display, buffer_pixmap, window, gc, 0, 0, term_cols * CHAR_WIDTH,
|
||||||
@ -400,22 +410,6 @@ static void check_refresh(Display *display, Window window) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clear_terminal(Display *display, Window window) {
|
|
||||||
if (!terminal_buffer || !color_buffer || !attr_buffer || !bg_color_buffer)
|
|
||||||
return;
|
|
||||||
for (int y = 0; y < term_rows; y++) {
|
|
||||||
memset(terminal_buffer[y], ' ', term_cols);
|
|
||||||
for (int x = 0; x < term_cols; x++) {
|
|
||||||
color_buffer[y][x] = current_color;
|
|
||||||
attr_buffer[y][x] = current_attr;
|
|
||||||
bg_color_buffer[y][x] = current_bg_color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cursor_x = 0;
|
|
||||||
cursor_y = 0;
|
|
||||||
needs_refresh = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scroll the terminal up one line
|
// Scroll the terminal up one line
|
||||||
static void scroll_up(void) {
|
static void scroll_up(void) {
|
||||||
// Move all lines up one position
|
// Move all lines up one position
|
||||||
|
Loading…
Reference in New Issue
Block a user