1 /*
2  * $Id: xresource.c,v 1.2 2001/06/14 18:16:12 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  *
11  * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2, or (at your option)
16  * any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with GNU Emacs; see the file COPYING.  If not, write to the
25  * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26  *
27  * Commentary:
28  *
29  * Change log:
30  *
31  * Last modified date: 8,Feb.1999
32  *
33  * Code:
34  *
35  */
36 
37 /*
38  * X11R5 Input Method Test Program
39  * xresorce.c v 1.0   Mon Mar  4 10:33:36 JST 1991
40  */
41 
42 /*
43  *      Author: Takashi Inoue    OMRON Corporation
44  *                               takashi@ari.ncl.omron.co.jp
45  *
46  *              Shoji kamada     OMRON Corporation
47  *                               kamada@ari.ncl.omron.co.jp
48  */
49 
50 #include "exvalue.h"
51 #include "func.h"
52 
53 #include <X11/Xutil.h>
54 #include <X11/Xatom.h>
55 #include <X11/Xresource.h>
56 #include <X11/cursorfont.h>
57 
58 void
createxres()59 createxres ()                   /* CREATE X RESources */
60 {
61   char **miss[ARRAY_MAX], *def[ARRAY_MAX];
62   int i[ARRAY_MAX], cnt, pix_no;
63   int flags = { DoRed | DoGreen | DoBlue };
64   u_long plane[PLANE_MAX];
65   static char *name[ARRAY_MAX][PIX_MAX] = {
66     {"white", "orange", "lightblue", "forestgreen"},
67     {"red", "blue", "yellow", "black"}
68   };
69   static char *font[ARRAY_MAX] = { "a14, k14, kana14", "-*--18-*" };
70   static u_int shape[ARRAY_MAX] = { XC_gumby, XC_trek };
71   Visual *visual;
72   u_long valuemask;
73   XGCValues values;
74 
75   prstatus ("Creating X resources...");
76   if ((dpy = XOpenDisplay ("")) == NULL)
77     {
78       cls (stdisp);
79       cls (prdisp);
80       prprint ("Error : Can't open display\n\n");
81       prprint ("Check environment valuable \"DISPLAY\".\n\n");
82       freemwin ();
83     }
84   scr = XDefaultScreen (dpy);
85   rwin = RootWindow (dpy, scr);
86   visual = DefaultVisual (dpy, scr);
87   dcmap = DefaultColormap (dpy, scr);
88   if (XAllocColorCells (dpy, dcmap, False, plane, 0, pixel[cmflag], PIX_MAX))
89     {
90       for (pix_no = 0; pix_no < PIX_MAX; pix_no++)
91         {
92           XStoreNamedColor (dpy, dcmap, name[cmflag][pix_no], pixel[cmflag][pix_no], flags);
93         }
94     }
95   else
96     {
97       prprint ("I cannot allocate colors.\n");
98       prprint ("I will shutdown this program soon.\n\n");
99       freemwin ();
100     }
101   cmap[0] = XCreateColormap (dpy, rwin, visual, AllocNone);
102   cmap[1] = XCreateColormap (dpy, rwin, visual, AllocNone);
103   for (cnt = 0; cnt < ARRAY_MAX; cnt++)
104     {
105       if (XAllocColorCells (dpy, cmap[cnt], False, plane, 0, pixel[cnt], PIX_MAX))
106         {
107           for (pix_no = 0; pix_no < PIX_MAX; pix_no++)
108             {
109               XStoreNamedColor (dpy, cmap[cnt], name[cnt][pix_no], pixel[cnt][pix_no], flags);
110             }
111         }
112       else
113         {
114           prprint ("I cannot allocate colors.\n");
115           prprint ("I will shutdown this program soon.\n\n");
116           freemwin ();
117         }
118       fontset[cnt] = XCreateFontSet (dpy, font[cnt], &miss[cnt], &i[cnt], &def[cnt]);
119       cursor[cnt] = XCreateFontCursor (dpy, shape[cnt]);
120       pix[cnt] = XCreatePixmapFromBitmapData (dpy, rwin, bit_bits[cnt], BIT_WIDTH, BIT_HEIGHT, pixel[cmflag][1], pixel[cmflag][2], DefaultDepth (dpy, scr));
121     }
122   valuemask = GCFunction | GCForeground | GCBackground;
123   values.function = GXcopy;
124   values.foreground = pixel[cmflag][2];
125   values.background = pixel[cmflag][1];
126   gc = XCreateGC (dpy, rwin, valuemask, &values);
127   mktwin ();
128   mkmwin ();
129   mapwin ();
130   dstrwin ();
131   prstatus ("done.");
132 }
133 
134 
135 void
mktwin()136 mktwin ()                       /* MaKe Test WINdow */
137 {
138   XSizeHints hints;
139   XClassHint class_hints;
140   XWMHints wm_hints;
141   XTextProperty win_name, icon_name;
142 
143   win_name.value = (u_char *) "X11R5 XIM Test";
144   win_name.encoding = XA_STRING;
145   win_name.format = 8;
146   win_name.nitems = strlen (win_name.value);
147   icon_name.value = win_name.value;
148   icon_name.encoding = XA_STRING;
149   icon_name.format = 8;
150   icon_name.nitems = win_name.nitems;
151   hints.flags = (USPosition | USSize | PMinSize | PMaxSize | PResizeInc | PBaseSize | PWinGravity);
152   hints.x = W1_X;
153   hints.y = W1_Y;
154   hints.width = hints.min_width = hints.max_width = W1_WIDTH;
155   hints.height = hints.min_height = hints.min_height = W1_HEIGHT;
156   hints.width_inc = hints.height_inc = 0;
157   hints.base_width = W1_WIDTH;
158   hints.base_height = W1_HEIGHT;
159   hints.win_gravity = CenterGravity;
160   class_hints.res_name = NULL;
161   class_hints.res_class = NULL;
162   wm_hints.flags = InputHint;
163   wm_hints.input = True;
164 
165   window1.win = XCreateSimpleWindow (dpy, rwin, W1_X, W1_Y, W1_WIDTH, W1_HEIGHT, W_BORDER, pixel[cmflag][2], pixel[cmflag][1]);
166   window2.win = XCreateSimpleWindow (dpy, window1.win, W23_X, W2_Y, W2_WIDTH, W23_HEIGHT, W_BORDER, pixel[cmflag][2], pixel[cmflag][1]);
167   window3.win = XCreateSimpleWindow (dpy, window1.win, W23_X, W3_Y, W3_WIDTH, W23_HEIGHT, W_BORDER, pixel[cmflag][2], pixel[cmflag][1]);
168   ufocus = window3.win;
169   window1.name = XCreateSimpleWindow (dpy, window1.win, WIN_ITV, CALCY (W1_HEIGHT, NW_HEIGHT), NW_WIDTH, NW_HEIGHT, W_BORDER, pixel[cmflag][1], pixel[cmflag][1]);
170   window2.name = XCreateSimpleWindow (dpy, window2.win, WIN_ITV, CALCY (W23_HEIGHT, NW_HEIGHT), NW_WIDTH, NW_HEIGHT, W_BORDER, pixel[cmflag][1], pixel[cmflag][1]);
171   window3.name = XCreateSimpleWindow (dpy, window3.win, WIN_ITV, CALCY (W23_HEIGHT, NW_HEIGHT), NW_WIDTH, NW_HEIGHT, W_BORDER, pixel[cmflag][1], pixel[cmflag][1]);
172   XSetWMProperties (dpy, window1.win, &win_name, &icon_name, NULL, 0, &hints, &wm_hints, &class_hints);
173   XSelectInput (dpy, window1.win, ExposureMask | ButtonPressMask | KeyPressMask);
174   XSelectInput (dpy, window1.name, ExposureMask);
175   XSelectInput (dpy, window2.win, ExposureMask | ButtonPressMask | KeyPressMask);
176   XSelectInput (dpy, window2.name, ExposureMask);
177   XSelectInput (dpy, window3.win, ExposureMask | ButtonPressMask | KeyPressMask);
178   XSelectInput (dpy, window3.name, ExposureMask);
179   XSetWindowColormap (dpy, window1.win, cmap[0]);
180   XSetWindowColormap (dpy, window2.win, cmap[0]);
181   XSetWindowColormap (dpy, window3.win, cmap[0]);
182 }
183 
184 
185 void
mkmwin()186 mkmwin ()                       /* MaKe Menu WINdow */
187 {
188   int cnt;
189   u_int mroot_width;
190   u_int mroot_height;
191   XSizeHints hints;
192   XClassHint class_hints;
193   XWMHints wm_hints;
194   XTextProperty win_name, icon_name;
195 
196   for (cnt = 0; ftbl[cnt].mname != NULL; cnt++)
197     ;
198   mroot_width = MSUB_WIDTH * cnt;
199   mroot_height = MSUB_HEIGHT * 2;
200   mroot = XCreateSimpleWindow (dpy, rwin, MROOT_X, MROOT_Y, mroot_width, mroot_height, M_BORDER, pixel[cmflag][2], pixel[cmflag][1]);
201   XSelectInput (dpy, mroot, ExposureMask);
202   win_name.value = (u_char *) "X11R5 XIM Menu";
203   win_name.encoding = XA_STRING;
204   win_name.format = 8;
205   win_name.nitems = strlen (win_name.value);
206   icon_name.value = win_name.value;
207   icon_name.encoding = XA_STRING;
208   icon_name.format = 8;
209   icon_name.nitems = win_name.nitems;
210   hints.flags = (USPosition | USSize | PMinSize | PMaxSize | PResizeInc | PBaseSize | PWinGravity);
211   hints.x = MROOT_X;
212   hints.y = MROOT_Y;
213   hints.width = hints.min_width = hints.max_width = mroot_width;
214   hints.height = hints.min_height = hints.min_height = mroot_height;
215   hints.width_inc = hints.height_inc = 0;
216   hints.base_width = mroot_width;
217   hints.base_height = mroot_height;
218   hints.win_gravity = CenterGravity;
219   class_hints.res_name = NULL;
220   class_hints.res_class = NULL;
221   wm_hints.flags = InputHint;
222   wm_hints.input = True;
223 
224   XSetWMProperties (dpy, mroot, &win_name, &icon_name, NULL, 0, &hints, &wm_hints, &class_hints);
225   strflag = MB;
226   strmode = XCreateSimpleWindow (dpy, mroot, MSUB_WIDTH * 11, 0, MSUB_WIDTH, MSUB_HEIGHT, 0, pixel[cmflag][2], pixel[cmflag][1]);
227   XSelectInput (dpy, strmode, ExposureMask | ButtonPressMask);
228   for (cnt = 0; ftbl[cnt].mname != NULL; cnt++)
229     {
230       mwin[cnt] = XCreateSimpleWindow (dpy, mroot, MSUB_WIDTH * cnt, MSUB_Y, MSUB_WIDTH, MSUB_HEIGHT, M_BORDER, pixel[cmflag][2], pixel[cmflag][1]);
231       XSelectInput (dpy, mwin[cnt], ExposureMask | ButtonPressMask);
232     }
233   XSetWindowColormap (dpy, mroot, cmap[0]);
234 }
235 
236 void
mapwin()237 mapwin ()                       /* MAP WINdow */
238 {
239   XMapWindow (dpy, window1.win);
240   XMapSubwindows (dpy, window1.win);
241   XMapSubwindows (dpy, window2.win);
242   XMapSubwindows (dpy, window3.win);
243   XMapWindow (dpy, mroot);
244   XMapSubwindows (dpy, mroot);
245 }
246 
247 void
dstrwin()248 dstrwin ()                      /* Draw STRing on WINdow */
249 {
250   int cnt;
251   char *wfont = "-adobe-helvetica-bold-r-normal--*-120-*";
252 
253   XSetFont (dpy, gc, XLoadFont (dpy, wfont));
254   XDrawString (dpy, window1.name, gc, MSTR_XY, "Window1", strlen ("Window1"));
255   XDrawString (dpy, window2.name, gc, MSTR_XY, "Window2", strlen ("Window2"));
256   XDrawString (dpy, window3.name, gc, MSTR_XY, "Window3", strlen ("Window3"));
257   XDrawString (dpy, mroot, gc, MSTR_XY, "X-Window System X11R5 Xi18n Input Method Test <<XSetICValues Menu>>", strlen ("X-Window System X11R5 Xi18n Input Method Test <<XSetICValues Menu>>"));
258   if (strflag == MB)
259     {
260       XDrawString (dpy, strmode, gc, MSTR_XY, "Mode: MB", strlen ("Mode: MB"));
261     }
262   else if (strflag == WC)
263     {
264       XDrawString (dpy, strmode, gc, MSTR_XY, "Mode: WC", strlen ("Mode: WC"));
265     }
266   for (cnt = 0; ftbl[cnt].mname != NULL; cnt++)
267     {
268       XDrawString (dpy, *ftbl[cnt].mwin, gc, MSTR_XY, ftbl[cnt].mname, strlen (ftbl[cnt].mname));
269     }
270   XFlush (dpy);
271 }
272 
273 void
cwcolor(win,bg_pixel)274 cwcolor (win, bg_pixel)         /* Change Window COLOR */
275      Window win;
276      u_long bg_pixel;
277 {
278   XSetWindowBackground (dpy, win, bg_pixel);
279   XClearWindow (dpy, win);
280   dstrwin ();
281   XFlush (dpy);
282 }
283 
284 
285 void
freexres()286 freexres ()                     /* FREE X RESources */
287 {
288   int cnt = 0;
289 
290   XFreeGC (dpy, gc);
291   XDestroyWindow (dpy, window1.win);
292   XDestroyWindow (dpy, mroot);
293   XFreeColormap (dpy, dcmap);
294   for (cnt = 0; cnt < ARRAY_MAX; cnt++)
295     {
296       XFreeFontSet (dpy, fontset[cnt]);
297       XFreeColormap (dpy, cmap[cnt]);
298       XFreePixmap (dpy, pix[cnt]);
299       XFreeCursor (dpy, cursor[cnt]);
300     }
301   XCloseDisplay (dpy);
302 }
303