Add optional argument to $acpiacadapter
authorPavel Labath <pavelo@centrum.sk>
Sun, 24 Jan 2010 14:34:03 +0000 (15:34 +0100)
committerPavel Labath <pavelo@centrum.sk>
Sun, 24 Jan 2010 15:12:31 +0000 (16:12 +0100)
The exact location of the state information seems hardware dependent, so this adds the option to
specify it manually. (linux only)

doc/variables.xml
src/common.h
src/conky.c
src/core.c
src/freebsd.c
src/linux.c
src/netbsd.c

index 8b438b8..6c53a2c 100644 (file)
@@ -4,8 +4,11 @@
             <command>
                 <option>acpiacadapter</option>
             </command>
+            <option>(adapter)</option>
         </term>
-        <listitem>ACPI ac adapter state. 
+        <listitem>ACPI ac adapter state. On linux, the adapter option specifies the
+        subfolder of /sys/class/power_supply containing the state information (defaults
+        to "AC"). Other systems ignore it.
         <para /></listitem>
     </varlistentry>
     <varlistentry>
index 2c1ddd1..f9f0393 100644 (file)
@@ -61,7 +61,7 @@ extern int no_buffers;
 
 int open_acpi_temperature(const char *name);
 double get_acpi_temperature(int fd);
-void get_acpi_ac_adapter(char *, size_t);
+void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size, const char *adapter);
 void get_acpi_fan(char *, size_t);
 void get_battery_stuff(char *buf, unsigned int n, const char *bat, int item);
 int get_battery_perct(const char *bat);
index fdc5996..7c47b33 100644 (file)
@@ -865,7 +865,7 @@ void generate_text_internal(char *p, int p_max_size,
                                get_acpi_fan(p, p_max_size);
                        }
                        OBJ(acpiacadapter) {
-                               get_acpi_ac_adapter(p, p_max_size);
+                               get_acpi_ac_adapter(p, p_max_size, (const char *)obj->data.opaque);
                        }
                        OBJ(battery) {
                                get_battery_stuff(p, p_max_size, obj->data.s, BATTERY_STATUS);
index 7b50030..68997ad 100644 (file)
@@ -157,6 +157,22 @@ struct text_object *construct_text_object(const char *s, const char *arg, long
        OBJ(acpitemp, 0)
                obj->data.i = open_acpi_temperature(arg);
        END OBJ(acpiacadapter, 0)
+               if(arg) {
+#ifdef __linux__
+                       if(strpbrk(arg, "/.") != NULL) {
+                               /* 
+                                * a bit of paranoia. screen out funky paths
+                                * i hope no device will have a '.' in its name
+                                */
+                               NORM_ERR("acpiacadapter: arg must not contain '/' or '.'");
+                       } else 
+                               obj->data.opaque = strdup(arg);
+#else
+                       NORM_ERR("acpiacadapter: arg is only used on linux");
+#endif
+               }
+               if(! obj->data.opaque)
+                       obj->data.opaque = strdup("AC");
 #endif /* !__OpenBSD__ */
        END OBJ(freq, 0)
                get_cpu_count();
@@ -1351,6 +1367,9 @@ void free_text_objects(struct text_object *root, int internal)
                        case OBJ_acpitemp:
                                close(data.i);
                                break;
+                       case OBJ_acpiacadapter:
+                               free(data.opaque);
+                               break;
 #endif /* !__OpenBSD__ */
 #ifdef __linux__
                        case OBJ_i2c:
index 0182353..a8a7d74 100644 (file)
@@ -518,10 +518,12 @@ int open_acpi_temperature(const char *name)
        return 0;
 }
 
-void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size)
+void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size, const char *adapter)
 {
        int state;
 
+       (void) adapter; // only linux uses this
+
        if (!p_client_buffer || client_buffer_size <= 0) {
                return;
        }
index 9ee271f..e00f264 100644 (file)
@@ -1321,7 +1321,7 @@ void get_acpi_fan(char *p_client_buffer, size_t client_buffer_size)
        snprintf(p_client_buffer, client_buffer_size, "%s", buf);
 }
 
-#define SYSFS_AC_ADAPTER_DIR "/sys/class/power_supply/AC"
+#define SYSFS_AC_ADAPTER_DIR "/sys/class/power_supply"
 #define ACPI_AC_ADAPTER_DIR "/proc/acpi/ac_adapter/"
 /* Linux 2.6.25 onwards ac adapter info is in
    /sys/class/power_supply/AC/
@@ -1333,9 +1333,12 @@ void get_acpi_fan(char *p_client_buffer, size_t client_buffer_size)
      POWER_SUPPLY_NAME=AC
      POWER_SUPPLY_TYPE=Mains
      POWER_SUPPLY_ONLINE=1
+
+   Update: it seems the folder name is hardware-dependent. We add an aditional adapter
+   argument, specifying the folder name.
 */
 
-void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size)
+void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size, const char *adapter)
 {
        static int rep = 0;
 
@@ -1347,7 +1350,7 @@ void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size)
                return;
        }
 
-       snprintf(buf2, sizeof(buf2), "%s/uevent", SYSFS_AC_ADAPTER_DIR);
+       snprintf(buf2, sizeof(buf2), "%s/%s/uevent", SYSFS_AC_ADAPTER_DIR, adapter);
        fp = open_file(buf2, &rep);
        if (fp) {
                /* sysfs processing */
index 9730b16..d1236bb 100644 (file)
@@ -332,8 +332,10 @@ int open_acpi_temperature(const char *name)
        return -1;
 }
 
-void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size)
+void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size, const char *adapter)
 {
+       (void) adapter; // only linux uses this
+
        if (!p_client_buffer || client_buffer_size <= 0) {
                return;
        }