<div>Hi, all!<br></div><div><br></div><div>Last weekend I had an unfortunate error, that I presume was a bug with xrandr.<br></div><div>when I executed this command<br></div><div><br></div><div>    $ xrandr --output eDP1 --brightness -.5<br></div><div><br></div><div>(it was an accident, via a script triggered by a keyboard shortcut.)<br></div><div><br></div><div>my screen display went really bright. I saw that I made something wrong and<br></div><div>reset the brightness using<br></div><div><br></div><div>    $ xrandr --output eDP1 --brightness 1<br></div><div><br></div><div>Unfortunately, my display died. for a few hours my display was still working,<br></div><div>with pixels failing. barely working I must say, until today. My screen died.<br></div><div>But that's ok, I'm not complaining with xrandr. It was my fault, and my fault<br></div><div>only.<br></div><div><br></div><div>I took some time to read the source code for xrandr and I think I found what<br></div><div>made this behavior occur. I presume it's a bug, and not an intended effect.<br></div><div><br></div><div>In the lines 2991-2999 of the file xrandr.c we can see the following:<br></div><div><br></div><div>if (!strcmp ("--brightness", argv[i])) {<br></div><div>    if (!config_output) argerr ("%s must be used after --output\n", argv[i]);<br></div><div>    if (++i >= argc) argerr ("%s requires an argument\n", argv[i-1]);<br></div><div>    if (sscanf(argv[i], "%f", &config_output->brightness) != 1)<br></div><div>argerr ("%s: invalid argument '%s'\n", argv[i-1], argv[i]);<br></div><div>    config_output->changes |= changes_gamma;<br></div><div>    setit_1_2 = True;<br></div><div>    continue;<br></div><div>}<br></div><div><br></div><div>And, in other lines we can see that the brightness variable is passed to some<br></div><div>math operations, like in the lines 1511-1532, where the variable is used to<br></div><div>compute gamma values.<br></div><div><br></div><div>I thing that, when a negative value is passed to such operations, the returned<br></div><div>value is NaN (actually the value is -nan). I didn't get much of the following<br></div><div>steps after that, but I suppose that using a NaN as a parameter to a function<br></div><div>that set gamma values for pixels (and a negative brightness to the screen) would<br></div><div>mess up with the display.<br></div><div><br></div><div>I'm definitely not a experienced programmer nor understand in great detail what<br></div><div>xrandr is actually doing, but I think that if we add a couple of more lines for<br></div><div>check input values this behavior/(bug?) would be solved.<br></div><div><br></div><div>What I could think of to add is this two commented lines in the middle of the<br></div><div>piece of code reproduced above:<br></div><div><br></div><div><br></div><div>if (!strcmp ("--brightness", argv[i])) {<br></div><div>    if (!config_output) argerr ("%s must be used after --output\n", argv[i]);<br></div><div>    if (++i >= argc) argerr ("%s requires an argument\n", argv[i-1]);<br></div><div>    if (sscanf(argv[i], "%f", &config_output->brightness) != 1)<br></div><div>argerr ("%s: invalid argument '%s'\n", argv[i-1], argv[i]);<br></div><div>/*         if (isnan(config_output->brightness) || isinf(config_output->brightness)) */<br></div><div>/*                argerr ("%s: '%s' must be a positive value\n", argv[i-1], argv[i]); */<br></div><div>    config_output->changes |= changes_gamma;<br></div><div>    setit_1_2 = True;<br></div><div>    continue;<br></div><div>}<br></div><div><br></div><div><br></div><div>I don't know if this would be accepted, but, anyway, I thank you all for your<br></div><div>attention!<br></div><div><br></div><div><br></div><div>PS: I'm using an updated Arch Linux, and xrandr version is 1.5.1<br></div><div><br></div><div>    $ uname -a<br></div><div>    Linux mcsarch 5.11.10-arch1-1 #1 SMP PREEMPT Fri, 26 Mar 2021 00:11:29 +0000 x86_64 GNU/Linux<br></div><div><br></div><div>    $ xrandr --version<br></div><div>    xrandr program version       1.5.1<br></div><div>    Server reports RandR version 1.6<br></div><div><br></div>