version 0.3.0
[expresskeys.git] / src-expresskeys / get_device.c
1 /*
2  get_device.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
3
4  Copyright (C) 2005-2006 - Mats Johannesson
5
6  Based on xinput.c 1996 by Frederic Lepied (xinput-1.2)
7
8  This program is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12
13  This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
21 */
22
23 #include "globals.h"
24
25 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
26  Function queries the X server for input devices. It only cares about non
27  core ones, and compares them with what was specified on the command line.
28  If no device was specified we do an automatic search for 'pad' and 'stylus'.
29  The "info" is a XDeviceInfo structure whos address is transferred to a
30  permanent global copy for freeing at program exit
31  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
32
33 /* get_device_info returns a long to satisfy x86_64 systems */
34 long get_device_info(Display *display, XDeviceInfo *info, char *name)
35 {
36         int     i, j, c;
37         int     nr_devices;
38         int len = 0;
39
40         char read_buffer [MAXBUFFER];
41         char write_buffer [MAXBUFFER];
42
43         info = XListInputDevices(display, &nr_devices);
44
45         if (!pad1_info_block) {
46                 pad1_info_block = info;
47         } else {
48                 if (!stylus1_info_block) {
49                         stylus1_info_block = info;
50                 }
51         }
52
53 /* Device specified on the command line */
54
55         if ((pad1_name) || (stylus1_name)) {
56                 for(i = 0; i < nr_devices; i++) {
57                         if ((info[i].use == IsXExtensionDevice) &&
58                         (strcmp (info[i].name, name) == 0)) {
59                                 /* Convert to long for x86_64 systems */
60                                 return (long) &info[i];
61                         }
62                 }
63                 return 0;
64         } else {
65
66 /* No device specified on the command line */
67
68                 for(i = 0; i < nr_devices; i++) {
69                         if (info[i].use == IsXExtensionDevice) {
70                                 len = strlen(info[i].name);
71                                 if (len < MAXBUFFER) {
72                                         sprintf(read_buffer, "%s", info[i].name);
73                                         for (j = 0; j < len; j++) {
74                                                 c = tolower(read_buffer[j]); /* Turn everything into lower case */
75                                                 sprintf(write_buffer+j, "%c", c);
76                                                 ++read_buffer[j];
77                                         }
78                                         strncpy(write_buffer + len, "\0", 1);
79                                         if ((strstr(write_buffer, name)) !=NULL) {
80                                                 /* Convert to long for x86_64 systems */
81                                                 return (long) &info[i];
82                                         }
83                                 }
84                         }
85                 }
86         return 0;
87         }
88 }
89
90 /* End Code */
91