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