comparison Xwnmo/xwnmo/util.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: util.c,v 1.2 2001/06/14 18:16:17 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 *
32 * Last modified date: 8,Feb.1999
33 *
34 * Code:
35 *
36 */
37 /* Version 4.0
38 */
39 #include <stdio.h>
40 #include "commonhd.h"
41 #include "sdefine.h"
42 #include "xim.h"
43 #include "sheader.h"
44 #include "proto.h"
45 #include "ext.h"
46
47 static int c_data_len = 0, use_langs_len = 0, cur_l_len = 0;
48 static int pre_font_len = 0, st_font_len = 0;
49 static char *c_data = NULL, *use_langs = NULL, *cur_l = NULL;
50 static char *pre_font = NULL, *st_font = NULL;
51
52 void
53 GetIM ()
54 {
55 ximGetIMReq req;
56 ximGetIMReply reply;
57 unsigned long mask;
58 int i;
59 XIMStyle tmp;
60 int tmp_num_styles, tmp_nbytes;
61
62 if (EACH_REQUEST (&req, sz_ximGetIMReq) == -1)
63 return;
64 if (need_byteswap () == True)
65 {
66 mask = byteswap_l (req.mask);
67 }
68 else
69 {
70 mask = req.mask;
71 }
72 reply.state = 0;
73 if (mask & (1 << IMQueryInputStyle))
74 {
75 reply.num_styles = MAX_SUPPORT_STYLE;
76 }
77 else
78 {
79 reply.num_styles = 0;
80 }
81 if (mask & (1 << IMQueryLanguage))
82 {
83 reply.nbytes = strlen (xim->supported_language);
84 }
85 else
86 {
87 reply.nbytes = 0;
88 }
89 tmp_num_styles = reply.num_styles;
90 tmp_nbytes = reply.nbytes;
91 if (need_byteswap () == True)
92 {
93 byteswap_GetIMReply (&reply);
94 }
95 if (_WriteToClient (&reply, sz_ximGetIMReply) == -1)
96 return;
97 if (tmp_num_styles > 0)
98 {
99 for (i = 0; i < MAX_SUPPORT_STYLE; i++)
100 {
101 if (need_byteswap () == True)
102 {
103 tmp = byteswap_l (xim->supported_style[i]);
104 }
105 else
106 {
107 tmp = xim->supported_style[i];
108 }
109 if (_WriteToClient (&tmp, sizeof (XIMStyle)) == -1)
110 {
111 return;
112 }
113 }
114 }
115 if (tmp_nbytes > 0)
116 {
117 if (_WriteToClient (xim->supported_language, tmp_nbytes) == -1)
118 {
119 return;
120 }
121 }
122 if (_Send_Flush () == -1)
123 return;
124 return;
125 }
126
127 /* *INDENT-OFF* */
128 Status
129 have_world (lc_list)
130 XIMNestLangList lc_list;
131 /* *INDENT-ON* */
132
133 {
134 XIMNestLangList p = lc_list;
135
136 for (; p != NULL; p = p->next)
137 {
138 if (!strcmp (p->lc_name, world_locale))
139 return (True);
140 }
141 return (False);
142 }
143
144 void
145 CreateIC ()
146 {
147 ximICValuesReq ic_req;
148 ximICAttributesReq pre_req, st_req;
149 ximCreateICReply reply;
150 #ifdef CALLBACKS
151 ximEventReply reply1;
152 #endif /* CALLBACKS */
153 int c_len;
154 XIMNestLangList p;
155 XIMNestLangList lc_list = NULL, cur_lc = NULL;
156 XIMClientRec *xc = NULL;
157 int error = 0;
158 int i, ret;
159 short detail;
160 int have_world = 0, cur_is_world = 0;
161
162 c_len = get_rest_len ();
163 if ((ret = read_strings (&c_data, &c_data_len, c_len)) < 0)
164 {
165 if (ret == -1)
166 return;
167 error++;
168 }
169
170 if (_ReadFromClient (&ic_req, sz_ximICValuesReq) == -1)
171 return;
172 if (need_byteswap () == True)
173 {
174 byteswap_ICValuesReq (&ic_req);
175 }
176 if ((ret = read_strings (&use_langs, &use_langs_len, ic_req.nbytes)) < 0)
177 {
178 if (ret == -1)
179 return;
180 error++;
181 }
182 if ((ret = read_strings (&cur_l, &cur_l_len, ic_req.nbytes2)) < 0)
183 {
184 if (ret == -1)
185 return;
186 error++;
187 }
188
189 if (_ReadFromClient (&pre_req, sz_ximICAttributesReq) == -1)
190 return;
191 if (need_byteswap () == True)
192 {
193 byteswap_ICAttributesReq (&pre_req);
194 }
195 if ((ret = read_strings (&pre_font, &pre_font_len, pre_req.nbytes)) < 0)
196 {
197 if (ret == -1)
198 return;
199 error++;
200 }
201
202 if (_ReadFromClient (&st_req, sz_ximICAttributesReq) == -1)
203 return;
204 if (need_byteswap () == True)
205 {
206 byteswap_ICAttributesReq (&st_req);
207 }
208 if ((ret = read_strings (&st_font, &st_font_len, st_req.nbytes)) < 0)
209 {
210 if (ret == -1)
211 return;
212 error++;
213 }
214 if (error > 0)
215 {
216 detail = AllocError;
217 goto ERROR_RET;
218 }
219
220 /*
221 * Check resources.
222 */
223 error = -1;
224 if ((ic_req.mask & (1 << ICInputStyle)))
225 {
226 for (i = 0; i < MAX_SUPPORT_STYLE; i++)
227 {
228 if (xim->supported_style[i] == ic_req.input_style)
229 {
230 error = 0;
231 break;
232 }
233 }
234 }
235 if (error != 0)
236 {
237 detail = BadStyle;
238 }
239 else
240 {
241 if (ic_req.input_style & (XIMPreeditArea | XIMPreeditPosition))
242 {
243 if (!(ic_req.mask & (1 << ICFontSet)) || !pre_font || !*pre_font)
244 {
245 error = -1;
246 detail = BadFontSet;
247 }
248 }
249 if (ic_req.input_style & XIMStatusArea)
250 {
251 if (!(ic_req.mask & (1 << (ICFontSet + StatusOffset))) || !st_font || !*st_font)
252 {
253 error = -1;
254 detail = BadFontSet;
255 }
256 }
257 if (ic_req.input_style & XIMPreeditPosition)
258 {
259 if (!(ic_req.mask & (1 << ICSpotLocation)))
260 {
261 error = -1;
262 detail = BadSpotLocation;
263 }
264 }
265 }
266 if (error == -1)
267 goto ERROR_RET;
268
269 if (!(ic_req.input_style & XIMPreeditNothing))
270 {
271 if ((have_world = get_langlist (use_langs, &lc_list)) < 0)
272 {
273 error = -1;
274 detail = AllocError;
275 goto ERROR_RET;
276 }
277 if (!lc_list)
278 {
279 error = -1;
280 detail = BadLanguage;
281 goto ERROR_RET;
282 }
283 if (cur_l && *cur_l)
284 {
285 for (p = lc_list; p != NULL; p = p->next)
286 {
287 if (!strcmp (p->lc_name, cur_l) || (p->alias_name && !strcmp (p->alias_name, cur_l)))
288 break;
289 }
290 if (p == NULL)
291 {
292 if ((i = get_langlist (cur_l, &cur_lc)) < 0)
293 {
294 error = -1;
295 detail = AllocError;
296 goto ERROR_RET;
297 }
298 else if (i > 0)
299 {
300 cur_is_world++;
301 free_langlist (cur_lc);
302 cur_lc = lc_list;
303 }
304 else
305 {
306 if (cur_lc)
307 {
308 cur_lc->next = lc_list;
309 }
310 else
311 {
312 cur_lc = lc_list;
313 }
314 }
315 }
316 else
317 {
318 cur_lc = p;
319 }
320 }
321 else
322 {
323 if (have_world == 2)
324 cur_is_world++;
325 cur_lc = lc_list;
326 }
327 }
328 xc = create_client (&ic_req, &pre_req, &st_req, lc_list, cur_lc, have_world, cur_is_world, pre_font, st_font, c_data, &detail);
329 free_langlist (lc_list);
330
331 ERROR_RET:
332 if (error != 0 || xc == NULL)
333 {
334 reply.state = -1;
335 reply.detail = detail;
336 reply.xic = 0;
337 }
338 else
339 {
340 reply.state = 0;
341 reply.xic = xim->client_count++;
342 xc->number = reply.xic;
343 }
344 #ifdef CALLBACKS
345 reply1.state = 0;
346 reply1.detail = XIM_IC;
347 if (need_byteswap () == True)
348 {
349 byteswap_EventReply (&reply1);
350 byteswap_CreateICReply (&reply);
351 }
352 if ((_WriteToClient (&reply1, sz_ximEventReply) == -1) || (_WriteToClient (&reply, sz_ximCreateICReply) == -1) ||
353 #else /* CALLBACKS */
354 if (need_byteswap () == True)
355 {
356 byteswap_CreateICReply (&reply);
357 }
358 if ((_WriteToClient (&reply, sz_ximCreateICReply) == -1) ||
359 #endif /* CALLBACKS */
360 (_Send_Flush () == -1))
361 {
362 return;
363 }
364 if (xc && IsPreeditNothing (xc))
365 {
366 check_root_mapping (xc->root_pointer);
367 }
368 return;
369 }
370
371 void
372 GetIC ()
373 {
374 ximGetICReq req;
375 ximGetICReply reply;
376 ximICValuesReq reply1;
377 ximICAttributesReq reply2;
378 register XIMClientRec *xc;
379 register XIMRootRec *root;
380 unsigned long mask = 0L;
381 XIMAttributes *pe, *st;
382 int tmp_nbytes, tmp_nbytes2;
383
384 if (EACH_REQUEST (&req, sz_ximGetICReq) == -1)
385 return;
386 if (need_byteswap () == True)
387 {
388 req.mask = byteswap_l (req.mask);
389 req.xic = byteswap_l (req.xic);
390 }
391 mask = req.mask;
392
393 for (xc = ximclient_list; xc != NULL; xc = xc->next)
394 {
395 if (xc->number == req.xic)
396 {
397 break;
398 }
399 }
400 if (xc == NULL)
401 {
402 reply.state = -1;
403 reply.detail = BadIC;
404 if (need_byteswap () == True)
405 {
406 byteswap_GetICReply (&reply);
407 }
408 if (_WriteToClient (&reply, sz_ximGetICReply) == -1)
409 return;
410 return;
411 }
412 else
413 {
414 reply.state = 0;
415 }
416 if (need_byteswap () == True)
417 {
418 byteswap_GetICReply (&reply);
419 }
420 if (_WriteToClient (&reply, sz_ximGetICReply) == -1)
421 return;
422 #ifdef CALLBACKS
423 /*
424 if (IsPreeditNothing(xc)) {
425 xc = xc->root_pointer->ximclient;
426 }
427 */
428 #endif /* CALLBACKS */
429
430 root = xc->root_pointer;
431 reply1.mask = mask;
432
433 if (mask & (1 << ICInputStyle))
434 {
435 reply1.input_style = xc->input_style;
436 }
437 if (mask & (1 << ICClientWindow))
438 {
439 reply1.c_window = xc->w;
440 }
441 if (mask & (1 << ICFocusWindow))
442 {
443 reply1.focus_window = xc->focus_window;
444 }
445 if (mask & (1 << ICFilterEvents))
446 {
447 reply1.filter_events = xc->filter_events;
448 }
449 if (mask & (1 << ICUsingLanguage))
450 {
451 if (IsPreeditNothing (xc))
452 {
453 reply1.nbytes = strlen (root->ximclient->using_language);
454 }
455 else if (xc->using_language)
456 {
457 reply1.nbytes = strlen (xc->using_language);
458 }
459 else
460 {
461 reply1.nbytes = 0;
462 }
463 }
464 else
465 {
466 reply1.nbytes = 0;
467 }
468 if (mask & (1 << ICCurrentLanguage))
469 {
470 if (IsPreeditNothing (xc))
471 {
472 if (root->ximclient->world_on)
473 {
474 reply1.nbytes2 = strlen (world_locale);
475 }
476 else
477 {
478 reply1.nbytes2 = strlen (root->ximclient->cur_xl->cur_lc->lc_name);
479 }
480 }
481 else if (xc->world_on)
482 {
483 reply1.nbytes2 = strlen (world_locale);
484 }
485 else if (xc->cur_xl->cur_lc->lc_name)
486 {
487 reply1.nbytes2 = strlen (xc->cur_xl->cur_lc->lc_name);
488 }
489 else
490 {
491 reply1.nbytes2 = 0;
492 }
493 /*
494 if ((mask & (1 << ICCurrentLanguage)) && !IsPreeditNothing(xc)
495 && xc->cur_xl->cur_lc->lc_name) {
496 reply1.nbytes2 = strlen(xc->cur_xl->cur_lc->lc_name);
497 */
498 }
499 else
500 {
501 reply1.nbytes2 = 0;
502 }
503 tmp_nbytes = reply1.nbytes;
504 tmp_nbytes2 = reply1.nbytes2;
505 if (need_byteswap () == True)
506 {
507 byteswap_ICValuesReq (&reply1);
508 }
509 if (_WriteToClient (&reply1, sz_ximICValuesReq) == -1)
510 return;
511 if (tmp_nbytes > 0)
512 {
513 if (IsPreeditNothing (xc))
514 {
515 if (_WriteToClient (root->ximclient->using_language, tmp_nbytes) == -1)
516 return;
517 }
518 else
519 {
520 if (_WriteToClient (xc->using_language, tmp_nbytes) == -1)
521 return;
522 }
523 }
524 if (tmp_nbytes2 > 0)
525 {
526 if (IsPreeditNothing (xc))
527 {
528 if (root->ximclient->world_on)
529 {
530 if (_WriteToClient (world_locale, tmp_nbytes2) == -1)
531 return;
532 }
533 else
534 {
535 if (_WriteToClient (root->ximclient->cur_xl->cur_lc->lc_name, tmp_nbytes2) == -1)
536 return;
537 }
538 }
539 else
540 {
541 if (xc->world_on)
542 {
543 if (_WriteToClient (world_locale, tmp_nbytes2) == -1)
544 return;
545 }
546 else
547 {
548 if (_WriteToClient (xc->cur_xl->cur_lc->lc_name, tmp_nbytes2) == -1)
549 return;
550 }
551 }
552 }
553
554 pe = &(xc->pe);
555 if (mask & (1 << ICArea))
556 {
557 reply2.area_x = pe->area.x;
558 reply2.area_y = pe->area.y;
559 reply2.area_width = pe->area.width;
560 reply2.area_height = pe->area.height;
561 }
562 if (mask & (1 << ICAreaNeeded))
563 {
564 reply2.areaneeded_width = pe->area_needed.width;
565 reply2.areaneeded_height = pe->area_needed.height;
566 }
567 if (IsPreeditPosition (xc))
568 {
569 if (mask & (1 << ICSpotLocation))
570 {
571 reply2.spot_x = xc->point.x;
572 reply2.spot_y = xc->point.y + FontAscent (xc->cur_xl);
573 }
574 }
575 if (mask & (1 << ICColormap))
576 {
577 reply2.colormap = pe->colormap;
578 }
579 if (mask & (1 << ICStdColormap))
580 {
581 reply2.std_colormap = pe->std_colormap;
582 }
583 if (mask & (1 << ICForeground))
584 {
585 reply2.foreground = pe->fg;
586 }
587 if (mask & (1 << ICBackground))
588 {
589 reply2.background = pe->bg;
590 }
591 if (mask & (1 << ICBackgroundPixmap))
592 {
593 reply2.pixmap = pe->bg_pixmap;
594 }
595 if (mask & (1 << ICLineSpace))
596 {
597 reply2.line_space = pe->line_space;
598 }
599 if (mask & (1 << ICCursor))
600 {
601 reply2.cursor = pe->cursor;
602 }
603 reply2.nfonts = 0;
604 reply2.nbytes = 0;
605 if (need_byteswap () == True)
606 {
607 byteswap_ICAttributesReq (&reply2);
608 }
609 if (_WriteToClient (&reply2, sz_ximICAttributesReq) == -1)
610 return;
611
612 st = &(xc->st);
613 if (mask & (1 << (ICArea + StatusOffset)))
614 {
615 reply2.area_x = st->area.x;
616 reply2.area_y = st->area.y;
617 reply2.area_width = st->area.width;
618 reply2.area_height = st->area.height;
619 }
620 if (mask & (1 << (ICAreaNeeded + StatusOffset)))
621 {
622 reply2.areaneeded_width = st->area_needed.width;
623 reply2.areaneeded_height = st->area_needed.height;
624 }
625 if (mask & (1 << (ICColormap + StatusOffset)))
626 {
627 reply2.colormap = st->colormap;
628 }
629 if (mask & (1 << (ICStdColormap + StatusOffset)))
630 {
631 reply2.std_colormap = st->std_colormap;
632 }
633 if (mask & (1 << (ICForeground + StatusOffset)))
634 {
635 reply2.foreground = st->fg;
636 }
637 if (mask & (1 << (ICBackground + StatusOffset)))
638 {
639 reply2.background = st->bg;
640 }
641 if (mask & (1 << (ICBackgroundPixmap + StatusOffset)))
642 {
643 reply2.pixmap = st->bg_pixmap;
644 }
645 if (mask & (1 << (ICLineSpace + StatusOffset)))
646 {
647 reply2.line_space = st->line_space;
648 }
649 if (mask & (1 << (ICCursor + StatusOffset)))
650 {
651 reply2.cursor = st->cursor;
652 }
653 reply2.nfonts = 0;
654 reply2.nbytes = 0;
655 if (need_byteswap () == True)
656 {
657 byteswap_ICAttributesReq (&reply2);
658 }
659 if (_WriteToClient (&reply2, sz_ximICAttributesReq) == -1)
660 return;
661 if (_Send_Flush () == -1)
662 return;
663 }
664
665 void
666 SetICFocus ()
667 {
668 ximICFocusReq req;
669 ximEventReply reply;
670 register XIMClientRec *xc;
671 register XIMInputRec *xi;
672 XIMClientRec *save_cur_p, *save_cur_x;
673 WnnClientRec *save_c_c;
674
675 if (EACH_REQUEST (&req, sz_ximICFocusReq) == -1)
676 return;
677 if (need_byteswap () == True)
678 {
679 req.xic = byteswap_l (req.xic);
680 }
681
682 for (xc = ximclient_list; xc != NULL; xc = xc->next)
683 {
684 if (xc->number == req.xic)
685 break;
686 }
687 if (xc == NULL)
688 {
689 reply.state = -1;
690 reply.detail = BadIC;
691 }
692 else
693 {
694 for (xi = input_list; xi != NULL; xi = xi->next)
695 {
696 if (xi->w == xc->focus_window)
697 break;
698 }
699 if (xi == NULL)
700 {
701 if (!(xi = (XIMInputRec *) Malloc (sizeof (XIMInputRec))))
702 {
703 malloc_error ("allocation of Focus data struct");
704 reply.state = -1;
705 reply.detail = AllocError;
706 goto ERROR_RET;
707 }
708 xi->w = xc->focus_window;
709 xi->pclient = xc;
710 xi->next = NULL;
711 add_inputlist (xi);
712 }
713 save_cur_p = cur_p;
714 save_cur_x = cur_x;
715 save_c_c = c_c;
716 cur_x = xc;
717 if (IsPreeditNothing (xc))
718 {
719 cur_p = xc->root_pointer->ximclient;
720 }
721 else
722 {
723 cur_p = cur_x;
724 }
725 c_c = cur_p->cur_xl->w_c;
726 cur_rk = c_c->rk;
727 cur_rk_table = cur_rk->rk_table;
728 #ifdef CALLBACKS
729 if (IsPreeditPosition (xc) || IsPreeditArea (xc) || IsStatusCallbacks (xc))
730 {
731 #else /* CALLBACKS */
732 if (IsPreeditPosition (xc) || IsPreeditArea (xc))
733 {
734 #endif /* CALLBACKS */
735 reset_preedit (xc);
736 }
737 #ifdef CALLBACKS
738 if (IsStatusArea (xc) || IsStatusCallbacks (xc))
739 {
740 #else /* CALLBACKS */
741 if (IsStatusArea (xc))
742 {
743 #endif /* CALLBACKS */
744 visual_status ();
745 }
746 cur_p = save_cur_p;
747 cur_x = save_cur_x;
748 c_c = save_c_c;
749 if (c_c)
750 {
751 cur_rk = c_c->rk;
752 cur_rk_table = cur_rk->rk_table;
753 }
754 reply.state = 0;
755 reply.detail = 0;
756 }
757 ERROR_RET:
758 if (need_byteswap () == True)
759 {
760 byteswap_EventReply (&reply);
761 }
762 if ((_WriteToClient (&reply, sz_ximEventReply) == -1) || (_Send_Flush () == -1))
763 return;
764 return;
765 }
766
767 void
768 UnsetICFocus ()
769 {
770 ximICFocusReq req;
771 ximEventReply reply;
772 register XIMClientRec *xc;
773 register XIMInputRec *xi;
774 XIMClientRec *save_cur_p, *save_cur_x;
775 WnnClientRec *save_c_c;
776
777 if (EACH_REQUEST (&req, sz_ximICFocusReq) == -1)
778 return;
779 if (need_byteswap () == True)
780 {
781 req.xic = byteswap_l (req.xic);
782 }
783
784 for (xc = ximclient_list; xc != NULL; xc = xc->next)
785 {
786 if (xc->number == req.xic)
787 break;
788 }
789 if (xc == NULL)
790 {
791 reply.state = -1;
792 reply.detail = BadIC;
793 }
794 else
795 {
796 for (xi = input_list; xi != NULL; xi = xi->next)
797 {
798 if (xi->w == xc->focus_window)
799 break;
800 }
801 if (xi == NULL)
802 {
803 reply.state = -1;
804 reply.detail = BadFocusWindow;
805 }
806 else
807 {
808 remove_inputlist (xi);
809 if (cur_input == xi)
810 cur_input = 0;
811 Free ((char *) xi);
812 save_cur_p = cur_p;
813 save_cur_x = cur_x;
814 save_c_c = c_c;
815 cur_x = xc;
816 if (IsPreeditNothing (xc))
817 {
818 cur_p = xc->root_pointer->ximclient;
819 }
820 else
821 {
822 cur_p = cur_x;
823 }
824 c_c = cur_p->cur_xl->w_c;
825 cur_rk = c_c->rk;
826 cur_rk_table = cur_rk->rk_table;
827 #ifdef CALLBACKS
828 if (IsPreeditPosition (xc) || IsPreeditArea (xc) || IsPreeditCallbacks (xc))
829 {
830 #else /* CALLBACKS */
831 if (IsPreeditPosition (xc) || IsPreeditArea (xc))
832 {
833 #endif /* CALLBACKS */
834 invisual_window ();
835 }
836 #ifdef CALLBACKS
837 if (IsStatusArea (xc) || IsStatusCallbacks (xc))
838 {
839 #else /* CALLBACKS */
840 if (IsStatusArea (xc))
841 {
842 #endif /* CALLBACKS */
843 invisual_status ();
844 }
845 cur_p = save_cur_p;
846 cur_x = save_cur_x;
847 c_c = save_c_c;
848 if (c_c)
849 {
850 cur_rk = c_c->rk;
851 cur_rk_table = cur_rk->rk_table;
852 }
853 reply.state = 0;
854 reply.detail = 0;
855 }
856 }
857 if (need_byteswap () == True)
858 {
859 byteswap_EventReply (&reply);
860 }
861 if ((_WriteToClient (&reply, sz_ximEventReply) == -1) || (_Send_Flush () == -1))
862 return;
863 return;
864 }
865
866 void
867 ChangeIC ()
868 {
869 register XIMClientRec *xc;
870 XIMNestLangRec *p = NULL;
871 short detail;
872 ximChangeICReq req;
873 ximICValuesReq ic_req;
874 ximICAttributesReq pre_req, st_req;
875 ximEventReply reply;
876 int error = 0, ret, cur_is_world = 0;
877
878 if (EACH_REQUEST (&req, sz_ximChangeICReq) == -1)
879 return;
880 if (need_byteswap () == True)
881 {
882 req.xic = byteswap_l (req.xic);
883 }
884
885 if (_ReadFromClient (&ic_req, sz_ximICValuesReq) == -1)
886 return;
887 if (need_byteswap () == True)
888 {
889 byteswap_ICValuesReq (&ic_req);
890 }
891 if ((ret = read_strings (&use_langs, &use_langs_len, ic_req.nbytes)) < 0)
892 {
893 if (ret == -1)
894 return;
895 error++;
896 }
897 if ((ret = read_strings (&cur_l, &cur_l_len, ic_req.nbytes2)) < 0)
898 {
899 if (ret == -1)
900 return;
901 error++;
902 }
903
904 if (_ReadFromClient (&pre_req, sz_ximICAttributesReq) == -1)
905 return;
906 if (need_byteswap () == True)
907 {
908 byteswap_ICAttributesReq (&pre_req);
909 }
910 if ((ret = read_strings (&pre_font, &pre_font_len, pre_req.nbytes)) < 0)
911 {
912 if (ret == -1)
913 return;
914 error++;
915 }
916
917 if (_ReadFromClient (&st_req, sz_ximICAttributesReq) == -1)
918 return;
919 if (need_byteswap () == True)
920 {
921 byteswap_ICAttributesReq (&st_req);
922 }
923 if ((ret = read_strings (&st_font, &st_font_len, st_req.nbytes)) < 0)
924 {
925 if (ret == -1)
926 return;
927 error++;
928 }
929 if (error > 0)
930 {
931 reply.state = -1;
932 reply.detail = AllocError;
933 goto ERROR_RET;
934 }
935
936 for (xc = ximclient_list; xc != NULL; xc = xc->next)
937 {
938 if (xc->number == req.xic)
939 break;
940 }
941 if (xc == NULL)
942 {
943 reply.state = -1;
944 reply.detail = BadIC;
945 }
946 else
947 {
948 if (cur_l && *cur_l)
949 {
950 if ((cur_is_world = get_langlist (cur_l, &p)) < 0)
951 {
952 reply.state = -1;
953 reply.detail = AllocError;
954 goto ERROR_RET;
955 }
956 }
957 if (change_client (xc, &ic_req, &pre_req, &st_req, p, cur_is_world, pre_font, st_font, &detail) == -1)
958 {
959 reply.state = -1;
960 reply.detail = detail;
961 }
962 else
963 {
964 reply.state = 0;
965 reply.detail = 0;
966 }
967 if (p)
968 free_langlist (p);
969 }
970 ERROR_RET:
971 if (need_byteswap () == True)
972 {
973 byteswap_EventReply (&reply);
974 }
975 if ((_WriteToClient (&reply, sz_ximEventReply) == -1) || (_Send_Flush () == -1))
976 return;
977 return;
978 }
979
980 void
981 DestroyIC ()
982 {
983 ximDestroyICReq req;
984 ximEventReply reply;
985 register XIMClientRec *xc;
986
987 if (EACH_REQUEST (&req, sz_ximDestroyICReq) == -1)
988 return;
989 if (need_byteswap () == True)
990 {
991 req.xic = byteswap_l (req.xic);
992 }
993
994 for (xc = ximclient_list; xc != NULL; xc = xc->next)
995 {
996 if (xc->number == req.xic)
997 break;
998 }
999 if (xc == NULL)
1000 {
1001 reply.state = -1;
1002 reply.detail = BadIC;
1003 }
1004 else
1005 {
1006 reply.state = 0;
1007 reply.detail = 0;
1008 }
1009 if (need_byteswap () == True)
1010 {
1011 byteswap_EventReply (&reply);
1012 }
1013 if ((_WriteToClient (&reply, sz_ximEventReply) == -1) || (_Send_Flush () == -1))
1014 return;
1015 if (xc)
1016 {
1017 (void) destroy_client (xc);
1018 }
1019 return;
1020 }
1021
1022 void
1023 destroy_for_sock (fd)
1024 int fd;
1025 {
1026 register XIMClientRec *xc;
1027
1028 for (xc = ximclient_list; xc != NULL; xc = xc->next)
1029 {
1030 if (xc->fd == fd)
1031 {
1032 (void) destroy_client (xc);
1033 /*
1034 break;
1035 */
1036 }
1037 }
1038 }
1039
1040 void
1041 destroy_xl (xc, xl)
1042 register XIMClientRec *xc;
1043 register XIMLangRec *xl;
1044 {
1045 remove_locale_to_xl (xl, NULL);
1046 #ifdef X11R5
1047 if (xl->xlc)
1048 XFree ((char *) xl->xlc);
1049 #endif /* X11R5 */
1050 if (!(IsPreeditNothing (xc)))
1051 {
1052 if (IsPreeditArea (xc))
1053 {
1054 XDestroyWindow (dpy, xl->wp[0]);
1055 }
1056 else if (IsPreeditPosition (xc))
1057 {
1058 XDestroyWindow (dpy, xl->wp[0]);
1059 XDestroyWindow (dpy, xl->wp[1]);
1060 XDestroyWindow (dpy, xl->wp[2]);
1061 XDestroyWindow (dpy, xl->wn[0]);
1062 XDestroyWindow (dpy, xl->wn[1]);
1063 XDestroyWindow (dpy, xl->wn[2]);
1064 }
1065 if (xl->pe_fs)
1066 XFreeFontSet (dpy, xl->pe_fs);
1067 if (xl->pe_b_char)
1068 Free ((char *) xl->pe_b_char);
1069 del_client (xl->w_c, 0);
1070 Free ((char *) xl->buf);
1071 }
1072 if (!(IsStatusNothing (xc)))
1073 {
1074 if (IsStatusArea (xc))
1075 {
1076 XDestroyWindow (dpy, xl->ws);
1077 }
1078 if (xl->st_fs)
1079 XFreeFontSet (dpy, xl->st_fs);
1080 if (xl->st_b_char)
1081 Free ((char *) xl->st_b_char);
1082 Free ((char *) xl->buf0);
1083 }
1084 Free ((char *) xl);
1085 }
1086
1087 void
1088 destroy_client (xc)
1089 register XIMClientRec *xc;
1090 {
1091 register int i;
1092 register XIMInputRec *xi;
1093
1094 if (cur_x && cur_x == xc)
1095 {
1096 if (
1097 #ifdef CALLBACKS
1098 IsPreeditCallbacks (xc) ||
1099 #endif /* CALLBACKS */
1100 IsPreeditPosition (xc) || IsPreeditArea (xc))
1101 {
1102 invisual_window ();
1103 }
1104 if (!IsPreeditNothing (xc) && c_c->func_stack_count >= 0 && c_c->command_func_stack[c_c->func_stack_count] != 0)
1105 {
1106 (*c_c->command_func_stack[c_c->func_stack_count]) (-99);
1107 }
1108 cur_input = NULL;
1109 cur_x = NULL;
1110 cur_p = NULL;
1111 c_c = NULL;
1112 }
1113 for (xi = input_list; xi != NULL; xi = xi->next)
1114 {
1115 if (xi->pclient == xc)
1116 {
1117 remove_inputlist (xi);
1118 if (cur_input == xi)
1119 cur_input = NULL;
1120 Free ((char *) xi);
1121 }
1122 }
1123 for (i = 0; i < xc->lang_num; i++)
1124 {
1125 destroy_xl (xc, xc->xl[i]);
1126 }
1127 remove_ximclientlist (xc);
1128 if (xc->yes_no)
1129 {
1130 remove_box (xc->yes_no->title);
1131 remove_box (xc->yes_no->button[0]);
1132 remove_box (xc->yes_no->button[1]);
1133 Free ((char *) xc->yes_no);
1134 }
1135 if (xc->using_language)
1136 Free ((char *) xc->using_language);
1137 if (xc->user_name)
1138 Free ((char *) xc->user_name);
1139 if (xc->pe.fontset)
1140 Free ((char *) xc->pe.fontset);
1141 if (xc->st.fontset)
1142 Free ((char *) xc->st.fontset);
1143 if (xc->pe.gc)
1144 XFreeGC (dpy, xc->pe.gc);
1145 if (xc->pe.invertgc)
1146 XFreeGC (dpy, xc->pe.invertgc);
1147 if (xc->pe.reversegc)
1148 XFreeGC (dpy, xc->pe.reversegc);
1149 if (xc->st.gc)
1150 XFreeGC (dpy, xc->st.gc);
1151 if (xc->st.reversegc)
1152 XFreeGC (dpy, xc->st.reversegc);
1153 if (xc->xl)
1154 Free ((char *) xc->xl);
1155 if (IsPreeditNothing (xc))
1156 {
1157 check_root_mapping (xc->root_pointer);
1158 }
1159 Free ((char *) xc);
1160 return;
1161 }
1162
1163 void
1164 ResetIC ()
1165 {
1166 ximResetICReq req;
1167 ximEventReply reply;
1168 register XIMClientRec *xc;
1169 WnnClientRec *save_c_c;
1170 XIMClientRec *save_cur_p, *save_cur_x;
1171 int ret;
1172
1173 if (EACH_REQUEST (&req, sz_ximResetICReq) == -1)
1174 return;
1175 if (need_byteswap () == True)
1176 {
1177 req.xic = byteswap_l (req.xic);
1178 }
1179
1180 for (xc = ximclient_list; xc != NULL; xc = xc->next)
1181 {
1182 if (xc->number == req.xic)
1183 break;
1184 }
1185 if (xc == NULL)
1186 {
1187 reply.state = -1;
1188 reply.detail = BadIC;
1189 }
1190 else
1191 {
1192 save_c_c = c_c;
1193 save_cur_p = cur_p;
1194 save_cur_x = cur_x;
1195 cur_x = xc;
1196 if (IsPreeditNothing (xc))
1197 {
1198 cur_p = xc->root_pointer->ximclient;
1199 }
1200 else
1201 {
1202 cur_p = cur_x;
1203 }
1204 c_c = cur_p->cur_xl->w_c;
1205 ret = reset_c_b ();
1206 JWMline_clear (0);
1207 c_c = save_c_c;
1208 cur_p = save_cur_p;
1209 cur_x = save_cur_x;
1210 if (ret == -1)
1211 {
1212 reply.state = -1;
1213 reply.detail = BadIC;
1214 }
1215 else
1216 {
1217 reply.state = 0;
1218 reply.detail = 0;
1219 }
1220 }
1221 if (need_byteswap () == True)
1222 {
1223 byteswap_EventReply (&reply);
1224 }
1225 if ((_WriteToClient (&reply, sz_ximEventReply) == -1) || (_Send_Flush () == -1))
1226 return;
1227 return;
1228 }
1229
1230 void
1231 free_langlist (p)
1232 register XIMNestLangList p;
1233 {
1234 register XIMNestLangList n;
1235 for (; p != NULL; p = n)
1236 {
1237 n = p->next;
1238 Free ((char *) p);
1239 }
1240 }
1241
1242 int
1243 get_langlist (lang, nl)
1244 char *lang;
1245 XIMNestLangList *nl;
1246 {
1247 register char *d, *save_d, *p, *alloc, *next;
1248 register int alias_name_len, lc_name_len, have_world = 0;
1249 register XIMNestLangList pp = NULL, prev = NULL, ls;
1250 XIMNestLangList w_ls;
1251 register XIMLcNameRec *lnl;
1252
1253 *nl = NULL;
1254 if (lang == NULL || *lang == '\0')
1255 return (0);
1256 if (!(save_d = d = alloc_and_copy (lang)))
1257 return (-1);
1258 for (;;)
1259 {
1260 if (p = index ((p = d), ';'))
1261 {
1262 *p = '\0';
1263 next = ++p;
1264 }
1265 else
1266 {
1267 next = NULL;
1268 }
1269 if (p = index ((p = d), ','))
1270 {
1271 *(p++) = '\0';
1272 alias_name_len = strlen (p);
1273 }
1274 else
1275 {
1276 alias_name_len = 0;
1277 }
1278 lc_name_len = strlen (d);
1279
1280 if (!strcmp (world_locale, d))
1281 {
1282 have_world++;
1283 d = next;
1284 if (!d)
1285 break;
1286 continue;
1287 }
1288 for (lnl = lc_name_list; lnl; lnl = lnl->next)
1289 {
1290 if (!strcmp (lnl->lc_name, d))
1291 break;
1292 }
1293 if (!lnl)
1294 {
1295 print_out1 ("I don't support such locale \"%s\".", d);
1296 d = next;
1297 if (!d)
1298 break;
1299 continue;
1300 }
1301 if (!(alloc = Calloc (1, (sizeof (XIMNestLangRec) + lc_name_len + alias_name_len + 2))))
1302 {
1303 malloc_error ("allocation langlist struct");
1304 return (-1);
1305 }
1306 ls = (XIMNestLangList) alloc;
1307 alloc += sizeof (XIMNestLangRec);
1308 ls->lc_name = alloc;
1309 strcpy (ls->lc_name, d);
1310 alloc += lc_name_len + 1;
1311 if (alias_name_len > 0)
1312 {
1313 ls->alias_name = alloc;
1314 strcpy (ls->alias_name, p);
1315 }
1316 ls->lang_db = lnl->lang_db;
1317 if (prev == NULL)
1318 {
1319 pp = ls;
1320 }
1321 else
1322 {
1323 prev->next = ls;
1324 }
1325 prev = ls;
1326 ls->next = NULL;
1327 d = next;
1328 if (!d)
1329 break;
1330 }
1331 Free (save_d);
1332 if (have_world)
1333 {
1334 if (get_langlist (world_lang, &w_ls) < 0)
1335 return (-1);
1336 if (w_ls)
1337 {
1338 if (pp)
1339 {
1340 ls->next = w_ls;
1341 }
1342 else
1343 {
1344 pp = w_ls;
1345 have_world++;
1346 }
1347 }
1348 else
1349 {
1350 have_world = 0;
1351 }
1352 }
1353 *nl = pp;
1354 return (have_world);
1355 }
1356
1357 #ifdef SPOT
1358 void
1359 ChangeSpot ()
1360 {
1361 register XIMClientRec *xc;
1362 ximChangeSpotReq req;
1363 ximEventReply reply;
1364
1365 if (EACH_REQUEST (&req, sz_ximChangeSpotReq) == -1)
1366 return;
1367 if (need_byteswap () == True)
1368 {
1369 req.xic = byteswap_l (req.xic);
1370 req.spot_x = byteswap_s (req.spot_x);
1371 req.spot_y = byteswap_s (req.spot_y);
1372 }
1373
1374 for (xc = ximclient_list; xc != NULL; xc = xc->next)
1375 {
1376 if (xc->number == req.xic)
1377 break;
1378 }
1379 if (xc == NULL)
1380 {
1381 reply.state = -1;
1382 reply.detail = BadIC;
1383 }
1384 else
1385 {
1386 if (change_spotlocation (xc, req.spot_x, req.spot_y) == -1)
1387 {
1388 reply.state = -1;
1389 reply.detail = 0;
1390 }
1391 else
1392 {
1393 reply.state = 0;
1394 reply.detail = 0;
1395 }
1396 }
1397 if (need_byteswap () == True)
1398 {
1399 byteswap_EventReply (&reply);
1400 }
1401 if ((_WriteToClient (&reply, sz_ximEventReply) == -1) || (_Send_Flush () == -1))
1402 return;
1403 return;
1404 }
1405 #endif /* SPOT */