diff --git a/src/client.cc b/src/client.cc index 2e371e0f..b4531949 100644 --- a/src/client.cc +++ b/src/client.cc @@ -73,6 +73,8 @@ void Client::handle_available_input(EventMode mode) context().hooks().run_hook("FocusIn", context().name(), context()); else if (*key == Key::FocusOut) context().hooks().run_hook("FocusOut", context().name(), context()); + else if (key->modifiers == Key::Modifiers::Resize) + force_redraw(); else m_input_handler.handle_key(*key); } diff --git a/src/input_handler.cc b/src/input_handler.cc index 8ef17af9..4fd118b2 100644 --- a/src/input_handler.cc +++ b/src/input_handler.cc @@ -78,7 +78,7 @@ struct MouseHandler { case Key::Modifiers::MousePress: m_dragging = true; - m_anchor = context.window().buffer_coord(key.mouse_coord()); + m_anchor = context.window().buffer_coord(key.coord()); context.selections_write_only() = SelectionList{ buffer, m_anchor }; return true; @@ -86,7 +86,7 @@ struct MouseHandler if (not m_dragging) return true; m_dragging = false; - cursor = context.window().buffer_coord(key.mouse_coord()); + cursor = context.window().buffer_coord(key.coord()); context.selections_write_only() = SelectionList{ buffer, Selection{buffer.clamp(m_anchor), cursor} }; return true; @@ -94,7 +94,7 @@ struct MouseHandler case Key::Modifiers::MousePos: if (not m_dragging) return true; - cursor = context.window().buffer_coord(key.mouse_coord()); + cursor = context.window().buffer_coord(key.coord()); context.selections_write_only() = SelectionList{ buffer, Selection{buffer.clamp(m_anchor), cursor} }; return true; diff --git a/src/keys.hh b/src/keys.hh index 6aa5eb4e..f085effe 100644 --- a/src/keys.hh +++ b/src/keys.hh @@ -27,6 +27,8 @@ struct Key MouseWheelUp = 1 << 6, MouseEvent = MousePress | MouseRelease | MousePos | MouseWheelDown | MouseWheelUp, + + Resize = 1 << 7, }; enum NamedKey : Codepoint { @@ -75,7 +77,7 @@ struct Key constexpr bool operator!=(Key other) const { return val() != other.val(); } constexpr bool operator<(Key other) const { return val() < other.val(); } - constexpr CharCoord mouse_coord() const { return {(int)((key & 0xFFFF0000) >> 16), (int)(key & 0x0000FFFF)}; } + constexpr CharCoord coord() const { return {(int)((key & 0xFFFF0000) >> 16), (int)(key & 0x0000FFFF)}; } Optional codepoint() const; }; @@ -94,13 +96,15 @@ constexpr Key alt(Codepoint key) { return { Key::Modifiers::Alt, key }; } constexpr Key ctrl(Codepoint key) { return { Key::Modifiers::Control, key }; } constexpr Key ctrlalt(Codepoint key) { return { Key::Modifiers::ControlAlt, key }; } -constexpr Codepoint encode_mouse_coord(CharCoord coord) { return (Codepoint)(((int)coord.line << 16) | ((int)coord.column & 0x0000FFFF)); } +constexpr Codepoint encode_coord(CharCoord coord) { return (Codepoint)(((int)coord.line << 16) | ((int)coord.column & 0x0000FFFF)); } -constexpr Key mouse_press(CharCoord pos) { return { Key::Modifiers::MousePress, encode_mouse_coord(pos) }; } -constexpr Key mouse_release(CharCoord pos) { return { Key::Modifiers::MouseRelease, encode_mouse_coord(pos) }; } -constexpr Key mouse_pos(CharCoord pos) { return { Key::Modifiers::MousePos, encode_mouse_coord(pos) }; } -constexpr Key mouse_wheel_down(CharCoord pos) { return { Key::Modifiers::MouseWheelDown, encode_mouse_coord(pos) }; } -constexpr Key mouse_wheel_up(CharCoord pos) { return { Key::Modifiers::MouseWheelUp, encode_mouse_coord(pos) }; } +constexpr Key mouse_press(CharCoord pos) { return { Key::Modifiers::MousePress, encode_coord(pos) }; } +constexpr Key mouse_release(CharCoord pos) { return { Key::Modifiers::MouseRelease, encode_coord(pos) }; } +constexpr Key mouse_pos(CharCoord pos) { return { Key::Modifiers::MousePos, encode_coord(pos) }; } +constexpr Key mouse_wheel_down(CharCoord pos) { return { Key::Modifiers::MouseWheelDown, encode_coord(pos) }; } +constexpr Key mouse_wheel_up(CharCoord pos) { return { Key::Modifiers::MouseWheelUp, encode_coord(pos) }; } + +constexpr Key resize(CharCoord dim) { return { Key::Modifiers::Resize, encode_coord(dim) }; } inline size_t hash_value(const Key& key) { return hash_values(key.modifiers, key.key); } diff --git a/src/ncurses_ui.cc b/src/ncurses_ui.cc index 9439ff81..49d523ed 100644 --- a/src/ncurses_ui.cc +++ b/src/ncurses_ui.cc @@ -542,6 +542,7 @@ Key NCursesUI::get_key() case KEY_HOME: return Key::Home; case KEY_END: return Key::End; case KEY_BTAB: return Key::BackTab; + case KEY_RESIZE: return resize(m_dimensions); } for (int i = 0; i < 12; ++i) diff --git a/src/remote.cc b/src/remote.cc index f24e83ce..45f2647a 100644 --- a/src/remote.cc +++ b/src/remote.cc @@ -401,11 +401,8 @@ Key RemoteUI::get_key() try { Key key = read(m_socket_watcher.fd()); - if (key.modifiers == resize_modifier) - { - m_dimensions = { (int)(key.key >> 16), (int)(key.key & 0xFFFF) }; - return Key::Invalid; - } + if (key.modifiers == Key::Modifiers::Resize) + m_dimensions = key.coord(); return key; } catch (peer_disconnected&) @@ -449,7 +446,7 @@ static int connect_to(StringView session) RemoteClient::RemoteClient(StringView session, std::unique_ptr&& ui, const EnvVarMap& env_vars, StringView init_command) - : m_ui(std::move(ui)), m_dimensions(m_ui->dimensions()) + : m_ui(std::move(ui)) { int sock = connect_to(session); @@ -458,10 +455,6 @@ RemoteClient::RemoteClient(StringView session, std::unique_ptr&& msg.write(init_command.data(), (int)init_command.length()); msg.write((char)0); msg.write(env_vars); - - Key key{ resize_modifier, Codepoint(((int)m_dimensions.line << 16) | - (int)m_dimensions.column) }; - msg.write(key); } m_ui->set_input_callback([this](EventMode){ write_next_key(); }); @@ -548,15 +541,6 @@ void RemoteClient::write_next_key() // do that before checking dimensions as get_key may // handle a resize event. msg.write(m_ui->get_key()); - - CharCoord dimensions = m_ui->dimensions(); - if (dimensions != m_dimensions) - { - m_dimensions = dimensions; - Key key{ resize_modifier, Codepoint(((int)dimensions.line << 16) | - (int)dimensions.column) }; - msg.write(key); - } } void send_command(StringView session, StringView command) diff --git a/src/remote.hh b/src/remote.hh index 60d61619..3671521c 100644 --- a/src/remote.hh +++ b/src/remote.hh @@ -38,7 +38,6 @@ private: std::unique_ptr m_ui; std::unique_ptr m_socket_watcher; - CharCoord m_dimensions; }; void send_command(StringView session, StringView command);