From 70fa2016d1f54e23c80199fed262f2c19122593a Mon Sep 17 00:00:00 2001 From: Daniel Hammer Date: Sat, 29 Aug 2026 19:07:02 +0200 Subject: [PATCH] fix: make Files lists scroll with arrow keys --- kernel/src/Api/BuildNo.hpp | 2 +- .../src/desktop/apps/filemanager/events.cpp | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/kernel/src/Api/BuildNo.hpp b/kernel/src/Api/BuildNo.hpp index 2cf2840..d96709d 100644 --- a/kernel/src/Api/BuildNo.hpp +++ b/kernel/src/Api/BuildNo.hpp @@ -12,4 +12,4 @@ #pragma once -#define MONTAUK_BUILD_NUMBER 178 +#define MONTAUK_BUILD_NUMBER 179 diff --git a/programs/src/desktop/apps/filemanager/events.cpp b/programs/src/desktop/apps/filemanager/events.cpp index 404aaa1..046950f 100644 --- a/programs/src/desktop/apps/filemanager/events.cpp +++ b/programs/src/desktop/apps/filemanager/events.cpp @@ -319,6 +319,27 @@ void filemanager_on_mouse(Window* win, MouseEvent& ev) { } } +// Keep the selected row inside the visible list area so arrow-key navigation +// scrolls the view along with the selection. +static void filemanager_scroll_to_selected(Window* win, FileManagerState* fm) { + if (fm->grid_view) return; + if (fm->selected < 0 || fm->selected >= fm->entry_count) return; + + int list_y = FM_TOOLBAR_H + FM_PATHBAR_H + FM_HEADER_H; + int list_h = win->content_h - list_y; + if (list_h <= 0) return; + + int top = fm->selected * FM_ITEM_H; + int off = fm->scrollbar.scroll_offset; + if (top < off) off = top; + else if (top + FM_ITEM_H > off + list_h) off = top + FM_ITEM_H - list_h; + + int max_scroll = fm->entry_count * FM_ITEM_H - list_h; + if (off > max_scroll) off = max_scroll; + if (off < 0) off = 0; + fm->scrollbar.scroll_offset = off; +} + void filemanager_on_key(Window* win, const montauk::abi::KeyEvent& key) { FileManagerState* fm = (FileManagerState*)win->app_data; if (!fm || !key.pressed) return; @@ -455,6 +476,7 @@ void filemanager_on_key(Window* win, const montauk::abi::KeyEvent& key) { } else { if (fm->selected > 0) fm->selected--; } + filemanager_scroll_to_selected(win, fm); } else if (key.scancode == 0x50) { // Down arrow if (fm->grid_view) { @@ -465,6 +487,7 @@ void filemanager_on_key(Window* win, const montauk::abi::KeyEvent& key) { } else { if (fm->selected < fm->entry_count - 1) fm->selected++; } + filemanager_scroll_to_selected(win, fm); } else if (key.scancode == 0x4B && !key.alt && fm->grid_view) { // Left arrow (grid view only) if (fm->selected > 0) fm->selected--;