Mercurial > freewnn
comparison Xwnmo/xwnmo/evdispatch.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:bbc77ca4def5 |
---|---|
1 /* | |
2 * $Id: evdispatch.c,v 1.2 2001/06/14 18:16:15 ura Exp $ | |
3 */ | |
4 | |
5 /* | |
6 * FreeWnn is a network-extensible Kana-to-Kanji conversion system. | |
7 * This file is part of FreeWnn. | |
8 * | |
9 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 | |
10 * Copyright 1991, 1992 by Massachusetts Institute of Technology | |
11 * | |
12 * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp> | |
13 * | |
14 * This program is free software; you can redistribute it and/or modify | |
15 * it under the terms of the GNU General Public License as published by | |
16 * the Free Software Foundation; either version 2, or (at your option) | |
17 * any later version. | |
18 * | |
19 * This program is distributed in the hope that it will be useful, | |
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
22 * GNU General Public License for more details. | |
23 * | |
24 * You should have received a copy of the GNU General Public License | |
25 * along with GNU Emacs; see the file COPYING. If not, write to the | |
26 * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
27 * | |
28 * Commentary: | |
29 * | |
30 * Change log: | |
31 * '99/04/19 TAOKA Satoshi - 田岡 智志<taoka@infonets.hiroshima-u.ac.jp> | |
32 * kill()、getpid() の宣言をコメントアウト。 | |
33 * | |
34 * Last modified date: 19,Apr.1999 | |
35 * | |
36 * Code: | |
37 * | |
38 */ | |
39 /* Version 4.0 | |
40 */ | |
41 #include <stdio.h> | |
42 #include "commonhd.h" | |
43 #include "sdefine.h" | |
44 #include "xim.h" | |
45 #include "sheader.h" | |
46 #include "ext.h" | |
47 | |
48 #ifdef BC_X11R5 | |
49 #define IS_NOT_FROM_XIMR5(ev) ((ev).xselectionrequest.selection == server_id) | |
50 | |
51 int ximr5_client = 1; /* True when XIM R5 client comes */ | |
52 extern Atom server_id; /* IM server of X11R6 */ | |
53 #endif /* BC_X11R5 */ | |
54 | |
55 static void | |
56 keyboard_mapping (ev) | |
57 XMappingEvent *ev; | |
58 { | |
59 XRefreshKeyboardMapping (ev); | |
60 } | |
61 | |
62 static int | |
63 motif_event (ev) | |
64 XClientMessageEvent *ev; | |
65 { | |
66 /* extern int kill(), getpid(); */ | |
67 | |
68 if (ev->window == xim->root_pointer[xim->default_screen]->ximclient->w) | |
69 { | |
70 do_end (); | |
71 } | |
72 else if (xim->j_c && (ev->window == xim->cur_j_c_root->ichi->w || ev->window == xim->cur_j_c_root->inspect->w)) | |
73 { | |
74 xim->sel_ret = -2; | |
75 cur_cl_change3 (xim->j_c); | |
76 return (0); | |
77 } | |
78 return (1); | |
79 } | |
80 | |
81 | |
82 static char *syuuryou_title = "X INPUT MANAGER"; | |
83 static char *syuuryou_syuuryou = " EXIT "; | |
84 static void | |
85 syuuryou_menu (in) | |
86 int in; | |
87 { | |
88 static char *buf[1]; | |
89 int c; | |
90 | |
91 cur_x = xim->root_pointer[xim->default_screen]->ximclient; | |
92 cur_p = cur_x; | |
93 cur_lang = cur_p->cur_xl->lang_db; | |
94 c_c = cur_p->cur_xl->w_c; | |
95 cur_rk = c_c->rk; | |
96 cur_rk_table = cur_rk->rk_table; | |
97 cur_input = 0; | |
98 xim->exit_menu_flg = (char) 1; | |
99 buf[0] = syuuryou_syuuryou; | |
100 c = xw_select_one_element (buf, 1, -1, syuuryou_title, SENTAKU, main_table[4], in); | |
101 if (c == 0) | |
102 { | |
103 do_end (); | |
104 } | |
105 else if (c == BUFFER_IN_CONT) | |
106 { | |
107 return; | |
108 } | |
109 xim->exit_menu_flg = (char) 0; | |
110 return; | |
111 } | |
112 | |
113 | |
114 static void | |
115 search_expose (event) | |
116 register XExposeEvent *event; | |
117 { | |
118 register XIMClientRec *xc; | |
119 register XIMLangRec *xl; | |
120 register BoxRec *p; | |
121 register Window window = event->window; | |
122 | |
123 for (xc = ximclient_list; xc != NULL; xc = xc->next) | |
124 { | |
125 if (IsPreeditArea (xc) || IsPreeditPosition (xc)) | |
126 { | |
127 cur_p = cur_x = xc; | |
128 xl = cur_p->cur_xl; | |
129 cur_lang = xl->lang_db; | |
130 if (window == xl->w[0]) | |
131 { | |
132 if (IsPreeditArea (cur_x)) | |
133 { | |
134 redraw_window3 (event->x, event->width); | |
135 return; | |
136 } | |
137 else if (IsPreeditPosition (cur_x)) | |
138 { | |
139 redraw_lines (event->x, event->width, 1); | |
140 return; | |
141 } | |
142 } | |
143 else if (window == xl->w[1]) | |
144 { | |
145 redraw_lines (event->x, event->width, 2); | |
146 return; | |
147 } | |
148 else if (window == xl->w[2]) | |
149 { | |
150 redraw_lines (event->x, event->width, 3); | |
151 return; | |
152 } | |
153 else if (window == xl->wn[0]) | |
154 { | |
155 redraw_note (0); | |
156 return; | |
157 } | |
158 else if (window == xl->wn[1]) | |
159 { | |
160 redraw_note (1); | |
161 return; | |
162 } | |
163 } | |
164 | |
165 if (IsStatusArea (xc)) | |
166 { | |
167 if (window == cur_p->cur_xl->ws) | |
168 { | |
169 redraw_window0 (); | |
170 return; | |
171 } | |
172 } | |
173 } | |
174 for (p = box_list; p != NULL; p = p->next) | |
175 { | |
176 if (window == p->window) | |
177 { | |
178 if (p->redraw_cb) | |
179 (p->redraw_cb) (p->redraw_cb_data); | |
180 redraw_box (p); | |
181 return; | |
182 } | |
183 } | |
184 if (xim->j_c) | |
185 { | |
186 cur_cl_change3 (xim->j_c); | |
187 if (window == xim->cur_j_c_root->ichi->w1) | |
188 { | |
189 redraw_ichi_w (); | |
190 return; | |
191 } | |
192 else if (window == xim->cur_j_c_root->ichi->nyuu_w) | |
193 { | |
194 JW3Mputc (xim->cur_j_c_root->ichi->nyuu, xim->cur_j_c_root->ichi->nyuu_w, 0, 1, 0); | |
195 return; | |
196 } | |
197 if (window == xim->cur_j_c_root->inspect->w1) | |
198 { | |
199 JW3Mputc (xim->cur_j_c_root->inspect->msg, xim->cur_j_c_root->inspect->w1, 0, 0, IN_BORDER); | |
200 return; | |
201 } | |
202 } | |
203 return; | |
204 } | |
205 | |
206 static void | |
207 xw_expose (event) | |
208 register XExposeEvent *event; | |
209 { | |
210 register XIMClientRec *cur_x_sv, *cur_p_sv; | |
211 register XIMLangDataBase *cur_lang_sv; | |
212 | |
213 cur_x_sv = cur_x; | |
214 cur_p_sv = cur_p; | |
215 cur_lang_sv = cur_lang; | |
216 search_expose (event); | |
217 cur_p = cur_p_sv; | |
218 cur_x = cur_x_sv; | |
219 cur_lang = cur_lang_sv; | |
220 } | |
221 | |
222 static Status | |
223 xw_buttonpress (event) | |
224 XButtonEvent *event; | |
225 { | |
226 register XIMClientRec *xc; | |
227 register BoxRec *p; | |
228 register Window window = event->window; | |
229 | |
230 xim->sel_ret = -1; | |
231 for (xc = ximclient_list; xc != NULL; xc = xc->next) | |
232 { | |
233 if (IsPreeditNothing (xc)) | |
234 continue; | |
235 if (window == xc->cur_xl->ws) | |
236 { | |
237 if (xim->j_c == NULL) | |
238 { | |
239 xim->sel_button = 1; | |
240 cur_cl_change3 (xc); | |
241 if (event->button == Button1) | |
242 { | |
243 jutil_c (); | |
244 } | |
245 else | |
246 { | |
247 lang_c (); | |
248 } | |
249 } | |
250 return (False); | |
251 } | |
252 } | |
253 | |
254 for (p = box_list; p != NULL; p = p->next) | |
255 { | |
256 if (window == p->window) | |
257 { | |
258 if (p->freeze) | |
259 return (False); | |
260 xim->sel_ret = p->sel_ret; | |
261 if (p->cb) | |
262 (*p->cb) (p->cb_data); | |
263 return (p->do_ret); | |
264 } | |
265 } | |
266 if (xim->j_c) | |
267 { | |
268 if (window == xim->cur_j_c_root->ichi->w1) | |
269 { | |
270 xim->sel_button = 1; | |
271 if (xim->cur_j_c_root->ichi->mode == SENTAKU) | |
272 { | |
273 xw_select_button (event); | |
274 } | |
275 else | |
276 { | |
277 xw_select_jikouho_button (event); | |
278 } | |
279 cur_cl_change3 (xim->j_c); | |
280 return (True); | |
281 } | |
282 } | |
283 return (False); | |
284 } | |
285 | |
286 static void | |
287 xw_destroy (event) | |
288 register XDestroyWindowEvent *event; | |
289 { | |
290 register XIMClientRec *xc; | |
291 register int i; | |
292 | |
293 #ifdef XJPLIB | |
294 if (XJp_xw_destroy (event)) | |
295 return; | |
296 #endif /* XJPLIB */ | |
297 #ifdef USING_XJUTIL | |
298 if (xjutil_destroy (event)) | |
299 return; | |
300 #endif /* USING_XJUTIL */ | |
301 for (xc = ximclient_list; xc != NULL; xc = xc->next) | |
302 { | |
303 if (event->window == xc->w) | |
304 { | |
305 for (i = 0; i < xim->screen_count; i++) | |
306 { | |
307 if (xc == xim->root_pointer[i]->ximclient) | |
308 { | |
309 create_xim_window (xim->root_pointer[i], xc); | |
310 create_preedit (xc, xc->cur_xl, 1); | |
311 create_status (xc, xc->cur_xl, 1); | |
312 XMapWindow (dpy, xc->cur_xl->ws); | |
313 return; | |
314 } | |
315 } | |
316 destroy_client (xc); | |
317 return; | |
318 } | |
319 } | |
320 } | |
321 | |
322 static void | |
323 xw_mousemove (event) | |
324 XMotionEvent *event; | |
325 { | |
326 if (xim->j_c) | |
327 { | |
328 if (xim->cur_j_c_root->ichi->mode == SENTAKU) | |
329 { | |
330 xw_move_hilite (event->y); | |
331 } | |
332 else | |
333 { | |
334 xw_jikouho_move_hilite (event->x, event->y); | |
335 } | |
336 } | |
337 } | |
338 | |
339 static void | |
340 xw_enterleave (event, el) | |
341 XCrossingEvent *event; | |
342 char el; | |
343 { | |
344 register BoxRec *p; | |
345 register Window window = event->window; | |
346 | |
347 for (p = box_list; p != NULL; p = p->next) | |
348 { | |
349 if (window == p->window) | |
350 { | |
351 if (!p->freeze && p->reverse && el != p->in) | |
352 { | |
353 reverse_box (p, p->invertgc); | |
354 p->in = el; | |
355 } | |
356 return; | |
357 } | |
358 } | |
359 if (xim->j_c) | |
360 { | |
361 if (window == xim->cur_j_c_root->ichi->w1) | |
362 { | |
363 if (el) | |
364 { | |
365 xw_mousemove (event); | |
366 } | |
367 else | |
368 { | |
369 if (xim->cur_j_c_root->ichi->mode == SENTAKU) | |
370 xw_mouseleave (); | |
371 } | |
372 return; | |
373 } | |
374 } | |
375 return; | |
376 } | |
377 | |
378 static void | |
379 xw_reparent (event) | |
380 XReparentEvent *event; | |
381 { | |
382 /* | |
383 register XIMClientRec *xc; | |
384 | |
385 for (xc = ximclient_list; xc != NULL; xc = xc->next) { | |
386 if (xc->xl[0] && (xc->lang_num > 1)) { | |
387 if (event->window == xc->xl[0]->wp[0]) { | |
388 reparent_preedit(xc, event->parent); | |
389 return; | |
390 } | |
391 if (event->window == xc->xl[0]->ws) { | |
392 reparent_status(xc, event->parent); | |
393 return; | |
394 } | |
395 } | |
396 } | |
397 */ | |
398 read_wm_id (); | |
399 } | |
400 | |
401 static void | |
402 xw_configure (ev) | |
403 XConfigureEvent *ev; | |
404 { | |
405 register XIMClientRec *xc; | |
406 | |
407 for (xc = ximclient_list; xc != NULL; xc = xc->next) | |
408 { | |
409 if (xc->w == ev->window) | |
410 { | |
411 change_client_area (xc, ev->x, ev->y, ev->width, ev->height); | |
412 return; | |
413 } | |
414 else if (xc->focus_window == ev->window) | |
415 { | |
416 change_focus_area (xc, ev->x, ev->y, ev->width, ev->height); | |
417 return; | |
418 } | |
419 } | |
420 } | |
421 | |
422 void | |
423 X_flush () | |
424 { | |
425 if (cur_x && cur_p && IsPreeditPosition (cur_x) && cur_p->cur_xl->del_x >= cur_p->cur_xl->max_pos) | |
426 { | |
427 JWMline_clear1 (); | |
428 } | |
429 XFlush (dpy); | |
430 } | |
431 | |
432 static void | |
433 kill_xim (window, prop_id, force) | |
434 Window window; | |
435 Atom prop_id; | |
436 int force; | |
437 { | |
438 XEvent event; | |
439 register int i, ok = 0; | |
440 register XIMClientRec *xc; | |
441 unsigned char *data; | |
442 Atom actual_type; | |
443 int actual_format; | |
444 unsigned long nitems, leftover; | |
445 | |
446 for (i = 0, xc = ximclient_list; xc; xc = xc->next) | |
447 i++; | |
448 #ifdef XJPLIB | |
449 i += XJp_get_client_cnt (); | |
450 #endif /* XJPLIB */ | |
451 event.type = ClientMessage; | |
452 event.xclient.format = 32; | |
453 event.xclient.window = xim->root_pointer[xim->default_screen]->ximclient->w; | |
454 event.xclient.data.l[0] = XWNMO_KILL; | |
455 if (prop_id) | |
456 { | |
457 XGetWindowProperty (dpy, xim->root_pointer[xim->default_screen]->root_window, prop_id, 0L, 1000000L, False, XA_STRING, &actual_type, &actual_format, &nitems, &leftover, &data); | |
458 if (nitems > 0 && data && *data && !strncmp (root_username, (char *) data, nitems)) | |
459 { | |
460 if (force || i == 1) | |
461 { | |
462 ok = 1; | |
463 event.xclient.data.l[2] = 0; | |
464 } | |
465 else | |
466 { | |
467 event.xclient.data.l[2] = i - 1; | |
468 } | |
469 } | |
470 else | |
471 { | |
472 event.xclient.data.l[2] = -1; | |
473 } | |
474 XFree (data); | |
475 } | |
476 else | |
477 { | |
478 event.xclient.data.l[2] = -1; | |
479 } | |
480 if (ok) | |
481 { | |
482 event.xclient.data.l[1] = XWNMO_KILL_OK; | |
483 } | |
484 else | |
485 { | |
486 event.xclient.data.l[1] = XWNMO_KILL_NG; | |
487 } | |
488 XSendEvent (dpy, window, False, NoEventMask, &event); | |
489 XFlush (dpy); | |
490 if (ok) | |
491 { | |
492 do_end (); | |
493 } | |
494 } | |
495 | |
496 static Bool | |
497 dummy_proc (display, ev, arg) | |
498 Display *display; | |
499 XEvent *ev; | |
500 char *arg; | |
501 { | |
502 return (True); | |
503 } | |
504 | |
505 void | |
506 XEventDispatch () | |
507 { | |
508 int buff[32], in; | |
509 XEvent event; | |
510 int ret = 0, n_bytes; | |
511 register int i; | |
512 extern Atom wm_id; | |
513 extern Atom wm_id1; | |
514 | |
515 /* | |
516 while (XPending(dpy) > 0) { | |
517 */ | |
518 do | |
519 { | |
520 /* | |
521 XNextEvent(dpy, &event); | |
522 if (XCheckMaskEvent(dpy, ~NoEventMask, &event) == False) return; | |
523 */ | |
524 if (XCheckIfEvent (dpy, &event, dummy_proc, 0) == False) | |
525 return; | |
526 ret = 0; | |
527 switch (event.type) | |
528 { | |
529 case KeyPress: | |
530 xim->sel_button = (char) 0; | |
531 ret = key_input (buff, &event); | |
532 break; | |
533 case Expose: | |
534 xw_expose (&event); | |
535 break; | |
536 case ButtonRelease: | |
537 button.x = event.xbutton.x_root; | |
538 button.y = event.xbutton.y_root; | |
539 if (event.xbutton.window == xim->root_pointer[xim->default_screen]->ximclient->w) | |
540 { | |
541 if (xim->exit_menu) | |
542 { | |
543 xim->sel_button = 1; | |
544 syuuryou_menu (); | |
545 } | |
546 } | |
547 else | |
548 { | |
549 if (xw_buttonpress (&event) == True) | |
550 { | |
551 if (xim->exit_menu_flg && xim->j_c && ((event.xbutton.window == xim->cur_j_c_root->ichi->button[CANCEL_W]->window) || (event.xbutton.window == xim->cur_j_c_root->ichi->w1))) | |
552 { | |
553 syuuryou_menu (); | |
554 } | |
555 else | |
556 { | |
557 buff[0] = 0xd; | |
558 ret = 1; | |
559 } | |
560 } | |
561 } | |
562 break; | |
563 case DestroyNotify: | |
564 xw_destroy (&event); | |
565 break; | |
566 case MotionNotify: | |
567 xw_mousemove (&event); | |
568 break; | |
569 case EnterNotify: | |
570 xw_enterleave (&event, 1); | |
571 break; | |
572 case LeaveNotify: | |
573 xw_enterleave (&event, 0); | |
574 break; | |
575 case ReparentNotify: | |
576 xw_reparent (&event); | |
577 break; | |
578 case MapNotify: | |
579 check_map (event.xmap.window); | |
580 break; | |
581 case MappingNotify: | |
582 keyboard_mapping (&event); | |
583 break; | |
584 case ConfigureNotify: | |
585 xw_configure (&event); | |
586 break; | |
587 case ClientMessage: | |
588 if (wm_id && (event.xclient.message_type == wm_id) && (event.xclient.data.l[0] == wm_id1)) | |
589 { | |
590 motif_event (&event); | |
591 break; | |
592 } | |
593 #ifdef USING_XJUTIL | |
594 if (event.xclient.data.l[0] == DIC_START) | |
595 { | |
596 set_xjutil_id (event.xclient.data.l[1], event.xclient.data.l[2], 0); | |
597 } | |
598 else if (event.xclient.data.l[0] == DIC_START_ER) | |
599 { | |
600 set_xjutil_id (event.xclient.data.l[1], event.xclient.data.l[2], 1); | |
601 } | |
602 else if (event.xclient.data.l[0] == DIC_FONTSET_ER) | |
603 { | |
604 reset_xjutil_fs_id (event.xclient.data.l[1], event.xclient.data.l[2]); | |
605 } | |
606 else if (event.xclient.data.l[0] == DIC_END) | |
607 { | |
608 end_xjutil_work (event.xclient.data.l[1]); | |
609 } | |
610 #endif /* USING_XJUTIL */ | |
611 if (event.xclient.data.l[0] == XWNMO_KILL) | |
612 { | |
613 kill_xim (event.xclient.data.l[1], event.xclient.data.l[2], event.xclient.data.l[3]); | |
614 } | |
615 #ifdef XJPLIB | |
616 else | |
617 { | |
618 XJp_event_dispatch (&event); | |
619 } | |
620 #endif | |
621 break; | |
622 #ifndef X11R5 | |
623 case SelectionRequest: | |
624 #ifdef BC_X11R5 | |
625 if (IS_NOT_FROM_XIMR5 (event)) | |
626 ximr5_client = 0; | |
627 #endif /* BC_X11R5 */ | |
628 XimConvertTarget (dpy, (XSelectionRequestEvent *) & event); | |
629 break; | |
630 #endif /* !X11R5 */ | |
631 default: | |
632 break; | |
633 } | |
634 for (i = 0; i < ret;) | |
635 { | |
636 n_bytes = get_cswidth_by_char (in = buff[i++]); | |
637 for (; n_bytes > 1 && i < ret; n_bytes--, i++) | |
638 { | |
639 in = (in << 8) + buff[i]; | |
640 } | |
641 in_put (in); | |
642 } | |
643 /* | |
644 } | |
645 */ | |
646 } | |
647 while (XPending (dpy) > 0); | |
648 } | |
649 | |
650 static Bool | |
651 yes_no_proc (display, ev, arg) | |
652 Display *display; | |
653 XEvent *ev; | |
654 char *arg; | |
655 { | |
656 register Window w = ev->xany.window; | |
657 | |
658 if (w == cur_p->yes_no->w || w == cur_p->yes_no->title->window || w == cur_p->yes_no->button[0]->window || w == cur_p->yes_no->button[1]->window) | |
659 { | |
660 return (True); | |
661 } | |
662 return (False); | |
663 } | |
664 | |
665 int | |
666 get_yes_no_event () | |
667 { | |
668 int buff[16]; | |
669 XEvent event; | |
670 | |
671 while (1) | |
672 { | |
673 XFlush (dpy); | |
674 XIfEvent (dpy, &event, yes_no_proc, 0); | |
675 switch (event.type) | |
676 { | |
677 case KeyPress: | |
678 if (key_input (buff, &event) > 0) | |
679 return (buff[0]); | |
680 break; | |
681 case Expose: | |
682 xw_expose (&event); | |
683 return (0); | |
684 case ButtonRelease: | |
685 button.x = event.xbutton.x_root; | |
686 button.y = event.xbutton.y_root; | |
687 if (xw_buttonpress (&event) == True) | |
688 { | |
689 return (0xd); | |
690 } | |
691 break; | |
692 case EnterNotify: | |
693 xw_enterleave (&event, 1); | |
694 break; | |
695 case LeaveNotify: | |
696 xw_enterleave (&event, 0); | |
697 break; | |
698 case MapNotify: | |
699 check_map (event.xmap.window); | |
700 return (0); | |
701 default: | |
702 break; | |
703 } | |
704 } | |
705 } |