diff --git a/base b/base index 8a8722a49..e5b008dfd 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit 8a8722a491ed7897bb8eaa0c2e9e8c05b54e1104 +Subproject commit e5b008dfd2f854463b45d6ae9e6b2a8c9f902412 diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index 45e5f275a..819a2b8c7 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -860,6 +860,7 @@ function FileManagerMenu:onShowMenu(tab_index) end function FileManagerMenu:onCloseFileManagerMenu() + if not self.menu_container then return end local last_tab_index = self.menu_container[1].last_index G_reader_settings:saveSetting("filemanagermenu_tab_index", last_tab_index) UIManager:close(self.menu_container) @@ -900,6 +901,7 @@ function FileManagerMenu:onSwipeShowMenu(ges) end function FileManagerMenu:onSetDimensions(dimen) + self:onCloseFileManagerMenu() -- update listening according to new screen dimen if Device:isTouchDevice() then self:initGesListener() diff --git a/frontend/apps/reader/modules/readermenu.lua b/frontend/apps/reader/modules/readermenu.lua index 0593c41a7..f0b8d5df6 100644 --- a/frontend/apps/reader/modules/readermenu.lua +++ b/frontend/apps/reader/modules/readermenu.lua @@ -407,6 +407,10 @@ function ReaderMenu:onCloseReaderMenu() return true end +function ReaderMenu:onSetDimensions(dimen) + self:onCloseReaderMenu() +end + function ReaderMenu:onCloseDocument() if Device:supportsScreensaver() then -- Remove the item we added (which cleans up references to document diff --git a/frontend/device/android/device.lua b/frontend/device/android/device.lua index ee8e75ad7..5f6698211 100644 --- a/frontend/device/android/device.lua +++ b/frontend/device/android/device.lua @@ -83,6 +83,7 @@ local Device = Generic:new{ home_dir = android.getExternalStoragePath(), display_dpi = android.lib.AConfiguration_getDensity(android.app.config), isHapticFeedbackEnabled = yes, + isDefaultFullscreen = function() return android.app.activity.sdkVersion >= 19 end, hasClipboard = yes, hasOTAUpdates = android.ota.isEnabled, hasOTARunning = function() return android.ota.isRunning end, @@ -341,27 +342,85 @@ function Device:setViewport(x,y,w,h) self.screen:setViewport(viewport) end -function Device:toggleFullscreen() +-- fullscreen + +-- to-do: implement fullscreen toggle in API19+ +local function canToggleFullscreen() local api = android.app.activity.sdkVersion + return api < 19, api +end + +-- toggle fullscreen API 19+ +function Device:_toggleFullscreenImmersive() + logger.dbg("ignoring fullscreen toggle, reason: always in immersive mode") +end + +-- toggle fullscreen API 17-18 +function Device:_toggleFullscreenLegacy() + local width = android.getScreenWidth() + local height = android.getScreenHeight() + -- NOTE: Since we don't do HW rotation here, this should always match width + local available_width = android.getScreenAvailableWidth() + local available_height = android.getScreenAvailableHeight() + + local is_fullscreen = android.isFullscreen() + android.setFullscreen(not is_fullscreen) + G_reader_settings:saveSetting("disable_android_fullscreen", is_fullscreen) + + self.fullscreen = android.isFullscreen() + if self.fullscreen then + self:setViewport(0, 0, width, height) + else + self:setViewport(0, 0, available_width, available_height) + end +end + +-- toggle fullscreen API 14-16 +function Device:_toggleStatusBarVisibility() + local is_fullscreen = android.isFullscreen() + android.setFullscreen(not is_fullscreen) + logger.dbg(string.format("requesting fullscreen: %s", not is_fullscreen)) + local width = android.getScreenWidth() + local height = android.getScreenHeight() + local statusbar_height = android.getStatusBarHeight() + local new_height = height - statusbar_height + + if not is_fullscreen and self.viewport then + statusbar_height = 0 + -- reset touchTranslate to normal + self.input:registerEventAdjustHook( + self.input.adjustTouchTranslate, + {x = 0 + self.viewport.x, y = 0 + self.viewport.y}) + end + + local viewport = Geom:new{x=0, y=statusbar_height, w=width, h=new_height} + logger.info(string.format("Switching viewport to new geometry [x=%d,y=%d,w=%d,h=%d]", + 0, statusbar_height, width, new_height)) + + self.screen:setViewport(viewport) + if is_fullscreen and self.viewport then + self.input:registerEventAdjustHook( + self.input.adjustTouchTranslate, + {x = 0 - self.viewport.x, y = 0 - self.viewport.y}) + end + + self.fullscreen = is_fullscreen +end + +function Device:isAlwaysFullscreen() + return not canToggleFullscreen() +end + +function Device:toggleFullscreen() + local is_fullscreen = android.isFullscreen() + logger.dbg(string.format("requesting fullscreen: %s", not is_fullscreen)) + local dummy, api = canToggleFullscreen() if api >= 19 then - logger.dbg("ignoring fullscreen toggle, reason: always in immersive mode") - elseif api < 19 and api >= 17 then - local width = android.getScreenWidth() - local height = android.getScreenHeight() - -- NOTE: Since we don't do HW rotation here, this should always match width - local available_width = android.getScreenAvailableWidth() - local available_height = android.getScreenAvailableHeight() - local is_fullscreen = android.isFullscreen() - android.setFullscreen(not is_fullscreen) - G_reader_settings:saveSetting("disable_android_fullscreen", is_fullscreen) - is_fullscreen = android.isFullscreen() - if is_fullscreen then - self:setViewport(0, 0, width, height) - else - self:setViewport(0, 0, available_width, available_height) - end + self:_toggleFullscreenImmersive() + elseif api >= 16 then + self:_toggleFullscreenLegacy() else - logger.dbg("ignoring fullscreen toggle, reason: legacy api " .. api) + self:_toggleStatusBarVisibility() end end diff --git a/frontend/device/devicelistener.lua b/frontend/device/devicelistener.lua index 7726b48f2..1db5c9c69 100644 --- a/frontend/device/devicelistener.lua +++ b/frontend/device/devicelistener.lua @@ -236,6 +236,12 @@ if Device:canToggleGSensor() then end end +if not Device:isAlwaysFullscreen() then + function DeviceListener:onToggleFullscreen() + Device:toggleFullscreen() + end +end + function DeviceListener:onIterateRotation() -- Simply rotate by 90° CW local arg = bit.band(Screen:getRotationMode() + 1, 3) diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index 4e7d04f49..61e79befd 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -41,6 +41,7 @@ local Device = { hasFewKeys = no, hasWifiToggle = yes, hasWifiManager = no, + isDefaultFullscreen = yes, isHapticFeedbackEnabled = no, isTouchDevice = no, hasFrontlight = no, @@ -396,6 +397,9 @@ function Device:setDateTime(year, month, day, hour, min, sec) end -- Device specific method if any setting needs being saved function Device:saveSettings() end +function Device:isAlwaysFullscreen() return true end +function Device:toggleFullscreen() end + -- Simulates suspend/resume function Device:simulateSuspend() end function Device:simulateResume() end diff --git a/frontend/device/input.lua b/frontend/device/input.lua index 1270c7175..c31c0cb19 100644 --- a/frontend/device/input.lua +++ b/frontend/device/input.lua @@ -528,6 +528,12 @@ function Input:handleKeyBoardEv(ev) end end + -- toggle fullscreen on F11 + if self:isEvKeyPress(ev) and keycode == "F11" and not self.device:isAlwaysFullscreen() then + local UIManager = require("ui/uimanager") + UIManager:broadcastEvent(Event:new("ToggleFullscreen")) + end + -- quit on Alt + F4 -- this is also emitted by the close event in SDL if self:isEvKeyPress(ev) and self.modifiers["Alt"] and keycode == "F4" then diff --git a/frontend/device/sdl/device.lua b/frontend/device/sdl/device.lua index cef65e087..f2bf05b49 100644 --- a/frontend/device/sdl/device.lua +++ b/frontend/device/sdl/device.lua @@ -61,6 +61,7 @@ local Device = Generic:new{ hasDPad = yes, hasWifiToggle = no, isTouchDevice = yes, + isDefaultFullscreen = no, needsScreenRefreshAfterResume = no, hasColorScreen = yes, hasEinkScreen = no, @@ -127,6 +128,7 @@ local Emulator = Device:new{ local UbuntuTouch = Device:new{ model = "UbuntuTouch", hasFrontlight = yes, + isDefaultFullscreen = yes, } function Device:init() @@ -313,6 +315,22 @@ function Device:setDateTime(year, month, day, hour, min, sec) end end +function Device:isAlwaysFullscreen() + -- return true on embedded devices, which should default to fullscreen + return self:isDefaultFullscreen() +end + +function Device:toggleFullscreen() + local current_mode = self.fullscreen or self:isDefaultFullscreen() + local new_mode = not current_mode + local ok, err = SDL.setWindowFullscreen(new_mode) + if not ok then + logger.warn("Unable to toggle fullscreen mode to", new_mode, "\n", err) + else + self.fullscreen = new_mode + end +end + function Emulator:supportsScreensaver() return true end function Emulator:simulateSuspend() diff --git a/frontend/device/sdl/event_map_sdl2.lua b/frontend/device/sdl/event_map_sdl2.lua index 1a3d4cf3e..6ed774679 100644 --- a/frontend/device/sdl/event_map_sdl2.lua +++ b/frontend/device/sdl/event_map_sdl2.lua @@ -57,8 +57,8 @@ return { [1073741889] = "F8", -- F[8] [1073741890] = "F9", -- F[9] [1073741891] = "F10", -- F[10] - [1073741892] = "VPlus", -- F[11] - [1073741893] = "VMinus", -- F[12] + [1073741892] = "F11", -- F[11] + [1073741893] = "F12", -- F[12] [1073742049] = "Shift", -- left shift [1073742053] = "Sym", -- right shift diff --git a/frontend/dispatcher.lua b/frontend/dispatcher.lua index 8f97ca450..937735625 100644 --- a/frontend/dispatcher.lua +++ b/frontend/dispatcher.lua @@ -71,6 +71,7 @@ local settingsList = { wifi_on = {category="none", event="InfoWifiOn", title=_("Turn on Wi-Fi"), device=true, condition=Device:hasWifiToggle()}, wifi_off = {category="none", event="InfoWifiOff", title=_("Turn off Wi-Fi"), device=true, condition=Device:hasWifiToggle()}, toggle_wifi = {category="none", event="ToggleWifi", title=_("Toggle Wi-Fi"), device=true, condition=Device:hasWifiToggle()}, + toggle_fullscreen = {category="none", event="ToggleFullscreen", title=_("Toggle Fullscreen"), device=true, condition=not Device:isAlwaysFullscreen()}, show_network_info = {category="none", event="ShowNetworkInfo", title=_("Show network info"), device=true, separator=true}, suspend = {category="none", event="SuspendEvent", title=_("Suspend"), device=true}, exit = {category="none", event="Exit", title=_("Exit KOReader"), device=true}, @@ -236,6 +237,7 @@ local dispatcher_menu_order = { "wifi_on", "wifi_off", "toggle_wifi", + "toggle_fullscreen", "show_network_info", "show_frontlight_dialog", diff --git a/frontend/ui/elements/common_settings_menu_table.lua b/frontend/ui/elements/common_settings_menu_table.lua index 0fca2468e..a4c69cb6f 100644 --- a/frontend/ui/elements/common_settings_menu_table.lua +++ b/frontend/ui/elements/common_settings_menu_table.lua @@ -259,13 +259,36 @@ if Screen:isColorEnabled() or Screen:isColorScreen() then common_settings.color_rendering = require("ui/elements/screen_color_menu_table") end +-- fullscreen toggle for supported devices +if not Device:isAlwaysFullscreen() then + common_settings.fullscreen = { + text = _("Fullscreen"), + checked_func = function() + return Device.fullscreen or Device.isDefaultFullscreen() + end, + callback = function() + Device:toggleFullscreen() + -- for legacy android devices + if Device:isAndroid() then + local api = Device.firmware_rev + local needs_restart = api < 19 and api >= 16 + if needs_restart then + UIManager:show(InfoMessage:new{ + text = _("This will take effect on next restart.") + }) + end + end + end, + } +end + if Device:isAndroid() then -- android common settings local isAndroid, android = pcall(require, "android") if not isAndroid then return end -- screen timeout options, disabled if device needs wakelocks. - common_settings.screen_timeout = require("ui/elements/screen_android"):getTimeoutMenuTable() + common_settings.screen_timeout = require("ui/elements/timeout_android"):getTimeoutMenuTable() -- haptic feedback override common_settings.android_haptic_feedback = { @@ -305,15 +328,6 @@ if Device:isAndroid() then end, } - -- fullscreen toggle on devices with compatible fullscreen methods (apis 14-18) - if Device.firmware_rev < 19 then - common_settings.fullscreen = { - text = _("Fullscreen"), - checked_func = function() return android.isFullscreen() end, - callback = function() require("ui/elements/screen_android"):toggleFullscreen() end, - } - end - -- ignore battery optimization if Device.firmware_rev >= 23 then common_settings.ignore_battery_optimizations = { diff --git a/frontend/ui/elements/screen_android.lua b/frontend/ui/elements/timeout_android.lua similarity index 72% rename from frontend/ui/elements/screen_android.lua rename to frontend/ui/elements/timeout_android.lua index 81e160a4c..78c80bf69 100644 --- a/frontend/ui/elements/screen_android.lua +++ b/frontend/ui/elements/timeout_android.lua @@ -1,12 +1,7 @@ local isAndroid, android = pcall(require, "android") -local Device = require("device") -local Geom = require("ui/geometry") local ffi = require("ffi") -local logger = require("logger") local _ = require("gettext") -local Input = Device.input local N_ = _.ngettext -local Screen = Device.screen local T = require("ffi/util").template if not isAndroid then return end @@ -60,58 +55,10 @@ You will be prompted with a permission management screen. You'll need to give KO android.settings.requestPermission("settings", text, _("Allow"), _("Cancel")) end -local ScreenHelper = {} - -function ScreenHelper:toggleFullscreen() - local api = Device.firmware_rev - - if api < 19 and api >= 17 then - Device:toggleFullscreen() - local UIManager = require("ui/uimanager") - local InfoMessage = require("ui/widget/infomessage") - UIManager:show(InfoMessage:new{ - text = _("This will take effect on next restart.") - }) - elseif api < 17 then - self:toggleFullscreenLegacy() - end -end - --- toggle android status bar visibility -- Legacy function for Apis 14 - 16 -function ScreenHelper:toggleFullscreenLegacy() - -- toggle android status bar visibility - local is_fullscreen = android.isFullscreen() - android.setFullscreen(not is_fullscreen) - logger.dbg(string.format("requesting fullscreen: %s", not is_fullscreen)) - - local screen_width = android.getScreenWidth() - local screen_height = android.getScreenHeight() - local status_bar_height = android.getStatusBarHeight() - local new_height = screen_height - status_bar_height - - if not is_fullscreen and Screen.viewport then - status_bar_height = 0 - -- reset touchTranslate to normal - Input:registerEventAdjustHook( - Input.adjustTouchTranslate, - {x = 0 + Screen.viewport.x, y = 0 + Screen.viewport.y}) - end - - local viewport = Geom:new{x=0, y=status_bar_height, w=screen_width, h=new_height} - logger.info(string.format("Switching viewport to new geometry [x=%d,y=%d,w=%d,h=%d]", - 0, status_bar_height, screen_width, new_height)) - - Screen:setViewport(viewport) - - if is_fullscreen and Screen.viewport then - Input:registerEventAdjustHook( - Input.adjustTouchTranslate, - {x = 0 - Screen.viewport.x, y = 0 - Screen.viewport.y}) - end -end +local TimeoutHelper = {} -- timeout menu table -function ScreenHelper:getTimeoutMenuTable() +function TimeoutHelper:getTimeoutMenuTable() local t = { { text = _("Use system settings"), @@ -185,4 +132,4 @@ function ScreenHelper:getTimeoutMenuTable() } end -return ScreenHelper +return TimeoutHelper