summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandromeda <andromeda@lenovo>2026-04-26 21:50:34 +0200
committerandromeda <andromeda@lenovo>2026-04-26 21:50:34 +0200
commit9a23671a55b4d8841154c18346ec3b8a9d5d3736 (patch)
tree438612d13d9f6177b4a9b5c65001833b86244c75
parent5029ef79ae53980584e5bd022fdb1430d9664f76 (diff)
add some basic terminal emulator stuff
-rw-r--r--include/.gitkeep0
-rw-r--r--main.c349
-rw-r--r--project.json2
3 files changed, 48 insertions, 3 deletions
diff --git a/include/.gitkeep b/include/.gitkeep
deleted file mode 100644
index e69de29..0000000
--- a/include/.gitkeep
+++ /dev/null
diff --git a/main.c3 b/main.c3
index 26dd38a..cfe4894 100644
--- a/main.c3
+++ b/main.c3
@@ -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*);
diff --git a/project.json b/project.json
index 0912679..215004b 100644
--- a/project.json
+++ b/project.json
@@ -5,13 +5,13 @@
"version": "0.1.0",
"build-dir": "build",
"output": "build",
+ "dependency-search-paths": [ "lib" ],
"targets": {
"c3term-linux-x64": {
"name": "c3term",
"type": "executable",
"target": "linux-x64",
"sources": [ "main.c3" ],
- "dependency-search-paths": [ "lib" ],
"c-sources": [
"shim.c",
"wl", // wayland-generated code