Viewer: Fix mouse wheel not working when mouse is over page margins. Fixes #1850845 [Viewer problems in full-screen mode](https://bugs.launchpad.net/calibre/+bug/1850845)

This commit is contained in:
Kovid Goyal 2019-11-01 11:18:04 +05:30
parent 51c378e1d8
commit 98c9a747d6
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 21 additions and 8 deletions

View File

@ -81,17 +81,18 @@ def scroll_by(y):
def flow_onwheel(evt):
dx = dy = 0
WheelEvent = window.WheelEvent
if evt.deltaY:
if evt.deltaMode is evt.DOM_DELTA_PIXEL:
if evt.deltaMode is WheelEvent.DOM_DELTA_PIXEL:
dy = evt.deltaY
elif evt.deltaMode is evt.DOM_DELTA_LINE:
elif evt.deltaMode is WheelEvent.DOM_DELTA_LINE:
dy = 15 * evt.deltaY
if evt.deltaMode is evt.DOM_DELTA_PAGE:
if evt.deltaMode is WheelEvent.DOM_DELTA_PAGE:
dy = (scroll_viewport.height() - 30) * evt.deltaY
if evt.deltaX:
if evt.deltaMode is evt.DOM_DELTA_PIXEL:
if evt.deltaMode is WheelEvent.DOM_DELTA_PIXEL:
dx = evt.deltaX
elif evt.deltaMode is evt.DOM_DELTA_LINE:
elif evt.deltaMode is WheelEvent.DOM_DELTA_LINE:
dx = 15 * evt.deltaX
else:
dx = (scroll_viewport.width() - 30) * evt.deltaX

View File

@ -94,6 +94,7 @@ class IframeBoss:
'change_font_size': self.change_font_size,
'change_color_scheme': self.change_color_scheme,
'gesture_from_margin': self.gesture_from_margin,
'wheel_from_margin': self.wheel_from_margin,
'find': self.find,
'window_size': self.received_window_size,
'get_current_cfi': self.get_current_cfi,
@ -198,6 +199,9 @@ class IframeBoss:
def gesture_from_margin(self, data):
self.handle_gesture(data.gesture)
def wheel_from_margin(self, data):
self.onwheel(data.evt)
def report_human_scroll(self, scrolled_by_frac):
self.send_message('human_scroll', scrolled_by_frac=scrolled_by_frac or None)
@ -374,6 +378,7 @@ class IframeBoss:
def onwheel(self, evt):
if self.content_ready:
if evt.preventDefault:
evt.preventDefault()
if evt.deltaY and evt.ctrlKey and not evt.shiftKey and not evt.altKey and not evt.metaKey:
self.send_message('handle_shortcut', name='increase_font_size' if evt.deltaY < 0 else 'decrease_font_size')

View File

@ -162,12 +162,12 @@ class View:
left_margin = E.div(
svgicon('caret-left'), style='width:{}px;'.format(sd.get('margin_left', 20)),
class_='book-side-margin', id='book-left-margin', onclick=self.left_margin_clicked,
oncontextmenu=self.margin_context_menu.bind(None, 'left'))
oncontextmenu=self.margin_context_menu.bind(None, 'left'), onwheel=self.on_margin_wheel.bind(None, 'left'))
set_left_margin_handler(left_margin)
right_margin = E.div(
svgicon('caret-right'), style='width:{}px;'.format(sd.get('margin_right', 20)),
class_='book-side-margin', id='book-right-margin', onclick=self.right_margin_clicked,
oncontextmenu=self.margin_context_menu.bind(None, 'right'))
oncontextmenu=self.margin_context_menu.bind(None, 'right'), onwheel=self.on_margin_wheel.bind(None, 'right'))
set_right_margin_handler(right_margin)
iframe_id = unique_id('read-book-iframe')
sandbox = 'allow-popups allow-scripts allow-popups-to-escape-sandbox'
@ -279,6 +279,13 @@ class View:
event.preventDefault(), event.stopPropagation()
self.show_chrome()
def on_margin_wheel(self, which, event):
event.preventDefault()
evt = {}
for attr in ('deltaX', 'deltaY', 'deltaMode', 'altKey', 'ctrlKey', 'shiftKey', 'metaKey'):
evt[attr] = event[attr]
self.iframe_wrapper.send_message('wheel_from_margin', evt=evt)
def forward_gesture(self, gesture):
self.iframe_wrapper.send_message('gesture_from_margin', gesture=gesture)