From efe14200febaec22bc6b862b22f331a46cbce908 Mon Sep 17 00:00:00 2001 From: Alexander Heldt Date: Sun, 16 Nov 2025 22:15:24 +0100 Subject: [PATCH] wip --- src/mpv/control.gleam | 4 ++++ src/mpv/mpv.gleam | 30 +++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/mpv/control.gleam b/src/mpv/control.gleam index 690beaf..9db8c55 100644 --- a/src/mpv/control.gleam +++ b/src/mpv/control.gleam @@ -10,6 +10,8 @@ import tcp/tcp.{type Socket} pub type Control { TogglePlayPause + Search + Exit } @@ -18,6 +20,7 @@ pub type ControlError { } pub fn from_key(key: Key) -> Result(Control, Nil) { + echo key case key { key.Char(char) -> char_control(char) _ -> Error(Nil) @@ -28,6 +31,7 @@ fn char_control(char: String) -> Result(Control, Nil) { case char { " " -> Ok(TogglePlayPause) "q" -> Ok(Exit) + "/" -> Ok(Search) _ -> Error(Nil) } } diff --git a/src/mpv/mpv.gleam b/src/mpv/mpv.gleam index ab8d2b1..a9ece3f 100644 --- a/src/mpv/mpv.gleam +++ b/src/mpv/mpv.gleam @@ -30,6 +30,11 @@ pub fn new(exit: Subject(Nil)) -> Result(Nil, String) { Ok(actor.Started(data:, ..)) -> { echo "waiting for input" key.start_raw_shell() + let input = process.new_subject() + process.self() + process.receive + + process.spawn(fn() { input_handler(input, data) }) process.spawn(fn() { read_input(data) }) Ok(Nil) } @@ -43,6 +48,7 @@ fn handle_message( control: Control, ) -> actor.Next(State(socket, exit), Control) { case control { + control.Search -> todo control.TogglePlayPause -> { echo "toggling play/pause" @@ -65,14 +71,32 @@ fn handle_message( } } -fn read_input(subject: Subject(Control)) -> Nil { +// TODO create new input_handler_loop that recieves on a subject and +// TODO read_input reads until a key is found, and then sends it to + +// TODO a function that can recieve on a subject, and it can receive two types of messages: +// 1. a Control message from read_input +// 2. an injected controlMessage with pre-defined buffer +// it then forwards the message to the actor subject + +fn read_input(input_handler: Subject(Control)) -> Nil { case key.read_input_until_key([]) |> control.from_key { Error(_) -> Nil - Ok(control) -> process.send(subject, control) + Ok(control) -> process.send(input_handler, control) } - read_input(subject) + read_input(input_handler) +} + +fn input_handler( + input: Subject(Control), + actor_subject: Subject(Control), +) -> Nil { + case process.receive(input, 1000) { + Error(_) -> Nil + Ok(control) -> process.send(actor_subject, control) + } }