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