xvidtune.c revision cacd992d
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
52cacd992dSmrgint MajorVersion, MinorVersion;
53cacd992dSmrgint EventBase, ErrorBase;
54cacd992dSmrgint dot_clock, mode_flags;
55cacd992dSmrgunsigned long    TestTimeout=5000;  /* Default test timeout */
56cacd992dSmrgXtSignalId 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)
373cacd992dSmrg	 (void) sprintf (buf, "%04x", sdp->val);
374cacd992dSmrg      else if (i >= PixelClock && i <= VSyncRate)
375cacd992dSmrg	 (void) sprintf (buf, "%6.2f", (float)sdp->val / 1000.0);
376cacd992dSmrg      else if (i == BlankDelay1 || i == BlankDelay2) {
377cacd992dSmrg	 (void) sprintf (buf, "%d", sdp->val);
378cacd992dSmrg      } else
379cacd992dSmrg	 (void) sprintf (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
535cacd992dSmrg    sprintf(tmpbuf, "\"%dx%d\"",
536cacd992dSmrg	   AppRes.field[HDisplay].val, AppRes.field[VDisplay].val);
537cacd992dSmrg    sprintf(modebuf, "%-11s   %6.2f   %4d %4d %4d %4d   %4d %4d %4d %4d",
538cacd992dSmrg	   tmpbuf, (float)dot_clock/1000.0,
539cacd992dSmrg	   AppRes.field[HDisplay].val,
540cacd992dSmrg	   AppRes.field[HSyncStart].val,
541cacd992dSmrg	   AppRes.field[HSyncEnd].val,
542cacd992dSmrg	   AppRes.field[HTotal].val,
543cacd992dSmrg	   AppRes.field[VDisplay].val,
544cacd992dSmrg	   AppRes.field[VSyncStart].val,
545cacd992dSmrg	   AppRes.field[VSyncEnd].val,
546cacd992dSmrg	   AppRes.field[VTotal].val);
547cacd992dSmrg    /* Print out the flags (if any) */
548cacd992dSmrg    if (mode_flags & V_PHSYNC)    strcat(modebuf, " +hsync");
549cacd992dSmrg    if (mode_flags & V_NHSYNC)    strcat(modebuf, " -hsync");
550cacd992dSmrg    if (mode_flags & V_PVSYNC)    strcat(modebuf, " +vsync");
551cacd992dSmrg    if (mode_flags & V_NVSYNC)    strcat(modebuf, " -vsync");
552cacd992dSmrg    if (mode_flags & V_INTERLACE) strcat(modebuf, " interlace");
553cacd992dSmrg    if (mode_flags & V_CSYNC)     strcat(modebuf, " composite");
554cacd992dSmrg    if (mode_flags & V_PCSYNC)    strcat(modebuf, " +csync");
555cacd992dSmrg    if (mode_flags & V_NCSYNC)    strcat(modebuf, " -csync");
556cacd992dSmrg    if (mode_flags & V_DBLSCAN)   strcat(modebuf, " doublescan");
557cacd992dSmrg    printf("%s\n", modebuf);
558cacd992dSmrg    time = XtLastTimestampProcessed(XtDisplay(w));
559cacd992dSmrg    XtOwnSelection(w, XA_PRIMARY, time, ConvertSelection, NULL, NULL);
560cacd992dSmrg    if (S3Specials) {
561cacd992dSmrg	unsigned int i;
562cacd992dSmrg	Boolean state;
563cacd992dSmrg	char *string;
564cacd992dSmrg
565cacd992dSmrg	XtVaGetValues(AppRes.field[InvertVclk].textwidget,
566cacd992dSmrg			XtNstate, &state, NULL);
567cacd992dSmrg	AppRes.field[InvertVclk].val = state ? 1 : 0;
568cacd992dSmrg	XtVaGetValues (AppRes.field[BlankDelay1].textwidget,
569cacd992dSmrg			XtNstring, &string, NULL);
570cacd992dSmrg	(void) sscanf (string, "%x", &i);
571cacd992dSmrg	AppRes.field[BlankDelay1].val = i;
572cacd992dSmrg	XtVaGetValues (AppRes.field[BlankDelay2].textwidget,
573cacd992dSmrg			XtNstring, &string, NULL);
574cacd992dSmrg	(void) sscanf (string, "%x", &i);
575cacd992dSmrg	AppRes.field[BlankDelay2].val = i;
576cacd992dSmrg	XtVaGetValues(AppRes.field[EarlySc].textwidget,
577cacd992dSmrg			XtNstate, &state, NULL);
578cacd992dSmrg	AppRes.field[EarlySc].val = state ? 1 : 0;
579cacd992dSmrg	if (AppRes.field[InvertVclk].val != AppRes.orig[InvertVclk])
580cacd992dSmrg	    printf("InvertVCLK\t\"%dx%d\" %d\n", AppRes.field[HDisplay].val,
581cacd992dSmrg		AppRes.field[VDisplay].val, AppRes.field[InvertVclk].val);
582cacd992dSmrg	if (AppRes.field[EarlySc].val != AppRes.orig[EarlySc])
583cacd992dSmrg	    printf("EarlySC\t\t\"%dx%d\" %d\n", AppRes.field[HDisplay].val,
584cacd992dSmrg		AppRes.field[VDisplay].val, AppRes.field[EarlySc].val);
585cacd992dSmrg	if (AppRes.field[BlankDelay1].val != AppRes.orig[BlankDelay1]
586cacd992dSmrg	    || AppRes.field[BlankDelay2].val != AppRes.orig[BlankDelay2])
587cacd992dSmrg	    printf("BlankDelay\t\"%dx%d\" %d %d\n", AppRes.field[HDisplay].val,
588cacd992dSmrg		AppRes.field[VDisplay].val, AppRes.field[BlankDelay1].val,
589cacd992dSmrg		AppRes.field[BlankDelay2].val);
590cacd992dSmrg    }
591cacd992dSmrg    printf("\n");
592cacd992dSmrg}
593cacd992dSmrg
594cacd992dSmrgstatic void
595cacd992dSmrgAdjustCB(Widget w, XtPointer client, XtPointer call)
596cacd992dSmrg{
597cacd992dSmrg   int what = (long) client;
598cacd992dSmrg   Boolean state;
599cacd992dSmrg
600cacd992dSmrg   switch (what) {
601cacd992dSmrg    case HSyncStart:
602cacd992dSmrg      if (AppRes.field[HSyncEnd].val + 4 < AppRes.field[HTotal].val) {
603cacd992dSmrg	 AppRes.field[HSyncEnd].val += 4;
604cacd992dSmrg	 AppRes.field[HSyncStart].val += 4;
605cacd992dSmrg	 SetLabel(HSyncStart);
606cacd992dSmrg	 SetLabel(HSyncEnd);
607cacd992dSmrg      } else
608cacd992dSmrg	XBell(XtDisplay(w), 80);
609cacd992dSmrg      break;
610cacd992dSmrg    case -HSyncStart:
611cacd992dSmrg      if (AppRes.field[HSyncStart].val - 4 > AppRes.field[HDisplay].val) {
612cacd992dSmrg	 AppRes.field[HSyncEnd].val -= 4;
613cacd992dSmrg	 AppRes.field[HSyncStart].val -= 4;
614cacd992dSmrg	 SetLabel(HSyncStart);
615cacd992dSmrg	 SetLabel(HSyncEnd);
616cacd992dSmrg      } else
617cacd992dSmrg	XBell(XtDisplay(w), 80);
618cacd992dSmrg      break;
619cacd992dSmrg    case HTotal:
620cacd992dSmrg      AppRes.field[HTotal].val += 4;
621cacd992dSmrg      SetLabel(HTotal);
622cacd992dSmrg      UpdateSyncRates(TRUE);
623cacd992dSmrg      break;
624cacd992dSmrg    case -HTotal:
625cacd992dSmrg      if (AppRes.field[HTotal].val - 4 >  AppRes.field[HSyncEnd].val) {
626cacd992dSmrg	AppRes.field[HTotal].val -= 4;
627cacd992dSmrg	SetLabel(HTotal);
628cacd992dSmrg	UpdateSyncRates(TRUE);
629cacd992dSmrg      } else
630cacd992dSmrg	XBell(XtDisplay(w), 80);
631cacd992dSmrg      break;
632cacd992dSmrg    case VSyncStart:
633cacd992dSmrg      if (AppRes.field[VSyncEnd].val + 4 < AppRes.field[VTotal].val) {
634cacd992dSmrg	 AppRes.field[VSyncEnd].val += 4;
635cacd992dSmrg	 AppRes.field[VSyncStart].val += 4;
636cacd992dSmrg	 SetLabel(VSyncStart);
637cacd992dSmrg	 SetLabel(VSyncEnd);
638cacd992dSmrg      } else
639cacd992dSmrg	XBell(XtDisplay(w), 80);
640cacd992dSmrg      break;
641cacd992dSmrg    case -VSyncStart:
642cacd992dSmrg      if (AppRes.field[VSyncStart].val - 4 > AppRes.field[VDisplay].val) {
643cacd992dSmrg	 AppRes.field[VSyncEnd].val -= 4;
644cacd992dSmrg	 AppRes.field[VSyncStart].val -= 4;
645cacd992dSmrg	 SetLabel(VSyncStart);
646cacd992dSmrg	 SetLabel(VSyncEnd);
647cacd992dSmrg      } else
648cacd992dSmrg	XBell(XtDisplay(w), 80);
649cacd992dSmrg      break;
650cacd992dSmrg    case VTotal:
651cacd992dSmrg      AppRes.field[VTotal].val += 4;
652cacd992dSmrg      SetLabel(VTotal);
653cacd992dSmrg      UpdateSyncRates(TRUE);
654cacd992dSmrg      break;
655cacd992dSmrg    case -VTotal:
656cacd992dSmrg      if (AppRes.field[VTotal].val - 4 >  AppRes.field[VSyncEnd].val) {
657cacd992dSmrg	AppRes.field[VTotal].val -= 4;
658cacd992dSmrg	SetLabel(VTotal);
659cacd992dSmrg	UpdateSyncRates(TRUE);
660cacd992dSmrg      } else
661cacd992dSmrg	XBell(XtDisplay(w), 80);
662cacd992dSmrg      break;
663cacd992dSmrg   }
664cacd992dSmrg   SetScrollbars ();
665cacd992dSmrg   XtVaGetValues(auto_apply_toggle, XtNstate, &state, NULL);
666cacd992dSmrg   if (state)
667cacd992dSmrg       ApplyCB (w, client, call);
668cacd992dSmrg}
669cacd992dSmrg
670cacd992dSmrg
671cacd992dSmrg#if 0
672cacd992dSmrgstatic void
673cacd992dSmrgEditCB (Widget w, XtPointer client, XtPointer call)
674cacd992dSmrg{
675cacd992dSmrg    int base, current, i, len;
676cacd992dSmrg    int lower, upper;
677cacd992dSmrg    float percent;
678cacd992dSmrg    ScrollData* sdp = (ScrollData*) client;
679cacd992dSmrg
680cacd992dSmrg    len = strlen (sdp->string);
681cacd992dSmrg
682cacd992dSmrg    for (i = 0; i < len; i++) {
683cacd992dSmrg	if (!(isdigit (sdp->string[i]) || isspace (sdp->string[i]))) {
684cacd992dSmrg	    XBell (XtDisplay(XtParent(w)), 100);
685cacd992dSmrg	    return;
686cacd992dSmrg	}
687cacd992dSmrg    }
688cacd992dSmrg    switch (sdp->me) {
689cacd992dSmrg    case HSyncStart:
690cacd992dSmrg	lower = atoi (AppRes.field[HDisplay].string);
691cacd992dSmrg	upper = atoi (AppRes.field[HSyncEnd].string);
692cacd992dSmrg	break;
693cacd992dSmrg
694cacd992dSmrg    case HSyncEnd:
695cacd992dSmrg	lower = atoi (AppRes.field[HSyncStart].string);
696cacd992dSmrg	upper = atoi (AppRes.field[HTotal].string);
697cacd992dSmrg	break;
698cacd992dSmrg
699cacd992dSmrg    case HTotal:
700cacd992dSmrg	lower = atoi (AppRes.field[HSyncEnd].string);
701cacd992dSmrg	upper = atoi (AppRes.field[HDisplay].string) +
702cacd992dSmrg		AppRes.field[HTotal].range;
703cacd992dSmrg	break;
704cacd992dSmrg
705cacd992dSmrg    case VSyncStart:
706cacd992dSmrg	lower = atoi (AppRes.field[VDisplay].string);
707cacd992dSmrg	upper = atoi (AppRes.field[VSyncEnd].string);
708cacd992dSmrg	break;
709cacd992dSmrg
710cacd992dSmrg    case VSyncEnd:
711cacd992dSmrg	lower = atoi (AppRes.field[VSyncStart].string);
712cacd992dSmrg	upper = atoi (AppRes.field[VTotal].string);
713cacd992dSmrg	break;
714cacd992dSmrg
715cacd992dSmrg    case VTotal:
716cacd992dSmrg	lower = atoi (AppRes.field[VSyncEnd].string);
717cacd992dSmrg	upper = atoi (AppRes.field[VDisplay].string) +
718cacd992dSmrg		AppRes.field[VTotal].range;
719cacd992dSmrg	break;
720cacd992dSmrg    }
721cacd992dSmrg    current = atoi (sdp->string);
722cacd992dSmrg    if (current < lower || current > upper) {
723cacd992dSmrg	XawTextBlock text;
724cacd992dSmrg	char tmp[6];
725cacd992dSmrg
726cacd992dSmrg	if (current < lower) {
727cacd992dSmrg	    (void) sprintf (tmp, "%5d", lower);
728cacd992dSmrg	    current = lower;
729cacd992dSmrg	} else {
730cacd992dSmrg	    (void) sprintf (tmp, "%5d", upper);
731cacd992dSmrg	    current = upper;
732cacd992dSmrg	}
733cacd992dSmrg	text.firstPos = 0;
734cacd992dSmrg	text.length = strlen (tmp);
735cacd992dSmrg	text.ptr = tmp;
736cacd992dSmrg	text.format = XawFmt8Bit;
737cacd992dSmrg	XawTextReplace (sdp->textwidget, 0, text.length, &text);
738cacd992dSmrg    }
739cacd992dSmrg    base = atoi (AppRes.field[sdp->use].string);
740cacd992dSmrg    percent = ((float)(current - base)) / ((float)sdp->range);
741cacd992dSmrg    XawScrollbarSetThumb (sdp->scrollwidget, percent, 0.0);
742cacd992dSmrg}
743cacd992dSmrg#endif
744cacd992dSmrg
745cacd992dSmrgstatic void
746cacd992dSmrgFlagsEditCB (Widget w, XtPointer client, XtPointer call)
747cacd992dSmrg{
748cacd992dSmrg    int i, len;
749cacd992dSmrg    char* string;
750cacd992dSmrg    fields findex = (fields) (unsigned long) client;
751cacd992dSmrg    ScrollData* sdp = &AppRes.field[findex];
752cacd992dSmrg
753cacd992dSmrg    XtVaGetValues (w, XtNstring, &string, NULL);
754cacd992dSmrg    len = strlen (string);
755cacd992dSmrg    if (len > 4) {
756cacd992dSmrg	char buf[5];
757cacd992dSmrg
758cacd992dSmrg	XBell (XtDisplay(XtParent(w)), 100);
759cacd992dSmrg	(void) strncpy (buf, string, 4);
760cacd992dSmrg	buf[4] = '\0';
761cacd992dSmrg	XtVaSetValues (sdp->textwidget, XtNstring, buf, NULL);
762cacd992dSmrg	XawTextSetInsertionPoint (sdp->textwidget, 4);
763cacd992dSmrg    }
764cacd992dSmrg
765cacd992dSmrg    for (i = 0; i < len; i++) {
766cacd992dSmrg	if (!isxdigit (string[i])) {
767cacd992dSmrg	    XBell (XtDisplay(XtParent(w)), 100);
768cacd992dSmrg	}
769cacd992dSmrg    }
770cacd992dSmrg}
771cacd992dSmrg
772cacd992dSmrgstatic void
773cacd992dSmrgBlankEditCB (Widget w, XtPointer client, XtPointer call)
774cacd992dSmrg{
775cacd992dSmrg    int len;
776cacd992dSmrg    char* string;
777cacd992dSmrg    fields findex = (fields) (unsigned long) client;
778cacd992dSmrg    ScrollData* sdp = &AppRes.field[findex];
779cacd992dSmrg    char buf[2], old;
780cacd992dSmrg    Boolean state;
781cacd992dSmrg    Boolean noAuto = False;
782cacd992dSmrg
783cacd992dSmrg    XtVaGetValues (w, XtNstring, &string, NULL);
784cacd992dSmrg    len = strlen (string);
785cacd992dSmrg    if (len == 0) {
786cacd992dSmrg	XBell (XtDisplay(XtParent(w)), 100);
787cacd992dSmrg	strcpy(buf, "0");
788cacd992dSmrg	XtVaSetValues (sdp->textwidget, XtNstring, buf, NULL);
789cacd992dSmrg	XawTextSetInsertionPoint (sdp->textwidget, 1);
790cacd992dSmrg        return;
791cacd992dSmrg    }
792cacd992dSmrg    if (len > 1) {
793cacd992dSmrg	if (XawTextGetInsertionPoint(sdp->textwidget) < 1) {
794cacd992dSmrg	    buf[0] = string[0];
795cacd992dSmrg	    old = string[1];
796cacd992dSmrg	} else {
797cacd992dSmrg	    buf[0] = string[1];
798cacd992dSmrg	    old = string[0];
799cacd992dSmrg	}
800cacd992dSmrg	if (buf[0] == '+' && old < '7')
801cacd992dSmrg	    buf[0] = old + 1;
802cacd992dSmrg	else if (buf[0] == '-' && old > '0')
803cacd992dSmrg	    buf[0] = old - 1;
804cacd992dSmrg	if (!isdigit(buf[0]) || buf[0] > '7') {
805cacd992dSmrg	    XBell (XtDisplay(XtParent(w)), 100);
806cacd992dSmrg	    buf[0] = old;
807cacd992dSmrg	    if (!isdigit(buf[0]) || buf[0] > '7')
808cacd992dSmrg		buf[0] = '0';
809cacd992dSmrg	    noAuto = True;
810cacd992dSmrg	}
811cacd992dSmrg	buf[1] = '\0';
812cacd992dSmrg	XtVaSetValues (sdp->textwidget, XtNstring, buf, NULL);
813cacd992dSmrg	XawTextSetInsertionPoint (sdp->textwidget, 1);
814cacd992dSmrg    }
815cacd992dSmrg    XtVaGetValues(auto_apply_toggle, XtNstate, &state, NULL);
816cacd992dSmrg    if (state && !noAuto)
817cacd992dSmrg	ApplyCB (sdp->textwidget, client, call);
818cacd992dSmrg}
819cacd992dSmrg
820cacd992dSmrgstatic void
821cacd992dSmrgChangeBlankCB (Widget w, XtPointer client, XtPointer call)
822cacd992dSmrg{
823cacd992dSmrg    char* string;
824cacd992dSmrg    char buf[2];
825cacd992dSmrg    fields findex;
826cacd992dSmrg    ScrollData* sdp;
827cacd992dSmrg    Boolean state;
828cacd992dSmrg    int what = (long) client;
829cacd992dSmrg
830cacd992dSmrg
831cacd992dSmrg    if (what < 0)
832cacd992dSmrg	findex = (fields)-what;
833cacd992dSmrg    else
834cacd992dSmrg	findex = (fields)what;
835cacd992dSmrg    sdp = &AppRes.field[findex];
836cacd992dSmrg
837cacd992dSmrg    XtVaGetValues (sdp->textwidget, XtNstring, &string, NULL);
838cacd992dSmrg    if (what > 0)
839cacd992dSmrg	string[0]++;
840cacd992dSmrg    else
841cacd992dSmrg	string[0]--;
842cacd992dSmrg
843cacd992dSmrg    if (string[0] < '0' || string[0] > '7') {
844cacd992dSmrg	XBell (XtDisplay(XtParent(w)), 100);
845cacd992dSmrg	return;
846cacd992dSmrg    }
847cacd992dSmrg
848cacd992dSmrg    buf[0] = string[0];
849cacd992dSmrg    buf[1] = '\0';
850cacd992dSmrg    XtVaSetValues (sdp->textwidget, XtNstring, buf, NULL);
851cacd992dSmrg    XawTextSetInsertionPoint (sdp->textwidget, 1);
852cacd992dSmrg
853cacd992dSmrg    XtVaGetValues(auto_apply_toggle, XtNstate, &state, NULL);
854cacd992dSmrg    if (state)
855cacd992dSmrg	ApplyCB (sdp->textwidget, client, call);
856cacd992dSmrg}
857cacd992dSmrg
858cacd992dSmrgstatic int
859cacd992dSmrgisValid(int val, int field)
860cacd992dSmrg{
861cacd992dSmrg   switch(field) {
862cacd992dSmrg     case HSyncStart:
863cacd992dSmrg	if (val+8 > AppRes.field[HSyncEnd].val)
864cacd992dSmrg	   val = AppRes.field[HSyncEnd].val - 8;
865cacd992dSmrg        break;
866cacd992dSmrg     case HSyncEnd:
867cacd992dSmrg        if (val-8 < AppRes.field[HSyncStart].val)
868cacd992dSmrg	    val = AppRes.field[HSyncStart].val + 8;
869cacd992dSmrg        if (val > AppRes.field[HTotal].val)
870cacd992dSmrg	    val = AppRes.field[HTotal].val;
871cacd992dSmrg        break;
872cacd992dSmrg     case HTotal:
873cacd992dSmrg	if (val < AppRes.field[HSyncEnd].val)
874cacd992dSmrg	   val = AppRes.field[HSyncEnd].val;
875cacd992dSmrg         break;
876cacd992dSmrg     case VSyncStart:
877cacd992dSmrg	if (val+8 > AppRes.field[VSyncEnd].val)
878cacd992dSmrg	   val = AppRes.field[VSyncEnd].val - 8;
879cacd992dSmrg        break;
880cacd992dSmrg     case VSyncEnd:
881cacd992dSmrg        if (val-8 < AppRes.field[VSyncStart].val)
882cacd992dSmrg	    val = AppRes.field[VSyncStart].val + 8;
883cacd992dSmrg        if (val > AppRes.field[VTotal].val)
884cacd992dSmrg	    val = AppRes.field[VTotal].val;
885cacd992dSmrg        break;
886cacd992dSmrg     case VTotal:
887cacd992dSmrg	if (val < AppRes.field[VSyncEnd].val)
888cacd992dSmrg	   val = AppRes.field[VSyncEnd].val;
889cacd992dSmrg        break;
890cacd992dSmrg   }
891cacd992dSmrg   return val;
892cacd992dSmrg}
893cacd992dSmrg
894cacd992dSmrgstatic void
895cacd992dSmrgScrollCB (Widget w, XtPointer client, XtPointer call)
896cacd992dSmrg{
897cacd992dSmrg    float percent = *(float*) call;
898cacd992dSmrg    int ipercent = percent * 100;
899cacd992dSmrg    int fieldindex = (long) client;
900cacd992dSmrg    ScrollData* sdp = &AppRes.field[fieldindex];
901cacd992dSmrg
902cacd992dSmrg
903cacd992dSmrg
904cacd992dSmrg    if (ipercent != sdp->lastpercent) {
905cacd992dSmrg        int tmp_val;
906cacd992dSmrg	char buf[6];
907cacd992dSmrg
908cacd992dSmrg	tmp_val = AppRes.field[sdp->use].val;
909cacd992dSmrg	tmp_val += (int) (((float)sdp->range) * percent);
910cacd992dSmrg
911cacd992dSmrg        sdp->val = isValid(tmp_val, fieldindex);
912cacd992dSmrg
913cacd992dSmrg	sdp->lastpercent = ipercent;
914cacd992dSmrg	(void) sprintf (buf, "%5d", sdp->val);
915cacd992dSmrg	XtVaSetValues (sdp->textwidget, XtNlabel, buf, NULL);
916cacd992dSmrg        if (sdp->val != tmp_val) {
917cacd992dSmrg            int base;
918cacd992dSmrg            float percent;
919cacd992dSmrg
920cacd992dSmrg            base = AppRes.field[sdp->use].val;
921cacd992dSmrg            percent = ((float)(sdp->val - base)) / ((float)sdp->range);
922cacd992dSmrg            /* This doesn't always work, why? */
923cacd992dSmrg            XawScrollbarSetThumb (sdp->scrollwidget, percent, 0.0);
924cacd992dSmrg	}
925cacd992dSmrg	if (fieldindex == HTotal || fieldindex == VTotal)
926cacd992dSmrg	    UpdateSyncRates(TRUE);
927cacd992dSmrg    }
928cacd992dSmrg}
929cacd992dSmrg
930cacd992dSmrgstatic void
931cacd992dSmrgSwitchCB (Widget w, XtPointer client, XtPointer call)
932cacd992dSmrg{
933cacd992dSmrg    XF86VidModeLockModeSwitch(XtDisplay(w), DefaultScreen (XtDisplay (w)),
934cacd992dSmrg			      FALSE);
935cacd992dSmrg    XF86VidModeSwitchMode(XtDisplay(w), DefaultScreen (XtDisplay (w)),
936cacd992dSmrg			  (int)(long) client);
937cacd992dSmrg    XF86VidModeLockModeSwitch(XtDisplay(w), DefaultScreen (XtDisplay (w)),
938cacd992dSmrg			      TRUE);
939cacd992dSmrg    FetchCB(w, NULL, NULL);
940cacd992dSmrg}
941cacd992dSmrg
942cacd992dSmrgstatic void
943cacd992dSmrgAddCallback (
944cacd992dSmrg    Widget w,
945cacd992dSmrg    String  callback_name,
946cacd992dSmrg    XtCallbackProc callback,
947cacd992dSmrg    XtPointer client_data)
948cacd992dSmrg{
949cacd992dSmrg    Widget src;
950cacd992dSmrg
951cacd992dSmrg    XtVaGetValues (w, XtNtextSource, &src, NULL);
952cacd992dSmrg    XtAddCallback (src, callback_name, callback, client_data);
953cacd992dSmrg}
954cacd992dSmrg
955cacd992dSmrgstatic void
956cacd992dSmrgCreateTyp (
957cacd992dSmrg    Widget form,
958cacd992dSmrg    fields findex,
959cacd992dSmrg    String w1name,
960cacd992dSmrg    String w2name,
961cacd992dSmrg    String w3name)
962cacd992dSmrg{
963cacd992dSmrg    Widget wids[3];
964cacd992dSmrg    char buf[10];
965cacd992dSmrg
966cacd992dSmrg    wids[0] = XtCreateWidget (w1name, labelWidgetClass, form, NULL, 0);
967cacd992dSmrg    if (findex >= PixelClock && findex <= VSyncRate)
968cacd992dSmrg	(void) sprintf(buf, "%6.2f", (float)AppRes.field[findex].val / 1000.0);
969cacd992dSmrg    else
970cacd992dSmrg	(void) sprintf (buf, "%5d", AppRes.field[findex].val);
971cacd992dSmrg    wids[1] = XtVaCreateWidget (w2name, labelWidgetClass,
972cacd992dSmrg		form, XtNlabel, buf, NULL);
973cacd992dSmrg    if (w3name != NULL) {
974cacd992dSmrg	wids[2] = XtCreateWidget (w3name, scrollbarWidgetClass, form, NULL, 0);
975cacd992dSmrg	XtAddCallback (wids[2], XtNjumpProc, ScrollCB, (XtPointer) findex);
976cacd992dSmrg	XtManageChildren (wids, 3);
977cacd992dSmrg    } else {
978cacd992dSmrg	wids[2] = (Widget) NULL;
979cacd992dSmrg	XtManageChildren (wids, 2);
980cacd992dSmrg    }
981cacd992dSmrg    AppRes.field[findex].textwidget = wids[1];
982cacd992dSmrg    AppRes.field[findex].scrollwidget = wids[2];
983cacd992dSmrg}
984cacd992dSmrg
985cacd992dSmrg
986cacd992dSmrgstatic void
987cacd992dSmrgAckWarn (Widget w, XtPointer client, XtPointer call)
988cacd992dSmrg{
989cacd992dSmrg    XtPopdown((Widget) client);
990cacd992dSmrg    XtDestroyWidget((Widget) client);
991cacd992dSmrg}
992cacd992dSmrg
993cacd992dSmrgstatic void
994cacd992dSmrgAckNoTune (Widget w, XtPointer client, XtPointer call)
995cacd992dSmrg{
996cacd992dSmrg    CleanUp(XtDisplay(w));
997cacd992dSmrg#if XtSpecificationRelease < 6
998cacd992dSmrg    exit (0);
999cacd992dSmrg#else
1000cacd992dSmrg    XtAppSetExitFlag (XtWidgetToApplicationContext (w));
1001cacd992dSmrg#endif
1002cacd992dSmrg}
1003cacd992dSmrg
1004cacd992dSmrgstatic void
1005cacd992dSmrgdisplayWarning(Widget top)
1006cacd992dSmrg{
1007cacd992dSmrg    Widget w, popup, popupBox;
1008cacd992dSmrg    int x, y;
1009cacd992dSmrg
1010cacd992dSmrg    x =  DisplayWidth(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 3;
1011cacd992dSmrg    y =  DisplayHeight(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 3;
1012cacd992dSmrg
1013cacd992dSmrg    popup = XtVaCreatePopupShell("Warning",
1014cacd992dSmrg			    transientShellWidgetClass, top,
1015cacd992dSmrg			    XtNtitle, "WARNING",
1016cacd992dSmrg			    XtNx, x,
1017cacd992dSmrg			    XtNy, y,
1018cacd992dSmrg			    NULL);
1019cacd992dSmrg
1020cacd992dSmrg    popupBox = XtVaCreateManagedWidget(
1021cacd992dSmrg               "WarningBox",
1022cacd992dSmrg               boxWidgetClass,
1023cacd992dSmrg               popup,
1024cacd992dSmrg               NULL);
1025cacd992dSmrg
1026cacd992dSmrg    w = XtVaCreateManagedWidget( "WarnLabel",
1027cacd992dSmrg                                     labelWidgetClass,
1028cacd992dSmrg				     popupBox,
1029cacd992dSmrg                                     NULL);
1030cacd992dSmrg
1031cacd992dSmrg    w = XtVaCreateManagedWidget( "WarnOK",
1032cacd992dSmrg                                     commandWidgetClass,
1033cacd992dSmrg				     popupBox,
1034cacd992dSmrg                                     NULL);
1035cacd992dSmrg
1036cacd992dSmrg    XtAddCallback (w, XtNcallback, AckWarn, (XtPointer)popup);
1037cacd992dSmrg
1038cacd992dSmrg    w = XtVaCreateManagedWidget( "WarnCancel",
1039cacd992dSmrg                                     commandWidgetClass,
1040cacd992dSmrg				     popupBox,
1041cacd992dSmrg                                     NULL);
1042cacd992dSmrg    XtAddCallback (w, XtNcallback, QuitCB, (XtPointer)NULL);
1043cacd992dSmrg
1044cacd992dSmrg    XtPopup(popup, XtGrabExclusive);
1045cacd992dSmrg
1046cacd992dSmrg}
1047cacd992dSmrg
1048cacd992dSmrgstatic void
1049cacd992dSmrgdisplayNoTune(Widget top)
1050cacd992dSmrg{
1051cacd992dSmrg    Widget w, popup, popupBox;
1052cacd992dSmrg
1053cacd992dSmrg    popup = XtCreateWidget ("Notice", formWidgetClass, top, NULL, 0);
1054cacd992dSmrg    popupBox = XtVaCreateManagedWidget(
1055cacd992dSmrg               "WarningBox",
1056cacd992dSmrg               boxWidgetClass,
1057cacd992dSmrg               popup,
1058cacd992dSmrg               NULL);
1059cacd992dSmrg
1060cacd992dSmrg    w = XtVaCreateManagedWidget( "NoTuneLabel",
1061cacd992dSmrg                                     labelWidgetClass,
1062cacd992dSmrg				     popupBox,
1063cacd992dSmrg                                     NULL);
1064cacd992dSmrg
1065cacd992dSmrg    w = XtVaCreateManagedWidget( "NoTuneOK",
1066cacd992dSmrg                                     commandWidgetClass,
1067cacd992dSmrg				     popupBox,
1068cacd992dSmrg                                     NULL);
1069cacd992dSmrg
1070cacd992dSmrg    XtAddCallback (w, XtNcallback, AckNoTune, (XtPointer)popup);
1071cacd992dSmrg
1072cacd992dSmrg    XtManageChild (popup);
1073cacd992dSmrg}
1074cacd992dSmrg
1075cacd992dSmrg#if 0
1076cacd992dSmrgstatic void
1077cacd992dSmrgs3Special(Widget top)
1078cacd992dSmrg{
1079cacd992dSmrg    Widget w, popup, form, invert_vclk_toggle, wids[6];
1080cacd992dSmrg    char buf1[5] = {'\0',};
1081cacd992dSmrg    int x, y;
1082cacd992dSmrg
1083cacd992dSmrg    x =  DisplayWidth(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 3;
1084cacd992dSmrg    y =  DisplayHeight(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 3;
1085cacd992dSmrg
1086cacd992dSmrg    popup = XtVaCreatePopupShell("S3Adjust",
1087cacd992dSmrg			    transientShellWidgetClass, top,
1088cacd992dSmrg			    XtNtitle, "S3Adjust",
1089cacd992dSmrg			    XtNx, x,
1090cacd992dSmrg			    XtNy, y,
1091cacd992dSmrg			    NULL);
1092cacd992dSmrg
1093cacd992dSmrg    form = XtVaCreateManagedWidget(
1094cacd992dSmrg               "S3Box",
1095cacd992dSmrg               formWidgetClass,
1096cacd992dSmrg               popup,
1097cacd992dSmrg               NULL);
1098cacd992dSmrg
1099cacd992dSmrg    w = XtVaCreateManagedWidget( "S3Title",
1100cacd992dSmrg                                     labelWidgetClass,
1101cacd992dSmrg				     form,
1102cacd992dSmrg                                     NULL);
1103cacd992dSmrg
1104cacd992dSmrg    invert_vclk_toggle = XtVaCreateManagedWidget( "InvertVclk-toggle",
1105cacd992dSmrg                                     toggleWidgetClass,
1106cacd992dSmrg				     form,
1107cacd992dSmrg                                     NULL);
1108cacd992dSmrg
1109cacd992dSmrg    wids[0] = XtCreateWidget ("Blank1-label", labelWidgetClass,
1110cacd992dSmrg		form, NULL, 0);
1111cacd992dSmrg    wids[1] = XtVaCreateWidget ("Blank1-text", asciiTextWidgetClass,
1112cacd992dSmrg		form, XtNstring, buf1, NULL);
1113cacd992dSmrg    AddCallback (wids[1], XtNcallback, FlagsEditCB, (XtPointer) NULL);
1114cacd992dSmrg
1115cacd992dSmrg    XtManageChildren (wids, 2);
1116cacd992dSmrg
1117cacd992dSmrg    XtPopup(popup, XtGrabNone);
1118cacd992dSmrg
1119cacd992dSmrg}
1120cacd992dSmrg#endif
1121cacd992dSmrg
1122cacd992dSmrg
1123cacd992dSmrg
1124cacd992dSmrgstatic void
1125cacd992dSmrgCreateHierarchy(Widget top)
1126cacd992dSmrg{
1127cacd992dSmrg    char buf[5];
1128cacd992dSmrg    Widget form, forms[14], s3form;
1129cacd992dSmrg    Widget wids[10];
1130cacd992dSmrg    Widget boxW, popdownW, w;
1131cacd992dSmrg    int i;
1132cacd992dSmrg    int x, y;
1133cacd992dSmrg    static String form_names[] = {
1134cacd992dSmrg	"HDisplay-form",
1135cacd992dSmrg	"HSyncStart-form",
1136cacd992dSmrg	"HSyncEnd-form",
1137cacd992dSmrg	"HTotal-form",
1138cacd992dSmrg	"VDisplay-form",
1139cacd992dSmrg	"VSyncStart-form",
1140cacd992dSmrg	"VSyncEnd-form",
1141cacd992dSmrg	"VTotal-form",
1142cacd992dSmrg	"Flags-form",
1143cacd992dSmrg	"Buttons-form",
1144cacd992dSmrg	"PixelClock-form",
1145cacd992dSmrg	"HSyncRate-form",
1146cacd992dSmrg	"VSyncRate-form",
1147cacd992dSmrg	"Buttons2-form",
1148cacd992dSmrg	};
1149cacd992dSmrg
1150cacd992dSmrg    form = XtCreateWidget ("form", formWidgetClass, top, NULL, 0);
1151cacd992dSmrg    for (i = 0; i < 14; i++)
1152cacd992dSmrg	forms[i] = XtCreateWidget (form_names[i], formWidgetClass,
1153cacd992dSmrg		form, NULL, 0);
1154cacd992dSmrg
1155cacd992dSmrg    CreateTyp (forms[0], HDisplay, "HDisplay-label", "HDisplay-text", NULL);
1156cacd992dSmrg    CreateTyp (forms[1], HSyncStart, "HSyncStart-label",
1157cacd992dSmrg		"HSyncStart-text", "HSyncStart-scrollbar");
1158cacd992dSmrg    CreateTyp (forms[2], HSyncEnd, "HSyncEnd-label", "HSyncEnd-text",
1159cacd992dSmrg		"HSyncEnd-scrollbar");
1160cacd992dSmrg    CreateTyp (forms[3], HTotal, "HTotal-label", "HTotal-text",
1161cacd992dSmrg		"HTotal-scrollbar");
1162cacd992dSmrg
1163cacd992dSmrg    w = XtVaCreateManagedWidget(
1164cacd992dSmrg                                     "Left-button",
1165cacd992dSmrg                                     commandWidgetClass,
1166cacd992dSmrg                                     forms[3],
1167cacd992dSmrg                                     NULL);
1168cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)HSyncStart);
1169cacd992dSmrg    w = XtVaCreateManagedWidget(
1170cacd992dSmrg                                     "Right-button",
1171cacd992dSmrg                                     commandWidgetClass,
1172cacd992dSmrg                                     forms[3],
1173cacd992dSmrg                                     NULL);
1174cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)-HSyncStart);
1175cacd992dSmrg    w=  XtVaCreateManagedWidget(
1176cacd992dSmrg                                     "Wider-button",
1177cacd992dSmrg                                     commandWidgetClass,
1178cacd992dSmrg                                     forms[3],
1179cacd992dSmrg                                     NULL);
1180cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)-HTotal);
1181cacd992dSmrg    w = XtVaCreateManagedWidget(
1182cacd992dSmrg                                     "Narrower-button",
1183cacd992dSmrg                                     commandWidgetClass,
1184cacd992dSmrg                                     forms[3],
1185cacd992dSmrg                                     NULL);
1186cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)HTotal);
1187cacd992dSmrg    CreateTyp (forms[4], VDisplay, "VDisplay-label", "VDisplay-text", NULL);
1188cacd992dSmrg    CreateTyp (forms[5], VSyncStart, "VSyncStart-label",
1189cacd992dSmrg		"VSyncStart-text", "VSyncStart-scrollbar");
1190cacd992dSmrg    CreateTyp (forms[6], VSyncEnd, "VSyncEnd-label", "VSyncEnd-text",
1191cacd992dSmrg		"VSyncEnd-scrollbar");
1192cacd992dSmrg    CreateTyp (forms[7], VTotal, "VTotal-label", "VTotal-text",
1193cacd992dSmrg		"VTotal-scrollbar");
1194cacd992dSmrg    w = XtVaCreateManagedWidget(
1195cacd992dSmrg                                     "Up-button",
1196cacd992dSmrg                                     commandWidgetClass,
1197cacd992dSmrg                                     forms[7],
1198cacd992dSmrg                                     NULL);
1199cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)VSyncStart);
1200cacd992dSmrg    w = XtVaCreateManagedWidget(
1201cacd992dSmrg                                     "Down-button",
1202cacd992dSmrg                                     commandWidgetClass,
1203cacd992dSmrg                                     forms[7],
1204cacd992dSmrg                                     NULL);
1205cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)-VSyncStart);
1206cacd992dSmrg    w=  XtVaCreateManagedWidget(
1207cacd992dSmrg                                     "Shorter-button",
1208cacd992dSmrg                                     commandWidgetClass,
1209cacd992dSmrg                                     forms[7],
1210cacd992dSmrg                                     NULL);
1211cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)VTotal);
1212cacd992dSmrg    w = XtVaCreateManagedWidget(
1213cacd992dSmrg                                     "Taller-button",
1214cacd992dSmrg                                     commandWidgetClass,
1215cacd992dSmrg                                     forms[7],
1216cacd992dSmrg                                     NULL);
1217cacd992dSmrg    XtAddCallback (w, XtNcallback, AdjustCB, (XtPointer)-VTotal);
1218cacd992dSmrg
1219cacd992dSmrg    (void) sprintf (buf, "%04x", AppRes.field[Flags].val);
1220cacd992dSmrg    wids[0] = XtCreateWidget ("Flags-label", labelWidgetClass,
1221cacd992dSmrg		forms[8], NULL, 0);
1222cacd992dSmrg    wids[1] = XtVaCreateWidget ("Flags-text", asciiTextWidgetClass,
1223cacd992dSmrg		forms[8], XtNstring, buf, XtNtranslations, trans, NULL);
1224cacd992dSmrg    AddCallback (wids[1], XtNcallback, FlagsEditCB, (XtPointer) Flags);
1225cacd992dSmrg    XtManageChildren (wids, 2);
1226cacd992dSmrg    AppRes.field[Flags].textwidget = wids[1];
1227cacd992dSmrg
1228cacd992dSmrg    wids[0] = XtCreateWidget ("Quit-button", commandWidgetClass,
1229cacd992dSmrg		forms[9], NULL, 0);
1230cacd992dSmrg    XtAddCallback (wids[0], XtNcallback, QuitCB, NULL);
1231cacd992dSmrg
1232cacd992dSmrg    wids[1] = XtCreateWidget ("Apply-button", commandWidgetClass,
1233cacd992dSmrg		forms[9], NULL, 0);
1234cacd992dSmrg    XtAddCallback (wids[1], XtNcallback, ApplyCB, NULL);
1235cacd992dSmrg
1236cacd992dSmrg    wids[2] = XtCreateWidget ("AutoApply-toggle", toggleWidgetClass,
1237cacd992dSmrg		forms[9], NULL, 0);
1238cacd992dSmrg    auto_apply_toggle = wids[2];
1239cacd992dSmrg
1240cacd992dSmrg    wids[3] = XtCreateWidget ("Test-button", commandWidgetClass,
1241cacd992dSmrg		forms[9], NULL, 0);
1242cacd992dSmrg    XtAddCallback (wids[3], XtNcallback, TestCB, NULL);
1243cacd992dSmrg
1244cacd992dSmrg    wids[4] = XtCreateWidget ("Restore-button", commandWidgetClass,
1245cacd992dSmrg		forms[9], NULL, 0);
1246cacd992dSmrg    XtAddCallback (wids[4], XtNcallback, RestoreCB, NULL);
1247cacd992dSmrg
1248cacd992dSmrg    XtManageChildren (wids, 5);
1249cacd992dSmrg
1250cacd992dSmrg
1251cacd992dSmrg    CreateTyp (forms[10], PixelClock, "PixelClock-label", "PixelClock-text",
1252cacd992dSmrg	       NULL);
1253cacd992dSmrg    CreateTyp (forms[11], HSyncRate, "HSyncRate-label", "HSyncRate-text",
1254cacd992dSmrg	       NULL);
1255cacd992dSmrg    CreateTyp (forms[12], VSyncRate, "VSyncRate-label", "VSyncRate-text",
1256cacd992dSmrg	       NULL);
1257cacd992dSmrg
1258cacd992dSmrg    wids[0] = XtCreateWidget ("Fetch-button", commandWidgetClass,
1259cacd992dSmrg		forms[13], NULL, 0);
1260cacd992dSmrg    XtAddCallback (wids[0], XtNcallback, FetchCB, NULL);
1261cacd992dSmrg
1262cacd992dSmrg    wids[1] = XtCreateWidget ("Show-button", commandWidgetClass,
1263cacd992dSmrg		forms[13], NULL, 0);
1264cacd992dSmrg    XtAddCallback (wids[1], XtNcallback, ShowCB, NULL);
1265cacd992dSmrg
1266cacd992dSmrg    wids[2] = XtCreateWidget ("Next-button", commandWidgetClass,
1267cacd992dSmrg		forms[13], NULL, 0);
1268cacd992dSmrg    XtAddCallback (wids[2], XtNcallback, SwitchCB, (XtPointer)1);
1269cacd992dSmrg
1270cacd992dSmrg    wids[3] = XtCreateWidget ("Prev-button", commandWidgetClass,
1271cacd992dSmrg		forms[13], NULL, 0);
1272cacd992dSmrg    XtAddCallback (wids[3], XtNcallback, SwitchCB, (XtPointer)-1);
1273cacd992dSmrg
1274cacd992dSmrg    XtManageChildren (wids, 4);
1275cacd992dSmrg
1276cacd992dSmrg    XtManageChildren (forms, 14);
1277cacd992dSmrg
1278cacd992dSmrg    if (S3Specials) {
1279cacd992dSmrg	char buf[2] = "0";
1280cacd992dSmrg	s3form = XtCreateWidget ("S3-form", formWidgetClass,
1281cacd992dSmrg		form, NULL, 0);
1282cacd992dSmrg	wids[0] = XtVaCreateWidget("InvertVclk-toggle", toggleWidgetClass,
1283cacd992dSmrg			s3form, XtNstate, AppRes.field[InvertVclk].val, NULL);
1284cacd992dSmrg	XtAddCallback (wids[0], XtNcallback, ApplyIfAutoCB, NULL);
1285cacd992dSmrg	AppRes.field[InvertVclk].textwidget = wids[0];
1286cacd992dSmrg	wids[1] = XtVaCreateWidget("EarlySc-toggle", toggleWidgetClass,
1287cacd992dSmrg			s3form, XtNstate, AppRes.field[EarlySc].val, NULL);
1288cacd992dSmrg	XtAddCallback (wids[1], XtNcallback, ApplyIfAutoCB, NULL);
1289cacd992dSmrg	AppRes.field[EarlySc].textwidget = wids[1];
1290cacd992dSmrg	wids[2] = XtCreateWidget("Blank1-label", labelWidgetClass, s3form,
1291cacd992dSmrg			NULL, 0);
1292cacd992dSmrg	wids[3] = XtVaCreateWidget("Blank1Dec-button", commandWidgetClass,
1293cacd992dSmrg				   s3form, NULL);
1294cacd992dSmrg	XtAddCallback (wids[3], XtNcallback, ChangeBlankCB,
1295cacd992dSmrg			(XtPointer)-BlankDelay1);
1296cacd992dSmrg	(void) sprintf (buf, "%d", AppRes.field[BlankDelay1].val);
1297cacd992dSmrg	wids[4] = XtVaCreateWidget("Blank1-text", asciiTextWidgetClass,
1298cacd992dSmrg			s3form, XtNstring, buf, XtNtranslations, trans, NULL);
1299cacd992dSmrg	AddCallback(wids[4], XtNcallback, BlankEditCB, (XPointer) BlankDelay1);
1300cacd992dSmrg	AppRes.field[BlankDelay1].textwidget = wids[4];
1301cacd992dSmrg	wids[5] = XtVaCreateWidget("Blank1Inc-button", commandWidgetClass,
1302cacd992dSmrg				   s3form, NULL);
1303cacd992dSmrg	XtAddCallback (wids[5], XtNcallback, ChangeBlankCB,
1304cacd992dSmrg			(XtPointer)BlankDelay1);
1305cacd992dSmrg
1306cacd992dSmrg	wids[6] = XtCreateWidget("Blank2-label", labelWidgetClass, s3form,
1307cacd992dSmrg			NULL, 0);
1308cacd992dSmrg	wids[7] = XtVaCreateWidget("Blank2Dec-button", commandWidgetClass,
1309cacd992dSmrg				   s3form, NULL);
1310cacd992dSmrg	XtAddCallback (wids[7], XtNcallback, ChangeBlankCB,
1311cacd992dSmrg			(XtPointer)-BlankDelay2);
1312cacd992dSmrg	(void) sprintf (buf, "%d", AppRes.field[BlankDelay2].val);
1313cacd992dSmrg	wids[8] = XtVaCreateWidget("Blank2-text", asciiTextWidgetClass,
1314cacd992dSmrg			s3form, XtNstring, buf, XtNtranslations, trans, NULL);
1315cacd992dSmrg	AddCallback(wids[8], XtNcallback, BlankEditCB, (XPointer) BlankDelay2);
1316cacd992dSmrg	AppRes.field[BlankDelay2].textwidget = wids[8];
1317cacd992dSmrg	wids[9] = XtVaCreateWidget("Blank2Inc-button", commandWidgetClass,
1318cacd992dSmrg				   s3form, NULL);
1319cacd992dSmrg	XtAddCallback (wids[9], XtNcallback, ChangeBlankCB,
1320cacd992dSmrg			(XtPointer)BlankDelay2);
1321cacd992dSmrg	XtManageChildren (wids, 10);
1322cacd992dSmrg	XtManageChild(s3form);
1323cacd992dSmrg    }
1324cacd992dSmrg
1325cacd992dSmrg    XtManageChild (form);
1326cacd992dSmrg
1327cacd992dSmrg    SetScrollbars ();
1328cacd992dSmrg    x = DisplayWidth(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 2;
1329cacd992dSmrg    y = DisplayHeight(XtDisplay (top),DefaultScreen (XtDisplay (top))) / 2;
1330cacd992dSmrg
1331cacd992dSmrg    invalid_mode_popup = XtVaCreatePopupShell("invalidMode",
1332cacd992dSmrg			    transientShellWidgetClass, top,
1333cacd992dSmrg			    XtNtitle, "Invalid Mode requested",
1334cacd992dSmrg			    XtNx, x - 20,
1335cacd992dSmrg			    XtNy, y - 40,
1336cacd992dSmrg			    NULL);
1337cacd992dSmrg
1338cacd992dSmrg    testing_popup = XtVaCreatePopupShell("testing",
1339cacd992dSmrg			    transientShellWidgetClass, top,
1340cacd992dSmrg			    XtNtitle, "Testing_1_2_3",
1341cacd992dSmrg			    XtNx, x - 20,
1342cacd992dSmrg			    XtNy, y - 40,
1343cacd992dSmrg			    NULL);
1344cacd992dSmrg    boxW = XtVaCreateManagedWidget(
1345cacd992dSmrg                                   "TestingBox",
1346cacd992dSmrg                                   boxWidgetClass,
1347cacd992dSmrg                                   testing_popup,
1348cacd992dSmrg                                   NULL);
1349cacd992dSmrg
1350cacd992dSmrg    w = XtVaCreateManagedWidget(
1351cacd992dSmrg		   "testingMessage",
1352cacd992dSmrg                   labelWidgetClass,
1353cacd992dSmrg                   boxW,
1354cacd992dSmrg                   NULL);
1355cacd992dSmrg
1356cacd992dSmrg    w = XtVaCreateManagedWidget(
1357cacd992dSmrg                               "Abort",
1358cacd992dSmrg                                commandWidgetClass,
1359cacd992dSmrg                                boxW,
1360cacd992dSmrg                                NULL);
1361cacd992dSmrg
1362cacd992dSmrg    XtAddCallback (w, XtNcallback, (XtCallbackProc) TestTOCB,
1363cacd992dSmrg		  (XtPointer) NULL);
1364cacd992dSmrg
1365cacd992dSmrg    boxW = XtVaCreateManagedWidget(
1366cacd992dSmrg                                   "invalidBox",
1367cacd992dSmrg                                   boxWidgetClass,
1368cacd992dSmrg                                   invalid_mode_popup,
1369cacd992dSmrg                                   NULL);
1370cacd992dSmrg
1371cacd992dSmrg    (void) XtVaCreateManagedWidget(
1372cacd992dSmrg		   "ErrorMessage",
1373cacd992dSmrg                   labelWidgetClass,
1374cacd992dSmrg                   boxW,
1375cacd992dSmrg                   NULL);
1376cacd992dSmrg
1377cacd992dSmrg    popdownW = XtVaCreateManagedWidget(
1378cacd992dSmrg                                     "AckError",
1379cacd992dSmrg                                     commandWidgetClass,
1380cacd992dSmrg                                     boxW,
1381cacd992dSmrg                                     NULL);
1382cacd992dSmrg
1383cacd992dSmrg    XtAddCallback (popdownW, XtNcallback, (XtCallbackProc)popdownInvalid,
1384cacd992dSmrg		   (XtPointer) invalid_mode_popup);
1385cacd992dSmrg}
1386cacd992dSmrg
1387cacd992dSmrgstatic void
1388cacd992dSmrgQuitAction (Widget w, XEvent* e, String* vector, Cardinal* count)
1389cacd992dSmrg{
1390cacd992dSmrg    if ((e->type == ClientMessage
1391cacd992dSmrg      && e->xclient.data.l[0] == (long) wm_delete_window)
1392cacd992dSmrg	|| e->type == KeyPress)
1393cacd992dSmrg	QuitCB(w, NULL, NULL);
1394cacd992dSmrg}
1395cacd992dSmrg
1396cacd992dSmrgstatic void
1397cacd992dSmrgRestoreAction (Widget w, XEvent* e, String* vector, Cardinal* count)
1398cacd992dSmrg{
1399cacd992dSmrg    Boolean state;
1400cacd992dSmrg
1401cacd992dSmrg    RestoreCB(w, NULL, NULL);
1402cacd992dSmrg    XtVaGetValues(auto_apply_toggle, XtNstate, &state, NULL);
1403cacd992dSmrg    if (!state)
1404cacd992dSmrg	ApplyCB (w, NULL, NULL);
1405cacd992dSmrg}
1406cacd992dSmrg
1407cacd992dSmrg
1408cacd992dSmrgstatic void
1409cacd992dSmrgShowAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1410cacd992dSmrg{
1411cacd992dSmrg    ShowCB(w, NULL, NULL);
1412cacd992dSmrg}
1413cacd992dSmrg
1414cacd992dSmrgstatic void
1415cacd992dSmrgMoveLeftAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1416cacd992dSmrg{
1417cacd992dSmrg    AdjustCB(w, (XtPointer)HSyncStart, NULL);
1418cacd992dSmrg}
1419cacd992dSmrg
1420cacd992dSmrgstatic void
1421cacd992dSmrgMoveRightAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1422cacd992dSmrg{
1423cacd992dSmrg    AdjustCB(w, (XtPointer)-HSyncStart, NULL);
1424cacd992dSmrg}
1425cacd992dSmrg
1426cacd992dSmrgstatic void
1427cacd992dSmrgNarrowerAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1428cacd992dSmrg{
1429cacd992dSmrg    AdjustCB(w, (XtPointer)HTotal, NULL);
1430cacd992dSmrg}
1431cacd992dSmrg
1432cacd992dSmrgstatic void
1433cacd992dSmrgWiderAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1434cacd992dSmrg{
1435cacd992dSmrg    AdjustCB(w, (XtPointer)-HTotal, NULL);
1436cacd992dSmrg}
1437cacd992dSmrg
1438cacd992dSmrgstatic void
1439cacd992dSmrgMoveUpAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1440cacd992dSmrg{
1441cacd992dSmrg    AdjustCB(w, (XtPointer)VSyncStart, NULL);
1442cacd992dSmrg}
1443cacd992dSmrg
1444cacd992dSmrgstatic void
1445cacd992dSmrgMoveDownAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1446cacd992dSmrg{
1447cacd992dSmrg    AdjustCB(w, (XtPointer)-VSyncStart, NULL);
1448cacd992dSmrg}
1449cacd992dSmrg
1450cacd992dSmrgstatic void
1451cacd992dSmrgTallerAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1452cacd992dSmrg{
1453cacd992dSmrg    AdjustCB(w, (XtPointer)-VTotal, NULL);
1454cacd992dSmrg}
1455cacd992dSmrg
1456cacd992dSmrgstatic void
1457cacd992dSmrgShorterAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1458cacd992dSmrg{
1459cacd992dSmrg    AdjustCB(w, (XtPointer)VTotal, NULL);
1460cacd992dSmrg}
1461cacd992dSmrg
1462cacd992dSmrgstatic void
1463cacd992dSmrgNextModeAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1464cacd992dSmrg{
1465cacd992dSmrg	SwitchCB(w, (XPointer) 1, NULL);
1466cacd992dSmrg}
1467cacd992dSmrg
1468cacd992dSmrgstatic void
1469cacd992dSmrgPrevModeAction(Widget w, XEvent* e, String* vector, Cardinal* count)
1470cacd992dSmrg{
1471cacd992dSmrg	SwitchCB(w, (XPointer) -1, NULL);
1472cacd992dSmrg}
1473cacd992dSmrg
1474cacd992dSmrg
1475cacd992dSmrg
1476cacd992dSmrgstatic void
1477cacd992dSmrgusage(void)
1478cacd992dSmrg{
1479cacd992dSmrg    fprintf(stderr, "Usage: xvidtune [option]\n");
1480cacd992dSmrg    fprintf(stderr, "    where option is one of:\n");
1481cacd992dSmrg    fprintf(stderr, "        -show                             Print current modeline to stdout\n");
1482cacd992dSmrg    fprintf(stderr, "        -next                             Switch to next video mode\n");
1483cacd992dSmrg    fprintf(stderr, "        -prev                             Switch to previous video mode\n");
1484cacd992dSmrg    fprintf(stderr, "        -unlock                           Enable mode switch hot-keys\n");
1485cacd992dSmrg    fprintf(stderr, "        -timeout [seconds]                Set testmode timeout in seconds,\n");
1486cacd992dSmrg    exit(1);
1487cacd992dSmrg}
1488cacd992dSmrg
1489cacd992dSmrg
1490cacd992dSmrgint
1491cacd992dSmrgmain (int argc, char** argv)
1492cacd992dSmrg{
1493cacd992dSmrg    Widget top;
1494cacd992dSmrg    XtAppContext app;
1495cacd992dSmrg    Display* dpy;
1496cacd992dSmrg    Bool modeSettable = TRUE;
1497cacd992dSmrg
1498cacd992dSmrg    static XtActionsRec actions[] = { { "xvidtune-quit", QuitAction },
1499cacd992dSmrg				      { "xvidtune-restore", RestoreAction },
1500cacd992dSmrg				      { "xvidtune-show", ShowAction },
1501cacd992dSmrg				      {	"xvidtune-moveleft", MoveLeftAction },
1502cacd992dSmrg				      {	"xvidtune-moveright", MoveRightAction },
1503cacd992dSmrg				      {	"xvidtune-wider", WiderAction },
1504cacd992dSmrg				      {	"xvidtune-narrower", NarrowerAction },
1505cacd992dSmrg				      {	"xvidtune-moveup", MoveUpAction },
1506cacd992dSmrg				      {	"xvidtune-movedown", MoveDownAction },
1507cacd992dSmrg				      {	"xvidtune-taller", TallerAction },
1508cacd992dSmrg				      {	"xvidtune-shorter", ShorterAction },
1509cacd992dSmrg				      {	"xvidtune-nextmode", NextModeAction },
1510cacd992dSmrg				      {	"xvidtune-prevmode", PrevModeAction } };
1511cacd992dSmrg
1512cacd992dSmrg    Top = top = XtVaOpenApplication (&app, "Xvidtune", NULL, 0, &argc, argv,
1513cacd992dSmrg		NULL, applicationShellWidgetClass,
1514cacd992dSmrg		XtNmappedWhenManaged, False, NULL);
1515cacd992dSmrg
1516cacd992dSmrg    XtGetApplicationResources (top, (XtPointer)&AppRes,
1517cacd992dSmrg		Resources, XtNumber(Resources),
1518cacd992dSmrg		NULL, 0);
1519cacd992dSmrg
1520cacd992dSmrg    if (!AppRes.ad_installed) {
1521cacd992dSmrg	fprintf(stderr, "Please install the program before using\n");
1522cacd992dSmrg	return 3;
1523cacd992dSmrg    }
1524cacd992dSmrg
1525cacd992dSmrg    if (!XF86VidModeQueryVersion(XtDisplay (top), &MajorVersion, &MinorVersion)) {
1526cacd992dSmrg	fprintf(stderr, "Unable to query video extension version\n");
1527cacd992dSmrg	return 2;
1528cacd992dSmrg    }
1529cacd992dSmrg
1530cacd992dSmrg    if (!XF86VidModeQueryExtension(XtDisplay (top), &EventBase, &ErrorBase)) {
1531cacd992dSmrg	fprintf(stderr, "Unable to query video extension information\n");
1532cacd992dSmrg	return 2;
1533cacd992dSmrg    }
1534cacd992dSmrg
1535cacd992dSmrg    /* Fail if the extension version in the server is too old */
1536cacd992dSmrg    if (MajorVersion < MINMAJOR ||
1537cacd992dSmrg	(MajorVersion == MINMAJOR && MinorVersion < MINMINOR)) {
1538cacd992dSmrg	fprintf(stderr,
1539cacd992dSmrg		"Xserver is running an old XFree86-VidModeExtension version"
1540cacd992dSmrg		" (%d.%d)\n", MajorVersion, MinorVersion);
1541cacd992dSmrg	fprintf(stderr, "Minimum required version is %d.%d\n",
1542cacd992dSmrg		MINMAJOR, MINMINOR);
1543cacd992dSmrg	exit(2);
1544cacd992dSmrg    }
1545cacd992dSmrg
1546cacd992dSmrg    /* This should probably be done differently */
1547cacd992dSmrg
1548cacd992dSmrg    if(  argc == 3  ) { /* this can only be the timeout case */
1549cacd992dSmrg        if(  (!strcmp(argv[1], "-timeout"))  ) {
1550cacd992dSmrg            TestTimeout = ((unsigned long) atol( argv[2] )) * 1000L;
1551cacd992dSmrg	}
1552cacd992dSmrg	else
1553cacd992dSmrg	    usage();
1554cacd992dSmrg    }
1555cacd992dSmrg
1556cacd992dSmrg    if (argc > 1) {
1557cacd992dSmrg	int i = 0;
1558cacd992dSmrg
1559cacd992dSmrg	if (argc != 2)
1560cacd992dSmrg		usage();
1561cacd992dSmrg	if (!strcmp(argv[1], "-show")) {
1562cacd992dSmrg	  if (!GetModeLine(XtDisplay (top), DefaultScreen (XtDisplay (top)))) {
1563cacd992dSmrg	    fprintf(stderr, "Unable to get mode info\n");
1564cacd992dSmrg	    CleanUp(XtDisplay (top));
1565cacd992dSmrg	    return 2;
1566cacd992dSmrg	  }
1567cacd992dSmrg	  ShowCB(top, NULL, NULL);
1568cacd992dSmrg	  return 0;
1569cacd992dSmrg	} else if (!strcmp(argv[1], "-next"))
1570cacd992dSmrg	    i = 1;
1571cacd992dSmrg	else if (!strcmp(argv[1], "-prev"))
1572cacd992dSmrg	    i = -1;
1573cacd992dSmrg	else if (!strcmp(argv[1], "-unlock")) {
1574cacd992dSmrg	    CleanUp(XtDisplay (top));
1575cacd992dSmrg	    XSync(XtDisplay (top), True);
1576cacd992dSmrg	    return 0;
1577cacd992dSmrg	} else
1578cacd992dSmrg		usage();
1579cacd992dSmrg	if (i != 0) {
1580cacd992dSmrg	    XF86VidModeSwitchMode(XtDisplay (top),
1581cacd992dSmrg				  DefaultScreen (XtDisplay (top)), i);
1582cacd992dSmrg	    XSync(XtDisplay (top), True);
1583cacd992dSmrg	    return 0;
1584cacd992dSmrg	}
1585cacd992dSmrg    }
1586cacd992dSmrg    if (!GetMonitor(XtDisplay (top), DefaultScreen (XtDisplay (top)))) {
1587cacd992dSmrg	fprintf(stderr, "Unable to query monitor info\n");
1588cacd992dSmrg	return 2;
1589cacd992dSmrg    }
1590cacd992dSmrg
1591cacd992dSmrg    if (!XF86VidModeLockModeSwitch(XtDisplay (top),
1592cacd992dSmrg				   DefaultScreen (XtDisplay (top)), TRUE)) {
1593cacd992dSmrg	fprintf(stderr, "Failed to disable mode-switch hot-keys\n");
1594cacd992dSmrg	return 2;
1595cacd992dSmrg    }
1596cacd992dSmrg
1597cacd992dSmrg    signal(SIGINT, CatchSig);
1598cacd992dSmrg    signal(SIGQUIT, CatchSig);
1599cacd992dSmrg    signal(SIGTERM, CatchSig);
1600cacd992dSmrg    signal(SIGHUP, CatchSig);
1601cacd992dSmrg    sigId = XtAppAddSignal(app, CatchXtSig, NULL);
1602cacd992dSmrg
1603cacd992dSmrg    if (!GetModeLine(XtDisplay (top), DefaultScreen (XtDisplay (top)))) {
1604cacd992dSmrg	fprintf(stderr, "Unable to get mode info\n");
1605cacd992dSmrg	CleanUp(XtDisplay (top));
1606cacd992dSmrg	return 2;
1607cacd992dSmrg    }
1608cacd992dSmrg
1609cacd992dSmrg    xtErrorfunc = XSetErrorHandler(vidmodeError);
1610cacd992dSmrg
1611cacd992dSmrg    trans = XtParseTranslationTable ("\
1612cacd992dSmrg	<Key>0: insert-char()\n<Key>1: insert-char()\n\
1613cacd992dSmrg	<Key>2: insert-char()\n<Key>3: insert-char()\n\
1614cacd992dSmrg	<Key>4: insert-char()\n<Key>5: insert-char()\n\
1615cacd992dSmrg	<Key>6: insert-char()\n<Key>7: insert-char()\n\
1616cacd992dSmrg	<Key>8: insert-char()\n<Key>9: insert-char()\n\
1617cacd992dSmrg	<Key>a: insert-char()\n<Key>b: insert-char()\n\
1618cacd992dSmrg	<Key>c: insert-char()\n<Key>d: insert-char()\n\
1619cacd992dSmrg	<Key>e: insert-char()\n<Key>f: insert-char()\n\
1620cacd992dSmrg	<Key>+: insert-char()\n<Key>-: insert-char()\n\
1621cacd992dSmrg	<Key>r: xvidtune-restore()\n<Key>q: xvidtune-quit()\n\
1622cacd992dSmrg	<Key>BackSpace: delete-previous-character()\n\
1623cacd992dSmrg	<Key>Right: forward-character()\n<Key>KP_Right: forward-character()\n\
1624cacd992dSmrg	<Key>Left: backward-character()\n<Key>KP_Left: backward-character()\n\
1625cacd992dSmrg	<Key>Delete: delete-previous-character()\n\
1626cacd992dSmrg	<Key>KP_Delete: delete-previous-character()\n\
1627cacd992dSmrg	<EnterWindow>: enter-window()\n<LeaveWindow>: leave-window()\n\
1628cacd992dSmrg	<FocusIn>: focus-in()\n<FocusOut>: focus-out()\n\
1629cacd992dSmrg	<Btn1Down>: select-start()\n");
1630cacd992dSmrg
1631cacd992dSmrg    if (!ModeSettable()) {
1632cacd992dSmrg	printf("Video are not settable on this chip\n");
1633cacd992dSmrg	displayNoTune(top);
1634cacd992dSmrg	modeSettable = FALSE;
1635cacd992dSmrg    } else
1636cacd992dSmrg	CreateHierarchy (top);
1637cacd992dSmrg
1638cacd992dSmrg
1639cacd992dSmrg    XtAppAddActions (app, actions, XtNumber(actions));
1640cacd992dSmrg
1641cacd992dSmrg    XtOverrideTranslations (top,
1642cacd992dSmrg		XtParseTranslationTable ("<Message>WM_PROTOCOLS: xvidtune-quit()"));
1643cacd992dSmrg
1644cacd992dSmrg    XtRealizeWidget (top);
1645cacd992dSmrg
1646cacd992dSmrg    dpy = XtDisplay(top);
1647cacd992dSmrg
1648cacd992dSmrg    wm_delete_window = XInternAtom (dpy, "WM_DELETE_WINDOW", False);
1649cacd992dSmrg
1650cacd992dSmrg    (void) XSetWMProtocols (dpy, XtWindow (top), &wm_delete_window, 1);
1651cacd992dSmrg
1652cacd992dSmrg    XtMapWidget (top);
1653cacd992dSmrg
1654cacd992dSmrg    if (modeSettable)
1655cacd992dSmrg	displayWarning(top);
1656cacd992dSmrg
1657cacd992dSmrg    /* really we should run our own event dispatching here until the
1658cacd992dSmrg     * warning has been read...
1659cacd992dSmrg     */
1660cacd992dSmrg    XtAppMainLoop (app);
1661cacd992dSmrg
1662cacd992dSmrg    return 0;
1663cacd992dSmrg}
1664