diff options
author | Henrik Rydberg <rydberg@euromail.se> | 2008-11-06 16:00:08 +0100 |
---|---|---|
committer | Henrik Rydberg <rydberg@euromail.se> | 2008-11-06 16:00:08 +0100 |
commit | 3734c2c5dc65f41aa727d9d69201d604eab6e77d (patch) | |
tree | ea9fa82ccc2afef9183f01f77084a69d85756542 /src/iobuffer.c | |
parent | 826439bce844fdbc8d7e47c0964cb15fd8a8fe93 (diff) | |
download | xorg-input-kobomultitouch-3734c2c5dc65f41aa727d9d69201d604eab6e77d.tar.gz xorg-input-kobomultitouch-3734c2c5dc65f41aa727d9d69201d604eab6e77d.tar.bz2 xorg-input-kobomultitouch-3734c2c5dc65f41aa727d9d69201d604eab6e77d.zip |
event loop works, buffer works, now look at synched event
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src/iobuffer.c')
-rw-r--r-- | src/iobuffer.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/iobuffer.c b/src/iobuffer.c new file mode 100644 index 0000000..8bfcc07 --- /dev/null +++ b/src/iobuffer.c @@ -0,0 +1,39 @@ +#include "iobuffer.h" + +//////////////////////////////////////////////////////// + +void init_iobuf(struct IOBuffer *buf) +{ + memset(buf, 0, sizeof(struct IOBuffer)); + buf->at = buf->begin; + buf->top = buf->at; + buf->end = buf->begin + DIM_BUFFER; +} + +//////////////////////////////////////////////////////// + +const struct input_event* get_iobuf_event(struct IOBuffer *buf, int fd) +{ + const struct input_event *ev; + int n = buf->top - buf->at; + if (n < EVENT_SIZE) { + /* partial event is available: save it */ + if (buf->at != buf->begin && n > 0) + memmove(buf->begin, buf->at, n); + /* start from the beginning */ + buf->at = buf->begin; + buf->top = buf->at + n; + /* read more data */ + SYSCALL(n = read(fd, buf->top, buf->end - buf->top)); + if (n <= 0) + return NULL; + buf->top += n; + } + if (buf->top - buf->at < EVENT_SIZE) + return NULL; + ev = (const struct input_event *)buf->at; + buf->at += EVENT_SIZE; + return ev; +} + +//////////////////////////////////////////////////////// |