From 5caf6fb6580fe9e5ef11b93235fffa70f211e3b1 Mon Sep 17 00:00:00 2001 From: Syed Daanish Date: Thu, 10 Sep 2026 19:19:13 +0100 Subject: [PATCH] Update scripting system. --- config.rb | 2 +- src/main.ml | 15 +++++--- src/mruby/core.ml | 4 --- src/mruby/initial.ml | 82 +++++++++++++++++++++++++++++++++----------- 4 files changed, 74 insertions(+), 29 deletions(-) diff --git a/config.rb b/config.rb index d85c7c6..5c986ca 100644 --- a/config.rb +++ b/config.rb @@ -25,7 +25,7 @@ def project_ws(n, sub) end def running?(process) - system("pgrep -x #{process} > /dev/null 2>&1") + system("pgrep #{process} > /dev/null 2>&1") end def go_project(n, sub) diff --git a/src/main.ml b/src/main.ml index a630718..2b3538f 100644 --- a/src/main.ml +++ b/src/main.ml @@ -1,16 +1,23 @@ let () = let startup_script = - if Array.length Sys.argv <> 2 then None else Some Sys.argv.(1) + if Array.length Sys.argv = 2 then Some Sys.argv.(1) + else + let default = + Filename.concat (Sys.getenv "HOME") ".config/kutu/config.rb" + in + if Sys.file_exists default then Some default else None in + let state = Kutu.State.new_state in print_endline "Started Kutu WM"; Bindings.Core.register_callbacks state; - Mruby.Core.mrb_load_string state.mrb Mruby.Initial.initial_code; + (match startup_script with - | None -> () - | Some s -> Mruby.Core.mrb_load_file state.mrb s); + | Some s -> + Mruby.Core.mrb_load_string state.mrb (Mruby.Initial.initial_code s) + | None -> Mruby.Core.mrb_load_string state.mrb ""); Mruby.Core.error_check state.mrb; if Xcb.Connection.flush state.conn <= 0 then exit 1; diff --git a/src/mruby/core.ml b/src/mruby/core.ml index d34ef8c..4805eea 100644 --- a/src/mruby/core.ml +++ b/src/mruby/core.ml @@ -12,10 +12,6 @@ let mrb_load_string = foreign "mrb_load_string" (ptr Types.Mrb_state.typ @-> string @-> returning void) -let mrb_load_file = - foreign "kutu_mrb_load_file" - (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; diff --git a/src/mruby/initial.ml b/src/mruby/initial.ml index 4872da5..9bdbc21 100644 --- a/src/mruby/initial.ml +++ b/src/mruby/initial.ml @@ -1,5 +1,6 @@ let initial_code = - {|#ruby + Printf.sprintf + {|#ruby MOD_MAP = { none: 0, alt: 8, @@ -29,21 +30,10 @@ KEY_MAP = { "9" => 18, "0" => 19 } -def bind(key, mod = :super, &block) - key_ = key.is_a?(String) ? KEY_MAP[key] : key - mod = MOD_MAP[mod] - raise "unknown key #{key.to_s}" unless key_ - raise "unknown modifier" unless mod - _bind key_, mod, &block -end -def unbind(key, mod = :super) - key_ = key.is_a?(String) ? KEY_MAP[key] : key - mod = MOD_MAP[mod] - raise "unknown key #{key.to_s}" unless key_ - raise "unknown modifier" unless mod - _unbind key_, mod -end +CONFIG_FILE = "%s" + +DEFAULT = < /dev/null 2>&1") + system("pgrep #{process} > /dev/null 2>&1") end def go_project(n, sub) @@ -151,27 +141,79 @@ end bind 86, :none do |_, ws| next unless in_project?(ws) - n = (($current_project - 2) % MAX_PROJECTS) + 1 + n = (($current_project - 2) %% MAX_PROJECTS) + 1 go_project(n, $current_sub) end bind 82, :none do |_, ws| next unless in_project?(ws) - n = ($current_project % MAX_PROJECTS) + 1 + n = ($current_project %% MAX_PROJECTS) + 1 go_project(n, $current_sub) end bind 79, :none do |_, ws| next unless in_project?(ws) - go_project($current_project, ($current_sub + 1) % SUBS) + go_project($current_project, ($current_sub + 1) %% SUBS) end bind 80, :none do |_, ws| next unless in_project?(ws) - go_project($current_project, ($current_sub - 1 + SUBS) % SUBS) + go_project($current_project, ($current_sub - 1 + SUBS) %% SUBS) end # ==== Startup ==== go_project(1, 0) +CODE + +BINDINGS = [] +SYSTEM_BINDINGS = [] + +def bind(key, mod = :super, system: false, &block) + key_ = key.is_a?(String) ? KEY_MAP[key] : key + mod_ = MOD_MAP[mod] + + raise "unknown key #{key}" unless key_ + raise "unknown modifier #{mod}" unless mod_ + + _bind key_, mod_, &block + + (system ? SYSTEM_BINDINGS : BINDINGS) << [key_, mod_] +end + +def unbind(key, mod = :super) + key_ = key.is_a?(String) ? KEY_MAP[key] : key + mod_ = MOD_MAP[mod] + + raise "unknown key #{key}" unless key_ + raise "unknown modifier #{mod}" unless mod_ + + _unbind key_, mod_ + BINDINGS.delete([key_, mod_]) +end + +def unbind_all + BINDINGS.each do |key_, mod_| + _unbind key_, mod_ + end + + BINDINGS.clear +end + +bind ?r, system: true do + unbind_all + if CONFIG_FILE != "" + code = File.read("script.rb") + eval code + else + eval DEFAULT + end +end + +if CONFIG_FILE != "" + code = File.read("script.rb") + eval code +else + eval DEFAULT +end |}