From 5192106730372b541608fe4d65a723924f7db755 Mon Sep 17 00:00:00 2001 From: mleo2003 Date: Thu, 13 Aug 2026 18:14:28 -0700 Subject: [PATCH] launcher: pad cursor edge-scroll for stickless handhelds The launcher's SHORT-WINDOW SCROLL engages correctly on a 480px-tall panel, but _pageScroll has only three inputs -- mouse wheel, touch drag, and the right analog stick -- and a device with none of them cannot reach anything below the fold. On an RG35XXSP (muOS, 640x480) /proc/bus/input/devices lists one gpio-keys-polled device reporting the D-pad as a hat: no analog axes exist. There is also no scroll-to-focus anywhere, so moving the pad cursor never touches _pageScroll. The pad cursor already computes the motion: it is clamped to the safe area and discarded. Spend that overshoot on the existing wheel path instead -- the same one the right stick feeds a few lines below. Only the overshoot scrolls, so parking the cursor at the edge does nothing; it has to be actively pushed. The enclosing block runs only on non-zero pad input, so a real mouse never reaches it and desktop behaviour is unchanged. Tested on an RG35XXSP at stock Kit.lua scale (0.9): the pager and footer become reachable, pushing up at the top scrolls back, and parking at the edge does nothing. Refs #1142. --- src/import/RomImporter.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/import/RomImporter.lua b/src/import/RomImporter.lua index 24e894ef..198a614b 100644 --- a/src/import/RomImporter.lua +++ b/src/import/RomImporter.lua @@ -2345,6 +2345,20 @@ function RomImporter:_updatePadCursor(dt) local ny = self._padCursor.y + dy * speed * dt self._padCursor.x = math.max(ox, math.min(ox + w, nx)) self._padCursor.y = math.max(oy, math.min(oy + h, ny)) + -- Pushing INTO the top/bottom edge scrolls the page instead of stalling. + -- The cursor is clamped to the safe area above, so on a short window the + -- rows below the fold are unreachable on a stickless handheld: no mouse + -- wheel, no touchscreen, and no right stick to feed the existing wheel + -- path. Only the OVERSHOOT scrolls -- parking the cursor at the edge does + -- nothing, it has to be actively pushed -- and this block only runs on pad + -- input, so a real mouse is unaffected. /48 matches the pixels-per-notch + -- LauncherView.draw multiplies back out. + local overY = 0 + if ny > oy + h then overY = ny - (oy + h) + elseif ny < oy then overY = ny - oy end + if overY ~= 0 and self._flex then + require("src.import.LauncherView").wheelmoved(self, 0, -overY / 48) + end -- Desktop: FlexLove polls the real mouse, so warp it with the pad pointer. -- NX: the getPosition bridge already returns pad coords — skip setPosition. if not self.isNX and love.mouse.setPosition then