Files
kutu/src/bindings/window_op.ml
T
2026-09-09 23:39:05 +01:00

86 lines
3.3 KiB
OCaml

open Ctypes
open Foreign
let register_kill (state : Kutu.State.wm_state) =
let mrb_get_args =
foreign "mrb_get_args"
(ptr Mruby.Types.Mrb_state.typ
@-> string @-> ptr int64_t @-> returning int)
in
let kill_window (mrb : Mruby.Types.Mrb_state.t structure ptr)
(self : Mruby.Types.Mrb_value.t structure) =
let win_id = allocate int64_t 0L in
ignore (mrb_get_args mrb "i" win_id);
let id = Unsigned.UInt32.of_int64 !@win_id in
if id != state.root then Xcb.Window.kill state.conn id;
self
in
Mruby.Bindings.mrb_define_method state.mrb
(Mruby.Types.Mrb_state.get_object_class state.mrb)
"kill" kill_window
(Mruby.Bindings.mrb_args_req 1)
let register_toggle_float (state : Kutu.State.wm_state) =
let mrb_get_args =
foreign "mrb_get_args"
(ptr Mruby.Types.Mrb_state.typ
@-> string @-> ptr int64_t @-> returning int)
in
let toggle_float (mrb : Mruby.Types.Mrb_state.t structure ptr)
(self : Mruby.Types.Mrb_value.t structure) =
let win_id = allocate int64_t 0L in
ignore (mrb_get_args mrb "i" win_id);
let window = Unsigned.UInt32.of_int64 !@win_id in
let windows =
Kutu.Layout.calculate state.screen
state.workspaces.(state.current).ws_root
in
(match Kutu.Layout.find_fwindow window windows with
| Some { fw_rect; _ } ->
begin match
Kutu.Layout.find_fwindow window
state.workspaces.(state.current).ws_fwindows
with
| Some _ -> print_endline "Error: window already floating"
| None ->
let new_root, _ =
Kutu.Layout.remove window state.workspaces.(state.current).ws_root
in
state.workspaces.(state.current).ws_root <- new_root;
state.workspaces.(state.current).ws_fwindows <-
{ fw_rect; fw_window = window }
:: state.workspaces.(state.current).ws_fwindows;
Xcb.Window.move_to_top state.conn window;
List.iter
(fun { Kutu.Layout.fw_window = window; fw_rect = rect } ->
Xcb.Window.reshape state.conn window rect)
(Kutu.Layout.calculate state.screen
state.workspaces.(state.current).ws_root)
end
| None ->
begin match
Kutu.Layout.find_fwindow window
state.workspaces.(state.current).ws_fwindows
with
| Some _ ->
state.workspaces.(state.current).ws_fwindows <-
Kutu.Layout.remove_fwindow window
state.workspaces.(state.current).ws_fwindows;
Xcb.Window.move_to_bottom state.conn window;
state.workspaces.(state.current).ws_root <-
Kutu.Layout.insert Kutu.Layout.Horizontal window
state.workspaces.(state.current).ws_root;
List.iter
(fun { Kutu.Layout.fw_window = window; fw_rect = rect } ->
Xcb.Window.reshape state.conn window rect)
(Kutu.Layout.calculate state.screen
state.workspaces.(state.current).ws_root)
| None -> print_endline "Error: window is neither tiled nor floating"
end);
self
in
Mruby.Bindings.mrb_define_method state.mrb
(Mruby.Types.Mrb_state.get_object_class state.mrb)
"toggle_float" toggle_float
(Mruby.Bindings.mrb_args_req 1)