trace.h revision 5104ee6e
1/* $XTermId: trace.h,v 1.97 2024/12/01 19:54:13 tom Exp $ */
2
3/*
4 * Copyright 1997-2022,2024 by Thomas E. Dickey
5 *
6 *                         All Rights Reserved
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the
10 * "Software"), to deal in the Software without restriction, including
11 * without limitation the rights to use, copy, modify, merge, publish,
12 * distribute, sublicense, and/or sell copies of the Software, and to
13 * permit persons to whom the Software is furnished to do so, subject to
14 * the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22 * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
23 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 *
27 * Except as contained in this notice, the name(s) of the above copyright
28 * holders shall not be used in advertising or otherwise to promote the
29 * sale, use or other dealings in this Software without prior written
30 * authorization.
31 */
32
33/*
34 * Common/useful definitions for XTERM application
35 */
36#ifndef	included_trace_h
37#define	included_trace_h
38/* *INDENT-OFF* */
39
40#include <xterm.h>
41
42#if OPT_TRACE
43
44#include <stdarg.h>
45
46extern	void	Trace ( const char *, ... ) GCC_PRINTFLIKE(1,2);
47extern	void	TraceVA ( const char *fmt, va_list ap );
48extern	void	TraceXError (Display *d, XErrorEvent *ev);
49
50#undef  if_TRACE
51#define if_TRACE(stmt)		stmt
52
53#undef  TRACE
54#define TRACE(p) Trace p
55
56#undef  TRACE_VA
57#define TRACE_VA(p) TraceVA p
58#define TRACE_X_ERR(d,e) TraceXError(d,e)
59
60extern	void	TraceClose (void);
61
62#undef  TRACE_CLOSE
63#define TRACE_CLOSE TraceClose
64
65#if OPT_TRACE > 1
66#define TRACE2(p) Trace p
67#endif
68
69#define TRACE_L "{{"
70#define TRACE_R "}}"
71
72extern	const char * visibleChars(const Char * /* buf */, size_t /* len */);
73extern	const char * visibleEventMode(EventMode);
74extern	const char * visibleIChars(const IChar * /* buf */, size_t /* len */);
75extern	const char * visibleUChar(unsigned);
76extern	const char * visibleDblChrset(unsigned /* chrset */);
77extern	const char * visibleEventType (int);
78extern	const char * visibleMappingMode (int);
79extern	const char * visibleNotifyDetail(int /* code */);
80extern	const char * visibleNotifyMode (int /* code */);
81extern	const char * visibleScsCode(DECNRCM_codes /* chrset */);
82extern	const char * visibleSelectionTarget(Display * /* d */, Atom /* a */);
83extern	const char * visibleTekparse (int);
84extern	const char * visibleVTparse (int);
85extern	const char * visibleXError (int /* code */);
86
87extern	const char * TraceAtomName(Display * /* d */, Atom /* a */);
88
89extern	void	TraceArgv(const char * /* tag */, char ** /* argv */);
90#undef  TRACE_ARGV
91#define	TRACE_ARGV(tag,argv) TraceArgv(tag,argv)
92
93extern	const	char *trace_who;
94#undef  TRACE_CHILD
95#define TRACE_CHILD int tracing_child = (trace_who = "child") != NULL; (void) tracing_child
96
97extern	void	TraceEvent(const char *, XEvent *, String *, const Cardinal *);
98#undef  TRACE_EVENT
99#define	TRACE_EVENT(t,e,s,n) TraceEvent(t, (XEvent *)e, s, n)
100
101#undef  TRACE_FALLBACK
102#if OPT_RENDERFONT && OPT_WIDE_CHARS
103extern	void	TraceFallback(XtermWidget, const char *, unsigned, int, XftFont *);
104#define TRACE_FALLBACK(w,t,c,n,f) TraceFallback(w, t, c, n, f)
105#else
106#define TRACE_FALLBACK(w,t,c,n,f) /*nothing*/
107#endif
108
109extern	void	TraceFocus(Widget, XEvent *);
110#undef  TRACE_FOCUS
111#define	TRACE_FOCUS(w,e) TraceFocus((Widget)w, (XEvent *)e)
112
113extern	void	TraceSizeHints(XSizeHints *);
114#undef  TRACE_HINTS
115#define	TRACE_HINTS(hints) TraceSizeHints(hints)
116
117extern	void	TraceIds(const char * /* fname */, int  /* lnum */);
118#undef  TRACE_IDS
119#define	TRACE_IDS TraceIds(__FILE__, __LINE__)
120
121extern	void	TraceTime(const char * /* fname */, int  /* lnum */);
122#undef  TRACE_TIME
123#define	TRACE_TIME TraceTime(__FILE__, __LINE__)
124
125extern	void	TraceOptions(OptionHelp * /* options */, XrmOptionDescRec * /* resources */, Cardinal  /* count */);
126#undef  TRACE_OPTS
127#define	TRACE_OPTS(opts,ress,lens) TraceOptions(opts,ress,lens)
128
129extern	void	TraceTranslations(const char *, Widget);
130#undef  TRACE_TRANS
131#define	TRACE_TRANS(name,w) TraceTranslations(name,w)
132
133extern	void	TraceWindowAttributes(XWindowAttributes *);
134#undef  TRACE_WIN_ATTRS
135#define	TRACE_WIN_ATTRS(a) TraceWindowAttributes(a)
136
137extern	void	TraceWMSizeHints(XtermWidget);
138#undef  TRACE_WM_HINTS
139#define	TRACE_WM_HINTS(w) TraceWMSizeHints(w)
140
141extern	void	TraceXtermResources(void);
142#undef  TRACE_XRES
143#define	TRACE_XRES() TraceXtermResources()
144
145extern	XtGeometryResult TraceResizeRequest(const char * /* fn */, int  /* ln */, Widget  /* w */, unsigned  /* reqwide */, unsigned  /* reqhigh */, Dimension * /* gotwide */, Dimension * /* gothigh */);
146#undef  REQ_RESIZE
147#define REQ_RESIZE(w, reqwide, reqhigh, gotwide, gothigh) \
148	TraceResizeRequest(__FILE__, __LINE__, w, \
149			   (reqwide), (reqhigh), \
150			   (gotwide), (gothigh))
151
152extern const char * ModifierName(unsigned /* modifier */);
153#define FMT_MODIFIER_NAMES "%s%s%s%s%s%s%s%s"
154#define ARG_MODIFIER_NAMES(state) \
155	   ModifierName(state & ShiftMask), \
156	   ModifierName(state & LockMask), \
157	   ModifierName(state & ControlMask), \
158	   ModifierName(state & Mod1Mask), \
159	   ModifierName(state & Mod2Mask), \
160	   ModifierName(state & Mod3Mask), \
161	   ModifierName(state & Mod4Mask), \
162	   ModifierName(state & Mod5Mask)
163
164#else
165
166#define REQ_RESIZE(w, reqwide, reqhigh, gotwide, gothigh) \
167	XtMakeResizeRequest((Widget) (w), \
168			    (Dimension) (reqwide), (Dimension) (reqhigh), \
169			    (gotwide), (gothigh))
170
171#define if_TRACE(stmt)		/*nothing*/
172#define TRACE(p)		/*nothing*/
173#define TRACE_CLOSE()		/*nothing*/
174#define TRACE_ARGV(tag,argv)	/*nothing*/
175#define TRACE_CHILD		/*nothing*/
176#define TRACE_EVENT(t,e,s,n)	/*nothing*/
177#define TRACE_FALLBACK(w,t,c,n,f) /*nothing*/
178#define TRACE_FOCUS(w,e)	/*nothing*/
179#define TRACE_HINTS(hints)	/*nothing*/
180#define TRACE_IDS		/*nothing*/
181#define TRACE_OPTS(opts,ress,lens) /*nothing*/
182#define TRACE_TRANS(name,w)	/*nothing*/
183#define TRACE_WIN_ATTRS(w)	/*nothing*/
184#define TRACE_WM_HINTS(w)	/*nothing*/
185#define TRACE_X_ERR(d,e)	/*nothing*/
186#define TRACE_XRES()		/*nothing*/
187
188#endif
189
190#ifndef TRACE2
191#define TRACE2(p)		/*nothing*/
192#endif
193
194extern void TraceScreen(XtermWidget /* xw */, int /* whichBuf */);
195
196/*
197 * The whole wnew->screen struct is zeroed in VTInitialize.  Use these macros
198 * where applicable for copying the pieces from the request widget into the
199 * new widget.  We do not have to use them for wnew->misc, but the associated
200 * traces are very useful for debugging.
201 */
202#if OPT_TRACE
203#define init_Bres(name) \
204	TRACE(("init " #name " = %s\n", \
205		BtoS(wnew->name = request->name)))
206#define init_Dres(name) \
207	TRACE(("init " #name " = %f\n", \
208		wnew->name = request->name))
209#define init_Dres2(name,i) \
210	TRACE(("init " #name "[%d] = %f\n", i, \
211		wnew->name[i] = request->name[i]))
212#define init_Ires(name) \
213	TRACE(("init " #name " = %d\n", \
214		wnew->name = request->name))
215#define init_Mres(name) \
216	TRACE(("init " #name " = %s\n", \
217		MtoS(wnew->name = request->name)))
218#define init_Sres(name) \
219	TRACE(("init " #name " = \"%s\"\n", \
220		(wnew->name = x_strtrim(request->name)) != NULL \
221			? wnew->name : "<null>"))
222#define init_Sres2(name,i) \
223	TRACE(("init " #name "[%d] = \"%s\"\n", i, \
224		(wnew->name(i) = x_strtrim(request->name(i))) != NULL \
225			? wnew->name(i) : "<null>"))
226#define init_Tres(offset) \
227	TRACE(("init screen.Tcolors[" #offset "] = %#lx\n", \
228		fill_Tres(wnew, request, offset)))
229#else
230#define init_Bres(name)    wnew->name = request->name
231#define init_Dres(name)    wnew->name = request->name
232#define init_Dres2(name,i) wnew->name[i] = request->name[i]
233#define init_Ires(name)    wnew->name = request->name
234#define init_Mres(name)    wnew->name = request->name
235#define init_Sres(name)    wnew->name = x_strtrim(request->name)
236#define init_Sres2(name,i) wnew->name(i) = x_strtrim(request->name(i))
237#define init_Tres(offset)  fill_Tres(wnew, request, offset)
238#endif
239
240/* *INDENT-ON* */
241
242#endif /* included_trace_h */
243