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