~ubuntu-branches/ubuntu/lucid/joystick/lucid

« back to all changes in this revision

Viewing changes to xfree86/tuntitko-33.c

  • Committer: Bazaar Package Importer
  • Author(s): Edward Betts
  • Date: 2001-12-26 13:32:55 UTC
  • Revision ID: james.westby@ubuntu.com-20011226133255-hlp8fay1eq671xwn
Tags: upstream-20010903
ImportĀ upstreamĀ versionĀ 20010903

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/** Tintitko - the X Input driver for Linux input drivers
 
2
 * XFree86 v 3.3 dependend code
 
3
 * (c) 2000 0rfelyus (Tuhyk-Labs)
 
4
 */
 
5
 
 
6
#include "tuntitko-common.h"
 
7
#include <linux/input.h>
 
8
#include "xf86Procs.h"
 
9
#include <fcntl.h> /* for `open' etc. */
 
10
#include <unistd.h> /* for `close' .. */
 
11
 
 
12
/**********************************************************************/
 
13
 
 
14
#define TUN_INPUT_REG(NUM)  \
 
15
    xf86AddDeviceAssoc (&linput ## NUM ## _assoc)
 
16
   
 
17
#define TUN_INPUT_GEN(NUM)                                      \
 
18
                                                                \
 
19
static LocalDevicePtr                                           \
 
20
tunAllocate ## NUM ()                                           \
 
21
{                                                               \
 
22
  return tunAllocate (NUM, "LInput" #NUM);                      \
 
23
}                                                               \
 
24
                                                                \
 
25
DeviceAssocRec linput ## NUM ## _assoc =                        \
 
26
{                                                               \
 
27
  "linput" #NUM,                /* config_section_name */       \
 
28
  tunAllocate ## NUM            /* device_allocate */           \
 
29
}
 
30
 
 
31
/***********************************************************************/
 
32
 
 
33
#define ENDVALUATOR              1
 
34
#define DEVMIN                   2
 
35
#define DEVMAX                   3
 
36
#define DEVICEMAP                4
 
37
#define REVERSE                  5
 
38
#define MOUSEWHEELHACK           6
 
39
#define DEVICENAME               7
 
40
#define DEVICE                   8
 
41
#define NOAUTOCONFIG             9
 
42
#define ABSOLUTE                10
 
43
#define TIMEDELTA               11
 
44
#define REL_VALUATOR            12
 
45
#define ABS_VALUATOR            13
 
46
#define BUTTON                  14
 
47
#define DISABLE                 15
 
48
#define DONT_FINISH_UNASIGNED   16
 
49
 
 
50
 
 
51
static SymTabRec ValuatorTab [] = {
 
52
  { ENDVALUATOR,                "endvaluator"},
 
53
 
 
54
  { DEVMIN,                     "min"},
 
55
  { DEVMAX,                     "max"},
 
56
 
 
57
  { DEVICEMAP,                  "map" },
 
58
  { REVERSE,                    "reverse" },
 
59
  { MOUSEWHEELHACK,             "mousewheelhack"},
 
60
  { DISABLE,                    "disable"},
 
61
  { -1,                         ""},
 
62
};
 
63
 
 
64
static SymTabRec TunTab [] = {
 
65
  { ENDSUBSECTION,              "endsubsection"},
 
66
  { DONT_FINISH_UNASIGNED,      "dontfinishunasigned"},
 
67
 
 
68
  { DEVICENAME,                 "devicename" },
 
69
  { DEVICE,                     "device" },
 
70
  { NOAUTOCONFIG,               "noautoconfig"},
 
71
  { ABSOLUTE,                   "absolute"},
 
72
  { TIMEDELTA,                  "timedelta"},
 
73
 
 
74
  { REL_VALUATOR,               "relativevaluator"},
 
75
  { ABS_VALUATOR,               "absolutevaluator"},
 
76
  { BUTTON,                     "button"},
 
77
 
 
78
  { -1,                         "" }  /* * */
 
79
};
 
80
 
 
81
TUN_INPUT_GEN (0);
 
82
TUN_INPUT_GEN (1);
 
83
TUN_INPUT_GEN (2);
 
84
TUN_INPUT_GEN (3);
 
85
TUN_INPUT_GEN (4);
 
86
TUN_INPUT_GEN (5);
 
87
TUN_INPUT_GEN (6);
 
88
TUN_INPUT_GEN (7);
 
89
 
 
90
void
 
91
tunConfigAbsValuator (LocalDevicePtr    local,
 
92
                      TunDevicePtr      tun,
 
93
                      TunValuatorPtr    valuator,
 
94
                      LexPtr            val)
 
95
{
 
96
  int           token;
 
97
 
 
98
  TLOG ("[%s] Configuring valuator %d (%s)", local->name, 
 
99
        valuator->lid, tunGetAbsValuatorName (valuator->lid));
 
100
 
 
101
  while ((token = xf86GetToken (ValuatorTab)) != ENDVALUATOR)
 
102
    switch (token)
 
103
      {
 
104
      case DEVICEMAP:
 
105
        if (xf86GetToken (NULL) != NUMBER || val->num < 0)
 
106
          xf86ConfigError ("Valuator number expected");
 
107
 
 
108
        if (valuator->xiv >= 0)
 
109
          tun->xval_to_lval_tbl [valuator->xiv] = NULL;   
 
110
 
 
111
        tunDeviceRecForceXValuators (tun, val->num);
 
112
 
 
113
        if (tun->xval_to_lval_tbl [val->num] != NULL)
 
114
          tun->xval_to_lval_tbl [val->num] -> xiv = TUN_VALUATOR_UNASSIGNED;
 
115
 
 
116
        tun->xval_to_lval_tbl [val->num] = valuator;
 
117
        valuator->xiv = val->num;
 
118
        break;
 
119
 
 
120
      case REVERSE:
 
121
        if (xf86GetToken (NULL) != NUMBER)
 
122
          xf86ConfigError ("0 or 1 expected");
 
123
        valuator->upsidedown = (val->num != 0);
 
124
        break;
 
125
 
 
126
      case DISABLE:
 
127
        if (valuator->xiv >= 0)
 
128
          tun->xval_to_lval_tbl [valuator->xiv] = NULL;
 
129
        valuator->xiv = TUN_VALUATOR_DISABLED;
 
130
        break;
 
131
 
 
132
      case DEVMIN:
 
133
      case DEVMAX:
 
134
      case MOUSEWHEELHACK:
 
135
        xf86ConfigError ("Only relative valuators can use this option");
 
136
        break;
 
137
 
 
138
      case EOF:
 
139
        FatalError("Unexpected EOF (missing EndSubSection)");
 
140
        break; /* :-) */
 
141
      default:
 
142
        xf86ConfigError("LInput valuator subsection keyword expected");
 
143
        break;
 
144
      }
 
145
}
 
146
 
 
147
 
 
148
void
 
149
tunConfigRelValuator (LocalDevicePtr    local,
 
150
                      TunDevicePtr      tun,
 
151
                      TunValuatorPtr    valuator,
 
152
                      LexPtr            val)
 
153
{
 
154
  int           token;
 
155
 
 
156
  TLOG ("[%s] Configuring valuator %d (%s)", local->name, 
 
157
        valuator->lid, tunGetRelValuatorName (valuator->lid));
 
158
 
 
159
  while ((token = xf86GetToken (ValuatorTab)) != ENDVALUATOR)
 
160
    switch (token)
 
161
      {
 
162
      case DEVICEMAP:
 
163
        if (xf86GetToken (NULL) != NUMBER || val->num < 0)
 
164
          xf86ConfigError ("Valuator number expected");
 
165
 
 
166
        if (valuator->xiv >= 0)
 
167
          tun->xval_to_lval_tbl [valuator->xiv] = NULL;   
 
168
 
 
169
        tunDeviceRecForceXValuators (tun, val->num);
 
170
 
 
171
        if (tun->xval_to_lval_tbl [val->num] != NULL)
 
172
          tun->xval_to_lval_tbl [val->num] -> xiv = TUN_VALUATOR_UNASSIGNED;
 
173
 
 
174
        tun->xval_to_lval_tbl [val->num] = valuator;
 
175
        valuator->xiv = val->num;
 
176
        break;
 
177
 
 
178
      case REVERSE:
 
179
        if (xf86GetToken (NULL) != NUMBER)
 
180
          xf86ConfigError ("0 or 1 expected");
 
181
        valuator->upsidedown = (val->num != 0);
 
182
        break;
 
183
 
 
184
      case DISABLE:
 
185
        if (valuator->xiv >= 0)
 
186
          tun->xval_to_lval_tbl [valuator->xiv] = NULL;
 
187
        valuator->xiv = TUN_VALUATOR_DISABLED;
 
188
        break;
 
189
 
 
190
      case DEVMIN:
 
191
        if (xf86GetToken (NULL) != NUMBER)
 
192
          xf86ConfigError ("Number expected");
 
193
 
 
194
        valuator->min = val->num;
 
195
        break;
 
196
 
 
197
      case DEVMAX:
 
198
        if (xf86GetToken (NULL) != NUMBER)
 
199
          xf86ConfigError ("Number expected");
 
200
 
 
201
        valuator->max = val->num;
 
202
        break;
 
203
 
 
204
      case MOUSEWHEELHACK:
 
205
        if (xf86GetToken (NULL) != NUMBER)
 
206
          xf86ConfigError ("0 or 1 expected");
 
207
 
 
208
        valuator->mouse_wheel_hack = (val->num != 0);
 
209
        break;
 
210
 
 
211
      case EOF:
 
212
        FatalError("Unexpected EOF (missing EndSubSection)");
 
213
        break; /* :-) */
 
214
      default:
 
215
        xf86ConfigError("LInput valuator subsection keyword expected");
 
216
        break;
 
217
      }
 
218
}
 
219
 
 
220
/** Parse SubSection of XF86Config file
 
221
 */
 
222
Bool
 
223
tunConfig (LocalDevicePtr       *array,
 
224
           int                  index,
 
225
           int                  max,
 
226
           LexPtr               val)
 
227
{
 
228
  LocalDevicePtr        local = array [index];
 
229
  TunDevicePtr          tun = (TunDevicePtr) local -> private;
 
230
  int                   token, fd, i, finish = TRUE;
 
231
 
 
232
  TunDeviceVersionInfo  version_info;
 
233
  TunDeviceInfo         device_info;
 
234
  
 
235
  if (tun_switch_device == NULL)
 
236
    for  (i = 0; i < max; i++)
 
237
      if (strcmp (array [i]->name, "SWITCH") == 0)
 
238
        { tun_switch_device = array [i]; }
 
239
 
 
240
  if (! tun_switch_device)
 
241
    TLOG ("Can not found SWITCH device :(");
 
242
 
 
243
  TLOG ("Config of device %s", local  -> name);
 
244
 
 
245
  if ((token = xf86GetToken (TunTab)) == DEVICE)
 
246
    {
 
247
      if (xf86GetToken (NULL) != STRING)
 
248
        xf86ConfigError ("String expected");
 
249
 
 
250
      t_free (tun->input_device);
 
251
      tun->input_device = strdup (val->str);
 
252
      token = xf86GetToken (TunTab);
 
253
    }
 
254
 
 
255
  if ((fd = open (tun->input_device, O_RDONLY)) == 0)
 
256
    {
 
257
      ErrorF ("Can not open %s file", tun->input_device);
 
258
      xf86ConfigError ("Can not open linux input device file");
 
259
    }
 
260
 
 
261
  if (tunQueryLinuxDriverVesrion (fd, &version_info) != Success)
 
262
    xf86ConfigError ("Bad Linux Input driver version or IOCTL interface does not work :(");
 
263
 
 
264
  tunQueryDeviceID (fd, tun->device_ID);
 
265
 
 
266
  { 
 
267
    char *name = tunQueryDeviceName (fd);
 
268
    TLOG ("[%s]: %s", local->name, name);
 
269
    t_free (name);
 
270
  }
 
271
 
 
272
  tunQueryDevice (fd, device_info);
 
273
  tunInitDeviceRec (fd, local, tun, device_info);
 
274
 
 
275
  TLOG ("TOKEN: %d", token);
 
276
  if (token != NOAUTOCONFIG)
 
277
    tunAutoconfigDeviceRec (local, tun, device_info);
 
278
  else
 
279
    token = xf86GetToken (TunTab);
 
280
 
 
281
  for ( /* NOP ! (WOW :) */ ; 
 
282
        (token != ENDSUBSECTION) ;
 
283
        token = xf86GetToken (TunTab))
 
284
    switch (token)
 
285
      {
 
286
      case DEVICENAME:
 
287
        if (xf86GetToken (NULL) != STRING)
 
288
          xf86ConfigError ("Option string expected");
 
289
        TLOG ("LInput X device name changed from %s to %s",  local->name, val->str);
 
290
        xfree (local->name);
 
291
        local->name = strdup (val->str);
 
292
        break;      
 
293
 
 
294
      case DEVICE:
 
295
      case NOAUTOCONFIG:
 
296
        xf86ConfigError ("This option is only allowed at the beginning of this section");
 
297
        break;
 
298
 
 
299
      case ABSOLUTE:
 
300
        if (xf86GetToken (NULL) != NUMBER)
 
301
          xf86ConfigError ("Expected 0 or positive integer.");
 
302
 
 
303
        tun->is_absolute = (val->num != 0);
 
304
        break;
 
305
 
 
306
      case TIMEDELTA:
 
307
        if (xf86GetToken (NULL) != NUMBER)
 
308
          xf86ConfigError ("Number expected.");
 
309
 
 
310
        tun->delta_time = val->num;
 
311
        break;
 
312
 
 
313
      case ABS_VALUATOR:
 
314
        {
 
315
          int   lid = -1;
 
316
          switch (xf86GetToken (NULL))
 
317
            {
 
318
            case NUMBER: lid = val->num; break;
 
319
            case STRING: lid = tunLookUpAbsValuator (val->str); break;
 
320
            }
 
321
 
 
322
          if (lid == -1)
 
323
            xf86ConfigError ("Abs valuator name or id expected");
 
324
 
 
325
          if (TUN_DEVICE_TEST_VAL_ABS (device_info, lid))
 
326
            tunConfigAbsValuator (local, tun, 
 
327
                                  tun->avaluators + (lid - tun->first_avaluator),
 
328
                                  val);
 
329
          else
 
330
            TLOG ("[%s] device does not have valuator %d (%s)",
 
331
                  local->name, lid, tunGetAbsValuatorName (lid)) ;
 
332
 
 
333
          break;
 
334
        }
 
335
      case REL_VALUATOR:
 
336
        {
 
337
          int   lid = -1;
 
338
          switch (xf86GetToken (NULL))
 
339
            {
 
340
            case NUMBER: lid = val->num; break;
 
341
            case STRING: lid = tunLookUpRelValuator (val->str); break;
 
342
            }
 
343
 
 
344
          if (lid == -1)
 
345
            xf86ConfigError ("Abs valuator name or id expected");
 
346
 
 
347
 
 
348
          if (TUN_DEVICE_TEST_VAL_REL (device_info, lid))
 
349
            tunConfigRelValuator (local, tun, 
 
350
                                  tun->rvaluators + (lid - tun->first_rvaluator),
 
351
                                  val);
 
352
          else
 
353
            TLOG ("[%s] device does not have valuator %d (%s)",
 
354
                  local->name, lid, tunGetRelValuatorName (lid)) ;
 
355
          break;
 
356
        }
 
357
 
 
358
      case BUTTON:
 
359
        {
 
360
          int but = -5, lbut = -1;
 
361
 
 
362
          switch (xf86GetToken (NULL))
 
363
            {
 
364
            case STRING:
 
365
              lbut = KEY_TO_BUTTON (tunLookUpKey (val->str));
 
366
              break;
 
367
            case NUMBER:
 
368
              lbut = val->num;
 
369
            }
 
370
 
 
371
          if (lbut < 0)
 
372
            xf86ConfigError ("Button identifier expected");
 
373
          
 
374
          switch (xf86GetToken (NULL))
 
375
            {
 
376
            case NUMBER: 
 
377
              if (val->num > 0)
 
378
                but = val->num; 
 
379
              break;
 
380
            case STRING: 
 
381
              if (StrCaseCmp (val->str, "disabled") == 0) 
 
382
                 but = TUN_BUTTON_UNASSIGNED;
 
383
              else if (StrCaseCmp (val->str, "proximity") == 0)
 
384
                but = TUN_BUTTON_PROXIMITY;
 
385
              break ;
 
386
            }
 
387
 
 
388
          if (TUN_DEVICE_TEST_KEY (device_info, lbut) == 0)
 
389
            {
 
390
              TLOG ("Warning: button %s not found in device %s. IGNORED", 
 
391
                    tunGetKeyName (lbut), local->name);
 
392
              break;
 
393
            }
 
394
 
 
395
          if (but == -5)
 
396
            xf86ConfigError ("Expected positive integer, \"Disabled\" or \"Proximity\"");
 
397
 
 
398
          tun->lbut_to_xbut_tbl [lbut - tun->first_lbutton] = but;
 
399
          break;
 
400
        }
 
401
 
 
402
      case DONT_FINISH_UNASIGNED:
 
403
        finish = FALSE;
 
404
        break;
 
405
 
 
406
      case EOF:
 
407
        FatalError("Unexpected EOF (missing EndSubSection)");
 
408
        break; /* :-) */
 
409
      default:
 
410
        xf86ConfigError("LInput subsection keyword expected");
 
411
        break;
 
412
      }
 
413
 
 
414
  if (finish)
 
415
    tunFinishUnasigned (local, tun, device_info);
 
416
 
 
417
  tunDeviceRecFinalize (tun);
 
418
 
 
419
  close (fd);
 
420
  if (xf86Verbose) 
 
421
    ErrorF("%s %s: Configured.\n", XCONFIG_GIVEN, local->name);
 
422
 
 
423
  return Success;
 
424
}
 
425
 
 
426
/** Init module on X server start.
 
427
 */
 
428
 
 
429
int
 
430
init_module (unsigned long server_version)
 
431
{
 
432
  TLOG_INITCODE;
 
433
 
 
434
  fprintf (TLOG_FILE, 
 
435
  "******************************************************************************************");
 
436
  TLOG ("Tuntitko 0.1 - Linux Input Driver... Loaded");
 
437
 
 
438
  TUN_INPUT_REG (0);
 
439
  TUN_INPUT_REG (1);
 
440
  TUN_INPUT_REG (2);
 
441
  TUN_INPUT_REG (3);
 
442
  TUN_INPUT_REG (4);
 
443
  TUN_INPUT_REG (5);
 
444
  TUN_INPUT_REG (6);
 
445
  TUN_INPUT_REG (7);
 
446
 
 
447
  if (server_version != XF86_VERSION_CURRENT)
 
448
    {   
 
449
        ErrorF ("Warning: Tuntitko compiled for version %s\n", XF86_VERSION);
 
450
        return 0;
 
451
    }
 
452
 
 
453
  return 1;
 
454
}