1 #   include	"appFrameConfig.h"
2 
3 #   include	<stdlib.h>
4 #   include	<stdio.h>
5 
6 #   include	"appFrame.h"
7 
8 #   include	<appDebugon.h>
9 
10 #   ifdef USE_MOTIF
11 
12 #   include	<X11/Xatom.h>
13 #   include	<Xm/MwmUtil.h>
14 #   include	<Xm/Protocols.h>
15 
16 # define LOG_X_REQUESTS 0
17 # if LOG_X_REQUESTS
18 #   include	<X11/Xproto.h>
19 # endif
20 
xReqName(int major)21 static const char * xReqName( int major )
22     {
23     static char scratch[20];
24 
25 #   if LOG_X_REQUESTS
26     switch( major )
27 	{
28 	case X_CreateWindow: return "X_CreateWindow";
29 	case X_ChangeWindowAttributes: return "X_ChangeWindowAttributes";
30 	case X_GetWindowAttributes: return "X_GetWindowAttributes";
31 	case X_DestroyWindow: return "X_DestroyWindow";
32 	case X_DestroySubwindows: return "X_DestroySubwindows";
33 	case X_ChangeSaveSet: return "X_ChangeSaveSet";
34 	case X_ReparentWindow: return "X_ReparentWindow";
35 	case X_MapWindow: return "X_MapWindow";
36 	case X_MapSubwindows: return "X_MapSubwindows";
37 	case X_UnmapWindow: return "X_UnmapWindow";
38 	case X_UnmapSubwindows: return "X_UnmapSubwindows";
39 	case X_ConfigureWindow: return "X_ConfigureWindow";
40 	case X_CirculateWindow: return "X_CirculateWindow";
41 	case X_GetGeometry: return "X_GetGeometry";
42 	case X_QueryTree: return "X_QueryTree";
43 	case X_InternAtom: return "X_InternAtom";
44 	case X_GetAtomName: return "X_GetAtomName";
45 	case X_ChangeProperty: return "X_ChangeProperty";
46 	case X_DeleteProperty: return "X_DeleteProperty";
47 	case X_GetProperty: return "X_GetProperty";
48 	case X_ListProperties: return "X_ListProperties";
49 	case X_SetSelectionOwner: return "X_SetSelectionOwner";
50 	case X_GetSelectionOwner: return "X_GetSelectionOwner";
51 	case X_ConvertSelection: return "X_ConvertSelection";
52 	case X_SendEvent: return "X_SendEvent";
53 	case X_GrabPointer: return "X_GrabPointer";
54 	case X_UngrabPointer: return "X_UngrabPointer";
55 	case X_GrabButton: return "X_GrabButton";
56 	case X_UngrabButton: return "X_UngrabButton";
57 	case X_ChangeActivePointerGrab: return "X_ChangeActivePointerGrab";
58 	case X_GrabKeyboard: return "X_GrabKeyboard";
59 	case X_UngrabKeyboard: return "X_UngrabKeyboard";
60 	case X_GrabKey: return "X_GrabKey";
61 	case X_UngrabKey: return "X_UngrabKey";
62 	case X_AllowEvents: return "X_AllowEvents";
63 	case X_GrabServer: return "X_GrabServer";
64 	case X_UngrabServer: return "X_UngrabServer";
65 	case X_QueryPointer: return "X_QueryPointer";
66 	case X_GetMotionEvents: return "X_GetMotionEvents";
67 	case X_TranslateCoords: return "X_TranslateCoords";
68 	case X_WarpPointer: return "X_WarpPointer";
69 	case X_SetInputFocus: return "X_SetInputFocus";
70 	case X_GetInputFocus: return "X_GetInputFocus";
71 	case X_QueryKeymap: return "X_QueryKeymap";
72 	case X_OpenFont: return "X_OpenFont";
73 	case X_CloseFont: return "X_CloseFont";
74 	case X_QueryFont: return "X_QueryFont";
75 	case X_QueryTextExtents: return "X_QueryTextExtents";
76 	case X_ListFonts: return "X_ListFonts";
77 	case X_ListFontsWithInfo: return "X_ListFontsWithInfo";
78 	case X_SetFontPath: return "X_SetFontPath";
79 	case X_GetFontPath: return "X_GetFontPath";
80 	case X_CreatePixmap: return "X_CreatePixmap";
81 	case X_FreePixmap: return "X_FreePixmap";
82 	case X_CreateGC: return "X_CreateGC";
83 	case X_ChangeGC: return "X_ChangeGC";
84 	case X_CopyGC: return "X_CopyGC";
85 	case X_SetDashes: return "X_SetDashes";
86 	case X_SetClipRectangles: return "X_SetClipRectangles";
87 	case X_FreeGC: return "X_FreeGC";
88 	case X_ClearArea: return "X_ClearArea";
89 	case X_CopyArea: return "X_CopyArea";
90 	case X_CopyPlane: return "X_CopyPlane";
91 	case X_PolyPoint: return "X_PolyPoint";
92 	case X_PolyLine: return "X_PolyLine";
93 	case X_PolySegment: return "X_PolySegment";
94 	case X_PolyRectangle: return "X_PolyRectangle";
95 	case X_PolyArc: return "X_PolyArc";
96 	case X_FillPoly: return "X_FillPoly";
97 	case X_PolyFillRectangle: return "X_PolyFillRectangle";
98 	case X_PolyFillArc: return "X_PolyFillArc";
99 	case X_PutImage: return "X_PutImage";
100 	case X_GetImage: return "X_GetImage";
101 	case X_PolyText8: return "X_PolyText8";
102 	case X_PolyText16: return "X_PolyText16";
103 	case X_ImageText8: return "X_ImageText8";
104 	case X_ImageText16: return "X_ImageText16";
105 	case X_CreateColormap: return "X_CreateColormap";
106 	case X_FreeColormap: return "X_FreeColormap";
107 	case X_CopyColormapAndFree: return "X_CopyColormapAndFree";
108 	case X_InstallColormap: return "X_InstallColormap";
109 	case X_UninstallColormap: return "X_UninstallColormap";
110 	case X_ListInstalledColormaps: return "X_ListInstalledColormaps";
111 	case X_AllocColor: return "X_AllocColor";
112 	case X_AllocNamedColor: return "X_AllocNamedColor";
113 	case X_AllocColorCells: return "X_AllocColorCells";
114 	case X_AllocColorPlanes: return "X_AllocColorPlanes";
115 	case X_FreeColors: return "X_FreeColors";
116 	case X_StoreColors: return "X_StoreColors";
117 	case X_StoreNamedColor: return "X_StoreNamedColor";
118 	case X_QueryColors: return "X_QueryColors";
119 	case X_LookupColor: return "X_LookupColor";
120 	case X_CreateCursor: return "X_CreateCursor";
121 	case X_CreateGlyphCursor: return "X_CreateGlyphCursor";
122 	case X_FreeCursor: return "X_FreeCursor";
123 	case X_RecolorCursor: return "X_RecolorCursor";
124 	case X_QueryBestSize: return "X_QueryBestSize";
125 	case X_QueryExtension: return "X_QueryExtension";
126 	case X_ListExtensions: return "X_ListExtensions";
127 	case X_ChangeKeyboardMapping: return "X_ChangeKeyboardMapping";
128 	case X_GetKeyboardMapping: return "X_GetKeyboardMapping";
129 	case X_ChangeKeyboardControl: return "X_ChangeKeyboardControl";
130 	case X_GetKeyboardControl: return "X_GetKeyboardControl";
131 	case X_Bell: return "X_Bell";
132 	case X_ChangePointerControl: return "X_ChangePointerControl";
133 	case X_GetPointerControl: return "X_GetPointerControl";
134 	case X_SetScreenSaver: return "X_SetScreenSaver";
135 	case X_GetScreenSaver: return "X_GetScreenSaver";
136 	case X_ChangeHosts: return "X_ChangeHosts";
137 	case X_ListHosts: return "X_ListHosts";
138 	case X_SetAccessControl: return "X_SetAccessControl";
139 	case X_SetCloseDownMode: return "X_SetCloseDownMode";
140 	case X_KillClient: return "X_KillClient";
141 	case X_RotateProperties: return "X_RotateProperties";
142 	case X_ForceScreenSaver: return "X_ForceScreenSaver";
143 	case X_SetPointerMapping: return "X_SetPointerMapping";
144 	case X_GetPointerMapping: return "X_GetPointerMapping";
145 	case X_SetModifierMapping: return "X_SetModifierMapping";
146 	case X_GetModifierMapping: return "X_GetModifierMapping";
147 	case X_NoOperation: return "X_NoOperation";
148 	}
149 #   endif	/* LOG_X_REQUESTS */
150 
151     sprintf( scratch, "%d", major );
152     return scratch;
153     }
154 
appXErrorHandler(Display * display,XErrorEvent * ev)155 static int appXErrorHandler( Display * display, XErrorEvent * ev )
156     {
157     char	text[250+1];
158     static int	count= 0;
159 
160     XGetErrorText( display, ev->error_code, text, sizeof(text)- 1 );
161 
162     appDebug( "%3d: %s -> %s\n", count, xReqName( ev->request_code ), text );
163 
164     if  ( count++ >= 100 )
165 	{ LDEB(count); abort(); }
166 
167     return 0;
168     }
169 
appGuiInitApplication(EditApplication * ea,int * pArgc,char *** pArgv)170 int appGuiInitApplication(	EditApplication *	ea,
171 				int *			pArgc,
172 				char ***		pArgv )
173     {
174     int			argc= *pArgc;
175     char **		argv= *pArgv;
176 
177     MwmHints		hints;
178 
179     Arg			al[20];
180     int			ac= 0;
181 
182 #   ifndef USE_X11_R5
183     char *		cloneCommand[2];
184 #   endif
185 
186     if  ( ! XSupportsLocale() )
187 	{ SLDEB(getenv("LANG"),XSupportsLocale()); }
188 
189     /*  1  */
190     hints.flags= MWM_HINTS_FUNCTIONS|MWM_HINTS_DECORATIONS;
191     hints.functions=	MWM_FUNC_MOVE		|
192 			MWM_FUNC_MINIMIZE	|
193 			MWM_FUNC_CLOSE		;
194     hints.decorations=	MWM_DECOR_BORDER	|
195 			MWM_DECOR_TITLE		|
196 			MWM_DECOR_MENU		|
197 			MWM_DECOR_MINIMIZE	;
198     ac= 0;
199     XtSetArg( al[ac], XmNinput,			True ); ac++;
200     XtSetArg( al[ac], XmNallowShellResize,	True ); ac++;
201     XtSetArg( al[ac], XmNuseAsyncGeometry,	True ); ac++;
202     XtSetArg( al[ac], XmNwaitForWm,		False ); ac++; /* LessTif BUG */
203     XtSetArg( al[ac], XmNwmTimeout,		0 ); ac++; /* LessTif BUG */
204     XtSetArg( al[ac], XmNmwmDecorations,	hints.decorations ); ac++;
205     XtSetArg( al[ac], XmNmwmFunctions,		hints.functions ); ac++;
206 
207 #   ifdef USE_X11_R5
208     /* applicationShellWidgetClass, */
209     ea->eaToplevel.atTopWidget= XtAppInitialize( &(ea->eaContext),
210 					ea->eaApplicationName,
211 					NULL, 0, &argc, argv, NULL, al, ac );
212 #   else
213     cloneCommand[0]= argv[0];
214     cloneCommand[1]= (char *)0;
215     XtSetArg( al[ac], XtNcloneCommand,		cloneCommand ); ac++;
216 
217     ea->eaToplevel.atTopWidget= XtOpenApplication( &(ea->eaContext),
218 					ea->eaApplicationName,
219 					NULL, 0, &argc, argv, NULL,
220 					sessionShellWidgetClass,
221 					al, ac );
222 #   endif
223 
224     /*  2  */
225     ea->eaScreenPixelsWide=
226 		    DisplayWidth( XtDisplay( ea->eaToplevel.atTopWidget ),
227 		    DefaultScreen( XtDisplay( ea->eaToplevel.atTopWidget ) ) );
228     ea->eaScreenPixelsHigh=
229 		    DisplayHeight( XtDisplay( ea->eaToplevel.atTopWidget ),
230 		    DefaultScreen( XtDisplay( ea->eaToplevel.atTopWidget ) ) );
231 
232     ea->eaInputMethod= XOpenIM( XtDisplay( ea->eaToplevel.atTopWidget ),
233 							NULL, NULL, NULL );
234     ea->eaDocumentCursor= (Cursor)0;
235 
236     /*  3  */
237     ea->eaCloseAtom= XmInternAtom( XtDisplay( ea->eaToplevel.atTopWidget ),
238 					(char *)"WM_DELETE_WINDOW", False );
239 
240     ea->eaArgc= argc;
241     ea->eaArgv= argv;
242 
243     appSetCloseCallback( ea->eaToplevel.atTopWidget, ea,
244 						appAppWmClose, (void *)ea );
245 
246     XtRealizeWidget( ea->eaToplevel.atTopWidget );
247 
248     *pArgc= argc;
249     *pArgv= argv;
250 
251     if  ( getenv( "CATCH_X_ERRORS" ) )
252 	{ XSetErrorHandler( appXErrorHandler );	}
253 
254     return 0;
255     }
256 
257 
258 #   endif /* USE_MOTIF */
259