From d3374e7e5f7af9f4fdf33200f91847b3cddf9e67 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Sun, 28 Jun 2020 19:48:55 +1000 Subject: Refactor mouse press/release handling to support 3 buttons Change button to be an additional parameter instead of having separate events for left/right buttons. Fixes #3471 --- src/json_ui.cc | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) (limited to 'src/json_ui.cc') diff --git a/src/json_ui.cc b/src/json_ui.cc index b4c6528c..007c8ab0 100644 --- a/src/json_ui.cc +++ b/src/json_ui.cc @@ -248,31 +248,30 @@ void JsonUI::eval_json(const Value& json) m_on_key(key); } } - else if (method == "mouse") + else if (method == "mouse_move") + { + if (params.size() != 2) + throw invalid_rpc_request("mouse coordinates not specified"); + + if (not params[0].is_a() or not params[1].is_a()) + throw invalid_rpc_request("mouse coordinates are not integers"); + + m_on_key({Key::Modifiers::MousePos, encode_coord({params[0].as(), params[1].as()})}); + } + else if (method == "mouse_press" or method == "mouse_release") { if (params.size() != 3) - throw invalid_rpc_request("mouse type/coordinates not specified"); + throw invalid_rpc_request("mouse button/coordinates not specified"); if (not params[0].is_a()) - throw invalid_rpc_request("mouse type is not a string"); - else if (not params[1].is_a() or - not params[2].is_a()) + throw invalid_rpc_request("mouse button is not a string"); + if (not params[1].is_a() or not params[2].is_a()) throw invalid_rpc_request("mouse coordinates are not integers"); - const StringView type = params[0].as(); - const Codepoint coord = encode_coord({params[1].as(), params[2].as()}); - if (type == "move") - m_on_key({Key::Modifiers::MousePos, coord}); - else if (type == "press_left") - m_on_key({Key::Modifiers::MousePressLeft, coord}); - else if (type == "press_right") - m_on_key({Key::Modifiers::MousePressRight, coord}); - else if (type == "release_left") - m_on_key({Key::Modifiers::MouseReleaseLeft, coord}); - else if (type == "release_right") - m_on_key({Key::Modifiers::MouseReleaseRight, coord}); - else - throw invalid_rpc_request(format("invalid mouse event type: {}", type)); + auto event = method == "mouse_press" ? Key::Modifiers::MousePress : Key::Modifiers::MouseRelease; + auto button = str_to_button(params[0].as()); + + m_on_key({event | Key::to_modifier(button), encode_coord({params[1].as(), params[2].as()})}); } else if (method == "scroll") { -- cgit v1.2.3