Events can now be inserted at queue head or tail. - sam - An updated version of… | |
git clone git://vernunftzentrum.de/sam.git | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit ba79cd6352170c348fd33f185d347119edd1cce5 | |
parent 26b4bc97498c95b42c5e1d0a41a58700a12c16a8 | |
Author: Rob King <[email protected]> | |
Date: Tue, 17 May 2016 23:43:17 -0500 | |
Events can now be inserted at queue head or tail. | |
This allows for the newly added pushkbd function, which pushes keyboard | |
input back onto the queue. | |
Diffstat: | |
libXg/xtbinit.c | 59 ++++++++++++++++++++++++------- | |
1 file changed, 46 insertions(+), 13 deletions(-) | |
--- | |
diff --git a/libXg/xtbinit.c b/libXg/xtbinit.c | |
@@ -59,7 +59,7 @@ static Mouse lastmouse; | |
typedef struct Ebuf { | |
struct Ebuf *next; | |
int n; | |
- unsigned char buf[20]; /* note that this must be at least as large … | |
+ unsigned char buf[4]; | |
} Ebuf; | |
typedef struct Esrc { | |
@@ -89,7 +89,7 @@ static void gotmouse(Gwinmouse *); | |
static int ilog2(int); | |
static void pixtocolor(Pixel, XColor *); | |
static Ebuf *ebread(Esrc *); | |
-static Ebuf *ebadd(Esrc *); | |
+static Ebuf *ebadd(Esrc *, int); | |
static void focinit(Widget); | |
static void wmproto(Widget, XEvent *, String *, Cardinal *); | |
static void waitevent(void); | |
@@ -269,7 +269,7 @@ reshaped(int minx, int miny, int maxx, int maxy) | |
* Cause a mouse event, so programs like sam | |
* will get out of eread and REALLY do the reshape | |
*/ | |
- eb = ebadd(&esrc[Smouse]); | |
+ eb = ebadd(&esrc[Smouse], 0); | |
if (eb == 0) | |
berror("eballoc can't malloc"); | |
memcpy((void*)eb->buf, (void*)&lastmouse, sizeof lastmouse); | |
@@ -285,7 +285,7 @@ gotchar(int c, int composed) | |
if(!einitcalled || Skeyboard == -1) | |
return; | |
- eb = ebadd(&esrc[Skeyboard]); | |
+ eb = ebadd(&esrc[Skeyboard], 0); | |
if (eb == 0) | |
berror("eballoc can't malloc"); | |
k.c = c; | |
@@ -307,7 +307,7 @@ gotmouse(Gwinmouse *gm) | |
m.xy.y = gm->xy.y; | |
m.msec = gm->msec; | |
lastmouse = m; | |
- eb = ebadd(&esrc[Smouse]); | |
+ eb = ebadd(&esrc[Smouse], 0); | |
if (eb == 0) | |
berror("eballoc can't malloc"); | |
memcpy((void*)eb->buf, (void*)&m, sizeof m); | |
@@ -327,7 +327,7 @@ gotinput(XtPointer cldata, int *pfd, XtInputId *id) | |
if (es->count >= MAXINPUT) | |
return; | |
lasttail = es->tail; | |
- eb = ebadd(es); | |
+ eb = ebadd(es, 0); | |
if (eb == 0) | |
return; | |
if(es->size){ | |
@@ -689,6 +689,23 @@ ekbd(void) | |
return k; | |
} | |
+void | |
+pushkbd(int c) | |
+{ | |
+ Ebuf *eb; | |
+ Keystroke k; | |
+ | |
+ if(!einitcalled || Skeyboard == -1) | |
+ return; | |
+ eb = ebadd(&esrc[Skeyboard], 1); | |
+ if (eb == 0) | |
+ berror("eballoc can't malloc"); | |
+ k.c = c; | |
+ k.composed = 0; | |
+ memcpy(eb->buf, &k, sizeof(Keystroke)); | |
+ esrc[Skeyboard].count++; | |
+} | |
+ | |
int | |
ecanread(unsigned long keys) | |
{ | |
@@ -749,8 +766,25 @@ ebread(Esrc *s) | |
return eb; | |
} | |
+static inline | |
+ebappend(Ebuf *b, Esrc *s) | |
+{ | |
+ if (s->tail){ | |
+ s->tail->next = b; | |
+ s->tail = b; | |
+ } else | |
+ s->head = s->tail = b; | |
+} | |
+ | |
+static inline | |
+ebprepend(Ebuf *b, Esrc *s) | |
+{ | |
+ b->next = s->head; | |
+ s->head = b; | |
+} | |
+ | |
static Ebuf* | |
-ebadd(Esrc *s) | |
+ebadd(Esrc *s, int prepend) | |
{ | |
Ebuf *eb; | |
int m; | |
@@ -760,13 +794,12 @@ ebadd(Esrc *s) | |
m += (s->size-1); /* overestimate, because of alignment */ | |
eb = (Ebuf *)malloc(m); | |
if(eb) { | |
- eb->next = 0; | |
+ eb->next = 0; | |
eb->n = s->size; | |
- if(s->tail){ | |
- s->tail->next = eb; | |
- s->tail = eb; | |
- }else | |
- s->head = s->tail = eb; | |
+ if (prepend) | |
+ ebprepend(eb, s); | |
+ else | |
+ ebappend(eb, s); | |
} | |
return eb; | |
} |