summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2024-08-14 21:09:53 +1000
committerMaxime Coste <mawww@kakoune.org>2024-08-14 21:09:53 +1000
commitb7c014ba4fd1ef4aa309eb7c89f49db2deba630b (patch)
tree148965bca9ea353a101c56e020260d0a3506ae6b /src
parenta0a000951e5569fc9af309dc329b759fe6e1d2e8 (diff)
parent0fddb3fef8b668582c4b1246e0fb6fb1da0c6af7 (diff)
Merge remote-tracking branch 'enricozb/enricozb/scroll-coordinates'
Diffstat (limited to 'src')
-rw-r--r--src/input_handler.cc7
-rw-r--r--src/keys.cc2
-rw-r--r--src/keys.hh3
-rw-r--r--src/terminal_ui.cc9
4 files changed, 12 insertions, 9 deletions
diff --git a/src/input_handler.cc b/src/input_handler.cc
index 615dbf10..8ab88f20 100644
--- a/src/input_handler.cc
+++ b/src/input_handler.cc
@@ -118,7 +118,10 @@ struct MouseHandler
Buffer& buffer = context.buffer();
BufferCoord cursor;
- constexpr auto modifiers = Key::Modifiers::Control | Key::Modifiers::Alt | Key::Modifiers::Shift | Key::Modifiers::MouseButtonMask;
+ // bits above these potentially store additional information
+ constexpr auto mask = (Key::Modifiers) 0x7FF;
+ constexpr auto modifiers = Key::Modifiers::Control | Key::Modifiers::Alt | Key::Modifiers::Shift | Key::Modifiers::MouseButtonMask | ~mask;
+
switch ((key.modifiers & ~modifiers).value)
{
case Key::Modifiers::MousePress:
@@ -184,7 +187,7 @@ struct MouseHandler
}
case Key::Modifiers::Scroll:
- scroll_window(context, static_cast<int32_t>(key.key), m_dragging ? OnHiddenCursor::MoveCursor : OnHiddenCursor::PreserveSelections);
+ scroll_window(context, key.scroll_amount(), m_dragging ? OnHiddenCursor::MoveCursor : OnHiddenCursor::PreserveSelections);
return true;
default: return false;
diff --git a/src/keys.cc b/src/keys.cc
index 4a14e0fc..30aeaca7 100644
--- a/src/keys.cc
+++ b/src/keys.cc
@@ -197,7 +197,7 @@ String to_string(Key key)
else if (key.modifiers & Key::Modifiers::MouseRelease)
res = format("mouse:release:{}:{}.{}", key.mouse_button(), coord.line, coord.column);
else if (key.modifiers & Key::Modifiers::Scroll)
- res = format("scroll:{}", static_cast<int>(key.key));
+ res = format("scroll:{}:{}.{}", key.scroll_amount(), coord.line, coord.column);
else if (key.modifiers & Key::Modifiers::Resize)
res = format("resize:{}.{}", coord.line, coord.column);
else
diff --git a/src/keys.hh b/src/keys.hh
index ccafe336..3c5d7f4b 100644
--- a/src/keys.hh
+++ b/src/keys.hh
@@ -89,8 +89,9 @@ struct Key
constexpr bool operator==(Key other) const { return val() == other.val(); }
constexpr auto operator<=>(Key other) const { return val() <=> other.val(); }
- constexpr DisplayCoord coord() const { return {(int)((key & 0xFFFF0000) >> 16), (int)(key & 0x0000FFFF)}; }
+ constexpr DisplayCoord coord() const { return {(int)((int32_t) (key & 0xFFFF0000) >> 16), (int)(key & 0x0000FFFF)}; }
constexpr MouseButton mouse_button() { return MouseButton{((int)modifiers & (int)Modifiers::MouseButtonMask) >> 6}; }
+ constexpr int scroll_amount() { return (int32_t)modifiers >> 16; }
static Modifiers to_modifier(MouseButton button) { return Key::Modifiers{((int)button << 6) & (int)Modifiers::MouseButtonMask}; }
Optional<Codepoint> codepoint() const;
diff --git a/src/terminal_ui.cc b/src/terminal_ui.cc
index ab3e6378..1ece515b 100644
--- a/src/terminal_ui.cc
+++ b/src/terminal_ui.cc
@@ -798,9 +798,8 @@ Optional<Key> TerminalUI::get_next_key()
return Key{mod | Key::to_modifier(button), coord};
};
- auto mouse_scroll = [this](Key::Modifiers mod, bool down) -> Key {
- return {mod | Key::Modifiers::Scroll,
- (Codepoint)((down ? 1 : -1) * m_wheel_scroll_amount)};
+ auto mouse_scroll = [this](Key::Modifiers mod, Codepoint coord, bool down) -> Key {
+ return {mod | Key::Modifiers::Scroll | (Key::Modifiers)((down ? m_wheel_scroll_amount : -1 * m_wheel_scroll_amount) << 16), coord};
};
auto masked_key = [&](Codepoint key, Codepoint shifted_key = 0) {
@@ -921,8 +920,8 @@ Optional<Key> TerminalUI::get_next_key()
else if (int guess = ffs(m_mouse_state) - 1; 0 <= guess and guess < 3)
return mouse_button(mod, Key::MouseButton{guess}, coord, true);
break;
- case 64: return mouse_scroll(mod, false);
- case 65: return mouse_scroll(mod, true);
+ case 64: return mouse_scroll(mod, coord, false);
+ case 65: return mouse_scroll(mod, coord, true);
}
return Key{Key::Modifiers::MousePos, coord};
}