From 71378b0b503061557408afbafa871f60b5dbced1 Mon Sep 17 00:00:00 2001 From: NiLuJe Date: Sat, 12 Aug 2023 01:22:15 +0200 Subject: [PATCH] Startup: Move Device ctor/dtor shenanigans to the actual Device constructors and destructors No need to leak implementation details in there. --- .../modules/readeractivityindicator.lua | 2 - frontend/device/generic/device.lua | 46 +++++++++++++++++++ reader.lua | 45 ++---------------- 3 files changed, 49 insertions(+), 44 deletions(-) diff --git a/frontend/apps/reader/modules/readeractivityindicator.lua b/frontend/apps/reader/modules/readeractivityindicator.lua index 4e77c7084..6c683821d 100644 --- a/frontend/apps/reader/modules/readeractivityindicator.lua +++ b/frontend/apps/reader/modules/readeractivityindicator.lua @@ -26,8 +26,6 @@ end -- Okay, if we're here, it's basically because we're running on a Kindle on FW 5.x under KPV local EventListener = require("ui/widget/eventlistener") -local util = require("ffi/util") --- lipc ReaderActivityIndicator = EventListener:extend{ lipc_handle = nil, diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index 37fd2de1a..0a7d4e061 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -247,6 +247,42 @@ function Device:init() local rect = self.screen.getRawSize(self.screen) return Geom:new{ x = rect.x, y = rect.y, w = rect.w, h = rect.h } end + + -- DPI + local dpi_override = G_reader_settings:readSetting("screen_dpi") + if dpi_override ~= nil then + self:setScreenDPI(dpi_override) + end + + -- Night mode + self.orig_hw_nightmode = self.screen:getHWNightmode() + if G_reader_settings:isTrue("night_mode") then + self.screen:toggleNightMode() + end + + -- Ensure the proper rotation on startup. + -- We default to the rotation KOReader closed with. + -- If the rotation is not locked it will be overridden by a book or the FM when opened. + local rotation_mode = G_reader_settings:readSetting("closed_rotation_mode") + if rotation_mode and rotation_mode ~= self.screen:getRotationMode() then + self.screen:setRotationMode(rotation_mode) + end + + -- Dithering + if self:hasEinkScreen() then + self.screen:setupDithering() + if self.screen.hw_dithering and G_reader_settings:isTrue("dev_no_hw_dither") then + self.screen:toggleHWDithering(false) + end + if self.screen.sw_dithering and G_reader_settings:isTrue("dev_no_sw_dither") then + self.screen:toggleSWDithering(false) + end + -- NOTE: If device can HW dither (i.e., after setupDithering(), hw_dithering is true, but sw_dithering is false), + -- but HW dither is explicitly disabled, and SW dither enabled, don't leave SW dither disabled (i.e., re-enable sw_dithering)! + if self:canHWDither() and G_reader_settings:isTrue("dev_no_hw_dither") and G_reader_settings:nilOrFalse("dev_no_sw_dither") then + self.screen:toggleSWDithering(true) + end + end end function Device:setScreenDPI(dpi_override) @@ -498,6 +534,16 @@ function Device:toggleKeyRepeat(toggle) end prepare for application shutdown --]] function Device:exit() + -- Save any implementation-specific settings + self:saveSettings() + + -- Save current rotation (or the original rotation if ScreenSaver temporarily modified it) to remember it for next startup + G_reader_settings:saveSetting("closed_rotation_mode", self.orig_rotation_mode or self.screen:getRotationMode()) + + -- Restore initial HW inversion state + self.screen:setHWNightmode(self.orig_hw_nightmode) + + -- I/O teardown self.screen:close() require("ffi/input"):closeAll() end diff --git a/reader.lua b/reader.lua index e6903f5bb..ad369f428 100755 --- a/reader.lua +++ b/reader.lua @@ -149,38 +149,6 @@ end -- Setup device local Device = require("device") --- DPI -local dpi_override = G_reader_settings:readSetting("screen_dpi") -if dpi_override ~= nil then - Device:setScreenDPI(dpi_override) -end --- Night mode -local hw_nightmode = Device.screen:getHWNightmode() -if G_reader_settings:isTrue("night_mode") then - Device.screen:toggleNightMode() -end --- Ensure the proper rotation on startup. --- We default to the rotation KOReader closed with. --- If the rotation is not locked it will be overridden by a book or the FM when opened. -local rotation_mode = G_reader_settings:readSetting("closed_rotation_mode") -if rotation_mode and rotation_mode ~= Device.screen:getRotationMode() then - Device.screen:setRotationMode(rotation_mode) -end --- Dithering -if Device:hasEinkScreen() then - Device.screen:setupDithering() - if Device.screen.hw_dithering and G_reader_settings:isTrue("dev_no_hw_dither") then - Device.screen:toggleHWDithering(false) - end - if Device.screen.sw_dithering and G_reader_settings:isTrue("dev_no_sw_dither") then - Device.screen:toggleSWDithering(false) - end - -- NOTE: If device can HW dither (i.e., after setupDithering(), hw_dithering is true, but sw_dithering is false), - -- but HW dither is explicitly disabled, and SW dither enabled, don't leave SW dither disabled (i.e., re-enable sw_dithering)! - if Device:canHWDither() and G_reader_settings:isTrue("dev_no_hw_dither") and G_reader_settings:nilOrFalse("dev_no_sw_dither") then - Device.screen:toggleSWDithering(true) - end -end -- Document renderers canvas local CanvasContext = require("document/canvascontext") @@ -324,19 +292,12 @@ end -- Exit local function exitReader() - -- Save any device settings before closing G_reader_settings - Device:saveSettings() - - -- Save current rotation (or the original rotation if ScreenSaver temporarily modified it) to remember it for next startup - G_reader_settings:saveSetting("closed_rotation_mode", Device.orig_rotation_mode or Device.screen:getRotationMode()) - G_reader_settings:close() - - -- Restore initial inversion state - Device.screen:setHWNightmode(hw_nightmode) - -- Shutdown hardware abstraction Device:exit() + -- Flush settings to disk + G_reader_settings:close() + if Profiler then Profiler.stop() end if type(exit_code) == "number" then