Make it easier to remove mode_line_adder functions from hooks
[conkeror.git] / modules / mode.js
blob77bb4e3fd0c7ac3a16ff087415d115b6ef8c3b3e
1 /**
2  * (C) Copyright 2007-2008 Jeremy Maitin-Shepard
3  *
4  * Use, modification, and distribution are subject to the terms specified in the
5  * COPYING file.
6 **/
8 require("interactive.js");
10 function define_global_mode(name, enable, disable)
12     var hyphen_name = name.replace("_","-","g");
13     var state = name + "_enabled";
14     this[state] = false;
15     var enable_hook_name = hyphen_name + "-enable-hook";
16     var disable_hook_name = hyphen_name + "-disable-hook";
17     define_hook(enable_hook_name);
18     define_hook(disable_hook_name);
19     var func = function (arg) {
20         var curstate = conkeror[state];
21         var newstate = (arg == null) ? !curstate : (arg > 0);
22         if (curstate == newstate)
23             return;
24         conkeror[state] = newstate;
25         if (newstate) {
26             enable();
27             conkeror[enable_hook_name].run();
28         } else {
29             disable();
30             conkeror[disable_hook_name].run();
31         }
32     };
33     this[name] = func;
34     interactive(hyphen_name, null, function (I) {
35         var arg = I.P;
36         func(arg && univ_arg_to_number(arg));
37         I.minibuffer.message(hyphen_name + (conkeror[state] ? " enabled" : " disabled"));
38     });
40 ignore_function_for_get_caller_source_code_reference("define_global_mode");