1 /*
2  * $Id: ichiran.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  *
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 #ifdef XJUTIL
43 #include "xjutil.h"
44 #include "sxheader.h"
45 #include "xext.h"
46 #else /* XJUTIL */
47 #include "xim.h"
48 #include "sheader.h"
49 #include "ext.h"
50 #endif /* XJUTIL */
51 
52 extern GC currentGC;
53 
54 extern wchar_t cursor_wchar_t;
55 
56 #ifdef XJUTIL
57 extern XPoint button;
58 extern XSizeHints hints;
59 extern Cursor cursor1;
60 
61 #define ICHI            (cur_root->ichi)
62 #define FONTHEIGHT      FontHeight
63 #define FONTWIDTH       FontWidth
64 #define FONTASCENT      FontAscent
65 #define FONTDESCENT     FontDescent
66 #define CANCEL_NUM      2
67 #define MOUSE_NUM       111
68 #define NEXT_NUM        3
69 #define BACK_NUM        4
70 #define YES_NUM         5
71 #define NO_NUM          6
72 #define OK_NUM          7
73 #define FOREGROUND      (cur_root->fg)
74 #define BACKGROUND      (cur_root->bg)
75 #define SEL_RET         (xjutil->sel_ret)
76 #define ROOT_WINDOW     (cur_root->root_window)
77 #define SCREEN          (cur_root->screen)
78 #else /* XJUTIL */
79 #define ICHI            (xim->cur_j_c_root->ichi)
80 #define FONTHEIGHT      FontHeight(xl)
81 #define FONTWIDTH       FontWidth(xl)
82 #define FONTASCENT      FontAscent(xl)
83 #define FONTDESCENT     FontDescent(xl)
84 #define CANCEL_NUM      16
85 #define MOUSE_NUM       39
86 #define NEXT_NUM        41
87 #define BACK_NUM        42
88 #define YES_NUM         51
89 #define NO_NUM          52
90 #define OK_NUM          53
91 #define FOREGROUND      (cur_p->pe.fg)
92 #define BACKGROUND      (cur_p->pe.bg)
93 #define SEL_RET         (xim->sel_ret)
94 #define ROOT_WINDOW     (xim->cur_j_c_root->root_window)
95 #define SCREEN          (xim->cur_j_c_root->screen)
96 #endif /* XJUTIL */
97 
98 static struct jikouho_ichi
99 {
100   int x_s;
101   int y_s;
102   int x_e;
103   int y_e;
104   int line;
105 }
106 jikouho_ichi[MAXJIKOUHO + 1];
107 
108 static int jikouho_line[MAXJIKOUHO + 1];
109 
110 static int
Y_InItem(y)111 Y_InItem (y)
112      int y;
113 {
114 #ifndef XJUTIL
115   register XIMLangRec *xl;
116 
117   if (xim->j_c == NULL)
118     return (-1);
119   xl = xim->j_c->cur_xl;
120 #endif /* !XJUTIL */
121 
122   if (y < 0 || y > ICHI->item_height)
123     return (-1);
124   return (y / (FONTHEIGHT + IN_BORDER));
125 }
126 
127 static void
xw_fillrec()128 xw_fillrec ()
129 {
130   register Ichiran *ichi;
131 #ifndef XJUTIL
132   XIMLangRec *xl;
133 
134   if (xim->j_c == NULL)
135     return;
136   xl = xim->j_c->cur_xl;
137 #endif /* !XJUTIL */
138   ichi = ICHI;
139 
140   if (ichi->hilited_item != -1)
141     {
142       XFillRectangle (dpy, ichi->w1, ichi->invertgc, 0, ichi->hilited_item * (FONTHEIGHT + IN_BORDER), ichi->item_width, (FONTHEIGHT + IN_BORDER));
143       XFlush (dpy);
144     }
145   return;
146 }
147 
148 static void
xw_ji_fillrec()149 xw_ji_fillrec ()
150 {
151   register Ichiran *ichi;
152 
153 #ifndef XJUTIL
154   if (!xim->j_c)
155     return;
156 #endif /* !XJUTIL */
157   ichi = ICHI;
158   if (ichi->hilited_ji_item != -1)
159     {
160       XFillRectangle (dpy, ichi->w1, ichi->invertgc,
161                       jikouho_ichi[ichi->hilited_ji_item].x_s,
162                       jikouho_ichi[ichi->hilited_ji_item].y_s,
163                       (jikouho_ichi[ichi->hilited_ji_item].x_e - jikouho_ichi[ichi->hilited_ji_item].x_s), (jikouho_ichi[ichi->hilited_ji_item].y_e - jikouho_ichi[ichi->hilited_ji_item].y_s));
164       XFlush (dpy);
165     }
166   return;
167 }
168 
169 #ifdef XJUTIL
170 void
decide_position(width,height,border,ret_x,ret_y)171 decide_position (width, height, border, ret_x, ret_y)
172 #else /* XJUTIL */
173 static void
174 decide_position (root, xl, width, height, border, ret_x, ret_y)
175      register XIMRootRec *root;
176      register XIMLangRec *xl;
177 #endif /* XJUTIL */
178      register int width, height, border;
179      register int *ret_x, *ret_y;
180 {
181 #ifdef XJUTIL
182   if (xjutil->sel_button)
183     {
184       *ret_x = button.x - width / 2;
185       *ret_y = button.y - FontHeight;
186       xjutil->sel_button = 0;
187     }
188   else
189     {
190       *ret_x = (DisplayWidth (dpy, SCREEN) - width) / 2;
191       *ret_y = (DisplayHeight (dpy, SCREEN) - height) / 2;
192     }
193 #else /* XJUTIL */
194   Window r, parent, child, *children;
195   XWindowAttributes to_attr;
196   int root_x, root_y;
197   unsigned int nc;
198 
199   if (xim->sel_button)
200     {
201       *ret_x = button.x - FONTWIDTH;;
202       *ret_y = button.y - FONTHEIGHT;
203       xim->sel_button = 0;
204     }
205   else
206     {
207       if (IsPreeditNothing (cur_x))
208         {
209           XGetWindowAttributes (dpy, root->ximclient->w, &to_attr);
210           XQueryTree (dpy, root->ximclient->w, &r, &parent, &children, &nc);
211           XTranslateCoordinates (dpy, parent, ROOT_WINDOW, to_attr.x, to_attr.y, &root_x, &root_y, &child);
212           *ret_x = root_x;
213           *ret_y = root_y - height;
214         }
215       else
216         {
217           XGetWindowAttributes (dpy, cur_x->w, &to_attr);
218           XQueryTree (dpy, cur_x->w, &r, &parent, &children, &nc);
219           XTranslateCoordinates (dpy, parent, ROOT_WINDOW, to_attr.x, to_attr.y, &root_x, &root_y, &child);
220           *ret_x = root_x;
221           *ret_y = root_y + to_attr.height;
222         }
223     }
224 #endif /* XJUTIL */
225   if ((*ret_x + width + border) > DisplayWidth (dpy, SCREEN))
226     *ret_x = DisplayWidth (dpy, SCREEN) - width - border;
227   if (*ret_x < 0)
228     *ret_x = 0;
229   if ((*ret_y + height + border) > DisplayHeight (dpy, SCREEN))
230     *ret_y = DisplayHeight (dpy, SCREEN) - height - border;
231   if (*ret_y < 0)
232     *ret_y = 0;
233   return;
234 }
235 
236 static int
xw_set_jikouho(info,kosuu,width)237 xw_set_jikouho (info, kosuu, width)
238      unsigned char **info;
239      int kosuu;
240      int width;
241 {
242   register int cnt, cntt;
243   register unsigned char *p;
244   unsigned char tmp[256];
245   register int columns = 0;
246   register Ichiran *ichi;
247 
248 #ifndef XJUTIL
249   register XIMLangRec *xl;
250 
251   if (xim->j_c == NULL)
252     return (-1);
253   xl = xim->j_c->cur_xl;
254 #endif /* !XJUTIL */
255   ichi = ICHI;
256 
257   jikouho_ichi[0].x_s = 0;
258   jikouho_line[1] = 0;
259 
260   p = ichi->buf[0] = ichi->save_buf[0];
261   *p = 0;
262   for (cnt = 0, cntt = 0; cnt < kosuu; cnt++)
263     {
264       if (ichi->mode & JIKOUHO)
265         sprintf ((char *) tmp, "  %s  ", info[cnt]);
266       else if (ichi->mode & JIS_IN)
267         sprintf ((char *) tmp, "%2x. %s ", cnt + ((kosuu < 16) ? 1 : 33), info[cnt]);
268       else if (ichi->mode & KUTEN_IN)
269         sprintf ((char *) tmp, "%2d. %s ", cnt + 1, info[cnt]);
270       if ((columns += columnlen ((char *) tmp)) > width)
271         {
272           if (columns == columnlen ((char *) tmp))
273             {
274               width = columns;
275             }
276           else
277             {
278               jikouho_line[++cntt + 1] = cnt;
279               jikouho_ichi[cnt--].x_s = 0;
280               columns = 0;
281               if (cntt >= ichi->max_lines)
282                 alloc_for_save_buf (ichi, ichi->max_lines + MAX_PAGE_LINES);
283               p = ichi->buf[cntt] = ichi->save_buf[cntt];
284               *p = 0;
285               continue;
286             }
287         }
288       jikouho_ichi[cnt + 1].x_s = columns * FONTWIDTH;
289       jikouho_ichi[cnt].x_e = columns * FONTWIDTH - 1;
290       jikouho_ichi[cnt].y_s = cntt * (FONTHEIGHT + IN_BORDER);
291       jikouho_ichi[cnt].y_e = (cntt + 1) * (FONTHEIGHT + IN_BORDER) - 1;
292       jikouho_ichi[cnt].line = cntt + 1;
293       p = (unsigned char *) strcat ((char *) p, (char *) tmp);
294     }
295   jikouho_line[++cntt + 1] = kosuu;
296   return (cntt);
297 }
298 
299 static void
move_ichi(ichi)300 move_ichi (ichi)
301      register Ichiran *ichi;
302 {
303   ichi->start_line = (ichi->cur_page - 1) * ichi->max_line;
304   ichi->end_line = ichi->start_line + ichi->max_line - 1;
305   XMoveWindow (dpy, ichi->w1, 0, -((ichi->cur_page - 1) * ichi->page_height));
306 }
307 static void
check_move_ichi(p)308 check_move_ichi (p)
309      register int p;
310 {
311   register int tmp;
312   register Ichiran *ichi;
313 
314 #ifndef XJUTIL
315   if (!xim->j_c)
316     return;
317 #endif /* !XJUTIL */
318   ichi = ICHI;
319   if ((tmp = p / ichi->max_line + (p % ichi->max_line ? 1 : 0)) != ichi->cur_page)
320     {
321       ichi->cur_page = tmp;
322       move_ichi (ichi);
323     }
324 }
325 
326 void
JW3Mputc(s,w,li,flg,in)327 JW3Mputc (s, w, li, flg, in)
328      unsigned char *s;
329      register Window w;
330      register int li, flg, in;
331 {
332 #ifndef XJUTIL
333   register XIMLangRec *xl = cur_p->cur_xl;
334 #endif /* !XJUTIL */
335   int wc_len;
336   XCharStruct cs;
337 
338 #ifdef XJUTIL
339   if (flg & REV_FLAG)
340     {
341       currentGC = cur_root->reversegc;
342     }
343   else
344     {
345       currentGC = cur_root->gc;
346     }
347 #else /* XJUTIL */
348   if (flg & REV_FLAG)
349     {
350       currentGC = cur_p->pe.reversegc;
351     }
352   else
353     {
354       currentGC = cur_p->pe.gc;
355     }
356 #endif /* XJUTIL */
357   cs.width = FONTWIDTH;
358   cs.ascent = FONTASCENT;
359   cs.descent = FONTDESCENT;
360 
361   while (1)
362     {
363 #ifdef XJUTIL
364       wc_len = char_to_wchar (xjutil->xlc, s, wc_buf, strlen ((char *) s),
365 #else /* XJUTOIL */
366       wc_len = char_to_wchar (xl->xlc, s, wc_buf, strlen ((char *) s),
367 #endif /* XJUTOIL */
368                               wc_buf_max);
369       if (wc_len < -1)
370         {
371           return;
372         }
373       else if (wc_len == -1)
374         {
375           if (realloc_wc_buf () < 0)
376             return;
377         }
378       else
379         {
380           break;
381         }
382     }
383 #ifdef XJUTIL
384   JWOutput (w, cur_fs->fs, currentGC, 0, 0, flg,
385 #else /* XJUTOIL */
386   JWOutput (w, xl->pe_fs, currentGC, 0, 0, flg,
387 #endif /* XJUTOIL */
388             in, (li * (FONTHEIGHT + in) + in), &cs, wc_buf, wc_len);
389 }
390 
391 static void
set_wm_size(window,width,height)392 set_wm_size (window, width, height)
393      Window window;
394      unsigned int width, height;
395 {
396   XSizeHints hints;
397 
398   hints.flags = (USSize | PMinSize | PMaxSize);
399   hints.width = hints.min_width = hints.max_width = width;
400   hints.height = hints.min_height = hints.max_height = height;
401   XSetWMNormalHints (dpy, window, &hints);
402 }
403 
404 void
set_wm_properties(window,x,y,width,height,gravity,name,class_name,input,state,flags,icon_x,icon_y)405 set_wm_properties (window, x, y, width, height, gravity, name, class_name, input, state, flags, icon_x, icon_y)
406      Window window;
407      int x, y;
408      unsigned int width, height;
409      int gravity;
410      char *name, *class_name;
411      Bool input;
412      int state;
413      long flags;
414      int icon_x, icon_y;
415 {
416   XSizeHints hints;
417   XClassHint class_hints;
418   XWMHints wm_hints;
419 #ifndef X11R3
420   XTextProperty winName, iconName;
421 #else /* X11R3 */
422   char *winName, *iconName;
423 #endif /* X11R3 */
424 
425 
426   if (name)
427     {
428 #ifndef X11R3
429       winName.encoding = XA_STRING;
430       winName.format = 8;
431       winName.value = (unsigned char *) class_name;
432       winName.nitems = strlen ((char *) winName.value);
433       iconName.encoding = XA_STRING;
434       iconName.format = 8;
435       iconName.value = (unsigned char *) class_name;
436       iconName.nitems = strlen ((char *) winName.value);
437 #else /* X11R3 */
438       winName = class_name;
439       iconName = class_name;
440 #endif /* X11R3 */
441       class_hints.res_name = name;
442       class_hints.res_class = class_name;
443       wm_hints.input = input;
444       wm_hints.flags = flags;
445       wm_hints.initial_state = state;
446       wm_hints.icon_x = icon_x;
447       wm_hints.icon_y = icon_y;
448     }
449   else
450     {
451       wm_hints.flags = StateHint;
452       wm_hints.initial_state = NormalState;
453     }
454 
455   hints.flags = (USSize | USPosition | PMinSize | PMaxSize | PResizeInc
456 #ifndef X11R3
457                  | PBaseSize | PWinGravity
458 #endif /* X11R3 */
459     );
460 
461   hints.x = x;
462   hints.y = y;
463   hints.width = hints.min_width = hints.max_width = width;
464   hints.height = hints.min_height = hints.max_height = height;
465   hints.width_inc = hints.height_inc = 0;
466 #ifndef X11R3
467   hints.base_width = width;
468   hints.base_height = height;
469   hints.win_gravity = gravity;
470   if (name)
471     {
472       XSetWMProperties (dpy, window, &winName, &iconName, NULL, 0, &hints, &wm_hints, &class_hints);
473     }
474   else
475     {
476       XSetWMNormalHints (dpy, window, &hints);
477       XSetWMHints (dpy, window, &wm_hints);
478     }
479 #else /* X11R3 */
480   if (name)
481     {
482       XSetStandardProperties (dpy, window, winName, iconName, None, NULL, 0, &hints);
483       XSetWMHints (dpy, window, &wm_hints);
484       XSetClassHint (dpy, window, &class_hints);
485     }
486   else
487     {
488       XSetNormalHints (dpy, window, &hints);
489       XSetWMHints (dpy, window, &wm_hints);
490     }
491 #endif /* X11R3 */
492 }
493 
494 static void
next_back_ichi(ichi,next)495 next_back_ichi (ichi, next)
496      register Ichiran *ichi;
497      register int next;
498 {
499   register int start_end;
500 
501   move_ichi (ichi);
502   if (next)
503     {
504       start_end = ichi->start_line;
505     }
506   else
507     {
508       start_end = ichi->end_line;
509       if (start_end >= ichi->kosuu)
510         start_end = ichi->kosuu - 1;
511     }
512   if (ichi->mode & SENTAKU)
513     {
514       ichi->hilited_item = start_end;
515     }
516   else
517     {
518       ichi->hilited_ji_item = jikouho_line[start_end + 1];
519     }
520   redraw_ichi_w ();
521 }
522 
523 int
init_ichiran(info,kosuu,init,title,subtitle,exec_title,comment,nyuu_col,mode)524 init_ichiran (info, kosuu, init, title, subtitle, exec_title, comment, nyuu_col, mode)
525      unsigned char **info;
526      int kosuu, init;
527      unsigned char *title;
528      unsigned char *subtitle;
529      unsigned char *exec_title;
530      unsigned char *comment;
531      int nyuu_col, mode;
532 {
533 #ifndef XJUTIL
534   register XIMLangRec *xl = cur_p->cur_xl;
535   register XIMRootRec *root = cur_x->root_pointer;
536 #endif /* !XJUTIL */
537   register Ichiran *ichi;
538   int x_cood, y_cood, width, height;
539   int save_x, save_y;
540   int maxlen;
541   int def_maxlen;
542   int def_height;
543   register int cnt;
544   register int tmp = 0;
545   register int len_t;
546   Window r, child;
547   int win_x, win_y;
548   unsigned int keys_buttons;
549   char *lang;
550 
551 #ifdef XJUTIL
552   xjutil->mode |= ICHIRAN_MODE;
553   lang = xjutil->lang;
554   ichi = cur_root->ichi;
555   ichi->invertgc = cur_root->invertgc;
556 #else /* XJUTIL */
557   if (xim->j_c)
558     return (-1);
559   xim->j_c = cur_p;
560   xim->cur_j_c_root = root;
561   set_cswidth (xl->lang_db->cswidth_id);
562   lang = xl->lang_db->lang;
563   ichi = root->ichi;
564   ichi->invertgc = cur_p->pe.invertgc;
565 #endif /* XJUTIL */
566 
567   ichi->map = 0;
568   ichi->exp = 0;
569 
570   ichi->mode = mode;
571   ichi->kosuu = kosuu;
572   if (init < -1 || init > kosuu)
573     init = -1;
574   ichi->init = init;
575   ichi->title->string = title;
576   ichi->subtitle->string = subtitle;
577   ichi->button[EXEC_W]->string = exec_title;
578   ichi->button[CANCEL_W]->string = (unsigned char *) msg_get (cd, CANCEL_NUM, default_message[CANCEL_NUM], lang);
579 #ifndef XJUTIL
580   ichi->button[CANCEL_W]->cb_data = (int *) cur_x;
581 #endif /* !XJUTIL */
582   ichi->button[MOUSE_W]->string = (unsigned char *) msg_get (cd, MOUSE_NUM, default_message[MOUSE_NUM], lang);
583 
584   def_height = FONTHEIGHT * 4;
585   if (mode & (SENTAKU | JIKOUHO | JIS_IN | KUTEN_IN))
586     {
587       if (mode & (JIKOUHO | JIS_IN | KUTEN_IN))
588         {
589           ichi->button[NEXT_W]->string = (unsigned char *) msg_get (cd, NEXT_NUM, default_message[NEXT_NUM], lang);
590           ichi->button[BACK_W]->string = (unsigned char *) msg_get (cd, BACK_NUM, default_message[BACK_NUM], lang);
591 #ifndef XJUTIL
592           ichi->button[NEXT_W]->cb_data = ichi->button[BACK_W]->cb_data = (int *) cur_x;
593 #endif /* !XJUTIL */
594           def_maxlen = columnlen (title)
595             + columnlen (ichi->button[CANCEL_W]->string)
596             + columnlen (ichi->button[MOUSE_W]->string) + columnlen (ichi->button[NEXT_W]->string) + columnlen (ichi->button[BACK_W]->string) + SPACING * 5 + 1;
597           ichi->kosuu_all = xw_set_jikouho (info, kosuu, def_maxlen);
598         }
599       else if (mode & SENTAKU)
600         {
601           def_maxlen = columnlen (title) + columnlen (ichi->button[CANCEL_W]->string) + SPACING * 2 + 1;
602           if (kosuu > ichi->max_lines)
603             alloc_for_save_buf (ichi, kosuu);
604           for (cnt = 0; cnt < kosuu; cnt++)
605             {
606               sprintf ((char *) ichi->save_buf[cnt], " %s ", info[cnt]);
607               ichi->buf[cnt] = ichi->save_buf[cnt];
608             }
609           height = kosuu * (FONTHEIGHT + IN_BORDER) + 2 * FONTHEIGHT;
610           ichi->kosuu_all = kosuu;
611         }
612       if (ichi->kosuu_all > MAX_PAGE_LINES)
613         {
614           ichi->page = ichi->kosuu_all / MAX_PAGE_LINES + (ichi->kosuu_all % MAX_PAGE_LINES ? 1 : 0);
615           ichi->max_line = MAX_PAGE_LINES;
616           height = ichi->max_line * (FONTHEIGHT + IN_BORDER) + 2 * FONTHEIGHT;
617           ichi->page_height = ichi->max_line * (FONTHEIGHT + IN_BORDER);
618           if (mode & SENTAKU)
619             {
620               def_maxlen += columnlen (ichi->button[NEXT_W]->string) + columnlen (ichi->button[BACK_W]->string) + SPACING * 3;
621             }
622         }
623       else
624         {
625           ichi->page = 1;
626           ichi->max_line = ichi->kosuu_all;
627           height = ichi->kosuu_all * (FONTHEIGHT + IN_BORDER) + 2 * FONTHEIGHT;
628           ichi->page_height = 0;
629         }
630       if (comment)
631         {
632           ichi->comment->string = comment;
633           maxlen = columnlen (comment);
634           height += FONTHEIGHT + IN_BORDER * 2;
635         }
636       else
637         {
638           ichi->comment->string = NULL;
639           maxlen = columnlen (info[0]) + 2;
640         }
641       for (cnt = 1; cnt < ichi->kosuu_all; cnt++)
642         {
643           if ((tmp = columnlen (ichi->buf[cnt])) > maxlen)
644             maxlen = tmp + 2;
645         }
646       if (maxlen < def_maxlen)
647         maxlen = def_maxlen;
648     }
649   else if (mode & NYUURYOKU)
650     {
651       def_maxlen = columnlen (title) + columnlen (exec_title) + columnlen (ichi->button[CANCEL_W]->string) + SPACING * 3 + 1;
652       if (def_maxlen < (columnlen (subtitle) + nyuu_col + 4))
653         maxlen = columnlen (subtitle) + nyuu_col + 4;
654       else
655         maxlen = def_maxlen;
656       height = def_height;
657       ichi->kosuu_all = 0;
658     }
659   else
660     {
661       maxlen = def_maxlen;
662       height = def_height;
663     }
664 
665   ichi->width = width = ichi->item_width = maxlen * FONTWIDTH;
666   ichi->height = height;
667   ichi->item_height = ichi->kosuu_all * (FONTHEIGHT + IN_BORDER);
668   ichi->max_len = maxlen;
669 
670   XQueryPointer (dpy, ROOT_WINDOW, &r, &child, &save_x, &save_y, &win_x, &win_y, &keys_buttons);
671   ichi->save_x = (short) save_x;
672   ichi->save_y = (short) save_y;
673 #ifdef XJUTIL
674   decide_position (width, height, cur_root->bw, &x_cood, &y_cood);
675 #else /* XJUTIL */
676   decide_position (root, xl, width, height, root->bw, &x_cood, &y_cood);
677 #endif /* XJUTIL */
678 #ifdef nodef
679   XWarpPointer (dpy, None, root_window, 0, 0, 0, 0, x_cood + FONTWIDTH, y_cood + FONTHEIGHT * 2 + FONTHEIGHT / 2);
680 #endif
681 
682   XMoveResizeWindow (dpy, ichi->w, x_cood - 2, y_cood - 2, width, height);
683 
684   moveresize_box (ichi->title, FONTWIDTH, (FONTHEIGHT / 2 - IN_BORDER), (FONTWIDTH * (len_t = columnlen (title)) + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
685   len_t += 1;
686   moveresize_box (ichi->button[CANCEL_W],
687                   (FONTWIDTH * (len_t += SPACING)), (FONTHEIGHT / 2 - IN_BORDER), (columnlen (ichi->button[CANCEL_W]->string) * FONTWIDTH + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
688   len_t += columnlen (ichi->button[CANCEL_W]->string);
689 
690 #ifndef XJUTIL
691   XSetWindowColormap (dpy, ichi->w, cur_p->pe.colormap);
692 #endif /* !XJUTIL */
693   XSetWindowBackground (dpy, ichi->w, BACKGROUND);
694   XClearWindow (dpy, ichi->w);
695   XSetWindowBorder (dpy, ichi->w, FOREGROUND);
696 
697   changecolor_box (ichi->title, FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
698   changecolor_box (ichi->button[CANCEL_W], FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
699   if (!(mode & NYUURYOKU))
700     {
701       if (comment)
702         {
703           y_cood = FONTHEIGHT * 3 + (IN_BORDER * 2);
704           moveresize_box (ichi->comment, 0, FONTHEIGHT * 2, width, (FONTHEIGHT + IN_BORDER * 2));
705           changecolor_box (ichi->comment, FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
706           map_box (ichi->comment);
707         }
708       else
709         {
710           y_cood = FONTHEIGHT * 2;
711         }
712       XMoveResizeWindow (dpy, ichi->w0, -1, y_cood, FONTWIDTH * ichi->max_columns, ichi->max_line * (FONTHEIGHT + IN_BORDER));
713       XMoveResizeWindow (dpy, ichi->w1, 0, 0, FONTWIDTH * ichi->max_columns, ichi->kosuu_all * (FONTHEIGHT + IN_BORDER));
714 #ifndef XJUTIL
715       XSetWindowColormap (dpy, ichi->w0, cur_p->pe.colormap);
716       XSetWindowColormap (dpy, ichi->w1, cur_p->pe.colormap);
717 #endif /* !XJUTIL */
718       XSetWindowBackground (dpy, ichi->w0, BACKGROUND);
719       XClearWindow (dpy, ichi->w0);
720       XSetWindowBorder (dpy, ichi->w0, FOREGROUND);
721       XSetWindowBackground (dpy, ichi->w1, BACKGROUND);
722       XClearWindow (dpy, ichi->w1);
723       XSetWindowBorder (dpy, ichi->w1, FOREGROUND);
724     }
725   if (mode & (JIKOUHO | JIS_IN | KUTEN_IN))
726     {
727       moveresize_box (ichi->button[MOUSE_W],
728                       (FONTWIDTH * (len_t += SPACING)), (FONTHEIGHT / 2 - IN_BORDER), (columnlen (ichi->button[MOUSE_W]->string) * FONTWIDTH + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
729       len_t += columnlen (ichi->button[MOUSE_W]->string);
730       changecolor_box (ichi->button[MOUSE_W], FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
731     }
732 
733   set_wm_properties (ichi->w, x_cood, y_cood, width, height, SouthWestGravity, NULL, NULL, 0, 0, 0, 0, 0);
734   XRaiseWindow (dpy, ichi->w);
735   XMapWindow (dpy, ichi->w);
736   map_box (ichi->button[CANCEL_W]);
737   XFlush (dpy);
738   if (mode & NYUURYOKU)
739     {
740       moveresize_box (ichi->subtitle, FONTWIDTH, (FONTHEIGHT * 2 + FONTHEIGHT / 2 - IN_BORDER), (columnlen (subtitle) * FONTWIDTH + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
741       changecolor_box (ichi->subtitle, FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
742       map_box (ichi->subtitle);
743       XMoveResizeWindow (dpy, ichi->nyuu_w, FONTWIDTH * (columnlen (subtitle) + 3), FONTHEIGHT * 2 + FONTHEIGHT / 2, nyuu_col * FONTWIDTH, FONTHEIGHT);
744 #ifndef XJUTIL
745       XSetWindowColormap (dpy, ichi->nyuu_w, cur_p->pe.colormap);
746 #endif /* !XJUTIL */
747       XSetWindowBackground (dpy, ichi->nyuu_w, BACKGROUND);
748       XClearWindow (dpy, ichi->nyuu_w);
749       XSetWindowBorder (dpy, ichi->nyuu_w, FOREGROUND);
750       XMapWindow (dpy, ichi->nyuu_w);
751       moveresize_box (ichi->button[EXEC_W], (FONTWIDTH * (len_t += SPACING)), (FONTHEIGHT / 2 - IN_BORDER), (columnlen (exec_title) * FONTWIDTH + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
752       changecolor_box (ichi->button[EXEC_W], FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
753       map_box (ichi->button[EXEC_W]);
754       len_t += tmp;
755     }
756   if (ichi->kosuu_all)
757     {
758       XMapWindow (dpy, ichi->w0);
759       XFlush (dpy);
760       ichi->cur_page = 1;
761       ichi->start_line = 0;
762       ichi->end_line = ichi->kosuu_all - 1;
763       if (mode & (JIKOUHO | JIS_IN | KUTEN_IN))
764         {
765           if (ichi->select_mode)
766             {
767               XSelectInput (dpy, ichi->w1, EnterWindowMask | LeaveWindowMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask);
768               XDefineCursor (dpy, ichi->w1, XCreateFontCursor (dpy, 52));
769             }
770           else
771             {
772               ichi->button[MOUSE_W]->string = (unsigned char *) msg_get (cd, MOUSE_NUM + 1, default_message[MOUSE_NUM + 1], lang);
773               XSelectInput (dpy, ichi->w1, ExposureMask);
774             }
775           map_box (ichi->button[MOUSE_W]);
776           ichi->hilited_ji_item = init;
777           if (init != -1 && ichi->page > 1)
778             {
779               ichi->cur_page = ((jikouho_ichi[init].line - 1) / ichi->max_line) + 1;
780               move_ichi (ichi);
781             }
782         }
783       else if (mode & SENTAKU)
784         {
785           ichi->hilited_item = init;
786           if (init != -1 && ichi->page > 1)
787             {
788               ichi->cur_page = (init / ichi->max_line) + 1;
789               move_ichi (ichi);
790             }
791           XSelectInput (dpy, ichi->w1, EnterWindowMask | LeaveWindowMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask);
792           XDefineCursor (dpy, ichi->w1, XCreateFontCursor (dpy, 132));
793         }
794       if (ichi->page > 1)
795         {
796           moveresize_box (ichi->button[NEXT_W],
797                           (FONTWIDTH * (len_t += SPACING)), (FONTHEIGHT / 2 - IN_BORDER), (columnlen (ichi->button[NEXT_W]->string) * FONTWIDTH + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
798           len_t += columnlen (ichi->button[NEXT_W]->string);
799           moveresize_box (ichi->button[BACK_W],
800                           (FONTWIDTH * (len_t += SPACING)), (FONTHEIGHT / 2 - IN_BORDER), (columnlen (ichi->button[BACK_W]->string) * FONTWIDTH + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
801           len_t += columnlen (ichi->button[BACK_W]->string);
802           changecolor_box (ichi->button[NEXT_W], FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
803           changecolor_box (ichi->button[BACK_W], FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
804           map_box (ichi->button[NEXT_W]);
805           map_box (ichi->button[BACK_W]);
806         }
807     }
808   XFlush (dpy);
809   return (0);
810 }
811 
812 void
end_ichiran()813 end_ichiran ()
814 {
815   Ichiran *ichi;
816   register int i;
817 
818 #ifndef XJUTIL
819   if (!xim->j_c)
820     return;
821 #endif /* !XJUTIL */
822   ichi = ICHI;
823   if (ichi->kosuu)
824     {
825       ichi->init = -1;
826       if (ichi->mode & SENTAKU && ichi->hilited_item != -1)
827         xw_fillrec ();
828       ichi->hilited_item = -1;
829       if ((ichi->mode & (JIKOUHO | JIS_IN | KUTEN_IN)) && ichi->hilited_ji_item != -1)
830         xw_ji_fillrec ();
831       ichi->hilited_ji_item = -1;
832       XUnmapWindow (dpy, ichi->w0);
833     }
834   XWithdrawWindow (dpy, ichi->w, DefaultScreen (dpy));
835   XFlush (dpy);
836   XUndefineCursor (dpy, ichi->w1);
837   XSelectInput (dpy, ichi->w1, ExposureMask);
838   unmap_box (ichi->subtitle);
839   unmap_box (ichi->comment);
840   if (ichi->mode & NYUURYOKU)
841     XUnmapWindow (dpy, ichi->nyuu_w);
842   for (i = 0; i < ichi->max_button; i++)
843     {
844       unmap_box (ichi->button[i]);
845       ichi->button[i]->in = '\0';
846     }
847 #ifdef nodef
848   XWarpPointer (dpy, None, ROOT_WINDOW, 0, 0, 0, 0, (int) ichi->save_x, (int) ichi->save_y);
849   XFlush (dpy);
850 #endif
851   SEL_RET = -1;
852   ichi->lock = 0;
853   ichi->mode = 0;
854   unfreeze_box (ichi->button[NEXT_W]);
855   unfreeze_box (ichi->button[BACK_W]);
856 #ifdef XJUTIL
857   xjutil->mode &= ~ICHIRAN_MODE;
858 #else /* XJUTIL */
859   xim->j_c = NULL;
860 #endif /* XJUTIL */
861 }
862 
863 #ifdef XJUTIL
864 void
lock_ichiran()865 lock_ichiran ()
866 {
867   freeze_box (cur_root->ichi->button[NEXT_W]);
868   freeze_box (cur_root->ichi->button[BACK_W]);
869   cur_root->ichi->lock = 1;
870 }
871 
872 void
unlock_ichiran()873 unlock_ichiran ()
874 {
875   cur_root->ichi->lock = 0;
876   unfreeze_box (cur_root->ichi->button[NEXT_W]);
877   unfreeze_box (cur_root->ichi->button[BACK_W]);
878 }
879 #endif /* XJUTIL */
880 
881 #ifndef XJUTIL
882 void
check_map(w)883 check_map (w)
884      Window w;
885 {
886   register XIMClientRec *xc;
887   register XIMInputRec *xi;
888   register int i;
889   int match = 0;
890 
891   if (xim->j_c)
892     {
893       if (w == xim->cur_j_c_root->ichi->w)
894         {
895           xim->cur_j_c_root->ichi->map = 1;
896           return;
897         }
898       else if (w == xim->cur_j_c_root->inspect->w)
899         {
900           xim->cur_j_c_root->inspect->map = 1;
901           return;
902         }
903     }
904   if (cur_p && cur_p->yes_no && cur_p->yes_no->w == w)
905     {
906       cur_p->yes_no->map = 1;
907       return;
908     }
909   for (xc = ximclient_list; xc != NULL; xc = xc->next)
910     {
911       if (IsPreeditArea (xc) || IsPreeditPosition (xc) || IsPreeditCallbacks (xc))
912         {
913           if (w == xc->yes_no->w)
914             {
915               xc->yes_no->map = 1;
916               return;
917             }
918         }
919       if (!xc->cur_xl)
920         continue;
921       for (i = 0; i < xim->screen_count; i++)
922         {
923           if (xc == xim->root_pointer[i]->ximclient)
924             break;
925         }
926       if (i < xim->screen_count)
927         continue;
928       if (IsPreeditPosition (xc))
929         {
930           if (w == xc->cur_xl->wp[0] || w == xc->cur_xl->wp[1] || w == xc->cur_xl->wp[2] || w == xc->cur_xl->wn[0] || w == xc->cur_xl->wn[1] || w == xc->cur_xl->wn[2])
931             {
932               match = 1;
933             }
934         }
935       else if (IsPreeditArea (xc))
936         {
937           if (w == xc->cur_xl->wp[0])
938             match = 1;
939         }
940       if (IsStatusArea (xc))
941         {
942           if (w == xc->cur_xl->ws)
943             match = 1;
944         }
945       if (match)
946         {
947           for (xi = input_list; xi != NULL; xi = xi->next)
948             {
949               if (xi->pclient && xi->pclient == xc)
950                 {
951                   return;
952                 }
953             }
954 #if defined(XJPLIB) && defined(XJPLIB_DIRECT)
955           if (XJp_check_map (xc))
956             return;
957 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */
958           XUnmapWindow (dpy, w);
959         }
960     }
961 }
962 
963 void
lock_inspect()964 lock_inspect ()
965 {
966   register Inspect *ins;
967 
968   if (!xim->j_c)
969     return;
970   ins = xim->cur_j_c_root->inspect;
971   ins->lock = 1;
972   freeze_box (ins->button[DELETE_W]);
973   freeze_box (ins->button[USE_W]);
974   freeze_box (ins->button[NEXT_W]);
975   freeze_box (ins->button[BACK_W]);
976 }
977 
978 void
unlock_inspect()979 unlock_inspect ()
980 {
981   register Inspect *ins;
982 
983   if (!xim->j_c)
984     return;
985   ins = xim->cur_j_c_root->inspect;
986   ins->lock = 0;
987   unfreeze_box (ins->button[DELETE_W]);
988   unfreeze_box (ins->button[USE_W]);
989   unfreeze_box (ins->button[NEXT_W]);
990   unfreeze_box (ins->button[BACK_W]);
991 }
992 
993 int
init_inspect(msg)994 init_inspect (msg)
995      unsigned char *msg;
996 {
997   register XIMRootRec *root = cur_x->root_pointer;
998   int width, height, x_cood, y_cood;
999   int save_x, save_y;
1000   Window r, child;
1001   int win_x, win_y;
1002   unsigned int keys_buttons;
1003   Inspect *ins;
1004   register XIMLangRec *xl = cur_p->cur_xl;
1005   char *lang;
1006   int i, len_t = 0;
1007 
1008   if (xim->j_c != NULL)
1009     return (-1);
1010   xim->j_c = cur_p;
1011   xim->cur_j_c_root = root;
1012   ins = root->inspect;
1013   ins->map = 0;
1014   ins->exp = 0;
1015 
1016   set_cswidth (xl->lang_db->cswidth_id);
1017   lang = xl->lang_db->lang;
1018   ins->max_len = columnlen (msg);
1019   width = FONTWIDTH * ins->max_len;
1020   height = FONTHEIGHT * 3 + IN_BORDER * 2;
1021 
1022   XQueryPointer (dpy, ROOT_WINDOW, &r, &child, &save_x, &save_y, &win_x, &win_y, &keys_buttons);
1023   ins->save_x = (short) save_x;
1024   ins->save_y = (short) save_y;
1025   decide_position (root, xl, width, height, root->bw, &x_cood, &y_cood);
1026 #ifdef nodef
1027   XWarpPointer (dpy, None, ROOT_WINDOW, 0, 0, 0, 0, x_cood + width / 2, y_cood + FONTHEIGHT);
1028 #endif
1029   ins->msg = msg;
1030   ins->title->string = (unsigned char *) msg_get (cd, 34, default_message[34], lang);
1031   ins->button[CANCEL_W]->string = (unsigned char *) msg_get (cd, 16, default_message[16], lang);
1032   ins->button[DELETE_W]->string = (unsigned char *) msg_get (cd, 35, default_message[35], lang);
1033   ins->button[USE_W]->string = (unsigned char *) msg_get (cd, 36, default_message[36], lang);
1034   ins->button[NEXT_W]->string = (unsigned char *) msg_get (cd, 37, default_message[37], lang);
1035   ins->button[BACK_W]->string = (unsigned char *) msg_get (cd, 38, default_message[38], lang);
1036   ins->button[CANCEL_W]->cb_data = ins->button[DELETE_W]->cb_data = ins->button[USE_W]->cb_data = ins->button[NEXT_W]->cb_data = ins->button[BACK_W]->cb_data = (int *) cur_x;
1037   moveresize_box (ins->title, FONTWIDTH, (FONTHEIGHT / 2 - IN_BORDER), (FONTWIDTH * (len_t = columnlen (ins->title->string)) + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
1038   len_t += 1;
1039   for (i = 0; i < ins->max_button; i++)
1040     {
1041       moveresize_box (ins->button[i], (FONTWIDTH * (len_t += SPACING)), (FONTHEIGHT / 2 - IN_BORDER), (columnlen (ins->button[i]->string) * FONTWIDTH + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
1042       len_t += columnlen (ins->button[i]->string);
1043     }
1044 
1045   XMoveResizeWindow (dpy, ins->w, x_cood, y_cood, width, height);
1046 
1047   set_wm_properties (ins->w, x_cood, y_cood, width, height, CenterGravity, NULL, NULL, 0, 0, 0, 0, 0);
1048 
1049   height = FONTHEIGHT + IN_BORDER * 2;
1050   XMoveResizeWindow (dpy, ins->w1, -1, (FONTHEIGHT * 2), width, height);
1051   XRaiseWindow (dpy, ins->w);
1052   XSetWindowColormap (dpy, ins->w, cur_p->pe.colormap);
1053   XSetWindowBackground (dpy, ins->w, BACKGROUND);
1054   XSetWindowColormap (dpy, ins->w1, cur_p->pe.colormap);
1055   XSetWindowBackground (dpy, ins->w1, BACKGROUND);
1056   XClearWindow (dpy, ins->w);
1057   XClearWindow (dpy, ins->w1);
1058   XSetWindowBorder (dpy, ins->w, FOREGROUND);
1059   XSetWindowBorder (dpy, ins->w1, FOREGROUND);
1060 
1061   changecolor_box (ins->title, FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
1062   for (i = 0; i < ins->max_button; i++)
1063     {
1064       changecolor_box (ins->button[i], FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
1065     }
1066   XMapWindow (dpy, ins->w);
1067   XFlush (dpy);
1068   JW3Mputc (ins->msg, ins->w1, 0, 0, IN_BORDER);
1069   XFlush (dpy);
1070   return (0);
1071 }
1072 
1073 void
end_inspect()1074 end_inspect ()
1075 {
1076   Inspect *ins;
1077   int i;
1078 
1079   if (!xim->j_c)
1080     return;
1081   ins = xim->cur_j_c_root->inspect;
1082   XWithdrawWindow (dpy, ins->w, DefaultScreen (dpy));
1083 #ifdef nodef
1084   XWarpPointer (dpy, None, ROOT_WINDOW, 0, 0, 0, 0, (int) ins->save_x, (int) ins->save_y);
1085 #endif
1086   XFlush (dpy);
1087   for (i = 0; i < ins->max_button; i++)
1088     {
1089       ins->button[i]->in = '\0';
1090     }
1091   xim->sel_ret = -1;
1092   unlock_inspect ();
1093   xim->j_c = NULL;
1094 }
1095 
1096 static void
change_inspect(xl,s)1097 change_inspect (xl, s)
1098      register XIMLangRec *xl;
1099      register unsigned char *s;
1100 {
1101   register Inspect *ins;
1102   int len;
1103   unsigned int width, height;
1104 
1105   if (!xim->j_c)
1106     return;
1107   ins = xim->cur_j_c_root->inspect;
1108   if ((len = columnlen (s)) > ins->max_len)
1109     {
1110       XResizeWindow (dpy, ins->w, (width = FONTWIDTH * len), (height = FONTHEIGHT * 3 + IN_BORDER * 2));
1111       XResizeWindow (dpy, ins->w1, FONTWIDTH * len, FONTHEIGHT + IN_BORDER * 2);
1112       ins->max_len = len;
1113       set_wm_size (ins->w, width, height);
1114     }
1115   ins->msg = s;
1116   XClearWindow (dpy, ins->w1);
1117   JW3Mputc (ins->msg, ins->w1, 0, 0, IN_BORDER);
1118   XFlush (dpy);
1119 }
1120 
1121 int
xw_next_inspect()1122 xw_next_inspect ()
1123 {
1124   unsigned char *s;
1125   register XIMLangRec *xl;
1126 
1127   if (xim->j_c == NULL)
1128     return (-1);
1129   xl = xim->j_c->cur_xl;
1130   cur_cl_change3 (xim->j_c);
1131 
1132   set_cswidth (xl->lang_db->cswidth_id);
1133   s = next_inspect (s);
1134   change_inspect (xl, s);
1135   return (0);
1136 }
1137 
1138 int
xw_back_inspect()1139 xw_back_inspect ()
1140 {
1141   unsigned char *s;
1142   register XIMLangRec *xl;
1143 
1144   if (xim->j_c == NULL)
1145     return (-1);
1146   xl = xim->j_c->cur_xl;
1147   cur_cl_change3 (xim->j_c);
1148 
1149   set_cswidth (xl->lang_db->cswidth_id);
1150   s = previous_inspect ();
1151   change_inspect (xl, s);
1152   return (0);
1153 }
1154 #endif /* !XJUTIL */
1155 
1156 static int
serch_jikouho_table(x,y)1157 serch_jikouho_table (x, y)
1158      int x, y;
1159 {
1160   register int tmp, gap, kosuu;
1161 
1162 #ifndef XJUTIL
1163   if (!xim->j_c)
1164     return (-1);
1165 #endif /* !XJUTIL */
1166   kosuu = ICHI->kosuu;
1167   for (tmp = kosuu / 2, gap = kosuu / 4; (tmp >= 0 && tmp < kosuu); gap /= 2)
1168     {
1169       if (gap == 0)
1170         gap = 1;
1171       if (y > jikouho_ichi[tmp].y_e)
1172         {
1173           tmp += gap;
1174         }
1175       else if (y < jikouho_ichi[tmp].y_s)
1176         {
1177           tmp -= gap;
1178         }
1179       else
1180         {
1181           for (; tmp >= 0 && tmp < kosuu;)
1182             {
1183               if (x > jikouho_ichi[tmp].x_e)
1184                 {
1185                   tmp++;
1186                 }
1187               else if (x < jikouho_ichi[tmp].x_s)
1188                 {
1189                   tmp--;
1190                 }
1191               else if (y <= jikouho_ichi[tmp].y_e && y >= jikouho_ichi[tmp].y_s)
1192                 {
1193                   return (tmp);
1194                 }
1195               else
1196                 {
1197                   return (-1);
1198                 }
1199             }
1200           return (-1);
1201         }
1202     }
1203   return (-1);
1204 }
1205 
1206 void
xw_move_hilite(d)1207 xw_move_hilite (d)
1208      int d;
1209 {
1210   static int y;
1211   register int item;
1212   register Ichiran *ichi;
1213 
1214 #ifndef XJUTIL
1215   if (!xim->j_c)
1216     return;
1217 #endif /* !XJUTIL */
1218   ichi = ICHI;
1219 #ifdef XJUTIL
1220   if (ICHI->lock)
1221     return;
1222 #endif /* XJUTIL */
1223   y = d;
1224   item = Y_InItem (y);
1225   if (item != -1 && item != ichi->hilited_item && item + (ichi->cur_page - 1) * ichi->max_line < ichi->kosuu)
1226     {
1227       if (ichi->hilited_item != -1)
1228         xw_fillrec ();
1229       if ((ichi->hilited_item = item) != -1)
1230         xw_fillrec ();
1231     }
1232 }
1233 
1234 void
xw_jikouho_move_hilite(d_x,d_y)1235 xw_jikouho_move_hilite (d_x, d_y)
1236      int d_x, d_y;
1237 {
1238   register int item;
1239   register Ichiran *ichi;
1240 
1241 #ifndef XJUTIL
1242   if (!xim->j_c)
1243     return;
1244 #endif /* !XJUTIL */
1245   ichi = ICHI;
1246   item = serch_jikouho_table (d_x, d_y);
1247   if (item != -1 && item != ichi->hilited_ji_item)
1248     {
1249       if (ichi->hilited_ji_item != -1)
1250         xw_ji_fillrec ();
1251       if ((ichi->hilited_ji_item = item) != -1)
1252         {
1253           xw_ji_fillrec ();
1254         }
1255     }
1256 }
1257 
1258 int
alloc_for_save_buf(ichi,line)1259 alloc_for_save_buf (ichi, line)
1260      register Ichiran *ichi;
1261      int line;
1262 {
1263   register int i;
1264   register char *p;
1265 
1266   if (!(p = Malloc ((unsigned) (line * (ichi->max_columns * sizeof (char) + sizeof (char *))))))
1267     {
1268       malloc_error ("allocation of ichiran data");
1269       return (-1);
1270     }
1271   if (ichi->save_buf)
1272     Free (ichi->save_buf);
1273   ichi->save_buf = (unsigned char **) p;
1274   p += line * sizeof (char *);
1275   for (i = 0; i < line; i++)
1276     {
1277       ichi->save_buf[i] = (unsigned char *) p;
1278       p += ichi->max_columns * sizeof (char);
1279     }
1280   ichi->max_lines = line;
1281   return (0);
1282 }
1283 
1284 void
redraw_ichi_w()1285 redraw_ichi_w ()
1286 {
1287   register Ichiran *ichi;
1288   register int line = 0;
1289 
1290 #ifndef XJUTIL
1291   if (!xim->j_c)
1292     return;
1293 #endif /* !XJUTIL */
1294   ichi = ICHI;
1295   XClearWindow (dpy, ichi->w1);
1296   XFlush (dpy);
1297   for (line = ichi->start_line; line <= ichi->end_line && line < ichi->kosuu_all; line++)
1298     {
1299       JW3Mputc (ichi->buf[line], ichi->w1, line, 0, IN_BORDER);
1300     }
1301   if (ichi->mode & SENTAKU && ichi->hilited_item != -1)
1302     {
1303       xw_fillrec ();
1304     }
1305   if (ichi->mode & (JIKOUHO | JIS_IN | KUTEN_IN) && ichi->hilited_ji_item != -1)
1306     {
1307       xw_ji_fillrec ();
1308     }
1309   XFlush (dpy);
1310 }
1311 
1312 int
next_ichi()1313 next_ichi ()
1314 {
1315   register Ichiran *ichi;
1316 
1317 #ifndef XJUTIL
1318   if (!xim->j_c)
1319     return (-1);
1320 #endif /* !XJUTIL */
1321   ichi = ICHI;
1322   if (ichi->page < 2)
1323     return (-1);
1324   if (++ichi->cur_page > ichi->page)
1325     ichi->cur_page = 1;
1326   next_back_ichi (ichi, 1);
1327   return (0);
1328 }
1329 
1330 int
back_ichi()1331 back_ichi ()
1332 {
1333   register Ichiran *ichi;
1334 
1335 #ifndef XJUTIL
1336   if (!xim->j_c)
1337     return (-1);
1338 #endif /* !XJUTIL */
1339   ichi = ICHI;
1340   if (ichi->page < 2)
1341     return (-1);
1342   if (--ichi->cur_page < 1)
1343     ichi->cur_page = ichi->page;
1344   next_back_ichi (ichi, 0);
1345   return (0);
1346 }
1347 
1348 int
find_hilite()1349 find_hilite ()
1350 {
1351 #ifndef XJUTIL
1352   if (!xim->j_c)
1353     return (-1);
1354 #endif /* !XJUTIL */
1355   return (ICHI->hilited_item);
1356 }
1357 
1358 int
find_ji_hilite()1359 find_ji_hilite ()
1360 {
1361 #ifndef XJUTIL
1362   if (!xim->j_c)
1363     return (-1);
1364 #endif /* !XJUTIL */
1365   return (ICHI->hilited_ji_item);
1366 }
1367 
1368 void
xw_forward_select()1369 xw_forward_select ()
1370 {
1371   register Ichiran *ichi;
1372 
1373 #ifndef XJUTIL
1374   if (!xim->j_c)
1375     return;
1376 #endif /* !XJUTIL */
1377   ichi = ICHI;
1378   if (ichi->mode & (JIKOUHO | JIS_IN | KUTEN_IN))
1379     {
1380       if (ichi->hilited_ji_item != -1)
1381         {
1382           xw_ji_fillrec ();
1383         }
1384       if (ichi->hilited_ji_item < ichi->kosuu - 1)
1385         {
1386           ichi->hilited_ji_item += 1;
1387         }
1388       else
1389         {
1390           ichi->hilited_ji_item = 0;
1391         }
1392       check_move_ichi (jikouho_ichi[ichi->hilited_ji_item].line);
1393       xw_ji_fillrec ();
1394     }
1395 }
1396 
1397 void
xw_backward_select()1398 xw_backward_select ()
1399 {
1400   register Ichiran *ichi;
1401 
1402 #ifndef XJUTIL
1403   if (!xim->j_c)
1404     return;
1405 #endif /* !XJUTIL */
1406   ichi = ICHI;
1407   if (ichi->mode & (JIKOUHO | JIS_IN | KUTEN_IN))
1408     {
1409       if (ichi->hilited_ji_item != -1)
1410         {
1411           xw_ji_fillrec ();
1412         }
1413       if (ichi->hilited_ji_item > 0)
1414         {
1415           ichi->hilited_ji_item -= 1;
1416         }
1417       else
1418         {
1419           ichi->hilited_ji_item = ichi->kosuu - 1;
1420         }
1421       check_move_ichi (jikouho_ichi[ichi->hilited_ji_item].line);
1422       xw_ji_fillrec ();
1423     }
1424 }
1425 
1426 int
xw_next_select()1427 xw_next_select ()
1428 {
1429   register Ichiran *ichi;
1430   register int next, next_l, next_l2;
1431   register int cur_l;
1432 
1433 #ifndef XJUTIL
1434   if (!xim->j_c)
1435     return (-1);
1436 #endif /* !XJUTIL */
1437   ichi = ICHI;
1438   if (ichi->lock)
1439     return (0);
1440   cur_l = jikouho_ichi[ichi->hilited_ji_item].line;
1441 
1442   if (ichi->mode & (JIKOUHO | JIS_IN | KUTEN_IN))
1443     {
1444       if (ichi->max_line == 1)
1445         return (0);
1446       if (ichi->hilited_ji_item != -1)
1447         xw_ji_fillrec ();
1448       if (cur_l > ichi->kosuu_all - 1)
1449         {
1450           next_l = jikouho_line[1];
1451           next_l2 = jikouho_line[2];
1452         }
1453       else
1454         {
1455           next_l = jikouho_line[cur_l + 1];
1456           next_l2 = jikouho_line[cur_l + 2];
1457         }
1458       next = ichi->hilited_ji_item - jikouho_line[cur_l] + next_l;
1459       if (next >= next_l2)
1460         {
1461           ichi->hilited_ji_item = next_l2 - 1;
1462         }
1463       else
1464         {
1465           ichi->hilited_ji_item = next;
1466         }
1467       check_move_ichi (jikouho_ichi[ichi->hilited_ji_item].line);
1468       xw_ji_fillrec ();
1469     }
1470   else if (ichi->mode & SENTAKU)
1471     {
1472       if (ichi->max_line == 1)
1473         return (0);
1474       if (ichi->hilited_item != -1)
1475         xw_fillrec ();
1476       if ((ichi->hilited_item == ichi->end_line) || (ichi->hilited_item == ichi->kosuu - 1))
1477         {
1478           if (ichi->hilited_item == ichi->kosuu - 1)
1479             {
1480               ichi->hilited_item = 0;
1481             }
1482           else
1483             {
1484               ichi->hilited_item += 1;
1485             }
1486           if (ichi->page > 1)
1487             next_ichi ();
1488           else
1489             xw_fillrec ();
1490         }
1491       else
1492         {
1493           ichi->hilited_item += 1;
1494           xw_fillrec ();
1495         }
1496     }
1497   return (0);
1498 }
1499 
1500 int
xw_previous_select()1501 xw_previous_select ()
1502 {
1503   register Ichiran *ichi = ICHI;
1504 
1505   register int prev, prev_l, prev_l2;
1506   register int cur_l;
1507 
1508 #ifndef XJUTIL
1509   if (!xim->j_c)
1510     return (-1);
1511 #endif /* !XJUTIL */
1512   ichi = ICHI;
1513   if (ichi->lock)
1514     return (0);
1515   cur_l = jikouho_ichi[ichi->hilited_ji_item].line;
1516 
1517   if (ichi->mode & (JIKOUHO | JIS_IN | KUTEN_IN))
1518     {
1519       if (ichi->max_line == 1)
1520         return (0);
1521       if (ichi->hilited_ji_item != -1)
1522         xw_ji_fillrec ();
1523       if (cur_l == 1)
1524         {
1525           prev_l = jikouho_line[ichi->max_line];
1526           prev_l2 = jikouho_line[ichi->max_line + 1];
1527         }
1528       else
1529         {
1530           prev_l = jikouho_line[cur_l - 1];
1531           prev_l2 = jikouho_line[cur_l];
1532         }
1533       prev = ichi->hilited_ji_item - jikouho_line[cur_l] + prev_l;
1534       if (prev >= prev_l2)
1535         {
1536           ichi->hilited_ji_item = prev_l2 - 1;
1537         }
1538       else
1539         {
1540           ichi->hilited_ji_item = prev;
1541         }
1542       check_move_ichi (jikouho_ichi[ichi->hilited_ji_item].line);
1543       xw_ji_fillrec ();
1544     }
1545   else if (ichi->mode & SENTAKU)
1546     {
1547       if (ichi->max_line == 1)
1548         return (0);
1549       if (ichi->hilited_item != -1)
1550         xw_fillrec ();
1551       if ((ichi->hilited_item % ichi->max_line) == 0)
1552         {
1553           if (ichi->cur_page == 1)
1554             {
1555               ichi->hilited_item = ichi->kosuu - 1;
1556             }
1557           else
1558             {
1559               ichi->hilited_item -= 1;
1560             }
1561           if (ichi->page > 1)
1562             back_ichi ();
1563           else
1564             xw_fillrec ();
1565         }
1566       else
1567         {
1568           ichi->hilited_item -= 1;
1569           xw_fillrec ();
1570         }
1571     }
1572   return (0);
1573 }
1574 
1575 void
xw_linestart_select()1576 xw_linestart_select ()
1577 {
1578   register Ichiran *ichi;
1579 
1580 #ifndef XJUTIL
1581   if (!xim->j_c)
1582     return;
1583 #endif /* !XJUTIL */
1584   ichi = ICHI;
1585   if (ichi->mode & (JIKOUHO | JIS_IN | KUTEN_IN))
1586     {
1587       if (ichi->hilited_ji_item != -1)
1588         xw_ji_fillrec ();
1589       ichi->hilited_ji_item = jikouho_line[jikouho_ichi[ichi->hilited_ji_item].line];
1590       check_move_ichi (jikouho_ichi[ichi->hilited_ji_item].line);
1591       xw_ji_fillrec ();
1592     }
1593 }
1594 
1595 void
xw_lineend_select()1596 xw_lineend_select ()
1597 {
1598   register Ichiran *ichi;
1599 
1600 #ifndef XJUTIL
1601   if (!xim->j_c)
1602     return;
1603 #endif /* !XJUTIL */
1604   ichi = ICHI;
1605   if (ichi->mode & (JIKOUHO | JIS_IN | KUTEN_IN))
1606     {
1607       if (ichi->hilited_ji_item != -1)
1608         xw_ji_fillrec ();
1609       ichi->hilited_ji_item = jikouho_line[jikouho_ichi[ichi->hilited_ji_item].line + 1] - 1;
1610       check_move_ichi (jikouho_ichi[ichi->hilited_ji_item].line);
1611       xw_ji_fillrec ();
1612     }
1613 }
1614 
1615 int
init_yes_or_no(str,flg)1616 init_yes_or_no (str, flg)
1617      unsigned char *str;
1618      int flg;
1619 {
1620   int len, def_width, width, height, x_cood, y_cood;
1621   Window r, child;
1622   int win_x, win_y;
1623   unsigned int keys_buttons;
1624 #ifdef XJUTIL
1625   register YesOrNo *yes_no = cur_root->yes_no;
1626 #else /* XJUTIL */
1627   register YesOrNo *yes_no = cur_p->yes_no;
1628   register XIMLangRec *xl = cur_p->cur_xl;
1629 #endif /* XJUTIL */
1630   char *lang;
1631 
1632 #ifdef XJUTIL
1633   lang = xjutil->lang;
1634 #else /* XJUTIL */
1635   xim->cur_j_c_root = cur_x->root_pointer;
1636   set_cswidth (xl->lang_db->cswidth_id);
1637   lang = xl->lang_db->lang;
1638 #endif /* XJUTIL */
1639   yes_no->map = 0;
1640   yes_no->exp = 0;
1641 
1642   yes_no->mode = flg;
1643   yes_no->title->string = str;
1644 
1645   if (flg != MessageOnly)
1646     {
1647       if (flg == YesMessage)
1648         {
1649           yes_no->button[0]->string = (unsigned char *) msg_get (cd, OK_NUM, default_message[OK_NUM], lang);
1650         }
1651       else if (flg == YesNoMessage)
1652         {
1653           yes_no->button[0]->string = (unsigned char *) msg_get (cd, YES_NUM, default_message[YES_NUM], lang);
1654           yes_no->button[1]->string = (unsigned char *) msg_get (cd, NO_NUM, default_message[NO_NUM], lang);
1655         }
1656 #ifndef XJUTIL
1657       yes_no->button[0]->cb_data = yes_no->button[1]->cb_data = (int *) cur_x;
1658 #endif /* !XJUTIL */
1659       moveresize_box (yes_no->button[0], (FONTWIDTH * 2),
1660                       (FONTHEIGHT * 2 + FONTHEIGHT / 2 - IN_BORDER), ((len = columnlen (yes_no->button[0]->string)) * FONTWIDTH + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
1661       changecolor_box (yes_no->button[0], FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
1662       map_box (yes_no->button[0]);
1663       def_width = FONTWIDTH * (len + 8);
1664       if (flg == YesNoMessage)
1665         {
1666           moveresize_box (yes_no->button[1], (FONTWIDTH * (6 + len)),
1667                           (FONTHEIGHT * 2 + FONTHEIGHT / 2 - IN_BORDER), (FONTWIDTH * columnlen (yes_no->button[1]->string) + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
1668           changecolor_box (yes_no->button[1], FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
1669           map_box (yes_no->button[1]);
1670           len += columnlen (yes_no->button[1]->string);
1671           def_width = FONTWIDTH * (len + 8);
1672         }
1673       else
1674         {
1675           def_width = FONTWIDTH * (len + 4);
1676         }
1677       height = (FONTHEIGHT * 4);
1678     }
1679   else
1680     {
1681       def_width = 0;
1682       height = (FONTHEIGHT * 2);
1683     }
1684   if ((width = FONTWIDTH * ((len = columnlen (str)) + 2)) < def_width)
1685     width = def_width;
1686   moveresize_box (yes_no->title, FONTWIDTH, (FONTHEIGHT / 2 - IN_BORDER), (FONTWIDTH * len + IN_BORDER * 2), (FONTHEIGHT + IN_BORDER * 2));
1687   changecolor_box (yes_no->title, FOREGROUND, BACKGROUND, FOREGROUND, BoxAll);
1688   map_box (yes_no->title);
1689 
1690   if (flg != MessageOnly)
1691     {
1692       XQueryPointer (dpy, ROOT_WINDOW, &r, &child, &yes_no->x, &yes_no->y, &win_x, &win_y, &keys_buttons);
1693     }
1694   x_cood = (DisplayWidth (dpy, SCREEN) - width) / 2;
1695   y_cood = (DisplayHeight (dpy, SCREEN) - height) / 2;
1696   if ((x_cood + width) > DisplayWidth (dpy, SCREEN))
1697     x_cood = DisplayWidth (dpy, SCREEN) - width;
1698   if (x_cood < 0)
1699     x_cood = 0;
1700   if ((y_cood + height) > DisplayHeight (dpy, SCREEN))
1701     y_cood = DisplayHeight (dpy, SCREEN) - height;
1702   if (y_cood < 0)
1703     y_cood = 0;
1704   if (flg != MessageOnly)
1705     {
1706       XWarpPointer (dpy, None, ROOT_WINDOW, 0, 0, 0, 0, (x_cood + FONTWIDTH * 2), (y_cood + FONTHEIGHT * 3));
1707     }
1708   XMoveResizeWindow (dpy, yes_no->w, x_cood, y_cood, width, height);
1709 #ifndef XJUTIL
1710   XSetWindowColormap (dpy, yes_no->w, cur_p->pe.colormap);
1711 #endif /* !XJUTIL */
1712   XSetWindowBackground (dpy, yes_no->w, BACKGROUND);
1713   XClearWindow (dpy, yes_no->w);
1714   XSetWindowBorder (dpy, yes_no->w, FOREGROUND);
1715 
1716   set_wm_properties (yes_no->w, x_cood, y_cood, width, height, CenterGravity, NULL, NULL, 0, 0, 0, 0, 0);
1717   XRaiseWindow (dpy, yes_no->w);
1718   XMapWindow (dpy, yes_no->w);
1719   XFlush (dpy);
1720   return (0);
1721 }
1722 
1723 void
end_yes_or_no()1724 end_yes_or_no ()
1725 {
1726 #ifdef XJUTIL
1727   register YesOrNo *yes_no = cur_root->yes_no;
1728 #else /* XJUTIL */
1729   register YesOrNo *yes_no = cur_p->yes_no;
1730 #endif /* XJUTIL */
1731 
1732   unmap_box (yes_no->button[0]);
1733   unmap_box (yes_no->button[1]);
1734   XWithdrawWindow (dpy, yes_no->w, DefaultScreen (dpy));
1735   if (yes_no->mode != MessageOnly)
1736     {
1737 #ifdef XJUTIL
1738       XWarpPointer (dpy, None, cur_root->root_window,
1739 #else /* XJUTIL */
1740       XWarpPointer (dpy, None, yes_no->root_pointer->root_window,
1741 #endif /* XJUTIL */
1742                     0, 0, 0, 0, yes_no->x, yes_no->y);
1743     }
1744   yes_no->mode = 0;
1745   XFlush (dpy);
1746   SEL_RET = -1;
1747   yes_no->button[0]->in = yes_no->button[1]->in = 0;
1748 }
1749 
1750 #ifndef XJUTIL
1751 int
set_j_c()1752 set_j_c ()
1753 {
1754   if (xim->j_c)
1755     {
1756       cur_cl_change3 (xim->j_c);
1757     }
1758   return (0);
1759 }
1760 
1761 int
cur_cl_change3(xc)1762 cur_cl_change3 (xc)
1763      XIMClientRec *xc;
1764 {
1765   if (xc == 0)
1766     {
1767       return (0);
1768     }
1769   else
1770     {
1771       if (IsPreeditNothing (xc))
1772         {
1773           cur_p = xc->root_pointer->ximclient;
1774           cur_x = xc;
1775           c_c = cur_p->cur_xl->w_c;
1776         }
1777       else
1778         {
1779           cur_p = cur_x = xc;
1780           c_c = xc->cur_xl->w_c;
1781         }
1782     }
1783   cur_lang = cur_p->cur_xl->lang_db;
1784   cur_rk = c_c->rk;
1785   cur_rk_table = cur_rk->rk_table;
1786   cur_input = 0;
1787   return (0);
1788 }
1789 
1790 int
cur_cl_change4(xc)1791 cur_cl_change4 (xc)
1792      XIMClientRec *xc;
1793 {
1794   xc->yes_no->exp = 1;
1795   cur_cl_change3 (xc);
1796   return (0);
1797 }
1798 #endif /* !XJUTIL */
1799 
1800 void
xw_select_button(event)1801 xw_select_button (event)
1802      XButtonEvent *event;
1803 {
1804   static int y;
1805   register int item;
1806   register Ichiran *ichi;
1807 
1808 #ifndef XJUTIL
1809   if (!xim->j_c)
1810     return;
1811 #endif /* !XJUTIL */
1812   ichi = ICHI;
1813   y = event->y;
1814   if ((item = Y_InItem (y)) != ichi->hilited_item)
1815     {
1816       if (ichi->hilited_item != -1)
1817         xw_fillrec ();
1818       if ((ichi->hilited_item = item) != -1)
1819         xw_fillrec ();
1820     }
1821   XFlush (dpy);
1822   SEL_RET = item;
1823 }
1824 
1825 void
xw_select_jikouho_button(event)1826 xw_select_jikouho_button (event)
1827      XButtonEvent *event;
1828 {
1829   register int item;
1830   register Ichiran *ichi;
1831 
1832 #ifndef XJUTIL
1833   if (!xim->j_c)
1834     return;
1835 #endif /* !XJUTIL */
1836   ichi = ICHI;
1837   if ((item = serch_jikouho_table (event->x, event->y)) != ichi->hilited_ji_item)
1838     {
1839       if (ichi->hilited_ji_item != -1)
1840         xw_ji_fillrec ();
1841       if ((ichi->hilited_ji_item = item) != -1)
1842         xw_ji_fillrec ();
1843     }
1844   XFlush (dpy);
1845   SEL_RET = item;
1846 }
1847 
1848 void
xw_mouseleave()1849 xw_mouseleave ()
1850 {
1851   register Ichiran *ichi;
1852 
1853 #ifndef XJUTIL
1854   if (!xim->j_c)
1855     return;
1856 #endif /* !XJUTIL */
1857   ichi = ICHI;
1858 #ifdef XJUTIL
1859   if (ichi->lock)
1860     return;
1861 #endif /* XJUTIL */
1862   if (ichi->kosuu == 1)
1863     {
1864       if (ichi->hilited_item != -1)
1865         {
1866           xw_fillrec ();
1867           ichi->hilited_item = -1;
1868         }
1869     }
1870 }
1871 
1872 int
xw_mouse_select()1873 xw_mouse_select ()
1874 {
1875   register Ichiran *ichi;
1876   register char *lang;
1877 
1878 #ifdef XJUTIL
1879   lang = xjutil->lang;
1880 #else /* XJUTIL */
1881   if (!xim->j_c)
1882     return (-1);
1883   lang = cur_p->cur_xl->lang_db->lang;
1884 #endif /* XJUTIL */
1885   ichi = ICHI;
1886 
1887   if (ichi->select_mode == '\0')
1888     {
1889       XSelectInput (dpy, ichi->w1, (EnterWindowMask | LeaveWindowMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask));
1890       XDefineCursor (dpy, ichi->w1, XCreateFontCursor (dpy, 52));
1891       ichi->button[MOUSE_W]->string = (unsigned char *) msg_get (cd, MOUSE_NUM, default_message[MOUSE_NUM], lang);
1892       ichi->select_mode = 1;
1893     }
1894   else
1895     {
1896       XSelectInput (dpy, ichi->w1, ExposureMask);
1897       XUndefineCursor (dpy, ichi->w1);
1898       ichi->button[MOUSE_W]->string = (unsigned char *) msg_get (cd, MOUSE_NUM + 1, default_message[MOUSE_NUM + 1], lang);
1899       ichi->select_mode = '\0';
1900     }
1901   JW3Mputc (ichi->button[MOUSE_W]->string, ichi->button[MOUSE_W]->window, 0, REV_FLAG, IN_BORDER);
1902   XFlush (dpy);
1903   return (0);
1904 }
1905 
1906 void
draw_nyuu_w(buf,rev)1907 draw_nyuu_w (buf, rev)
1908      unsigned char *buf;
1909      int rev;
1910 {
1911   register Ichiran *ichi;
1912 
1913 #ifndef XJUTIL
1914   if (!xim->j_c)
1915     return;
1916 #endif /* !XJUTIL */
1917   ichi = ICHI;
1918   ichi->nyuu = (unsigned char *) buf;
1919   JW3Mputc (buf, ichi->nyuu_w, 0, (rev ? REV_FLAG : 0), 0);
1920 }
1921 
1922 void
clear_nyuu_w()1923 clear_nyuu_w ()
1924 {
1925 #ifndef XJUTIL
1926   if (!xim->j_c)
1927     return;
1928 #endif /* !XJUTIL */
1929   XClearWindow (dpy, ICHI->nyuu_w);
1930 }
1931 
1932 #ifndef XJUTIL
1933 int
yes_or_no_lock(string)1934 yes_or_no_lock (string)
1935      char *string;
1936 {
1937   int c1;
1938 
1939   init_yes_or_no ((unsigned char *) string, YesNoMessage);
1940   for (;;)
1941     {
1942       c1 = get_yes_no_event ();
1943       if (!cur_p->yes_no->map)
1944         {
1945           xim->sel_ret = -1;
1946           continue;
1947         }
1948       if ((xim->sel_ret == 1) || (xim->sel_ret == -1 && (c1 == NEWLINE || c1 == CR || c1 == 'y' || c1 == 'Y')))
1949         {
1950           end_yes_or_no ();
1951           xim->sel_ret = -1;
1952           return (1);
1953         }
1954       else if ((xim->sel_ret == 0) || (xim->sel_ret == -1 && (c1 == 'n' || c1 == 'N')))
1955         {
1956           end_yes_or_no ();
1957           xim->sel_ret = -1;
1958           return (0);
1959         }
1960       else
1961         {
1962           xim->sel_ret = -1;
1963           continue;
1964         }
1965     }
1966 }
1967 
1968 int
yes_or_no(string,in)1969 yes_or_no (string, in)
1970      char *string;
1971      int in;
1972 {
1973   int ret;
1974   static yes_no_step = 0;
1975 
1976   if (in == -99)
1977     {
1978       yes_no_step = 0;
1979       return (-1);
1980     }
1981   if (yes_no_step == 0)
1982     {
1983       init_yes_or_no ((unsigned char *) string, YesNoMessage);
1984       yes_no_step++;
1985       return (BUFFER_IN_CONT);
1986     }
1987   if (yes_no_step == 1)
1988     {
1989       if (!cur_p->yes_no->map)
1990         {
1991           xim->sel_ret = -1;
1992           return (BUFFER_IN_CONT);
1993         }
1994       if ((xim->sel_ret == 1) || (xim->sel_ret == -1 && (in == NEWLINE || in == CR || in == 'y' || in == 'Y')))
1995         {
1996           ret = 1;
1997         }
1998       else if ((xim->sel_ret == 0) || (xim->sel_ret == -1 && (in == 'n' || in == 'N')))
1999         {
2000           ret = 0;
2001         }
2002       else
2003         {
2004           xim->sel_ret = -1;
2005           return (BUFFER_IN_CONT);
2006         }
2007       end_yes_or_no ();
2008       xim->sel_ret = -1;
2009       yes_no_step = 0;
2010       return (ret);
2011     }
2012   return (BUFFER_IN_CONT);
2013 }
2014 #endif /* !XJUTIL */
2015 
2016 #ifdef XJUTIL
2017 void
change_ichi_buf(k,col,p)2018 change_ichi_buf (k, col, p)
2019      int k, col;
2020      char *p;
2021 {
2022   register Ichiran *ichi = cur_root->ichi;
2023 
2024   bcopy (p, ichi->buf[k] + col, strlen (p));
2025   JW3Mputc (ichi->buf[k], ichi->w1, k, ((k == ichi->hilited_item) ? REV_FLAG : 0), IN_BORDER);
2026 }
2027 
2028 void
insert_space_in_ichi_buf(p,space_len)2029 insert_space_in_ichi_buf (p, space_len)
2030      int p, space_len;
2031 {
2032   register Ichiran *ichi = cur_root->ichi;
2033   register i, j, len, save_len, max_len = 0;
2034   register unsigned char *s;
2035   char buf[MAX_ICHI_COLUMNS];
2036 
2037   for (i = 0; i < ichi->kosuu_all; i++)
2038     {
2039       s = ichi->buf[i] + p;
2040       bcopy (s, buf, (save_len = strlen (s)));
2041       for (j = space_len; j > 0; *s++ = ' ', j--);
2042       bcopy (buf, s, save_len);
2043       s[save_len] = '\0';
2044       len = strlen (ichi->buf[i]);
2045       if (len > max_len)
2046         max_len = len;
2047     }
2048   ichi->max_len = max_len;
2049   ichi->width = ichi->item_width = max_len * FONTWIDTH;
2050   XResizeWindow (dpy, ichi->w, ichi->width, ichi->height);
2051   set_wm_size (ichi->w, ichi->width, ichi->height);
2052 }
2053 #endif /* XJUTIL */
2054