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
00036 GRAPHICS_EVENT *find_event(
00037 INT16 &fd,
00038 BOOL8 wait,
00039 INT8 event_type
00040 );
00041
00042 GRAPHICS_EVENT *search_event_queue(INT16 &fd,
00043 INT8 event_type
00044 );
00045
00046 GRAPHICS_EVENT *search_single_queue(INT16 fd,
00047 INT8 event_type
00048 );
00049
00055 DLLSYM WINDOW await_selection(
00056 WINDOW win,
00057 BOOL8 wait,
00058 float &xmin,
00059 float &ymin,
00060 float &xmax,
00061 float &ymax
00062 ) {
00063 GRAPHICS_EVENT event;
00064
00065 win = await_event (win, wait, SELECT_EVENT, &event);
00066 if (event.type == DESTROY_EVENT)
00067 return NULL;
00068 if (win != NULL) {
00069 xmin = event.x;
00070 ymin = event.y;
00071 xmax = event.xmax;
00072 ymax = event.ymax;
00073 }
00074 return win;
00075 }
00076
00077
00083 DLLSYM WINDOW await_click(
00084 WINDOW win,
00085 BOOL8 wait,
00086 float &x,
00087 float &y
00088 ) {
00089 GRAPHICS_EVENT event;
00090
00091 win = await_event (win, wait, DOWN_EVENT, &event);
00092 if (event.type == DESTROY_EVENT)
00093 return NULL;
00094 if (win != NULL) {
00095 x = event.x;
00096 y = event.y;
00097 }
00098 return win;
00099 }
00100
00101
00107 DLLSYM WINDOW await_key(
00108 WINDOW win,
00109 BOOL8 wait,
00110 char &c
00111 ) {
00112 GRAPHICS_EVENT event;
00113
00114 win = await_event (win, wait, KEYPRESS_EVENT, &event);
00115 if (event.type == DESTROY_EVENT)
00116 return NULL;
00117 if (win != NULL)
00118 c = event.key;
00119 return win;
00120 }
00121
00122
00128 DLLSYM WINDOW def_await_event(
00129 WINDOW win,
00130 BOOL8 wait,
00131 INT8 event_type,
00132 GRAPHICS_EVENT *out_event
00133 ) {
00134 GRAPHICS_EVENT *event;
00135 INT16 fd;
00136
00137 if (win == NULL)
00138 fd = 0;
00139 else
00140 fd = win->get_fd ();
00141
00142 event = find_event (fd, wait, event_type);
00143 if (event == NULL)
00144 return NULL;
00145 else {
00146 *out_event = *event;
00147 if (event->type != DESTROY_EVENT)
00148 delete event;
00149 return out_event->fd;
00150 }
00151 }
00152
00153
00160 GRAPHICS_EVENT *find_event(
00161 INT16 &fd,
00162 BOOL8 wait,
00163 INT8 event_type
00164 ) {
00165 GRAPHICS_EVENT *event;
00166
00167
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
00180
00181 event = search_event_queue (fd, event_type);
00182 }
00183 }
00184 while (wait && event == NULL);
00185 }
00186
00187
00188 return event;
00189 }
00190
00191
00198 GRAPHICS_EVENT *search_event_queue(
00199 INT16 &fd,
00200 INT8 event_type
00201 ) {
00202 GRAPHICS_EVENT *event;
00203 INT16 testfd;
00204
00205 if (fd < 0 || fd > maxsbfd || fd > 0 && sbfds[fd].used != 1) {
00206 return NULL;
00207 }
00208 if (fd > 0)
00209
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;
00217 return event;
00218 }
00219 }
00220 }
00221 }
00222 return NULL;
00223 }
00224
00225
00232 GRAPHICS_EVENT *search_single_queue(
00233 INT16 fd,
00234 INT8 event_type
00235 ) {
00236 GRAPHICS_EVENT *event;
00237 GRAPHICS_EVENT *prev;
00238 GRAPHICS_EVENT *event2;
00239 GRAPHICS_EVENT *prev2;
00240 GRAPHICS_EVENT *nextevent;
00241 BOOL8 any_destroy = FALSE;
00242
00243 lock_events();
00244 event_waiting = FALSE;
00245 prev = NULL;
00246 event2 = NULL;
00247 if (event_type == ANY_EVENT) {
00248 event = sbfds[fd].events;
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
00254 nextevent = event->next;
00255 if (event->type == UP_EVENT) {
00256 if (prev == NULL)
00257
00258 sbfds[fd].events = nextevent;
00259 else
00260 prev->next = nextevent;
00261 if (nextevent == NULL)
00262
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;
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;
00283 }
00284 if (prev2 != event) {
00285 for (prev2 = event->next; prev2 != event2; prev2 = nextevent) {
00286 nextevent = prev2->next;
00287 delete prev2;
00288 }
00289 }
00290 event->next = event2->next;
00291 event2->next = NULL;
00292
00293 event->xmax = event2->x;
00294 event->ymax = event2->y;
00295 if (event->x > event->xmax) {
00296 event->xmax = event->x;
00297 event->x = event2->x;
00298 }
00299 if (event->y > event->ymax) {
00300 event->ymax = event->y;
00301 event->y = event2->y;
00302 }
00303 delete event2;
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;
00310
00311 if (event->type == UP_EVENT && event_type == DOWN_EVENT) {
00312 if (prev == NULL)
00313
00314 sbfds[fd].events = nextevent;
00315 else
00316 prev->next = nextevent;
00317 if (nextevent == NULL)
00318
00319 sbfds[fd].lastevent = prev;
00320 delete event;
00321 }
00322 else
00323 prev = event;
00324 }
00325 }
00326 if (event == NULL) {
00327 unlock_events();
00328 return NULL;
00329 }
00330 if (event->type != DESTROY_EVENT) {
00331 if (prev == NULL)
00332
00333 sbfds[fd].events = event->next;
00334 else
00335 prev->next = event->next;
00336 if (event->next == NULL)
00337 sbfds[fd].lastevent = prev;
00338 event->next = NULL;
00339 }
00340 unlock_events();
00341 return event;
00342 }