1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2026-03-16 23:53:32 +01:00

Import the portion of a patch in my queue regarding MOW scrolling.

This commit is contained in:
Kris Maglione
2010-12-18 16:10:20 -05:00
parent b4e5d1d980
commit 4feb8dabab

View File

@@ -586,6 +586,8 @@ const CommandLine = Module("commandline", {
_echoMultiline: function echoMultiline(str, highlightGroup, silent) { _echoMultiline: function echoMultiline(str, highlightGroup, silent) {
let doc = this.widgets.multilineOutput.contentDocument; let doc = this.widgets.multilineOutput.contentDocument;
let win = this.widgets.multilineOutput.contentWindow; let win = this.widgets.multilineOutput.contentWindow;
let elem = doc.documentElement;
let body = doc.body;
this.widgets.message = null; this.widgets.message = null;
if (!this.commandVisible) if (!this.commandVisible)
@@ -610,22 +612,23 @@ const CommandLine = Module("commandline", {
// FIXME: need to make sure an open MOW is closed when commands // FIXME: need to make sure an open MOW is closed when commands
// that don't generate output are executed // that don't generate output are executed
if (this.widgets.mowContainer.collapsed) if (this.widgets.mowContainer.collapsed)
doc.body.innerHTML = ""; while (body.firstChild)
body.removeChild(body.firstChild);
doc.body.appendChild(output); body.appendChild(output);
if (!silent) if (!silent)
dactyl.triggerObserver("echoMultiline", str, highlightGroup, output); dactyl.triggerObserver("echoMultiline", str, highlightGroup, output);
commandline.updateOutputHeight(true); commandline.updateOutputHeight(true);
if (options["more"] && win.scrollMaxY > 0) { if (options["more"] && Buffer.isScrollable(elem, 1)) {
// start the last executed command's output at the top of the screen // start the last executed command's output at the top of the screen
let elements = doc.getElementsByClassName("ex-command-output"); let elements = doc.getElementsByClassName("ex-command-output");
elements[elements.length - 1].scrollIntoView(true); elements[elements.length - 1].scrollIntoView(true);
} }
else else
win.scrollTo(0, doc.height); elem.scrollTop = elem.scrollHeight;
dactyl.focus(win); dactyl.focus(win);
@@ -926,6 +929,7 @@ const CommandLine = Module("commandline", {
// allow a down motion after an up rather than closing // allow a down motion after an up rather than closing
onMultilineOutputEvent: function onMultilineOutputEvent(event) { onMultilineOutputEvent: function onMultilineOutputEvent(event) {
let win = this.widgets.multilineOutput.contentWindow; let win = this.widgets.multilineOutput.contentWindow;
let elem = win.document.documentElement;
let showMoreHelpPrompt = false; let showMoreHelpPrompt = false;
let showMorePrompt = false; let showMorePrompt = false;
@@ -975,8 +979,7 @@ const CommandLine = Module("commandline", {
if (event instanceof MouseEvent) if (event instanceof MouseEvent)
return false; return false;
function isScrollable() !win.scrollMaxY == 0; function atEnd(dir) !Buffer.isScrollable(elem, dir || 1);
function atEnd() win.scrollY / win.scrollMaxY >= 1;
switch (key) { switch (key) {
case "<Esc>": case "<Esc>":
@@ -990,8 +993,8 @@ const CommandLine = Module("commandline", {
// down a line // down a line
case "j": case "j":
case "<Down>": case "<Down>":
if (options["more"] && isScrollable()) if (options["more"])
win.scrollByLines(1); Buffer.scrollVertical(elem, "lines", 1);
else else
passEvent = true; passEvent = true;
break; break;
@@ -999,8 +1002,8 @@ const CommandLine = Module("commandline", {
case "<C-j>": case "<C-j>":
case "<C-m>": case "<C-m>":
case "<Return>": case "<Return>":
if (options["more"] && isScrollable() && !atEnd()) if (options["more"] && !atEnd(1))
win.scrollByLines(1); Buffer.scrollVertical(elem, "lines", 1);
else else
closeWindow = true; // don't propagate the event for accept keys closeWindow = true; // don't propagate the event for accept keys
break; break;
@@ -1009,18 +1012,16 @@ const CommandLine = Module("commandline", {
case "k": case "k":
case "<Up>": case "<Up>":
case "<BS>": case "<BS>":
if (options["more"] && isScrollable()) if (options["more"])
win.scrollByLines(-1); Buffer.scrollVertical(elem, "lines", -1);
else if (options["more"] && !isScrollable())
showMorePrompt = true;
else else
passEvent = true; passEvent = true;
break; break;
// half page down // half page down
case "d": case "d":
if (options["more"] && isScrollable()) if (options["more"])
win.scrollBy(0, win.innerHeight / 2); Buffer.scrollVertical(elem, "pages", .5);
else else
passEvent = true; passEvent = true;
break; break;
@@ -1028,16 +1029,10 @@ const CommandLine = Module("commandline", {
// TODO: <LeftMouse> on the prompt line should scroll one page // TODO: <LeftMouse> on the prompt line should scroll one page
// page down // page down
case "f": case "f":
if (options["more"] && isScrollable())
win.scrollByPages(1);
else
passEvent = true;
break;
case "<Space>": case "<Space>":
case "<PageDown>": case "<PageDown>":
if (options["more"] && isScrollable() && !atEnd()) if (options["more"] && !atEnd(1))
win.scrollByPages(1); Buffer.scrollVertical(elem, "pages", 1);
else else
passEvent = true; passEvent = true;
break; break;
@@ -1045,50 +1040,40 @@ const CommandLine = Module("commandline", {
// half page up // half page up
case "u": case "u":
// if (more and scrollable) // if (more and scrollable)
if (options["more"] && isScrollable()) if (options["more"])
win.scrollBy(0, -(win.innerHeight / 2)); Buffer.scrollVertical(elem, "pages", -.5);
else else
passEvent = true; passEvent = true;
break; break;
// page up // page up
case "b": case "b":
if (options["more"] && isScrollable())
win.scrollByPages(-1);
else if (options["more"] && !isScrollable())
showMorePrompt = true;
else
passEvent = true;
break;
case "<PageUp>": case "<PageUp>":
if (options["more"] && isScrollable()) if (options["more"])
win.scrollByPages(-1); Buffer.scrollVertical(elem, "pages", -1);
else else
passEvent = true; passEvent = true;
break; break;
// top of page // top of page
case "g": case "g":
if (options["more"] && isScrollable()) if (options["more"])
win.scrollTo(0, 0); elem.scrollTop = 0;
else if (options["more"] && !isScrollable())
showMorePrompt = true;
else else
passEvent = true; passEvent = true;
break; break;
// bottom of page // bottom of page
case "G": case "G":
if (options["more"] && isScrollable() && !atEnd()) if (options["more"])
win.scrollTo(0, win.scrollMaxY); elem.scrollTop = elem.scrollHeight;
else else
passEvent = true; passEvent = true;
break; break;
// copy text to clipboard // copy text to clipboard
case "<C-y>": case "<C-y>":
dactyl.clipboardWrite(win.getSelection()); dactyl.clipboardWrite(window.getSelection());
break; break;
// close the window // close the window
@@ -1102,7 +1087,7 @@ const CommandLine = Module("commandline", {
// unmapped key // unmapped key
default: default:
if (!options["more"] || !isScrollable() || atEnd() || events.isCancelKey(key)) if (!options["more"] || !atEnd(-1))
passEvent = true; passEvent = true;
else else
showMoreHelpPrompt = true; showMoreHelpPrompt = true;
@@ -1136,14 +1121,11 @@ const CommandLine = Module("commandline", {
updateMorePrompt: function updateMorePrompt(force, showHelp) { updateMorePrompt: function updateMorePrompt(force, showHelp) {
if (this.widgets.mowContainer.collapsed) if (this.widgets.mowContainer.collapsed)
return this.widgets.message = null; return this.widgets.message = null;
let elem = this.widgets.multilineOutput.contentDocument.documentElement;
let win = this.widgets.multilineOutput.contentWindow;
function isScrollable() !win.scrollMaxY == 0;
function atEnd() win.scrollY / win.scrollMaxY >= 1;
if (showHelp) if (showHelp)
this.widgets.message = ["MoreMsg", "-- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit"]; this.widgets.message = ["MoreMsg", "-- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit"];
else if (force || (options["more"] && isScrollable() && !atEnd())) else if (force || (options["more"] && Buffer.isScrollable(elem, 1)))
this.widgets.message = ["MoreMsg", "-- More --"]; this.widgets.message = ["MoreMsg", "-- More --"];
else else
this.widgets.message = ["Question", "Press ENTER or type command to continue"]; this.widgets.message = ["Question", "Press ENTER or type command to continue"];