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