viewer/evnts.cpp

Go to the documentation of this file.
00001 
00020 #include          "mfcpch.h"
00021 #ifdef __UNIX__
00022 #include          "sbderrs.h"
00023 #include          "fileerr.h"
00024 #include          "grpherr.h"
00025 #endif
00026 #include          "grphshm.h"
00027 #include          "evntlst.h"
00028 #include          "evnts.h"
00029 
00030 #define EXTERN
00031 DLLSYM EVENT_HANDLER win_selection_handler;
00032 WINDOW (*await_event_func) (WINDOW, BOOL8, INT8, GRAPHICS_EVENT *) =
00033 def_await_event;
00034 
00035 //local non-public functions
00036 GRAPHICS_EVENT *find_event(                 /*wait for event */
00037                            INT16 &fd,       /*window to wait on */
00038                            BOOL8 wait,      /*waiting flag */
00039                            INT8 event_type  /*type to look for */
00040                           );
00041                                  /*search for event */
00042 GRAPHICS_EVENT *search_event_queue(INT16 &fd,       /*queue to search */
00043                                    INT8 event_type  /*type to search for */
00044                                   );
00045                                  /*search for event */
00046 GRAPHICS_EVENT *search_single_queue(INT16 fd,        /*queue to search */
00047                                     INT8 event_type  /*type to search for */
00048                                    );
00049 
00055 DLLSYM WINDOW await_selection(              /*wait for selection */
00056                               WINDOW win,   /*window to wait on */
00057                               BOOL8 wait,   /*waiting flag */
00058                               float &xmin,  /*coords of selection */
00059                               float &ymin,  /*coords of selection */
00060                               float &xmax,  /*coords of selection */
00061                               float &ymax   /*coords of selection */
00062                              ) {
00063   GRAPHICS_EVENT event;          /*return event */
00064 
00065   win = await_event (win, wait, SELECT_EVENT, &event);
00066   if (event.type == DESTROY_EVENT)
00067     return NULL;                 //was destroyed
00068   if (win != NULL) {
00069     xmin = event.x;              /*get coords */
00070     ymin = event.y;
00071     xmax = event.xmax;           /*get coords */
00072     ymax = event.ymax;
00073   }
00074   return win;
00075 }
00076 
00077 
00083 DLLSYM WINDOW await_click(             /*wait for click */
00084                           WINDOW win,  /*window to wait on */
00085                           BOOL8 wait,  /*waiting flag */
00086                           float &x,    /*coords of click */
00087                           float &y     /*coords of click */
00088                          ) {
00089   GRAPHICS_EVENT event;          /*return event */
00090 
00091   win = await_event (win, wait, DOWN_EVENT, &event);
00092   if (event.type == DESTROY_EVENT)
00093     return NULL;                 //was destroyed
00094   if (win != NULL) {
00095     x = event.x;                 /*get coords */
00096     y = event.y;
00097   }
00098   return win;
00099 }
00100 
00101 
00107 DLLSYM WINDOW await_key(             /*wait for key */
00108                         WINDOW win,  /*window to wait on */
00109                         BOOL8 wait,  /*waiting flag */
00110                         char &c      /*return character */
00111                        ) {
00112   GRAPHICS_EVENT event;          /*return event */
00113 
00114   win = await_event (win, wait, KEYPRESS_EVENT, &event);
00115   if (event.type == DESTROY_EVENT)
00116     return NULL;                 //was destroyed
00117   if (win != NULL)
00118     c = event.key;               /*get keypress */
00119   return win;
00120 }
00121 
00122 
00128 DLLSYM WINDOW def_await_event(                           /*wait for event */
00129                               WINDOW win,                /*window to wait on */
00130                               BOOL8 wait,                /*waiting flag */
00131                               INT8 event_type,           /*type to wait for */
00132                               GRAPHICS_EVENT *out_event  /*output event */
00133                              ) {
00134   GRAPHICS_EVENT *event;         /*return event */
00135   INT16 fd;                      //file descriptor
00136 
00137   if (win == NULL)
00138     fd = 0;
00139   else
00140     fd = win->get_fd ();
00141                                  /*look for one */
00142   event = find_event (fd, wait, event_type);
00143   if (event == NULL)
00144     return NULL;                 /*not found */
00145   else {
00146     *out_event = *event;         /*copy event */
00147     if (event->type != DESTROY_EVENT)
00148       delete event;              //free the element
00149     return out_event->fd;
00150   }
00151 }
00152 
00153 
00160 GRAPHICS_EVENT *find_event(                 /*wait for event */
00161                            INT16 &fd,       /*window to wait on */
00162                            BOOL8 wait,      /*waiting flag */
00163                            INT8 event_type  /*type to look for */
00164                           ) {
00165   GRAPHICS_EVENT *event;         /*return event */
00166 
00167                                  /*look for one */
00168   event = search_event_queue (fd, event_type);
00169   if (event == NULL) {
00170     do {
00171       #ifdef __UNIX__
00172       if (check_event (fd, wait))
00173       #elif defined (__MSW32__)
00174         if (wait)
00175           Sleep (50);
00176       if (event_waiting)
00177       #endif
00178       {
00179         //  fprintf(stderr,"Got an event:searching queue %d\n",fd);
00180                             /*try after reading */
00181         event = search_event_queue (fd, event_type);
00182       }
00183     }
00184     while (wait && event == NULL);
00185   }
00186   //      if (event!=NULL)
00187   //              event->fd=&sbfds[fd];
00188   return event;                  /*event located */
00189 }
00190 
00191 
00198 GRAPHICS_EVENT *search_event_queue(                 /*search for event */
00199                                    INT16 &fd,       /*queue to search */
00200                                    INT8 event_type  /*type to search for */
00201                                   ) {
00202   GRAPHICS_EVENT *event;         /*event from daemon */
00203   INT16 testfd;                  /*test window */
00204 
00205   if (fd < 0 || fd > maxsbfd || fd > 0 && sbfds[fd].used != 1) {
00206     return NULL;
00207   }
00208   if (fd > 0)
00209                                  /*just one to search */
00210     return search_single_queue (fd, event_type);
00211   else {
00212     for (testfd = 1; testfd < maxsbfd; testfd++) {
00213       if (sbfds[testfd].used) {
00214         event = search_single_queue (testfd, event_type);
00215         if (event != NULL) {
00216           fd = testfd;           /*successful window */
00217           return event;          /*got one */
00218         }
00219       }
00220     }
00221   }
00222   return NULL;                   /*found nothing */
00223 }
00224 
00225 
00232 GRAPHICS_EVENT *search_single_queue(                 /*search for event */
00233                                     INT16 fd,        /*queue to search */
00234                                     INT8 event_type  /*type to search for */
00235                                    ) {
00236   GRAPHICS_EVENT *event;         /*event from daemon */
00237   GRAPHICS_EVENT *prev;          /*previous event */
00238   GRAPHICS_EVENT *event2;        /*2nd event */
00239   GRAPHICS_EVENT *prev2;         /*2nd previous */
00240   GRAPHICS_EVENT *nextevent;     /*next event in list */
00241   BOOL8 any_destroy = FALSE;
00242 
00243   lock_events(); 
00244   event_waiting = FALSE;         //done a scan
00245   prev = NULL;                   /*previous event */
00246   event2 = NULL;                 /*2nd event */
00247   if (event_type == ANY_EVENT) {
00248     event = sbfds[fd].events;    /*start of queue */
00249   }
00250   else if (event_type == SELECT_EVENT) {
00251     for (prev = NULL, event = sbfds[fd].events; event != NULL
00252     && event->type != DOWN_EVENT; event = nextevent) {
00253       //Delete up events that are in the list prior to a down event
00254       nextevent = event->next;   /*next in list */
00255       if (event->type == UP_EVENT) {
00256         if (prev == NULL)
00257                                  /*new head */
00258           sbfds[fd].events = nextevent;
00259         else
00260           prev->next = nextevent;/*delete event */
00261         if (nextevent == NULL)
00262                                  /*new last element */
00263           sbfds[fd].lastevent = prev;
00264         delete event;
00265       }
00266       else
00267         prev = event;
00268       if (event->type == DESTROY_EVENT)
00269         any_destroy = TRUE;
00270     }
00271     if (event == NULL) {
00272       unlock_events(); 
00273       if (any_destroy)
00274         return search_single_queue (fd, DESTROY_EVENT);
00275       return NULL;               /*no good */
00276     }
00277     for (prev2 = event, event2 = event->next; event2 != NULL
00278       && event2->type != UP_EVENT;
00279       prev2 = event2, event2 = event2->next);
00280     if (event2 == NULL) {
00281       unlock_events(); 
00282       return NULL;               /*no good */
00283     }
00284     if (prev2 != event) {        /*got some intervening */
00285       for (prev2 = event->next; prev2 != event2; prev2 = nextevent) {
00286         nextevent = prev2->next;
00287         delete prev2;
00288       }
00289     }
00290     event->next = event2->next;  /*cut out event2 */
00291     event2->next = NULL;         /*event is new end */
00292 
00293     event->xmax = event2->x;     /*get coords */
00294     event->ymax = event2->y;
00295     if (event->x > event->xmax) {
00296       event->xmax = event->x;
00297       event->x = event2->x;      /*get coords */
00298     }
00299     if (event->y > event->ymax) {
00300       event->ymax = event->y;
00301       event->y = event2->y;
00302     }
00303     delete event2;               //free the element
00304   }
00305   else {
00306     for (prev = NULL, event = sbfds[fd].events; event != NULL
00307       && event->type != DESTROY_EVENT
00308     && event->type != event_type; event = nextevent) {
00309       nextevent = event->next;   /*next in list */
00310                                  /*delete up in front of down */
00311       if (event->type == UP_EVENT && event_type == DOWN_EVENT) {
00312         if (prev == NULL)
00313                                  /*new head */
00314           sbfds[fd].events = nextevent;
00315         else
00316           prev->next = nextevent;/*delete event */
00317         if (nextevent == NULL)
00318                                  /*new last element */
00319           sbfds[fd].lastevent = prev;
00320         delete event;
00321       }
00322       else
00323         prev = event;            /*trailing ptr */
00324     }
00325   }
00326   if (event == NULL) {
00327     unlock_events(); 
00328     return NULL;                 /*no good */
00329   }
00330   if (event->type != DESTROY_EVENT) {
00331     if (prev == NULL)
00332                                  /*new head */
00333       sbfds[fd].events = event->next;
00334     else
00335       prev->next = event->next;  /*delete event */
00336     if (event->next == NULL)
00337       sbfds[fd].lastevent = prev;/*new last event */
00338     event->next = NULL;          /*possible 2nd event */
00339   }
00340   unlock_events(); 
00341   return event;                  /*got one!! */
00342 }

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