2
pysuinput - Simple Python wrapper for libsuinput
3
Copyright (C) 2009 Tuomas Räsänen <tuos@codegrove.org>
5
This library is free software; you can redistribute it and/or
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
8
version 3 of the License, or (at your option) any later version.
10
This library is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
Lesser General Public License for more details.
15
You should have received a copy of the GNU Lesser General Public
16
License along with this library; if not, write to the Free Software
17
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
static PyObject *pysuinput_open(PyObject *self, PyObject *args)
26
const char *name = NULL;
31
if (!PyArg_ParseTuple(args, "sHHHH", &name, &bustype, &vendor, &product,
34
struct input_id id = {bustype, vendor, product, version};
35
struct suinput_driver *c_driver = suinput_open(name, &id);
37
return PyErr_SetFromErrno(PyExc_IOError);
38
return PyCObject_FromVoidPtr((void *)c_driver, NULL);
41
static PyObject *pysuinput_close(PyObject *self, PyObject *args)
44
struct suinput_driver *c_driver;
45
if (!PyArg_ParseTuple(args, "O", &py_driver))
47
c_driver = (struct suinput_driver *)PyCObject_AsVoidPtr(py_driver);
48
if (suinput_close(c_driver) == -1)
49
return PyErr_SetFromErrno(PyExc_IOError);
53
static PyObject *pysuinput_press(PyObject *self, PyObject *args)
56
struct suinput_driver *c_driver;
58
if (!PyArg_ParseTuple(args, "OH", &py_driver, &keycode))
60
c_driver = (struct suinput_driver *)PyCObject_AsVoidPtr(py_driver);
61
if (suinput_press(c_driver, keycode) == -1)
62
return PyErr_SetFromErrno(PyExc_IOError);
66
static PyObject *pysuinput_release(PyObject *self, PyObject *args)
69
struct suinput_driver *c_driver;
71
if (!PyArg_ParseTuple(args, "OH", &py_driver, &keycode))
73
c_driver = (struct suinput_driver *)PyCObject_AsVoidPtr(py_driver);
74
if (suinput_release(c_driver, keycode) == -1)
75
return PyErr_SetFromErrno(PyExc_IOError);
79
static PyObject *pysuinput_click(PyObject *self, PyObject *args)
82
struct suinput_driver *c_driver;
84
if (!PyArg_ParseTuple(args, "OH", &py_driver, &keycode))
86
c_driver = (struct suinput_driver *)PyCObject_AsVoidPtr(py_driver);
87
if (suinput_click(c_driver, keycode) == -1)
88
return PyErr_SetFromErrno(PyExc_IOError);
92
static PyObject *pysuinput_move_pointer(PyObject *self, PyObject *args)
95
struct suinput_driver *c_driver;
98
if (!PyArg_ParseTuple(args, "Oii", &py_driver, &x, &y)) {
101
c_driver = (struct suinput_driver *)PyCObject_AsVoidPtr(py_driver);
102
if (suinput_move_pointer(c_driver, x, y) == -1)
103
return PyErr_SetFromErrno(PyExc_IOError);
107
static PyObject *pysuinput_press_release(PyObject *self, PyObject *args)
110
struct suinput_driver *c_driver;
112
if (!PyArg_ParseTuple(args, "Oh", &py_driver, &keycode))
114
c_driver = (struct suinput_driver *)PyCObject_AsVoidPtr(py_driver);
115
if (suinput_press_release(c_driver, keycode) == -1)
116
return PyErr_SetFromErrno(PyExc_IOError);
120
static PyObject *pysuinput_toggle(PyObject *self, PyObject *args)
123
struct suinput_driver *c_driver;
125
if (!PyArg_ParseTuple(args, "OH", &py_driver, &keycode))
127
c_driver = (struct suinput_driver *)PyCObject_AsVoidPtr(py_driver);
128
if (suinput_toggle(c_driver, keycode) == -1)
129
return PyErr_SetFromErrno(PyExc_IOError);
133
static PyObject *pysuinput_is_pressed(PyObject *self, PyObject *args)
136
struct suinput_driver *c_driver;
138
if (!PyArg_ParseTuple(args, "OH", &py_driver, &keycode))
140
c_driver = (struct suinput_driver *)PyCObject_AsVoidPtr(py_driver);
141
return PyBool_FromLong(suinput_is_pressed(c_driver, keycode));
144
static PyMethodDef pysuinputMethods[] = {
145
{"open", pysuinput_open, METH_VARARGS,
146
"open(name, bustype, vendor, product, version)\n\n"
147
"Return an input driver.\n"
148
"All possible values of bustype are defined as constants prefixed\n"
149
"by BUS_, vendor, product and version are unsigned 16 bit integers."
150
"close() must be called for every object returned by this function."
153
{"close", pysuinput_close, METH_VARARGS,
155
"Close and destroy the driver."
158
{"click", pysuinput_click, METH_VARARGS,
159
"click(driver, keycode)\n\n"
160
"Send a press and a release event."
163
{"press", pysuinput_press, METH_VARARGS,
164
"press(driver, keycode)\n\n"
165
"Send a press event.\n"
166
"Event is repeated after a short delay until a release event is sent."
169
{"release", pysuinput_release, METH_VARARGS,
170
"release(driver, keycode)\n\n"
171
"Send a release event."
174
{"move_pointer", pysuinput_move_pointer, METH_VARARGS,
175
"move_pointer(driver, x, y)\n\n"
176
"Move pointer towards bottom-right."
179
{"press_release", pysuinput_press_release, METH_VARARGS,
180
"press_release(driver, signed_keycode)\n\n"
181
"Send a press event if signed_keycode > 0, otherwise send\n"
185
{"toggle", pysuinput_toggle, METH_VARARGS,
186
"toggle(driver, keycode)\n\n"
187
"Press button if it is not pressed currently, release it otherwise."
190
{"is_pressed", pysuinput_is_pressed, METH_VARARGS,
191
"is_pressed(driver, keycode)\n\n"
192
"Return True if button is pressed, False otherwise.\n"
193
"keycode must be one of the constant values defined in\n"
194
"uinput.keycodes -module."
197
{NULL, NULL, 0, NULL}
200
PyMODINIT_FUNC init_suinput(void)
203
module = Py_InitModule3("_suinput", pysuinputMethods,
204
"Simple C-like Python API to the Linux uinput-system\n\n"
205
"Provides a high-level API for the Linux input subsystem\n"
206
"through the user space event device.");
207
PyModule_AddIntMacro(module, BUS_PCI);
208
PyModule_AddIntMacro(module, BUS_ISAPNP);
209
PyModule_AddIntMacro(module, BUS_USB);
210
PyModule_AddIntMacro(module, BUS_HIL);
211
PyModule_AddIntMacro(module, BUS_BLUETOOTH);
212
PyModule_AddIntMacro(module, BUS_VIRTUAL);
213
PyModule_AddIntMacro(module, BUS_ISA);
214
PyModule_AddIntMacro(module, BUS_I8042);
215
PyModule_AddIntMacro(module, BUS_XTKBD);
216
PyModule_AddIntMacro(module, BUS_RS232);
217
PyModule_AddIntMacro(module, BUS_GAMEPORT);
218
PyModule_AddIntMacro(module, BUS_PARPORT);
219
PyModule_AddIntMacro(module, BUS_AMIGA);
220
PyModule_AddIntMacro(module, BUS_ADB);
221
PyModule_AddIntMacro(module, BUS_I2C);
222
PyModule_AddIntMacro(module, BUS_HOST);
223
PyModule_AddIntMacro(module, BUS_GSC);
224
PyModule_AddIntMacro(module, BUS_ATARI);