diff options
| author | andromeda <andromeda@lenovo> | 2026-04-26 21:50:34 +0200 |
|---|---|---|
| committer | andromeda <andromeda@lenovo> | 2026-04-26 21:50:34 +0200 |
| commit | 9a23671a55b4d8841154c18346ec3b8a9d5d3736 (patch) | |
| tree | 438612d13d9f6177b4a9b5c65001833b86244c75 /main.c3 | |
| parent | 5029ef79ae53980584e5bd022fdb1430d9664f76 (diff) | |
add some basic terminal emulator stuff
Diffstat (limited to 'main.c3')
| -rw-r--r-- | main.c3 | 49 |
1 files changed, 47 insertions, 2 deletions
@@ -7,19 +7,50 @@ module main; import std::io; +import std::os; import rgfw; import rsgl; import rfont; +import libc::termios; -fn int main(String[] args) +faultdef FAIL_OPENPTY, FAIL_FORK; + +fn Window* init() { GlHints* hints = rgfw::getGlobalHints(); hints.major = 3; hints.minor = 3; hints.profile = GlProfile.COMPATIBILITY; rgfw::setGlobalHints(hints); + return rgfw::createWindow("window title", 0, 0, 800, 400, WindowFlags.CENTER | WindowFlags.NO_RESIZE | WindowFlags.OPENGL); +} + +fn int? init_tty() +{ + int master; + int slave; + if (openpty(&master, &slave, null, null, null) < 0) return FAIL_OPENPTY~; + Pid_t f = fork(); + switch (f) + { + case -1: + return FAIL_FORK~; + case 0: // child + dup2(slave, 0); + dup2(slave, 1); + dup2(slave, 2); + os::exit(execvp(getenv("SHELL"), {null})); + default: // parent + return master; + } +} + +fn int main(String[] args) +{ + init_tty()!!; + + Window* window = init(); - Window* window = rgfw::createWindow("window title", 0, 0, 800, 400, WindowFlags.CENTER | WindowFlags.NO_RESIZE | WindowFlags.OPENGL); rsgl::Renderer* renderer = rsgl::renderer_init(rsgl::gl::rendererProc(), &rgfw::getProcAddress); rsgl::renderer_viewport(renderer, rsgl::@rect(0,0,500,500)); @@ -52,3 +83,17 @@ fn int main(String[] args) return(0); } + +struct Winsize +{ + ushort ws_row; + ushort ws_column; + ushort ws_xpixel; + ushort ws_ypixel; +} + +extern fn CInt dup2(CInt, CInt); +extern fn CInt execvp(ZString, ZString[]); +extern fn Pid_t fork(); +extern fn ZString getenv(ZString); +extern fn CInt openpty(CInt*, CInt*, ZString, Termios*, Winsize*); |
