viewer/evnts.cpp File Reference

#include "mfcpch.h"
#include "grphshm.h"
#include "evntlst.h"
#include "evnts.h"

Go to the source code of this file.

Defines

Functions

Variables


Define Documentation

#define EXTERN

Note:
File: evnts.cpp (Formerly events.c)
Additional functions needed to receive graphics events.
Author:
Ray Smith
Date:
May 24 14:13:00 BST 1990
 * (C) Copyright 1990, Hewlett-Packard Ltd.
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 ** http://www.apache.org/licenses/LICENSE-2.0
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.

Definition at line 30 of file evnts.cpp.


Function Documentation

DLLSYM WINDOW await_click ( WINDOW  win,
BOOL8  wait,
float &  x,
float &  y 
)

Wait for click.

Wait (or check) for a click on the given (or all) fd and return it.

Definition at line 83 of file evnts.cpp.

References await_event, DESTROY_EVENT, DOWN_EVENT, NULL, graphicsevent::type, graphicsevent::x, and graphicsevent::y.

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 }

DLLSYM WINDOW await_key ( WINDOW  win,
BOOL8  wait,
char &  c 
)

Wait for key.

Wait (or check) for a key on the given (or all) fd and return it.

Definition at line 107 of file evnts.cpp.

References await_event, DESTROY_EVENT, graphicsevent::key, KEYPRESS_EVENT, NULL, and graphicsevent::type.

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 }

DLLSYM WINDOW await_selection ( WINDOW  win,
BOOL8  wait,
float &  xmin,
float &  ymin,
float &  xmax,
float &  ymax 
)

Wait for selection.

Wait (or check) for a selection on the given (or all) fd and return it.

Definition at line 55 of file evnts.cpp.

References await_event, DESTROY_EVENT, NULL, SELECT_EVENT, graphicsevent::type, graphicsevent::x, graphicsevent::xmax, graphicsevent::y, and graphicsevent::ymax.

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 }

DLLSYM WINDOW def_await_event ( WINDOW  win,
BOOL8  wait,
INT8  event_type,
GRAPHICS_EVENT out_event 
)

Wait for event.

Wait (or check) for a event on the given (or all) fd and return it.

Definition at line 128 of file evnts.cpp.

References DESTROY_EVENT, graphicsevent::fd, find_event(), WINFD::get_fd(), NULL, and graphicsevent::type.

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 }

GRAPHICS_EVENT * find_event ( INT16 fd,
BOOL8  wait,
INT8  event_type 
)

Wait for event.

Search the queue for an event of a given type, and return it. Read or wait until one turns up if there is not one already.

Definition at line 160 of file evnts.cpp.

References event_waiting, NULL, and search_event_queue().

Referenced by def_await_event().

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 }

GRAPHICS_EVENT * search_event_queue ( INT16 fd,
INT8  event_type 
)

Search for event.

Search the event queue(s) for events of a particular type. If found, it is removed from the queue and returned.

Definition at line 198 of file evnts.cpp.

References maxsbfd, NULL, sbfds, and search_single_queue().

Referenced by find_event().

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 }

GRAPHICS_EVENT * search_single_queue ( INT16  fd,
INT8  event_type 
)

Search for event.

Search the event queue for events of a particular type. If found, it is removed from the queue and returned.

Definition at line 232 of file evnts.cpp.

References ANY_EVENT, DESTROY_EVENT, DOWN_EVENT, event_waiting, WINFD::events, FALSE, lock_events(), graphicsevent::next, NULL, sbfds, SELECT_EVENT, TRUE, graphicsevent::type, unlock_events(), and UP_EVENT.

Referenced by search_event_queue().

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 }


Variable Documentation

WINDOW(*) await_event_func(WINDOW, BOOL8, INT8, GRAPHICS_EVENT *)

Initial value:

Definition at line 32 of file evnts.cpp.

DLLSYM EVENT_HANDLER win_selection_handler

Note:
File: evnts.h (Formerly events.h)
Header of functions and types needed for using events.
Author:
Ray Smith
Date:
Thu May 24 15:14:45 BST 1990
 * (C) Copyright 1990, Hewlett-Packard Ltd.
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 ** http://www.apache.org/licenses/LICENSE-2.0
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.

Definition at line 31 of file evnts.cpp.

Referenced by create_edges_window().


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