0
|
1 /*
|
|
2 * $Id: do_xjutil.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 #ifdef USING_XJUTIL
|
|
40
|
|
41 #include <stdio.h>
|
|
42 #include <sys/wait.h>
|
|
43 #include <signal.h>
|
|
44 #include <X11/Xos.h>
|
|
45 #include "config.h"
|
|
46 #include "commonhd.h"
|
|
47 #include "sdefine.h"
|
|
48 #include "xim.h"
|
|
49 #include "sheader.h"
|
|
50 #include "proto.h"
|
|
51 #include "ext.h"
|
|
52
|
|
53 #define ROOT_WINDOW (xim->root_pointer[xim->default_screen]->root_window)
|
|
54 static int seq_xjutil_fs_id = 0;
|
|
55
|
|
56 static XIMLangDataBase *
|
|
57 set_xjutil (prop_name)
|
|
58 char *prop_name;
|
|
59 {
|
|
60 register int i, nbytes;
|
|
61 register unsigned char *p;
|
|
62 register Xjutil_startRec *xj;
|
|
63 XFontStruct **font_struct_list;
|
|
64 char **font_name_list;
|
|
65 int num;
|
|
66 Atom id;
|
|
67 register XIMLangRec *xl = cur_p->cur_xl;
|
|
68 Xjutil_startRec xjutil_start;
|
|
69 XIMLangDataBase *ld;
|
|
70 WnnEnv *we;
|
|
71 unsigned char tmp_buf[256];
|
|
72
|
|
73 if (!(ld = xl->lang_db) || (ld->xjutil_pid))
|
|
74 return (NULL);
|
|
75
|
|
76 xj = &xjutil_start;
|
|
77 if (uumkeyname && *uumkeyname)
|
|
78 strcpy (xj->uumkey_name, uumkeyname);
|
|
79 else
|
|
80 xj->uumkey_name[0] = '\0';
|
|
81 if (ld->rkfile_name && *ld->rkfile_name)
|
|
82 strcpy (xj->rkfile_name, ld->rkfile_name);
|
|
83 else
|
|
84 xj->rkfile_name[0] = '\0';
|
|
85 if (cvt_key_file && *cvt_key_file)
|
|
86 strcpy (xj->cvtkey_name, cvt_key_file);
|
|
87 else
|
|
88 xj->cvtfun_name[0] = '\0';
|
|
89 if (cvt_fun_file && *cvt_fun_file)
|
|
90 strcpy (xj->cvtfun_name, cvt_fun_file);
|
|
91 else
|
|
92 xj->cvtfun_name[0] = '\0';
|
|
93 if (cvt_meta_file && *cvt_meta_file)
|
|
94 strcpy (xj->cvtmeta_name, cvt_meta_file);
|
|
95 else
|
|
96 xj->cvtmeta_name[0] = '\0';
|
|
97 if (username && *username)
|
|
98 strcpy (xj->user_name, username);
|
|
99 else
|
|
100 xj->user_name[0] = '\0';
|
|
101 if (ld->lang && *ld->lang)
|
|
102 strcpy (xj->lang, ld->lang);
|
|
103 else
|
|
104 xj->lang[0] = '\0';
|
|
105 if (ld->lc_name && *ld->lc_name)
|
|
106 strcpy (xj->lc_name, ld->lc_name);
|
|
107 else
|
|
108 xj->lc_name[0] = '\0';
|
|
109 strcpy (xj->f_name, ld->f_table->name);
|
|
110 if (ld->jishopath && *ld->jishopath)
|
|
111 strcpy (xj->jishopath, ld->jishopath);
|
|
112 else
|
|
113 xj->jishopath[0] = '\0';
|
|
114 if (ld->hindopath && *ld->hindopath)
|
|
115 strcpy (xj->hindopath, ld->hindopath);
|
|
116 else
|
|
117 xj->hindopath[0] = '\0';
|
|
118 if (ld->fuzokugopath && *ld->fuzokugopath)
|
|
119 strcpy (xj->fuzokugopath, ld->fuzokugopath);
|
|
120 else
|
|
121 xj->fuzokugopath[0] = '\0';
|
|
122 nbytes = 0;
|
|
123 num = XFontsOfFontSet (xl->pe_fs, &font_struct_list, &font_name_list);
|
|
124 for (i = 0; i < num; i++)
|
|
125 {
|
|
126 nbytes += (strlen (font_name_list[i]) + 1);
|
|
127 }
|
|
128 if (!(p = (unsigned char *) Malloc ((unsigned) (nbytes + 1))))
|
|
129 {
|
|
130 malloc_error ("allocation of work area for xjutil");
|
|
131 return (NULL);
|
|
132 }
|
|
133 p[0] = '\0';
|
|
134 for (i = 0; i < num; i++)
|
|
135 {
|
|
136 strcat ((char *) p, font_name_list[i]);
|
|
137 strcat ((char *) p, ",");
|
|
138 }
|
|
139 p[nbytes - 1] = '\0';
|
|
140 xj->fn_len = nbytes - 1;
|
|
141 xj->rubout_code = rubout_code;
|
|
142 xj->cswidth_id = ld->cswidth_id;
|
|
143
|
|
144 if (xim->save_under)
|
|
145 {
|
|
146 xj->save_under = 1;
|
|
147 }
|
|
148 else
|
|
149 {
|
|
150 xj->save_under = 0;
|
|
151 }
|
|
152
|
|
153 for (i = 0, we = c_c->normal_env; we; we = we->next, i++);
|
|
154 xj->max_env = i;
|
|
155 for (i = 0, we = c_c->reverse_env; we; we = we->next, i++);
|
|
156 xj->max_reverse_env = i;
|
|
157
|
|
158 strcpy (prop_name, XJUTIL_START_PRO);
|
|
159 strcat (prop_name, ld->lang);
|
|
160 id = XInternAtom (dpy, prop_name, False);
|
|
161 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeReplace, (unsigned char *) xj, sizeof (Xjutil_startRec));
|
|
162
|
|
163 for (i = 0; i < xim->screen_count; i++)
|
|
164 {
|
|
165 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, (unsigned char *) &cur_p->pe.fg, sizeof (unsigned long));
|
|
166 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, (unsigned char *) &cur_p->pe.bg, sizeof (unsigned long));
|
|
167 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, (unsigned char *) &cur_p->root_pointer->bw, sizeof (unsigned int));
|
|
168 }
|
|
169 for (i = 0, we = c_c->normal_env; we; we = we->next, i++)
|
|
170 {
|
|
171 tmp_buf[0] = '\0';
|
|
172 if (we->host_name)
|
|
173 strcpy ((char *) tmp_buf, we->host_name);
|
|
174 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 256);
|
|
175 tmp_buf[0] = '\0';
|
|
176 if (we->envrc_name)
|
|
177 strcpy ((char *) tmp_buf, we->envrc_name);
|
|
178 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 256);
|
|
179 tmp_buf[0] = '\0';
|
|
180 strcpy ((char *) tmp_buf, we->env_name_str);
|
|
181 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 32);
|
|
182 }
|
|
183 for (i = 0, we = c_c->reverse_env; we; we = we->next, i++)
|
|
184 {
|
|
185 tmp_buf[0] = '\0';
|
|
186 if (we->host_name)
|
|
187 strcpy ((char *) tmp_buf, we->host_name);
|
|
188 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 256);
|
|
189 tmp_buf[0] = '\0';
|
|
190 if (we->envrc_name)
|
|
191 strcpy ((char *) tmp_buf, we->envrc_name);
|
|
192 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 256);
|
|
193 tmp_buf[0] = '\0';
|
|
194 strcpy ((char *) tmp_buf, we->env_name_str);
|
|
195 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 32);
|
|
196 }
|
|
197 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, p, strlen ((char *) p));
|
|
198 XSetSelectionOwner (dpy, id, xim->root_pointer[xim->default_screen]->ximclient->w, 0L);
|
|
199 XFlush (dpy);
|
|
200 Free (p);
|
|
201 return (ld);
|
|
202 }
|
|
203
|
|
204 #ifndef NOTFORK_XJUTIL
|
|
205 static void
|
|
206 kill_old_xjutil ()
|
|
207 {
|
|
208 char tmp_buf[256];
|
|
209 XIMLangDataBase *ld;
|
|
210 XEvent event;
|
|
211 Window w;
|
|
212 Atom ret;
|
|
213
|
|
214 for (ld = language_db; ld != NULL; ld = ld->next)
|
|
215 {
|
|
216 strcpy (tmp_buf, XJUTIL_START_PRO);
|
|
217 strcat (tmp_buf, ld->lang);
|
|
218 strcat (tmp_buf, "_OK");
|
|
219 if (ret = XInternAtom (dpy, tmp_buf, True))
|
|
220 {
|
|
221 if (w = XGetSelectionOwner (dpy, ret))
|
|
222 {
|
|
223 event.type = ClientMessage;
|
|
224 event.xclient.format = 32;
|
|
225 event.xclient.window = w;
|
|
226 event.xclient.data.l[0] = DIC_KILL;
|
|
227 XSendEvent (dpy, w, False, NoEventMask, &event);
|
|
228 XFlush (dpy);
|
|
229 }
|
|
230 }
|
|
231 }
|
|
232 }
|
|
233
|
|
234 static void
|
|
235 exec_xjutil (prop_name, counter)
|
|
236 char *prop_name;
|
|
237 int counter;
|
|
238 {
|
|
239 char tmp[2];
|
|
240 unsigned char *p, tmp_buf[256];
|
|
241
|
|
242 tmp[0] = (char) counter;
|
|
243 tmp[1] = '\0';
|
|
244 if (xjutil_name == NULL)
|
|
245 {
|
|
246 strcpy ((char *) tmp_buf, XJUTILBINDIR);
|
|
247 strcat ((char *) tmp_buf, "/");
|
|
248 strcat ((char *) tmp_buf, XJUTIL_NAME);
|
|
249 p = tmp_buf;
|
|
250 }
|
|
251 else
|
|
252 {
|
|
253 p = (unsigned char *) xjutil_name;
|
|
254 }
|
|
255 execlp ((char *) p, (char *) p, DisplayString (dpy), prop_name, tmp, 0);
|
|
256 }
|
|
257
|
|
258 static void
|
|
259 catch_sigchld ()
|
|
260 {
|
|
261 XIMLangDataBase *ld;
|
|
262 #ifdef SYSVR2
|
|
263 int status;
|
|
264 #else
|
|
265 union wait status;
|
|
266 #endif
|
|
267 int pid;
|
|
268
|
|
269 #ifdef SYSVR2
|
|
270 pid = wait (&status);
|
|
271 #else
|
|
272 pid = wait3 (&status, WNOHANG, 0);
|
|
273 #endif
|
|
274 for (ld = language_db; ld != NULL; ld = ld->next)
|
|
275 {
|
|
276 if (ld->xjutil_pid == pid)
|
|
277 {
|
|
278 ld->xjutil_id = 0;
|
|
279 ld->xjutil_pid = 0;
|
|
280 return;
|
|
281 }
|
|
282 }
|
|
283 return;
|
|
284 }
|
|
285 #endif /* !NOTFORK_XJUTIL */
|
|
286
|
|
287 void
|
|
288 xjutil_start ()
|
|
289 {
|
|
290 char prop_name[32];
|
|
291 static int counter = 1;
|
|
292 XIMLangDataBase *ld;
|
|
293
|
|
294 if (!(ld = set_xjutil (prop_name)))
|
|
295 {
|
|
296 print_out ("Could not exec xjutil");
|
|
297 return;
|
|
298 }
|
|
299 ld->xjutil_act = counter++;
|
|
300 #ifndef NOTFORK_XJUTIL
|
|
301 signal (SIGCHLD, catch_sigchld);
|
|
302 if ((ld->xjutil_pid = fork ()) == 0)
|
|
303 {
|
|
304 close (ConnectionNumber (dpy));
|
|
305 exec_xjutil (prop_name, ld->xjutil_act);
|
|
306 print_out ("Could not execute xjutil");
|
|
307 exit (1);
|
|
308 }
|
|
309 #endif /* NOTFORK_XJUTIL */
|
|
310 }
|
|
311
|
|
312 void
|
|
313 kill_xjutil (ld)
|
|
314 XIMLangDataBase *ld;
|
|
315 {
|
|
316 extern int kill ();
|
|
317
|
|
318 if (ld->xjutil_pid > 0)
|
|
319 {
|
|
320 kill (ld->xjutil_pid, SIGTERM);
|
|
321 ld->xjutil_act = 0;
|
|
322 ld->xjutil_id = 0;
|
|
323 ld->xjutil_pid = 0;
|
|
324 }
|
|
325 }
|
|
326
|
|
327 void
|
|
328 kill_all_xjutil ()
|
|
329 {
|
|
330 XIMLangDataBase *ld;
|
|
331
|
|
332 for (ld = language_db; ld; ld = ld->next)
|
|
333 {
|
|
334 if (ld->xjutil_pid > 0)
|
|
335 {
|
|
336 kill_xjutil (ld);
|
|
337 }
|
|
338 }
|
|
339 return;
|
|
340 }
|
|
341
|
|
342 static void
|
|
343 send_xjutil_event (id)
|
|
344 int id;
|
|
345 {
|
|
346 XEvent event;
|
|
347
|
|
348 event.type = ClientMessage;
|
|
349 event.xclient.format = 32;
|
|
350 event.xclient.window = xim->root_pointer[xim->default_screen]->ximclient->w;
|
|
351 event.xclient.data.l[0] = id;
|
|
352 XSendEvent (dpy, cur_p->cur_xl->lang_db->xjutil_id, False, NoEventMask, &event);
|
|
353 XFlush (dpy);
|
|
354 return;
|
|
355 }
|
|
356
|
|
357 static int
|
|
358 check_cur_xjutil ()
|
|
359 {
|
|
360 register XIMLangRec *xl = cur_p->cur_xl;
|
|
361
|
|
362 if (xl->lang_db->xjutil_id == 0 || xl->lang_db->xjutil_use)
|
|
363 return (-1);
|
|
364 xl->working_xjutil = 1;
|
|
365 xl->lang_db->xjutil_use = cur_p;
|
|
366 return (0);
|
|
367 }
|
|
368
|
|
369 void
|
|
370 xjutil_send_key_event (ev)
|
|
371 XKeyEvent *ev;
|
|
372 {
|
|
373 XSendEvent (dpy, cur_p->cur_xl->lang_db->xjutil_id, False, NoEventMask, (XEvent *) ev);
|
|
374 XFlush (dpy);
|
|
375 return;
|
|
376 }
|
|
377
|
|
378 void
|
|
379 set_xjutil_id (w, act, error)
|
|
380 Window w;
|
|
381 int act;
|
|
382 char error;
|
|
383 {
|
|
384 XIMLangDataBase *ld;
|
|
385
|
|
386 for (ld = language_db; ld != NULL; ld = ld->next)
|
|
387 {
|
|
388 if (ld->xjutil_act == act)
|
|
389 {
|
|
390 if (error)
|
|
391 {
|
|
392 ld->xjutil_id = 0;
|
|
393 ld->xjutil_pid = 0;
|
|
394 }
|
|
395 else
|
|
396 {
|
|
397 ld->xjutil_id = w;
|
|
398 XSelectInput (dpy, w, StructureNotifyMask);
|
|
399 }
|
|
400 return;
|
|
401 }
|
|
402 }
|
|
403 return;
|
|
404 }
|
|
405
|
|
406 void
|
|
407 reset_xjutil_fs_id (id, act)
|
|
408 int id;
|
|
409 int act;
|
|
410 {
|
|
411 register int i;
|
|
412 XIMLangDataBase *ld;
|
|
413 XIMClientList xc = ximclient_list;
|
|
414 XIMLangRec **xl;
|
|
415
|
|
416 for (ld = language_db; ld; ld = ld->next)
|
|
417 {
|
|
418 if (ld->xjutil_act == act)
|
|
419 break;
|
|
420 }
|
|
421 if (ld == NULL)
|
|
422 return;
|
|
423 for (; xc != NULL; xc = xc->next)
|
|
424 {
|
|
425 for (i = 0, xl = xc->xl; i < xc->lang_num; i++)
|
|
426 {
|
|
427 if ((xl[i]->lang_db == ld) && (xl[i]->xjutil_fs_id == id))
|
|
428 {
|
|
429 xl[i]->xjutil_fs_id = -1;
|
|
430 return;
|
|
431 }
|
|
432 }
|
|
433 }
|
|
434 return;
|
|
435 }
|
|
436
|
|
437 int
|
|
438 isstart_xjutil (lang)
|
|
439 char *lang;
|
|
440 {
|
|
441 Atom ret;
|
|
442 char tmp[64];
|
|
443
|
|
444 strcpy (tmp, XJUTIL_START_PRO);
|
|
445 strcat (tmp, lang);
|
|
446 strcat (tmp, "_OK");
|
|
447 if (ret = XInternAtom (dpy, tmp, True))
|
|
448 {
|
|
449 if (XGetSelectionOwner (dpy, ret))
|
|
450 {
|
|
451 return (1);
|
|
452 }
|
|
453 }
|
|
454 return (0);
|
|
455 }
|
|
456
|
|
457 void
|
|
458 end_xjutil_work (act)
|
|
459 int act;
|
|
460 {
|
|
461 register XIMLangDataBase *ld;
|
|
462
|
|
463 for (ld = language_db; ld; ld = ld->next)
|
|
464 {
|
|
465 if (ld->xjutil_act == act)
|
|
466 {
|
|
467 if (ld->xjutil_use)
|
|
468 {
|
|
469 ld->xjutil_use->cur_xl->working_xjutil = 0;
|
|
470 ld->xjutil_use = NULL;
|
|
471 }
|
|
472 break;
|
|
473 }
|
|
474 }
|
|
475 }
|
|
476
|
|
477 int
|
|
478 xjutil_destroy (ev)
|
|
479 register XDestroyWindowEvent *ev;
|
|
480 {
|
|
481 Window window = ev->window;
|
|
482 register XIMClientList xc;
|
|
483 register XIMLangDataBase *ld;
|
|
484 register int i;
|
|
485
|
|
486 for (ld = language_db; ld; ld = ld->next)
|
|
487 {
|
|
488 if (ld->xjutil_id == window)
|
|
489 break;
|
|
490 }
|
|
491 if (!ld)
|
|
492 return (0);
|
|
493 ld->xjutil_id = (Window) 0;
|
|
494 ld->xjutil_pid = 0;
|
|
495 ld->xjutil_use = NULL;
|
|
496 XSelectInput (dpy, window, NoEventMask);
|
|
497 for (xc = ximclient_list; xc; xc = xc->next)
|
|
498 {
|
|
499 for (i = 0; i < xc->lang_num; i++)
|
|
500 {
|
|
501 if (xc->xl[i]->lang_db == ld)
|
|
502 {
|
|
503 xc->xl[i]->xjutil_fs_id = -1;
|
|
504 xc->xl[i]->working_xjutil = 0;
|
|
505 }
|
|
506 }
|
|
507 }
|
|
508 return (1);
|
|
509 }
|
|
510
|
|
511 static Atom
|
|
512 set_uum_env ()
|
|
513 {
|
|
514 Atom id;
|
|
515 Xjutil_envRec xjutil_env;
|
|
516 register int i, nbytes = 0;
|
|
517 register unsigned char *p = NULL;
|
|
518 XFontStruct **font_struct_list;
|
|
519 char **font_name_list;
|
|
520 int num;
|
|
521 WnnEnv *we;
|
|
522 char prop_name[32];
|
|
523
|
|
524 strcpy (prop_name, XJUTIL_ENV_PRO);
|
|
525 strcat (prop_name, cur_p->cur_xl->lang_db->lang);
|
|
526 if ((id = XInternAtom (dpy, prop_name, True)) == 0)
|
|
527 {
|
|
528 id = XInternAtom (dpy, prop_name, False);
|
|
529 }
|
|
530 xjutil_env.screen = cur_p->root_pointer->screen;
|
|
531 if (cur_p->cur_xl->xjutil_fs_id == -1)
|
|
532 {
|
|
533 nbytes = 0;
|
|
534 num = XFontsOfFontSet (cur_p->cur_xl->pe_fs, &font_struct_list, &font_name_list);
|
|
535 for (i = 0; i < num; i++)
|
|
536 {
|
|
537 nbytes += (strlen (font_name_list[i]) + 1);
|
|
538 }
|
|
539 if (!(p = (unsigned char *) Malloc ((unsigned) (nbytes + 1))))
|
|
540 {
|
|
541 malloc_error ("Allocation of work area for xjutil");
|
|
542 return ((Atom) 0);
|
|
543 }
|
|
544 p[0] = '\0';
|
|
545 for (i = 0; i < num; i++)
|
|
546 {
|
|
547 strcat ((char *) p, font_name_list[i]);
|
|
548 strcat ((char *) p, ",");
|
|
549 }
|
|
550 p[nbytes - 1] = '\0';
|
|
551 xjutil_env.fs_id = cur_p->cur_xl->xjutil_fs_id = seq_xjutil_fs_id++;
|
|
552 xjutil_env.fn_len = nbytes - 1;
|
|
553 }
|
|
554 else
|
|
555 {
|
|
556 xjutil_env.fs_id = cur_p->cur_xl->xjutil_fs_id;
|
|
557 xjutil_env.fn_len = 0;
|
|
558 }
|
|
559 xjutil_env.fore_ground = cur_p->pe.fg;
|
|
560 xjutil_env.back_ground = cur_p->pe.bg;
|
|
561 xjutil_env.cur_env_id = -1;
|
|
562 xjutil_env.cur_env_reverse_id = -1;
|
|
563 if (c_c->cur_normal_env && c_c->cur_normal_env->env)
|
|
564 xjutil_env.cur_env_id = c_c->cur_normal_env->env->env_id;
|
|
565 if (c_c->cur_reverse_env && c_c->cur_reverse_env->env)
|
|
566 xjutil_env.cur_env_reverse_id = c_c->cur_reverse_env->env->env_id;
|
|
567 for (i = 0, we = c_c->normal_env; we; we = we->next, i++)
|
|
568 {
|
|
569 if (we->env)
|
|
570 xjutil_env.env_id[i] = we->env->env_id;
|
|
571 else
|
|
572 xjutil_env.env_id[i] = -1;
|
|
573 }
|
|
574 for (i = 0, we = c_c->reverse_env; we; we = we->next, i++)
|
|
575 {
|
|
576 if (we->env)
|
|
577 xjutil_env.env_reverse_id[i] = we->env->env_id;
|
|
578 else
|
|
579 xjutil_env.env_reverse_id[i] = -1;
|
|
580 }
|
|
581 if (c_c->cur_reverse_env && jl_env_get (bun_data_) == c_c->cur_reverse_env->env)
|
|
582 xjutil_env.env_is_reverse = 1;
|
|
583 else
|
|
584 xjutil_env.env_is_reverse = 0;
|
|
585 strcpy (xjutil_env.lc_name, cur_lang->lc_name);
|
|
586 xjutil_env.cswidth_id = cur_lang->cswidth_id;
|
|
587 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeReplace, (unsigned char *) &xjutil_env, sizeof (Xjutil_envRec));
|
|
588 if (nbytes > 0)
|
|
589 {
|
|
590 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, p, strlen ((char *) p));
|
|
591 Free (p);
|
|
592 }
|
|
593 XFlush (dpy);
|
|
594 return (id);
|
|
595 }
|
|
596
|
|
597 static void
|
|
598 set_uum_touroku (start)
|
|
599 int start;
|
|
600 {
|
|
601 Atom id;
|
|
602
|
|
603 if ((id = set_uum_env ()) == 0)
|
|
604 return;
|
|
605 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, (unsigned char *) &start, sizeof (int));
|
|
606 XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, (unsigned char *) c_b->buffer, Strlen (c_b->buffer) * 2);
|
|
607 XFlush (dpy);
|
|
608 }
|
|
609
|
|
610 void
|
|
611 xw_jishoadd ()
|
|
612 {
|
|
613 if (check_cur_xjutil ())
|
|
614 return;
|
|
615 if (set_uum_env () == 0)
|
|
616 return;
|
|
617 send_xjutil_event (DIC_ADD);
|
|
618 }
|
|
619
|
|
620 void
|
|
621 xw_kensaku ()
|
|
622 {
|
|
623 if (check_cur_xjutil ())
|
|
624 return;
|
|
625 if (set_uum_env () == 0)
|
|
626 return;
|
|
627 send_xjutil_event (DIC_KENSAKU);
|
|
628 }
|
|
629
|
|
630 void
|
|
631 xw_select_one_dict9 ()
|
|
632 {
|
|
633 if (check_cur_xjutil ())
|
|
634 return;
|
|
635 if (set_uum_env () == 0)
|
|
636 return;
|
|
637 send_xjutil_event (DIC_ICHIRAN);
|
|
638 }
|
|
639
|
|
640 void
|
|
641 xw_paramchg ()
|
|
642 {
|
|
643 if (check_cur_xjutil ())
|
|
644 return;
|
|
645 if (set_uum_env () == 0)
|
|
646 return;
|
|
647 send_xjutil_event (DIC_PARAM);
|
|
648 }
|
|
649
|
|
650 void
|
|
651 xw_dicinfoout ()
|
|
652 {
|
|
653 if (check_cur_xjutil ())
|
|
654 return;
|
|
655 if (set_uum_env () == 0)
|
|
656 return;
|
|
657 send_xjutil_event (DIC_INFO);
|
|
658 }
|
|
659
|
|
660 void
|
|
661 xw_fuzoku_set ()
|
|
662 {
|
|
663 if (check_cur_xjutil ())
|
|
664 return;
|
|
665 if (set_uum_env () == 0)
|
|
666 return;
|
|
667 send_xjutil_event (DIC_FZK);
|
|
668 }
|
|
669
|
|
670 void
|
|
671 xw_touroku (s)
|
|
672 int s;
|
|
673 {
|
|
674 if (check_cur_xjutil ())
|
|
675 return;
|
|
676 set_uum_touroku (s);
|
|
677 send_xjutil_event (DIC_TOUROKU);
|
|
678 }
|
|
679
|
|
680 void
|
|
681 call_kill_old_xjutil ()
|
|
682 {
|
|
683 #ifndef NOTFORK_XJUTIL
|
|
684 kill_old_xjutil ();
|
|
685 #endif /* !NOTFORK_XJUTIL */
|
|
686 }
|
|
687
|
|
688 #endif /* USING_XJUTIL */
|