2 * XEVENT.C - Handle X events for our display
4 * Obtains the next X event, blocking if necessary, and allocates and
5 * returns a Frame.Event structure.
11 run_XEvent(runctx_p ct, Exp *exp)
13 RunTmpStor *ts = InterpGetExpTmpData(ct, exp);
20 dassert(EventType.ty_Bytes == sizeof(Event));
26 * Wait for the next event. If no events remain and we
27 * have a saved event pending, use the saved event.
28 * Otherwise block and loop.
30 if (XCheckMaskEvent(SaveDisplay, -1, &xevent) == False) {
37 threadWaitEvent(((_XPrivDisplay)SaveDisplay)->fd,
43 * Aggregate exposure events. This results in very efficient
46 if (xevent.type == Expose && aggMode) {
47 if (xsave.type == 0) {
51 if (xsave.xany.window != xevent.xany.window)
53 if (xsave.xexpose.x > xevent.xexpose.x) {
54 xsave.xexpose.width += xsave.xexpose.x -
56 xsave.xexpose.x = xevent.xexpose.x;
58 if (xsave.xexpose.x + xsave.xexpose.width <
59 xevent.xexpose.x + xevent.xexpose.width
61 xsave.xexpose.width = xevent.xexpose.x +
62 xevent.xexpose.width -
65 if (xsave.xexpose.y > xevent.xexpose.y) {
66 xsave.xexpose.height += xsave.xexpose.y -
68 xsave.xexpose.y = xevent.xexpose.y;
70 if (xsave.xexpose.y + xsave.xexpose.height <
71 xevent.xexpose.y + xevent.xexpose.height
73 xsave.xexpose.height = xevent.xexpose.y +
74 xevent.xexpose.height -
83 * Process and return the xevent. Note that xsave may still be valid
84 * and we will hold it until the next request.
86 /*RuneRunTime_RSPut(res->s_RefStor);*/
87 event = heapAlloc(&ts->ts_Pointer, &EventType);
88 /* automatic RSGet by heapAlloc() */
90 event->ev_Type = xevent.type;
91 event->ev_XId = xevent.xany.window;
92 event->ev_FocusType = 0;
94 event->ev_Height = -1;
103 event->ev_FocusType = 2;
104 event->ev_MPos.x = xevent.xkey.x;
105 event->ev_MPos.y = xevent.xkey.y;
106 state = xevent.xkey.state;
108 XLookupString(&xevent.xkey, &event->ev_KeyChar,
114 modState = ShiftMask;
118 modState = ControlMask;
147 if (xevent.type == KeyRelease) {
148 event->ev_KeySym = -key;
151 event->ev_KeySym = key;
157 event->ev_FocusType = 1;
158 event->ev_MPos.x = xevent.xbutton.x;
159 event->ev_MPos.y = xevent.xbutton.y;
160 event->ev_KeySym = xevent.xbutton.button - Button1 +
162 state = xevent.xbutton.state |
163 (Button1Mask << (xevent.xbutton.button - Button1));
166 event->ev_FocusType = 1;
167 event->ev_MPos.x = xevent.xbutton.x;
168 event->ev_MPos.y = xevent.xbutton.y;
169 event->ev_KeySym = -(xevent.xkey.keycode - Button1 +
171 state = xevent.xkey.state &
172 ~(Button1Mask << (xevent.xbutton.button - Button1));
175 event->ev_FocusType = 1;
176 event->ev_MPos.x = xevent.xmotion.x;
177 event->ev_MPos.y = xevent.xmotion.y;
178 state = xevent.xmotion.state;
182 event->ev_FocusType = 1;
183 event->ev_MPos.x = xevent.xcrossing.x;
184 event->ev_MPos.y = xevent.xcrossing.y;
185 state = xevent.xcrossing.state;
192 event->ev_MPos.x = xevent.xexpose.x;
193 event->ev_MPos.y = xevent.xexpose.y;
194 event->ev_Width = xevent.xexpose.width;
195 event->ev_Height = xevent.xexpose.height;
196 event->ev_FocusType = 3;
199 case VisibilityNotify:
200 event->ev_FocusType = 3;
205 event->ev_FocusType = 3;
213 case ConfigureNotify:
214 event->ev_MPos.x = xevent.xconfigure.x;
215 event->ev_MPos.y = xevent.xconfigure.y;
216 event->ev_Width = xevent.xconfigure.width;
217 event->ev_Height = xevent.xconfigure.height;
218 event->ev_FocusType = 4;
220 case ConfigureRequest:
223 case CirculateNotify:
224 case CirculateRequest:
227 case SelectionRequest:
228 case SelectionNotify:
234 event->ev_MetaMask = state;
236 data.data = &ts->ts_Pointer;