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