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): def flow_onwheel(evt):
dx = dy = 0 dx = dy = 0
WheelEvent = window.WheelEvent
if evt.deltaY: if evt.deltaY:
if evt.deltaMode is evt.DOM_DELTA_PIXEL: if evt.deltaMode is WheelEvent.DOM_DELTA_PIXEL:
dy = evt.deltaY dy = evt.deltaY
elif evt.deltaMode is evt.DOM_DELTA_LINE: elif evt.deltaMode is WheelEvent.DOM_DELTA_LINE:
dy = 15 * evt.deltaY 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 dy = (scroll_viewport.height() - 30) * evt.deltaY
if evt.deltaX: if evt.deltaX:
if evt.deltaMode is evt.DOM_DELTA_PIXEL: if evt.deltaMode is WheelEvent.DOM_DELTA_PIXEL:
dx = evt.deltaX dx = evt.deltaX
elif evt.deltaMode is evt.DOM_DELTA_LINE: elif evt.deltaMode is WheelEvent.DOM_DELTA_LINE:
dx = 15 * evt.deltaX dx = 15 * evt.deltaX
else: else:
dx = (scroll_viewport.width() - 30) * evt.deltaX dx = (scroll_viewport.width() - 30) * evt.deltaX

View File

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

View File

@ -162,12 +162,12 @@ class View:
left_margin = E.div( left_margin = E.div(
svgicon('caret-left'), style='width:{}px;'.format(sd.get('margin_left', 20)), 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, 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) set_left_margin_handler(left_margin)
right_margin = E.div( right_margin = E.div(
svgicon('caret-right'), style='width:{}px;'.format(sd.get('margin_right', 20)), 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, 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) set_right_margin_handler(right_margin)
iframe_id = unique_id('read-book-iframe') iframe_id = unique_id('read-book-iframe')
sandbox = 'allow-popups allow-scripts allow-popups-to-escape-sandbox' sandbox = 'allow-popups allow-scripts allow-popups-to-escape-sandbox'
@ -279,6 +279,13 @@ class View:
event.preventDefault(), event.stopPropagation() event.preventDefault(), event.stopPropagation()
self.show_chrome() 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): def forward_gesture(self, gesture):
self.iframe_wrapper.send_message('gesture_from_margin', gesture=gesture) self.iframe_wrapper.send_message('gesture_from_margin', gesture=gesture)