/* @(#)input.h 9.3 88/01/19 */ /* * Copyright (c) 1986 by Sun Microsystems, Inc. */ /* * Definitions having to do with input events * * input.h, Mon Mar 18 11:37:36 1985 * * James Gosling, Sun Microsystems */ extern int distribution_count, news_has_cursor, raw_keyboard, raw_mouse; extern struct scene *CurrentInputScene; extern struct body *but1_keyword, *but2_keyword, *but3_keyword, *damage_keyword, *down_keyword, *enter_keyword, *exit_keyword, *motion_keyword, *raw_but1_keyword, *raw_but2_keyword, *raw_but3_keyword, *raw_motion_keyword, *up_keyword; extern struct body *eventq; extern struct body *current_keystate; extern struct timeval startup_time; extern fract last_event_time, last_event_x, last_event_y; extern struct body *createevent(); extern void determine_crossings(/* screenx, screeny */), determine_keystate(/* event */), enqueueTimerEvent(/* event */), return_interests(/* ilist, ee */), setcursorposition(/* screenx, screeny */); /* * Input event handlers are broken down into regions of a window, and * within a region they are broken down by the event codes that they * cover. * * There is one input_region_set per window, each input_region_set is just an * array of input_regions. An input_region describes a boundary in the * window and an array of input_event_handlers. Input_event_handlers in * turn describe a set of events and a process. The process will be woken * up when the given event occurs in the given region of the given window. * * For now, linear search is used everywhere. */ struct input_event_handler { struct execution_environment *waiting_process; short lo, /* The range of event codes handled by * this handler */ hi; short event_id; unsigned char rows, cols; /* The overlaid grid */ }; struct input_region { struct shape *extent; /* The boundary of the region */ int priority; /* When multiple event handlers are * capable of handling the same event, the * one with the lowest priority is used -- * the priority is generally the area of * the region */ short region_id; short size, used; struct input_event_handler *handlers; /* the set of handlers * defined for this region */ }; struct input_region_set { short size; /* The amount of space allocated for * handlers */ short used; /* The actual number of handlers defined */ struct input_region_set *next; /* input_region_sets get chained * in a free list */ struct input_region regions[1]; }; struct input_event { short event_id; short x, y; }; struct queue_lock { int count; fract timer; }; extern struct queue_lock input_queue_lock; #define DEFAULT_INPUT_QUEUE_TIMEOUT ((fract)546) /* .5 sec */ #define DEVIDKBD 0x6F00 #define DEVIDMS 0x6E00 #define DEVIDMSLBUT DEVIDMS+1 #define DEVIDMSMBUT DEVIDMS+2 #define DEVIDMSRBUT DEVIDMS+3 #define DEVIDSERA 0x6D00 #define DEVIDSERB 0x6C00 #define event_inc_refs(evb) \ if (evb != 0) { \ if (evb->body.event.canvas) cv_incref(evb->body.event.canvas); \ object_incref(&evb->body.event.name); \ object_incref(&evb->body.event.action); \ object_incref(&evb->body.event.runnable_match); \ object_incref(&evb->body.event.client_data); \ if (evb->body.event.interest) \ incref(evb->body.event.interest); \ if (evb->body.event.keystate) \ incref(evb->body.event.keystate); \ } #define event_dec_refs(evb) \ if (evb != 0) { \ if (evb->body.event.is_interest) \ untangle_event(evb); \ if (evb->body.event.canvas && evb->body.event.canvas->refcnt>0) \ cv_decref(evb->body.event.canvas); \ if (evb->body.event.interest) \ decref(evb->body.event.interest); \ if (evb->body.event.keystate) \ decref(evb->body.event.keystate); \ object_decref(&evb->body.event.name); \ object_decref(&evb->body.event.action); \ object_decref(&evb->body.event.runnable_match); \ object_decref(&evb->body.event.client_data); \ } extern struct canvas *CanvasUnderMouse, /* The canvas currently under the mouse */ *LastCanvasUnderMouse; /* The canvas under the mouse the last time it moved */