From 71d921b5a77738b03886fbba65a46be4e4c0f42f Mon Sep 17 00:00:00 2001 From: Alistair-Afton Date: Wed, 16 Sep 2026 03:23:23 +0200 Subject: [PATCH 1/2] overlays: don't steal keys while renaming a building The pressure plate, gear assembly, track stop, and roller overlays consumed their hotkeys even while the building nickname field was open, so typing characters like x, r, or v changed settings instead of entering text. Skip input handling while view_sheets.building_entering_nickname is set, matching the guard already used by the orders skill restriction overlay. Fixes DFHack/dfhack#5764 --- changelog.txt | 1 + machine-toggle.lua | 16 ++++++++++++++++ trackstop.lua | 16 ++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/changelog.txt b/changelog.txt index 1ed30ae50..6616402e5 100644 --- a/changelog.txt +++ b/changelog.txt @@ -36,6 +36,7 @@ Template for new versions: - `bodyswap`: fix "invalid argument count" when the target unit has no nemesis record - `fix/loyaltycascade`: guard against citizens that are not historical figures and emit a warning. - `gui/siegemanager`: fix nil index if there are no siege engines on the map +- `machine-toggle`/`trackstop`: overlays no longer steal keys while renaming a pressure plate, gear assembly, track stop, or roller ## Misc Improvements - `caravan`: the ``Bring goods to depot``, ``Trade``, and ``Assign items for display`` overlays now allow searching for items with non-ASCII characters in their description diff --git a/machine-toggle.lua b/machine-toggle.lua index e380711b3..322df082c 100644 --- a/machine-toggle.lua +++ b/machine-toggle.lua @@ -11,6 +11,10 @@ local overlay = require('plugins.overlay') local getBuild = dfhack.gui.getSelectedBuilding +local function isRenaming() + return df.global.game.main_interface.view_sheets.building_entering_nickname +end + local FLUID_DEPTHS = {} for i=1,8 do -- 0 to 7 FLUID_DEPTHS[i] = {value=i-1, label=tostring(i-1)} @@ -40,6 +44,12 @@ PlateOverlay.ATTRS{ frame_background=gui.CLEAR_PEN, } +function PlateOverlay:onInput(keys) + if not isRenaming() then + return PlateOverlay.super.onInput(self, keys) + end +end + local function clamp(value, low, high) return math.min(high, math.max(low, value)) end @@ -353,6 +363,12 @@ GearOverlay.ATTRS{ frame_background=gui.CLEAR_PEN, } +function GearOverlay:onInput(keys) + if not isRenaming() then + return GearOverlay.super.onInput(self, keys) + end +end + function GearOverlay:render(dc) self.subviews.gear_toggle:setOption(not getBuild().gear_flags.disengaged) GearOverlay.super.render(self, dc) diff --git a/trackstop.lua b/trackstop.lua index 46ba6cdb2..29e40ea9f 100644 --- a/trackstop.lua +++ b/trackstop.lua @@ -12,6 +12,10 @@ local utils = require('utils') local getBuild = dfhack.gui.getSelectedBuilding +local function isRenaming() + return df.global.game.main_interface.view_sheets.building_entering_nickname +end + local NORTH = 'North '..string.char(24) local EAST = 'East '..string.char(26) local SOUTH = 'South '..string.char(25) @@ -63,6 +67,12 @@ TrackStopOverlay.ATTRS{ frame_background=gui.CLEAR_PEN, } +function TrackStopOverlay:onInput(keys) + if not isRenaming() then + return TrackStopOverlay.super.onInput(self, keys) + end +end + function TrackStopOverlay:setFriction(friction) getBuild().track_stop_info.friction = FRICTION_MAP[friction] end @@ -166,6 +176,12 @@ RollerOverlay.ATTRS{ frame_background=gui.CLEAR_PEN, } +function RollerOverlay:onInput(keys) + if not isRenaming() then + return RollerOverlay.super.onInput(self, keys) + end +end + function RollerOverlay:setDirection(direction) getBuild().direction = DIRECTION_MAP[direction] end From 09db656275665ba05bdc7189f0c5398c93e9bd08 Mon Sep 17 00:00:00 2001 From: Alistair-Afton Date: Wed, 16 Sep 2026 15:36:48 +0200 Subject: [PATCH 2/2] overlays: inline the view_sheets lookup per review Suggested by Bumber64: bind df.global.game.main_interface.view_sheets once and check building_entering_nickname directly instead of a wrapper function. --- machine-toggle.lua | 8 +++----- trackstop.lua | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/machine-toggle.lua b/machine-toggle.lua index 322df082c..56123579f 100644 --- a/machine-toggle.lua +++ b/machine-toggle.lua @@ -11,9 +11,7 @@ local overlay = require('plugins.overlay') local getBuild = dfhack.gui.getSelectedBuilding -local function isRenaming() - return df.global.game.main_interface.view_sheets.building_entering_nickname -end +local vs = df.global.game.main_interface.view_sheets local FLUID_DEPTHS = {} for i=1,8 do -- 0 to 7 @@ -45,7 +43,7 @@ PlateOverlay.ATTRS{ } function PlateOverlay:onInput(keys) - if not isRenaming() then + if not vs.building_entering_nickname then return PlateOverlay.super.onInput(self, keys) end end @@ -364,7 +362,7 @@ GearOverlay.ATTRS{ } function GearOverlay:onInput(keys) - if not isRenaming() then + if not vs.building_entering_nickname then return GearOverlay.super.onInput(self, keys) end end diff --git a/trackstop.lua b/trackstop.lua index 29e40ea9f..50984ff9d 100644 --- a/trackstop.lua +++ b/trackstop.lua @@ -12,9 +12,7 @@ local utils = require('utils') local getBuild = dfhack.gui.getSelectedBuilding -local function isRenaming() - return df.global.game.main_interface.view_sheets.building_entering_nickname -end +local vs = df.global.game.main_interface.view_sheets local NORTH = 'North '..string.char(24) local EAST = 'East '..string.char(26) @@ -68,7 +66,7 @@ TrackStopOverlay.ATTRS{ } function TrackStopOverlay:onInput(keys) - if not isRenaming() then + if not vs.building_entering_nickname then return TrackStopOverlay.super.onInput(self, keys) end end @@ -177,7 +175,7 @@ RollerOverlay.ATTRS{ } function RollerOverlay:onInput(keys) - if not isRenaming() then + if not vs.building_entering_nickname then return RollerOverlay.super.onInput(self, keys) end end