1 /******************************************************************
3 Copyright 1992, 1993, 1994 by FUJITSU LIMITED
5 Permission to use, copy, modify, distribute, and sell this software
6 and its documentation for any purpose is hereby granted without fee,
7 provided that the above copyright notice appear in all copies and
8 that both that copyright notice and this permission notice appear
9 in supporting documentation, and that the name of FUJITSU LIMITED
10 not be used in advertising or publicity pertaining to distribution
11 of the software without specific, written prior permission.
12 FUJITSU LIMITED makes no representations about the suitability of
13 this software for any purpose.
14 It is provided "as is" without express or implied warranty.
16 FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18 EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19 CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
20 USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
21 OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22 PERFORMANCE OF THIS SOFTWARE.
24 Author: Takashi Fujiwara FUJITSU LIMITED
25 fujiwara@a80.tech.yk.fujitsu.co.jp
27 ******************************************************************/
32 #include <X11/Xatom.h>
41 #define XIM_EXT_SET_EVENT_MASK_IDX 0
43 #define XIM_EXT_FORWARD_KEYEVENT_IDX 1
46 #define XIM_EXT_MOVE_IDX 2
49 typedef struct _XIM_QueryExtRec {
58 Private XIM_QueryExtRec extensions[] = {
59 {False, "XIM_EXT_SET_EVENT_MASK", 0, 0, 0,
60 XIM_EXT_SET_EVENT_MASK_IDX},
62 {False, "XIM_EXT_FORWARD_KEYEVENT", 0, 0, 0,
63 XIM_EXT_FORWARD_KEYEVENT_IDX},
66 {False, "XIM_EXT_MOVE", 0, 0, 0, XIM_EXT_MOVE_IDX},
68 {False, NULL, 0, 0, 0, 0} /* dummy */
76 int n = XIMNumber(extensions) - 1;
78 for (i = 0; i < n; i++) {
79 if (extensions[i].idx == idx) {
80 if (extensions[i].is_support)
90 _XimProcExtSetEventMask(
95 EVENTMASK *buf_l = (EVENTMASK *)buf;
96 EVENTMASK select_mask = _XimGetWindowEventmask(ic);
98 ic->private.proto.filter_event_mask = buf_l[0];
99 ic->private.proto.intercept_event_mask = buf_l[1];
100 ic->private.proto.select_event_mask = buf_l[2];
101 ic->private.proto.forward_event_mask = buf_l[3];
102 ic->private.proto.synchronous_event_mask = buf_l[4];
104 select_mask &= ~ic->private.proto.intercept_event_mask;
105 /* deselected event mask */
106 select_mask |= ic->private.proto.select_event_mask;
107 /* selected event mask */
108 XSelectInput(im->core.display, ic->core.focus_window, select_mask);
109 _XimReregisterFilter(ic);
111 if (!(_XimProcSyncReply(im, ic)))
117 _XimExtSetEventMaskCallback(
123 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
124 XIMID imid = buf_s[0];
125 XICID icid = buf_s[1];
126 Xim im = (Xim)call_data;
129 if ((imid == im->private.proto.imid)
130 && (ic = _XimICOfXICID(im, icid))) {
131 (void)_XimProcExtSetEventMask(im, ic, (XPointer)&buf_s[2]);
139 _XimProcExtForwardKeyEvent(
144 CARD8 *buf_b = (CARD8 *)buf;
145 CARD16 *buf_s = (CARD16 *)buf;
146 CARD32 *buf_l = (CARD32 *)buf;
148 XKeyEvent *kev = (XKeyEvent *)&ev;
150 bzero(&ev, sizeof(XEvent));
151 kev->send_event = False;
152 kev->display = im->core.display;
153 kev->serial = buf_s[1]; /* sequence number */
154 kev->type = buf_b[4] & 0x7f; /* xEvent.u.u.type */
155 kev->keycode = buf_b[5]; /* Keycode */
156 kev->state = buf_s[3]; /* state */
157 kev->time = buf_l[2]; /* time */
159 XPutBackEvent(im->core.display, &ev);
161 _XimRespSyncReply(ic, buf_s[0]);
168 _XimExtForwardKeyEventCallback(
174 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
175 XIMID imid = buf_s[0];
176 XICID icid = buf_s[1];
177 Xim im = (Xim)call_data;
180 if ((imid == im->private.proto.imid)
181 && (ic = _XimICOfXICID(im, icid))) {
182 (void)_XimProcExtForwardKeyEvent(im, ic, (XPointer)&buf_s[2]);
189 _XimExtForwardKeyEventCheck(
196 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
197 CARD8 major_opcode = *((CARD8 *)data);
198 CARD8 minor_opcode = *((CARD8 *)data + 1);
199 XIMID imid = buf_s[0];
200 XICID icid = buf_s[1];
202 if ((major_opcode == XIM_SYNC_REPLY)
203 && (minor_opcode == 0)
204 && (imid == im->private.proto.imid)
205 && (icid == ic->private.proto.icid))
206 if ((major_opcode == XIM_ERROR)
207 && (minor_opcode == 0)
208 && (buf_s[2] & XIM_IMID_VALID)
209 && (imid == im->private.proto.imid)
210 && (buf_s[2] & XIM_ICID_VALID)
211 && (icid == ic->private.proto.icid))
217 _XimExtForwardKeyEvent(
222 Xim im = (Xim) ic->core.im;
223 CARD32 buf32[BUFSIZE/4];
224 CARD8 *buf = (CARD8 *)buf32;
225 CARD8 *buf_b = &buf[XIM_HEADER_SIZE];
226 CARD16 *buf_s = (CARD16 *)buf_b;
227 CARD32 *buf_l = (CARD32 *)buf_b;
228 CARD32 reply32[BUFSIZE/4];
229 char *reply = (char *)reply32;
236 if ((idx = _XimIsSupportExt(XIM_EXT_FORWARD_KEYEVENT_IDX)) < 0)
239 buf_s[0] = im->private.proto.imid; /* imid */
240 buf_s[1] = ic->private.proto.icid; /* icid */
241 buf_s[2] = sync ? XimSYNCHRONUS : 0; /* flag */
242 buf_s[3] = (CARD16)(((XAnyEvent *)ev)->serial & ((unsigned long) 0xffff));
243 /* sequence number */
244 buf_b[8] = ev->type; /* xEvent.u.u.type */
245 buf_b[9] = ev->keycode; /* keycode */
246 buf_s[5] = ev->state; /* state */
247 buf_l[3] = ev->time; /* time */
248 len = sizeof(CARD16) /* sizeof imid */
249 + sizeof(CARD16) /* sizeof icid */
250 + sizeof(BITMASK16) /* sizeof flag */
251 + sizeof(CARD16) /* sizeof sequence number */
252 + sizeof(BYTE) /* sizeof xEvent.u.u.type */
253 + sizeof(BYTE) /* sizeof keycode */
254 + sizeof(CARD16) /* sizeof state */
255 + sizeof(CARD32); /* sizeof time */
257 _XimSetHeader((XPointer)buf,
258 extensions[idx].major_opcode,
259 extensions[idx].minor_opcode, &len);
260 if (!(_XimWrite(im, len, (XPointer)buf)))
265 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
266 _XimExtForwardKeyEventCheck, (XPointer)ic);
267 if(ret_code == XIM_TRUE) {
269 } else if(ret_code == XIM_OVERFLOW) {
274 preply = (XPointer)Xmalloc(buf_size);
275 ret_code = _XimRead(im, &len, preply, buf_size,
276 _XimExtForwardKeyEventCheck, (XPointer)ic);
277 if(ret_code != XIM_TRUE) {
284 buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
285 if (*((CARD8 *)preply) == XIM_ERROR) {
286 _XimProcError(im, 0, (XPointer)&buf_s[3]);
296 #endif /* EXT_FORWARD */
299 _XimCheckExtensionListSize(void)
304 int n = XIMNumber(extensions) - 1;
306 for (i = 0; i < n; i++) {
307 len = strlen(extensions[i].name);
308 extensions[i].name_len = len;
316 _XimSetExtensionList(
321 int n = XIMNumber(extensions) - 1;
323 for (i = 0; i < n; i++) {
324 len = extensions[i].name_len;
326 (void)strcpy((char *)&buf[1], extensions[i].name);
334 _XimCountNumberOfExtension(
340 INT16 min_len = sizeof(CARD8)
345 while (total > min_len) {
346 len = *((INT16 *)(&ext[2]));
347 len += (min_len + XIM_PAD(len));
356 _XimParseExtensionList(
360 int num = XIMNumber(extensions) - 1;
367 if (!(n = _XimCountNumberOfExtension(data[0], (CARD8 *)&data[1])))
370 buf = (CARD8 *)&data[1];;
371 for (i = 0; i < n; i++) {
372 len = *((INT16 *)(&buf[2]));
373 for (j = 0; j < num; j++) {
374 if (!(strncmp(extensions[j].name, (char *)&buf[4], len))) {
375 extensions[j].major_opcode = buf[0];
376 extensions[j].minor_opcode = buf[1];
377 extensions[j].is_support = True;
381 len += sizeof(CARD8) /* sizeof major_opcode */
382 + sizeof(CARD8) /* sizeof minor_opcode */
383 + sizeof(INT16) /* sizeof length */
384 + XIM_PAD(len); /* sizeof pad */
392 _XimQueryExtensionCheck(
398 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
399 CARD8 major_opcode = *((CARD8 *)data);
400 CARD8 minor_opcode = *((CARD8 *)data + 1);
401 XIMID imid = buf_s[0];
403 if ((major_opcode == XIM_QUERY_EXTENSION_REPLY)
404 && (minor_opcode == 0)
405 && (imid == im->private.proto.imid))
407 if ((major_opcode == XIM_ERROR)
408 && (minor_opcode == 0)
409 && (buf_s[2] & XIM_IMID_VALID)
410 && (imid == im->private.proto.imid))
423 CARD32 reply32[BUFSIZE/4];
424 char *reply = (char *)reply32;
430 if (!(len = _XimCheckExtensionListSize()))
433 buf_len = XIM_HEADER_SIZE
439 if (!(buf = (CARD8 *)Xmalloc(buf_len)))
441 buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
443 buf_s[0] = im->private.proto.imid; /* imid */
444 buf_s[1] = len; /* length of Extensions */
445 _XimSetExtensionList((CARD8 *)&buf_s[2]);
446 /* extensions supported */
447 XIM_SET_PAD(&buf_s[2], len); /* pad */
448 len += sizeof(CARD16) /* sizeof imid */
449 + sizeof(INT16); /* sizeof length of extensions */
451 _XimSetHeader((XPointer)buf, XIM_QUERY_EXTENSION, 0, &len);
452 if (!(_XimWrite(im, len, (XPointer)buf))) {
459 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
460 _XimQueryExtensionCheck, 0);
461 if(ret_code == XIM_TRUE) {
463 } else if(ret_code == XIM_OVERFLOW) {
468 preply = (XPointer)Xmalloc(buf_size);
469 ret_code = _XimRead(im, &len, reply, buf_size,
470 _XimQueryExtensionCheck, 0);
471 if(ret_code != XIM_TRUE) {
478 buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
479 if (*((CARD8 *)preply) == XIM_ERROR) {
480 _XimProcError(im, 0, (XPointer)&buf_s[3]);
486 if (!(_XimParseExtensionList(im, &buf_s[1]))) {
494 if ((idx = _XimIsSupportExt(XIM_EXT_SET_EVENT_MASK_IDX)) >= 0)
495 _XimRegProtoIntrCallback(im,
496 extensions[idx].major_opcode,
497 extensions[idx].minor_opcode,
498 _XimExtSetEventMaskCallback, (XPointer)im);
500 if ((idx = _XimIsSupportExt(XIM_EXT_FORWARD_KEYEVENT_IDX)) >= 0)
501 _XimRegProtoIntrCallback(im,
502 extensions[idx].major_opcode,
503 extensions[idx].minor_opcode,
504 _XimExtForwardKeyEventCallback, (XPointer)im);
511 /* flag of ExtenArgCheck */
512 #define EXT_XNSPOTLOCATION (1L<<0)
514 /* macro for ExtenArgCheck */
515 #define SET_EXT_XNSPOTLOCATION(flag) (flag |= EXT_XNSPOTLOCATION)
516 #define IS_EXT_XNSPOTLOCATION(flag) (flag & EXT_XNSPOTLOCATION)
518 /* length of XPoint attribute */
519 #define XIM_Xpoint_length 12
528 CARD32 buf32[BUFSIZE/4];
529 CARD8 *buf = (CARD8 *)buf32;
530 CARD16 *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
534 if ((idx = _XimIsSupportExt(XIM_EXT_MOVE_IDX)) < 0)
537 buf_s[0] = im->private.proto.imid; /* imid */
538 buf_s[1] = ic->private.proto.icid; /* icid */
539 buf_s[2] = x; /* X */
540 buf_s[3] = y; /* Y */
541 len = sizeof(CARD16) /* sizeof imid */
542 + sizeof(CARD16) /* sizeof icid */
543 + sizeof(INT16) /* sizeof X */
544 + sizeof(INT16); /* sizeof Y */
546 _XimSetHeader((XPointer)buf, extensions[idx].major_opcode,
547 extensions[idx].minor_opcode, &len);
548 if (!(_XimWrite(im, len, (XPointer)buf)))
559 if (!strcmp(arg->name, XNSpotLocation))
560 SET_EXT_XNSPOTLOCATION(flag);
572 if ((IS_EXT_XNSPOTLOCATION(flag)) && (length == XIM_Xpoint_length))
573 return _XimExtMove(im, ic, buf[4], buf[5]);
576 #endif /* EXT_MOVE */