chiark / gitweb /
*** empty log message ***
[sympathy.git] / src / keydis.c
1 /*
2  * keydis.c:
3  *
4  * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
5  * All rights reserved.
6  *
7  */
8
9 static char rcsid[] = "$Id$";
10
11 /*
12  * $Log$
13  * Revision 1.8  2008/02/28 16:57:52  james
14  * *** empty log message ***
15  *
16  * Revision 1.7  2008/02/28 16:37:16  james
17  * *** empty log message ***
18  *
19  * Revision 1.6  2008/02/28 12:12:25  james
20  * *** empty log message ***
21  *
22  * Revision 1.5  2008/02/23 11:48:37  james
23  * *** empty log message ***
24  *
25  * Revision 1.4  2008/02/22 17:07:00  james
26  * *** empty log message ***
27  *
28  * Revision 1.3  2008/02/15 23:52:12  james
29  * *** empty log message ***
30  *
31  * Revision 1.2  2008/02/15 03:32:07  james
32  * *** empty log message ***
33  *
34  * Revision 1.1  2008/02/14 02:46:44  james
35  * *** empty log message ***
36  *
37  * Revision 1.1  2008/02/14 01:55:57  james
38  * *** empty log message ***
39  *
40  */
41
42
43 #include "project.h"
44
45 #define CMD_BUFLEN      128
46
47 typedef struct
48 {
49   KEYDIS_SIGNATURE;
50 } KeyDis_VT102;
51
52 typedef struct
53 {
54   KEYDIS_SIGNATURE;
55   Socket *s;
56 } KeyDis_IPC;
57
58
59 static void
60 keydis_close (KeyDis * t)
61 {
62   free (t);
63 }
64
65
66 static int
67 keydis_ipc_key (KeyDis * _t, Context * c, int key)
68 {
69   KeyDis_IPC *t = (KeyDis_IPC *) _t;
70
71   return ipc_msg_send_key (t->s, key);
72 }
73
74 static int
75 keydis_ipc_set_baud (KeyDis * _t, Context * c, int baud)
76 {
77   KeyDis_IPC *t = (KeyDis_IPC *) _t;
78
79   ipc_msg_send_setbaud (t->s, baud);
80
81   return 0;
82 }
83
84 static int
85 keydis_ipc_send_break (KeyDis * _t, Context * c)
86 {
87   KeyDis_IPC *t = (KeyDis_IPC *) _t;
88
89   ipc_msg_send_sendbreak (t->s);
90
91   return 0;
92 }
93
94 static int
95 keydis_ipc_set_flow (KeyDis * _t, Context * c, int flow)
96 {
97   KeyDis_IPC *t = (KeyDis_IPC *) _t;
98
99   ipc_msg_send_setflow (t->s, flow);
100
101   return 0;
102 }
103
104
105 static int
106 keydis_ipc_set_ansi (KeyDis * _t, Context * c, int ansi)
107 {
108   KeyDis_IPC *t = (KeyDis_IPC *) _t;
109
110   vt102_set_ansi (c->v, ansi);
111
112   ipc_msg_send_setansi (t->s, ansi);
113
114   return 0;
115 }
116
117
118 static int
119 keydis_ipc_hangup (KeyDis * _t, Context * c)
120 {
121   KeyDis_IPC *t = (KeyDis_IPC *) _t;
122
123   ipc_msg_send_hangup (t->s);
124
125   return 0;
126 }
127
128
129 static int
130 keydis_ipc_set_size (KeyDis * _t, Context * c, int w, int h)
131 {
132   CRT_Pos p = { w, h };
133
134   KeyDis_IPC *t = (KeyDis_IPC *) _t;
135
136   vt102_resize (c, p);
137   ipc_msg_send_setsize (t->s, p);
138
139   return 0;
140 }
141
142
143 static int
144 keydis_ipc_reset (KeyDis * _t, Context * c)
145 {
146   KeyDis_IPC *t = (KeyDis_IPC *) _t;
147
148   vt102_reset (c);
149   ipc_msg_send_reset (t->s);
150
151   return 0;
152 }
153
154 static int
155 keydis_vt102_key (KeyDis * _t, Context * c, int key)
156 {
157   KeyDis_VT102 *t = (KeyDis_VT102 *) _t;
158
159   vt102_send (c, key);
160   return 0;
161 }
162
163 static int
164 keydis_vt102_set_baud (KeyDis * _t, Context * c, int baud)
165 {
166   KeyDis_VT102 *t = (KeyDis_VT102 *) _t;
167
168   tty_set_baud (c->t, baud);
169   tty_parse_reset (c);
170
171   log_f (c->l, "<baud changed to %d>", baud);
172
173   return 0;
174 }
175
176 static int
177 keydis_vt102_send_break (KeyDis * _t, Context * c)
178 {
179   KeyDis_VT102 *t = (KeyDis_VT102 *) _t;
180
181   tty_send_break (c->t);
182
183   return 0;
184 }
185
186 static int
187 keydis_vt102_set_flow (KeyDis * _t, Context * c, int flow)
188 {
189   KeyDis_VT102 *t = (KeyDis_VT102 *) _t;
190
191   tty_set_flow (c->t, flow);
192
193   return 0;
194 }
195
196 static int
197 keydis_vt102_set_ansi (KeyDis * _t, Context * c, int ansi)
198 {
199   KeyDis_VT102 *t = (KeyDis_VT102 *) _t;
200
201   if (c->v)
202     c->v->xn_glitch = ansi ? 0 : 1;
203   return 0;
204 }
205
206
207 static int
208 keydis_vt102_hangup (KeyDis * _t, Context * c)
209 {
210   KeyDis_VT102 *t = (KeyDis_VT102 *) _t;
211
212   tty_hangup (c->t);
213
214   return 0;
215 }
216
217 static int
218 keydis_vt102_set_size (KeyDis * _t, Context * c, int w, int h)
219 {
220   KeyDis_VT102 *t = (KeyDis_VT102 *) _t;
221   CRT_Pos p = { w, h };
222
223   vt102_resize (c, p);
224
225   return 0;
226 }
227
228 static int
229 keydis_vt102_reset (KeyDis * _t, Context * c)
230 {
231   KeyDis_VT102 *t = (KeyDis_VT102 *) _t;
232
233   vt102_reset (c);
234
235   return 0;
236 }
237
238
239
240 KeyDis *
241 keydis_vt102_new (void)
242 {
243   KeyDis_VT102 *t = malloc (sizeof (KeyDis_VT102));
244   t->key = keydis_vt102_key;
245   t->close = keydis_close;
246   t->set_baud = keydis_vt102_set_baud;
247   t->send_break = keydis_vt102_send_break;
248   t->set_flow = keydis_vt102_set_flow;
249   t->set_ansi = keydis_vt102_set_ansi;
250   t->hangup = keydis_vt102_hangup;
251   t->set_size = keydis_vt102_set_size;
252   t->reset = keydis_vt102_reset;
253   return (KeyDis *) t;
254 }
255
256
257 KeyDis *
258 keydis_ipc_new (Socket * s)
259 {
260   KeyDis_IPC *t = malloc (sizeof (KeyDis_IPC));
261   t->key = keydis_ipc_key;
262   t->close = keydis_close;
263   t->set_baud = keydis_ipc_set_baud;
264   t->send_break = keydis_ipc_send_break;
265   t->set_flow = keydis_ipc_set_flow;
266   t->set_ansi = keydis_ipc_set_ansi;
267   t->hangup = keydis_ipc_hangup;
268   t->set_size = keydis_ipc_set_size;
269   t->reset = keydis_ipc_reset;
270   t->s = s;
271   return (KeyDis *) t;
272 }
273
274
275
276
277
278
279 int
280 keydis_key (KeyDis * t, Context * c, int key)
281 {
282
283   if (!c->d)
284     return t->key (t, c, key);
285
286   cmd_show_status (c->d, c);
287
288   if (c->d->active)
289     return cmd_key (c->d, c, key);
290
291   if (key == CMD_KEY)
292     return cmd_activate (c->d, c);
293
294
295   return t->key (t, c, key);
296 }