#include #include #include #include #include #include #include #include #ifdef __FreeBSD__ #include #include #else #include #include #endif int _uinput_close(int fd) { if (ioctl(fd, UI_DEV_DESTROY) < 0) { int oerrno = errno; close(fd); errno = oerrno; return -1; } return close(fd); } static PyObject * uinput_open(PyObject *self, PyObject *args) { const char* devnode; int ret = PyArg_ParseTuple(args, "s", &devnode); if (!ret) return NULL; int fd = open(devnode, O_WRONLY | O_NONBLOCK); if (fd < 0) { PyErr_SetString(PyExc_IOError, "could not open uinput device in write mode"); return NULL; } return Py_BuildValue("i", fd); } static PyObject * uinput_create(PyObject *self, PyObject *args) { int fd, len, i, abscode; uint16_t vendor, product, version, bustype; PyObject *absinfo = NULL, *item = NULL; struct uinput_user_dev uidev; const char* name; int ret = PyArg_ParseTuple(args, "ishhhhO", &fd, &name, &vendor, &product, &version, &bustype, &absinfo); if (!ret) return NULL; memset(&uidev, 0, sizeof(uidev)); strncpy(uidev.name, name, UINPUT_MAX_NAME_SIZE); uidev.id.vendor = vendor; uidev.id.product = product; uidev.id.version = version; uidev.id.bustype = bustype; len = PyList_Size(absinfo); for (i=0; i (ABS_X, 0, 255, 0, 0) item = PyList_GetItem(absinfo, i); abscode = (int)PyLong_AsLong(PyList_GetItem(item, 0)); uidev.absmin[abscode] = PyLong_AsLong(PyList_GetItem(item, 1)); uidev.absmax[abscode] = PyLong_AsLong(PyList_GetItem(item, 2)); uidev.absfuzz[abscode] = PyLong_AsLong(PyList_GetItem(item, 3)); uidev.absflat[abscode] = PyLong_AsLong(PyList_GetItem(item, 4)); } if (write(fd, &uidev, sizeof(uidev)) != sizeof(uidev)) goto on_err; /* if (ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0) */ /* goto on_err; */ /* int i; */ /* for (i=0; i= 3 static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, MODULE_NAME, MODULE_HELP, -1, /* m_size */ MethodTable, /* m_methods */ NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL, /* m_free */ }; static PyObject * moduleinit(void) { PyObject* m = PyModule_Create(&moduledef); if (m == NULL) return NULL; PyModule_AddIntConstant(m, "maxnamelen", UINPUT_MAX_NAME_SIZE); return m; } PyMODINIT_FUNC PyInit__uinput(void) { return moduleinit(); } #else static PyObject * moduleinit(void) { PyObject* m = Py_InitModule3(MODULE_NAME, MethodTable, MODULE_HELP); if (m == NULL) return NULL; PyModule_AddIntConstant(m, "maxnamelen", UINPUT_MAX_NAME_SIZE); return m; } PyMODINIT_FUNC init_uinput(void) { moduleinit(); } #endif