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