2 * Copyright 1999 The XFree86 Project
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * Written by David Bateman
29 #include <X11/Xutil.h>
30 #include <X11/extensions/xf86vmode.h>
34 static char *ProgramName;
35 static int MajorVersion, MinorVersion;
36 static int EventBase, ErrorBase;
38 /* Minimum extension version required */
42 /* Maximum and Minimum gamma values */
44 #define GAMMA_MAX 10.0
49 fprintf (stderr, "usage: %s [-options]\n\n",
51 fprintf (stderr, "where the available options are:\n");
52 fprintf (stderr, " -display host:dpy or -d\n");
53 fprintf (stderr, " -quiet or -q\n");
54 fprintf (stderr, " -screen or -s\n");
55 fprintf (stderr, " -gamma f.f Gamma Value\n");
56 fprintf (stderr, " -rgamma f.f Red Gamma Value\n");
57 fprintf (stderr, " -ggamma f.f Green Gamma Value\n");
58 fprintf (stderr, " -bgamma f.f Blue Gamma Value\n\n");
59 fprintf (stderr, "If no gamma is specified, returns the current setting\n");
65 * The following is a hack until XrmParseCommand is ready. It determines
66 * whether or not the given string is an abbreviation of the arg.
70 isabbreviation(char *arg, char *s, int minslen)
76 if (strcmp (arg, s) == 0) return (True);
78 arglen = strlen (arg);
81 /* too long or too short */
82 if (slen >= arglen || slen < minslen) return (False);
85 if (strncmp (arg, s, slen) == 0) return (True);
92 main(int argc, char *argv[])
95 char *displayname = NULL;
97 float gam = -1., rgam = -1., ggam = -1., bgam = -1.;
98 XF86VidModeGamma gamma;
102 ProgramName = argv[0];
103 for (i = 1; i < argc; i++) {
107 if (isabbreviation ("-display", arg, 1)) {
108 if (++i >= argc) Syntax ();
109 displayname = argv[i];
111 } else if (isabbreviation ("-quiet", arg, 1)) {
114 } else if (isabbreviation ("-screen", arg, 1)) {
115 if (++i >= argc) Syntax ();
116 screen = atoi(argv[i]);
118 } else if (isabbreviation ("-gamma", arg, 2)) {
119 if (++i >= argc) Syntax ();
120 if ((rgam >= 0.) || (ggam >= 0.) || (bgam >= 0.))
122 gam = (float)atof(argv[i]);
123 if ((gam < GAMMA_MIN) || (gam > GAMMA_MAX)) {
125 "Gamma values must be between %6.3f and %6.3f\n",
126 GAMMA_MIN, GAMMA_MAX);
130 } else if (isabbreviation ("-rgamma", arg, 2)) {
131 if (++i >= argc) Syntax ();
132 if (gam >= 0.) Syntax ();
133 rgam = (float)atof(argv[i]);
134 if ((rgam < GAMMA_MIN) || (rgam > GAMMA_MAX)) {
136 "Gamma values must be between %6.3f and %6.3f\n",
137 GAMMA_MIN, GAMMA_MAX);
141 } else if (isabbreviation ("-ggamma", arg, 2)) {
142 if (++i >= argc) Syntax ();
143 if (gam >= 0.) Syntax ();
144 ggam = (float)atof(argv[i]);
145 if ((ggam < GAMMA_MIN) || (ggam > GAMMA_MAX)) {
147 "Gamma values must be between %6.3f and %6.3f\n",
148 GAMMA_MIN, GAMMA_MAX);
152 } else if (isabbreviation ("-bgamma", arg, 2)) {
153 if (++i >= argc) Syntax ();
154 if (gam >= 0.) Syntax ();
155 bgam = (float)atof(argv[i]);
156 if ((bgam < GAMMA_MIN) || (bgam > GAMMA_MAX)) {
158 "Gamma values must be between %6.3f and %6.3f\n",
159 GAMMA_MIN, GAMMA_MAX);
169 if ((dpy = XOpenDisplay(displayname)) == NULL) {
170 fprintf (stderr, "%s: unable to open display '%s'\n",
171 ProgramName, XDisplayName (displayname));
173 } else if (screen == -1)
174 screen = DefaultScreen(dpy);
176 if (!XF86VidModeQueryVersion(dpy, &MajorVersion, &MinorVersion)) {
177 fprintf(stderr, "Unable to query video extension version\n");
181 if (!XF86VidModeQueryExtension(dpy, &EventBase, &ErrorBase)) {
182 fprintf(stderr, "Unable to query video extension information\n");
186 /* Fail if the extension version in the server is too old */
187 if (MajorVersion < MINMAJOR ||
188 (MajorVersion == MINMAJOR && MinorVersion < MINMINOR)) {
190 "Xserver is running an old XFree86-VidModeExtension version"
191 " (%d.%d)\n", MajorVersion, MinorVersion);
192 fprintf(stderr, "Minimum required version is %d.%d\n",
197 if (!XF86VidModeGetGamma(dpy, screen, &gamma)) {
198 fprintf(stderr, "Unable to query gamma correction\n");
202 fprintf(stderr, "-> Red %6.3f, Green %6.3f, Blue %6.3f\n", gamma.red,
203 gamma.green, gamma.blue);
210 if (!XF86VidModeSetGamma(dpy, screen, &gamma)) {
211 fprintf(stderr, "Unable to set gamma correction\n");
214 if (!XF86VidModeGetGamma(dpy, screen, &gamma)) {
215 fprintf(stderr, "Unable to query gamma correction\n");
218 fprintf(stderr, "<- Red %6.3f, Green %6.3f, Blue %6.3f\n",
219 gamma.red, gamma.green, gamma.blue);
221 } else if ((rgam >= 0.) || (ggam >= 0.) || (bgam >= 0.)) {
222 if (rgam >= 0.) gamma.red = rgam;
223 if (ggam >= 0.) gamma.green = ggam;
224 if (bgam >= 0.) gamma.blue = bgam;
225 if (!XF86VidModeSetGamma(dpy, screen, &gamma)) {
226 fprintf(stderr, "Unable to set gamma correction\n");
229 if (!XF86VidModeGetGamma(dpy, screen, &gamma)) {
230 fprintf(stderr, "Unable to query gamma correction\n");
233 fprintf(stderr, "<- Red %6.3f, Green %6.3f, Blue %6.3f\n",
234 gamma.red, gamma.green, gamma.blue);