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