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