Fix and make mruby work better

This commit is contained in:
2026-07-26 16:49:43 +01:00
parent 45ef92f27e
commit 5f40c0536c
7 changed files with 92 additions and 40 deletions
+4 -4
View File
@@ -6,11 +6,11 @@
path = libs/mgems/mruby-marshal-c path = libs/mgems/mruby-marshal-c
url = https://github.com/LanzaSchneider/mruby-marshal-c.git url = https://github.com/LanzaSchneider/mruby-marshal-c.git
ignore = dirty ignore = dirty
[submodule "libs/mgems/mruby-process"]
path = libs/mgems/mruby-process
url = https://github.com/iij/mruby-process.git
ignore = dirty
[submodule "libs/mgems/mruby-env"] [submodule "libs/mgems/mruby-env"]
path = libs/mgems/mruby-env path = libs/mgems/mruby-env
url = https://github.com/iij/mruby-env.git url = https://github.com/iij/mruby-env.git
ignore = dirty ignore = dirty
[submodule "libs/mgems/mruby-process"]
path = libs/mgems/mruby-process
url = https://github.com/katzer/mruby-process
ignore = dirty
+20
View File
@@ -31,3 +31,23 @@
# C compiler settings # C compiler settings
# conf.cc do |cc| # conf.cc do |cc|
# cc.command = ENV['CC'] || 'gcc' # cc.command = ENV['CC'] || 'gcc'
@@ -79,5 +79,5 @@
# Turn on `enable_debug` for better debugging
# conf.enable_debug
- conf.enable_bintest
- conf.enable_test
+ # conf.enable_bintest
+ # conf.enable_test
end
--- ./mgems/mruby-process/mrbgem.rake
+++ ./mgems/mruby-process/mrbgem.rake
@@ -54,4 +54,9 @@
else
spec.objs.delete objfile("#{build_dir}/src/win32")
end
+
+ spec.objs.delete objfile("#{build_dir}/src/internal")
+ spec.objs.delete objfile("#{build_dir}/src/dln")
+ spec.objs.delete objfile("#{build_dir}/src/signal")
+ spec.objs.delete objfile("#{build_dir}/src/status")
end
+22 -24
View File
@@ -1,38 +1,30 @@
let spawn cmd =
match Unix.fork () with
| 0 ->
let devnull = Unix.openfile "/dev/null" [ Unix.O_WRONLY ] 0o666 in
Unix.dup2 devnull Unix.stdout;
Unix.dup2 devnull Unix.stderr;
Unix.close devnull;
Unix.execvp cmd.(0) cmd
| _pid -> ()
type wm_state = { type wm_state = {
mutable running : bool; mutable running : bool;
conn : Xcb.Types.Connection.conn_ptr; conn : Xcb.Types.Connection.conn_ptr;
mrb : Mruby.Types.Mrb_state.mrb_ptr;
root : Xcb.Types.Window.t; root : Xcb.Types.Window.t;
mutable focus : Xcb.Types.Window.t; mutable focus : Xcb.Types.Window.t;
} }
let () = let () =
let conn = Xcb.Connection.connect () in let state =
let conn = Xcb.Connection.connect () in
let mrb = Mruby.Core.mrb_open in
let root = Xcb.Utils.get_root conn in
{ running = true; conn; mrb; root; focus = root }
in
print_endline "Connected to X"; print_endline "Started Kutu WM";
let root = Xcb.Utils.get_root conn in Xcb.Window.setup state.conn state.root;
Xcb.Window.keybind state.conn state.root 0 24;
Xcb.Window.keybind state.conn state.root 0 25;
Xcb.Window.keybind state.conn state.root 0 26;
let state = { running = true; conn; root; focus = root } in if Xcb.Connection.flush state.conn <= 0 then exit 1;
Xcb.Window.setup conn root;
Xcb.Window.keybind conn root 0 24;
Xcb.Window.keybind conn root 0 25;
Xcb.Window.keybind conn root 0 26;
if Xcb.Connection.flush conn <= 0 then exit 1;
while state.running do while state.running do
(match Xcb.Event.next conn with (match Xcb.Event.next state.conn with
| None -> () | None -> ()
| Some ev -> | Some ev ->
(match Xcb.Event.rtype ev with (match Xcb.Event.rtype ev with
@@ -40,7 +32,11 @@ let () =
let key = Xcb.Event.Key.detail (Xcb.Event.Key.from ev) in let key = Xcb.Event.Key.detail (Xcb.Event.Key.from ev) in
match key with match key with
| 26 -> state.running <- false | 26 -> state.running <- false
| 25 -> spawn [| "kitty" |] | 25 ->
Mruby.Core.mrb_load_string state.mrb
{|
system "kitty &"
|}
| 24 -> Xcb.Window.kill state.conn state.focus | 24 -> Xcb.Window.kill state.conn state.focus
| _ -> ()) | _ -> ())
| MapRequest -> | MapRequest ->
@@ -50,9 +46,11 @@ let () =
Xcb.Window.map state.conn window Xcb.Window.map state.conn window
| _ -> ()); | _ -> ());
Xcb.Utils.free ev); Xcb.Utils.free ev);
Mruby.Core.error_check state.mrb;
if Xcb.Connection.flush state.conn <= 0 then exit 1; if Xcb.Connection.flush state.conn <= 0 then exit 1;
Unix.sleepf 0.01 Unix.sleepf 0.01
done; done;
Mruby.Core.mrb_close state.mrb;
Xcb.Connection.disconnect state.conn; Xcb.Connection.disconnect state.conn;
print_endline "done" print_endline "Closing up Kutu WM"
-11
View File
@@ -1,11 +0,0 @@
open Ctypes
open Foreign
type mrb = unit ptr
let mrb : mrb typ = ptr void
let mrb_open = foreign "mrb_open" (void @-> returning mrb)
let mrb_close = foreign "mrb_close" (mrb @-> returning void)
let mrb_load_string =
foreign "mrb_load_string" (mrb @-> string @-> returning void)
+21
View File
@@ -0,0 +1,21 @@
open Ctypes
open Foreign
let _mrb_open = foreign "mrb_open" (void @-> returning (ptr Types.Mrb_state.typ))
let mrb_open = _mrb_open ()
let mrb_close = foreign "mrb_close" (ptr Types.Mrb_state.typ @-> returning void)
let mrb_print_error =
foreign "mrb_print_error" (ptr Types.Mrb_state.typ @-> returning void)
(* TODO: bind module definition and adding functions to the module thing here somehow. *)
let mrb_load_string =
foreign "mrb_load_string"
(ptr Types.Mrb_state.typ @-> string @-> returning void)
let error_check mrb_ptr =
if Types.Mrb_state.has_error mrb_ptr then begin
mrb_print_error mrb_ptr;
Types.Mrb_state.clear_error mrb_ptr
end
+24
View File
@@ -0,0 +1,24 @@
open Ctypes
open Foreign
module Mrb_state = struct
type t
type mrb_ptr = t structure ptr
let typ : t structure typ = structure "mrb_state"
let jmp = field typ "jmp" (ptr void)
let c = field typ "c" (ptr void)
let root_c = field typ "root_c" (ptr void)
let globals = field typ "globals" (ptr void)
let exc = field typ "exc" (ptr void)
(* as it builds by default on x86_64 linux *)
let padding = field typ "padding" (array 24472 char)
let () = seal typ
let has_error mrb_ptr =
let exc_val = getf !@mrb_ptr exc in
not (is_null exc_val)
let clear_error mrb_ptr = setf !@mrb_ptr exc null
end