source: keys.c @ 366558f

release-1.6release-1.7release-1.8release-1.9
Last change on this file since 366558f was 2a17b63, checked in by Nelson Elhage <nelhage@mit.edu>, 12 years ago
Push and pop contexts whenever we change context. This allows us to get rid of the awful hack in owl_process_input_char, and opens the path to being able to invoke popup windows from the editwin and vice versa (In fact, you can now do so without segfaulting, although the display layer does not yet quite do the right thing).
  • Property mode set to 100644
File size: 14.9 KB
Line 
1#include "owl.h"
2
3#define BIND_CMD(kpress, command, desc) \
4         owl_keymap_create_binding(km, kpress, command, NULL, desc)
5
6#define BIND_FNV(kpress, fn, desc) \
7         owl_keymap_create_binding(km, kpress, NULL, fn, desc)
8
9
10/* sets up the default keymaps */
11void owl_keys_setup_keymaps(owl_keyhandler *kh) {
12  owl_keymap *km, *km_global, *km_editwin, *km_mainwin,
13    *km_ew_multi, *km_ew_onel, *km_viewwin;
14
15 
16  /****************************************************************/
17  /*************************** GLOBAL *****************************/
18  /****************************************************************/
19
20  km_global = km = owl_keyhandler_create_and_add_keymap(kh, "global",
21       "System-wide default key bindings", 
22       owl_keys_default_invalid, NULL, NULL);
23  BIND_CMD("C-z",      "message Use :suspend to suspend.", "");
24
25  /****************************************************************/
26  /***************************** EDIT *****************************/
27  /****************************************************************/
28
29  km_editwin = km = owl_keyhandler_create_and_add_keymap(kh, "edit",
30       "Text editing and command window", 
31       owl_keys_editwin_default, NULL, owl_keys_editwin_postalways);
32  owl_keymap_set_submap(km_editwin, km_global);
33  /*
34  BIND_CMD("F1",          "help",            "");
35  BIND_CMD("HELP",        "help",            "");
36  BIND_CMD("M-[ 2 8 ~",   "help",            "");
37  */
38
39  BIND_CMD("C-c",         "edit:cancel", "");
40  BIND_CMD("C-g",         "edit:cancel", "");
41
42  BIND_CMD("M-f",         "edit:move-next-word", "");
43  BIND_CMD("M-O 3 C",     "edit:move-next-word", "");
44  BIND_CMD("M-RIGHT",     "edit:move-next-word", "");
45  BIND_CMD("M-[ 1 ; 3 D", "edit:move-next-word", "");
46  BIND_CMD("M-b",         "edit:move-prev-word", "");
47  BIND_CMD("M-O 3 D",     "edit:move-prev-word", "");
48  BIND_CMD("M-LEFT",      "edit:move-prev-word", "");
49  BIND_CMD("M-[ 1 ; 3 C", "edit:move-next-word", "");
50
51  BIND_CMD("LEFT",        "edit:move-left", "");
52  BIND_CMD("M-[ D",       "edit:move-left", "");
53  BIND_CMD("C-b",         "edit:move-left", "");
54  BIND_CMD("RIGHT",       "edit:move-right", "");
55  BIND_CMD("M-[ C",       "edit:move-right", "");
56  BIND_CMD("C-f",         "edit:move-right", "");
57
58  BIND_CMD("M-<",         "edit:move-to-buffer-start", "");
59  BIND_CMD("HOME",        "edit:move-to-buffer-start", "");
60  BIND_CMD("M->",         "edit:move-to-buffer-end", "");
61  BIND_CMD("END",         "edit:move-to-buffer-end", "");
62
63  BIND_CMD("C-a",         "edit:move-to-line-start", "");
64  BIND_CMD("C-e",         "edit:move-to-line-end", "");
65
66  BIND_CMD("M-BACKSPACE", "edit:delete-prev-word", "");
67  BIND_CMD("M-DELETE",    "edit:delete-prev-word", "");
68  BIND_CMD("M-d",         "edit:delete-next-word", "");
69  BIND_CMD("M-DC",        "edit:delete-next-word", "");
70  BIND_CMD("M-[ 3 ; 3 ~", "edit:delete-next-word", "");
71
72  BIND_CMD("C-h",         "edit:delete-prev-char", "");
73  BIND_CMD("BACKSPACE",   "edit:delete-prev-char", "");
74  BIND_CMD("DELETE",      "edit:delete-prev-char", "");
75  BIND_CMD("C-d",         "edit:delete-next-char", "");
76  BIND_CMD("DC",          "edit:delete-next-char", "");
77
78  BIND_CMD("C-k",         "edit:delete-to-line-end", "");
79
80  BIND_CMD("C-t",         "edit:transpose-chars", "");
81
82  BIND_CMD("M-q",         "edit:fill-paragraph", "");
83
84  BIND_CMD("C-@",         "edit:set-mark", "");
85  BIND_CMD("C-x C-x",     "edit:exchange-point-and-mark", "");
86
87  BIND_CMD("M-w",         "edit:copy-region-as-kill", "");
88  BIND_CMD("C-w",         "edit:kill-region", "");
89  BIND_CMD("C-y",         "edit:yank", "");
90
91  BIND_CMD("C-l",         "( edit:recenter ; redisplay )", "");
92
93
94  /****************************************************************/
95  /**************************** EDITMULTI *************************/
96  /****************************************************************/
97
98  km_ew_multi = km = owl_keyhandler_create_and_add_keymap(kh, "editmulti",
99       "Multi-line text editing", 
100       owl_keys_editwin_default, NULL, owl_keys_editwin_postalways);
101  owl_keymap_set_submap(km_ew_multi, km_editwin);
102
103  BIND_CMD("UP",      "edit:move-up-line", "");
104  BIND_CMD("M-[ A",   "edit:move-up-line", "");
105  BIND_CMD("C-p",     "edit:move-up-line", "");
106  BIND_CMD("DOWN",    "edit:move-down-line", "");
107  BIND_CMD("M-[ B",   "edit:move-down-line", "");
108  BIND_CMD("C-n",     "edit:move-down-line", "");
109
110  BIND_CMD("M-}",     "edit:forward-paragraph", "");
111  BIND_CMD("M-{",     "edit:backward-paragraph", "");
112
113  /* This would be nice, but interferes with C-c to cancel */
114  /*BIND_CMD("C-c C-c", "edit:done", "sends the zephyr");*/
115
116  BIND_CMD("M-p",         "edit:history-prev", "");
117  BIND_CMD("M-n",         "edit:history-next", "");
118
119  /* note that changing "disable-ctrl-d" to "on" will change this to
120   * edit:delete-next-char */
121  BIND_CMD("C-d",     "edit:done-or-delete", "sends the zephyr if at the end of the message");
122
123
124  /****************************************************************/
125  /**************************** EDITLINE **************************/
126  /****************************************************************/
127
128  km_ew_onel = km = owl_keyhandler_create_and_add_keymap(kh, "editline",
129       "Single-line text editing", 
130       owl_keys_editwin_default, NULL, owl_keys_editwin_postalways);
131  owl_keymap_set_submap(km_ew_onel, km_editwin);
132
133  BIND_CMD("C-u",         "edit:delete-all", "Clears the entire line");
134
135  BIND_CMD("UP",          "edit:history-prev", "");
136  BIND_CMD("M-[ A",       "edit:history-prev", "");
137  BIND_CMD("C-p",         "edit:history-prev", "");
138  BIND_CMD("M-p",         "edit:history-prev", "");
139
140  BIND_CMD("DOWN",        "edit:history-next", "");
141  BIND_CMD("M-[ B",       "edit:history-next", "");
142  BIND_CMD("C-n",         "edit:history-next", "");
143  BIND_CMD("M-n",         "edit:history-next", "");
144
145  BIND_CMD("LF",          "editline:done", "executes the command");
146  BIND_CMD("CR",          "editline:done", "executes the command");
147
148 
149  /****************************************************************/
150  /**************************** EDITRESPONSE **********************/
151  /****************************************************************/
152
153  km_ew_onel = km = owl_keyhandler_create_and_add_keymap(kh, "editresponse",
154       "Single-line response to question", 
155       owl_keys_editwin_default, NULL, owl_keys_editwin_postalways);
156  owl_keymap_set_submap(km_ew_onel, km_editwin);
157
158  BIND_CMD("C-u",         "edit:delete-all", "Clears the entire line");
159
160  BIND_CMD("LF",          "editresponse:done", "executes the command");
161  BIND_CMD("CR",          "editresponse:done", "executes the command");
162
163
164  /****************************************************************/
165  /**************************** POPLESS ***************************/
166  /****************************************************************/
167
168  km_viewwin = km = owl_keyhandler_create_and_add_keymap(kh, "popless",
169       "Pop-up window (eg, help)", 
170       owl_keys_default_invalid, NULL, owl_keys_popless_postalways);
171  owl_keymap_set_submap(km_viewwin, km_global);
172
173  BIND_CMD("SPACE",       "popless:scroll-down-page", "");
174  BIND_CMD("NPAGE",       "popless:scroll-down-page", "");
175  BIND_CMD("M-n",         "popless:scroll-down-page", "");
176  BIND_CMD("C-v",         "popless:scroll-down-page", "");
177
178  BIND_CMD("b",           "popless:scroll-up-page", "");
179  BIND_CMD("PPAGE",       "popless:scroll-up-page", "");
180  BIND_CMD("M-p",         "popless:scroll-up-page", "");
181  BIND_CMD("M-v",         "popless:scroll-up-page", "");
182
183  BIND_CMD("CR",          "popless:scroll-down-line", "");
184  BIND_CMD("LF",          "popless:scroll-down-line", "");
185  BIND_CMD("DOWN",        "popless:scroll-down-line", "");
186  BIND_CMD("M-[ B",       "popless:scroll-down-line", "");
187  BIND_CMD("C-n",         "popless:scroll-down-line", "");
188
189  BIND_CMD("UP",          "popless:scroll-up-line", "");
190  BIND_CMD("M-[ A",       "popless:scroll-up-line", "");
191  BIND_CMD("C-h",         "popless:scroll-up-line", "");
192  BIND_CMD("C-p",         "popless:scroll-up-line", "");
193  BIND_CMD("DELETE",      "popless:scroll-up-line", "");
194  BIND_CMD("BACKSPACE",   "popless:scroll-up-line", "");
195  BIND_CMD("DC",          "popless:scroll-up-line", "");
196
197  BIND_CMD("RIGHT",       "popless:scroll-right 10", "scrolls right");
198  BIND_CMD("M-[ C",       "popless:scroll-right 10", "scrolls right");
199  BIND_CMD("LEFT",        "popless:scroll-left  10", "scrolls left");
200  BIND_CMD("M-[ D",       "popless:scroll-left  10", "scrolls left");
201
202  BIND_CMD("HOME",        "popless:scroll-to-top", "");
203  BIND_CMD("<",           "popless:scroll-to-top", "");
204  BIND_CMD("M-<",         "popless:scroll-to-top", "");
205
206  BIND_CMD("END",         "popless:scroll-to-bottom", "");
207  BIND_CMD(">",           "popless:scroll-to-bottom", "");
208  BIND_CMD("M->",         "popless:scroll-to-bottom", "");
209
210  BIND_CMD("q",           "popless:quit", "");
211  BIND_CMD("C-c",         "popless:quit", "");
212  BIND_CMD("C-g",         "popless:quit", "");
213
214  BIND_CMD("C-l",         "redisplay", "");
215
216
217  /****************************************************************/
218  /***************************** RECV *****************************/
219  /****************************************************************/
220
221  km_mainwin = km = owl_keyhandler_create_and_add_keymap(kh, "recv",
222        "Main window / message list",
223        owl_keys_default_invalid, owl_keys_recwin_prealways, NULL);
224  owl_keymap_set_submap(km_mainwin, km_global);
225  BIND_CMD("C-x C-c", "start-command quit", "");
226  BIND_CMD("F1",      "help",           "");
227  BIND_CMD("h",       "help",           "");
228  BIND_CMD("HELP",    "help",           "");
229  BIND_CMD("M-[ 2 8 ~",   "help",       "");
230
231  BIND_CMD(":",       "start-command",  "start a new command");
232  BIND_CMD("M-x",     "start-command",  "start a new command");
233
234  BIND_CMD("x",       "expunge",        "");
235  BIND_CMD("u",       "undelete",       "");
236  BIND_CMD("M-u",     "undelete view",  "undelete all messages in view");
237  BIND_CMD("d",       "delete",         "mark message for deletion");
238  BIND_CMD("M-D",     "delete view",    "mark all messages in view for deletion");
239  BIND_CMD("C-x k",   "smartzpunt -i",  "zpunt current <class,instance>");
240
241  BIND_CMD("X",   "( expunge ; view --home )", "expunge deletions and switch to home view");
242
243  BIND_CMD("v",   "start-command view ", "start a view command");
244  BIND_CMD("V",   "view --home",      "change to the home view ('all' by default)");
245  BIND_CMD("!",   "view -r",          "invert the current view filter");
246  BIND_CMD("M-n", "smartnarrow",      "narrow to a view based on the current message");
247  BIND_CMD("M-N", "smartnarrow -i",   "narrow to a view based on the current message, and consider instance pair");
248  BIND_CMD("M-p", "view personal", "");
249 
250  BIND_CMD("/",   "start-command search ", "start a search command");
251  BIND_CMD("?",   "start-command search -r ", "start a reverse search command");
252
253  BIND_CMD("HOME",   "recv:setshift 0","move the display all the way left");
254  BIND_CMD("LEFT",   "recv:shiftleft", "");
255  BIND_CMD("M-[ D",  "recv:shiftleft", "");
256  BIND_CMD("RIGHT",  "recv:shiftright","");
257  BIND_CMD("M-[ C",  "recv:shiftright","");
258  BIND_CMD("DOWN",   "recv:next",      "");
259  BIND_CMD("C-n",    "recv:next",      "");
260  BIND_CMD("M-[ B",  "recv:next",      "");
261  BIND_CMD("M-C-n",  "recv:next --smart-filter", "move to next message matching the current one"); 
262  BIND_CMD("UP",     "recv:prev",      "");
263  BIND_CMD("M-[ A",  "recv:prev",      "");
264  BIND_CMD("n",      "recv:next-notdel", "");
265  BIND_CMD("p",      "recv:prev-notdel", "");
266  BIND_CMD("C-p",    "recv:prev",        "");
267  BIND_CMD("M-C-p",  "recv:prev --smart-filter", "move to previous message matching the current one");
268  BIND_CMD("P",      "recv:next-personal", "");
269  BIND_CMD("M-P",    "recv:prev-personal", "");
270  BIND_CMD("M-<",    "recv:first",     "");
271  BIND_CMD("<",      "recv:first",     "");
272  BIND_CMD("M->",    "recv:last",      "");
273  BIND_CMD(">",      "recv:last",      "");
274  BIND_CMD("C-v",    "recv:pagedown",  "");
275  BIND_CMD("NPAGE",  "recv:pagedown",  "");
276  BIND_CMD("M-v",    "recv:pageup",    "");
277  BIND_CMD("PPAGE",  "recv:pageup",    "");
278  BIND_CMD("C-@",    "recv:mark",      "");
279  BIND_CMD("C-x C-x",    "recv:swapmark",  "");
280
281  BIND_CMD("SPACE",     "recv:scroll  10", "scroll message down a page");
282  BIND_CMD("CR",        "recv:scroll   1", "scroll message down a line");
283  BIND_CMD("LF",        "recv:scroll   1", "scroll message down a line");
284  BIND_CMD("C-h"  ,     "recv:scroll  -1", "scroll message up a line");
285  BIND_CMD("DELETE",    "recv:scroll  -1", "scroll message up a line");
286  BIND_CMD("BACKSPACE", "recv:scroll  -1", "scroll message up a line");
287  BIND_CMD("DC",        "recv:scroll  -1", "scroll message up a line");
288  BIND_CMD("b",         "recv:scroll -10", "scroll message up a page");
289
290  BIND_CMD("C-l",       "redisplay",       "");
291
292  BIND_CMD("i",   "info",             "");
293  BIND_CMD("l",   "blist",            "");
294  BIND_CMD("B",   "alist",            "");
295  BIND_CMD("M",   "pop-message",      "");
296  BIND_CMD("T",   "delete trash",     "mark all 'trash' messages for deletion");
297
298  BIND_CMD("o",   "toggle-oneline", "");
299
300  BIND_CMD("A",   "away toggle",     "toggles away message on and off");
301
302  BIND_CMD("z",   "start-command zwrite ", "start a zwrite command");
303  BIND_CMD("a",   "start-command aimwrite ", "start an aimwrite command");
304  BIND_CMD("r",   "reply",            "reply to the current message");
305  BIND_CMD("R",   "reply sender",     "reply to sender of the current message");
306  BIND_CMD("C-r", "reply -e",         "reply to the current message, but allow editing of recipient");
307  BIND_CMD("M-r", "reply -e",         "reply to the current message, but allow editing of recipient");
308  BIND_CMD("M-R", "reply -e sender",  "reply to sender of the current message, but allow editing of recipient");
309
310  BIND_CMD("W",   "start-command webzephyr ", "start a webzephyr command");
311
312  BIND_CMD("C-c",  "",                "no effect in this mode");
313  BIND_CMD("C-g",  "",                "no effect in this mode");
314}
315
316
317/****************************************************************/
318/********************* Support Functions ************************/
319/****************************************************************/
320
321void owl_keys_recwin_prealways(owl_input j) {
322  /* Clear the message line on subsequent key presses */
323  owl_function_makemsg("");
324}
325
326void owl_keys_editwin_default(owl_input j) {
327  owl_editwin *e;
328  if (NULL != (e=owl_global_get_typwin(&g))) {
329       owl_editwin_process_char(e, j);
330  }
331}
332
333void owl_keys_editwin_postalways(owl_input j) {
334  owl_editwin *e;
335  if (NULL != (e=owl_global_get_typwin(&g))) {
336    owl_editwin_post_process_char(e, j);
337  }
338  owl_global_set_needrefresh(&g);
339}
340
341void owl_keys_popless_postalways(owl_input j) {
342  owl_viewwin *v = owl_global_get_viewwin(&g);
343  const owl_popwin *pw = owl_global_get_popwin(&g);
344
345  if (pw && owl_popwin_is_active(pw) && v) {
346    owl_popwin_refresh(pw);
347    owl_viewwin_redisplay(v, 1);
348  } 
349}
350
351void owl_keys_default_invalid(owl_input j) {
352  if (j.ch==ERR) return;
353  if (j.ch==410) return;
354  owl_keyhandler_invalidkey(owl_global_get_keyhandler(&g));
355}
356
Note: See TracBrowser for help on using the repository browser.