1 /* $XFree86: xc/lib/XTrap/XEConTxt.c,v 1.1 2001/11/02 23:29:27 dawes Exp $ */
2 /*****************************************************************************
3 Copyright 1987, 1988, 1989, 1990, 1991, 1994 by Digital Equipment Corp.,
6 Permission to use, copy, modify, and distribute this software and its
7 documentation for any purpose and without fee is hereby granted,
8 provided that the above copyright notice appear in all copies and that
9 both that copyright notice and this permission notice appear in
10 supporting documentation, and that the name of Digital not be
11 used in advertising or publicity pertaining to distribution of the
12 software without specific, written prior permission.
14 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
15 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
16 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
17 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
18 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
19 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
22 *****************************************************************************/
42 #include <X11/extensions/xtraplib.h>
43 #include <X11/extensions/xtraplibp.h>
52 extern char *extensionData;
57 * This function is used to create a new XTrap context structure. The new
58 * context is initialized to a hard coded default, then modified by the
59 * valuemask and values passed in by the caller.
62 XETC *XECreateTC(Display *dpy, CARD32 valuemask, XETCValues *value)
64 static Bool firsttime = True;
65 register XETC *tc = &TC;
66 register XETC *last_tc;
67 XETrapGetAvailRep rep;
69 /* If this is the first time here, then initialize the default TC */
70 if (firsttime == True)
73 /* The first Trap Context is the Template (default) TC */
74 (void)memset(tc,0L,sizeof(tc));
75 tc->eventBase = 0x7FFFFFFFL;
76 tc->errorBase = 0x7FFFFFFFL;
77 tc->values.v.max_pkt_size = 0x7FFFL;
80 /* Position to the end of the list */
81 for (;tc->next != NULL; tc = tc->next);
83 /* Allocate memory for the new context */
84 last_tc = tc; /* save the address of the last on the list */
85 if ((tc = (tc->next = (XETC *)XtMalloc(sizeof(*tc)))) == NULL)
86 { /* No memory to build TC, XtMalloc has already reported the error */
90 /* Use the original TC as the template to start from */
91 (void)memcpy(tc,&TC,sizeof(TC));
94 tc->xmax_size = XMaxRequestSize(tc->dpy);
96 /* Initialize Extension */
97 if (!XETrapQueryExtension(dpy,&(tc->eventBase),&(tc->errorBase),
100 char *params = XTrapExtName;
101 unsigned int num_params = 1L;
102 XtWarningMsg("CantLoadExt", "XECreateTC", "XTrapToolkitError",
103 "Can't load %s extension", ¶ms, &num_params);
104 (void)XtFree((XtPointer)tc);
105 last_tc->next = NULL; /* Clear now nonexistant forward pointer */
109 /* Allocate memory for the XLIB transport */
110 if ((tc->xbuff = (BYTE *)XtMalloc(tc->xmax_size * sizeof(CARD32) +
111 SIZEOF(XETrapHeader))) == NULL)
112 { /* No memory to build TC, XtMalloc has already reported the error */
113 (void)XtFree((XtPointer)tc); /* free the allocated TC */
114 last_tc->next = NULL; /* Clear now nonexistant forward pointer */
118 /* Decide on a protocol version to communicate with */
119 /* would *like* to use XEGetVersionRequest() but it's broken in V3.1 */
120 if (XEGetAvailableRequest(tc,&rep) == True)
122 /* stow the protocol number */
123 switch (rep.xtrap_protocol)
125 /* known acceptable protocols */
128 tc->protocol = rep.xtrap_protocol;
131 default: /* stay backwards compatible */
135 /* TC to contain *oldest* release/version/revision */
136 if (XETrapGetAvailRelease(&rep) <= XETrapRelease)
138 tc->release = XETrapGetAvailRelease(&rep);
139 if (XETrapGetAvailVersion(&rep) <= XETrapVersion)
141 tc->version = XETrapGetAvailVersion(&rep);
142 tc->revision = (XETrapGetAvailRevision(&rep) <= XETrapRevision ?
143 XETrapGetAvailRevision(&rep) : XETrapRevision);
147 tc->version = XETrapVersion;
148 tc->revision = XETrapRevision;
153 tc->release = XETrapRelease;
154 tc->version = XETrapVersion;
155 tc->revision = XETrapRevision;
159 { /* We can't seem to communicate with the extension! */
160 char *params = XTrapExtName;
161 unsigned int num_params = 1L;
162 XtWarningMsg("CantComm", "XECreateTC", "XTrapToolkitError",
163 "Can't communicate with extension %s", ¶ms, &num_params);
164 (void)XtFree((XtPointer)tc->xbuff);/* de-allocate memory just alloc'd */
165 (void)XtFree((XtPointer)tc); /* free the allocated TC */
166 last_tc->next = NULL; /* Clear now nonexistant forward pointer */
170 /* Assign the context values the caller provided */
171 (void)XEChangeTC(tc, valuemask, value);
177 static int CheckChangeBits(XETrapFlags *dest, XETrapFlags *src, INT32 bit)
179 int chg_flag = False;
181 if (!(BitIsFalse(dest->valid,bit) && BitIsFalse(src->valid,bit)) ||
182 !(BitIsTrue(dest->valid,bit) && BitIsTrue(src->valid,bit)))
184 BitCopy(dest->valid, src->valid, bit);
187 if (!(BitIsFalse(dest->data,bit) && BitIsFalse(src->data,bit)) ||
188 !(BitIsTrue(dest->data,bit) && BitIsTrue(src->data,bit)))
190 BitCopy(dest->data, src->data, bit);
197 * This function is called to change one or more parameters used to define
198 * a context in which XTrap is or will be running.
200 int XEChangeTC(XETC *tc, CARD32 mask, XETCValues *values)
203 register XETCValues *tval = &(tc->values);
206 if (mask & TCStatistics)
207 { /* Statistics need changing */
208 if(CheckChangeBits(&(tval->v.flags), &(values->v.flags),
211 tc->dirty |= TCStatistics;
214 if (mask & TCRequests)
215 { /* Requests need changing */
216 CheckChangeBits(&(tval->v.flags), &(values->v.flags), XETrapRequest);
217 for (i=0; i<256L; i++)
219 XETrapSetCfgFlagReq(tval, i, BitValue(values->v.flags.req,i));
221 tc->dirty |= TCRequests;
224 { /* Events need changing */
225 CheckChangeBits(&(tval->v.flags), &(values->v.flags), XETrapEvent);
226 for (i=KeyPress; i<=MotionNotify; i++)
228 XETrapSetCfgFlagEvt(tval, i, BitValue(values->v.flags.event,i));
230 tc->dirty |= TCEvents;
232 if (mask & TCMaxPacket)
233 { /* MaxPacket needs changing */
234 CheckChangeBits(&(tval->v.flags), &(values->v.flags), XETrapMaxPacket);
235 XETrapSetCfgMaxPktSize(tval, values->v.max_pkt_size);
236 tc->dirty |= TCMaxPacket;
239 { /* CmdKey needs changing */
240 CheckChangeBits(&(tval->v.flags), &(values->v.flags), XETrapCmd);
241 tval->v.cmd_key = values->v.cmd_key;
242 CheckChangeBits(&(tval->v.flags), &(values->v.flags), XETrapCmdKeyMod);
243 tc->dirty |= TCCmdKey;
245 if (mask & TCTimeStamps)
246 { /* TimeStamps needs changing */
247 if (CheckChangeBits(&(tval->v.flags), &(values->v.flags), XETrapTimestamp))
249 tc->dirty |= TCTimeStamps;
251 BitCopy(tval->tc_flags, values->tc_flags, XETCDeltaTimes);
254 { /* Window XY's need changing */
255 if (CheckChangeBits(&(tval->v.flags), &(values->v.flags), XETrapWinXY))
257 tc->dirty |= TCWinXY;
261 { /* Window XY's need changing */
262 if (CheckChangeBits(&(tval->v.flags), &(values->v.flags),XETrapCursor))
264 tc->dirty |= TCCursor;
268 { /* XInput flag needs changing */
269 if (CheckChangeBits(&(tval->v.flags), &(values->v.flags),XETrapXInput))
271 tc->dirty |= TCXInput;
274 if (mask & TCColorReplies)
275 { /* ColorReplies flag needs changing */
276 if (CheckChangeBits(&(tval->v.flags), &(values->v.flags),
279 tc->dirty |= TCColorReplies;
282 if (mask & TCGrabServer )
283 { /* GrabServer flag needs changing */
284 if (CheckChangeBits(&(tval->v.flags), &(values->v.flags),
287 tc->dirty |= TCGrabServer;
290 if (XETrapGetTCFlagTrapActive(tc))
292 status = XEFlushConfig(tc);
295 sys$setast(True); /* Make sure AST's are enabled */
301 void XEFreeTC(XETC *tc)
303 register XETC *list = &TC;
307 while(list->next != NULL)
309 if (list->next == tc)
310 list->next = list->next->next; /* Got it, remove from list */
312 list = list->next; /* Update the list pointer */
314 if (tc->values.req_cb)
316 XtFree((XtPointer)tc->values.req_cb);
318 if (tc->values.evt_cb)
320 XtFree((XtPointer)tc->values.evt_cb);
322 if (tc->xbuff != NULL)
324 XtFree((XtPointer)tc->xbuff);
327 XtFree((XtPointer)tc);
330 XtFree(extensionData);
336 /* The following are Convenience routines for setting values within
337 * the Trap Context. These are analogous to the GC's Convenience
338 * Functions such as XSetState & XSetForeground
340 int XETrapSetMaxPacket(XETC *tc, Bool set_flag, CARD16 size)
345 (void)memset((char *)&tcv,0L,sizeof(tcv));
346 XETrapSetCfgFlagMaxPacket(&tcv, valid, True);
347 XETrapSetCfgFlagMaxPacket(&tcv, data, set_flag);
348 XETrapSetCfgMaxPktSize(&tcv, size);
349 status = XEChangeTC(tc, TCMaxPacket, &tcv);
352 int XETrapSetCommandKey(XETC *tc, Bool set_flag, KeySym cmd_key, Bool mod_flag)
358 (void)memset((char *)&tcv,0L,sizeof(tcv));
359 XETrapSetCfgFlagCmd(&tcv, valid, True);
360 XETrapSetCfgFlagCmd(&tcv, data, set_flag);
361 if (set_flag == True)
363 XETrapSetCfgFlagCmdKeyMod(&tcv, valid, True);
364 XETrapSetCfgFlagCmdKeyMod(&tcv, data, mod_flag);
365 if (!(cmd_keycode = XKeysymToKeycode(XETrapGetDpy(tc), cmd_key)))
371 XETrapSetCfgCmdKey(&tcv, cmd_keycode);
375 { /* Clear command key */
376 XETrapSetCfgFlagCmdKeyMod(&tcv, valid, True);
377 XETrapSetCfgFlagCmdKeyMod(&tcv, data, False);
378 XETrapSetCfgCmdKey(&tcv, 0);
382 status = XEChangeTC(tc, TCCmdKey, &tcv);
387 int XETrapSetTimestamps(XETC *tc, Bool set_flag, Bool delta_flag)
392 (void)memset((char *)&tcv,0L,sizeof(tcv));
393 XETrapSetCfgFlagTimestamp(&tcv, valid, True);
394 XETrapSetCfgFlagTimestamp(&tcv, data, set_flag);
395 XETrapSetValFlagDeltaTimes(&tcv, delta_flag);
396 status = XEChangeTC(tc, TCTimeStamps, &tcv);
400 int XETrapSetWinXY(XETC *tc, Bool set_flag)
405 (void)memset((char *)&tcv,0L,sizeof(tcv));
406 XETrapSetCfgFlagWinXY(&tcv, valid, True);
407 XETrapSetCfgFlagWinXY(&tcv, data, set_flag);
408 status = XEChangeTC(tc, TCWinXY, &tcv);
412 int XETrapSetCursor(XETC *tc, Bool set_flag)
417 (void)memset((char *)&tcv,0L,sizeof(tcv));
418 XETrapSetCfgFlagCursor(&tcv, valid, True);
419 XETrapSetCfgFlagCursor(&tcv, data, set_flag);
420 status = XEChangeTC(tc, TCCursor, &tcv);
424 int XETrapSetXInput(XETC *tc, Bool set_flag)
429 (void)memset((char *)&tcv,0L,sizeof(tcv));
430 XETrapSetCfgFlagXInput(&tcv, valid, True);
431 XETrapSetCfgFlagXInput(&tcv, data, set_flag);
432 status = XEChangeTC(tc, TCXInput, &tcv);
436 int XETrapSetColorReplies(XETC *tc, Bool set_flag)
441 (void)memset((char *)&tcv,0L,sizeof(tcv));
442 XETrapSetCfgFlagColorReplies(&tcv, valid, True);
443 XETrapSetCfgFlagColorReplies(&tcv, data, set_flag);
444 status = XEChangeTC(tc, TCColorReplies, &tcv);
448 int XETrapSetGrabServer(XETC *tc, Bool set_flag)
453 (void)memset((char *)&tcv,0L,sizeof(tcv));
454 XETrapSetCfgFlagGrabServer(&tcv, valid, True);
455 XETrapSetCfgFlagGrabServer(&tcv, data, set_flag);
456 status = XEChangeTC(tc, TCGrabServer, &tcv);
460 int XETrapSetStatistics(XETC *tc, Bool set_flag)
465 (void)memset((char *)&tcv,0L,sizeof(tcv));
466 XETrapSetCfgFlagStatistics(&tcv, valid, True);
467 XETrapSetCfgFlagStatistics(&tcv, data, set_flag);
468 status = XEChangeTC(tc, TCStatistics, &tcv);
472 int XETrapSetRequests(XETC *tc, Bool set_flag, ReqFlags requests)
478 (void)memset((char *)&tcv,0L,sizeof(tcv));
479 XETrapSetCfgFlagRequest(&tcv, valid, True);
480 XETrapSetCfgFlagRequest(&tcv, data, set_flag);
481 for (i=0; i<256L; i++)
483 XETrapSetCfgFlagReq(&tcv, i, BitValue(requests, i));
485 status = XEChangeTC(tc, TCRequests, &tcv);
489 int XETrapSetEvents(XETC *tc, Bool set_flag, EventFlags events)
495 (void)memset((char *)&tcv,0L,sizeof(tcv));
496 XETrapSetCfgFlagEvent(&tcv, valid, True);
497 XETrapSetCfgFlagEvent(&tcv, data, set_flag);
498 for (i=KeyPress; i<=MotionNotify; i++)
500 XETrapSetCfgFlagEvt(&tcv, i, BitValue(events, i));
502 status = XEChangeTC(tc, (CARD32)TCEvents, &tcv);
506 Bool XESetCmdGateState(XETC *tc, CARD8 type, Bool *gate_closed,
507 CARD8 *next_key, Bool *key_ignore)
511 if (XETrapGetTCFlagCmdKeyMod(tc,data) == True)
516 if (*next_key == XEKeyIsEcho)
521 *next_key = XEKeyIsClear;
525 if (*next_key == XEKeyIsEcho)
527 *next_key = XEKeyIsClear;
530 if (*next_key == XEKeyIsClear)
532 *next_key = XEKeyIsEcho;
535 { /* it's XEKeyIsOther, so Clear it */
536 *next_key = XEKeyIsClear;
538 *gate_closed = False;
550 if (*next_key == XEKeyIsEcho)
552 *gate_closed = False;
555 /* Open gate on cmd key release */
556 if ((*next_key == XEKeyIsOther) &&
557 *gate_closed == True)
562 *next_key = XEKeyIsClear;
566 if (*next_key == XEKeyIsClear)
568 *next_key = XEKeyIsEcho;
572 if (*next_key == XEKeyIsEcho)
574 *next_key = XEKeyIsClear;
578 *gate_closed = False;
580 *next_key = XEKeyIsClear;
588 return(*gate_closed);