diff Xwnmo/xwnmo/do_xjutil.c @ 0:bbc77ca4def5

initial import
author Yoshiki Yazawa <yaz@cc.rim.or.jp>
date Thu, 13 Dec 2007 04:30:14 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Xwnmo/xwnmo/do_xjutil.c	Thu Dec 13 04:30:14 2007 +0900
@@ -0,0 +1,688 @@
+/*
+ * $Id: do_xjutil.c,v 1.2 2001/06/14 18:16:15 ura Exp $
+ */
+
+/*
+ * FreeWnn is a network-extensible Kana-to-Kanji conversion system.
+ * This file is part of FreeWnn.
+ * 
+ * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
+ * Copyright 1991, 1992 by Massachusetts Institute of Technology
+ *
+ * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Emacs; see the file COPYING.  If not, write to the
+ * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Commentary:
+ *
+ * Change log:
+ *
+ * Last modified date: 8,Feb.1999
+ *
+ * Code:
+ *
+ */
+/*      Version 4.0
+ */
+#ifdef  USING_XJUTIL
+
+#include <stdio.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <X11/Xos.h>
+#include "config.h"
+#include "commonhd.h"
+#include "sdefine.h"
+#include "xim.h"
+#include "sheader.h"
+#include "proto.h"
+#include "ext.h"
+
+#define ROOT_WINDOW     (xim->root_pointer[xim->default_screen]->root_window)
+static int seq_xjutil_fs_id = 0;
+
+static XIMLangDataBase *
+set_xjutil (prop_name)
+     char *prop_name;
+{
+  register int i, nbytes;
+  register unsigned char *p;
+  register Xjutil_startRec *xj;
+  XFontStruct **font_struct_list;
+  char **font_name_list;
+  int num;
+  Atom id;
+  register XIMLangRec *xl = cur_p->cur_xl;
+  Xjutil_startRec xjutil_start;
+  XIMLangDataBase *ld;
+  WnnEnv *we;
+  unsigned char tmp_buf[256];
+
+  if (!(ld = xl->lang_db) || (ld->xjutil_pid))
+    return (NULL);
+
+  xj = &xjutil_start;
+  if (uumkeyname && *uumkeyname)
+    strcpy (xj->uumkey_name, uumkeyname);
+  else
+    xj->uumkey_name[0] = '\0';
+  if (ld->rkfile_name && *ld->rkfile_name)
+    strcpy (xj->rkfile_name, ld->rkfile_name);
+  else
+    xj->rkfile_name[0] = '\0';
+  if (cvt_key_file && *cvt_key_file)
+    strcpy (xj->cvtkey_name, cvt_key_file);
+  else
+    xj->cvtfun_name[0] = '\0';
+  if (cvt_fun_file && *cvt_fun_file)
+    strcpy (xj->cvtfun_name, cvt_fun_file);
+  else
+    xj->cvtfun_name[0] = '\0';
+  if (cvt_meta_file && *cvt_meta_file)
+    strcpy (xj->cvtmeta_name, cvt_meta_file);
+  else
+    xj->cvtmeta_name[0] = '\0';
+  if (username && *username)
+    strcpy (xj->user_name, username);
+  else
+    xj->user_name[0] = '\0';
+  if (ld->lang && *ld->lang)
+    strcpy (xj->lang, ld->lang);
+  else
+    xj->lang[0] = '\0';
+  if (ld->lc_name && *ld->lc_name)
+    strcpy (xj->lc_name, ld->lc_name);
+  else
+    xj->lc_name[0] = '\0';
+  strcpy (xj->f_name, ld->f_table->name);
+  if (ld->jishopath && *ld->jishopath)
+    strcpy (xj->jishopath, ld->jishopath);
+  else
+    xj->jishopath[0] = '\0';
+  if (ld->hindopath && *ld->hindopath)
+    strcpy (xj->hindopath, ld->hindopath);
+  else
+    xj->hindopath[0] = '\0';
+  if (ld->fuzokugopath && *ld->fuzokugopath)
+    strcpy (xj->fuzokugopath, ld->fuzokugopath);
+  else
+    xj->fuzokugopath[0] = '\0';
+  nbytes = 0;
+  num = XFontsOfFontSet (xl->pe_fs, &font_struct_list, &font_name_list);
+  for (i = 0; i < num; i++)
+    {
+      nbytes += (strlen (font_name_list[i]) + 1);
+    }
+  if (!(p = (unsigned char *) Malloc ((unsigned) (nbytes + 1))))
+    {
+      malloc_error ("allocation of work area for xjutil");
+      return (NULL);
+    }
+  p[0] = '\0';
+  for (i = 0; i < num; i++)
+    {
+      strcat ((char *) p, font_name_list[i]);
+      strcat ((char *) p, ",");
+    }
+  p[nbytes - 1] = '\0';
+  xj->fn_len = nbytes - 1;
+  xj->rubout_code = rubout_code;
+  xj->cswidth_id = ld->cswidth_id;
+
+  if (xim->save_under)
+    {
+      xj->save_under = 1;
+    }
+  else
+    {
+      xj->save_under = 0;
+    }
+
+  for (i = 0, we = c_c->normal_env; we; we = we->next, i++);
+  xj->max_env = i;
+  for (i = 0, we = c_c->reverse_env; we; we = we->next, i++);
+  xj->max_reverse_env = i;
+
+  strcpy (prop_name, XJUTIL_START_PRO);
+  strcat (prop_name, ld->lang);
+  id = XInternAtom (dpy, prop_name, False);
+  XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeReplace, (unsigned char *) xj, sizeof (Xjutil_startRec));
+
+  for (i = 0; i < xim->screen_count; i++)
+    {
+      XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, (unsigned char *) &cur_p->pe.fg, sizeof (unsigned long));
+      XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, (unsigned char *) &cur_p->pe.bg, sizeof (unsigned long));
+      XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, (unsigned char *) &cur_p->root_pointer->bw, sizeof (unsigned int));
+    }
+  for (i = 0, we = c_c->normal_env; we; we = we->next, i++)
+    {
+      tmp_buf[0] = '\0';
+      if (we->host_name)
+        strcpy ((char *) tmp_buf, we->host_name);
+      XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 256);
+      tmp_buf[0] = '\0';
+      if (we->envrc_name)
+        strcpy ((char *) tmp_buf, we->envrc_name);
+      XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 256);
+      tmp_buf[0] = '\0';
+      strcpy ((char *) tmp_buf, we->env_name_str);
+      XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 32);
+    }
+  for (i = 0, we = c_c->reverse_env; we; we = we->next, i++)
+    {
+      tmp_buf[0] = '\0';
+      if (we->host_name)
+        strcpy ((char *) tmp_buf, we->host_name);
+      XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 256);
+      tmp_buf[0] = '\0';
+      if (we->envrc_name)
+        strcpy ((char *) tmp_buf, we->envrc_name);
+      XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 256);
+      tmp_buf[0] = '\0';
+      strcpy ((char *) tmp_buf, we->env_name_str);
+      XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, tmp_buf, 32);
+    }
+  XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, p, strlen ((char *) p));
+  XSetSelectionOwner (dpy, id, xim->root_pointer[xim->default_screen]->ximclient->w, 0L);
+  XFlush (dpy);
+  Free (p);
+  return (ld);
+}
+
+#ifndef NOTFORK_XJUTIL
+static void
+kill_old_xjutil ()
+{
+  char tmp_buf[256];
+  XIMLangDataBase *ld;
+  XEvent event;
+  Window w;
+  Atom ret;
+
+  for (ld = language_db; ld != NULL; ld = ld->next)
+    {
+      strcpy (tmp_buf, XJUTIL_START_PRO);
+      strcat (tmp_buf, ld->lang);
+      strcat (tmp_buf, "_OK");
+      if (ret = XInternAtom (dpy, tmp_buf, True))
+        {
+          if (w = XGetSelectionOwner (dpy, ret))
+            {
+              event.type = ClientMessage;
+              event.xclient.format = 32;
+              event.xclient.window = w;
+              event.xclient.data.l[0] = DIC_KILL;
+              XSendEvent (dpy, w, False, NoEventMask, &event);
+              XFlush (dpy);
+            }
+        }
+    }
+}
+
+static void
+exec_xjutil (prop_name, counter)
+     char *prop_name;
+     int counter;
+{
+  char tmp[2];
+  unsigned char *p, tmp_buf[256];
+
+  tmp[0] = (char) counter;
+  tmp[1] = '\0';
+  if (xjutil_name == NULL)
+    {
+      strcpy ((char *) tmp_buf, XJUTILBINDIR);
+      strcat ((char *) tmp_buf, "/");
+      strcat ((char *) tmp_buf, XJUTIL_NAME);
+      p = tmp_buf;
+    }
+  else
+    {
+      p = (unsigned char *) xjutil_name;
+    }
+  execlp ((char *) p, (char *) p, DisplayString (dpy), prop_name, tmp, 0);
+}
+
+static void
+catch_sigchld ()
+{
+  XIMLangDataBase *ld;
+#ifdef SYSVR2
+  int status;
+#else
+  union wait status;
+#endif
+  int pid;
+
+#ifdef SYSVR2
+  pid = wait (&status);
+#else
+  pid = wait3 (&status, WNOHANG, 0);
+#endif
+  for (ld = language_db; ld != NULL; ld = ld->next)
+    {
+      if (ld->xjutil_pid == pid)
+        {
+          ld->xjutil_id = 0;
+          ld->xjutil_pid = 0;
+          return;
+        }
+    }
+  return;
+}
+#endif /* !NOTFORK_XJUTIL */
+
+void
+xjutil_start ()
+{
+  char prop_name[32];
+  static int counter = 1;
+  XIMLangDataBase *ld;
+
+  if (!(ld = set_xjutil (prop_name)))
+    {
+      print_out ("Could not exec xjutil");
+      return;
+    }
+  ld->xjutil_act = counter++;
+#ifndef NOTFORK_XJUTIL
+  signal (SIGCHLD, catch_sigchld);
+  if ((ld->xjutil_pid = fork ()) == 0)
+    {
+      close (ConnectionNumber (dpy));
+      exec_xjutil (prop_name, ld->xjutil_act);
+      print_out ("Could not execute xjutil");
+      exit (1);
+    }
+#endif /* NOTFORK_XJUTIL */
+}
+
+void
+kill_xjutil (ld)
+     XIMLangDataBase *ld;
+{
+  extern int kill ();
+
+  if (ld->xjutil_pid > 0)
+    {
+      kill (ld->xjutil_pid, SIGTERM);
+      ld->xjutil_act = 0;
+      ld->xjutil_id = 0;
+      ld->xjutil_pid = 0;
+    }
+}
+
+void
+kill_all_xjutil ()
+{
+  XIMLangDataBase *ld;
+
+  for (ld = language_db; ld; ld = ld->next)
+    {
+      if (ld->xjutil_pid > 0)
+        {
+          kill_xjutil (ld);
+        }
+    }
+  return;
+}
+
+static void
+send_xjutil_event (id)
+     int id;
+{
+  XEvent event;
+
+  event.type = ClientMessage;
+  event.xclient.format = 32;
+  event.xclient.window = xim->root_pointer[xim->default_screen]->ximclient->w;
+  event.xclient.data.l[0] = id;
+  XSendEvent (dpy, cur_p->cur_xl->lang_db->xjutil_id, False, NoEventMask, &event);
+  XFlush (dpy);
+  return;
+}
+
+static int
+check_cur_xjutil ()
+{
+  register XIMLangRec *xl = cur_p->cur_xl;
+
+  if (xl->lang_db->xjutil_id == 0 || xl->lang_db->xjutil_use)
+    return (-1);
+  xl->working_xjutil = 1;
+  xl->lang_db->xjutil_use = cur_p;
+  return (0);
+}
+
+void
+xjutil_send_key_event (ev)
+     XKeyEvent *ev;
+{
+  XSendEvent (dpy, cur_p->cur_xl->lang_db->xjutil_id, False, NoEventMask, (XEvent *) ev);
+  XFlush (dpy);
+  return;
+}
+
+void
+set_xjutil_id (w, act, error)
+     Window w;
+     int act;
+     char error;
+{
+  XIMLangDataBase *ld;
+
+  for (ld = language_db; ld != NULL; ld = ld->next)
+    {
+      if (ld->xjutil_act == act)
+        {
+          if (error)
+            {
+              ld->xjutil_id = 0;
+              ld->xjutil_pid = 0;
+            }
+          else
+            {
+              ld->xjutil_id = w;
+              XSelectInput (dpy, w, StructureNotifyMask);
+            }
+          return;
+        }
+    }
+  return;
+}
+
+void
+reset_xjutil_fs_id (id, act)
+     int id;
+     int act;
+{
+  register int i;
+  XIMLangDataBase *ld;
+  XIMClientList xc = ximclient_list;
+  XIMLangRec **xl;
+
+  for (ld = language_db; ld; ld = ld->next)
+    {
+      if (ld->xjutil_act == act)
+        break;
+    }
+  if (ld == NULL)
+    return;
+  for (; xc != NULL; xc = xc->next)
+    {
+      for (i = 0, xl = xc->xl; i < xc->lang_num; i++)
+        {
+          if ((xl[i]->lang_db == ld) && (xl[i]->xjutil_fs_id == id))
+            {
+              xl[i]->xjutil_fs_id = -1;
+              return;
+            }
+        }
+    }
+  return;
+}
+
+int
+isstart_xjutil (lang)
+     char *lang;
+{
+  Atom ret;
+  char tmp[64];
+
+  strcpy (tmp, XJUTIL_START_PRO);
+  strcat (tmp, lang);
+  strcat (tmp, "_OK");
+  if (ret = XInternAtom (dpy, tmp, True))
+    {
+      if (XGetSelectionOwner (dpy, ret))
+        {
+          return (1);
+        }
+    }
+  return (0);
+}
+
+void
+end_xjutil_work (act)
+     int act;
+{
+  register XIMLangDataBase *ld;
+
+  for (ld = language_db; ld; ld = ld->next)
+    {
+      if (ld->xjutil_act == act)
+        {
+          if (ld->xjutil_use)
+            {
+              ld->xjutil_use->cur_xl->working_xjutil = 0;
+              ld->xjutil_use = NULL;
+            }
+          break;
+        }
+    }
+}
+
+int
+xjutil_destroy (ev)
+     register XDestroyWindowEvent *ev;
+{
+  Window window = ev->window;
+  register XIMClientList xc;
+  register XIMLangDataBase *ld;
+  register int i;
+
+  for (ld = language_db; ld; ld = ld->next)
+    {
+      if (ld->xjutil_id == window)
+        break;
+    }
+  if (!ld)
+    return (0);
+  ld->xjutil_id = (Window) 0;
+  ld->xjutil_pid = 0;
+  ld->xjutil_use = NULL;
+  XSelectInput (dpy, window, NoEventMask);
+  for (xc = ximclient_list; xc; xc = xc->next)
+    {
+      for (i = 0; i < xc->lang_num; i++)
+        {
+          if (xc->xl[i]->lang_db == ld)
+            {
+              xc->xl[i]->xjutil_fs_id = -1;
+              xc->xl[i]->working_xjutil = 0;
+            }
+        }
+    }
+  return (1);
+}
+
+static Atom
+set_uum_env ()
+{
+  Atom id;
+  Xjutil_envRec xjutil_env;
+  register int i, nbytes = 0;
+  register unsigned char *p = NULL;
+  XFontStruct **font_struct_list;
+  char **font_name_list;
+  int num;
+  WnnEnv *we;
+  char prop_name[32];
+
+  strcpy (prop_name, XJUTIL_ENV_PRO);
+  strcat (prop_name, cur_p->cur_xl->lang_db->lang);
+  if ((id = XInternAtom (dpy, prop_name, True)) == 0)
+    {
+      id = XInternAtom (dpy, prop_name, False);
+    }
+  xjutil_env.screen = cur_p->root_pointer->screen;
+  if (cur_p->cur_xl->xjutil_fs_id == -1)
+    {
+      nbytes = 0;
+      num = XFontsOfFontSet (cur_p->cur_xl->pe_fs, &font_struct_list, &font_name_list);
+      for (i = 0; i < num; i++)
+        {
+          nbytes += (strlen (font_name_list[i]) + 1);
+        }
+      if (!(p = (unsigned char *) Malloc ((unsigned) (nbytes + 1))))
+        {
+          malloc_error ("Allocation of work area for xjutil");
+          return ((Atom) 0);
+        }
+      p[0] = '\0';
+      for (i = 0; i < num; i++)
+        {
+          strcat ((char *) p, font_name_list[i]);
+          strcat ((char *) p, ",");
+        }
+      p[nbytes - 1] = '\0';
+      xjutil_env.fs_id = cur_p->cur_xl->xjutil_fs_id = seq_xjutil_fs_id++;
+      xjutil_env.fn_len = nbytes - 1;
+    }
+  else
+    {
+      xjutil_env.fs_id = cur_p->cur_xl->xjutil_fs_id;
+      xjutil_env.fn_len = 0;
+    }
+  xjutil_env.fore_ground = cur_p->pe.fg;
+  xjutil_env.back_ground = cur_p->pe.bg;
+  xjutil_env.cur_env_id = -1;
+  xjutil_env.cur_env_reverse_id = -1;
+  if (c_c->cur_normal_env && c_c->cur_normal_env->env)
+    xjutil_env.cur_env_id = c_c->cur_normal_env->env->env_id;
+  if (c_c->cur_reverse_env && c_c->cur_reverse_env->env)
+    xjutil_env.cur_env_reverse_id = c_c->cur_reverse_env->env->env_id;
+  for (i = 0, we = c_c->normal_env; we; we = we->next, i++)
+    {
+      if (we->env)
+        xjutil_env.env_id[i] = we->env->env_id;
+      else
+        xjutil_env.env_id[i] = -1;
+    }
+  for (i = 0, we = c_c->reverse_env; we; we = we->next, i++)
+    {
+      if (we->env)
+        xjutil_env.env_reverse_id[i] = we->env->env_id;
+      else
+        xjutil_env.env_reverse_id[i] = -1;
+    }
+  if (c_c->cur_reverse_env && jl_env_get (bun_data_) == c_c->cur_reverse_env->env)
+    xjutil_env.env_is_reverse = 1;
+  else
+    xjutil_env.env_is_reverse = 0;
+  strcpy (xjutil_env.lc_name, cur_lang->lc_name);
+  xjutil_env.cswidth_id = cur_lang->cswidth_id;
+  XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeReplace, (unsigned char *) &xjutil_env, sizeof (Xjutil_envRec));
+  if (nbytes > 0)
+    {
+      XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, p, strlen ((char *) p));
+      Free (p);
+    }
+  XFlush (dpy);
+  return (id);
+}
+
+static void
+set_uum_touroku (start)
+     int start;
+{
+  Atom id;
+
+  if ((id = set_uum_env ()) == 0)
+    return;
+  XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, (unsigned char *) &start, sizeof (int));
+  XChangeProperty (dpy, ROOT_WINDOW, id, XA_STRING, 8, PropModeAppend, (unsigned char *) c_b->buffer, Strlen (c_b->buffer) * 2);
+  XFlush (dpy);
+}
+
+void
+xw_jishoadd ()
+{
+  if (check_cur_xjutil ())
+    return;
+  if (set_uum_env () == 0)
+    return;
+  send_xjutil_event (DIC_ADD);
+}
+
+void
+xw_kensaku ()
+{
+  if (check_cur_xjutil ())
+    return;
+  if (set_uum_env () == 0)
+    return;
+  send_xjutil_event (DIC_KENSAKU);
+}
+
+void
+xw_select_one_dict9 ()
+{
+  if (check_cur_xjutil ())
+    return;
+  if (set_uum_env () == 0)
+    return;
+  send_xjutil_event (DIC_ICHIRAN);
+}
+
+void
+xw_paramchg ()
+{
+  if (check_cur_xjutil ())
+    return;
+  if (set_uum_env () == 0)
+    return;
+  send_xjutil_event (DIC_PARAM);
+}
+
+void
+xw_dicinfoout ()
+{
+  if (check_cur_xjutil ())
+    return;
+  if (set_uum_env () == 0)
+    return;
+  send_xjutil_event (DIC_INFO);
+}
+
+void
+xw_fuzoku_set ()
+{
+  if (check_cur_xjutil ())
+    return;
+  if (set_uum_env () == 0)
+    return;
+  send_xjutil_event (DIC_FZK);
+}
+
+void
+xw_touroku (s)
+     int s;
+{
+  if (check_cur_xjutil ())
+    return;
+  set_uum_touroku (s);
+  send_xjutil_event (DIC_TOUROKU);
+}
+
+void
+call_kill_old_xjutil ()
+{
+#ifndef NOTFORK_XJUTIL
+  kill_old_xjutil ();
+#endif /* !NOTFORK_XJUTIL */
+}
+
+#endif /* USING_XJUTIL */