UTF-8 Fixes, attempt at scrolling, & minor changes
Changed some global -> local const vars
This commit is contained in:
parent
14296c3b6b
commit
0436087761
89
cowterm.c
89
cowterm.c
@ -21,10 +21,10 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
// There isn't a need for MAX_ROWS or MAX_COLS, but ¯\_(ツ)_/¯
|
// There isn't a need for MAX_ROWS or MAX_COLS, but ¯\_(ツ)_/¯
|
||||||
#define MAX_ROWS 1000
|
const int MAX_ROWS = 1000;
|
||||||
#define MAX_COLS 1000
|
const int MAX_COLS = 1000;
|
||||||
#define CHAR_WIDTH 8
|
const int CHAR_WIDTH = 8;
|
||||||
#define CHAR_HEIGHT 16
|
const int CHAR_HEIGHT = 16;
|
||||||
|
|
||||||
// General window/terminal stuff
|
// General window/terminal stuff
|
||||||
static pid_t child_pid;
|
static pid_t child_pid;
|
||||||
@ -1250,40 +1250,61 @@ static int master_cb(int fd, void *data, Window window) {
|
|||||||
default:
|
default:
|
||||||
if (cursor_y >= term_rows || cursor_x >= term_cols)
|
if (cursor_y >= term_rows || cursor_x >= term_cols)
|
||||||
break;
|
break;
|
||||||
if ((buf[i] >= 32 && buf[i] <= 126) || buf[i] == '\t') {
|
if (buf[i] & 0x80) { // UTF-8
|
||||||
|
char mb_buf[MB_CUR_MAX];
|
||||||
|
int mb_len = 0;
|
||||||
|
int j = i;
|
||||||
|
while (mb_len < (int)MB_CUR_MAX && j < n) {
|
||||||
|
if (mb_len == 0) {
|
||||||
|
if ((buf[j] & 0x80) == 0)
|
||||||
|
break;
|
||||||
|
mb_buf[mb_len] = buf[j];
|
||||||
|
mb_len++;
|
||||||
|
} else if ((buf[j] & 0xC0) == 0x80) {
|
||||||
|
mb_buf[mb_len] = buf[j];
|
||||||
|
mb_len++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
if (mb_len > 0) {
|
||||||
|
wchar_t wc;
|
||||||
|
mbstate_t ps;
|
||||||
|
memset(&ps, 0, sizeof(ps));
|
||||||
|
if (mbrtowc(&wc, mb_buf, mb_len, &ps) > 0) {
|
||||||
|
terminal_buffer[cursor_y][cursor_x] = wc;
|
||||||
|
color_buffer[cursor_y][cursor_x] = current_color;
|
||||||
|
attr_buffer[cursor_y][cursor_x] = current_attr;
|
||||||
|
bg_color_buffer[cursor_y][cursor_x] = current_bg_color;
|
||||||
|
needs_refresh = 1;
|
||||||
|
cursor_x++;
|
||||||
|
if (cursor_x >= term_cols) {
|
||||||
|
cursor_x = 0;
|
||||||
|
cursor_y++;
|
||||||
|
if (cursor_y >= term_rows) {
|
||||||
|
scroll_region_up(1);
|
||||||
|
cursor_y = term_rows - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i += mb_len - 1;
|
||||||
|
}
|
||||||
|
} else if (buf[i] >= 32) {
|
||||||
terminal_buffer[cursor_y][cursor_x] = buf[i];
|
terminal_buffer[cursor_y][cursor_x] = buf[i];
|
||||||
color_buffer[cursor_y][cursor_x] = current_color;
|
color_buffer[cursor_y][cursor_x] = current_color;
|
||||||
attr_buffer[cursor_y][cursor_x] = current_attr;
|
attr_buffer[cursor_y][cursor_x] = current_attr;
|
||||||
bg_color_buffer[cursor_y][cursor_x] = current_bg_color;
|
bg_color_buffer[cursor_y][cursor_x] = current_bg_color;
|
||||||
needs_refresh = 1;
|
needs_refresh = 1;
|
||||||
if (++cursor_x >= term_cols) {
|
cursor_x++;
|
||||||
|
if (cursor_x >= term_cols) {
|
||||||
cursor_x = 0;
|
cursor_x = 0;
|
||||||
if (++cursor_y >= term_rows) {
|
cursor_y++;
|
||||||
|
if (cursor_y >= term_rows) {
|
||||||
scroll_region_up(1);
|
scroll_region_up(1);
|
||||||
cursor_y = term_rows - 1;
|
cursor_y = term_rows - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (buf[i] & 0x80) { // UTF-8
|
|
||||||
mbstate_t ps;
|
|
||||||
memset(&ps, 0, sizeof(ps));
|
|
||||||
wchar_t wc;
|
|
||||||
size_t len = mbrtowc(&wc, buf + i, n - i, &ps);
|
|
||||||
|
|
||||||
if (len != (size_t)-1 && len != (size_t)-2 && len != 0) {
|
|
||||||
terminal_buffer[cursor_y][cursor_x] = wc;
|
|
||||||
color_buffer[cursor_y][cursor_x] = current_color;
|
|
||||||
attr_buffer[cursor_y][cursor_x] = current_attr;
|
|
||||||
bg_color_buffer[cursor_y][cursor_x] = current_bg_color;
|
|
||||||
needs_refresh = 1;
|
|
||||||
if (++cursor_x >= term_cols) {
|
|
||||||
cursor_x = 0;
|
|
||||||
if (++cursor_y >= term_rows) {
|
|
||||||
scroll_region_up(1);
|
|
||||||
cursor_y = term_rows - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i += len - 1; // -1 because loop will increment i
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1328,6 +1349,18 @@ static void key_press_cb(XKeyEvent *event, void *data) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (event->state & ShiftMask) {
|
||||||
|
if (keysym == XK_Page_Up) {
|
||||||
|
scroll_region_up(term_rows / 2);
|
||||||
|
needs_refresh = 1;
|
||||||
|
return;
|
||||||
|
} else if (keysym == XK_Page_Down) {
|
||||||
|
scroll_region_down(term_rows / 2);
|
||||||
|
needs_refresh = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (keysym == XK_Return || keysym == XK_KP_Enter) {
|
if (keysym == XK_Return || keysym == XK_KP_Enter) {
|
||||||
write(*master, "\r", 1); // Shell handles return
|
write(*master, "\r", 1); // Shell handles return
|
||||||
} else if (keysym == XK_BackSpace) {
|
} else if (keysym == XK_BackSpace) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user