1 | /* |
---|
2 | * neercs console-based window manager |
---|
3 | * Copyright (c) 2006 Sam Hocevar <sam@zoy.org> |
---|
4 | * 2008 Jean-Yves Lamoureux <jylam@lnxscene.org> |
---|
5 | * 2008 Pascal Terjan <pterjan@linuxfr.org> |
---|
6 | * All Rights Reserved |
---|
7 | * |
---|
8 | * $Id: input.c 2493 2008-06-27 17:55:06Z sam $ |
---|
9 | * |
---|
10 | * This program is free software. It comes without any warranty, to |
---|
11 | * the extent permitted by applicable law. You can redistribute it |
---|
12 | * and/or modify it under the terms of the Do What The Fuck You Want |
---|
13 | * To Public License, Version 2, as published by Sam Hocevar. See |
---|
14 | * http://sam.zoy.org/wtfpl/COPYING for more details. |
---|
15 | */ |
---|
16 | #include "config.h" |
---|
17 | #include <caca.h> |
---|
18 | #include <string.h> |
---|
19 | #include "neercs.h" |
---|
20 | |
---|
21 | struct kconv { |
---|
22 | unsigned int key; |
---|
23 | char *val; |
---|
24 | int size; |
---|
25 | }; |
---|
26 | |
---|
27 | struct kconv kconv[] = { |
---|
28 | {CACA_KEY_UP, "\x1b[A", 3}, |
---|
29 | {CACA_KEY_DOWN, "\x1b[B", 3}, |
---|
30 | {CACA_KEY_RIGHT, "\x1b[C", 3}, |
---|
31 | {CACA_KEY_LEFT, "\x1b[D", 3}, |
---|
32 | {CACA_KEY_PAGEUP, "\x1b[5~", 4}, |
---|
33 | {CACA_KEY_PAGEDOWN,"\x1b[6~", 4}, |
---|
34 | {CACA_KEY_HOME, "\x1b[1~", 4}, |
---|
35 | {CACA_KEY_INSERT, "\x1b[2~", 4}, |
---|
36 | {CACA_KEY_DELETE, "\x1b[3~", 4}, |
---|
37 | {CACA_KEY_END, "\x1b[4~", 4}, |
---|
38 | {CACA_KEY_F1, "\x1b[11~", 5}, |
---|
39 | {CACA_KEY_F2, "\x1b[12~", 5}, |
---|
40 | {CACA_KEY_F3, "\x1b[13~", 5}, |
---|
41 | {CACA_KEY_F4, "\x1b[14~", 5}, |
---|
42 | {CACA_KEY_F5, "\x1b[15~", 5}, |
---|
43 | {CACA_KEY_F6, "\x1b[17~", 5}, |
---|
44 | {CACA_KEY_F7, "\x1b[18~", 5}, |
---|
45 | {CACA_KEY_F8, "\x1b[19~", 5}, |
---|
46 | {CACA_KEY_F9, "\x1b[20~", 5}, |
---|
47 | {CACA_KEY_F10, "\x1b[21~", 5}, |
---|
48 | {CACA_KEY_F11, "\x1b[23~", 5}, |
---|
49 | {CACA_KEY_F12, "\x1b[24~", 5}, |
---|
50 | }; |
---|
51 | |
---|
52 | |
---|
53 | |
---|
54 | void *convert_input_ansi(unsigned int *c, int *size) |
---|
55 | { |
---|
56 | unsigned int i; |
---|
57 | for(i = 0; i < sizeof(kconv) / sizeof(struct kconv); i++) |
---|
58 | { |
---|
59 | if(*c==kconv[i].key) |
---|
60 | { |
---|
61 | *size = kconv[i].size; |
---|
62 | return kconv[i].val; |
---|
63 | } |
---|
64 | } |
---|
65 | |
---|
66 | *size = 1; |
---|
67 | return c; |
---|
68 | } |
---|
69 | |
---|
70 | |
---|
71 | |
---|
72 | int handle_command_input(struct screen_list*screen_list, unsigned int c) |
---|
73 | { |
---|
74 | int refresh = 0; |
---|
75 | |
---|
76 | debug("Key %x\n", c); |
---|
77 | screen_list->changed = 1; |
---|
78 | |
---|
79 | if(c >= '0' && c<='9') |
---|
80 | { |
---|
81 | int n = c-49; |
---|
82 | if(n<screen_list->count) { |
---|
83 | screen_list->prevpty = screen_list->pty; |
---|
84 | screen_list->pty = n==-1?10:n; |
---|
85 | return 1; |
---|
86 | } else { |
---|
87 | return 0; |
---|
88 | } |
---|
89 | } |
---|
90 | |
---|
91 | switch(c) |
---|
92 | { |
---|
93 | case 0x01: //CACA_KEY_CTRL_A: |
---|
94 | screen_list->pty ^= screen_list->prevpty; |
---|
95 | screen_list->prevpty ^= screen_list->pty; |
---|
96 | screen_list->pty ^= screen_list->prevpty; |
---|
97 | refresh = 1; |
---|
98 | break; |
---|
99 | case 'm': |
---|
100 | case 0x0d: //CACA_KEY_CTRL_M: |
---|
101 | screen_list->mini = !screen_list->mini; |
---|
102 | refresh = 1; |
---|
103 | break; |
---|
104 | case 'n': |
---|
105 | case ' ': |
---|
106 | case '\0': |
---|
107 | case 0x0e: //CACA_KEY_CTRL_N: |
---|
108 | screen_list->prevpty = screen_list->pty; |
---|
109 | screen_list->pty = (screen_list->pty + 1) % screen_list->count; |
---|
110 | refresh = 1; |
---|
111 | break; |
---|
112 | case 'p': |
---|
113 | case 0x10: //CACA_KEY_CTRL_P: |
---|
114 | screen_list->prevpty = screen_list->pty; |
---|
115 | screen_list->pty = (screen_list->pty + screen_list->count - 1) % screen_list->count; |
---|
116 | refresh = 1; |
---|
117 | break; |
---|
118 | case 'c': |
---|
119 | case 0x03: //CACA_KEY_CTRL_C: |
---|
120 | screen_list->prevpty = screen_list->pty; |
---|
121 | screen_list->pty = |
---|
122 | add_screen(screen_list, |
---|
123 | create_screen(screen_list->width, |
---|
124 | screen_list->height, |
---|
125 | screen_list->default_shell)); |
---|
126 | refresh = 1; |
---|
127 | break; |
---|
128 | case 'w': |
---|
129 | case 0x17: //CACA_KEY_CTRL_W: |
---|
130 | screen_list->wm_type = (screen_list->wm_type==(WM_MAX-1)? |
---|
131 | screen_list->wm_type=0: |
---|
132 | screen_list->wm_type+1); |
---|
133 | refresh = 1; |
---|
134 | break; |
---|
135 | case 'k': |
---|
136 | case 0x0b: //CACA_KEY_CTRL_K: |
---|
137 | add_recurrent(screen_list->recurrent_list, close_screen_recurrent, screen_list->cv); |
---|
138 | refresh = 1; |
---|
139 | break; |
---|
140 | case 'x': |
---|
141 | case 0x18: //CACA_KEY_CTRL_X: |
---|
142 | memset(screen_list->lockpass, 0, 1024); |
---|
143 | screen_list->locked = 1; |
---|
144 | screen_list->lock_offset = 0; |
---|
145 | refresh = 1; |
---|
146 | break; |
---|
147 | case 'h': |
---|
148 | case '?': |
---|
149 | case 0x08: //CACA_KEY_CTRL_H: |
---|
150 | screen_list->help = !screen_list->help; |
---|
151 | refresh = 1; |
---|
152 | break; |
---|
153 | case '"': |
---|
154 | case 0x34: //CTRL+" |
---|
155 | screen_list->cur_in_list = screen_list->pty; |
---|
156 | screen_list->window_list = !screen_list->window_list; |
---|
157 | refresh = 1; |
---|
158 | break; |
---|
159 | case 'd': |
---|
160 | case 0x04: //CACA_KEY_CTRL_D: |
---|
161 | detach(screen_list); |
---|
162 | break; |
---|
163 | } |
---|
164 | return refresh; |
---|
165 | |
---|
166 | } |
---|