#include "sbgtypes.h"
Go to the source code of this file.
void add_event | ( | GRAPHICS_EVENT * | event | ) |
Adds an event from the sbdaemon to the correct event queue.
Definition at line 211 of file evntlst.cpp.
References CANTOPENFILE, WINFD::click_handler, DESTROY_EVENT, WINFD::destroy_handler, DOWN_EVENT, ERRCODE::error(), event_waiting, WINFD::events, graphicsevent::fd, graphicsevent::fildes, graphicsevent::key, WINFD::key_handler, KEYPRESS_EVENT, WINFD::lastevent, lock_events(), LOG, graphicsevent::next, NULL, sbfds, WINFD::selection_handler, STRING::string(), TRUE, graphicsevent::type, unlock_events(), UP_EVENT, graphicsevent::x, graphicsevent::xmax, graphicsevent::y, and graphicsevent::ymax.
Referenced by event_reader(), and kick_daemon().
00213 { 00214 GRAPHICS_EVENT *newevent; /*new event */ 00215 EVENT_HANDLER handler; //avoid race hazards 00216 GRAPHICS_EVENT sel_event; //selection 00217 //last button down 00218 static GRAPHICS_EVENT last_down; 00219 00220 #ifdef __UNIX__ 00221 static FILE *eventsout = NULL; //output file 00222 static STRING outname; //output name 00223 00224 //doing anything 00225 if (events_logfile.string ()[0] != '\0' || eventsout != NULL) { 00226 if (eventsout != NULL //already open 00227 && outname != (STRING &) events_logfile) { 00228 fclose(eventsout); //finished that one 00229 eventsout = NULL; 00230 } 00231 //needs opening 00232 if (eventsout == NULL && events_logfile.string ()[0] != '\0') { 00233 //save name 00234 outname = events_logfile.string (); 00235 if ((eventsout = fopen (outname.string (), "w")) == NULL) 00236 CANTOPENFILE.error ("add_event", LOG, outname.string ()); 00237 } 00238 if (eventsout != NULL) 00239 fprintf (eventsout, "%d %d(%f,%f) on %d\n", 00240 event->type, event->key, event->x, event->y, event->fildes); 00241 } 00242 #endif 00243 // fprintf(stderr,"Received event of type %d at (%f,%f) on %d\n", 00244 // event->type,event->x,event->y,event->fildes); 00245 event->fd = &sbfds[event->fildes]; 00246 switch (event->type) { 00247 case DOWN_EVENT: 00248 last_down = *event; //save it 00249 handler = sbfds[event->fildes].click_handler; 00250 if (handler != NULL) { 00251 (*handler) (event); 00252 return; //done it 00253 } 00254 break; 00255 case UP_EVENT: 00256 sel_event = *event; 00257 if (last_down.x > event->x) 00258 sel_event.xmax = last_down.x; 00259 else { 00260 sel_event.xmax = event->x; 00261 sel_event.x = last_down.x; 00262 } 00263 if (last_down.y > event->y) 00264 sel_event.ymax = last_down.y; 00265 else { 00266 sel_event.ymax = event->y; 00267 sel_event.y = last_down.y; 00268 } 00269 handler = sbfds[event->fildes].selection_handler; 00270 if (handler != NULL) { 00271 (*handler) (&sel_event); 00272 return; //done it 00273 } 00274 break; 00275 case KEYPRESS_EVENT: 00276 handler = sbfds[event->fildes].key_handler; 00277 if (handler != NULL) { 00278 (*handler) (event); 00279 return; //done it 00280 } 00281 break; 00282 case DESTROY_EVENT: 00283 handler = sbfds[event->fildes].destroy_handler; 00284 if (handler != NULL) { 00285 (*handler) (event); 00286 // return; //done it 00287 } 00288 break; 00289 } 00290 lock_events(); 00291 newevent = new GRAPHICS_EVENT; 00292 if (newevent != NULL) { 00293 *newevent = *event; /*copy event */ 00294 /*first event */ 00295 if (sbfds[event->fildes].events == NULL) 00296 sbfds[event->fildes].events = newevent; 00297 else 00298 /*add to end */ 00299 sbfds[event->fildes].lastevent->next = newevent; 00300 /*is new end */ 00301 sbfds[event->fildes].lastevent = newevent; 00302 newevent->next = NULL; 00303 } 00304 event_waiting = TRUE; //added to queue 00305 unlock_events(); 00306 }
void event_reader | ( | void * | param | ) |
Read events.
A separate thread that reads the input from the pipe and places events in the appropriate queue. This thread also calls any appropriate event handler on receiving an event.
Definition at line 168 of file evntlst.cpp.
References add_event(), COUNT_READS, EVENT_HEAD, EVENT_INDEX, EVENTSIZE, sbdgraphicsevent::fd, graphicsevent::fildes, sbdgraphicsevent::key, graphicsevent::key, kick_daemon(), graphicsevent::next, NULL, QUEUE_CLEAR, graphicsevent::type, sbdgraphicsevent::type, sbdgraphicsevent::x, graphicsevent::x, sbdgraphicsevent::y, and graphicsevent::y.
Referenced by start_sbdaemon().
00170 { 00171 #ifndef __MAC__ 00172 //real file descriptor 00173 HANDLE *fdptr = (HANDLE *) param; 00174 HANDLE fd = *fdptr; //real file descriptor 00175 unsigned long nread; //bytes read 00176 SBD_GRAPHICS_EVENT event; /*event from daemon */ 00177 GRAPHICS_EVENT real_event; //converted format 00178 char pipe_char[2]; //from pipe 00179 INT32 pipe_index; //index to event queue 00180 00181 event_id = GetCurrentThreadId (); 00182 while (ReadFile (fd, pipe_char, 2, &nread, NULL) != 0 && nread == 2) { 00183 pipe_index = EVENT_HEAD; 00184 event = EVENT_INDEX (pipe_index); 00185 pipe_index++; 00186 if (pipe_index >= EVENTSIZE) 00187 pipe_index = 0; 00188 EVENT_HEAD = pipe_index; 00189 if (event.type != QUEUE_CLEAR) { 00190 real_event.fildes = event.fd; 00191 real_event.type = event.type; 00192 real_event.key = event.key; 00193 real_event.x = event.x; 00194 real_event.y = event.y; 00195 real_event.next = NULL; 00196 add_event(&real_event); /*add event to queue */ 00197 } 00198 else 00199 kick_daemon(COUNT_READS); /*got acknowledge */ 00200 } 00201 CloseHandle(fd); 00202 *fdptr = NULL; 00203 _endthread(); 00204 #endif 00205 }
void lock_events | ( | ) |
Lock out event handler to protect data structures.
Definition at line 312 of file evntlst.cpp.
Referenced by add_event(), kick_daemon(), and search_single_queue().
00312 { //lock 00313 #ifdef __UNIX__ 00314 event_critical_section++; 00315 #elif defined (__MSW32__) 00316 WaitForSingleObject (event_sem, (unsigned long) -1); 00317 #endif 00318 }
void unlock_events | ( | ) |
Unlock, if event pending deal with it.
Definition at line 324 of file evntlst.cpp.
Referenced by add_event(), kick_daemon(), and search_single_queue().
00324 { //lock 00325 #ifdef __UNIX__ 00326 if (event_pending && event_critical_section == 1) { 00327 //get all events 00328 while (check_event (0, FALSE)); 00329 event_pending = FALSE; 00330 } 00331 event_critical_section--; 00332 #elif defined (__MSW32__) 00333 //release it 00334 ReleaseSemaphore (event_sem, 1, NULL); 00335 #endif 00336 }
Anything new in queue
Definition at line 40 of file evntlst.cpp.
Referenced by add_event(), find_event(), and search_single_queue().