viewer/evntlst.h File Reference

#include "sbgtypes.h"

Go to the source code of this file.

Functions

Variables


Function Documentation

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.

References FALSE, and NULL.

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 }


Variable Documentation

HANDLE event_sem

Definition at line 159 of file evntlst.cpp.

Referenced by cleanup_sbdaemon(), and start_sbdaemon().

BOOL8 event_waiting

Anything new in queue

Definition at line 40 of file evntlst.cpp.

Referenced by add_event(), find_event(), and search_single_queue().


Generated on Wed Feb 28 19:49:27 2007 for Tesseract by  doxygen 1.5.1