1cacd992dSmrg/* $XFree86: xc/programs/xvidtune/xvidtune.c,v 3.35tsi Exp $ */
2cacd992dSmrg
3cacd992dSmrg/*
4cacd992dSmrg
5cacd992dSmrgCopyright (c) 1995  Kaleb S. KEITHLEY
6cacd992dSmrg
7cacd992dSmrgPermission is hereby granted, free of charge, to any person obtaining
8cacd992dSmrga copy of this software and associated documentation files (the
9cacd992dSmrg"Software"), to deal in the Software without restriction, including
10cacd992dSmrgwithout limitation the rights to use, copy, modify, merge, publish,
11cacd992dSmrgdistribute, sublicense, and/or sell copies of the Software, and to
12cacd992dSmrgpermit persons to whom the Software is furnished to do so, subject to
13cacd992dSmrgthe following conditions:
14cacd992dSmrg
15cacd992dSmrgThe above copyright notice and this permission notice shall be
16cacd992dSmrgincluded in all copies or substantial portions of the Software.
17cacd992dSmrg
18cacd992dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19cacd992dSmrgEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20cacd992dSmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21cacd992dSmrgIN NO EVENT SHALL Kaleb S. KEITHLEY BE LIABLE FOR ANY CLAIM, DAMAGES
22cacd992dSmrgOR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23cacd992dSmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24cacd992dSmrgOTHER DEALINGS IN THE SOFTWARE.
25cacd992dSmrg
26cacd992dSmrgExcept as contained in this notice, the name of Kaleb S. KEITHLEY
27cacd992dSmrgshall not be used in advertising or otherwise to promote the sale, use
28cacd992dSmrgor other dealings in this Software without prior written authorization
29cacd992dSmrgfrom Kaleb S. KEITHLEY.
30cacd992dSmrg
31cacd992dSmrg*/
32cacd992dSmrg
33cacd992dSmrg#include <X11/Intrinsic.h>
34cacd992dSmrg#include <X11/Shell.h>
35cacd992dSmrg#include <X11/StringDefs.h>
36cacd992dSmrg#include <X11/Xatom.h>
37cacd992dSmrg#include <X11/Xaw/Form.h>
38cacd992dSmrg#include <X11/Xaw/Scrollbar.h>
39cacd992dSmrg#include <X11/Xaw/Label.h>
40cacd992dSmrg#include <X11/Xaw/Command.h>
41cacd992dSmrg#include <X11/Xaw/AsciiText.h>
42cacd992dSmrg#include <X11/Xaw/Box.h>
43cacd992dSmrg#include <X11/Xaw/Toggle.h>
44cacd992dSmrg#include <X11/Xmu/StdSel.h>
45cacd992dSmrg#include <X11/Xmd.h>
46cacd992dSmrg#include <X11/extensions/xf86vmode.h>
47cacd992dSmrg#include <ctype.h>
48cacd992dSmrg#include <stdio.h>
49cacd992dSmrg#include <stdlib.h>
50cacd992dSmrg#include <signal.h>
51cacd992dSmrg
5214ddf674Smrgstatic int MajorVersion, MinorVersion;
5314ddf674Smrgstatic int EventBase, ErrorBase;
5414ddf674Smrgstatic int dot_clock, mode_flags;
5514ddf674Smrgstatic unsigned long TestTimeout=5000;  /* Default test timeout */
5614ddf674Smrgstatic XtSignalId sigId;
57cacd992dSmrg
58cacd992dSmrg/* Minimum extension version required */
59cacd992dSmrg#define MINMAJOR 0
60cacd992dSmrg#define MINMINOR 5
61cacd992dSmrg
62cacd992dSmrg/* Mode flags -- ignore flags not in V_FLAG_MASK */
63cacd992dSmrg#define V_FLAG_MASK	0x1FF;
64cacd992dSmrg#define V_PHSYNC	0x001
65cacd992dSmrg#define V_NHSYNC	0x002
66cacd992dSmrg#define V_PVSYNC	0x004
67cacd992dSmrg#define V_NVSYNC	0x008
68cacd992dSmrg#define V_INTERLACE	0x010
69cacd992dSmrg#define V_DBLSCAN	0x020
70cacd992dSmrg#define V_CSYNC		0x040
71cacd992dSmrg#define V_PCSYNC	0x080
72cacd992dSmrg#define V_NCSYNC	0x100
73cacd992dSmrg
74cacd992dSmrgtypedef enum { HDisplay, HSyncStart, HSyncEnd, HTotal,
75cacd992dSmrg	VDisplay, VSyncStart, VSyncEnd, VTotal, Flags,
76cacd992dSmrg	InvertVclk, BlankDelay1, BlankDelay2, EarlySc,
77cacd992dSmrg	PixelClock, HSyncRate, VSyncRate, fields_num } fields;
78cacd992dSmrg
79cacd992dSmrgtypedef struct {
80cacd992dSmrg    fields	me;
81cacd992dSmrg    fields	use;
82cacd992dSmrg    int		val;
83cacd992dSmrg    int		lastpercent;
84cacd992dSmrg    int		range;
85cacd992dSmrg    Widget	textwidget;
86cacd992dSmrg    Widget	scrollwidget;
87cacd992dSmrg} ScrollData;
88cacd992dSmrg
89cacd992dSmrgstatic struct _AppResources {
90cacd992dSmrg    ScrollData	field[fields_num];
91cacd992dSmrg    Bool	ad_installed;
92cacd992dSmrg    int		orig[fields_num];
93cacd992dSmrg    int		old[fields_num];
94cacd992dSmrg} AppRes = {
95cacd992dSmrg    {
96cacd992dSmrg	{ HDisplay, },
97cacd992dSmrg	{ HSyncStart, HDisplay, },
98cacd992dSmrg	{ HSyncEnd, HDisplay, },
99cacd992dSmrg	{ HTotal, HDisplay, },
100cacd992dSmrg	{ VDisplay, },
101cacd992dSmrg	{ VSyncStart, VDisplay, },
102cacd992dSmrg	{ VSyncEnd, VDisplay, },
103cacd992dSmrg	{ VTotal, VDisplay, },
104cacd992dSmrg	{ Flags, },
105cacd992dSmrg	{ InvertVclk, },
106cacd992dSmrg	{ BlankDelay1, },
107cacd992dSmrg	{ BlankDelay2, },
108cacd992dSmrg	{ EarlySc, },
109cacd992dSmrg	{ PixelClock, },
110cacd992dSmrg	{ HSyncRate, },
111cacd992dSmrg	{ VSyncRate, },
112cacd992dSmrg    },
113cacd992dSmrg};
114cacd992dSmrg
115cacd992dSmrgstatic XtResource Resources[] = {
116cacd992dSmrg    { "adInstalled", "AdInstalled", XtRBool, sizeof(Bool),
117cacd992dSmrg	XtOffsetOf(struct _AppResources, ad_installed),
118cacd992dSmrg	XtRImmediate, (XtPointer)FALSE },
119cacd992dSmrg    { "hSyncStartRange", "SyncStartRange", XtRInt, sizeof(int),
120cacd992dSmrg	XtOffsetOf(struct _AppResources, field[HSyncStart].range),
121cacd992dSmrg	XtRImmediate, (XtPointer)200 },
122cacd992dSmrg    { "hSyncEndRange", "SyncEndRange", XtRInt, sizeof(int),
123cacd992dSmrg	XtOffsetOf(struct _AppResources, field[HSyncEnd].range),
124cacd992dSmrg	XtRImmediate, (XtPointer)400 },
125cacd992dSmrg    { "hTotalRange", "TotalRange", XtRInt, sizeof(int),
126cacd992dSmrg	XtOffsetOf(struct _AppResources, field[HTotal].range),
127cacd992dSmrg	XtRImmediate, (XtPointer)400 },
128cacd992dSmrg    { "vSyncStartRange", "SyncStartRange", XtRInt, sizeof(int),
129cacd992dSmrg	XtOffsetOf(struct _AppResources, field[VSyncStart].range),
130cacd992dSmrg	XtRImmediate, (XtPointer)20 },
131cacd992dSmrg    { "vSyncEndRange", "SyncEndRange", XtRInt, sizeof(int),
132cacd992dSmrg	XtOffsetOf(struct _AppResources, field[VSyncEnd].range),
133cacd992dSmrg	XtRImmediate, (XtPointer)40 },
134cacd992dSmrg    { "vTotalRange", "TotalRange", XtRInt, sizeof(int),
135cacd992dSmrg	XtOffsetOf(struct _AppResources, field[VTotal].range),
136cacd992dSmrg	XtRImmediate, (XtPointer)80 },
137cacd992dSmrg};
138cacd992dSmrg
139cacd992dSmrgstatic XtTranslations trans;
140cacd992dSmrg
141cacd992dSmrgstatic Atom wm_delete_window;
142cacd992dSmrgstatic Widget invalid_mode_popup;
143cacd992dSmrgstatic Widget testing_popup;
144cacd992dSmrgstatic Widget Top;
145cacd992dSmrgstatic Widget auto_apply_toggle;
146cacd992dSmrg
147cacd992dSmrgstatic Bool S3Specials = False;
148cacd992dSmrgstatic char modebuf[160];
149cacd992dSmrg
150cacd992dSmrgstatic void UpdateSyncRates(Bool dolabels);
151cacd992dSmrg
152cacd992dSmrgstatic void
153cacd992dSmrgCleanUp(Display *dpy)
154cacd992dSmrg{
155cacd992dSmrg    /* Make sure mode switching is not locked out at exit */
156cacd992dSmrg    XF86VidModeLockModeSwitch(dpy, DefaultScreen(dpy), FALSE);
157cacd992dSmrg    XFlush(dpy);
158cacd992dSmrg}
159cacd992dSmrg
160cacd992dSmrgstatic void
161cacd992dSmrgCatchSig(int signal)
162cacd992dSmrg{
163cacd992dSmrg    XtNoticeSignal(sigId);
164cacd992dSmrg}
165cacd992dSmrg
166cacd992dSmrgstatic void
167cacd992dSmrgCatchXtSig(XtPointer closure, XtSignalId *id)
168cacd992dSmrg{
169cacd992dSmrg    CleanUp(XtDisplay(Top));
170cacd992dSmrg    exit(3);
171cacd992dSmrg}
172cacd992dSmrg
173cacd992dSmrgstatic Bool
174cacd992dSmrgGetModeLine (Display* dpy, int scrn)
175cacd992dSmrg{
176cacd992dSmrg    XF86VidModeModeLine mode_line;
177cacd992dSmrg    fields i;
178cacd992dSmrg
179cacd992dSmrg    if (!XF86VidModeGetModeLine (dpy, scrn, &dot_clock, &mode_line))
180cacd992dSmrg	return FALSE;
181cacd992dSmrg
182cacd992dSmrg    AppRes.field[HDisplay].val = mode_line.hdisplay;
183cacd992dSmrg    AppRes.field[HSyncStart].val = mode_line.hsyncstart;
184cacd992dSmrg    AppRes.field[HSyncEnd].val = mode_line.hsyncend;
185cacd992dSmrg    AppRes.field[HTotal].val = mode_line.htotal;
186cacd992dSmrg    AppRes.field[VDisplay].val = mode_line.vdisplay;
187cacd992dSmrg    AppRes.field[VSyncStart].val = mode_line.vsyncstart;
188cacd992dSmrg    AppRes.field[VSyncEnd].val = mode_line.vsyncend;
189cacd992dSmrg    AppRes.field[VTotal].val = mode_line.vtotal;
190cacd992dSmrg    mode_flags = mode_line.flags;
191cacd992dSmrg    AppRes.field[Flags].val = mode_flags & V_FLAG_MASK;
192cacd992dSmrg    AppRes.field[PixelClock].val = dot_clock;
193cacd992dSmrg    UpdateSyncRates(FALSE);
194cacd992dSmrg    if (mode_line.privsize && mode_line.private) {
195cacd992dSmrg	S3Specials = True;
196cacd992dSmrg	AppRes.field[InvertVclk].val = mode_line.private[1];
197cacd992dSmrg	AppRes.field[BlankDelay1].val = mode_line.private[2] & 7;
198cacd992dSmrg	AppRes.field[BlankDelay2].val = (mode_line.private[2] >> 4) & 7;
199cacd992dSmrg	AppRes.field[EarlySc].val = mode_line.private[3];
200cacd992dSmrg    }
201cacd992dSmrg
202cacd992dSmrg    for (i = HDisplay; i < fields_num; i++)
203cacd992dSmrg	AppRes.orig[i] = AppRes.field[i].val;
204cacd992dSmrg    return TRUE;
205cacd992dSmrg}
206cacd992dSmrg
207cacd992dSmrgstatic Bool
208cacd992dSmrgGetMonitor (Display* dpy, int scrn)
209cacd992dSmrg{
210cacd992dSmrg    XF86VidModeMonitor monitor;
211cacd992dSmrg    int i;
212cacd992dSmrg
213cacd992dSmrg    if (!XF86VidModeGetMonitor (dpy, scrn, &monitor))
214cacd992dSmrg	return FALSE;
215cacd992dSmrg
216cacd992dSmrg    printf("Vendor: %s, Model: %s\n", monitor.vendor, monitor.model);
217cacd992dSmrg    printf("Num hsync: %d, Num vsync: %d\n", monitor.nhsync, monitor.nvsync);
218cacd992dSmrg    for (i = 0; i < monitor.nhsync; i++) {
219cacd992dSmrg	printf("hsync range %d: %6.2f - %6.2f\n", i, monitor.hsync[i].lo,
220cacd992dSmrg	       monitor.hsync[i].hi);
221cacd992dSmrg    }
222cacd992dSmrg    for (i = 0; i < monitor.nvsync; i++) {
223cacd992dSmrg	printf("vsync range %d: %6.2f - %6.2f\n", i, monitor.vsync[i].lo,
224cacd992dSmrg	       monitor.vsync[i].hi);
225cacd992dSmrg    }
226cacd992dSmrg    return TRUE;
227cacd992dSmrg}
228cacd992dSmrg
229cacd992dSmrgstatic Bool
230cacd992dSmrgModeSettable(void)
231cacd992dSmrg{
232cacd992dSmrg    if (AppRes.field[HTotal].val == 0 || AppRes.field[VTotal].val == 0)
233cacd992dSmrg	return FALSE;
234cacd992dSmrg    return TRUE;
235cacd992dSmrg}
236cacd992dSmrg
237cacd992dSmrgstatic int hitError = 0;
238cacd992dSmrgstatic int (*xtErrorfunc)(Display *, XErrorEvent *);
239cacd992dSmrg
240cacd992dSmrgstatic int
241cacd992dSmrgvidmodeError(Display *dis, XErrorEvent *err)
242cacd992dSmrg{
243cacd992dSmrg  if ((err->error_code >= ErrorBase &&
244cacd992dSmrg      err->error_code < ErrorBase + XF86VidModeNumberErrors) ||
245cacd992dSmrg      err->error_code == BadValue) {
246cacd992dSmrg     hitError=1;
247cacd992dSmrg  } else {
248cacd992dSmrg     CleanUp(dis);
249cacd992dSmrg     if (xtErrorfunc)
250cacd992dSmrg	(*xtErrorfunc)(dis, err);
251cacd992dSmrg  }
252cacd992dSmrg  return 0; /* ignored */
253cacd992dSmrg}
254cacd992dSmrg
255cacd992dSmrgstatic void
256cacd992dSmrgSetScrollbars (void)
257cacd992dSmrg{
258cacd992dSmrg    fields i;
259cacd992dSmrg
260cacd992dSmrg    for (i = HDisplay; i <= Flags; i++) {
261cacd992dSmrg
262cacd992dSmrg	ScrollData* sdp = &AppRes.field[i];
263cacd992dSmrg
264cacd992dSmrg	if (sdp->scrollwidget != (Widget) NULL) {
265cacd992dSmrg	    int base;
266cacd992dSmrg	    float percent;
267cacd992dSmrg
268cacd992dSmrg	    base = AppRes.field[sdp->use].val;
269cacd992dSmrg	    percent = ((float)(sdp->val - base)) / ((float)sdp->range);
270cacd992dSmrg	    XawScrollbarSetThumb (sdp->scrollwidget, percent, 0.0);
271cacd992dSmrg	}
272cacd992dSmrg    }
273cacd992dSmrg}
274cacd992dSmrg
275cacd992dSmrgstatic void
276cacd992dSmrgQuitCB (Widget w, XtPointer client, XtPointer call)
277cacd992dSmrg{
278cacd992dSmrg    CleanUp(XtDisplay(w));
279cacd992dSmrg#if XtSpecificationRelease < 6
280cacd992dSmrg    exit (0);
281cacd992dSmrg#else
282cacd992dSmrg    XtAppSetExitFlag (XtWidgetToApplicationContext (w));
283cacd992dSmrg#endif
284cacd992dSmrg}
285cacd992dSmrg
286cacd992dSmrgstatic void
287cacd992dSmrgpopdownInvalid(Widget w, XtPointer client, XtPointer call)
288cacd992dSmrg{
289cacd992dSmrg   XtPopdown((Widget)client);
290cacd992dSmrg}
291cacd992dSmrg
292cacd992dSmrgstatic void
293cacd992dSmrgApplyCB (Widget w, XtPointer client, XtPointer call)
294cacd992dSmrg{
295cacd992dSmrg    XF86VidModeModeLine mode_line;
296cacd992dSmrg    INT32 S3private[4];
297cacd992dSmrg    unsigned int i;
298cacd992dSmrg    char* string;
299cacd992dSmrg    Boolean state;
300cacd992dSmrg
301cacd992dSmrg    mode_line.hdisplay = AppRes.field[HDisplay].val;
302cacd992dSmrg    mode_line.hsyncstart = AppRes.field[HSyncStart].val;
303cacd992dSmrg    mode_line.hsyncend = AppRes.field[HSyncEnd].val;
304cacd992dSmrg    mode_line.htotal = AppRes.field[HTotal].val;
305cacd992dSmrg    mode_line.vdisplay = AppRes.field[VDisplay].val;
306cacd992dSmrg    mode_line.vsyncstart = AppRes.field[VSyncStart].val;
307cacd992dSmrg    mode_line.vsyncend = AppRes.field[VSyncEnd].val;
308cacd992dSmrg    mode_line.vtotal = AppRes.field[VTotal].val;
309cacd992dSmrg    /* Don't read flags from widget */
310cacd992dSmrg#if 0
311cacd992dSmrg    XtVaGetValues (AppRes.field[Flags].textwidget,
312cacd992dSmrg		XtNstring, &string, NULL);
313cacd992dSmrg    (void) sscanf (string, "%x", &i);
314cacd992dSmrg#endif
315cacd992dSmrg    mode_line.flags = mode_flags;
316cacd992dSmrg    if (S3Specials) {
317cacd992dSmrg	mode_line.privsize = 4;
318cacd992dSmrg	mode_line.private = S3private;
319cacd992dSmrg	mode_line.private[0] = (1 << 1) | (1 << 2) | (1 << 3);
320cacd992dSmrg	XtVaGetValues(AppRes.field[InvertVclk].textwidget,
321cacd992dSmrg			XtNstate, &state, NULL);
322cacd992dSmrg	AppRes.field[InvertVclk].val = state ? 1 : 0;
323cacd992dSmrg	mode_line.private[1] = AppRes.field[InvertVclk].val;
324cacd992dSmrg	XtVaGetValues (AppRes.field[BlankDelay1].textwidget,
325cacd992dSmrg			XtNstring, &string, NULL);
326cacd992dSmrg	(void) sscanf (string, "%x", &i);
327cacd992dSmrg	AppRes.field[BlankDelay1].val = i;
328cacd992dSmrg	mode_line.private[2] = AppRes.field[BlankDelay1].val;
329cacd992dSmrg	XtVaGetValues (AppRes.field[BlankDelay2].textwidget,
330cacd992dSmrg			XtNstring, &string, NULL);
331cacd992dSmrg	(void) sscanf (string, "%x", &i);
332cacd992dSmrg	AppRes.field[BlankDelay2].val = i;
333cacd992dSmrg	mode_line.private[2] |= AppRes.field[BlankDelay2].val << 4;
334cacd992dSmrg	XtVaGetValues(AppRes.field[EarlySc].textwidget,
335cacd992dSmrg			XtNstate, &state, NULL);
336cacd992dSmrg	AppRes.field[EarlySc].val = state ? 1 : 0;
337cacd992dSmrg	mode_line.private[3] = AppRes.field[EarlySc].val;
338cacd992dSmrg    } else
339cacd992dSmrg	mode_line.privsize = 0;
340cacd992dSmrg
341cacd992dSmrg   hitError = 0;
342cacd992dSmrg
343cacd992dSmrg   XF86VidModeModModeLine (XtDisplay (w), DefaultScreen (XtDisplay (w)),
344cacd992dSmrg		&mode_line);
345cacd992dSmrg   XSync(XtDisplay (w), False); /* process errors  */
346cacd992dSmrg   if (hitError) {
347cacd992dSmrg       XBell(XtDisplay (w), 80);
348cacd992dSmrg       XtPopup(invalid_mode_popup, XtGrabExclusive /*XtGrabNone*/);
349cacd992dSmrg   }
350cacd992dSmrg}
351cacd992dSmrg
352cacd992dSmrg
353cacd992dSmrgstatic void
354cacd992dSmrgSetLabel(fields i)
355cacd992dSmrg{
356cacd992dSmrg   ScrollData* sdp = &AppRes.field[i];
357cacd992dSmrg
358cacd992dSmrg   if (sdp->textwidget != (Widget) NULL) {
359cacd992dSmrg      char buf[10];
360cacd992dSmrg      Boolean state;
361cacd992dSmrg
362cacd992dSmrg      /*
363cacd992dSmrg       * Disable AutoApply so that the apply doesn't happen more than
364cacd992dSmrg       * once as a consequence of callbacks being called because of the
365cacd992dSmrg       * XtSetValues calls
366cacd992dSmrg       */
367cacd992dSmrg
368cacd992dSmrg      XtVaGetValues(auto_apply_toggle, XtNstate, &state, NULL);
369cacd992dSmrg      if (state)
370cacd992dSmrg	 XtVaSetValues(auto_apply_toggle, XtNstate, 0, NULL);
371cacd992dSmrg
372cacd992dSmrg      if (i == Flags)
37314ddf674Smrg	 (void) snprintf (buf, sizeof(buf), "%04x", sdp->val);
374cacd992dSmrg      else if (i >= PixelClock && i <= VSyncRate)
37514ddf674Smrg	 (void) snprintf (buf, sizeof(buf), "%6.2f", (float)sdp->val / 1000.0);
376cacd992dSmrg      else if (i == BlankDelay1 || i == BlankDelay2) {
37714ddf674Smrg	 (void) snprintf (buf, sizeof(buf), "%d", sdp->val);
378cacd992dSmrg      } else
37914ddf674Smrg	 (void) snprintf (buf, sizeof(buf), "%5d", sdp->val);
380cacd992dSmrg
381cacd992dSmrg      sdp->lastpercent = -1;
382cacd992dSmrg      if (i == Flags) {
383cacd992dSmrg	 XawTextBlock text;
384cacd992dSmrg
385cacd992dSmrg	 text.firstPos = 0;
386cacd992dSmrg	 text.length = 4;
387cacd992dSmrg	 text.ptr = buf;
388cacd992dSmrg	 text.format = XawFmt8Bit;
389cacd992dSmrg	 XawTextReplace (sdp->textwidget, 0, 4, &text);
390cacd992dSmrg      } else if (i == BlankDelay1 || i == BlankDelay2) {
391cacd992dSmrg	 XawTextBlock text;
392cacd992dSmrg
393cacd992dSmrg	 text.firstPos = 0;
394cacd992dSmrg	 text.length = 1;
395cacd992dSmrg	 text.ptr = buf;
396cacd992dSmrg	 XawTextReplace (sdp->textwidget, 0, 1, &text);
397cacd992dSmrg      } else if (i == InvertVclk || i == EarlySc) {
398cacd992dSmrg	XtVaSetValues (sdp->textwidget, XtNstate, sdp->val, NULL);
399cacd992dSmrg      } else
400cacd992dSmrg	XtVaSetValues (sdp->textwidget, XtNlabel, buf, NULL);
401cacd992dSmrg
402cacd992dSmrg      if (state)
403cacd992dSmrg	 XtVaSetValues(auto_apply_toggle, XtNstate, 1, NULL);
404cacd992dSmrg   }
405cacd992dSmrg
406cacd992dSmrg}
407cacd992dSmrg
408cacd992dSmrgstatic void
409cacd992dSmrgUpdateSyncRates(Bool dolabels)
410cacd992dSmrg{
411cacd992dSmrg    if (!ModeSettable())
412cacd992dSmrg	return;
413cacd992dSmrg
414cacd992dSmrg    AppRes.field[HSyncRate].val = AppRes.field[PixelClock].val * 1000 /
415cacd992dSmrg				  AppRes.field[HTotal].val;
416cacd992dSmrg    AppRes.field[VSyncRate].val = AppRes.field[HSyncRate].val * 1000 /
417cacd992dSmrg				  AppRes.field[VTotal].val;
418cacd992dSmrg    if (mode_flags & V_INTERLACE)
419cacd992dSmrg	AppRes.field[VSyncRate].val *= 2;
420cacd992dSmrg    else if (mode_flags & V_DBLSCAN)
421cacd992dSmrg	AppRes.field[VSyncRate].val /= 2;
422cacd992dSmrg    if (dolabels) {
423cacd992dSmrg	SetLabel(HSyncRate);
424cacd992dSmrg	SetLabel(VSyncRate);
425cacd992dSmrg    }
426cacd992dSmrg}
427cacd992dSmrg
428cacd992dSmrgstatic void
429cacd992dSmrgRestoreCB (Widget w, XtPointer client, XtPointer call)
430cacd992dSmrg{
431cacd992dSmrg    fields i;
432cacd992dSmrg    Boolean state;
433cacd992dSmrg
434cacd992dSmrg    for (i = HDisplay; i < fields_num; i++) {
435cacd992dSmrg	AppRes.field[i].val = AppRes.orig[i];
436cacd992dSmrg	SetLabel(i);
437cacd992dSmrg    }
438cacd992dSmrg    SetScrollbars ();
439cacd992dSmrg    XtVaGetValues(auto_apply_toggle, XtNstate, &state, NULL);
440cacd992dSmrg    if (state)
441cacd992dSmrg	 ApplyCB (w, client, call);
442cacd992dSmrg}
443cacd992dSmrg
444cacd992dSmrg
445cacd992dSmrgstatic void
446cacd992dSmrgApplyIfAutoCB (Widget w, XtPointer client, XtPointer call)
447cacd992dSmrg{
448cacd992dSmrg   Boolean state;
449cacd992dSmrg
450cacd992dSmrg   XtVaGetValues(auto_apply_toggle, XtNstate, &state, NULL);
451cacd992dSmrg   if (state)
452cacd992dSmrg       ApplyCB (w, client, call);
453cacd992dSmrg}
454cacd992dSmrg
455cacd992dSmrg
456cacd992dSmrgstatic void
457cacd992dSmrgFetchCB (Widget w, XtPointer client, XtPointer call)
458cacd992dSmrg{
459cacd992dSmrg    fields i;
460cacd992dSmrg    (void) GetModeLine(XtDisplay (w), DefaultScreen (XtDisplay (w)));
461cacd992dSmrg    SetScrollbars ();
462cacd992dSmrg    for (i = HDisplay; i < fields_num; i++) {
463cacd992dSmrg        SetLabel(i);
464cacd992dSmrg    }
465cacd992dSmrg}
466cacd992dSmrg
467cacd992dSmrgstatic XtIntervalId TOid;
468cacd992dSmrg
469cacd992dSmrgstatic void
470cacd992dSmrgTestTO (XtPointer client, XtIntervalId* id)
471cacd992dSmrg{
472cacd992dSmrg    fields i;
473cacd992dSmrg    for (i = HDisplay; i < fields_num; i++)
474cacd992dSmrg	AppRes.field[i].val = AppRes.orig[i];
475cacd992dSmrg
476cacd992dSmrg    ApplyCB ((Widget) client, NULL, NULL);
477cacd992dSmrg
478cacd992dSmrg    for (i = HDisplay; i < fields_num; i++)
479cacd992dSmrg	AppRes.field[i].val = AppRes.old[i];
480cacd992dSmrg    SetScrollbars ();
481cacd992dSmrg
482cacd992dSmrg    XtPopdown(testing_popup);
483cacd992dSmrg}
484cacd992dSmrg
485cacd992dSmrgstatic void
486cacd992dSmrgTestTOCB (Widget w, XtPointer client, XtPointer call)
487cacd992dSmrg{
488cacd992dSmrg  XtRemoveTimeOut(TOid);
489cacd992dSmrg  TestTO(w, (XtIntervalId *) NULL);
490cacd992dSmrg}
491cacd992dSmrg
492cacd992dSmrgstatic void
493cacd992dSmrgTestCB (Widget w, XtPointer client, XtPointer call)
494cacd992dSmrg{
495cacd992dSmrg    fields i;
496cacd992dSmrg    for (i = HDisplay; i < fields_num; i++)
497cacd992dSmrg	AppRes.old[i] = AppRes.field[i].val;
498cacd992dSmrg
499cacd992dSmrg    XtPopup(testing_popup, XtGrabExclusive /*XtGrabNone*/);
500cacd992dSmrg    XSync(XtDisplay(w), False);
501cacd992dSmrg    TOid = XtAppAddTimeOut (XtWidgetToApplicationContext (w),
502cacd992dSmrg		TestTimeout, TestTO, (XtPointer) w);
503cacd992dSmrg
504cacd992dSmrg    ApplyCB (w, client, call);
505cacd992dSmrg}
506cacd992dSmrg
507cacd992dSmrgstatic Boolean
508cacd992dSmrgConvertSelection(
509cacd992dSmrg    Widget w,
510cacd992dSmrg    Atom *selection, Atom *target, Atom *type,
511cacd992dSmrg    XtPointer *value,
512cacd992dSmrg    unsigned long *length,
513cacd992dSmrg    int *format)
514cacd992dSmrg{
515cacd992dSmrg    if (XmuConvertStandardSelection(w, CurrentTime, selection, target, type,
516cacd992dSmrg                                    (XPointer *) value, length, format))
517cacd992dSmrg        return True;
518cacd992dSmrg
519cacd992dSmrg    if (*target == XA_STRING) {
520cacd992dSmrg        *type = XA_STRING;
521cacd992dSmrg        *value = modebuf;
522cacd992dSmrg        *length = strlen(*value);
523cacd992dSmrg        *format = 8;
524cacd992dSmrg        return True;
525cacd992dSmrg    }
526cacd992dSmrg    return False;
527cacd992dSmrg}
528cacd992dSmrg
529cacd992dSmrgstatic void
530cacd992dSmrgShowCB(Widget w, XtPointer client, XtPointer call)
531cacd992dSmrg{
532cacd992dSmrg    Time time;
533cacd992dSmrg    char tmpbuf[16];
534cacd992dSmrg
53514ddf674Smrg    snprintf(tmpbuf, sizeof(tmpbuf), "\"%dx%d\"",
536cacd992dSmrg	   AppRes.field[HDisplay].val, AppRes.field[VDisplay].val);
53714ddf674Smrg    snprintf(modebuf, sizeof(modebuf),
53814ddf674Smrg	   "%-11s   %6.2f   %4d %4d %4d %4d   %4d %4d %4d %4d",
539cacd992dSmrg	   tmpbuf, (float)dot_clock/1000.0,
540cacd992dSmrg	   AppRes.field[HDisplay].val,
541cacd992dSmrg	   AppRes.field[HSyncStart].val,
542cacd992dSmrg	   AppRes.field[HSyncEnd].val,
543cacd992dSmrg	   AppRes.field[HTotal].val,
544cacd992dSmrg	   AppRes.field[VDisplay].val,
545cacd992dSmrg	   AppRes.field[VSyncStart].val,
546cacd992dSmrg	   AppRes.field[VSyncEnd].val,
547cacd992dSmrg	   AppRes.field[VTotal].val);
548cacd992dSmrg    /* Print out the flags (if any) */
549cacd992dSmrg    if (mode_flags & V_PHSYNC)    strcat(modebuf, " +hsync");
550cacd992dSmrg    if (mode_flags & V_NHSYNC)    strcat(modebuf, " -hsync");
551cacd992dSmrg    if (mode_flags & V_PVSYNC)    strcat(modebuf, " +vsync");
552cacd992dSmrg    if (mode_flags & V_NVSYNC)    strcat(modebuf, " -vsync");
553cacd992dSmrg    if (mode_flags & V_INTERLACE) strcat(modebuf, " interlace");
554cacd992dSmrg    if (mode_flags & V_CSYNC)     strcat(modebuf, " composite");
555cacd992dSmrg    if (mode_flags & V_PCSYNC)    strcat(modebuf, " +csync");
556cacd992dSmrg    if (mode_flags & V_NCSYNC)    strcat(modebuf, " -csync");
557cacd992dSmrg    if (mode_flags & V_DBLSCAN)   strcat(modebuf, " doublescan");
558cacd992dSmrg    printf("%s\n", modebuf);
559cacd992dSmrg    time = XtLastTimestampProcessed(XtDisplay(w));
560cacd992dSmrg    XtOwnSelection(w, XA_PRIMARY, time, ConvertSelection, NULL, NULL);
561cacd992dSmrg    if (S3Specials) {
562cacd992dSmrg	unsigned int i;
563cacd992dSmrg	Boolean state;
564cacd992dSmrg	char *string;
565cacd992dSmrg
566cacd992dSmrg	XtVaGetValues(AppRes.field[InvertVclk].textwidget,
567cacd992dSmrg			XtNstate, &state, NULL);
568cacd992dSmrg	AppRes.field[InvertVclk].val = state ? 1 : 0;
569cacd992dSmrg	XtVaGetValues (AppRes.field[BlankDelay1].textwidget,
570cacd992dSmrg			XtNstring, &string, NULL);
571cacd992dSmrg	(void) sscanf (string, "%x", &i);
572cacd992dSmrg	AppRes.field[BlankDelay1].val = i;
573cacd992dSmrg	XtVaGetValues (AppRes.field[BlankDelay2].textwidget,
574cacd992dSmrg			XtNstring, &string, NULL);
575cacd992dSmrg	(void) sscanf (string, "%x", &i);
576cacd992dSmrg	AppRes.field[BlankDelay2].val = i;
577cacd992dSmrg	XtVaGetValues(AppRes.field[EarlySc].textwidget,
578cacd992dSmrg			XtNstate, &state, NULL);
579cacd992dSmrg	AppRes.field[EarlySc].val = state ? 1 : 0;
580cacd992dSmrg	if (AppRes.field[InvertVclk].val != AppRes.orig[InvertVclk])
581cacd992dSmrg	    printf("InvertVCLK\t\"%dx%d\" %d\n", AppRes.field[HDisplay].val,
582cacd992dSmrg		AppRes.field[VDisplay].val, AppRes.field[InvertVclk].val);
583cacd992dSmrg	if (AppRes.field[EarlySc].val != AppRes.orig[EarlySc])
584cacd992dSmrg	    printf("EarlySC\t\t\"%dx%d\" %d\n", AppRes.field[HDisplay].val,
585cacd992dSmrg		AppRes.field[VDisplay].val, AppRes.field[EarlySc].val);
586cacd992dSmrg	if (AppRes.field[BlankDelay1].val != AppRes.orig[BlankDelay1]
587cacd992dSmrg	    || AppRes.field[BlankDelay2].val != AppRes.orig[BlankDelay2])
588cacd992dSmrg	    printf("BlankDelay\t\"%dx%d\" %d %d\n", AppRes.field[HDisplay].val,
589cacd992dSmrg		AppRes.field[VDisplay].val, AppRes.field[BlankDelay1].val,
590cacd992dSmrg		AppRes.field[BlankDelay2].val);
591cacd992dSmrg    }
592cacd992dSmrg    printf("\n");
593cacd992dSmrg}
594cacd992dSmrg
595cacd992dSmrgstatic void
596cacd992dSmrgAdjustCB(Widget w, XtPointer client, XtPointer call)
597cacd992dSmrg{
598cacd992dSmrg   int what = (long) client;
599cacd992dSmrg   Boolean state;
600cacd992dSmrg
601cacd992dSmrg   switch (what) {
602cacd992dSmrg    case HSyncStart:
603cacd992dSmrg      if (AppRes.field[HSyncEnd].val + 4 < AppRes.field[HTotal].val) {
604cacd992dSmrg	 AppRes.field[HSyncEnd].val += 4;
605cacd992dSmrg	 AppRes.field[HSyncStart].val += 4;
606cacd992dSmrg	 SetLabel(HSyncStart);
607cacd992dSmrg	 SetLabel(HSyncEnd);
608cacd992dSmrg      } else
609cacd992dSmrg	XBell(XtDisplay(w), 80);
610cacd992dSmrg      break;
611cacd992dSmrg    case -HSyncStart:
612cacd992dSmrg      if (AppRes.field[HSyncStart].val - 4 > AppRes.field[HDisplay].val) {
613cacd992dSmrg	 AppRes.field[HSyncEnd].val -= 4;
614cacd992dSmrg	 AppRes.field[HSyncStart].val -= 4;
615cacd992dSmrg	 SetLabel(HSyncStart);
616cacd992dSmrg	 SetLabel(HSyncEnd);
617cacd992dSmrg      } else
618cacd992dSmrg	XBell(XtDisplay(w), 80);
619cacd992dSmrg      break;
620cacd992dSmrg    case HTotal:
621cacd992dSmrg      AppRes.field[HTotal].val += 4;
622cacd992dSmrg      SetLabel(HTotal);
623cacd992dSmrg      UpdateSyncRates(TRUE);
624cacd992dSmrg      break;
625cacd992dSmrg    case -HTotal:
626cacd992dSmrg      if (AppRes.field[HTotal].val - 4 >  AppRes.field[HSyncEnd].val) {
627cacd992dSmrg	AppRes.field[HTotal].val -= 4;
628cacd992dSmrg	SetLabel(HTotal);
629cacd992dSmrg	UpdateSyncRates(TRUE);
630cacd992dSmrg      } else
631cacd992dSmrg	XBell(XtDisplay(w), 80);
632cacd992dSmrg      break;
633cacd992dSmrg    case VSyncStart:
634cacd992dSmrg      if (AppRes.field[VSyncEnd].val + 4 < AppRes.field[VTotal].val) {
635cacd992dSmrg	 AppRes.field[VSyncEnd].val += 4;
636cacd992dSmrg	 AppRes.field[VSyncStart].val += 4;
637cacd992dSmrg	 SetLabel(VSyncStart);
638cacd992dSmrg	 SetLabel(VSyncEnd);
639cacd992dSmrg      } else
640cacd992dSmrg	XBell(XtDisplay(w), 80);
641cacd992dSmrg      break;
642cacd992dSmrg    case -VSyncStart:
643cacd992dSmrg      if (AppRes.field[VSyncStart].val - 4 > AppRes.field[VDisplay].val) {
644cacd992dSmrg	 AppRes.field[VSyncEnd].val -= 4;
645cacd992dSmrg	 AppRes.field[VSyncStart].val -= 4;
646cacd992dSmrg	 SetLabel(VSyncStart);
647cacd992dSmrg	 SetLabel(VSyncEnd);
648cacd992dSmrg      } else
649cacd992dSmrg	XBell(XtDisplay(w), 80);
650cacd992dSmrg      break;
651cacd992dSmrg    case VTotal:
652cacd992dSmrg      AppRes.field[VTotal].val += 4;
653cacd992dSmrg      SetLabel(VTotal);
654cacd992dSmrg      UpdateSyncRates(TRUE);
655cacd992dSmrg      break;
656cacd992dSmrg    case -VTotal:
657cacd992dSmrg      if (AppRes.field[VTotal].val - 4 >  AppRes.field[VSyncEnd].val) {
658cacd992dSmrg	AppRes.field[VTotal].val -= 4;
659cacd992dSmrg	SetLabel(VTotal);
660cacd992dSmrg	UpdateSyncRates(TRUE);
661cacd992dSmrg      } else
662cacd992dSmrg	XBell(XtDisplay(w), 80);
663cacd992dSmrg      break;
664cacd992dSmrg   }
665cacd992dSmrg   SetScrollbars ();
666cacd992dSmrg   XtVaGetValues(auto_apply_toggle, XtNstate, &state, NULL);
667cacd992dSmrg   if (state)
668cacd992dSmrg       ApplyCB (w, client, call);
669cacd992dSmrg}
670cacd992dSmrg
671cacd992dSmrg
672cacd992dSmrg#if 0
673cacd992dSmrgstatic void
674cacd992dSmrgEditCB (Widget w, XtPointer client, XtPointer call)
675cacd992dSmrg{
676cacd992dSmrg    int base, current, i, len;
677cacd992dSmrg    int lower, upper;
678cacd992dSmrg    float percent;
679cacd992dSmrg    ScrollData* sdp = (ScrollData*) client;
680cacd992dSmrg
681cacd992dSmrg    len = strlen (sdp->string);
682cacd992dSmrg
683cacd992dSmrg    for (i = 0; i < len; i++) {
684cacd992dSmrg	if (!(isdigit (sdp->string[i]) || isspace (sdp->string[i]))) {
685cacd992dSmrg	    XBell (XtDisplay(XtParent(w)), 100);
686cacd992dSmrg	    return;
687cacd992dSmrg	}
688cacd992dSmrg    }
689cacd992dSmrg    switch (sdp->me) {
690cacd992dSmrg    case HSyncStart:
691cacd992dSmrg	lower = atoi (AppRes.field[HDisplay].string);
692cacd992dSmrg	upper = atoi (AppRes.field[HSyncEnd].string);
693cacd992dSmrg	break;
694cacd992dSmrg
695cacd992dSmrg    case HSyncEnd:
696cacd992dSmrg	lower = atoi (AppRes.field[HSyncStart].string);
697cacd992dSmrg	upper = atoi (AppRes.field[HTotal].string);
698cacd992dSmrg	break;
699cacd992dSmrg
700cacd992dSmrg    case HTotal:
701cacd992dSmrg	lower = atoi (AppRes.field[HSyncEnd].string);
702cacd992dSmrg	upper = atoi (AppRes.field[HDisplay].string) +
703cacd992dSmrg		AppRes.field[HTotal].range;
704cacd992dSmrg	break;
705cacd992dSmrg
706cacd992dSmrg    case VSyncStart:
707cacd992dSmrg	lower = atoi (AppRes.field[VDisplay].string);
708cacd992dSmrg	upper = atoi (AppRes.field[VSyncEnd].string);
709cacd992dSmrg	break;
710cacd992dSmrg
711cacd992dSmrg    case VSyncEnd:
712cacd992dSmrg	lower = atoi (AppRes.field[VSyncStart].string);
713cacd992dSmrg	upper = atoi (AppRes.field[VTotal].string);
714cacd992dSmrg	break;
715cacd992dSmrg
716cacd992dSmrg    case VTotal:
717cacd992dSmrg	lower = atoi (AppRes.field[VSyncEnd].string);
718cacd992dSmrg	upper = atoi (AppRes.field[VDisplay].string) +
719cacd992dSmrg		AppRes.field[VTotal].range;
720cacd992dSmrg	break;
721cacd992dSmrg    }
722cacd992dSmrg    current = atoi (sdp->string);
723cacd992dSmrg    if (current < lower || current > upper) {
724cacd992dSmrg	XawTextBlock text;
725cacd992dSmrg	char tmp[6];
726cacd992dSmrg
727cacd992dSmrg	if (current < lower) {
72814ddf674Smrg	    (void) snprintf (tmp, sizeof(tmp), "%5d", lower);
729cacd992dSmrg	    current = lower;
730cacd992dSmrg	} else {
73114ddf674Smrg	    (void) snprintf (tmp, sizeof(tmp), "%5d", upper);
732cacd992dSmrg	    current = upper;
733cacd992dSmrg	}
734cacd992dSmrg	text.firstPos = 0;
735cacd992dSmrg	text.length = strlen (tmp);
736cacd992dSmrg	text.ptr = tmp;
737cacd992dSmrg	text.format = XawFmt8Bit;
738cacd992dSmrg	XawTextReplace (sdp->textwidget, 0, text.length, &text);
739cacd992dSmrg    }
740cacd992dSmrg    base = atoi (AppRes.field[sdp->use].string);
741cacd992dSmrg    percent = ((float)(current - base)) / ((float)sdp->range);
742cacd992dSmrg    XawScrollbarSetThumb (sdp->scrollwidget, percent, 0.0);
743cacd992dSmrg}
744cacd992dSmrg#endif
745cacd992dSmrg
746cacd992dSmrgstatic void
747cacd992dSmrgFlagsEditCB (Widget w, XtPointer client, XtPointer call)
748cacd992dSmrg{
749cacd992dSmrg    int i, len;
750cacd992dSmrg    char* string;
751cacd992dSmrg    fields findex = (fields) (unsigned long) client;
752cacd992dSmrg    ScrollData* sdp = &AppRes.field[findex];
753cacd992dSmrg
754cacd992dSmrg    XtVaGetValues (w, XtNstring, &string, NULL);
755cacd992dSmrg    len = strlen (string);
756cacd992dSmrg    if (len > 4) {
757cacd992dSmrg	char buf[5];
758cacd992dSmrg
759cacd992dSmrg	XBell (XtDisplay(XtParent(w)), 100);
760cacd992dSmrg	(void) strncpy (buf, string, 4);
761cacd992dSmrg	buf[4] = '\0';
762cacd992dSmrg	XtVaSetValues (sdp->textwidget, XtNstring, buf, NULL);
763cacd992dSmrg	XawTextSetInsertionPoint (sdp->textwidget, 4);
764cacd992dSmrg    }
765cacd992dSmrg
766cacd992dSmrg    for (i = 0; i < len; i++) {
767cacd992dSmrg	if (!isxdigit (string[i])) {
768cacd992dSmrg	    XBell (XtDisplay(XtParent(w)), 100);
769cacd992dSmrg	}
770cacd992dSmrg    }
771cacd992dSmrg}
772cacd992dSmrg
773cacd992dSmrgstatic void
774cacd992dSmrgBlankEditCB (Widget w, XtPointer client, XtPointer call)
775cacd992dSmrg{
776cacd992dSmrg    int len;
777cacd992dSmrg    char* string;
778cacd992dSmrg    fields findex = (fields) (unsigned long) client;
779cacd992dSmrg    ScrollData* sdp = &AppRes.field[findex];
780cacd992dSmrg    char buf[2], old;
781cacd992dSmrg    Boolean state;
782cacd992dSmrg    Boolean noAuto = False;
783cacd992dSmrg
784cacd992dSmrg    XtVaGetValues (w, XtNstring, &string, NULL);
785cacd992dSmrg    len = strlen (string);
786cacd992dSmrg    if (len == 0) {
787cacd992dSmrg	XBell (XtDisplay(XtParent(w)), 100);
788cacd992dSmrg	strcpy(buf, "0");
789cacd992dSmrg	XtVaSetValues (sdp->textwidget, XtNstring, buf, NULL);
790cacd992dSmrg	XawTextSetInsertionPoint (sdp->textwidget, 1);
791cacd992dSmrg        return;
792cacd992dSmrg    }
793cacd992dSmrg    if (len > 1) {
794cacd992dSmrg	if (XawTextGetInsertionPoint(sdp->textwidget) < 1) {
795cacd992dSmrg	    buf[0] = string[0];
796cacd992dSmrg	    old = string[1];
797cacd992dSmrg	} else {
798cacd992dSmrg	    buf[0] = string[1];
799cacd992dSmrg	    old = string[0];
800cacd992dSmrg	}
801cacd992dSmrg	if (buf[0] == '+' && old < '7')
802cacd992dSmrg	    buf[0] = old + 1;
803cacd992dSmrg	else if (buf[0] == '-' && old > '0')
804cacd992dSmrg	    buf[0] = old - 1;
805cacd992dSmrg	if (!isdigit(buf[0]) || buf[0] > '7') {
806cacd992dSmrg	    XBell (XtDisplay(XtParent(w)), 100);
807cacd992dSmrg	    buf[0] = old;
808cacd992dSmrg	    if (!isdigit(buf[0]) || buf[0] > '7')
809cacd992dSmrg		buf[0] = '0';
810cacd992dSmrg	    noAuto = True;
811cacd992dSmrg	}
812cacd992dSmrg	buf[1] = '\0';
813cacd992dSmrg	XtVaSetValues (sdp->textwidget, XtNstring, buf, NULL);
814cacd992dSmrg	XawTextSetInsertionPoint (sdp->textwidget, 1);
815cacd992dSmrg    }
816cacd992dSmrg    XtVaGetValues(auto_apply_toggle, XtNstate, &state, NULL);
817cacd992dSmrg    if (state && !noAuto)
818cacd992dSmrg	ApplyCB (sdp->textwidget, client, call);
819cacd992dSmrg}
820cacd992dSmrg
821cacd992dSmrgstatic void
822cacd992dSmrgChangeBlankCB (Widget w, XtPointer client, XtPointer call)
823cacd992dSmrg{
824cacd992dSmrg    char* string;
825cacd992dSmrg    char buf[2];
826cacd992dSmrg    fields findex;
827cacd992dSmrg    ScrollData* sdp;
828cacd992dSmrg    Boolean state;
829cacd992dSmrg    int what = (long) client;
830cacd992dSmrg
831cacd992dSmrg
832cacd992dSmrg    if (what < 0)
833cacd992dSmrg	findex = (fields)-what;
834cacd992dSmrg    else
835cacd992dSmrg	findex = (fields)what;
836cacd992dSmrg    sdp = &AppRes.field[findex];
837cacd992dSmrg
838cacd992dSmrg    XtVaGetValues (sdp->textwidget, XtNstring, &string, NULL);
839cacd992dSmrg    if (what > 0)
840cacd992dSmrg	string[0]++;
841cacd992dSmrg    else
842cacd992dSmrg	string[0]--;
843cacd992dSmrg
844cacd992dSmrg    if (string[0] < '0' || string[0] > '7') {
845cacd992dSmrg	XBell (XtDisplay(XtParent(w)), 100);
846cacd992dSmrg	return;
847cacd992dSmrg    }
848cacd992dSmrg
849cacd992dSmrg    buf[0] = string[0];
850cacd992dSmrg    buf[1] = '\0';
851cacd992dSmrg    XtVaSetValues (sdp->textwidget, XtNstring, buf, NULL);
852cacd992dSmrg    XawTextSetInsertionPoint (sdp->textwidget, 1);
853cacd992dSmrg
854cacd992dSmrg    XtVaGetValues(auto_apply_toggle, XtNstate, &state, NULL);
855cacd992dSmrg    if (state)
856cacd992dSmrg	ApplyCB (sdp->textwidget, client, call);
857cacd992dSmrg}
858cacd992dSmrg
859cacd992dSmrgstatic int
860cacd992dSmrgisValid(int val, int field)
861cacd992dSmrg{
862cacd992dSmrg   switch(field) {
863cacd992dSmrg     case HSyncStart:
864cacd992dSmrg	if (val+8 > AppRes.field[HSyncEnd].val)
865cacd992dSmrg	   val = AppRes.field[HSyncEnd].val - 8;
866cacd992dSmrg        break;
867cacd992dSmrg     case HSyncEnd:
868cacd992dSmrg        if (val-8 < AppRes.field[HSyncStart].val)
869cacd992dSmrg	    val = AppRes.field[HSyncStart].val + 8;
870cacd992dSmrg        if (val > AppRes.field[HTotal].val)
871cacd992dSmrg	    val = AppRes.field[HTotal].val;
872cacd992dSmrg        break;
873cacd992dSmrg     case HTotal:
874cacd992dSmrg	if (val < AppRes.field[HSyncEnd].val)
875cacd992dSmrg	   val = AppRes.field[HSyncEnd].val;
876cacd992dSmrg         break;
877cacd992dSmrg     case VSyncStart:
878cacd992dSmrg	if (val+8 > AppRes.field[VSyncEnd].val)
879cacd992dSmrg	   val = AppRes.field[VSyncEnd].val - 8;
880cacd992dSmrg        break;
881cacd992dSmrg     case VSyncEnd:
882cacd992dSmrg        if (val-8 < AppRes.field[VSyncStart].val)
883cacd992dSmrg	    val = AppRes.field[VSyncStart].val + 8;
884cacd992dSmrg        if (val > AppRes.field[VTotal].val)
885cacd992dSmrg	    val = AppRes.field[VTotal].val;
886cacd992dSmrg        break;
887cacd992dSmrg     case VTotal:
888cacd992dSmrg	if (val < AppRes.field[VSyncEnd].val)
889cacd992dSmrg	   val = AppRes.field[VSyncEnd].val;
890cacd992dSmrg        break;
891cacd992dSmrg   }
892cacd992dSmrg   return val;
893cacd992dSmrg}
894cacd992dSmrg
895cacd992dSmrgstatic void
896cacd992dSmrgScrollCB (Widget w, XtPointer client, XtPointer call)
897cacd992dSmrg{
898cacd992dSmrg    float percent = *(float*) call;
899cacd992dSmrg    int ipercent = percent * 100;
900cacd992dSmrg    int fieldindex = (long) client;
901cacd992dSmrg    ScrollData* sdp = &AppRes.field[fieldindex];
902cacd992dSmrg
903cacd992dSmrg
904cacd992dSmrg
905cacd992dSmrg    if (ipercent != sdp->lastpercent) {
906cacd992dSmrg        int tmp_val;
907cacd992dSmrg	char buf[6];
908cacd992dSmrg
909cacd992dSmrg	tmp_val = AppRes.field[sdp->use].val;
910cacd992dSmrg	tmp_val += (int) (((float)sdp->range) * percent);
911cacd992dSmrg
912cacd992dSmrg        sdp->val = isValid(tmp_val, fieldindex);
913cacd992dSmrg
914cacd992dSmrg	sdp->lastpercent = ipercent;
91514ddf674Smrg	(void) snprintf (buf, sizeof(buf), "%5d", sdp->val);
916cacd992dSmrg	XtVaSetValues (sdp->textwidget, XtNlabel, buf, NULL);
917cacd992dSmrg        if (sdp->val != tmp_val) {
918cacd992dSmrg            int base;
919cacd992dSmrg            float percent;
920cacd992dSmrg
921cacd992dSmrg            base = AppRes.field[sdp->use].val;
922cacd992dSmrg            percent = ((float)(sdp->val - base)) / ((float)sdp->range);
923cacd992dSmrg            /* This doesn't always work, why? */
924cacd992dSmrg            XawScrollbarSetThumb (sdp->scrollwidget, percent, 0.0);
925cacd992dSmrg	}
926cacd992dSmrg	if (fieldindex == HTotal || fieldindex == VTotal)
927cacd992dSmrg	    UpdateSyncRates(TRUE);
928cacd992dSmrg    }
929cacd992dSmrg}
930cacd992dSmrg
931cacd992dSmrgstatic void
932cacd992dSmrgSwitchCB (Widget w, XtPointer client, XtPointer call)
933cacd992dSmrg{
934cacd992dSmrg    XF86VidModeLockModeSwitch(XtDisplay(w), DefaultScreen (XtDisplay (w)),
935cacd992dSmrg			      FALSE);
936cacd992dSmrg    XF86VidModeSwitchMode(XtDisplay(w), DefaultScreen (XtDisplay (w)),
937cacd992dSmrg			  (int)(long) client);
938cacd992dSmrg    XF86VidModeLockModeSwitch(XtDisplay(w), DefaultScreen (XtDisplay (w)),
939cacd992dSmrg			      TRUE);
940cacd992dSmrg    FetchCB(w, NULL, NULL);
941cacd992dSmrg}
942cacd992dSmrg
943cacd992dSmrgstatic void
944cacd992dSmrgAddCallback (
945cacd992dSmrg    Widget w,
946cacd992dSmrg    String  callback_name,
947cacd992dSmrg    XtCallbackProc callback,
948cacd992dSmrg    XtPointer client_data)
949cacd992dSmrg{
950cacd992dSmrg    Widget src;
951cacd992dSmrg
952cacd992dSmrg    XtVaGetValues (w, XtNtextSource, &src, NULL);
953cacd992dSmrg    XtAddCallback (src, callback_name, callback, client_data);
954cacd992dSmrg}
955cacd992dSmrg
956cacd992dSmrgstatic void
957cacd992dSmrgCreateTyp (
958cacd992dSmrg    Widget form,
959cacd992dSmrg    fields findex,
960cacd992dSmrg    String w1name,
961cacd992dSmrg    String w2name,
962cacd992dSmrg    String w3name)
963cacd992dSmrg{
964cacd992dSmrg    Widget wids[3];
965cacd992dSmrg    char buf[10];
966cacd992dSmrg
967cacd992dSmrg    wids[0] = XtCreateWidget (w1name, labelWidgetClass, form, NULL, 0);
968cacd992dSmrg    if (findex >= PixelClock && findex <= VSyncRate)
96914ddf674Smrg	(void) snprintf(buf, sizeof(buf), "%6.2f",
97014ddf674Smrg			(float)AppRes.field[findex].val / 1000.0);
971cacd992dSmrg    else
97214ddf674Smrg	(void) snprintf (buf, sizeof(buf), "%5d", AppRes.field[findex].val);
973cacd992dSmrg    wids[1] = XtVaCreateWidget (w2name, labelWidgetClass,
974cacd992dSmrg		form, XtNlabel, buf, NULL);
975cacd992dSmrg    if (w3name != NULL) {
976cacd992dSmrg	wids[2] = XtCreateWidget (w3name, scrollbarWidgetClass, form, NULL, 0);
977cacd992dSmrg	XtAddCallback (wids[2], XtNjumpProc, ScrollCB, (XtPointer) findex);
978cacd992dSmrg	XtManageChildren (wids, 3);
979cacd992dSmrg    } else {
980cacd992dSmrg	wids[2] = (Widget) NULL;
981cacd992dSmrg	XtManageChildren (wids, 2);
982cacd992dSmrg    }
983cacd992dSmrg    AppRes.field[findex].textwidget = wids[1];
984cacd992dSmrg    AppRes.field[findex].scrollwidget = wids[2];
985cacd992dSmrg}
986cacd992dSmrg
987cacd992dSmrg
988cacd992dSmrgstatic void
989cacd992dSmrgAckWarn (Widget w, XtPointer client, XtPointer call)
990cacd992dSmrg{
991cacd992dSmrg    XtPopdown((Widget) client);
992cacd992dSmrg    XtDestroyWidget((Widget) client);
993cacd992dSmrg}
994cacd992dSmrg
995cacd992dSmrgstatic void
996cacd992dSmrgAckNoTune (Widget w, XtPointer client, XtPointer call)
997cacd992dSmrg{
998cacd992dSmrg    CleanUp(XtDisplay(w));
999cacd992dSmrg#if XtSpecificationRelease < 6
1000cacd992dSmrg    exit (0);
1001cacd992dSmrg#else
1002cacd992dSmrg    XtAppSetExitFlag (XtWidgetToApplicationContext (w));
1003cacd992dSmrg#endif
1004cacd992dSmrg}
1005cacd992dSmrg
1006cacd992dSmrgstatic void
1007cacd992dSmrgdisplayWarning(Widget top)
1008cacd992dSmrg{
1009cacd992dSmrg    Widget w, popup, popupBox;
1010cacd992dSmrg    int x, y;
1011cacd992dSmrg
1012cacd992dSmrg    x =  DisplayWidth(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 3;
1013cacd992dSmrg    y =  DisplayHeight(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 3;
1014cacd992dSmrg
1015cacd992dSmrg    popup = XtVaCreatePopupShell("Warning",
1016cacd992dSmrg			    transientShellWidgetClass, top,
1017cacd992dSmrg			    XtNtitle, "WARNING",
1018cacd992dSmrg			    XtNx, x,
1019cacd992dSmrg			    XtNy, y,
1020cacd992dSmrg			    NULL);
1021cacd992dSmrg
1022cacd992dSmrg    popupBox = XtVaCreateManagedWidget(
1023cacd992dSmrg               "WarningBox",
1024cacd992dSmrg               boxWidgetClass,
1025cacd992dSmrg               popup,
1026cacd992dSmrg               NULL);
1027cacd992dSmrg
1028cacd992dSmrg    w = XtVaCreateManagedWidget( "WarnLabel",
1029cacd992dSmrg                                     labelWidgetClass,
1030cacd992dSmrg				     popupBox,
1031cacd992dSmrg                                     NULL);
1032cacd992dSmrg
1033cacd992dSmrg    w = XtVaCreateManagedWidget( "WarnOK",
1034cacd992dSmrg                                     commandWidgetClass,
1035cacd992dSmrg				     popupBox,
1036cacd992dSmrg                                     NULL);
1037cacd992dSmrg
1038cacd992dSmrg    XtAddCallback (w, XtNcallback, AckWarn, (XtPointer)popup);
1039cacd992dSmrg
1040cacd992dSmrg    w = XtVaCreateManagedWidget( "WarnCancel",
1041cacd992dSmrg                                     commandWidgetClass,
1042cacd992dSmrg				     popupBox,
1043cacd992dSmrg                                     NULL);
1044cacd992dSmrg    XtAddCallback (w, XtNcallback, QuitCB, (XtPointer)NULL);
1045cacd992dSmrg
1046cacd992dSmrg    XtPopup(popup, XtGrabExclusive);
1047cacd992dSmrg
1048cacd992dSmrg}
1049cacd992dSmrg
1050cacd992dSmrgstatic void
1051cacd992dSmrgdisplayNoTune(Widget top)
1052cacd992dSmrg{
1053cacd992dSmrg    Widget w, popup, popupBox;
1054cacd992dSmrg
1055cacd992dSmrg    popup = XtCreateWidget ("Notice", formWidgetClass, top, NULL, 0);
1056cacd992dSmrg    popupBox = XtVaCreateManagedWidget(
1057cacd992dSmrg               "WarningBox",
1058cacd992dSmrg               boxWidgetClass,
1059cacd992dSmrg               popup,
1060cacd992dSmrg               NULL);
1061cacd992dSmrg
1062cacd992dSmrg    w = XtVaCreateManagedWidget( "NoTuneLabel",
1063cacd992dSmrg                                     labelWidgetClass,
1064cacd992dSmrg				     popupBox,
1065cacd992dSmrg                                     NULL);
1066cacd992dSmrg
1067cacd992dSmrg    w = XtVaCreateManagedWidget( "NoTuneOK",
1068cacd992dSmrg                                     commandWidgetClass,
1069cacd992dSmrg				     popupBox,
1070cacd992dSmrg                                     NULL);
1071cacd992dSmrg
1072cacd992dSmrg    XtAddCallback (w, XtNcallback, AckNoTune, (XtPointer)popup);
1073cacd992dSmrg
1074cacd992dSmrg    XtManageChild (popup);
1075cacd992dSmrg}
1076cacd992dSmrg
1077cacd992dSmrg#if 0
1078cacd992dSmrgstatic void
1079cacd992dSmrgs3Special(Widget top)
1080cacd992dSmrg{
1081cacd992dSmrg    Widget w, popup, form, invert_vclk_toggle, wids[6];
1082cacd992dSmrg    char buf1[5] = {'\0',};
1083cacd992dSmrg    int x, y;
1084cacd992dSmrg
1085cacd992dSmrg    x =  DisplayWidth(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 3;
1086cacd992dSmrg    y =  DisplayHeight(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 3;
1087cacd992dSmrg
1088cacd992dSmrg    popup = XtVaCreatePopupShell("S3Adjust",
1089cacd992dSmrg			    transientShellWidgetClass, top,
1090cacd992dSmrg			    XtNtitle, "S3Adjust",
1091cacd992dSmrg			    XtNx, x,
1092cacd992dSmrg			    XtNy, y,
1093cacd992dSmrg			    NULL);
1094cacd992dSmrg
1095cacd992dSmrg    form = XtVaCreateManagedWidget(
1096cacd992dSmrg               "S3Box",
1097cacd992dSmrg               formWidgetClass,
1098cacd992dSmrg               popup,
1099cacd992dSmrg               NULL);
1100cacd992dSmrg
1101cacd992dSmrg    w = XtVaCreateManagedWidget( "S3Title",
1102cacd992dSmrg                                     labelWidgetClass,
1103cacd992dSmrg				     form,
1104cacd992dSmrg                                     NULL);
1105cacd992dSmrg
1106cacd992dSmrg    invert_vclk_toggle = XtVaCreateManagedWidget( "InvertVclk-toggle",
1107cacd992dSmrg                                     toggleWidgetClass,
1108cacd992dSmrg				     form,
1109cacd992dSmrg                                     NULL);
1110cacd992dSmrg
1111cacd992dSmrg    wids[0] = XtCreateWidget ("Blank1-label", labelWidgetClass,
1112cacd992dSmrg		form, NULL, 0);
1113cacd992dSmrg    wids[1] = XtVaCreateWidget ("Blank1-text", asciiTextWidgetClass,
1114cacd992dSmrg		form, XtNstring, buf1, NULL);
1115cacd992dSmrg    AddCallback (wids[1], XtNcallback, FlagsEditCB, (XtPointer) NULL);
1116cacd992dSmrg
1117cacd992dSmrg    XtManageChildren (wids, 2);
1118cacd992dSmrg
1119cacd992dSmrg    XtPopup(popup, XtGrabNone);
1120cacd992dSmrg
1121cacd992dSmrg}
1122cacd992dSmrg#endif
1123cacd992dSmrg
1124cacd992dSmrg
1125cacd992dSmrg
1126cacd992dSmrgstatic void
1127cacd992dSmrgCreateHierarchy(Widget top)
1128cacd992dSmrg{
1129cacd992dSmrg    char buf[5];
1130cacd992dSmrg    Widget form, forms[14], s3form;
1131cacd992dSmrg    Widget wids[10];
1132cacd992dSmrg    Widget boxW, popdownW, w;
1133cacd992dSmrg    int i;
1134cacd992dSmrg    int x, y;
1135cacd992dSmrg    static String form_names[] = {
1136cacd992dSmrg	"HDisplay-form",
1137cacd992dSmrg	"HSyncStart-form",
1138cacd992dSmrg	"HSyncEnd-form",
1139cacd992dSmrg	"HTotal-form",
1140cacd992dSmrg	"VDisplay-form",
1141cacd992dSmrg	"VSyncStart-form",
1142cacd992dSmrg	"VSyncEnd-form",
1143cacd992dSmrg	"VTotal-form",
1144cacd992dSmrg	"Flags-form",
1145cacd992dSmrg	"Buttons-form",
1146cacd992dSmrg	"PixelClock-form",
1147cacd992dSmrg	"HSyncRate-form",
1148cacd992dSmrg	"VSyncRate-form",
1149cacd992dSmrg	"Buttons2-form",
1150cacd992dSmrg	};
1151cacd992dSmrg
1152cacd992dSmrg    form = XtCreateWidget ("form", formWidgetClass, top, NULL, 0);
1153cacd992dSmrg    for (i = 0; i < 14; i++)
1154cacd992dSmrg	forms[i] = XtCreateWidget (form_names[i], formWidgetClass,
1155cacd992dSmrg		form, NULL, 0);
1156cacd992dSmrg
1157cacd992dSmrg    CreateTyp (forms[0], HDisplay, "HDisplay-label", "HDisplay-text", NULL);
1158cacd992dSmrg    CreateTyp (forms[1], HSyncStart, "HSyncStart-label",
1159cacd992dSmrg		"HSyncStart-text", "HSyncStart-scrollbar");
1160cacd992dSmrg    CreateTyp (forms[2], HSyncEnd, "HSyncEnd-label", "HSyncEnd-text",
1161cacd992dSmrg		"HSyncEnd-scrollbar");
1162cacd992dSmrg    CreateTyp (forms[3], HTotal, "HTotal-label", "HTotal-text",
1163cacd992dSmrg		"HTotal-scrollbar");
1164cacd992dSmrg
1165cacd992dSmrg    w = XtVaCreateManagedWidget(
1166cacd992dSmrg                                     "Left-button",
1167cacd992dSmrg                                     commandWidgetClass,
1168cacd992dSmrg                                     forms[3],
1169cacd992dSmrg                                     NULL);
1170cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)HSyncStart);
1171cacd992dSmrg    w = XtVaCreateManagedWidget(
1172cacd992dSmrg                                     "Right-button",
1173cacd992dSmrg                                     commandWidgetClass,
1174cacd992dSmrg                                     forms[3],
1175cacd992dSmrg                                     NULL);
1176cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)-HSyncStart);
1177cacd992dSmrg    w=  XtVaCreateManagedWidget(
1178cacd992dSmrg                                     "Wider-button",
1179cacd992dSmrg                                     commandWidgetClass,
1180cacd992dSmrg                                     forms[3],
1181cacd992dSmrg                                     NULL);
1182cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)-HTotal);
1183cacd992dSmrg    w = XtVaCreateManagedWidget(
1184cacd992dSmrg                                     "Narrower-button",
1185cacd992dSmrg                                     commandWidgetClass,
1186cacd992dSmrg                                     forms[3],
1187cacd992dSmrg                                     NULL);
1188cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)HTotal);
1189cacd992dSmrg    CreateTyp (forms[4], VDisplay, "VDisplay-label", "VDisplay-text", NULL);
1190cacd992dSmrg    CreateTyp (forms[5], VSyncStart, "VSyncStart-label",
1191cacd992dSmrg		"VSyncStart-text", "VSyncStart-scrollbar");
1192cacd992dSmrg    CreateTyp (forms[6], VSyncEnd, "VSyncEnd-label", "VSyncEnd-text",
1193cacd992dSmrg		"VSyncEnd-scrollbar");
1194cacd992dSmrg    CreateTyp (forms[7], VTotal, "VTotal-label", "VTotal-text",
1195cacd992dSmrg		"VTotal-scrollbar");
1196cacd992dSmrg    w = XtVaCreateManagedWidget(
1197cacd992dSmrg                                     "Up-button",
1198cacd992dSmrg                                     commandWidgetClass,
1199cacd992dSmrg                                     forms[7],
1200cacd992dSmrg                                     NULL);
1201cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)VSyncStart);
1202cacd992dSmrg    w = XtVaCreateManagedWidget(
1203cacd992dSmrg                                     "Down-button",
1204cacd992dSmrg                                     commandWidgetClass,
1205cacd992dSmrg                                     forms[7],
1206cacd992dSmrg                                     NULL);
1207cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)-VSyncStart);
1208cacd992dSmrg    w=  XtVaCreateManagedWidget(
1209cacd992dSmrg                                     "Shorter-button",
1210cacd992dSmrg                                     commandWidgetClass,
1211cacd992dSmrg                                     forms[7],
1212cacd992dSmrg                                     NULL);
1213cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)VTotal);
1214cacd992dSmrg    w = XtVaCreateManagedWidget(
1215cacd992dSmrg                                     "Taller-button",
1216cacd992dSmrg                                     commandWidgetClass,
1217cacd992dSmrg                                     forms[7],
1218cacd992dSmrg                                     NULL);
1219cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)-VTotal);
1220cacd992dSmrg
122114ddf674Smrg    (void) snprintf (buf, sizeof(buf), "%04x", AppRes.field[Flags].val);
1222cacd992dSmrg    wids[0] = XtCreateWidget ("Flags-label", labelWidgetClass,
1223cacd992dSmrg		forms[8], NULL, 0);
1224cacd992dSmrg    wids[1] = XtVaCreateWidget ("Flags-text", asciiTextWidgetClass,
1225cacd992dSmrg		forms[8], XtNstring, buf, XtNtranslations, trans, NULL);
1226cacd992dSmrg    AddCallback (wids[1], XtNcallback, FlagsEditCB, (XtPointer) Flags);
1227cacd992dSmrg    XtManageChildren (wids, 2);
1228cacd992dSmrg    AppRes.field[Flags].textwidget = wids[1];
1229cacd992dSmrg
1230cacd992dSmrg    wids[0] = XtCreateWidget ("Quit-button", commandWidgetClass,
1231cacd992dSmrg		forms[9], NULL, 0);
1232cacd992dSmrg    XtAddCallback (wids[0], XtNcallback, QuitCB, NULL);
1233cacd992dSmrg
1234cacd992dSmrg    wids[1] = XtCreateWidget ("Apply-button", commandWidgetClass,
1235cacd992dSmrg		forms[9], NULL, 0);
1236cacd992dSmrg    XtAddCallback (wids[1], XtNcallback, ApplyCB, NULL);
1237cacd992dSmrg
1238cacd992dSmrg    wids[2] = XtCreateWidget ("AutoApply-toggle", toggleWidgetClass,
1239cacd992dSmrg		forms[9], NULL, 0);
1240cacd992dSmrg    auto_apply_toggle = wids[2];
1241cacd992dSmrg
1242cacd992dSmrg    wids[3] = XtCreateWidget ("Test-button", commandWidgetClass,
1243cacd992dSmrg		forms[9], NULL, 0);
1244cacd992dSmrg    XtAddCallback (wids[3], XtNcallback, TestCB, NULL);
1245cacd992dSmrg
1246cacd992dSmrg    wids[4] = XtCreateWidget ("Restore-button", commandWidgetClass,
1247cacd992dSmrg		forms[9], NULL, 0);
1248cacd992dSmrg    XtAddCallback (wids[4], XtNcallback, RestoreCB, NULL);
1249cacd992dSmrg
1250cacd992dSmrg    XtManageChildren (wids, 5);
1251cacd992dSmrg
1252cacd992dSmrg
1253cacd992dSmrg    CreateTyp (forms[10], PixelClock, "PixelClock-label", "PixelClock-text",
1254cacd992dSmrg	       NULL);
1255cacd992dSmrg    CreateTyp (forms[11], HSyncRate, "HSyncRate-label", "HSyncRate-text",
1256cacd992dSmrg	       NULL);
1257cacd992dSmrg    CreateTyp (forms[12], VSyncRate, "VSyncRate-label", "VSyncRate-text",
1258cacd992dSmrg	       NULL);
1259cacd992dSmrg
1260cacd992dSmrg    wids[0] = XtCreateWidget ("Fetch-button", commandWidgetClass,
1261cacd992dSmrg		forms[13], NULL, 0);
1262cacd992dSmrg    XtAddCallback (wids[0], XtNcallback, FetchCB, NULL);
1263cacd992dSmrg
1264cacd992dSmrg    wids[1] = XtCreateWidget ("Show-button", commandWidgetClass,
1265cacd992dSmrg		forms[13], NULL, 0);
1266cacd992dSmrg    XtAddCallback (wids[1], XtNcallback, ShowCB, NULL);
1267cacd992dSmrg
1268cacd992dSmrg    wids[2] = XtCreateWidget ("Next-button", commandWidgetClass,
1269cacd992dSmrg		forms[13], NULL, 0);
1270cacd992dSmrg    XtAddCallback (wids[2], XtNcallback, SwitchCB, (XtPointer)1);
1271cacd992dSmrg
1272cacd992dSmrg    wids[3] = XtCreateWidget ("Prev-button", commandWidgetClass,
1273cacd992dSmrg		forms[13], NULL, 0);
1274cacd992dSmrg    XtAddCallback (wids[3], XtNcallback, SwitchCB, (XtPointer)-1);
1275cacd992dSmrg
1276cacd992dSmrg    XtManageChildren (wids, 4);
1277cacd992dSmrg
1278cacd992dSmrg    XtManageChildren (forms, 14);
1279cacd992dSmrg
1280cacd992dSmrg    if (S3Specials) {
1281cacd992dSmrg	s3form = XtCreateWidget ("S3-form", formWidgetClass,
1282cacd992dSmrg		form, NULL, 0);
1283cacd992dSmrg	wids[0] = XtVaCreateWidget("InvertVclk-toggle", toggleWidgetClass,
1284cacd992dSmrg			s3form, XtNstate, AppRes.field[InvertVclk].val, NULL);
1285cacd992dSmrg	XtAddCallback (wids[0], XtNcallback, ApplyIfAutoCB, NULL);
1286cacd992dSmrg	AppRes.field[InvertVclk].textwidget = wids[0];
1287cacd992dSmrg	wids[1] = XtVaCreateWidget("EarlySc-toggle", toggleWidgetClass,
1288cacd992dSmrg			s3form, XtNstate, AppRes.field[EarlySc].val, NULL);
1289cacd992dSmrg	XtAddCallback (wids[1], XtNcallback, ApplyIfAutoCB, NULL);
1290cacd992dSmrg	AppRes.field[EarlySc].textwidget = wids[1];
1291cacd992dSmrg	wids[2] = XtCreateWidget("Blank1-label", labelWidgetClass, s3form,
1292cacd992dSmrg			NULL, 0);
1293cacd992dSmrg	wids[3] = XtVaCreateWidget("Blank1Dec-button", commandWidgetClass,
1294cacd992dSmrg				   s3form, NULL);
1295cacd992dSmrg	XtAddCallback (wids[3], XtNcallback, ChangeBlankCB,
1296cacd992dSmrg			(XtPointer)-BlankDelay1);
129714ddf674Smrg	(void) snprintf (buf, sizeof(buf), "%d", AppRes.field[BlankDelay1].val);
1298cacd992dSmrg	wids[4] = XtVaCreateWidget("Blank1-text", asciiTextWidgetClass,
1299cacd992dSmrg			s3form, XtNstring, buf, XtNtranslations, trans, NULL);
1300cacd992dSmrg	AddCallback(wids[4], XtNcallback, BlankEditCB, (XPointer) BlankDelay1);
1301cacd992dSmrg	AppRes.field[BlankDelay1].textwidget = wids[4];
1302cacd992dSmrg	wids[5] = XtVaCreateWidget("Blank1Inc-button", commandWidgetClass,
1303cacd992dSmrg				   s3form, NULL);
1304cacd992dSmrg	XtAddCallback (wids[5], XtNcallback, ChangeBlankCB,
1305cacd992dSmrg			(XtPointer)BlankDelay1);
1306cacd992dSmrg
1307cacd992dSmrg	wids[6] = XtCreateWidget("Blank2-label", labelWidgetClass, s3form,
1308cacd992dSmrg			NULL, 0);
1309cacd992dSmrg	wids[7] = XtVaCreateWidget("Blank2Dec-button", commandWidgetClass,
1310cacd992dSmrg				   s3form, NULL);
1311cacd992dSmrg	XtAddCallback (wids[7], XtNcallback, ChangeBlankCB,
1312cacd992dSmrg			(XtPointer)-BlankDelay2);
131314ddf674Smrg	(void) snprintf (buf, sizeof(buf), "%d", AppRes.field[BlankDelay2].val);
1314cacd992dSmrg	wids[8] = XtVaCreateWidget("Blank2-text", asciiTextWidgetClass,
1315cacd992dSmrg			s3form, XtNstring, buf, XtNtranslations, trans, NULL);
1316cacd992dSmrg	AddCallback(wids[8], XtNcallback, BlankEditCB, (XPointer) BlankDelay2);
1317cacd992dSmrg	AppRes.field[BlankDelay2].textwidget = wids[8];
1318cacd992dSmrg	wids[9] = XtVaCreateWidget("Blank2Inc-button", commandWidgetClass,
1319cacd992dSmrg				   s3form, NULL);
1320cacd992dSmrg	XtAddCallback (wids[9], XtNcallback, ChangeBlankCB,
1321cacd992dSmrg			(XtPointer)BlankDelay2);
1322cacd992dSmrg	XtManageChildren (wids, 10);
1323cacd992dSmrg	XtManageChild(s3form);
1324cacd992dSmrg    }
1325cacd992dSmrg
1326cacd992dSmrg    XtManageChild (form);
1327cacd992dSmrg
1328cacd992dSmrg    SetScrollbars ();
1329cacd992dSmrg    x = DisplayWidth(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 2;
1330cacd992dSmrg    y = DisplayHeight(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 2;
1331cacd992dSmrg
1332cacd992dSmrg    invalid_mode_popup = XtVaCreatePopupShell("invalidMode",
1333cacd992dSmrg			    transientShellWidgetClass, top,
1334cacd992dSmrg			    XtNtitle, "Invalid Mode requested",
1335cacd992dSmrg			    XtNx, x - 20,
1336cacd992dSmrg			    XtNy, y - 40,
1337cacd992dSmrg			    NULL);
1338cacd992dSmrg
1339cacd992dSmrg    testing_popup = XtVaCreatePopupShell("testing",
1340cacd992dSmrg			    transientShellWidgetClass, top,
1341cacd992dSmrg			    XtNtitle, "Testing_1_2_3",
1342cacd992dSmrg			    XtNx, x - 20,
1343cacd992dSmrg			    XtNy, y - 40,
1344cacd992dSmrg			    NULL);
1345cacd992dSmrg    boxW = XtVaCreateManagedWidget(
1346cacd992dSmrg                                   "TestingBox",
1347cacd992dSmrg                                   boxWidgetClass,
1348cacd992dSmrg                                   testing_popup,
1349cacd992dSmrg                                   NULL);
1350cacd992dSmrg
1351cacd992dSmrg    w = XtVaCreateManagedWidget(
1352cacd992dSmrg		   "testingMessage",
1353cacd992dSmrg                   labelWidgetClass,
1354cacd992dSmrg                   boxW,
1355cacd992dSmrg                   NULL);
1356cacd992dSmrg
1357cacd992dSmrg    w = XtVaCreateManagedWidget(
1358cacd992dSmrg                               "Abort",
1359cacd992dSmrg                                commandWidgetClass,
1360cacd992dSmrg                                boxW,
1361cacd992dSmrg                                NULL);
1362cacd992dSmrg
1363cacd992dSmrg    XtAddCallback (w, XtNcallback, (XtCallbackProc) TestTOCB,
1364cacd992dSmrg		  (XtPointer) NULL);
1365cacd992dSmrg
1366cacd992dSmrg    boxW = XtVaCreateManagedWidget(
1367cacd992dSmrg                                   "invalidBox",
1368cacd992dSmrg                                   boxWidgetClass,
1369cacd992dSmrg                                   invalid_mode_popup,
1370cacd992dSmrg                                   NULL);
1371cacd992dSmrg
1372cacd992dSmrg    (void) XtVaCreateManagedWidget(
1373cacd992dSmrg		   "ErrorMessage",
1374cacd992dSmrg                   labelWidgetClass,
1375cacd992dSmrg                   boxW,
1376cacd992dSmrg                   NULL);
1377cacd992dSmrg
1378cacd992dSmrg    popdownW = XtVaCreateManagedWidget(
1379cacd992dSmrg                                     "AckError",
1380cacd992dSmrg                                     commandWidgetClass,
1381cacd992dSmrg                                     boxW,
1382cacd992dSmrg                                     NULL);
1383cacd992dSmrg
1384cacd992dSmrg    XtAddCallback (popdownW, XtNcallback, (XtCallbackProc)popdownInvalid,
1385cacd992dSmrg		   (XtPointer) invalid_mode_popup);
1386cacd992dSmrg}
1387cacd992dSmrg
1388cacd992dSmrgstatic void
1389cacd992dSmrgQuitAction (Widget w, XEvent* e, String* vector, Cardinal* count)
1390cacd992dSmrg{
1391cacd992dSmrg    if ((e->type == ClientMessage
1392cacd992dSmrg      && e->xclient.data.l[0] == (long) wm_delete_window)
1393cacd992dSmrg	|| e->type == KeyPress)
1394cacd992dSmrg	QuitCB(w, NULL, NULL);
1395cacd992dSmrg}
1396cacd992dSmrg
1397cacd992dSmrgstatic void
1398cacd992dSmrgRestoreAction (Widget w, XEvent* e, String* vector, Cardinal* count)
1399cacd992dSmrg{
1400cacd992dSmrg    Boolean state;
1401cacd992dSmrg
1402cacd992dSmrg    RestoreCB(w, NULL, NULL);
1403cacd992dSmrg    XtVaGetValues(auto_apply_toggle, XtNstate, &state, NULL);
1404cacd992dSmrg    if (!state)
1405cacd992dSmrg	ApplyCB (w, NULL, NULL);
1406cacd992dSmrg}
1407cacd992dSmrg
1408cacd992dSmrg
1409cacd992dSmrgstatic void
1410cacd992dSmrgShowAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1411cacd992dSmrg{
1412cacd992dSmrg    ShowCB(w, NULL, NULL);
1413cacd992dSmrg}
1414cacd992dSmrg
1415cacd992dSmrgstatic void
1416cacd992dSmrgMoveLeftAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1417cacd992dSmrg{
1418cacd992dSmrg    AdjustCB(w, (XtPointer)HSyncStart, NULL);
1419cacd992dSmrg}
1420cacd992dSmrg
1421cacd992dSmrgstatic void
1422cacd992dSmrgMoveRightAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1423cacd992dSmrg{
1424cacd992dSmrg    AdjustCB(w, (XtPointer)-HSyncStart, NULL);
1425cacd992dSmrg}
1426cacd992dSmrg
1427cacd992dSmrgstatic void
1428cacd992dSmrgNarrowerAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1429cacd992dSmrg{
1430cacd992dSmrg    AdjustCB(w, (XtPointer)HTotal, NULL);
1431cacd992dSmrg}
1432cacd992dSmrg
1433cacd992dSmrgstatic void
1434cacd992dSmrgWiderAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1435cacd992dSmrg{
1436cacd992dSmrg    AdjustCB(w, (XtPointer)-HTotal, NULL);
1437cacd992dSmrg}
1438cacd992dSmrg
1439cacd992dSmrgstatic void
1440cacd992dSmrgMoveUpAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1441cacd992dSmrg{
1442cacd992dSmrg    AdjustCB(w, (XtPointer)VSyncStart, NULL);
1443cacd992dSmrg}
1444cacd992dSmrg
1445cacd992dSmrgstatic void
1446cacd992dSmrgMoveDownAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1447cacd992dSmrg{
1448cacd992dSmrg    AdjustCB(w, (XtPointer)-VSyncStart, NULL);
1449cacd992dSmrg}
1450cacd992dSmrg
1451cacd992dSmrgstatic void
1452cacd992dSmrgTallerAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1453cacd992dSmrg{
1454cacd992dSmrg    AdjustCB(w, (XtPointer)-VTotal, NULL);
1455cacd992dSmrg}
1456cacd992dSmrg
1457cacd992dSmrgstatic void
1458cacd992dSmrgShorterAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1459cacd992dSmrg{
1460cacd992dSmrg    AdjustCB(w, (XtPointer)VTotal, NULL);
1461cacd992dSmrg}
1462cacd992dSmrg
1463cacd992dSmrgstatic void
1464cacd992dSmrgNextModeAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1465cacd992dSmrg{
1466cacd992dSmrg	SwitchCB(w, (XPointer) 1, NULL);
1467cacd992dSmrg}
1468cacd992dSmrg
1469cacd992dSmrgstatic void
1470cacd992dSmrgPrevModeAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1471cacd992dSmrg{
1472cacd992dSmrg	SwitchCB(w, (XPointer) -1, NULL);
1473cacd992dSmrg}
1474cacd992dSmrg
1475cacd992dSmrg
1476cacd992dSmrg
1477cacd992dSmrgstatic void
1478cacd992dSmrgusage(void)
1479cacd992dSmrg{
1480cacd992dSmrg    fprintf(stderr, "Usage: xvidtune [option]\n");
1481cacd992dSmrg    fprintf(stderr, "    where option is one of:\n");
1482cacd992dSmrg    fprintf(stderr, "        -show                             Print current modeline to stdout\n");
1483cacd992dSmrg    fprintf(stderr, "        -next                             Switch to next video mode\n");
1484cacd992dSmrg    fprintf(stderr, "        -prev                             Switch to previous video mode\n");
1485cacd992dSmrg    fprintf(stderr, "        -unlock                           Enable mode switch hot-keys\n");
1486cacd992dSmrg    fprintf(stderr, "        -timeout [seconds]                Set testmode timeout in seconds,\n");
1487cacd992dSmrg    exit(1);
1488cacd992dSmrg}
1489cacd992dSmrg
1490cacd992dSmrg
1491cacd992dSmrgint
1492cacd992dSmrgmain (int argc, char** argv)
1493cacd992dSmrg{
1494cacd992dSmrg    Widget top;
1495cacd992dSmrg    XtAppContext app;
1496cacd992dSmrg    Display* dpy;
1497cacd992dSmrg    Bool modeSettable = TRUE;
1498cacd992dSmrg
1499cacd992dSmrg    static XtActionsRec actions[] = { { "xvidtune-quit", QuitAction },
1500cacd992dSmrg				      { "xvidtune-restore", RestoreAction },
1501cacd992dSmrg				      { "xvidtune-show", ShowAction },
1502cacd992dSmrg				      {	"xvidtune-moveleft", MoveLeftAction },
1503cacd992dSmrg				      {	"xvidtune-moveright", MoveRightAction },
1504cacd992dSmrg				      {	"xvidtune-wider", WiderAction },
1505cacd992dSmrg				      {	"xvidtune-narrower", NarrowerAction },
1506cacd992dSmrg				      {	"xvidtune-moveup", MoveUpAction },
1507cacd992dSmrg				      {	"xvidtune-movedown", MoveDownAction },
1508cacd992dSmrg				      {	"xvidtune-taller", TallerAction },
1509cacd992dSmrg				      {	"xvidtune-shorter", ShorterAction },
1510cacd992dSmrg				      {	"xvidtune-nextmode", NextModeAction },
1511cacd992dSmrg				      {	"xvidtune-prevmode", PrevModeAction } };
1512cacd992dSmrg
1513cacd992dSmrg    Top = top = XtVaOpenApplication (&app, "Xvidtune", NULL, 0, &argc, argv,
1514cacd992dSmrg		NULL, applicationShellWidgetClass,
1515cacd992dSmrg		XtNmappedWhenManaged, False, NULL);
1516cacd992dSmrg
1517cacd992dSmrg    XtGetApplicationResources (top, (XtPointer)&AppRes,
1518cacd992dSmrg		Resources, XtNumber(Resources),
1519cacd992dSmrg		NULL, 0);
1520cacd992dSmrg
1521cacd992dSmrg    if (!AppRes.ad_installed) {
1522cacd992dSmrg	fprintf(stderr, "Please install the program before using\n");
1523cacd992dSmrg	return 3;
1524cacd992dSmrg    }
1525cacd992dSmrg
1526cacd992dSmrg    if (!XF86VidModeQueryVersion(XtDisplay (top), &MajorVersion, &MinorVersion)) {
1527cacd992dSmrg	fprintf(stderr, "Unable to query video extension version\n");
1528cacd992dSmrg	return 2;
1529cacd992dSmrg    }
1530cacd992dSmrg
1531cacd992dSmrg    if (!XF86VidModeQueryExtension(XtDisplay (top), &EventBase, &ErrorBase)) {
1532cacd992dSmrg	fprintf(stderr, "Unable to query video extension information\n");
1533cacd992dSmrg	return 2;
1534cacd992dSmrg    }
1535cacd992dSmrg
1536cacd992dSmrg    /* Fail if the extension version in the server is too old */
1537cacd992dSmrg    if (MajorVersion < MINMAJOR ||
1538cacd992dSmrg	(MajorVersion == MINMAJOR && MinorVersion < MINMINOR)) {
1539cacd992dSmrg	fprintf(stderr,
1540cacd992dSmrg		"Xserver is running an old XFree86-VidModeExtension version"
1541cacd992dSmrg		" (%d.%d)\n", MajorVersion, MinorVersion);
1542cacd992dSmrg	fprintf(stderr, "Minimum required version is %d.%d\n",
1543cacd992dSmrg		MINMAJOR, MINMINOR);
1544cacd992dSmrg	exit(2);
1545cacd992dSmrg    }
1546cacd992dSmrg
1547cacd992dSmrg    /* This should probably be done differently */
1548cacd992dSmrg
1549cacd992dSmrg    if(  argc == 3  ) { /* this can only be the timeout case */
1550cacd992dSmrg        if(  (!strcmp(argv[1], "-timeout"))  ) {
1551cacd992dSmrg            TestTimeout = ((unsigned long) atol( argv[2] )) * 1000L;
1552cacd992dSmrg	}
1553cacd992dSmrg	else
1554cacd992dSmrg	    usage();
1555cacd992dSmrg    }
1556cacd992dSmrg
1557cacd992dSmrg    if (argc > 1) {
1558cacd992dSmrg	int i = 0;
1559cacd992dSmrg
1560cacd992dSmrg	if (argc != 2)
1561cacd992dSmrg		usage();
1562cacd992dSmrg	if (!strcmp(argv[1], "-show")) {
1563cacd992dSmrg	  if (!GetModeLine(XtDisplay (top), DefaultScreen (XtDisplay (top)))) {
1564cacd992dSmrg	    fprintf(stderr, "Unable to get mode info\n");
1565cacd992dSmrg	    CleanUp(XtDisplay (top));
1566cacd992dSmrg	    return 2;
1567cacd992dSmrg	  }
1568cacd992dSmrg	  ShowCB(top, NULL, NULL);
1569cacd992dSmrg	  return 0;
1570cacd992dSmrg	} else if (!strcmp(argv[1], "-next"))
1571cacd992dSmrg	    i = 1;
1572cacd992dSmrg	else if (!strcmp(argv[1], "-prev"))
1573cacd992dSmrg	    i = -1;
1574cacd992dSmrg	else if (!strcmp(argv[1], "-unlock")) {
1575cacd992dSmrg	    CleanUp(XtDisplay (top));
1576cacd992dSmrg	    XSync(XtDisplay (top), True);
1577cacd992dSmrg	    return 0;
1578cacd992dSmrg	} else
1579cacd992dSmrg		usage();
1580cacd992dSmrg	if (i != 0) {
1581cacd992dSmrg	    XF86VidModeSwitchMode(XtDisplay (top),
1582cacd992dSmrg				  DefaultScreen (XtDisplay (top)), i);
1583cacd992dSmrg	    XSync(XtDisplay (top), True);
1584cacd992dSmrg	    return 0;
1585cacd992dSmrg	}
1586cacd992dSmrg    }
1587cacd992dSmrg    if (!GetMonitor(XtDisplay (top), DefaultScreen (XtDisplay (top)))) {
1588cacd992dSmrg	fprintf(stderr, "Unable to query monitor info\n");
1589cacd992dSmrg	return 2;
1590cacd992dSmrg    }
1591cacd992dSmrg
1592cacd992dSmrg    if (!XF86VidModeLockModeSwitch(XtDisplay (top),
1593cacd992dSmrg				   DefaultScreen (XtDisplay (top)), TRUE)) {
1594cacd992dSmrg	fprintf(stderr, "Failed to disable mode-switch hot-keys\n");
1595cacd992dSmrg	return 2;
1596cacd992dSmrg    }
1597cacd992dSmrg
1598cacd992dSmrg    signal(SIGINT, CatchSig);
1599cacd992dSmrg    signal(SIGQUIT, CatchSig);
1600cacd992dSmrg    signal(SIGTERM, CatchSig);
1601cacd992dSmrg    signal(SIGHUP, CatchSig);
1602cacd992dSmrg    sigId = XtAppAddSignal(app, CatchXtSig, NULL);
1603cacd992dSmrg
1604cacd992dSmrg    if (!GetModeLine(XtDisplay (top), DefaultScreen (XtDisplay (top)))) {
1605cacd992dSmrg	fprintf(stderr, "Unable to get mode info\n");
1606cacd992dSmrg	CleanUp(XtDisplay (top));
1607cacd992dSmrg	return 2;
1608cacd992dSmrg    }
1609cacd992dSmrg
1610cacd992dSmrg    xtErrorfunc = XSetErrorHandler(vidmodeError);
1611cacd992dSmrg
1612cacd992dSmrg    trans = XtParseTranslationTable ("\
1613cacd992dSmrg	<Key>0: insert-char()\n<Key>1: insert-char()\n\
1614cacd992dSmrg	<Key>2: insert-char()\n<Key>3: insert-char()\n\
1615cacd992dSmrg	<Key>4: insert-char()\n<Key>5: insert-char()\n\
1616cacd992dSmrg	<Key>6: insert-char()\n<Key>7: insert-char()\n\
1617cacd992dSmrg	<Key>8: insert-char()\n<Key>9: insert-char()\n\
1618cacd992dSmrg	<Key>a: insert-char()\n<Key>b: insert-char()\n\
1619cacd992dSmrg	<Key>c: insert-char()\n<Key>d: insert-char()\n\
1620cacd992dSmrg	<Key>e: insert-char()\n<Key>f: insert-char()\n\
1621cacd992dSmrg	<Key>+: insert-char()\n<Key>-: insert-char()\n\
1622cacd992dSmrg	<Key>r: xvidtune-restore()\n<Key>q: xvidtune-quit()\n\
1623cacd992dSmrg	<Key>BackSpace: delete-previous-character()\n\
1624cacd992dSmrg	<Key>Right: forward-character()\n<Key>KP_Right: forward-character()\n\
1625cacd992dSmrg	<Key>Left: backward-character()\n<Key>KP_Left: backward-character()\n\
1626cacd992dSmrg	<Key>Delete: delete-previous-character()\n\
1627cacd992dSmrg	<Key>KP_Delete: delete-previous-character()\n\
1628cacd992dSmrg	<EnterWindow>: enter-window()\n<LeaveWindow>: leave-window()\n\
1629cacd992dSmrg	<FocusIn>: focus-in()\n<FocusOut>: focus-out()\n\
1630cacd992dSmrg	<Btn1Down>: select-start()\n");
1631cacd992dSmrg
1632cacd992dSmrg    if (!ModeSettable()) {
163314ddf674Smrg	printf("Video modes are not settable on this chip\n");
1634cacd992dSmrg	displayNoTune(top);
1635cacd992dSmrg	modeSettable = FALSE;
1636cacd992dSmrg    } else
1637cacd992dSmrg	CreateHierarchy (top);
1638cacd992dSmrg
1639cacd992dSmrg
1640cacd992dSmrg    XtAppAddActions (app, actions, XtNumber(actions));
1641cacd992dSmrg
1642cacd992dSmrg    XtOverrideTranslations (top,
1643cacd992dSmrg		XtParseTranslationTable ("<Message>WM_PROTOCOLS: xvidtune-quit()"));
1644cacd992dSmrg
1645cacd992dSmrg    XtRealizeWidget (top);
1646cacd992dSmrg
1647cacd992dSmrg    dpy = XtDisplay(top);
1648cacd992dSmrg
1649cacd992dSmrg    wm_delete_window = XInternAtom (dpy, "WM_DELETE_WINDOW", False);
1650cacd992dSmrg
1651cacd992dSmrg    (void) XSetWMProtocols (dpy, XtWindow (top), &wm_delete_window, 1);
1652cacd992dSmrg
1653cacd992dSmrg    XtMapWidget (top);
1654cacd992dSmrg
1655cacd992dSmrg    if (modeSettable)
1656cacd992dSmrg	displayWarning(top);
1657cacd992dSmrg
1658cacd992dSmrg    /* really we should run our own event dispatching here until the
1659cacd992dSmrg     * warning has been read...
1660cacd992dSmrg     */
1661cacd992dSmrg    XtAppMainLoop (app);
1662cacd992dSmrg
1663cacd992dSmrg    return 0;
1664cacd992dSmrg}
1665