1 #ifndef lint
2 static char rcs_id[] = "$Id: killxwnmo.c,v 1.2 2001/06/14 18:16:16 ura Exp $";
3 #endif /* lint */
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 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 #include <signal.h>
38 #include <pwd.h>
39 #include "wnn_os.h"
40 #include <X11/Xlib.h>
41 #include <X11/Xatom.h>
42 #include "commonhd.h"
43 #include "sdefine.h"
44 
45 void
signal_catch()46 signal_catch ()
47 {
48   printf ("Could not get any replay from the input manager \"%s\".\n", XIM_INPUTMETHOD);
49   exit (1);
50 }
51 
52 void
main(argc,argv)53 main (argc, argv)
54      int argc;
55      char **argv;
56 {
57   Display *dpy;
58   Window window, im_id;
59   XEvent event;
60   Atom atom_im, prop_id = (Atom) 0;
61   char uname[128], *p;
62   int force = 0;
63   extern int getuid ();
64 
65   if (argc > 1)
66     {
67       if (argv[1][0] == '-' && argv[1][1] == '9')
68         force = 1;
69     }
70   if (!(dpy = XOpenDisplay ("")))
71     {
72       printf ("Could not open Display\n");
73       exit (1);
74     }
75   if ((atom_im = XInternAtom (dpy, XIM_INPUTMETHOD, True)) == None || (im_id = XGetSelectionOwner (dpy, atom_im)) == (Window) 0)
76     {
77       printf ("Could not find the input manager \"%s\".\n", XIM_INPUTMETHOD);
78       exit (1);
79     }
80   window = XCreateSimpleWindow (dpy, RootWindow (dpy, DefaultScreen (dpy)), 10, 10, 10, 10, 1, 0, 0);
81   prop_id = XInternAtom (dpy, "XWNMO_KILL_PROP", False);
82   if (!(p = getpwuid (getuid ())->pw_name))
83     {
84       printf ("Could not get the user name.\n");
85       exit (1);
86     }
87   strcpy (uname, p);
88   XChangeProperty (dpy, RootWindow (dpy, DefaultScreen (dpy)), prop_id, XA_STRING, 8, PropModeReplace, (unsigned char *) uname, strlen (uname));
89   event.type = ClientMessage;
90   event.xclient.format = 32;
91   event.xclient.window = window;
92   event.xclient.data.l[0] = XWNMO_KILL;
93   event.xclient.data.l[1] = window;
94   event.xclient.data.l[2] = prop_id;
95   event.xclient.data.l[3] = force;
96   XSendEvent (dpy, im_id, False, NoEventMask, &event);
97   signal (SIGALRM, signal_catch);
98   alarm (10);                   /* If return doesn't occur while 10 minutes, go to exit. */
99   while (1)
100     {
101       XNextEvent (dpy, &event);
102       if (event.type != ClientMessage || event.xclient.data.l[0] != XWNMO_KILL)
103         continue;
104       if (event.xclient.data.l[1] == XWNMO_KILL_OK)
105         {
106           printf ("Completed termination of the input manager \"%s\".\n", XIM_INPUTMETHOD);
107         }
108       else
109         {
110           printf ("Failed termination of the input manager \"%s\".\n", XIM_INPUTMETHOD);
111           if (event.xclient.data.l[2] == -1)
112             {
113               printf ("Because permission denied.\n");
114             }
115           else
116             {
117               printf ("Because %d client(s) connect(s) to it.\n", event.xclient.data.l[2]);
118             }
119         }
120       exit (0);
121     }
122 }
123