diff --git a/src/mpv/control.gleam b/src/mpv/control.gleam index ad5b38d..5298ae6 100644 --- a/src/mpv/control.gleam +++ b/src/mpv/control.gleam @@ -1,14 +1,18 @@ +import gleam/io import gleam/json import gleam/result import gleam/string import mpv/internal/control as internal_control -import mpv/key.{type Key, Char} +import mpv/key.{type Key} import tcp/reason.{type Reason} import tcp/tcp.{type Socket} pub type Control { TogglePlayPause + + ClearScreen + Exit } @@ -18,12 +22,14 @@ pub type ControlError { pub fn from_key(key: Key) -> Result(Control, Nil) { case key { - Char(char) -> char_control(char) + key.Command("clear_screen") -> Ok(ClearScreen) + key.Char(char) -> char_control(char) _ -> Error(Nil) } } fn char_control(char: String) -> Result(Control, Nil) { + echo "char: " <> char case char { " " -> Ok(TogglePlayPause) "q" -> Ok(Exit) @@ -65,6 +71,10 @@ pub fn get_playback_time(socket: Socket) -> Result(PlaybackTime, ControlError) { } } +pub fn clear_screen() -> Nil { + io.print("\u{001B}[2J\u{001B}[H") +} + fn send_command(socket: Socket, command: json.Json) -> Result(String, Reason) { result.try(tcp.send(socket, json.to_string(command) <> "\n"), fn(_) { let timeout_ms = 10_000 diff --git a/src/mpv/key.gleam b/src/mpv/key.gleam index 9ef4a1b..97deff5 100644 --- a/src/mpv/key.gleam +++ b/src/mpv/key.gleam @@ -1,17 +1,18 @@ import gleam/erlang/atom import gleam/list - +import gleam/string import mpv/internal/key as internal_key pub type Key { Char(String) + Command(String) Left Right Up Down - Continue + Continue(buffer: List(String)) Unknown } @@ -20,19 +21,37 @@ pub const esc = "\u{001B}" // control sequence introducer pub const csi = "[" +const command_init = "|" + pub fn from_list(l: List(String)) -> Key { + echo "l: " <> string.inspect(l) case l { [e, c, "D"] if e == esc && c == csi -> Left [e, c, "C"] if e == esc && c == csi -> Right [e, c, "A"] if e == esc && c == csi -> Up [e, c, "B"] if e == esc && c == csi -> Down - [e, c] if e == esc && c == csi -> Continue + [e, c] if e == esc && c == csi -> Continue([]) + [e] if e == esc -> Continue([]) + + [ci] | [ci, _] if ci == command_init -> Continue(l) + [ci, cmd, tail] if ci == command_init -> { + echo "three: " <> string.inspect(l) + case tail == "\r" { + True -> { + echo "found command :" <> cmd + Command(cmd) + } + False -> { + echo "joining mid with tail. mid :" <> cmd <> ", tail: " <> tail + Continue([ci, cmd <> tail]) + } + } + } - [e] if e == esc -> Continue [char] -> Char(char) - [] -> Continue + [] -> Continue([]) _ -> Unknown } } @@ -44,10 +63,13 @@ pub fn start_raw_shell() { } pub fn read_input_until_key(l: List(String)) -> Key { - let l = internal_key.read_input() |> list.wrap |> list.append(l, _) - - case from_list(l) { - Continue -> read_input_until_key(l) + case + internal_key.read_input() + |> list.wrap + |> list.append(l, _) + |> from_list + { + Continue(ll) -> read_input_until_key(ll) k -> k } } diff --git a/src/mpv/mpv.gleam b/src/mpv/mpv.gleam index e433703..c5edcdd 100644 --- a/src/mpv/mpv.gleam +++ b/src/mpv/mpv.gleam @@ -1,5 +1,6 @@ import gleam/erlang/process.{type Subject} import gleam/float +import gleam/io import gleam/otp/actor import gleam/result import gleam/string @@ -43,6 +44,10 @@ fn handle_message( control: Control, ) -> actor.Next(State(socket, exit), Control) { case control { + control.ClearScreen -> { + control.clear_screen() + actor.continue(state) + } control.TogglePlayPause -> { echo "toggling play/pause" diff --git a/test/mpv/key_test.gleam b/test/mpv/key_test.gleam index c291d88..5d8d01b 100644 --- a/test/mpv/key_test.gleam +++ b/test/mpv/key_test.gleam @@ -18,9 +18,9 @@ pub fn key_from_list_test() { TestCase([esc, csi, "C"], key.Right), TestCase([esc, csi, "A"], key.Up), TestCase([esc, csi, "B"], key.Down), - TestCase([esc, csi], key.Continue), - TestCase([esc], key.Continue), - TestCase([], key.Continue), + TestCase([esc, csi], key.Continue([])), + TestCase([esc], key.Continue([])), + TestCase([], key.Continue([])), ] list.each(test_cases, fn(tc) {