From 5d47472e43935e15667d907761c4690df7ade4a8 Mon Sep 17 00:00:00 2001 From: marschap Date: Sun, 12 Nov 2006 09:44:16 +0000 Subject: [PATCH] update g15 driver to be compatible with g15daemon > 1.2 (Anthony J. Mirabella) --- server/drivers/g15.c | 33 ++++++++++++++++++++++++++++----- server/drivers/g15.h | 2 ++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/server/drivers/g15.c b/server/drivers/g15.c index c3f3c2a..059b242 100644 --- a/server/drivers/g15.c +++ b/server/drivers/g15.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -70,6 +71,7 @@ MODULE_EXPORT int g15_init (Driver *drvthis) p->cellheight = G15_CELL_HEIGHT; p->backlight_state = BACKLIGHT_ON; p->g15screen_fd = 0; + p->g15d_ver = g15daemon_version(); if((p->g15screen_fd = new_g15_screen(G15_G15RBUF)) < 0) { @@ -372,14 +374,35 @@ MODULE_EXPORT void g15_vbar(Driver *drvthis, int x, int y, int len, int promille MODULE_EXPORT const char * g15_get_key (Driver *drvthis) { PrivateData *p = drvthis->private_data; - + int toread = 0; unsigned int key_state = 0; - - if(send(p->g15screen_fd, "k", 1, MSG_OOB)<1) /* request key status */ - report(RPT_INFO, "%s: Error in send to g15daemon", drvthis->name); - recv(p->g15screen_fd, &key_state , sizeof(key_state),0); + if ((strncmp("1.2", p->g15d_ver, 3))) + { /* other than g15daemon-1.2 (should be >=1.9) */ + fd_set fds; + struct timeval tv; + memset (&tv, 0, sizeof(struct timeval)); + + FD_ZERO(&fds); + FD_SET(p->g15screen_fd, &fds); + toread = select(FD_SETSIZE, &fds, NULL, NULL, &tv); + } + else + { /* g15daemon-1.2 */ + if(send(p->g15screen_fd, "k", 1, MSG_OOB)<1) /* request key status */ + { + report(RPT_INFO, "%s: Error in send to g15daemon", drvthis->name); + return NULL; + } + toread = 1; + } + + if (toread >= 1) + read(p->g15screen_fd, &key_state, sizeof(key_state)); + else + return NULL; + if (key_state & G15_KEY_G1) return "Escape"; else if (key_state & G15_KEY_L1) diff --git a/server/drivers/g15.h b/server/drivers/g15.h index 708c847..2cf4388 100644 --- a/server/drivers/g15.h +++ b/server/drivers/g15.h @@ -32,6 +32,8 @@ typedef struct driver_private_data { int cellwidth, cellheight; /* file descriptor for g15daemon socket */ int g15screen_fd; + /* g15daemon version for compatibility checks */ + const char *g15d_ver; /* canvas for LCD contents */ g15canvas *canvas; g15canvas *backingstore;