struct eventResult er;
int key, i, max;
int done = 0;
- fd_set readSet, writeSet;
+ fd_set readSet, writeSet, exceptSet;
struct timeval nextTimeout, now, timeout;
#ifdef USE_GPM
int x, y;
FD_ZERO(&readSet);
FD_ZERO(&writeSet);
+ FD_ZERO(&exceptSet);
FD_SET(0, &readSet);
#ifdef USE_GPM
if (gpm_fd > 0) {
FD_SET(form->fds[i].fd, &readSet);
if (form->fds[i].flags & NEWT_FD_WRITE)
FD_SET(form->fds[i].fd, &writeSet);
+ if (form->fds[i].flags & NEWT_FD_EXCEPT)
+ FD_SET(form->fds[i].fd, &exceptSet);
}
if (form->timer) {
timeout.tv_sec = timeout.tv_usec = 0;
}
- i = select(max + 1, &readSet, &writeSet, NULL,
+ i = select(max + 1, &readSet, &writeSet, &exceptSet,
form->timer ? &timeout : NULL);
if (i < 0) continue; /* ?? What should we do here? */
}
}
} else {
+ for (i = 0; i < form->numFds; i++) {
+ if (((form->fds[i].flags & NEWT_FD_READ)
+ && FD_ISSET(form->fds[i].fd, &readSet))
+ || ((form->fds[i].flags & NEWT_FD_WRITE)
+ && FD_ISSET(form->fds[i].fd, &writeSet))
+ || ((form->fds[i].flags & NEWT_FD_EXCEPT)
+ && FD_ISSET(form->fds[i].fd, &exceptSet))) break;
+ }
+ if(i < form->numFds)
+ es->u.watch = form->fds[i].fd;
+ else
+ es->u.watch = -1;
+
es->reason = NEWT_EXIT_FDREADY;
done = 1;
}
PyObject * cb, * data;
};
+/* Integer to pointer, 64-bit-sane */
+#define I2P(x) ((void *)(long)(x))
+
static struct callbackStruct suspend;
static struct callbackStruct helpCallback;
static PyObject * formHotKey(snackForm * s, PyObject * args);
static PyObject * formSetCurrent(snackForm * form, PyObject * args);
static PyObject * formSetTimer(snackForm * form, PyObject * args);
+static PyObject * formWatchFD(snackForm * form, PyObject * args);
static PyMethodDef formMethods[] = {
{ "add", (PyCFunction) formAdd, METH_VARARGS, NULL },
{ "addhotkey", (PyCFunction) formHotKey, METH_VARARGS, NULL },
{ "setcurrent", (PyCFunction) formSetCurrent, METH_VARARGS, NULL },
{ "settimer", (PyCFunction) formSetTimer, METH_VARARGS, NULL },
+ { "watchfd", (PyCFunction) formWatchFD, METH_VARARGS, NULL },
{ NULL }
};
return Py_BuildValue("(si)", "hotkey", result.u.key);
else if (result.reason == NEWT_EXIT_TIMER)
return Py_BuildValue("(si)", "timer", 0);
+ else if (result.reason == NEWT_EXIT_FDREADY)
+ return Py_BuildValue("(si)", "fdready", result.u.watch);
else
return Py_BuildValue("(si)", "widget", result.u.co);
}
return Py_None;
}
+static PyObject * formWatchFD(snackForm * form, PyObject * args) {
+ int fd, fdflags;
+
+ if (!PyArg_ParseTuple(args, "ii", &fd, &fdflags))
+ return NULL;
+
+ newtFormWatchFd(form->fo, fd, fdflags);
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
static PyObject * formSetCurrent(snackForm * form, PyObject * args) {
snackWidget * w;
if (!PyArg_ParseTuple(args, "s", &text))
return NULL;
- newtListboxAddEntry(s->co, text, (void *) s->anint);
+ newtListboxAddEntry(s->co, text, I2P(s->anint));
return PyInt_FromLong(s->anint++);
}
if (!PyArg_ParseTuple(args, "si", &text, &key))
return NULL;
- newtListboxInsertEntry(s->co, text, (void *) s->anint, (void *) key);
+ newtListboxInsertEntry(s->co, text, I2P(s->anint), I2P(key));
return PyInt_FromLong(s->anint++);
}
if (!PyArg_ParseTuple(args, "i", &key))
return NULL;
- newtListboxDeleteEntry(s->co, (void *) key);
+ newtListboxDeleteEntry(s->co, I2P(key));
Py_INCREF(Py_None);
return Py_None;
if (!PyArg_ParseTuple(args, "i", &index))
return NULL;
- newtListboxSetCurrentByKey(s->co, (void *) index);
+ newtListboxSetCurrentByKey(s->co, I2P(index));
Py_INCREF(Py_None);
return Py_None;
}
path[len] = NEWT_ARG_LAST;
- newtCheckboxTreeAddArray(s->co, text, (void *) s->anint,
+ newtCheckboxTreeAddArray(s->co, text, I2P(s->anint),
selected ? NEWT_FLAG_SELECTED : 0, path);
return PyInt_FromLong(s->anint++);
if (!PyArg_ParseTuple(args, ""))
return NULL;
- return PyInt_FromLong((int) newtCheckboxTreeGetCurrent(s->co));
+ return PyInt_FromLong((long)newtCheckboxTreeGetCurrent(s->co));
}
static PyObject * widgetCheckboxTreeSetEntry(snackWidget * s, PyObject * args) {
if (!PyArg_ParseTuple(args, "is", &data, &text)) return NULL;
- newtCheckboxTreeSetEntry(s->co, (void *)data, text);
+ newtCheckboxTreeSetEntry(s->co, I2P(data), text);
Py_INCREF(Py_None);
return Py_None;
if (!PyArg_ParseTuple(args, "i", &data)) return NULL;
- newtCheckboxTreeSetCurrent(s->co, (void *)data);
+ newtCheckboxTreeSetCurrent(s->co, I2P(data));
Py_INCREF(Py_None);
return Py_None;
if (!PyArg_ParseTuple(args, "i|i", &data, &isOn)) return NULL;
- newtCheckboxTreeSetEntryValue(s->co, (void *)data,
+ newtCheckboxTreeSetEntryValue(s->co, I2P(data),
isOn ? NEWT_CHECKBOXTREE_SELECTED :
NEWT_CHECKBOXTREE_UNSELECTED);
if (!PyArg_ParseTuple(args, "i", &data)) return NULL;
- selection = newtCheckboxTreeGetEntryValue(s->co, (void *)data);
+ selection = newtCheckboxTreeGetEntryValue(s->co, I2P(data));
if (selection == -1) return NULL;
sel = PyList_New(0);
for (i = 0; i < numselected; i++) {
- PyList_Append(sel, PyInt_FromLong((int) selection[i]));
+ PyList_Append(sel, PyInt_FromLong((long) selection[i]));
}
free(selection);
PyDict_SetItemString(d, "GRID_GROWX", PyInt_FromLong(NEWT_GRID_FLAG_GROWX));
PyDict_SetItemString(d, "GRID_GROWY", PyInt_FromLong(NEWT_GRID_FLAG_GROWY));
+ PyDict_SetItemString(d, "FD_READ", PyInt_FromLong(NEWT_FD_READ));
+ PyDict_SetItemString(d, "FD_WRITE", PyInt_FromLong(NEWT_FD_WRITE));
+ PyDict_SetItemString(d, "FD_EXCEPT", PyInt_FromLong(NEWT_FD_EXCEPT));
+
PyDict_SetItemString(d, "FORM_EXIT_HOTKEY", PyString_FromString("hotkey"));
PyDict_SetItemString(d, "FORM_EXIT_WIDGET", PyString_FromString("widget"));
PyDict_SetItemString(d, "FORM_EXIT_TIMER", PyString_FromString("timer"));
+ PyDict_SetItemString(d, "FORM_EXIT_FDREADY", PyString_FromString("fdready"));
PyDict_SetItemString(d, "KEY_F1", PyInt_FromLong(NEWT_KEY_F1));
PyDict_SetItemString(d, "KEY_F2", PyInt_FromLong(NEWT_KEY_F2));