contrib/xrev: support osKey, simplify display, style, whitespace
[conkeror.git] / contrib / xrev / content / xrev.js
blobb30c6eb3a5e043afeaaf13109099f195db16427a
1 /**
2  * (C) Copyright 2008-2009,2013 John J. Foerch
3  *
4  * Use, modification, and distribution are subject to the terms specified in the
5  * COPYING file.
6 **/
8 const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
9 // const KeyEvent = Components.interfaces.nsIDOMKeyEvent;
11 /* Generate vk name table  */
12 var keycode_to_vk_name = [];
13 var vk_name_to_keycode = {};
15     var prefix = "DOM_VK_";
16     for (i in KeyEvent) {
17         /* Check if this is a key binding */
18         if (i.substr(0, prefix.length) == prefix) {
19             var name = i.substr(prefix.length).toLowerCase();
20             var code = KeyEvent[i];
21             keycode_to_vk_name[code] = name;
22             vk_name_to_keycode[name] = code;
23         }
24     }
27 var special_modifiers = {
28     osKey: function (event) {
29         return ("getModifierState" in event &&
30                 event.getModifierState("OS"));
31     }
34 var column_names = {
35     ctrlKey: "C",
36     metaKey: "M",
37     altKey: "A",
38     osKey: "s",
39     shiftKey: "S"
42 // key_event_props: what properties of keyboard events do we care about?
43 var key_event_props = [
44     'type', 'charCode', 'keyCode', 'which', 'ctrlKey',
45     'metaKey', 'altKey', 'osKey', 'shiftKey'];
47 function quit () {
48     var appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"]
49         .getService(Components.interfaces.nsIAppStartup);
50     appStartup.quit(appStartup.eAttemptQuit);
53 function dumpln (line) {
54     dump(line + "\n");
57 function str_pad (chr, len) {
58     var s = this.toString();
59     while (len - s.length > 0) {
60         s += chr;
61     }
62     return s;
64 String.prototype.pad = str_pad;
67 function key_event_handler (event) {
68     event.preventDefault();
69     event.stopPropagation();
71     var table = document.getElementById('event-table');
72     var row = document.createElementNS(XUL_NS, "listitem");
74     function get_field (k) {
75         if (k in special_modifiers)
76             var v = special_modifiers[k](event);
77         else
78             v = event[k];
79         if (typeof v == "boolean")
80             return (v ? (column_names[k] || true) : "");
81         else
82             return v;
83     }
85     function addcell (text) {
86         var cap = document.createElementNS(XUL_NS, "listcell");
87         cap.setAttribute("label", text);
88         row.appendChild(cap);
89     }
91     for each (var k in key_event_props) {
92         addcell(get_field(k));
93     }
94     var charname = '';
95     if (event.type == 'keypress' &&
96         (event.charCode || event.keyCode))
97     {
98         if (event.charCode) {
99             if (event.charCode == 32)
100                 charname = 'space';
101             else
102                 charname = String.fromCharCode(event.charCode);
103         } else if (event.keyCode) {
104             charname = keycode_to_vk_name[event.keyCode];
105         }
106     }
107     addcell(charname);
108     table.appendChild(row);
109     table.ensureElementIsVisible(row);
110     // text output
111     dump([get_field(k).toString().pad(' ',11)
112           for each (k in key_event_props)].join(''));
113     dumpln(charname);
115 window.addEventListener("keydown", key_event_handler, true /* capture */);
116 window.addEventListener("keypress", key_event_handler, true /* capture */);
119 function onload_handler () {
120     var headings = key_event_props.concat("name");
121     var table = document.getElementById('event-table');
122     var head = document.createElementNS(XUL_NS,"listhead");
123     var coldef = document.createElementNS(XUL_NS,"listcols");
125     function addcol (name) {
126         var t = document.createElementNS(XUL_NS,"listheader");
127         if (name in column_names)
128             name = column_names[name];
129         t.setAttribute("label", name);
130         var u = document.createElementNS(XUL_NS,"listcol");
131         u.setAttribute("flex", "1");
132         head.appendChild(t);
133         coldef.appendChild(u);
134     }
136     for each (var k in headings) {
137         addcol(k);
138     }
139     table.appendChild(head);
140     table.appendChild(coldef);
141     // text output
142     dumpln([k.pad(' ',11) for each (k in headings)].join(''));