Debian package: Declare compliance with Debian Policy 4.3.0
[conkeror.git] / modules / mouse.js
blob53175f329a12816b1d7cfaf2bc73150427cfc990
1 /**
2  * (C) Copyright 2016 Ivy Foster
3  *
4  * Use, modification, and distribution are subject to the terms specified in the
5  * COPYING file.
6 **/
8 // Reference: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent
10 define_variable (
11     "click_handler", [],
12     "An array of functions to run on click events. " +
13     "The function will be passed two arguments: " +
14     "the current window and the mouse event.\n" +
15     "To create an event, set 'click_handler[n] = some_function;', " +
16     "where n is the total value of the buttons pressed.\n" +
17     "left = 1\n" + "right = 2\n" + "middle = 4\n" +
18     "button4 = 8\n" + "button5 = 16\n\n" +
19     "For instance, click_handler.3 would run when " +
20     "left and right are pressed together.\n" +
21     "For more information, see " +
22     "<https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons>."
25 function handle_mouse_click (event) {
26     var chord = 0;
28     // Translate MouseEvent.button events into MouseEvent.buttons events.
29     switch (event.button) {
30     case 0:
31         chord = 1;
32         break;
33     case 1:
34         chord = 4;
35         break;
36     case 2:
37         chord = 2;
38         break;
39     case 3:
40         chord = 8;
41         break;
42     case 4:
43         chord = 16;
44         break;
45     }
47     chord += event.buttons;
49     if (click_handler[chord]) {
50         click_handler[chord](this.ownerDocument.defaultView, event);
51     }
54 define_variable(
55     "clicks_in_new_buffer_target", OPEN_NEW_BUFFER,
56     "Destination for new buffers created by clicks. " +
57     "Set to one the constants OPEN_NEW_BUFFER, " +
58     "OPEN_NEW_BUFFER_BACKGROUND, or OPEN_NEW_WINDOW.\n" +
59     "Default is OPEN_NEW_BUFFER."
62 function clicked_link_in_new_buffer (window, event) {
63     let element = event.target;
64     let anchor = null;
65     if (element instanceof Ci.nsIDOMHTMLAnchorElement ||
66         element instanceof Ci.nsIDOMHTMLAreaElement) {
67         anchor = element;
68     } else {
69         for (let p = element.parentNode;
70             p != null && p.tagName.toLowerCase() != "html";
71             p = p.parentNode) {
72             if (p.tagName.toLowerCase() == "a") {
73                 anchor = p;
74                 break;
75             } else { return; }
76         }
77     }
79     event.preventDefault();
80     event.stopPropagation();
81     let spec = load_spec(anchor);
82     let buffer = window.buffers.current;
83     create_buffer(window,
84         buffer_creator(content_buffer,
85             $opener = buffer,
86             $load = spec),
87         clicks_in_new_buffer_target);
90 function handle_click_add_listener(buffer) {
91     buffer.browser.addEventListener("click", handle_mouse_click, true);
94 function handle_click_remove_listener(buffer) {
95     buffer.browser.removeEventListener("click", handle_mouse_click, true);
98 function mouse_click_event_mode_enable() {
99     add_hook("create_buffer_hook", handle_click_add_listener);
100     for_each_buffer(handle_click_add_listener);
103 function mouse_click_event_mode_disable() {
104     remove_hook("create_buffer_hook", handle_click_add_listener);
105     for_each_buffer(handle_click_remove_listener);
108 define_global_mode("mouse_click_event_mode",
109     mouse_click_event_mode_enable, mouse_click_event_mode_disable
112 mouse_click_event_mode(true);
114 provide("mouse");