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>
47 CARD32 buf32[BUFSIZE/4];
48 char *buf = (char *)buf32;
51 CARD32 min_len = sizeof(CARD32) /* sizeof keysym */
52 + sizeof(CARD32) /* sizeof modifier */
53 + sizeof(CARD32); /* sizeof modifier mask */
55 XLookupString(ev, buf, BUFSIZE, &keysym, NULL);
59 for (i = 0; len >= min_len; i += 3, len -= min_len) {
60 modifier = keylist[i + 1];
61 modifier_mask = keylist[i + 2];
62 if (((KeySym)keylist[i] == keysym)
63 && ((ev->state & modifier_mask) == modifier))
74 return _XimTriggerCheck(im, ev, (INT32)im->private.proto.im_onkeylist[0],
75 &im->private.proto.im_onkeylist[1]);
83 return _XimTriggerCheck(im, ev, (INT32)im->private.proto.im_offkeylist[0],
84 &im->private.proto.im_offkeylist[1]);
92 Xim im = (Xim)ic->core.im;
95 if (IS_DYNAMIC_EVENT_FLOW(ic->core.im) &&
96 im->private.proto.im_onkeylist &&
97 im->private.proto.im_onkeylist[0]) {
98 if ((idx = _XimTriggerOnCheck(im, ev)) >= 0) {
99 (void)_XimTriggerNotify(im, ic, 0, (CARD32)idx); /* Trigger on */
111 Xim im = (Xim)ic->core.im;
114 if (IS_DYNAMIC_EVENT_FLOW(ic->core.im) &&
115 im->private.proto.im_offkeylist &&
116 im->private.proto.im_offkeylist[0]) {
117 if ((idx = _XimTriggerOffCheck(im, ev)) >= 0) {
118 _XimTriggerNotify(im, ic, 1, (CARD32)idx); /* Trigger off */
129 Xim im = (Xim)ic->core.im;
131 if (IS_NEED_SYNC_REPLY(im)) {
132 (void)_XimProcSyncReply(im, ic);
133 UNMARK_NEED_SYNC_REPLY(im);
139 _XimProtoKeypressFilter(
143 Xim im = (Xim)ic->core.im;
145 if (IS_FABRICATED(im)) {
146 _XimPendingFilter(ic);
147 UNMARK_FABRICATED(im);
151 if (IS_NEGLECT_EVENT(ic, KeyPressMask))
154 #ifdef XIM_CONNECTABLE
155 if (!IS_IC_CONNECTED(ic)) {
156 if (IS_CONNECTABLE(im)) {
157 if (_XimConnectServer(im)) {
158 if (!_XimReCreateIC(ic)) {
159 _XimDelayModeSetAttr(im);
170 if (!IS_IC_CONNECTED(ic))
172 #endif /* XIM_CONNECTABLE */
174 if (!IS_FORWARD_EVENT(ic, KeyPressMask)) {
175 if (_XimOnKeysCheck(ic, ev))
179 if (_XimOffKeysCheck(ic, ev))
182 if (_XimForwardEvent(ic, (XEvent *)ev,
183 IS_SYNCHRONOUS_EVENT(ic, KeyPressMask)))
194 XPointer client_data)
196 return _XimProtoKeypressFilter((Xic)client_data, (XKeyEvent *)ev );
200 _XimProtoKeyreleaseFilter(
204 Xim im = (Xim)ic->core.im;
206 if (IS_FABRICATED(im)) {
207 _XimPendingFilter(ic);
208 UNMARK_FABRICATED(im);
212 if (IS_NEGLECT_EVENT(ic, KeyReleaseMask))
215 #ifdef XIM_CONNECTABLE
216 if (!IS_IC_CONNECTED(ic)) {
217 if (IS_CONNECTABLE(im)) {
218 if (_XimConnectServer(im)) {
219 if (!_XimReCreateIC(ic)) {
220 _XimDelayModeSetAttr(im);
231 if (!IS_IC_CONNECTED(ic))
233 #endif /* XIM_CONNECTABLE */
235 if (!IS_FORWARD_EVENT(ic, KeyReleaseMask)) {
236 if (_XimOnKeysCheck(ic, ev))
240 if (_XimOffKeysCheck(ic, ev))
243 if (_XimForwardEvent(ic, (XEvent *)ev,
244 IS_SYNCHRONOUS_EVENT(ic, KeyPressMask)))
251 _XimFilterKeyrelease(
255 XPointer client_data)
257 return _XimProtoKeyreleaseFilter((Xic)client_data, (XKeyEvent *)ev);
261 _XimRegisterKeyPressFilter(
264 if (ic->core.focus_window) {
265 if (!(ic->private.proto.registed_filter_event & KEYPRESS_MASK)) {
266 _XRegisterFilterByType (ic->core.im->core.display,
267 ic->core.focus_window,
271 ic->private.proto.registed_filter_event |= KEYPRESS_MASK;
278 _XimRegisterKeyReleaseFilter(
281 if (ic->core.focus_window) {
282 if (!(ic->private.proto.registed_filter_event & KEYRELEASE_MASK)) {
283 _XRegisterFilterByType (ic->core.im->core.display,
284 ic->core.focus_window,
285 KeyRelease, KeyRelease,
286 _XimFilterKeyrelease,
288 ic->private.proto.registed_filter_event |= KEYRELEASE_MASK;
295 _XimUnregisterKeyPressFilter(
298 if (ic->core.focus_window) {
299 if (ic->private.proto.registed_filter_event & KEYPRESS_MASK) {
300 _XUnregisterFilter (ic->core.im->core.display,
301 ic->core.focus_window,
304 ic->private.proto.registed_filter_event &= ~KEYPRESS_MASK;
311 _XimUnregisterKeyReleaseFilter(
314 if (ic->core.focus_window) {
315 if (ic->private.proto.registed_filter_event & KEYRELEASE_MASK) {
316 _XUnregisterFilter (ic->core.im->core.display,
317 ic->core.focus_window,
318 _XimFilterKeyrelease,
320 ic->private.proto.registed_filter_event &= ~KEYRELEASE_MASK;
330 _XimRegisterKeyPressFilter(ic);
331 if (IS_FORWARD_EVENT(ic, KeyReleaseMask))
332 _XimRegisterKeyReleaseFilter(ic);
337 _XimUnregisterFilter(
340 _XimUnregisterKeyPressFilter(ic);
341 _XimUnregisterKeyReleaseFilter(ic);
346 _XimReregisterFilter(
349 if (IS_FORWARD_EVENT(ic, KeyReleaseMask))
350 _XimRegisterKeyReleaseFilter(ic);
352 _XimUnregisterKeyReleaseFilter(ic);
358 _XimFilterServerDestroy(
362 XPointer client_data)
364 Xim im = (Xim)client_data;
366 if (ev->type == DestroyNotify) {
367 UNMARK_SERVER_CONNECTED(im);
368 #ifdef XIM_CONNECTABLE
369 if (!IS_SERVER_CONNECTED(im) && IS_RECONNECTABLE(im)) {
370 _XimServerReconectableDestroy();
373 #endif /* XIM_CONNECTABLE */
374 _XimServerDestroy(im);
380 _XimRegisterServerFilter(
383 if (im->private.proto.im_window) {
384 if (!(im->private.proto.registed_filter_event & DESTROYNOTIFY_MASK)) {
385 _XRegisterFilterByMask(im->core.display,
386 im->private.proto.im_window,
388 _XimFilterServerDestroy,
390 XSelectInput(im->core.display, im->private.proto.im_window,
391 StructureNotifyMask);
392 im->private.proto.registed_filter_event |= DESTROYNOTIFY_MASK;
399 _XimUnregisterServerFilter(
402 if (im->private.proto.im_window) {
403 if (im->private.proto.registed_filter_event & DESTROYNOTIFY_MASK) {
404 _XUnregisterFilter(im->core.display,
405 im->private.proto.im_window,
406 _XimFilterServerDestroy,
408 im->private.proto.registed_filter_event &= ~DESTROYNOTIFY_MASK;