diff options
Diffstat (limited to 'xorg-server/hw/xfree86/utils/xorgcfg/vidmode.c')
-rw-r--r-- | xorg-server/hw/xfree86/utils/xorgcfg/vidmode.c | 1346 |
1 files changed, 0 insertions, 1346 deletions
diff --git a/xorg-server/hw/xfree86/utils/xorgcfg/vidmode.c b/xorg-server/hw/xfree86/utils/xorgcfg/vidmode.c deleted file mode 100644 index 2d613b6df..000000000 --- a/xorg-server/hw/xfree86/utils/xorgcfg/vidmode.c +++ /dev/null @@ -1,1346 +0,0 @@ -/* - * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com) - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * CONECTIVA LINUX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF - * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Except as contained in this notice, the name of Conectiva Linux shall - * not be used in advertising or otherwise to promote the sale, use or other - * dealings in this Software without prior written authorization from - * Conectiva Linux. - * - * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> - * - */ - -/* - * Most of the code here is based on the xvidtune code. - */ - -#include "vidmode.h" -#include <X11/Xaw/Command.h> -#include <X11/Xaw/Form.h> -#include <X11/Xaw/Label.h> -#include <X11/Xaw/MenuButton.h> -#include <X11/Xaw/Repeater.h> -#include <X11/Shell.h> -#include <X11/Xaw/AsciiText.h> -#include <X11/Xaw/Dialog.h> -#include <X11/Xaw/SimpleMenP.h> -#include <X11/Xaw/SmeBSB.h> -#include <X11/Xaw/Toggle.h> -#include "xf86config.h" - -#define V_FLAG_MASK 0x1FF -#define V_PHSYNC 0x001 -#define V_NHSYNC 0x002 -#define V_PVSYNC 0x004 -#define V_NVSYNC 0x008 -#define V_INTERLACE 0x010 -#define V_DBLSCAN 0x020 -#define V_CSYNC 0x040 -#define V_PCSYNC 0x080 -#define V_NCSYNC 0x100 - -#define LEFT 0 -#define RIGHT 1 -#define UP 2 -#define DOWN 3 -#define WIDER 4 -#define TALLER 5 -#define NARROWER 6 -#define SHORTER 7 - -#define HDISPLAY 0 -#define VDISPLAY 1 -#define HSYNCSTART 2 -#define HSYNCEND 3 -#define HTOTAL 4 -#define VSYNCSTART 5 -#define VSYNCEND 6 -#define VTOTAL 7 -#define FLAGS 8 -#define CLOCK 9 -#define HSYNC 10 -#define VSYNC 11 - -#define MINMAJOR 2 -#define MINMINOR 0 - -/* - * Types - */ -typedef struct { - char *ident; - XF86VidModeModeInfo info; -} xf86cfgVesaModeInfo; - -/* - * Prototypes - */ -static Bool GetModeLine(Bool); -static void StartAdjustMonitorCallback(Widget, XtPointer, XtPointer); -static void AdjustMonitorCallback(Widget, XtPointer, XtPointer); -static void EndAdjustMonitorCallback(Widget, XtPointer, XtPointer); -static void SetLabel(int, int); -static void UpdateSyncRates(Bool); -static int VidmodeError(Display*, XErrorEvent*); -static void CleanUp(Display*); -static void ApplyCallback(Widget, XtPointer, XtPointer); -static void AutoCallback(Widget, XtPointer, XtPointer); -static void RestoreCallback(Widget, XtPointer, XtPointer); -static void SelectCallback(Widget, XtPointer, XtPointer); -static void SelectMonitorCallback(Widget, XtPointer, XtPointer); -static void SwitchCallback(Widget, XtPointer, XtPointer); -static void SetLabels(void); -static void UpdateCallback(Widget, XtPointer, XtPointer); -static void ChangeScreenCallback(Widget, XtPointer, XtPointer); -static void SetLabelAndModeline(void); -static void AddVesaModeCallback(Widget, XtPointer, XtPointer); -static void GetModes(void); -static void AddModeCallback(Widget, XtPointer, XtPointer); -static void TestCallback(Widget, XtPointer, XtPointer); -static void TestTimeout(XtPointer, XtIntervalId*); -static void StopTestCallback(Widget, XtPointer, XtPointer); -static int ForceAddMode(void); -static int AddMode(void); -/* - * Initialization - */ -extern Widget work; -Widget vtune; -static Widget apply, automatic, restore, mode, menu, screenb, screenp; -static Bool autoflag; -static xf86cfgVidmode *vidtune; -static XF86VidModeModeLine modeline, orig_modeline; -static int dot_clock, hsync_rate, vsync_rate, hitError; -static int screenno; -static int (*XtErrorFunc)(Display*, XErrorEvent*); -static Widget values[VSYNC + 1], repeater, monitor, - monitorb, add, text, vesap, forceshell, testshell, addshell; -static int MajorVersion, MinorVersion, EventBase, ErrorBase; -static XtIntervalId timeout; - -/* The information bellow is extracted from - * xc/programs/Xserver/hw/xfree86/etc/vesamodes - * If that file is changed, please update the table bellow also. Or even - * better, write a script to generate the table. - */ -static xf86cfgVesaModeInfo vesamodes[] = { - { - "640x350 @ 85Hz (VESA) hsync: 37.9kHz", - { - 31500, 640, 672, 736, 832, 0, 350, 382, 385, 445, - V_PHSYNC | V_NVSYNC - } - }, - { - "640x400 @ 85Hz (VESA) hsync: 37.9kHz", - { - 31500, 640, 672, 736, 832, 0, 400, 401, 404, 445, - V_NHSYNC | V_PVSYNC - } - }, - { - "720x400 @ 85Hz (VESA) hsync: 37.9kHz", - { - 35500, 720, 756, 828, 936, 0, 400, 401, 404, 446, - V_NHSYNC | V_PVSYNC - } - }, - { - "640x480 @ 60Hz (Industry standard) hsync: 31.5kHz", - { - 25200, 640, 656, 752, 800, 0, 480, 490, 492, 525, - V_NHSYNC | V_NVSYNC - } - }, - { - "640x480 @ 72Hz (VESA) hsync: 37.9kHz", - { - 31500, 640, 664, 704, 832, 0, 480, 489, 491, 520, - V_NHSYNC | V_NVSYNC - } - }, - { - "640x480 @ 75Hz (VESA) hsync: 37.5kHz", - { - 31500, 640, 656, 720, 840, 0, 480, 481, 484, 500, - V_NHSYNC | V_NVSYNC - } - }, - { - "640x480 @ 85Hz (VESA) hsync: 43.3kHz", - { - 36000, 640, 696, 752, 832, 0, 480, 481, 484, 509, - V_NHSYNC | V_NVSYNC - } - }, - { - "800x600 @ 56Hz (VESA) hsync: 35.2kHz", - { - 36000, 800, 824, 896, 1024, 0, 600, 601, 603, 625, - V_PHSYNC | V_PVSYNC - } - }, - { - "800x600 @ 60Hz (VESA) hsync: 37.9kHz", - { - 400000, 800, 840, 968, 1056, 0, 600, 601, 605, 628, - V_PHSYNC | V_PVSYNC - } - }, - { - "800x600 @ 72Hz (VESA) hsync: 48.1kHz", - { - 50000, 800, 856, 976, 1040, 0, 600, 637, 643, 666, - V_PHSYNC | V_PVSYNC - } - }, - { - "800x600 @ 75Hz (VESA) hsync: 46.9kHz", - { - 49500, 800, 816, 896, 1056, 0, 600, 601, 604, 625, - V_PHSYNC | V_PVSYNC - } - }, - { - "800x600 @ 85Hz (VESA) hsync: 53.7kHz", - { - 563000, 800, 832, 896, 1048, 0, 600, 601, 604, 631, - V_PHSYNC | V_PVSYNC - } - }, - { - "1024x768i @ 43Hz (industry standard) hsync: 35.5kHz", - { - 44900, 1024, 1032, 1208, 1264, 0, 768, 768, 776, 817, - V_PHSYNC | V_PVSYNC | V_INTERLACE - } - }, - { - "1024x768 @ 60Hz (VESA) hsync: 48.4kHz", - { - 65000, 1024, 1048, 1184, 1344, 0, 768, 771, 777, 806, - V_NHSYNC | V_NVSYNC - } - }, - { - "1024x768 @ 70Hz (VESA) hsync: 56.5kHz", - { - 75000, 1024, 1048, 1184, 1328, 0, 768, 771, 777, 806, - V_NHSYNC | V_NVSYNC - } - }, - { - "1024x768 @ 75Hz (VESA) hsync: 60.0kHz", - { - 78800, 1024, 1040, 1136, 1312, 0, 768, 769, 772, 800, - V_PHSYNC | V_PVSYNC - } - }, - { - "1024x768 @ 85Hz (VESA) hsync: 68.7kHz", - { - 94500, 1024, 1072, 1168, 1376, 0, 768, 769, 772, 808, - V_PHSYNC | V_PVSYNC - } - }, - { - "1152x864 @ 75Hz (VESA) hsync: 67.5kHz", - { - 108000, 1152, 1216, 1344, 1600, 0, 864, 865, 868, 900, - V_PHSYNC | V_PVSYNC - } - }, - { - "1280x960 @ 60Hz (VESA) hsync: 60.0kHz", - { - 108000, 1280, 1376, 1488, 1800, 0, 960, 961, 964, 1000, - V_PHSYNC | V_PVSYNC - } - }, - { - "1280x960 @ 85Hz (VESA) hsync: 85.9kHz", - { - 148500, 1280, 1344, 1504, 1728, 0, 960, 961, 964, 1011, - V_PHSYNC | V_PVSYNC - } - }, - { - "1280x1024 @ 60Hz (VESA) hsync: 64.0kHz", - { - 108000, 1280, 1328, 1440, 1688, 0, 1024, 1025, 1028, 1066, - V_PHSYNC | V_PVSYNC - } - }, - { - "1280x1024 @ 75Hz (VESA) hsync: 80.0kHz", - { - 135000, 1280, 1296, 1440, 1688, 0, 1024, 1025, 1028, 1066, - V_PHSYNC | V_PVSYNC - } - }, - { - "1280x1024 @ 85Hz (VESA) hsync: 91.1kHz", - { - 157500, 1280, 1344, 1504, 1728, 0, 1024, 1025, 1028, 1072, - V_PHSYNC | V_PVSYNC - } - }, - { - "1600x1200 @ 60Hz (VESA) hsync: 75.0kHz", - { - 162000, 1600, 1664, 1856, 2160, 0, 1200, 1201, 1204, 1250, - V_PHSYNC | V_PVSYNC - } - }, - { - "1600x1200 @ 65Hz (VESA) hsync: 81.3kHz", - { - 175500, 1600, 1664, 1856, 2160, 0, 1200, 1201, 1204, 1250, - V_PHSYNC | V_PVSYNC - } - }, - { - "1600x1200 @ 70Hz (VESA) hsync: 87.5kHz", - { - 189000, 1600, 1664, 1856, 2160, 0, 1200, 1201, 1204, 1250, - V_PHSYNC | V_PVSYNC - } - }, - { - "1600x1200 @ 75Hz (VESA) hsync: 93.8kHz", - { - 202500, 1600, 1664, 1856, 2160, 0, 1200, 1201, 1204, 1250, - V_PHSYNC | V_PVSYNC - } - }, - { - "1600x1200 @ 85Hz (VESA) hsync: 106.3kHz", - { - 229500, 1600, 1664, 1856, 2160, 0, 1200, 1201, 1204, 1250, - V_PHSYNC | V_PVSYNC - } - }, - { - "1792x1344 @ 60Hz (VESA) hsync: 83.6kHz", - { - 204800, 1792, 1920, 2120, 2448, 0, 1344, 1345, 1348, 1394, - V_NHSYNC | V_PVSYNC - } - }, - { - "1792x1344 @ 75Hz (VESA) hsync: 106.3kHz", - { - 261000, 1792, 1888, 2104, 2456, 0, 1344, 1345, 1348, 1417, - V_NHSYNC | V_PVSYNC - } - }, - { - "1856x1392 @ 60Hz (VESA) hsync: 86.3kHz", - { - 218300, 1856, 1952, 2176, 2528, 0, 1392, 1393, 1396, 1439, - V_NHSYNC | V_PVSYNC - } - }, - { - "1856x1392 @ 75Hz (VESA) hsync: 112.5kHz", - { - 288000, 1856, 1984, 2208, 2560, 0, 1392, 1393, 1396, 1500, - V_NHSYNC | V_PVSYNC - } - }, - { - "1920x1440 @ 60Hz (VESA) hsync: 90.0kHz", - { - 234000, 1920, 2048, 2256, 2600, 0, 1440, 1441, 1444, 1500, - V_NHSYNC | V_PVSYNC - } - }, - { - "1920x1440 @ 75Hz (VESA) hsync: 112.5kHz", - { - 297000, 1920, 2064, 2288, 2640, 0, 1440, 1441, 1444, 1500, - V_NHSYNC | V_PVSYNC - } - }, -}; - -/* - * Implementation - */ -Bool -VideoModeInitialize(void) -{ - Widget form; - char dispstr[128], *ptr, *tmp; - - static char *names[] = { - NULL, - NULL, - "hsyncstart", - "hsyncend", - "htotal", - "vsyncstart", - "vsyncend", - "vtotal", - "flags", - "clock", - "hsync", - "vsync", - }; - static char *vnames[] = { - NULL, - NULL, - "v-hsyncstart", - "v-hsyncend", - "v-htotal", - "v-vsyncstart", - "v-vsyncend", - "v-vtotal", - "v-flags", - "v-clock", - "v-hsync", - "v-vsync", - }; - Widget rep; - int i; - - if (!XF86VidModeQueryVersion(XtDisplay(toplevel), - &MajorVersion, &MinorVersion)) { - fprintf(stderr, "Unable to query video extension version\n"); - return (False); - } - else if (!XF86VidModeQueryExtension(XtDisplay(toplevel), - &EventBase, &ErrorBase)) { - fprintf(stderr, "Unable to query video extension information\n"); - return (False); - } - else if (MajorVersion < MINMAJOR || - (MajorVersion == MINMAJOR && MinorVersion < MINMINOR)) { - fprintf(stderr, - "Xserver is running an old XFree86-VidModeExtension version" - " (%d.%d)\n", MajorVersion, MinorVersion); - fprintf(stderr, "Minimum required version is %d.%d\n", - MINMAJOR, MINMINOR); - return (False); - } - else - InitializeVidmodes(); - - vtune = XtCreateWidget("vidtune", formWidgetClass, - work, NULL, 0); - - (void) XtVaCreateManagedWidget("vesaB", menuButtonWidgetClass, vtune, - XtNmenuName, "vesaP", NULL); - vesap = XtCreatePopupShell("vesaP", simpleMenuWidgetClass, vtune, NULL, 0); - for (i = 0; i < sizeof(vesamodes) / sizeof(vesamodes[0]); i++) { - rep = XtCreateManagedWidget(vesamodes[i].ident, smeBSBObjectClass, - vesap, NULL, 0); - XtAddCallback(rep, XtNcallback, AddVesaModeCallback, - (XtPointer)&vesamodes[i]); - } - - rep = XtCreateManagedWidget("prev", commandWidgetClass, vtune, NULL, 0); - XtAddCallback(rep, XtNcallback, SwitchCallback, (XtPointer)-1); - mode = XtCreateManagedWidget("mode", menuButtonWidgetClass, vtune, NULL, 0); - rep = XtCreateManagedWidget("next", commandWidgetClass, vtune, NULL, 0); - XtAddCallback(rep, XtNcallback, SwitchCallback, (XtPointer)1); - - screenp = XtCreatePopupShell("screenP", simpleMenuWidgetClass, vtune, - NULL, 0); - - XmuSnprintf(dispstr, sizeof(dispstr), "%s", - DisplayString(XtDisplay(toplevel))); - ptr = strrchr(dispstr, '.'); - tmp = strrchr(dispstr, ':'); - if (tmp != NULL && ptr != NULL && ptr > tmp) - *ptr = '\0'; - - for (i = 0; i < ScreenCount(XtDisplay(toplevel)); i++) { - char name[128]; - - XmuSnprintf(name, sizeof(name), "%s.%d", dispstr, i); - rep = XtCreateManagedWidget(name, smeBSBObjectClass, screenp, - NULL, 0); - XtAddCallback(rep, XtNcallback, ChangeScreenCallback, - (XtPointer)(long)i); - if (i == 0) { - screenb = XtVaCreateManagedWidget("screenB", menuButtonWidgetClass, - vtune, - XtNmenuName, "screenP", - XtNlabel, name, - NULL); - } - } - XtRealizeWidget(screenp); - - rep = XtCreateManagedWidget("up", repeaterWidgetClass, - vtune, NULL, 0); - XtAddCallback(rep, XtNstartCallback, StartAdjustMonitorCallback, NULL); - XtAddCallback(rep, XtNcallback, - AdjustMonitorCallback, (XtPointer)UP); - XtAddCallback(rep, XtNstopCallback, EndAdjustMonitorCallback, NULL); - rep = XtCreateManagedWidget("left", repeaterWidgetClass, - vtune, NULL, 0); - XtAddCallback(rep, XtNstartCallback, StartAdjustMonitorCallback, NULL); - XtAddCallback(rep, XtNcallback, - AdjustMonitorCallback, (XtPointer)LEFT); - XtAddCallback(rep, XtNstopCallback, EndAdjustMonitorCallback, NULL); - XtCreateManagedWidget("monitor", simpleWidgetClass, vtune, NULL, 0); - rep = XtCreateManagedWidget("right", repeaterWidgetClass, - vtune, NULL, 0); - XtAddCallback(rep, XtNstartCallback, StartAdjustMonitorCallback, NULL); - XtAddCallback(rep, XtNcallback, - AdjustMonitorCallback, (XtPointer)RIGHT); - XtAddCallback(rep, XtNstopCallback, EndAdjustMonitorCallback, NULL); - rep = XtCreateManagedWidget("down", repeaterWidgetClass, - vtune, NULL, 0); - XtAddCallback(rep, XtNstartCallback, StartAdjustMonitorCallback, NULL); - XtAddCallback(rep, XtNcallback, - AdjustMonitorCallback, (XtPointer)DOWN); - XtAddCallback(rep, XtNstopCallback, EndAdjustMonitorCallback, NULL); - rep = XtCreateManagedWidget("wider", repeaterWidgetClass, - vtune, NULL, 0); - XtAddCallback(rep, XtNstartCallback, StartAdjustMonitorCallback, NULL); - XtAddCallback(rep, XtNcallback, - AdjustMonitorCallback, (XtPointer)WIDER); - XtAddCallback(rep, XtNstopCallback, EndAdjustMonitorCallback, NULL); - rep = XtCreateManagedWidget("narrower", repeaterWidgetClass, - vtune, NULL, 0); - XtAddCallback(rep, XtNstartCallback, StartAdjustMonitorCallback, NULL); - XtAddCallback(rep, XtNcallback, - AdjustMonitorCallback, (XtPointer)NARROWER); - XtAddCallback(rep, XtNstopCallback, EndAdjustMonitorCallback, NULL); - rep = XtCreateManagedWidget("shorter", repeaterWidgetClass, - vtune, NULL, 0); - XtAddCallback(rep, XtNstartCallback, StartAdjustMonitorCallback, NULL); - XtAddCallback(rep, XtNcallback, - AdjustMonitorCallback, (XtPointer)SHORTER); - XtAddCallback(rep, XtNstopCallback, EndAdjustMonitorCallback, NULL); - rep = XtCreateManagedWidget("taller", repeaterWidgetClass, - vtune, NULL, 0); - XtAddCallback(rep, XtNstartCallback, StartAdjustMonitorCallback, NULL); - XtAddCallback(rep, XtNcallback, - AdjustMonitorCallback, (XtPointer)TALLER); - XtAddCallback(rep, XtNstopCallback, EndAdjustMonitorCallback, NULL); - - automatic = XtCreateManagedWidget("auto", toggleWidgetClass, vtune, NULL, 0); - XtAddCallback(automatic, XtNcallback, AutoCallback, NULL); - apply = XtCreateManagedWidget("apply", commandWidgetClass, vtune, NULL, 0); - XtAddCallback(apply, XtNcallback, ApplyCallback, NULL); - restore = XtCreateManagedWidget("restore", commandWidgetClass, vtune, NULL, 0); - XtAddCallback(restore, XtNcallback, RestoreCallback, NULL); - rep = XtCreateManagedWidget("update", commandWidgetClass, vtune, NULL, 0); - XtAddCallback(rep, XtNcallback, UpdateCallback, NULL); - rep = XtCreateManagedWidget("test", commandWidgetClass, vtune, NULL, 0); - XtAddCallback(rep, XtNcallback, TestCallback, NULL); - - form = XtCreateManagedWidget("form", formWidgetClass, vtune, NULL, 0); - for (i = 2; i < VSYNC + 1; i++) { - (void) XtCreateManagedWidget(names[i], labelWidgetClass, - form, NULL, 0); - values[i] = XtCreateManagedWidget(vnames[i], labelWidgetClass, - form, NULL, 0); - } - - add = XtCreateManagedWidget("add", commandWidgetClass, vtune, NULL, 0); - XtAddCallback(add, XtNcallback, AddModeCallback, NULL); - XtCreateManagedWidget("addto", labelWidgetClass, vtune, NULL, 0); - monitorb = XtCreateManagedWidget("ident", menuButtonWidgetClass, vtune, - NULL, 0); - XtCreateManagedWidget("as", labelWidgetClass, vtune, NULL, 0); - text = XtVaCreateManagedWidget("text", asciiTextWidgetClass, vtune, - XtNeditType, XawtextEdit, NULL); - - XtRealizeWidget(vtune); - - return (True); -} - -void -InitializeVidmodes(void) -{ - int i; - Display *display = XtDisplay(toplevel); - - computer.num_vidmodes = ScreenCount(display); - computer.vidmodes = (xf86cfgVidmode**) - XtMalloc(sizeof(xf86cfgVidmode*) * computer.num_vidmodes); - for (i = 0; i < computer.num_vidmodes; i++) { - - computer.vidmodes[i] = (xf86cfgVidmode*) - XtCalloc(1, sizeof(xf86cfgVidmode)); - computer.vidmodes[i]->screen = i; - } -} - -void -VideoModeConfigureStart(void) -{ - vidtune = computer.vidmodes[screenno]; - - XtSetSensitive(vtune, vidtune != NULL); - if (!XtIsManaged(vtune)) - XtManageChild(vtune); - else - XtMapWidget(vtune); - if (vidtune != NULL) { - Arg args[1]; - Boolean state; - XF86ConfMonitorPtr mon; - static char menuName[16]; - static int menuN; - - XtErrorFunc = XSetErrorHandler(VidmodeError); - XF86VidModeLockModeSwitch(XtDisplay(toplevel), vidtune->screen, True); - GetModeLine(True); - GetModes(); - - SetLabels(); - XtSetArg(args[0], XtNstate, &state); - XtGetValues(automatic, args, 1); - XtSetSensitive(apply, !state); - autoflag = state; - - if (monitor) - XtDestroyWidget(monitor); - XmuSnprintf(menuName, sizeof(menuName), "menuP%d", menuN); - menuN = !menuN; - monitor = XtCreatePopupShell(menuName, simpleMenuWidgetClass, - vtune, NULL, 0); - XtVaSetValues(monitorb, XtNmenuName, menuName, NULL); - - mon = XF86Config->conf_monitor_lst; - while (mon != NULL) { - Widget sme = XtCreateManagedWidget(mon->mon_identifier, - smeBSBObjectClass, - monitor, NULL, 0); - XtAddCallback(sme, XtNcallback, - SelectMonitorCallback, (XtPointer)mon); - - /* guess the monitor at a given screen and/or - * updates configuration if a monitor was removed from the - * configuration. - */ - if (XF86Config->conf_layout_lst) { - XF86ConfAdjacencyPtr adj = XF86Config->conf_layout_lst-> - lay_adjacency_lst; - - while (adj != NULL) { - if (adj->adj_screen != NULL) { - if (adj->adj_screen->scrn_monitor == mon && - adj->adj_scrnum >= 0 && - adj->adj_scrnum < ScreenCount(XtDisplay(toplevel))) { - if (computer.vidmodes[adj->adj_scrnum]->monitor == - NULL || computer.vidmodes[adj->adj_scrnum]-> - monitor == adj->adj_screen->scrn_monitor) { - computer.vidmodes[adj->adj_scrnum]->monitor = - adj->adj_screen->scrn_monitor; - break; - } - else - computer.vidmodes[adj->adj_scrnum]->monitor = - NULL; - } - } - adj = (XF86ConfAdjacencyPtr)(adj->list.next); - } - } - mon = (XF86ConfMonitorPtr)(mon->list.next); - } - SetLabelAndModeline(); - } -} - -void -VideoModeConfigureEnd(void) -{ - XtUnmapWidget(vtune); - if (vidtune != NULL) { - XF86VidModeLockModeSwitch(XtDisplay(toplevel), vidtune->screen, False); - XSetErrorHandler(XtErrorFunc); - } - vidtune = NULL; -} - -static void -SetLabelAndModeline(void) -{ - if (vidtune->monitor != NULL) { - char string[32]; - - XtVaSetValues(monitorb, XtNlabel, - vidtune->monitor->mon_identifier, NULL); - XtSetSensitive(add, True); - - if (modeline.htotal && modeline.vtotal) - XmuSnprintf(string, sizeof(string), "%dx%d@%d", - modeline.hdisplay, modeline.vdisplay, - (int)((double)dot_clock / (double)modeline.htotal * 1000.0 / - (double)modeline.vtotal)); - else - XmuSnprintf(string, sizeof(string), "%dx%d", - modeline.hdisplay, modeline.vdisplay); - XtVaSetValues(text, XtNstring, string, NULL); - } - else { - XtVaSetValues(monitorb, XtNlabel, "", NULL); - XtSetSensitive(add, False); - XtVaSetValues(text, XtNstring, "", NULL); - } -} - -/*ARGSUSED*/ -void -VidmodeRestoreAction(Widget w, XEvent *event, - String *params, Cardinal *num_params) -{ - if (vidtune != NULL) { - if (timeout != 0) - StopTestCallback(w, NULL, NULL); - else - RestoreCallback(w, NULL, NULL); - } -} - -static void -UpdateSyncRates(Bool update) -{ - if (modeline.htotal && modeline.vtotal) { - hsync_rate = (dot_clock * 1000) / modeline.htotal; - vsync_rate = (hsync_rate * 1000) / modeline.vtotal; - if (modeline.flags & V_INTERLACE) - vsync_rate *= 2; - else if (modeline.flags & V_DBLSCAN) - vsync_rate /= 2; - if (update) { - SetLabel(HSYNC, hsync_rate); - SetLabel(VSYNC, vsync_rate); - } - } -} - -static void -SetLabel(int ident, int value) -{ - Arg args[1]; - char label[256]; - - if (ident == FLAGS) { - int len = 0; - - *label = '\0'; - if (value & V_PHSYNC) - len += XmuSnprintf(label, sizeof(label), "%s", "+hsync"); - if (modeline.flags & V_NHSYNC) - len += XmuSnprintf(label + len, sizeof(label), "%s%s", - len ? " " : "", "-hsync"); - if (value & V_PVSYNC) - len += XmuSnprintf(label + len, sizeof(label), "%s%s", - len ? " " : "", "+vsync"); - if (value & V_NVSYNC) - len += XmuSnprintf(label + len, sizeof(label), "%s%s", - len ? " " : "", "-vsync"); - if (value & V_INTERLACE) - len += XmuSnprintf(label + len, sizeof(label), "%s%s", - len ? " " : "", "interlace"); - if (value & V_CSYNC) - len += XmuSnprintf(label + len, sizeof(label), "%s%s", - len ? " " : "", "composite"); - if (value & V_PCSYNC) - len += XmuSnprintf(label + len, sizeof(label), "%s%s", - len ? " " : "", "+csync"); - if (value & V_NCSYNC) - len += XmuSnprintf(label + len, sizeof(label), "%s%s", - len ? " " : "", "-csync"); - if (value & V_DBLSCAN) - len += XmuSnprintf(label + len, sizeof(label), "%s%s", - len ? " " : "", "doublescan"); - - } - else if (ident == CLOCK || ident == HSYNC || ident == VSYNC) - XmuSnprintf(label, sizeof(label), "%6.2f", (float)value / 1000.0); - else - XmuSnprintf(label, sizeof(label), "%d", value); - - XtSetArg(args[0], XtNlabel, label); - XtSetValues(values[ident], args, 1); -} - -/*ARGSUSED*/ -static void -StartAdjustMonitorCallback(Widget w, XtPointer client_data, XtPointer call_data) -{ - repeater = w; -} - -static void -AdjustMonitorCallback(Widget w, XtPointer client_data, XtPointer call_data) -{ - if (repeater != w) - return; - switch ((long)client_data) { - case LEFT: - if (modeline.hsyncend + 4 < modeline.htotal) { - modeline.hsyncstart += 4; - modeline.hsyncend += 4; - SetLabel(HSYNCSTART, modeline.hsyncstart); - SetLabel(HSYNCEND, modeline.hsyncend); - } - else - XBell(XtDisplay(w), 80); - break; - case RIGHT: - if (modeline.hsyncstart - 4 > modeline.hdisplay) { - modeline.hsyncstart -= 4; - modeline.hsyncend -= 4; - SetLabel(HSYNCSTART, modeline.hsyncstart); - SetLabel(HSYNCEND, modeline.hsyncend); - } - else - XBell(XtDisplay(w), 80); - break; - case NARROWER: - modeline.htotal += 4; - SetLabel(HTOTAL, modeline.htotal); - UpdateSyncRates(True); - break; - case WIDER: - if (modeline.htotal - 4 > modeline.hsyncend) { - modeline.htotal -= 4; - SetLabel(HTOTAL, modeline.htotal); - UpdateSyncRates(True); - } - else - XBell(XtDisplay(w), 80); - break; - case UP: - if (modeline.vsyncend + 4 < modeline.vtotal) { - modeline.vsyncstart += 4; - modeline.vsyncend += 4; - SetLabel(VSYNCSTART, modeline.vsyncstart); - SetLabel(VSYNCEND, modeline.vsyncend); - } - else - XBell(XtDisplay(w), 80); - break; - case DOWN: - if (modeline.vsyncstart - 4 > modeline.vdisplay) { - modeline.vsyncstart -= 4; - modeline.vsyncend -= 4; - SetLabel(VSYNCSTART, modeline.vsyncstart); - SetLabel(VSYNCEND, modeline.vsyncend); - } - else - XBell(XtDisplay(w), 80); - break; - case SHORTER: - modeline.vtotal += 4; - SetLabel(VTOTAL, modeline.vtotal); - UpdateSyncRates(True); - break; - case TALLER: - if (modeline.vtotal - 4 > modeline.vsyncend) { - modeline.vtotal -= 4; - SetLabel(VTOTAL, modeline.vtotal); - UpdateSyncRates(True); - } - else - XBell(XtDisplay(w), 80); - break; - } - - if (autoflag) - ApplyCallback(w, call_data, client_data); -} - -/*ARGSUSED*/ -static void -EndAdjustMonitorCallback(Widget w, XtPointer client_data, XtPointer call_data) -{ - repeater = NULL; -} - -static Bool -GetModeLine(Bool save) -{ - if (XF86VidModeGetModeLine(XtDisplay(toplevel), vidtune->screen, - &dot_clock, &modeline)) { - if (save) - memcpy(&orig_modeline, &modeline, sizeof(XF86VidModeModeLine)); - UpdateSyncRates(False); - return (True); - } - - return (False); -} - -static void -CleanUp(Display *display) -{ - /* Make sure mode switching is not locked out at exit */ - XF86VidModeLockModeSwitch(display, vidtune->screen, False); - XFlush(display); -} - -static int -VidmodeError(Display *display, XErrorEvent *error) -{ - if ((error->error_code >= ErrorBase && - error->error_code < ErrorBase + XF86VidModeNumberErrors) || - error->error_code == BadValue) { - hitError = 1; - } - else { - CleanUp(display); - if (XtErrorFunc) - (*XtErrorFunc)(display, error); - } - return (0); -} - -/*ARGSUSED*/ -static void -ApplyCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - hitError = 0; - XF86VidModeModModeLine(XtDisplay(w), vidtune->screen, &modeline); - XSync(XtDisplay(w), False); - if (hitError) { - if (repeater != NULL) { - XtCallActionProc(repeater, "unset", NULL, NULL, 0); - XtCallActionProc(repeater, "stop", NULL, NULL, 0); - repeater = NULL; - } - XBell(XtDisplay(w), 80); - if (timeout) - StopTestCallback(w, NULL, NULL); - GetModeLine(False); - SetLabels(); - } -} - -/*ARGSUSED*/ -static void -AutoCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - autoflag = (Bool)(long)client_data; - XtSetSensitive(apply, !autoflag); -} - -static void -RestoreCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - memcpy(&modeline, &orig_modeline, sizeof(XF86VidModeModeLine)); - if (autoflag) - ApplyCallback(w, call_data, client_data); - SetLabels(); -} - -static void -SelectCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - XF86VidModeModeInfo *info = (XF86VidModeModeInfo*)call_data; - Arg args[1]; - Bool result; - - XF86VidModeLockModeSwitch(XtDisplay(toplevel), vidtune->screen, False); - result = XF86VidModeSwitchToMode(XtDisplay(toplevel), vidtune->screen, info); - XF86VidModeLockModeSwitch(XtDisplay(toplevel), vidtune->screen, True); - if (!result) - return; - - XtSetArg(args[0], XtNlabel, XtName(w)); - XtSetValues(mode, args, 1); - UpdateCallback(w, call_data, client_data); -} - -static void -SwitchCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - int direction = (long)call_data; - Arg args[1]; - Bool result; - char label[32]; - - XF86VidModeLockModeSwitch(XtDisplay(toplevel), vidtune->screen, False); - result = XF86VidModeSwitchMode(XtDisplay(toplevel), vidtune->screen, - direction); - XF86VidModeLockModeSwitch(XtDisplay(toplevel), vidtune->screen, True); - if (!result) - return; - - UpdateCallback(w, call_data, client_data); - - if (modeline.htotal && modeline.vtotal) - XmuSnprintf(label, sizeof(label), "%dx%d @ %d Hz", - modeline.hdisplay, modeline.vdisplay, - (int)((double)dot_clock / (double)modeline.htotal * 1000.0 / - (double)modeline.vtotal)); - else - XmuSnprintf(label, sizeof(label), "%dx%d", - modeline.hdisplay, modeline.vdisplay); - XtSetArg(args[0], XtNlabel, label); - XtSetValues(mode, args, 1); -} - -/*ARGSUSED*/ -static void -UpdateCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - GetModeLine(True); - SetLabels(); - SetLabelAndModeline(); -} - -static void -SetLabels(void) -{ - SetLabel(HSYNCSTART, modeline.hsyncstart); - SetLabel(VSYNCSTART, modeline.vsyncstart); - SetLabel(HSYNCEND, modeline.hsyncend); - SetLabel(VSYNCEND, modeline.vsyncend); - SetLabel(HTOTAL, modeline.htotal); - SetLabel(VTOTAL, modeline.vtotal); - SetLabel(FLAGS, modeline.flags); - SetLabel(CLOCK, dot_clock); - UpdateSyncRates(True); -} - -/*ARGSUSED*/ -static void -ChangeScreenCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - Arg args[1]; - - screenno = (long)call_data; - if (screenno > computer.num_vidmodes || screenno < 0 || - vidtune == computer.vidmodes[screenno]) - return; - - XF86VidModeLockModeSwitch(XtDisplay(toplevel), vidtune->screen, False); - vidtune = computer.vidmodes[screenno]; - XF86VidModeLockModeSwitch(XtDisplay(toplevel), vidtune->screen, True); - UpdateCallback(w, call_data, client_data); - GetModes(); - - XtSetArg(args[0], XtNlabel, XtName(w)); - XtSetValues(screenb, args, 1); - - SetLabelAndModeline(); -} - -/*ARGSUSED*/ -static void -SelectMonitorCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - vidtune->monitor = (XF86ConfMonitorPtr)(call_data); - SetLabelAndModeline(); -} - -/*ARGSUSED*/ -static void -AddVesaModeCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - xf86cfgVesaModeInfo *vesa = (xf86cfgVesaModeInfo*)call_data; - XF86VidModeModeInfo mode; - int num_infos = vidtune->num_infos; - - memcpy(&mode, &vesa->info, sizeof(XF86VidModeModeInfo)); - if (XF86VidModeAddModeLine(XtDisplay(toplevel), vidtune->screen, - &vesa->info, &mode)) { - XSync(XtDisplay(toplevel), False); - GetModes(); - } - else { - XBell(XtDisplayOfObject(w), 80); - return; - } - - if (vidtune && num_infos == vidtune->num_infos) { - /* XF86VidModeAddModeLine returned True, but no modeline was added */ - XBell(XtDisplayOfObject(w), 80); - if (vidtune->monitor && AddMode()) { - XF86ConfModeLinePtr mode; - char label[256], *ptr, *str; - - XmuSnprintf(label, sizeof(label), "%s", vesa->ident); - - /* format mode name to not have spaces */ - ptr = strchr(label, ')'); - if (ptr) - *++ptr = '\0'; - ptr = str = label; - while (*ptr) { - if (*ptr != ' ') - *str++ = *ptr; - ++ptr; - } - *str = '\0'; - - if (xf86findModeLine(label, vidtune->monitor->mon_modeline_lst) - != NULL && !ForceAddMode()) - return; - - mode = (XF86ConfModeLinePtr)XtCalloc(1, sizeof(XF86ConfModeLineRec)); - mode->ml_identifier = XtNewString(label); - mode->ml_clock = vesa->info.dotclock; - mode->ml_hdisplay = vesa->info.hdisplay; - mode->ml_hsyncstart = vesa->info.hsyncstart; - mode->ml_hsyncend = vesa->info.hsyncend; - mode->ml_htotal = vesa->info.htotal; - mode->ml_vdisplay = vesa->info.vdisplay; - mode->ml_vsyncstart = vesa->info.vsyncstart; - mode->ml_vsyncend = vesa->info.vsyncend; - mode->ml_vtotal = vesa->info.vtotal; -/* mode->ml_vscan = ???;*/ - mode->ml_flags = vesa->info.flags; - mode->ml_hskew = vesa->info.hskew; - vidtune->monitor->mon_modeline_lst = - xf86addModeLine(vidtune->monitor->mon_modeline_lst, mode); - } - } -} - -static void -GetModes(void) -{ - int i; - char label[32]; - Arg args[1]; - static char menuName[16]; - static int menuN; - - XFree(vidtune->infos); - XF86VidModeGetAllModeLines(XtDisplay(toplevel), vidtune->screen, - &vidtune->num_infos, &vidtune->infos); - - XmuSnprintf(menuName, sizeof(menuName), "menu%d", menuN); - menuN = !menuN; - if (menu) - XtDestroyWidget(menu); - menu = XtCreatePopupShell(menuName, simpleMenuWidgetClass, vtune, NULL, 0); - XtVaSetValues(mode, XtNmenuName, menuName, NULL); - for (i = 0; i < vidtune->num_infos; i++) { - Widget sme; - - if ((double)vidtune->infos[i]->htotal && - (double)vidtune->infos[i]->vtotal) - XmuSnprintf(label, sizeof(label), "%dx%d @ %d Hz", - vidtune->infos[i]->hdisplay, - vidtune->infos[i]->vdisplay, - (int)((double)vidtune->infos[i]->dotclock / - (double)vidtune->infos[i]->htotal * 1000.0 / - (double)vidtune->infos[i]->vtotal)); - else - XmuSnprintf(label, sizeof(label), "%dx%d", - vidtune->infos[i]->hdisplay, - vidtune->infos[i]->vdisplay); - sme = XtCreateManagedWidget(label, smeBSBObjectClass, menu, NULL, 0); - XtAddCallback(sme, XtNcallback, SelectCallback, - (XtPointer)vidtune->infos[i]); - } - - if (modeline.htotal && modeline.vtotal) - XmuSnprintf(label, sizeof(label), "%dx%d @ %d Hz", - modeline.hdisplay, modeline.vdisplay, - (int)((double)dot_clock / (double)modeline.htotal * 1000.0 / - (double)modeline.vtotal)); - else - XmuSnprintf(label, sizeof(label), "%dx%d", - modeline.hdisplay, modeline.vdisplay); - XtSetArg(args[0], XtNlabel, label); - XtSetValues(mode, args, 1); -} - -static int do_force, asking_force; - -static void -PopdownForce(Widget w, XtPointer user_data, XtPointer call_data) -{ - asking_force = 0; - XtPopdown(forceshell); - do_force = (long)user_data; -} - -static int -ForceAddMode(void) -{ - if (forceshell == NULL) { - Widget dialog; - - forceshell = XtCreatePopupShell("force", transientShellWidgetClass, - toplevel, NULL, 0); - dialog = XtVaCreateManagedWidget("dialog", dialogWidgetClass, - forceshell, XtNvalue, NULL, NULL); - XawDialogAddButton(dialog, "yes", PopdownForce, (XtPointer)True); - XawDialogAddButton(dialog, "no", PopdownForce, (XtPointer)False); - XtRealizeWidget(forceshell); - XSetWMProtocols(DPY, XtWindow(forceshell), &wm_delete_window, 1); - } - - asking_force = 1; - - XtPopup(forceshell, XtGrabExclusive); - while (asking_force) - XtAppProcessEvent(XtWidgetToApplicationContext(forceshell), XtIMAll); - - return (do_force); -} - -static int do_add, asking_add; - -static void -PopdownAdd(Widget w, XtPointer user_data, XtPointer call_data) -{ - asking_add = 0; - XtPopdown(addshell); - do_add = (long)user_data; -} - -void -CancelAddModeAction(Widget w, XEvent *event, - String *params, Cardinal *num_params) -{ - if (asking_force) - PopdownForce(w, (XtPointer)False, NULL); - else if (asking_add) - PopdownAdd(w, (XtPointer)False, NULL); -} - -static int -AddMode(void) -{ - if (addshell == NULL) { - Widget dialog; - - addshell = XtCreatePopupShell("addMode", transientShellWidgetClass, - toplevel, NULL, 0); - dialog = XtVaCreateManagedWidget("dialog", dialogWidgetClass, - addshell, XtNvalue, NULL, NULL); - XawDialogAddButton(dialog, "yes", PopdownAdd, (XtPointer)True); - XawDialogAddButton(dialog, "no", PopdownAdd, (XtPointer)False); - XtRealizeWidget(addshell); - XSetWMProtocols(DPY, XtWindow(addshell), &wm_delete_window, 1); - } - - asking_add = 1; - - XtPopup(addshell, XtGrabExclusive); - while (asking_add) - XtAppProcessEvent(XtWidgetToApplicationContext(addshell), XtIMAll); - - return (do_add); -} - -/*ARGSUSED*/ -static void -AddModeCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - if (vidtune && vidtune->monitor) { - char *label; - Arg args[1]; - XF86ConfModeLinePtr mode; - - XtSetArg(args[0], XtNstring, &label); - XtGetValues(text, args, 1); - if (*label == '\0') { - XBell(XtDisplay(w), 80); - return; - } - if (xf86findModeLine(label, vidtune->monitor->mon_modeline_lst) - != NULL && !ForceAddMode()) - return; - - mode = (XF86ConfModeLinePtr)XtCalloc(1, sizeof(XF86ConfModeLineRec)); - mode->ml_identifier = XtNewString(label); - mode->ml_clock = dot_clock; - mode->ml_hdisplay = modeline.hdisplay; - mode->ml_hsyncstart = modeline.hsyncstart; - mode->ml_hsyncend = modeline.hsyncend; - mode->ml_htotal = modeline.htotal; - mode->ml_vdisplay = modeline.vdisplay; - mode->ml_vsyncstart = modeline.vsyncstart; - mode->ml_vsyncend = modeline.vsyncend; - mode->ml_vtotal = modeline.vtotal; -/* mode->ml_vscan = ???;*/ - mode->ml_flags = modeline.flags; - mode->ml_hskew = modeline.hskew; - vidtune->monitor->mon_modeline_lst = - xf86addModeLine(vidtune->monitor->mon_modeline_lst, mode); - } - else - XBell(XtDisplay(w), 80); -} - -/*ARGSUSED*/ -static void -StopTestCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - XtRemoveTimeOut(timeout); - TestTimeout((XtPointer)w, NULL); -} - -/*ARGSUSED*/ -void -CancelTestModeAction(Widget w, XEvent *event, - String *params, Cardinal *num_params) -{ - StopTestCallback(w, NULL, NULL); -} - -static void -TestTimeout(XtPointer client_data, XtIntervalId* id) -{ - XF86VidModeModeLine mode; - - XtPopdown(testshell); - timeout = 0; - memcpy(&mode, &modeline, sizeof(XF86VidModeModeLine)); - memcpy(&modeline, &orig_modeline, sizeof(XF86VidModeModeLine)); - ApplyCallback((Widget)client_data, NULL, NULL); -/* if (hitError == 0)*/ - memcpy(&modeline, &mode, sizeof(XF86VidModeModeLine)); - SetLabels(); -} - -static void -TestCallback(Widget w, XtPointer call_data, XtPointer client_data) -{ - if (testshell == NULL) { - Widget dialog; - - testshell = XtCreatePopupShell("test", transientShellWidgetClass, - toplevel, NULL, 0); - dialog = XtVaCreateManagedWidget("dialog", dialogWidgetClass, - testshell, XtNvalue, NULL, NULL); - XawDialogAddButton(dialog, "stop", StopTestCallback, NULL); - XtRealizeWidget(testshell); - XSetWMProtocols(DPY, XtWindow(testshell), &wm_delete_window, 1); - } - - XtPopup(testshell, XtGrabExclusive); - - XSync(XtDisplay(toplevel), False); - timeout = XtAppAddTimeOut(XtWidgetToApplicationContext(w), - /* the timeout probably shoud be converted to a resource */ - 4000, TestTimeout, (XtPointer)w); - ApplyCallback(w, call_data, client_data); -} |