Skip to content

Commit b5d3305

Browse files
authored
A few e-Ink flash rate QoL tweaks (koreader#6528)
* Add an option to *always* flash on chapter boundaries * Optionally, in flash on chapter boundaries mode, also flash on the *second* page of a chapter. (There's often a large river at the top of the page on a chapter's first page) * In CRe, request a flashing update when there is significant image content on the page. * Register all refresh rate related options in Dispatcher, making them available in Gestures & Profiles.
1 parent 1b904f0 commit b5d3305

File tree

6 files changed

+136
-21
lines changed

6 files changed

+136
-21
lines changed

frontend/apps/reader/modules/readertoc.lua

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,16 @@ end
6060

6161
function ReaderToc:onPageUpdate(pageno)
6262
self.pageno = pageno
63-
if UIManager.FULL_REFRESH_COUNT == -1 then
63+
if UIManager.FULL_REFRESH_COUNT == -1 or G_reader_settings:isTrue("refresh_on_chapter_boundaries") then
64+
local flash_on_second = G_reader_settings:nilOrFalse("no_refresh_on_second_chapter_page")
6465
if self:isChapterEnd(pageno, 0) then
6566
self.chapter_refresh = true
66-
elseif self:isChapterBegin(pageno, 0) and self.chapter_refresh then
67+
elseif self.chapter_refresh and self:isChapterStart(pageno, 0) then
68+
UIManager:setDirty(nil, "full")
69+
if not flash_on_second then
70+
self.chapter_refresh = false
71+
end
72+
elseif self.chapter_refresh and self:isChapterSecondPage(pageno, 0) then
6773
UIManager:setDirty(nil, "full")
6874
self.chapter_refresh = false
6975
else
@@ -356,21 +362,33 @@ function ReaderToc:getPreviousChapter(cur_pageno, level)
356362
return previous_chapter
357363
end
358364

359-
function ReaderToc:isChapterBegin(cur_pageno, level)
365+
function ReaderToc:isChapterStart(cur_pageno, level)
360366
local ticks = self:getTocTicks(level)
361-
local _begin = false
367+
local _start = false
362368
for i = 1, #ticks do
363369
if ticks[i] == cur_pageno then
364-
_begin = true
370+
_start = true
371+
break
372+
end
373+
end
374+
return _start
375+
end
376+
377+
function ReaderToc:isChapterSecondPage(cur_pageno, level)
378+
local ticks = self:getTocTicks(level)
379+
local _second = false
380+
for i = 1, #ticks do
381+
if ticks[i] + 1 == cur_pageno then
382+
_second = true
365383
break
366384
end
367385
end
368-
return _begin
386+
return _second
369387
end
370388

371389
function ReaderToc:isChapterEnd(cur_pageno, level)
372390
local ticks = self:getTocTicks(level)
373-
local _end= false
391+
local _end = false
374392
for i = 1, #ticks do
375393
if ticks[i] - 1 == cur_pageno then
376394
_end = true
@@ -390,7 +408,7 @@ function ReaderToc:getChapterPagesLeft(pageno, level)
390408
end
391409

392410
function ReaderToc:getChapterPagesDone(pageno, level)
393-
if self:isChapterBegin(pageno, level) then return 0 end
411+
if self:isChapterStart(pageno, level) then return 0 end
394412
local previous_chapter = self:getPreviousChapter(pageno, level)
395413
if previous_chapter then
396414
previous_chapter = pageno - previous_chapter

frontend/apps/reader/modules/readerview.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ function ReaderView:paintTo(bb, x, y)
223223
-- With some nil guards because this may not be implemented in every engine ;).
224224
if img_count and img_count > 0 and img_coverage and img_coverage >= 0.075 then
225225
self.dialog.dithered = true
226+
-- Request a flashing update while we're at it
227+
UIManager:setDirty(nil, "full")
226228
end
227229
end
228230
end

frontend/device/devicelistener.lua

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,18 @@ local T = require("ffi/util").template
1111

1212
local DeviceListener = InputContainer:new{}
1313

14+
local function _setSetting(name)
15+
G_reader_settings:saveSetting(name, true)
16+
end
17+
18+
local function _unsetSetting(name)
19+
G_reader_settings:delSetting(name)
20+
end
21+
22+
local function _toggleSetting(name)
23+
G_reader_settings:flipNilOrFalse(name)
24+
end
25+
1426
function DeviceListener:onToggleNightMode()
1527
local night_mode = G_reader_settings:isTrue("night_mode")
1628
Screen:toggleNightMode()
@@ -223,7 +235,7 @@ end
223235

224236
if Device:canToggleGSensor() then
225237
function DeviceListener:onToggleGSensor()
226-
G_reader_settings:flipNilOrFalse("input_ignore_gsensor")
238+
_toggleSetting("input_ignore_gsensor")
227239
Device:toggleGSensor(not G_reader_settings:isTrue("input_ignore_gsensor"))
228240
local new_text
229241
if G_reader_settings:isTrue("input_ignore_gsensor") then
@@ -269,6 +281,46 @@ function DeviceListener:onSwapRotation()
269281
return true
270282
end
271283

284+
function DeviceListener:onSetRefreshRates(day, night)
285+
UIManager:setRefreshRate(day, night)
286+
end
287+
288+
function DeviceListener:onSetBothRefreshRates(rate)
289+
UIManager:setRefreshRate(rate, rate)
290+
end
291+
292+
function DeviceListener:onSetDayRefreshRate(day)
293+
UIManager:setRefreshRate(day, nil)
294+
end
295+
296+
function DeviceListener:onSetNightRefreshRate(night)
297+
UIManager:setRefreshRate(nil, night)
298+
end
299+
300+
function DeviceListener:onSetFlashOnChapterBoundaries(toggle)
301+
if toggle == true then
302+
_setSetting("refresh_on_chapter_boundaries")
303+
else
304+
_unsetSetting("refresh_on_chapter_boundaries")
305+
end
306+
end
307+
308+
function DeviceListener:onToggleFlashOnChapterBoundaries()
309+
_toggleSetting("refresh_on_chapter_boundaries")
310+
end
311+
312+
function DeviceListener:onSetNoFlashOnSecondChapterPage(toggle)
313+
if toggle == true then
314+
_setSetting("no_refresh_on_second_chapter_page")
315+
else
316+
_unsetSetting("no_refresh_on_second_chapter_page")
317+
end
318+
end
319+
320+
function DeviceListener:onToggleNoFlashOnSecondChapterPage()
321+
_toggleSetting("no_refresh_on_second_chapter_page")
322+
end
323+
272324
if Device:canReboot() then
273325
function DeviceListener:onReboot()
274326
UIManager:show(ConfirmBox:new{

frontend/dispatcher.lua

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ local settingsList = {
6666
toggle_rotation = { category="none", event="SwapRotation", title=_("Toggle orientation"), device=true,},
6767
invert_rotation = { category="none", event="InvertRotation", title=_("Invert rotation"), device=true,},
6868
iterate_rotation = { category="none", event="IterateRotation", title=_("Rotate by 90° CW"), device=true, separator=true,},
69+
set_refresh_rate = { category="absolutenumber", event="SetBothRefreshRates", min=-1, max=200, title=_("Flash every %1 pages (always)"), device=true,},
70+
set_day_refresh_rate = { category="absolutenumber", event="SetDayRefreshRate", min=-1, max=200, title=_("Flash every %1 pages (not in night mode)"), device=true,},
71+
set_night_refresh_rate = { category="absolutenumber", event="SetNightRefreshRate", min=-1, max=200, title=_("Flash every %1 pages (in night mode)"), device=true,},
72+
set_flash_on_chapter_boundaries = { category="string", event="SetFlashOnChapterBoundaries", title=_("Always flash on chapter boundaries"), device=true, args={true, false}, toggle={_("On"), _("Off")},},
73+
toggle_flash_on_chapter_boundaries = { category="none", event="ToggleFlashOnChapterBoundaries", title=_("Toggle flashing on chapter boundaries"), device=true,},
74+
set_no_flash_on_second_chapter_page = { category="string", event="SetNoFlashOnSecondChapterPage", title=_("Never flash on chapter's 2nd page"), device=true, args={true, false}, toggle={_("On"), _("Off")},},
75+
toggle_no_flash_on_second_chapter_page = { category="none", event="ToggleNoFlashOnSecondChapterPage", title=_("Toggle flashing on chapter's 2nd page"), device=true, separator=true,},
6976
wallabag_download = { category="none", event="SynchronizeWallabag", title=_("Wallabag retrieval"), device=true,},
7077
calibre_search = { category="none", event="CalibreSearch", title=_("Search in calibre metadata"), device=true,},
7178
calibre_browse_tags = { category="none", event="CalibreBrowseTags", title=_("Browse all calibre tags"), device=true,},
@@ -177,11 +184,20 @@ local dispatcher_menu_order = {
177184
"decrease_frontlight_warmth",
178185

179186
"toggle_hold_corners",
187+
180188
"toggle_gsensor",
181189
"toggle_rotation",
182190
"invert_rotation",
183191
"iterate_rotation",
184192

193+
"set_refresh_rate",
194+
"set_day_refresh_rate",
195+
"set_night_refresh_rate",
196+
"set_flash_on_chapter_boundaries",
197+
"toggle_flash_on_chapter_boundaries",
198+
"set_no_flash_on_second_chapter_page",
199+
"toggle_no_flash_on_second_chapter_page",
200+
185201
"wifi_on",
186202
"wifi_off",
187203
"toggle_wifi",

frontend/ui/elements/refresh_menu_table.lua

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
local Device = require("device")
2+
local Event = require("ui/event")
23
local UIManager = require("ui/uimanager")
34
local _ = require("gettext")
45
local Screen = Device.screen
@@ -44,7 +45,7 @@ local function spinWidgetSetRefresh(touchmenu_instance, refresh_rate_num)
4445
callback = function(left_value, right_value)
4546
G_reader_settings:saveSetting(refresh_rate_num, left_value)
4647
G_reader_settings:saveSetting("night_" .. refresh_rate_num, right_value)
47-
UIManager:setRefreshRate(left_value, right_value)
48+
UIManager:broadcastEvent(Event:new("SetRefreshRates", left_value, right_value))
4849
touchmenu_instance:updateItems()
4950
end
5051
}
@@ -59,24 +60,24 @@ return {
5960
{
6061
text = _("Never"),
6162
checked_func = function() return refreshChecked(0, 0) end,
62-
callback = function() UIManager:setRefreshRate(0, 0) end,
63+
callback = function() UIManager:broadcastEvent(Event:new("SetBothRefreshRates", 0)) end,
6364
},
6465
{
6566
text = _("Every page"),
6667
checked_func = function() return refreshChecked(1, 1) end,
67-
callback = function() UIManager:setRefreshRate(1, 1) end,
68+
callback = function() UIManager:broadcastEvent(Event:new("SetBothRefreshRates", 1)) end,
6869
},
6970
{
7071
text = _("Every 6 pages"),
7172
checked_func = function() return refreshChecked(6, 6) end,
72-
callback = function() UIManager:setRefreshRate(6, 6) end,
73+
callback = function() UIManager:broadcastEvent(Event:new("SetBothRefreshRates", 6)) end,
7374
},
7475
{
7576
text_func = function()
7677
return T(_("Custom 1: %1:%2 pages"), custom("refresh_rate_1"))
7778
end,
7879
checked_func = function() return refreshChecked(custom("refresh_rate_1")) end,
79-
callback = function() UIManager:setRefreshRate(custom("refresh_rate_1")) end,
80+
callback = function() UIManager:broadcastEvent(Event:new("SetRefreshRates", custom("refresh_rate_1"))) end,
8081
hold_callback = function(touchmenu_instance)
8182
spinWidgetSetRefresh(touchmenu_instance, "refresh_rate_1")
8283
end,
@@ -86,7 +87,7 @@ return {
8687
return T(_("Custom 2: %1:%2 pages"), custom("refresh_rate_2"))
8788
end,
8889
checked_func = function() return refreshChecked(custom("refresh_rate_2")) end,
89-
callback = function() UIManager:setRefreshRate(custom("refresh_rate_2")) end,
90+
callback = function() UIManager:broadcastEvent(Event:new("SetRefreshRates", custom("refresh_rate_2"))) end,
9091
hold_callback = function(touchmenu_instance)
9192
spinWidgetSetRefresh(touchmenu_instance, "refresh_rate_2")
9293
end,
@@ -96,15 +97,27 @@ return {
9697
return T(_("Custom 3: %1:%2 pages"), custom("refresh_rate_3"))
9798
end,
9899
checked_func = function() return refreshChecked(custom("refresh_rate_3")) end,
99-
callback = function() UIManager:setRefreshRate(custom("refresh_rate_3")) end,
100+
callback = function() UIManager:broadcastEvent(Event:new("SetRefreshRates", custom("refresh_rate_3"))) end,
100101
hold_callback = function(touchmenu_instance)
101102
spinWidgetSetRefresh(touchmenu_instance, "refresh_rate_3")
102103
end,
103104
},
104105
{
105106
text = _("Every chapter"),
106107
checked_func = function() return refreshChecked(-1, -1) end,
107-
callback = function() UIManager:setRefreshRate(-1, -1) end,
108+
callback = function() UIManager:broadcastEvent(Event:new("SetBothRefreshRates", -1)) end,
109+
separator = true,
110+
},
111+
{
112+
text = _("Always flash on chapter boundaries"),
113+
checked_func = function() return G_reader_settings:isTrue("refresh_on_chapter_boundaries") end,
114+
callback = function() UIManager:broadcastEvent(Event:new("ToggleFlashOnChapterBoundaries")) end,
115+
},
116+
{
117+
text = _("except on the second page of a new chapter"),
118+
enabled_func = function() return UIManager.FULL_REFRESH_COUNT == -1 or G_reader_settings:isTrue("refresh_on_chapter_boundaries") end,
119+
checked_func = function() return G_reader_settings:isTrue("no_refresh_on_second_chapter_page") end,
120+
callback = function() UIManager:broadcastEvent(Event:new("ToggleNoFlashOnSecondChapterPage")) end,
108121
},
109122
}
110123
}

frontend/ui/uimanager.lua

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -689,10 +689,24 @@ end
689689
--
690690
-- Also makes the refresh rate persistent in global reader settings.
691691
function UIManager:setRefreshRate(rate, night_rate)
692-
logger.dbg("set screen full refresh rate", rate)
693-
self.FULL_REFRESH_COUNT = G_reader_settings:isTrue("night_mode") and night_rate or rate
694-
G_reader_settings:saveSetting("full_refresh_count", rate)
695-
G_reader_settings:saveSetting("night_full_refresh_count", night_rate)
692+
logger.dbg("set screen full refresh rate", rate, night_rate)
693+
694+
if G_reader_settings:isTrue("night_mode") then
695+
if night_rate then
696+
self.FULL_REFRESH_COUNT = night_rate
697+
end
698+
else
699+
if rate then
700+
self.FULL_REFRESH_COUNT = rate
701+
end
702+
end
703+
704+
if rate then
705+
G_reader_settings:saveSetting("full_refresh_count", rate)
706+
end
707+
if night_rate then
708+
G_reader_settings:saveSetting("night_full_refresh_count", night_rate)
709+
end
696710
end
697711

698712
--- Gets full refresh rate for e-ink screen.

0 commit comments

Comments
 (0)