From 4ae7d9cd14b3c80b7e45e27d1d74f01497a0ec01 Mon Sep 17 00:00:00 2001
From: Mattias Andrée <maandree@operamail.com>
Date: Sun, 26 Jan 2014 09:55:39 +0100
Subject: implement --set
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Mattias Andrée <maandree@operamail.com>
---
 src/adjbacklight.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 93 insertions(+)

diff --git a/src/adjbacklight.c b/src/adjbacklight.c
index 4bf50ac..289401c 100644
--- a/src/adjbacklight.c
+++ b/src/adjbacklight.c
@@ -99,6 +99,14 @@ static void adjust(int cols, const char* device);
  */
 static float getbrightness(const char* device);
 
+/**
+ * Sets the current backlight setting on a device
+ * 
+ * @param  device      The device from which to get backlight
+ * @param  adjustment  The adjustment to make
+ */
+static void setbrightness(const char* device, const char* adjustment);
+
 /**
  * Read a file
  * 
@@ -395,6 +403,8 @@ int main(int argc, char** argv)
 		      nbrightness++;
 		    }
 		}
+	      else if (set)
+		setbrightness(device, set);
 	      else
 		adjust(cols, device);
 	    }
@@ -422,6 +432,8 @@ int main(int argc, char** argv)
 				nbrightness++;
 			      }
 			  }
+			else if (set)
+			  setbrightness(device, set);
 			else
 			  adjust(cols, device);
 		      }
@@ -597,6 +609,87 @@ static float getbrightness(const char* device)
 
 
 
+/**
+ * Sets the current backlight setting on a device
+ * 
+ * @param  device      The device from which to get backlight
+ * @param  adjustment  The adjustment to make
+ */
+static void setbrightness(const char* device, const char* adjustment)
+{
+  int min, max, cur, i, adj;
+  size_t lendir;
+  char* dir = alloca(PATH_MAX * sizeof(char));
+  char* buf = alloca(256);
+  int act = 0, integer = 0, decimal = 0, p = 0, d = 0;
+  
+  *dir = 0;
+  dir = strcat(dir, "/sys/class/backlight/");
+  dir = strcat(dir, device);
+  dir = strcat(dir, "/");
+  lendir = strlen(dir);
+  
+  /* Get brightness parameters */
+  min = 0;
+  if (readfile(buf, strcat(dir, "max_brightness")))
+    return;
+  max = atoi(unnl(buf));
+  *(dir + lendir) = 0;
+  if (readfile(buf, strcat(dir, "brightness")))
+    return;
+  cur = atoi(unnl(buf));
+  
+  if (max <= min)
+    return; /* what the buck */
+  
+  /* Read -/+/= head */
+  if (*adjustment == '-')
+    act = -1;
+  else if (*adjustment == '+')
+    act = 1;
+  else if (*adjustment != '=')
+    adjustment--;
+  adjustment++;
+  
+  /* Parse numerical part */
+  for (; *adjustment && (*adjustment != '%'); adjustment++)
+    if (*adjustment == '.')
+      d = 1;
+    else if (d)
+      {
+	if ((d * 10 < 0) || (decimal * 10 + 9 < 0)) /* stop if the precision is too high */
+	  continue;
+	d *= 10;
+	decimal *= 10;
+	decimal += (*adjustment) - '0';
+      }
+    else
+      {
+	integer *= 10;
+	integer -= (*adjustment) - '0';
+      }
+  
+  /* Count number of p:s */
+  while (*adjustment++)
+    p++;
+  
+  /* Calculate value to send */
+  if (p == 0)
+    adj = (int)((double)decimal / (double)d + 0.5d) - integer;
+  else if (p == 1)
+    adj = (int)(((double)decimal / (double)d - (double)integer) * (double)(max - min));
+  else
+    adj = (int)(((double)decimal / (double)d - (double)integer) * (double)cur);
+  adj = (act & 1) * cur + (act | 1) * adj;
+  if (adj < min)  adj = min;
+  if (adj > max)  adj = max;
+  
+  /* Send value */
+  writefile(buf, adj, dir);
+}
+
+
+
 /**
  * Read a file
  * 
-- 
cgit v1.2.3-70-g09d2