--- sbbs/src/conio/mouse.c 2018/04/24 16:41:23 1.1.1.1 +++ sbbs/src/conio/mouse.c 2018/04/24 16:42:24 1.1.1.2 @@ -1,4 +1,4 @@ -/* $Id: mouse.c,v 1.1.1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: mouse.c,v 1.1.1.2 2018/04/24 16:42:24 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * @@ -97,6 +97,8 @@ struct mouse_state { struct mouse_state state; int mouse_events=0; int ciolib_mouse_initialized=0; +static int ungot=0; +pthread_mutex_t unget_mutex; void init_mouse(void) { @@ -105,6 +107,7 @@ void init_mouse(void) state.multi_timeout=300; listInit(&state.input,LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); listInit(&state.output,LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); + pthread_mutex_init(&unget_mutex, NULL); ciolib_mouse_initialized=1; } @@ -429,16 +432,38 @@ void ciolib_mouse_thread(void *data) int mouse_trywait(void) { + int result; + while(!ciolib_mouse_initialized) SLEEP(1); - return(listSemTryWait(&state.output)); + while(1) { + result=listSemTryWait(&state.output); + pthread_mutex_lock(&unget_mutex); + if(ungot==0) { + pthread_mutex_unlock(&unget_mutex); + return(result); + } + ungot--; + pthread_mutex_unlock(&unget_mutex); + } } int mouse_wait(void) { + int result; + while(!ciolib_mouse_initialized) SLEEP(1); - return(listSemWait(&state.output)); + while(1) { + result=listSemWait(&state.output); + pthread_mutex_lock(&unget_mutex); + if(ungot==0) { + pthread_mutex_unlock(&unget_mutex); + return(result); + } + ungot--; + pthread_mutex_unlock(&unget_mutex); + } } int mouse_pending(void) @@ -469,6 +494,7 @@ int ciolib_getmouse(struct mouse_event * free(out); } else { + fprintf(stderr,"WARNING: attempt to get a mouse key when none pending!\n"); memset(mevent,0,sizeof(struct mouse_event)); retval=-1; } @@ -482,5 +508,12 @@ int ciolib_ungetmouse(struct mouse_event if((me=(struct mouse_event *)malloc(sizeof(struct mouse_event)))==NULL) return(-1); memcpy(me,mevent,sizeof(struct mouse_event)); - return(listInsertNode(&state.output,me)==NULL); + pthread_mutex_lock(&unget_mutex); + if(listInsertNode(&state.output,me)==NULL) { + pthread_mutex_unlock(&unget_mutex); + return(FALSE); + } + ungot++; + pthread_mutex_unlock(&unget_mutex); + return(TRUE); }