From 585fb9bcc61bc6ccda44eb5deab41905f8f84bde Mon Sep 17 00:00:00 2001 From: Peter Lunicks Date: Fri, 14 Jan 2011 19:57:35 -0600 Subject: [PATCH] mouse-wheel-mode: enable scrolling with mouse wheels If scrollbars are disabled by setting buffer.browser.contentWindow.scrollbars.visible to false then the mouse wheel no longer scrolls the page. This global mode resolves that problem by listening for DOMMouseScroll events and scrolling the current window/frame upon receiving an event. This mode adds a new user variable, mouse_wheel_scroll_lines, which controls how many lines to scroll by each time a mouse scroll event is received. --- modules/mouse-wheel.js | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ modules/window.js | 39 +++++++++++++++++---------------- 2 files changed, 79 insertions(+), 19 deletions(-) create mode 100644 modules/mouse-wheel.js diff --git a/modules/mouse-wheel.js b/modules/mouse-wheel.js new file mode 100644 index 0000000..360f4ce --- /dev/null +++ b/modules/mouse-wheel.js @@ -0,0 +1,59 @@ +/** + * (C) Copyright 2011 Peter Lunicks + * + * Use, modification, and distribution are subject to the terms specified in the + * COPYING file. +**/ + +define_variable("mouse_wheel_scroll_lines", null, + "How many lines to scroll when the mouse wheel is used. " + + "A null value causes mouse-wheel-mode to scroll by the " + + "number of lines specified in the DOMMouseScroll event."); + +function mouse_wheel_scroll (event) { + var lines; + if (mouse_wheel_scroll_lines != null) + lines = mouse_wheel_scroll_lines * (event.detail < 0 ? -1 : 1) + else + lines = event.detail; + + // Scroll the frame under mouse, not necessarily the current/focused frame + var window = this.ownerDocument.defaultView; + var frame = event.target.ownerDocument.defaultView; + do_repeatedly(attempt_builtin_command, lines, + [window, frame, "cmd_scrollLineDown"], + [window, frame, "cmd_scrollLineUp"]); + + // Prevent the scrollbars from scrolling further (if visible) + event.preventDefault(); +} + +function mouse_wheel_add_listener (buffer) { + buffer.browser.addEventListener("DOMMouseScroll", + mouse_wheel_scroll, + true); +} + +function mouse_wheel_remove_listener (buffer) { + buffer.browser.removeEventListener("DOMMouseScroll", + mouse_wheel_scroll, + true); +} + +function mouse_wheel_mode_enable () { + add_hook("create_buffer_hook", mouse_wheel_add_listener); + for_each_buffer(mouse_wheel_add_listener); +} + +function mouse_wheel_mode_disable () { + remove_hook("create_buffer_hook", mouse_wheel_remove_listener); + for_each_buffer(mouse_wheel_remove_listener); +} + +define_global_mode("mouse_wheel_mode", + mouse_wheel_mode_enable, + mouse_wheel_mode_disable); + +mouse_wheel_mode(true); + +provide("mouse-wheel"); diff --git a/modules/window.js b/modules/window.js index d96ab27..109ad98 100644 --- a/modules/window.js +++ b/modules/window.js @@ -280,6 +280,24 @@ function init_window_title () { init_window_title(); +function attempt_builtin_command (window, element, command, clear_mark) { + var c; + if (element.controllers + && (c = element.controllers.getControllerForCommand(command)) != null + && c.isCommandEnabled(command)) + { + try { + c.doCommand(command); + } catch (e) { + // ignore errors + } + if (clear_mark) + window.buffers.current.mark_active = false; + return true; + } + return false; +} + function call_builtin_command (window, command, clear_mark) { var m = window.minibuffer; if (m.active && m._input_mode_enabled) { @@ -295,29 +313,12 @@ function call_builtin_command (window, command, clear_mark) { if (clear_mark) m.current_state.mark_active = false; } else { - function attempt_command (element) { - var c; - if (element.controllers - && (c = element.controllers.getControllerForCommand(command)) != null - && c.isCommandEnabled(command)) - { - try { - c.doCommand(command); - } catch (e) { - // ignore errors - } - if (clear_mark) - window.buffers.current.mark_active = false; - return true; - } - return false; - } var element = window.buffers.current.focused_element; - if (element && attempt_command(element, command)) + if (element && attempt_builtin_command(window, element, command, clear_mark)) return; var win = window.buffers.current.focused_frame; while (true) { - if (attempt_command(win, command)) + if (attempt_builtin_command(window, win, command, clear_mark)) return; if (!win.parent || win == win.parent) break; -- 2.11.4.GIT