Fix up some terminal bits, add F keys

This commit is contained in:
Kevin Lange 2013-04-13 20:21:40 -07:00
parent f76616d06e
commit cd677b44c3
5 changed files with 87 additions and 23 deletions

Binary file not shown.

View File

@ -53,11 +53,12 @@ size_t ring_buffer_read(ring_buffer_t * ring_buffer, size_t size, uint8_t * buff
collected++;
}
spin_unlock(&ring_buffer->lock);
wakeup_queue(ring_buffer->wait_queue);
if (collected == 0) {
wakeup_queue(ring_buffer->wait_queue);
sleep_on(ring_buffer->wait_queue);
}
}
wakeup_queue(ring_buffer->wait_queue);
return collected;
}
@ -73,12 +74,13 @@ size_t ring_buffer_write(ring_buffer_t * ring_buffer, size_t size, uint8_t * buf
}
spin_unlock(&ring_buffer->lock);
wakeup_queue(ring_buffer->wait_queue);
if (written < size) {
wakeup_queue(ring_buffer->wait_queue);
sleep_on(ring_buffer->wait_queue);
}
}
wakeup_queue(ring_buffer->wait_queue);
return written;
}

View File

@ -1,7 +1,10 @@
toaru|toaruos framebuffer terminal,
toaru|toaru terminal,
mc5i,
xenl,
cols#128, lines#45,
km,
mir,
msgr,
cols#80, lines#24,
colors#256, it#8, ncv#18, pairs#32767, npc, am,
ind=^J, cr=^M,
nel=^J, ht=^I,
@ -36,7 +39,18 @@ toaru|toaruos framebuffer terminal,
ri=\E[T,
sc=\E[s,
rc=\E[u,
knp=\E[6~,
kpp=\E[5~,
kf1=\EOP,
kf2=\EOQ,
kf3=\EOR,
kf4=\EOS,
kf5=\E[15~,
kf6=\E[17~,
kf7=\E[18~,
kf8=\E[19~,
kf9=\E[20~,
kf10=\E[21~,
kf11=\E[23~,
kf12=\E[24~,
toaru-small|toaruos windowed terminal at 80x24,
use=toaru,
cols#80, lines#24,

View File

@ -40,6 +40,7 @@ size_t shell_scroll = 0;
char shell_temp[1024];
int shell_interactive = 1;
int shell_force_raw = 0;
int pid; /* Process ID of the shell */
@ -861,6 +862,8 @@ _done:
shell_command_t func = shell_find(argv[0]);
if (shell_force_raw) set_unbuffered();
if (func) {
return func(tokenid, argv);
} else {
@ -1103,6 +1106,12 @@ uint32_t shell_cmd_set(int argc, char * argv[]) {
printf("\033[3000;%s;%sz", argv[2], argv[3]);
fflush(stdout);
return 0;
} else if (!strcmp(argv[1], "force-raw")) {
shell_force_raw = 1;
return 0;
} else if (!strcmp(argv[1], "no-force-raw")) {
shell_force_raw = 0;
return 0;
}
}

View File

@ -75,6 +75,7 @@ typedef struct _terminal_cell {
/* master and slave pty descriptors */
static int fd_master, fd_slave;
static FILE * terminal;
int scale_fonts = 0; /* Whether fonts should be scaled */
float font_scaling = 1.0; /* How much they should be scaled by */
@ -686,13 +687,6 @@ void ansi_init(void (*writer)(char), int w, int y, void (*setcolor)(uint32_t, ui
ansi_set_color(state.fg, state.bg);
}
void ansi_print(char * c) {
uint32_t len = strlen(c);
for (uint32_t i = 0; i < len; ++i) {
ansi_put(c[i]);
}
}
static void render_decors() {
if (_windowed) {
if (terminal_title_length) {
@ -844,10 +838,7 @@ term_write_char(
}
error = FT_Load_Glyph(*_font, glyph_index, FT_LOAD_DEFAULT);
if (error) {
char tmp[256];
sprintf(tmp, "%d", val);
ansi_print("Error loading glyph: ");
ansi_print(tmp);
fprintf(terminal, "Error loading glyph: %d\n", val);
};
slot = (*_font)->glyph;
if (slot->format == FT_GLYPH_FORMAT_OUTLINE) {
@ -1336,7 +1327,8 @@ int buffer_put(char c) {
input_collected--;
input_buffer[input_collected] = '\0';
if (state.local_echo) {
ansi_print("\010 \010");
fprintf(terminal, "\010 \010");
fflush(terminal);
}
}
return 0;
@ -1350,7 +1342,8 @@ int buffer_put(char c) {
}
input_buffer[input_collected] = c;
if (state.local_echo) {
ansi_put(c);
fprintf(terminal, "%c", c);
fflush(terminal);
}
if (input_buffer[input_collected] == '\n') {
input_collected++;
@ -1375,9 +1368,13 @@ void handle_input(char c) {
}
void handle_input_s(char * c) {
while (*c) {
handle_input(*c);
c++;
if (_unbuffered) {
write(fd_master, c, strlen(c));
} else {
while (*c) {
handle_input(*c);
c++;
}
}
}
@ -1387,6 +1384,42 @@ void key_event(int ret, key_event_t * event) {
} else {
if (event->action == KEY_ACTION_UP) return;
switch (event->keycode) {
case KEY_F1:
handle_input_s("\033OP");
break;
case KEY_F2:
handle_input_s("\033OQ");
break;
case KEY_F3:
handle_input_s("\033OR");
break;
case KEY_F4:
handle_input_s("\033OS");
break;
case KEY_F5:
handle_input_s("\033[15~");
break;
case KEY_F6:
handle_input_s("\033[17~");
break;
case KEY_F7:
handle_input_s("\033[18~");
break;
case KEY_F8:
handle_input_s("\033[19~");
break;
case KEY_F9:
handle_input_s("\033[20~");
break;
case KEY_F10:
handle_input_s("\033[21~");
break;
case KEY_F11:
handle_input_s("\033[23~");
break;
case KEY_F12:
handle_input_s("\033[24~");
break;
case KEY_ARROW_UP:
handle_input_s("\033[A");
break;
@ -1407,6 +1440,8 @@ void key_event(int ret, key_event_t * event) {
i++;
}
redraw_scrollback();
} else {
handle_input_s("\033[5~");
}
break;
case KEY_PAGE_DOWN:
@ -1417,6 +1452,8 @@ void key_event(int ret, key_event_t * event) {
i++;
}
redraw_scrollback();
} else {
handle_input_s("\033[6~");
}
break;
}
@ -1760,6 +1797,8 @@ int main(int argc, char ** argv) {
syscall_openpty(&fd_master, &fd_slave, NULL, NULL, NULL);
terminal = fdopen(fd_slave, "w");
reinit();
int pid = getpid();