diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 7f6c61c65..80277960f 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -2363,7 +2363,14 @@ Supported callbacks and fields are: where the above painting functions work correctly. If omitted, the screen is cleared; otherwise it should do that itself. - In order to make a see-through dialog, call ``self._native.parent:render()``. + In order to make a dialog where portions of the parent viewscreen are still + visible in the background, call ``screen:renderParent()``. + + If artifacts are left on the parent even after this function is called, such + as when the window is dragged or is resized, any code can set + ``gui.Screen.request_full_screen_refresh`` to ``true``. Then when + ``screen.renderParent()`` is next called, it will do a full flush of the + graphics and clear the screen of artifacts. * ``function screen:onIdle()`` diff --git a/library/lua/gui.lua b/library/lua/gui.lua index 1eaa9861a..31631b469 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -597,6 +597,7 @@ end Screen = defclass(Screen, View) Screen.text_input_mode = false +Screen.request_full_screen_refresh = false function Screen:postinit() self:onResize(dscreen.getWindowSize()) @@ -622,7 +623,10 @@ function Screen:renderParent() else dscreen.clear() end - df.global.gps.force_full_display_count = 1 + if Screen.request_full_screen_refresh then + df.global.gps.force_full_display_count = 1 + Screen.request_full_screen_refresh = false + end end function Screen:sendInputToParent(...) @@ -657,6 +661,8 @@ function Screen:dismiss() if self._native then dscreen.dismiss(self) end + -- don't leave artifacts behind on the parent screen when we disappear + Screen.request_full_screen_refresh = true end function Screen:onDismiss() diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index 73add1a9d..c8276750d 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -442,6 +442,9 @@ end -- if self.autoarrange_subviews is true, lay out visible subviews vertically, -- adding gaps between widgets according to self.autoarrange_gap. function Panel:postUpdateLayout() + -- don't leave artifacts behind on the parent screen when we move + gui.Screen.request_full_screen_refresh = true + if not self.autoarrange_subviews then return end local gap = self.autoarrange_gap