| ... |
... |
@@ -19,8 +19,14 @@ |
|
19
|
19
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
20
|
20
|
* OF THIS SOFTWARE.
|
|
21
|
21
|
*/
|
|
|
22
|
+
|
|
|
23
|
+#ifdef HAVE_CONFIG_H
|
|
|
24
|
+# include "config.h"
|
|
|
25
|
+#endif
|
|
|
26
|
+
|
|
22
|
27
|
#include <stdio.h>
|
|
23
|
28
|
#include <stdlib.h>
|
|
|
29
|
+#include <errno.h>
|
|
24
|
30
|
|
|
25
|
31
|
#include <xcb/xcb.h>
|
|
26
|
32
|
#include <xcb/xcb_util.h>
|
| ... |
... |
@@ -38,19 +44,41 @@ static char *program_name; |
|
38
|
44
|
static xcb_atom_t backlight, backlight_new, backlight_legacy;
|
|
39
|
45
|
|
|
40
|
46
|
static void
|
|
41
|
|
-usage (void)
|
|
|
47
|
+usage (int exitcode)
|
|
42
|
48
|
{
|
|
43
|
49
|
fprintf(stderr, "usage: %s [options]\n%s", program_name,
|
|
44
|
50
|
" where options are:\n"
|
|
45
|
51
|
" -display <display> or -d <display>\n"
|
|
46
|
52
|
" -help\n"
|
|
|
53
|
+ " -version\n"
|
|
47
|
54
|
" -set <percentage> or = <percentage>\n"
|
|
48
|
55
|
" -inc <percentage> or + <percentage>\n"
|
|
49
|
56
|
" -dec <percentage> or - <percentage>\n"
|
|
50
|
57
|
" -get\n"
|
|
51
|
58
|
" -time <fade time in milliseconds>\n"
|
|
52
|
59
|
" -steps <number of steps in fade>\n");
|
|
53
|
|
- exit (1);
|
|
|
60
|
+ exit (exitcode);
|
|
|
61
|
+}
|
|
|
62
|
+
|
|
|
63
|
+static double
|
|
|
64
|
+atof_or_die (char *str)
|
|
|
65
|
+{
|
|
|
66
|
+ double retval;
|
|
|
67
|
+ char *endptr = NULL;
|
|
|
68
|
+ errno = 0;
|
|
|
69
|
+ retval = strtod(str, &endptr);
|
|
|
70
|
+ if ((errno != 0) || (endptr == str)) {
|
|
|
71
|
+ fprintf(stderr, "%s: invalid argument '%s'\n", program_name, str);
|
|
|
72
|
+ usage(1);
|
|
|
73
|
+ }
|
|
|
74
|
+ return retval;
|
|
|
75
|
+}
|
|
|
76
|
+
|
|
|
77
|
+static void
|
|
|
78
|
+missing_arg (const char *option)
|
|
|
79
|
+{
|
|
|
80
|
+ fprintf(stderr, "%s: %s requires an argument\n", program_name, option);
|
|
|
81
|
+ usage(1);
|
|
54
|
82
|
}
|
|
55
|
83
|
|
|
56
|
84
|
static long
|
| ... |
... |
@@ -107,7 +135,7 @@ main (int argc, char **argv) |
|
107
|
135
|
{
|
|
108
|
136
|
char *dpy_name = NULL;
|
|
109
|
137
|
op_t op = Get;
|
|
110
|
|
- int value = 0;
|
|
|
138
|
+ double value = 0;
|
|
111
|
139
|
int i;
|
|
112
|
140
|
int total_time = 200; /* ms */
|
|
113
|
141
|
int steps = 20;
|
| ... |
... |
@@ -129,47 +157,47 @@ main (int argc, char **argv) |
|
129
|
157
|
{
|
|
130
|
158
|
if (!strcmp (argv[i], "-display") || !strcmp ("-d", argv[i]))
|
|
131
|
159
|
{
|
|
132
|
|
- if (++i >= argc) usage();
|
|
|
160
|
+ if (++i >= argc) missing_arg (argv[i-1]);
|
|
133
|
161
|
dpy_name = argv[i];
|
|
134
|
162
|
continue;
|
|
135
|
163
|
}
|
|
136
|
164
|
if (!strcmp (argv[i], "-set") || !strcmp (argv[i], "="))
|
|
137
|
165
|
{
|
|
138
|
|
- if (++i >= argc) usage();
|
|
|
166
|
+ if (++i >= argc) missing_arg (argv[i-1]);
|
|
139
|
167
|
op = Set;
|
|
140
|
|
- value = atoi (argv[i]);
|
|
|
168
|
+ value = atof_or_die (argv[i]);
|
|
141
|
169
|
continue;
|
|
142
|
170
|
}
|
|
143
|
171
|
if (argv[i][0] == '=' && isdigit (argv[i][1]))
|
|
144
|
172
|
{
|
|
145
|
173
|
op = Set;
|
|
146
|
|
- value = atoi (argv[i] + 1);
|
|
|
174
|
+ value = atof_or_die (argv[i] + 1);
|
|
147
|
175
|
continue;
|
|
148
|
176
|
}
|
|
149
|
177
|
if (!strcmp (argv[i], "-inc") || !strcmp (argv[i], "+"))
|
|
150
|
178
|
{
|
|
151
|
|
- if (++i >= argc) usage();
|
|
|
179
|
+ if (++i >= argc) missing_arg (argv[i-1]);
|
|
152
|
180
|
op = Inc;
|
|
153
|
|
- value = atoi (argv[i]);
|
|
|
181
|
+ value = atof_or_die (argv[i]);
|
|
154
|
182
|
continue;
|
|
155
|
183
|
}
|
|
156
|
184
|
if (argv[i][0] == '+' && isdigit (argv[i][1]))
|
|
157
|
185
|
{
|
|
158
|
186
|
op = Inc;
|
|
159
|
|
- value = atoi (argv[i] + 1);
|
|
|
187
|
+ value = atof_or_die (argv[i] + 1);
|
|
160
|
188
|
continue;
|
|
161
|
189
|
}
|
|
162
|
190
|
if (!strcmp (argv[i], "-dec") || !strcmp (argv[i], "-"))
|
|
163
|
191
|
{
|
|
164
|
|
- if (++i >= argc) usage();
|
|
|
192
|
+ if (++i >= argc) missing_arg (argv[i-1]);
|
|
165
|
193
|
op = Dec;
|
|
166
|
|
- value = atoi (argv[i]);
|
|
|
194
|
+ value = atof_or_die (argv[i]);
|
|
167
|
195
|
continue;
|
|
168
|
196
|
}
|
|
169
|
197
|
if (argv[i][0] == '-' && isdigit (argv[i][1]))
|
|
170
|
198
|
{
|
|
171
|
199
|
op = Dec;
|
|
172
|
|
- value = atoi (argv[i] + 1);
|
|
|
200
|
+ value = atof_or_die (argv[i] + 1);
|
|
173
|
201
|
continue;
|
|
174
|
202
|
}
|
|
175
|
203
|
if (!strcmp (argv[i], "-get") || !strcmp (argv[i], "-g"))
|
| ... |
... |
@@ -179,21 +207,28 @@ main (int argc, char **argv) |
|
179
|
207
|
}
|
|
180
|
208
|
if (!strcmp (argv[i], "-time"))
|
|
181
|
209
|
{
|
|
182
|
|
- if (++i >= argc) usage();
|
|
|
210
|
+ if (++i >= argc) missing_arg (argv[i-1]);
|
|
183
|
211
|
total_time = atoi (argv[i]);
|
|
184
|
212
|
continue;
|
|
185
|
213
|
}
|
|
186
|
214
|
if (!strcmp (argv[i], "-steps"))
|
|
187
|
215
|
{
|
|
188
|
|
- if (++i >= argc) usage();
|
|
|
216
|
+ if (++i >= argc) missing_arg (argv[i-1]);
|
|
189
|
217
|
steps = atoi (argv[i]);
|
|
190
|
218
|
continue;
|
|
191
|
219
|
}
|
|
192
|
220
|
if (!strcmp (argv[i], "-help") || !strcmp (argv[i], "-?"))
|
|
193
|
221
|
{
|
|
194
|
|
- usage ();
|
|
|
222
|
+ usage (0);
|
|
|
223
|
+ }
|
|
|
224
|
+ if (!strcmp (argv[i], "-version"))
|
|
|
225
|
+ {
|
|
|
226
|
+ puts (PACKAGE_STRING);
|
|
|
227
|
+ exit (0);
|
|
195
|
228
|
}
|
|
196
|
|
- usage ();
|
|
|
229
|
+ fprintf(stderr, "%s: unrecognized argument '%s'\n",
|
|
|
230
|
+ program_name, argv[i]);
|
|
|
231
|
+ usage (1);
|
|
197
|
232
|
}
|
|
198
|
233
|
conn = xcb_connect (dpy_name, NULL);
|
|
199
|
234
|
ver_cookie = xcb_randr_query_version (conn, 1, 2);
|
| ... |
... |
@@ -245,18 +280,18 @@ main (int argc, char **argv) |
|
245
|
280
|
xcb_window_t root = screen->root;
|
|
246
|
281
|
xcb_randr_output_t *outputs;
|
|
247
|
282
|
|
|
248
|
|
- xcb_randr_get_screen_resources_cookie_t resources_cookie;
|
|
249
|
|
- xcb_randr_get_screen_resources_reply_t *resources_reply;
|
|
|
283
|
+ xcb_randr_get_screen_resources_current_cookie_t resources_cookie;
|
|
|
284
|
+ xcb_randr_get_screen_resources_current_reply_t *resources_reply;
|
|
250
|
285
|
|
|
251
|
|
- resources_cookie = xcb_randr_get_screen_resources (conn, root);
|
|
252
|
|
- resources_reply = xcb_randr_get_screen_resources_reply (conn, resources_cookie, &error);
|
|
|
286
|
+ resources_cookie = xcb_randr_get_screen_resources_current (conn, root);
|
|
|
287
|
+ resources_reply = xcb_randr_get_screen_resources_current_reply (conn, resources_cookie, &error);
|
|
253
|
288
|
if (error != NULL || resources_reply == NULL) {
|
|
254
|
289
|
int ec = error ? error->error_code : -1;
|
|
255
|
290
|
fprintf (stderr, "RANDR Get Screen Resources returned error %d\n", ec);
|
|
256
|
291
|
continue;
|
|
257
|
292
|
}
|
|
258
|
293
|
|
|
259
|
|
- outputs = xcb_randr_get_screen_resources_outputs (resources_reply);
|
|
|
294
|
+ outputs = xcb_randr_get_screen_resources_current_outputs (resources_reply);
|
|
260
|
295
|
for (int o = 0; o < resources_reply->num_outputs; o++)
|
|
261
|
296
|
{
|
|
262
|
297
|
xcb_randr_output_t output = outputs[o];
|
| ... |
... |
@@ -308,7 +343,7 @@ main (int argc, char **argv) |
|
308
|
343
|
cur = new;
|
|
309
|
344
|
else
|
|
310
|
345
|
cur += step;
|
|
311
|
|
- backlight_set (conn, output, (long) cur);
|
|
|
346
|
+ backlight_set (conn, output, (long) (cur + 0.5));
|
|
312
|
347
|
xcb_flush (conn);
|
|
313
|
348
|
usleep (total_time * 1000 / steps);
|
|
314
|
349
|
}
|