1 /* # skkinput (Simple Kana-Kanji Input)
2  * MyError.c --- Handle X Error Events
3  * This file is part of skkinput.
4  * Copyright (C) 1997
5  * Takashi SAKAMOTO (sakamoto@yajima.kuis.kyoto-u.ac.jp)
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with skkinput; see the file COPYING.  If not, write to
19  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21 #include <stdio.h>
22 #include <X11/Xlib.h>
23 #include <X11/Xatom.h>
24 #include <X11/IntrinsicP.h>
25 #include <X11/StringDefs.h>
26 
27 static int error_occured ;
28 static int error_type ;
29 static int ignore_flag ;
30 
31 /*
32  * ���顼��������ǽ�������ؿ���
33  */
myErrorHandler(Display * disp,XErrorEvent * xee)34 static int myErrorHandler
35 ( Display *disp, XErrorEvent *xee )
36 {
37   /* ���顼�����ȴ���Ф���*/
38   error_occured = True ;
39   error_type    = xee->error_code ;
40 
41   /* ̵�뤹����֤ʤ�ġ�*/
42   if( ignore_flag )
43     return False ;
44 
45   fprintf( stderr, "XError Event is received.\n" ) ;
46   fprintf( stderr, "serial        = %ld\n", xee->serial ) ;
47   fprintf( stderr, "error_code    = %d\n",  xee->error_code ) ;
48   fprintf( stderr, "request_code  = %d\n",  xee->request_code ) ;
49   fprintf( stderr, "minor_code    = %d\n",  xee->minor_code ) ;
50   fprintf( stderr, "resource_id   = %ld\n", xee->resourceid ) ;
51   fprintf( stderr, "any.window    = %lu\n", ( ( XEvent * )xee )->xany.window ) ;
52 
53 #if 1
54   while( 1 ) ;
55 #else
56   exit ( 1 ) ;
57 #endif
58 }
59 
initialize_myerrorhandler(void)60 void initialize_myerrorhandler( void )
61 {
62   error_type  = 0 ;
63   ignore_flag = False ;
64   XSetErrorHandler( myErrorHandler ) ;
65   return ;
66 }
67 
68 /*
69  * �ºݤ˥�����ɥ���¸�ߤ��뤫�ɤ������ǧ���뤿������Ѥ���ؿ���
70  */
IsWindowExist(Display * disp,Window win)71 int  IsWindowExist( Display *disp, Window win )
72 {
73   int original_value = ignore_flag ;
74   XWindowAttributes xwa ;
75   int ret ;
76 
77   ignore_flag   = True ;
78   ret = XGetWindowAttributes
79     ( disp, win, &xwa ) ;
80   ignore_flag   = original_value ;
81   return ( ret ) ;
82 }
83 
84 /*
85  * �ºݤ˥�����ɥ���¸�ߤ��뤫�ɤ������ǧ���뤿������Ѥ���ؿ���
86  */
isWindowExistIfExistsGetXWA(Display * disp,Window win,XWindowAttributes * xwa)87 int  isWindowExistIfExistsGetXWA
88 ( Display *disp, Window win, XWindowAttributes *xwa )
89 {
90   int original_value = ignore_flag ;
91   int ret ;
92   ignore_flag   = True ;
93   ret = XGetWindowAttributes
94     ( disp, win, xwa ) ;
95 #if 0
96   printf( "ret: %d, width: %d, height: %d\n", ret, xwa->width, xwa->height ) ;
97   printf( "all_event_masks = %ld, your_event_mask = %ld, map_state = %d, ",
98 	  xwa->all_event_masks, xwa->your_event_mask, xwa->map_state ) ;
99 #endif
100   ignore_flag   = original_value ;
101   return ( ret ) ;
102 }
103 
104 /*
105  * X ���顼���٥�Ȥ�ȯ���������ɤ���������å�����ؿ���
106  */
xerror_occured(void)107 int xerror_occured( void )
108 {
109   return error_occured ;
110 }
111 
112 /*
113  * ���顼��ȯ���������ɤ�����˺���ؿ���
114  */
xerror_clearflag(void)115 void xerror_clearflag( void )
116 {
117   error_occured = False ;
118   return ;
119 }
120 
121 /*
122  * X ���٥�ȥ��塼��ե�å��夹��ؿ���
123  */
XSafeSync(Display * disp,int flag)124 int XSafeSync( Display *disp, int flag )
125 {
126   int original_value = ignore_flag ;
127   ignore_flag = True ;
128   XSync( disp, flag ) ;
129   ignore_flag = original_value ;
130   return True ;
131 }
132 
133 /*
134  * X ���٥�ȥ��塼��ե�å��夹��ؿ���
135  */
XSafeFlush(Display * disp)136 int XSafeFlush( Display *disp )
137 {
138   int original_value = ignore_flag ;
139   ignore_flag = True ;
140   XFlush( disp ) ;
141   ignore_flag = original_value ;
142   return True ;
143 }
144 
145 /*
146  * X ���٥�ȥ��塼���ơ����˥ǥ����ѥå����٤����٥�Ȥ�����ؿ���
147  */
XtSafeAppNextEvent(XtAppContext app_context,XEvent * event_return)148 void XtSafeAppNextEvent
149 ( XtAppContext app_context, XEvent *event_return )
150 {
151   int original_value = ignore_flag ;
152   ignore_flag = True ;
153   XtAppNextEvent( app_context, event_return ) ;
154   ignore_flag = original_value ;
155   return ;
156 }
157 
XSafeSendEvent(Display * disp,Window win,Bool propagate,long event_mask,XEvent * event_send)158 Status XSafeSendEvent
159 ( Display *disp, Window win, Bool propagate,
160   long event_mask, XEvent *event_send )
161 {
162   int original_value = ignore_flag ;
163   Status ret ;
164   ignore_flag = True ;
165   ret = XSendEvent( disp, win, propagate, event_mask, event_send ) ;
166   ignore_flag = original_value ;
167   return ret ;
168 }
169 
XtSafeDispatchEvent(XEvent * xevent)170 int XtSafeDispatchEvent( XEvent *xevent )
171 {
172   int errorflag ;
173   int original_value = ignore_flag ;
174 
175   ignore_flag   = True ;
176   error_occured = False ;
177   XtDispatchEvent( xevent ) ;
178   errorflag     = error_occured ;
179   ignore_flag   = original_value ;
180   return ( !errorflag ) ;
181 }
182 
XSafeSelectInput(Display * disp,Window win,long event_mask)183 void XSafeSelectInput( Display *disp, Window win, long event_mask )
184 {
185   int original_value = ignore_flag ;
186   ignore_flag   = True ;
187   XSelectInput( disp, win, event_mask ) ;
188   ignore_flag   = original_value ;
189   return ;
190 }
191 
XSafeDestroyWindow(Display * disp,Window win)192 void XSafeDestroyWindow( Display *disp, Window win )
193 {
194   int original_value = ignore_flag ;
195   ignore_flag   = True ;
196   XDestroyWindow( disp, win ) ;
197   ignore_flag   = original_value ;
198   return ;
199 }
200 
XSafeGetWindowProperty(Display * disp,Window win,Atom property,long loffset,long llength,Bool delete,Atom req_type,Atom * actual_type_return,int * actual_format_return,unsigned long * nitems_return,unsigned long * bytes_after_return,unsigned char ** prop_return)201 void XSafeGetWindowProperty
202 ( Display *disp, Window win, Atom property, long loffset, long llength,
203   Bool delete, Atom req_type, Atom *actual_type_return,
204   int *actual_format_return,
205   unsigned long *nitems_return, unsigned long *bytes_after_return,
206   unsigned char **prop_return )
207 {
208   int original_value = ignore_flag ;
209   ignore_flag   = True ;
210   XGetWindowProperty
211     ( disp, win, property, loffset, llength, delete, req_type,
212       actual_type_return, actual_format_return,
213       nitems_return, bytes_after_return, prop_return ) ;
214   ignore_flag   = original_value ;
215   return ;
216 }
217 
XSafeChangeProperty(Display * disp,Window win,Atom property,Atom type,int format,int mode,unsigned char * data,int nelements)218 void XSafeChangeProperty
219 ( Display *disp, Window win, Atom property, Atom type, int format,
220   int mode, unsigned char *data, int nelements )
221 {
222   int original_value = ignore_flag ;
223   ignore_flag   = True ;
224   XChangeProperty
225     ( disp, win, property, type, format, mode, data, nelements ) ;
226   ignore_flag   = original_value ;
227   return ;
228 }
229 
XtSafeDestroyApplicationContext(XtAppContext app_context)230 void XtSafeDestroyApplicationContext( XtAppContext app_context )
231 {
232   int original_value = ignore_flag ;
233   ignore_flag   = True ;
234   XtDestroyApplicationContext( app_context ) ;
235   ignore_flag   = original_value ;
236   return ;
237 }
238