call_on_focused_field, modify_region: support richedit frames
[conkeror.git] / modules / eye-guide.js
blob8974edc9d903eece6384b3f4cfdf22aefd63192a
1 /**
2  * (C) Copyright 2009 John J. Foerch
3  *
4  * Use, modification, and distribution are subject to the terms specified in the
5  * COPYING file.
6 **/
8 /*
9  * Example usage:
10  *
11  * require('eye-guide.js');
12  * define_key(content_buffer_normal_keymap, "space", "eye-guide-scroll-down");
13  * define_key(content_buffer_normal_keymap, "back_space", "eye-guide-scroll-up");
14  *
15  */
17 in_module(null);
19 define_variable("eye_guide_interval", 800,
20     "Interval during which the eye guide is visible (in ms). "+
21     "When 0, the eye guide will remain visible.");
23 define_variable("eye_guide_context_size", 50,
24     "Context size in pixels for eye-guide-scroll-down and "+
25     "eye-guide-scroll-up.");
27 interactive("eye-guide-scroll-down",
28     "Alternative to scroll-page-down, displays a guide to help "+
29     "your eyes follow the scroll.",
30     function(I) {
31         let win = I.buffer.focused_frame;
32         let doc = I.buffer.document;
33         let context = eye_guide_context_size;
34         let old_y = win.scrollY;
35         win.scrollBy(0, win.innerHeight - context);
36         if (win.scrollY == old_y)
37             return;
38         if (win.scrollY - old_y < win.innerHeight - context)
39             context = win.innerHeight - (win.scrollY - old_y);
40         let guide = doc.getElementById("__conkeror_eye_guide");
41         if (! guide) {
42             guide = doc.createElementNS(XHTML_NS, "div");
43             guide.id = "__conkeror_eye_guide";
44             doc.documentElement.appendChild(guide);
45         }
46         guide.style.top = '0px';
47         guide.style.height = context+'px';
48         guide.style.display = "block";
49         guide.className = "__conkeror_eye_guide_scroll_down";
50         if (win.eye_guide_timer) {
51             win.clearTimeout(win.eye_guide_timer);
52             win.eye_guide_timer = null;
53         }
54         if (eye_guide_interval != 0)
55             win.eye_guide_timer = win.setTimeout(
56                 function () {
57                     guide.style.display = "none";
58                 },
59                 eye_guide_interval);
60     });
62 interactive("eye-guide-scroll-up",
63     "Alternative to scroll-page-up, displays a guide to help "+
64     "your eyes follow the scroll.",
65     function(I) {
66         let win = I.buffer.focused_frame;
67         let doc = I.buffer.document;
68         let context = eye_guide_context_size;
69         let old_y = win.scrollY;
70         win.scrollBy(0, 0 - (win.innerHeight - context));
71         if (win.scrollY == old_y)
72             return;
73         if (old_y - win.scrollY < win.innerHeight - context)
74             context = win.innerHeight - old_y;
75         let guide = doc.getElementById("__conkeror_eye_guide");
76         if (! guide) {
77             guide = doc.createElementNS(XHTML_NS, "div");
78             guide.id = "__conkeror_eye_guide";
79             doc.documentElement.appendChild(guide);
80         }
81         guide.style.top = (win.innerHeight - context) + "px";
82         guide.style.height = context+'px';
83         guide.style.display = "block";
84         guide.className = "__conkeror_eye_guide_scroll_up";
85         if (win.eye_guide_timer) {
86             win.clearTimeout(win.eye_guide_timer);
87             win.eye_guide_timer = null;
88         }
89         if (eye_guide_interval != 0)
90             win.eye_guide_timer = win.setTimeout(
91                 function () {
92                     guide.style.display = "none";
93                 },
94                 eye_guide_interval);
95     });
97 provide("eye-guide");