Skip to content

Commit 69fb409

Browse files
authored
Merge pull request #304 from BinaryNoggin/check-for-input-callback
Warns missing `handle_input/3` on `request_input/2`
2 parents aa51267 + 46d9bbc commit 69fb409

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

lib/scenic/scene.ex

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,10 @@ defmodule Scenic.Scene do
722722
def request_input(scene, input_class)
723723
def request_input(scene, input) when is_atom(input), do: request_input(scene, [input])
724724

725-
def request_input(%Scene{viewport: vp, pid: pid}, inputs) when is_list(inputs) do
725+
def request_input(%Scene{viewport: vp, pid: pid, module: module}, inputs) when is_list(inputs) do
726+
unless Kernel.function_exported?(module, :handle_input, 3) do
727+
Logger.warn("Requesting input for #{inspect inputs} - #{module}.handle_input/3 not implemented")
728+
end
726729
ViewPort.Input.request(vp, inputs, pid: pid)
727730
end
728731

test/scenic/scene_test.exs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ defmodule Scenic.SceneTest do
1313
alias Scenic.Script
1414
import Scenic.Components
1515

16+
import ExUnit.CaptureLog
17+
1618
@root_id ViewPort.root_id()
1719

1820
# import IEx
@@ -68,6 +70,23 @@ defmodule Scenic.SceneTest do
6870
scene = assign(scene, pid: pid)
6971
{:ok, scene}
7072
end
73+
74+
@impl Scenic.Scene
75+
def handle_input(input, id, %{assigns: %{pid: pid}} = scene) do
76+
send(pid, {:input_test, input, id})
77+
{:noreply, scene}
78+
end
79+
end
80+
81+
defmodule TestSceneNoInputHandler do
82+
use Scenic.Scene
83+
84+
@impl Scenic.Scene
85+
def init(scene, pid, _opts) do
86+
Process.send(pid, {:up, scene}, [])
87+
scene = assign(scene, pid: pid)
88+
{:ok, scene}
89+
end
7190
end
7291

7392
@codepoint {:codepoint, {"k", []}}
@@ -402,6 +421,20 @@ defmodule Scenic.SceneTest do
402421
~> {:ok, sorted_list([:cursor_pos, :cursor_button, :codepoint])}
403422
end
404423

424+
test "request_input warns when handle_input is not implements" do
425+
Scenic.Test.ViewPort.start({TestSceneNoInputHandler, self()})
426+
427+
scene =
428+
receive do
429+
{:up, scene} -> scene
430+
end
431+
432+
assert capture_log(fn ->
433+
Scenic.Scene.request_input(scene, [:key])
434+
end)
435+
=~ "handle_input/3 not implemented"
436+
end
437+
405438
test "unrequest_input works", %{scene: scene} do
406439
Scenic.Scene.request_input(scene, :cursor_button)
407440

test/scenic/view_port/input_test.exs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ defmodule Scenic.ViewPort.InputTest do
2727
# def handle_input( input, %{assigns: %{pid: pid}} = scene ) do
2828
# Process.send( pid, {:test_input, input}, [] )
2929
# end
30+
31+
def handle_input(_, _, scene) do
32+
{:noreply, scene}
33+
end
3034
end
3135

3236
setup do

0 commit comments

Comments
 (0)