From 5d54c91a887adbd8da2ca341dea7924a619ca5ae Mon Sep 17 00:00:00 2001 From: deuce <> Date: Mon, 30 Aug 2004 00:43:47 +0000 Subject: [PATCH] Initial add of generalized mouse API for ciolib... this is not complete, working, or otherwise usefull at this time. --- src/conio/mouse.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++ src/conio/mouse.h | 48 +++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 src/conio/mouse.c create mode 100644 src/conio/mouse.h diff --git a/src/conio/mouse.c b/src/conio/mouse.c new file mode 100644 index 0000000000..ceaaf6a2c7 --- /dev/null +++ b/src/conio/mouse.c @@ -0,0 +1,151 @@ +#include <genwrap.h> +#include <semwrap.h> + +#include "mouse.h" + +static pthread_mutex_t in_mutex; +static int in_mutex_initialized=0; +sem_t in_sem; + +struct in_mouse_event { + int event; + int x; + int y; + clock_t ts; + void *nextevent; +}; + +struct out_mouse_event { + int event; + int bstate; + int kbsm; /* Known button state mask */ + int startx; + int starty; + int endx; + int endy; + void *nextevent; +}; + +struct mouse_state { + int buttonstate; /* Current state of all buttons */ + int knownbuttonstatemask; /* Mask of buttons that have done something since */ + * We started watching... the rest are actually in + * an unknown state */ + int curx; /* Current X position */ + int cury; /* Current Y position */ + int events; /* Currently enabled events */ + int click_timeout; /* Timeout between press and release events for a click (ms) */ + int multi_timeout; /* Timeout after a click for detection of multi clicks (ms) */ + int click_drift; /* Allowed "drift" during a click event */ + struct in_mouse_event *events_in; /* Pointer to recevied events stack */ + struct out_mouse_event *events_out; /* Pointer to output events stack */ +}; + +struct mouse_state state; + +void init_mouse(void) +{ + state.buttonstate=0; + state.knownbuttonstatemask=0; + state.curx=0; + state.cury=0; + state.events=0; + state.click_timeout=200; + state.multi_timeout=300; + state.events_in=(struct in_mouse_event *)NULL; + state.events_out=(struct out_mouse_event *)NULL; + pthread_mutex_init(&in_mutex,NULL); + sem_init(&in_sem,0,0); +} + +int ciomouse_setevents(int events) +{ + state.events=events; + return state.events; +} + +int ciomouse_addevents(int events) +{ + state.events |= events; + return state.events; +} + +int ciomouse_delevents(int events) +{ + state.events &= ~events; + return state.events; +} + +static void ciomouse_gotevent(int event, int x, int y) +{ + struct in_mouse_event *ime; + struct in_mouse_event **lastevent; + + /* If you're not handling any mouse events, it doesn't matter what happens */ + /* though this COULD be used to build up correct current mouse state data */ + if(!state.events) + return; + + ime=(struct in_mouse_event *)malloc(sizeof(struct in_mouse_event)); + ime->ts=msclock(); + ime->event=event; + ime->x=x; + ime->y=y; + ime->nextevent=NULL; + + pthread_mutex_lock(&in_mutex); + + for(lastevent=&state.events_in;*lastevent != NULL;lastevnet=&(lastevent->nextevent)); + *lastevent=ime; + + pthread_mutex_unlock(&in_mutex); + sem_post(&in_sem); +} + +static void coilib_mouse_thread(void *data) +{ + int use_timeout=0; + struct timespec timeout; + init_mouse(); + + while(1) { + if(use_timeout) + sem_timedwait(&in_sem,&timeout); + else + sem_wait(&in_sem); + + /* Check for a timeout rather than a sem_post() */ + + switch(state.events_in->event) { + case CIOLIB_MOUSE_MOVE: + /* Needs to check if currently dragging/clicking/etc */ + /* This can result in MULTIPLE events hitting the output */ + /* Stack */ + break; + + case CIOLIB_BUTTON_1_PRESS: + /* No current event should affect a press event */ + break; + + case CIOLIB_BUTTON_1_RELEASE: + /* Needs to check if currently dragging/clicking/etc */ + break; + + case CIOLIB_BUTTON_2_PRESS: + /* No current event should affect a press event */ + break; + + case CIOLIB_BUTTON_2_RELEASE: + /* Needs to check if currently dragging/clicking/etc */ + break; + + case CIOLIB_BUTTON_3_PRESS: + /* No current event should affect a press event */ + break; + + case CIOLIB_BUTTON_3_RELEASE: + /* Needs to check if currently dragging/clicking/etc */ + break; + } + } +} diff --git a/src/conio/mouse.h b/src/conio/mouse.h new file mode 100644 index 0000000000..cd7bd6527b --- /dev/null +++ b/src/conio/mouse.h @@ -0,0 +1,48 @@ +#ifndef _CIOLIB_MOUSE_H_ +#define _CIOLIB_MOUSE_H_ + +struct mouse_event { + int event; + int bstate; + int startx; + int starty; + int endx; + int endy; +}; + +#define CIOLIB_BUTTON_1 1 +#define CIOLIB_BUTTON_2 2 +#define CIOLIB_BUTTON_3 4 + +enum { + CIOLIB_MOUSE_MOVE + ,CIOLIB_BUTTON_1_PRESS + ,CIOLIB_BUTTON_1_RELEASE + ,CIOLIB_BUTTON_1_CLICK + ,CIOLIB_BUTTON_1_DBL_CLICK + ,CIOLIB_BUTTON_1_TRPL_CLICK + ,CIOLIB_BUTTON_1_QUAD_CLICK + ,CIOLIB_BUTTON_1_DRAG_START + ,CIOLIB_BUTTON_1_DRAG_MOVE + ,CIOLIB_BUTTON_1_DRAG_END + ,CIOLIB_BUTTON_2_PRESS + ,CIOLIB_BUTTON_2_RELEASE + ,CIOLIB_BUTTON_2_CLICK + ,CIOLIB_BUTTON_2_DBL_CLICK + ,CIOLIB_BUTTON_2_TRPL_CLICK + ,CIOLIB_BUTTON_2_QUAD_CLICK + ,CIOLIB_BUTTON_2_DRAG_START + ,CIOLIB_BUTTON_2_DRAG_MOVE + ,CIOLIB_BUTTON_2_DRAG_END + ,CIOLIB_BUTTON_3_PRESS + ,CIOLIB_BUTTON_3_RELEASE + ,CIOLIB_BUTTON_3_CLICK + ,CIOLIB_BUTTON_3_DBL_CLICK + ,CIOLIB_BUTTON_3_TRPL_CLICK + ,CIOLIB_BUTTON_3_QUAD_CLICK + ,CIOLIB_BUTTON_3_DRAG_START + ,CIOLIB_BUTTON_3_DRAG_MOVE + ,CIOLIB_BUTTON_3_DRAG_END +}; + +#endif -- GitLab