diff --git a/frontend/apps/reader/modules/readerstatus.lua b/frontend/apps/reader/modules/readerstatus.lua index ec110583b..ed85f5e70 100644 --- a/frontend/apps/reader/modules/readerstatus.lua +++ b/frontend/apps/reader/modules/readerstatus.lua @@ -1,5 +1,6 @@ local BookStatusWidget = require("ui/widget/bookstatuswidget") local ButtonDialogTitle = require("ui/widget/buttondialogtitle") +local Device = require("device") local InfoMessage = require("ui/widget/infomessage") local InputContainer = require("ui/widget/container/inputcontainer") local UIManager = require("ui/uimanager") @@ -38,6 +39,7 @@ function ReaderStatus:addToMainMenu(menu_items) end function ReaderStatus:onEndOfBook() + Device:performHapticFeedback("CONTEXT_CLICK") local settings = G_reader_settings:readSetting("end_document_action") local choose_action local collate = true diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index 4c2e53128..552aa5d33 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -1,3 +1,9 @@ +--[[-- +Generic device abstraction. + +This module defines stubs for common methods. +--]] + local logger = require("logger") local _ = require("gettext") @@ -25,6 +31,7 @@ local Device = { hasDPad = no, hasWifiToggle = yes, hasWifiManager = no, + isHapticFeedbackEnabled = no, isTouchDevice = no, hasFrontlight = no, hasLightLevelFallback = no, @@ -290,6 +297,13 @@ function Device:setDateTime(year, month, day, hour, min, sec) end -- Device specific method if any setting needs being saved function Device:saveSettings() end +--[[-- +Device specific method for performing haptic feedback. + +@string type Type of haptic feedback. See . +--]] +function Device:performHapticFeedback(type) end + -- Device specific method for toggling the GSensor function Device:toggleGSensor(toggle) end diff --git a/frontend/device/sdl/device.lua b/frontend/device/sdl/device.lua index b647fcf78..267a29943 100644 --- a/frontend/device/sdl/device.lua +++ b/frontend/device/sdl/device.lua @@ -215,11 +215,21 @@ function Device:init() setClipboardText = function(text) return input.setClipboardText(text) end, + gameControllerRumble = function(left_intensity, right_intensity, duration) + return input.gameControllerRumble(left_intensity, right_intensity, duration) + end, file_chooser = input.file_chooser, } self.keyboard_layout = require("device/sdl/keyboard_layout") + if self.input.gameControllerRumble(0, 0, 0) then + self.isHapticFeedbackEnabled = yes + self.performHapticFeedback = function(type) + self.input.gameControllerRumble() + end + end + if emulator and portrait then self.input:registerEventAdjustHook(self.input.adjustTouchSwitchXY) self.input:registerEventAdjustHook( diff --git a/frontend/ui/widget/virtualkeyboard.lua b/frontend/ui/widget/virtualkeyboard.lua index 67ef4a4e5..3a7d0992c 100644 --- a/frontend/ui/widget/virtualkeyboard.lua +++ b/frontend/ui/widget/virtualkeyboard.lua @@ -185,6 +185,7 @@ function VirtualKey:onUnfocus() end function VirtualKey:onTapSelect(skip_flash) + Device:performHapticFeedback("KEYBOARD_TAP") -- just in case it's not flipped to false on hold release where it's supposed to self.keyboard.ignore_first_hold_release = false if self.flash_keyboard and not skip_flash and not self.skiptap then @@ -203,6 +204,7 @@ function VirtualKey:onTapSelect(skip_flash) end function VirtualKey:onHoldSelect() + Device:performHapticFeedback("LONG_PRESS") if self.flash_keyboard and not self.skiphold then self[1].inner_bordersize = self.focused_bordersize self:update_keyboard(false, true) @@ -222,6 +224,7 @@ function VirtualKey:onHoldSelect() end function VirtualKey:onSwipeKey(arg, ges) + Device:performHapticFeedback("KEYBOARD_TAP") if self.flash_keyboard and not self.skipswipe then self[1].inner_bordersize = self.focused_bordersize self:update_keyboard(false, true) @@ -238,6 +241,7 @@ function VirtualKey:onSwipeKey(arg, ges) end function VirtualKey:onHoldReleaseKey() + Device:performHapticFeedback("LONG_PRESS") if self.keyboard.ignore_first_hold_release then self.keyboard.ignore_first_hold_release = false return true @@ -246,6 +250,7 @@ function VirtualKey:onHoldReleaseKey() end function VirtualKey:onPanReleaseKey() + Device:performHapticFeedback("LONG_PRESS") if self.keyboard.ignore_first_hold_release then self.keyboard.ignore_first_hold_release = false return true