diff options
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*); |
