Fix TTY cursor and graphics mode
This commit is contained in:
parent
d87d43ce22
commit
5813c416cf
2
Makefile
2
Makefile
|
@ -48,8 +48,6 @@ $(UXN_ROM): $(UXN_ASM)
|
||||||
./$(UXN_ASM) $(TAL_SRC) $(UXN_ROM)
|
./$(UXN_ASM) $(TAL_SRC) $(UXN_ROM)
|
||||||
|
|
||||||
run: $(BIN) $(UXN_ROM)
|
run: $(BIN) $(UXN_ROM)
|
||||||
# NOTE: This should probably be done on the C code.
|
|
||||||
# echo 0 > /sys/class/graphics/fbcon/cursor_blink
|
|
||||||
./$(BIN) $(UXN_ROM)
|
./$(BIN) $(UXN_ROM)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
10
src/main.c
10
src/main.c
|
@ -1,4 +1,5 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <signal.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -24,6 +25,13 @@ static Device *devmouse;
|
||||||
|
|
||||||
typedef struct timespec Time;
|
typedef struct timespec Time;
|
||||||
|
|
||||||
|
void
|
||||||
|
halt(int stub) {
|
||||||
|
(void)stub;
|
||||||
|
set_tty(false);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
Time
|
Time
|
||||||
time_now(){
|
time_now(){
|
||||||
struct timespec t;
|
struct timespec t;
|
||||||
|
@ -446,6 +454,8 @@ load_rom(char *file_name) {
|
||||||
|
|
||||||
void
|
void
|
||||||
init_uxn(Uxn *u, char *file_name) {
|
init_uxn(Uxn *u, char *file_name) {
|
||||||
|
signal(SIGINT, halt);
|
||||||
|
|
||||||
// Setup UXN memory.
|
// Setup UXN memory.
|
||||||
uxn_boot(u, calloc(0x10000, sizeof(u8)));
|
uxn_boot(u, calloc(0x10000, sizeof(u8)));
|
||||||
|
|
||||||
|
|
54
src/ppu.c
54
src/ppu.c
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include <linux/fb.h>
|
#include <linux/fb.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/kd.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
#include "ppu.h"
|
#include "ppu.h"
|
||||||
|
@ -89,6 +90,46 @@ redraw_screen(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct termios prev_t;
|
||||||
|
|
||||||
|
void
|
||||||
|
set_tty(bool graphics) {
|
||||||
|
// Disable TTY echo and set graphics mode.
|
||||||
|
int tty = open("/dev/tty0", O_RDWR);
|
||||||
|
if (!tty) {
|
||||||
|
fprintf(stderr,"error: couldn't open tty\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (graphics) {
|
||||||
|
if (ioctl(tty, KDSETMODE, KD_GRAPHICS)) {
|
||||||
|
fprintf(stderr,"error: setting graphics mode failed\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
struct termios t;
|
||||||
|
if (tcgetattr(STDIN_FILENO, &t)) {
|
||||||
|
fprintf(stderr, "error: couldn't disable terminal echo\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
prev_t = t;
|
||||||
|
t.c_lflag &= ~((tcflag_t) ECHO);
|
||||||
|
if (tcsetattr(STDIN_FILENO, TCSANOW, &t)) {
|
||||||
|
fprintf(stderr, "error: couldn't disable terminal echo\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (ioctl(tty, KDSETMODE, KD_TEXT)) {
|
||||||
|
fprintf(stderr,"error: setting text mode failed\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
if (tcsetattr(STDIN_FILENO, TCSANOW, &prev_t)) {
|
||||||
|
fprintf(stderr, "error: couldn't restore terminal attributes\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(tty);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
ppu_init(void) {
|
ppu_init(void) {
|
||||||
// Open frambuffer and get the size.
|
// Open frambuffer and get the size.
|
||||||
|
@ -122,17 +163,8 @@ ppu_init(void) {
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable echo.
|
// Prepare TTY for graphics mode.
|
||||||
struct termios t;
|
set_tty(true);
|
||||||
if (tcgetattr(STDIN_FILENO, &t)) {
|
|
||||||
fprintf(stderr, "error: couldn't disable terminal echo\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
t.c_lflag &= ~((tcflag_t) ECHO);
|
|
||||||
if (tcsetattr(STDIN_FILENO, TCSANOW, &t)) {
|
|
||||||
fprintf(stderr, "error: couldn't disable terminal echo\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize default palette.
|
// Initialize default palette.
|
||||||
palette[0] = 0x444444;
|
palette[0] = 0x444444;
|
||||||
|
|
Loading…
Reference in New Issue