int fd;
int rwx; /* 4=except 2=write 1=read */
uxsel_callback_fn callback;
+ int id; /* for uxsel_input_remove */
};
static tree234 *fds;
void uxsel_set(int fd, int rwx, uxsel_callback_fn callback)
{
- struct fd *newfd = snew(struct fd);
- struct fd *oldfd;
+ struct fd *newfd;
- newfd->fd = fd;
- newfd->rwx = rwx;
- newfd->callback = callback;
+ uxsel_del(fd);
- oldfd = find234(fds, newfd, NULL);
- if (oldfd) {
- del234(fds, oldfd);
- sfree(oldfd);
+ if (rwx) {
+ newfd = snew(struct fd);
+ newfd->fd = fd;
+ newfd->rwx = rwx;
+ newfd->callback = callback;
+ newfd->id = uxsel_input_add(fd, rwx);
+ add234(fds, newfd);
}
-
- add234(fds, newfd);
}
void uxsel_del(int fd)
{
struct fd *oldfd = find234(fds, &fd, uxsel_fd_findcmp);
if (oldfd) {
+ uxsel_input_remove(oldfd->id);
del234(fds, oldfd);
sfree(oldfd);
}
int select_result(int fd, int event)
{
struct fd *fdstruct = find234(fds, &fd, uxsel_fd_findcmp);
- assert(fdstruct != NULL);
- return fdstruct->callback(fd, event);
+ /*
+ * Apparently this can sometimes be NULL. Can't see how, but I
+ * assume it means I need to ignore the event since it's on an
+ * fd I've stopped being interested in. Sigh.
+ */
+ if (fdstruct)
+ return fdstruct->callback(fd, event);
+ else
+ return 1;
}