[Xfce4-commits] [xfce/xfce4-power-manager] 01/01: Use sysctl(3) to get or set brightness level on FreeBSD and DragonFly systems
noreply at xfce.org
noreply at xfce.org
Sat Feb 7 17:03:27 CET 2015
This is an automated email from the git hooks/post-receive script.
eric pushed a commit to branch master
in repository xfce/xfce4-power-manager.
commit f9980385de8ba5bb33391cf3bc8b283db0fb1de2
Author: Olivier Duchateau <duchateau.olivier at gmail.com>
Date: Wed Dec 31 11:52:52 2014 +0100
Use sysctl(3) to get or set brightness level on FreeBSD and DragonFly systems
Signed-off-by: Eric Koegel <eric.koegel at gmail.com>
---
common/xfpm-brightness.c | 10 +-
src/xfpm-backlight-helper.c | 323 ++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 331 insertions(+), 2 deletions(-)
diff --git a/common/xfpm-brightness.c b/common/xfpm-brightness.c
index 823b054..9680aa3 100644
--- a/common/xfpm-brightness.c
+++ b/common/xfpm-brightness.c
@@ -333,12 +333,16 @@ xfpm_brightness_helper_get_value (const gchar *argument)
if ( exit_status != 0 )
goto out;
+#if !defined(BACKEND_TYPE_FREEBSD)
if ( stdout_data[0] == 'N' )
value = 0;
else if ( stdout_data[0] == 'Y' )
value = 1;
else
value = atoi (stdout_data);
+#else
+ value = atoi (stdout_data);
+#endif
out:
g_free (command);
@@ -606,7 +610,11 @@ xfpm_brightness_setup (XfpmBrightness *brightness)
else
{
if ( xfpm_brightness_setup_helper (brightness) ) {
- g_debug ("xrandr not available, brightness controlled by sysfs helper; min_level=%d max_level=%d",
+#if defined(BACKEND_TYPE_FREEBSD)
+ g_debug ("xrandr not available, brightness controlled by sysctl helper; min_level=%d max_level=%d",
+#else
+ g_debug ("xrandr not available, brightness controlled by sysfs helper; min_level=%d max_level=%d",
+#endif
brightness->priv->min_level,
brightness->priv->max_level);
return TRUE;
diff --git a/src/xfpm-backlight-helper.c b/src/xfpm-backlight-helper.c
index 5f23d52..4584edc 100644
--- a/src/xfpm-backlight-helper.c
+++ b/src/xfpm-backlight-helper.c
@@ -19,7 +19,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+#ifdef HAVE_CONFIG_H
#include "config.h"
+#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
@@ -36,6 +38,10 @@
#include <string.h>
#endif
#include <stdio.h>
+#include <stdlib.h>
+#if defined(BACKEND_TYPE_FREEBSD)
+#include <sys/sysctl.h>
+#endif
#define EXIT_CODE_SUCCESS 0
#define EXIT_CODE_FAILED 1
@@ -43,10 +49,325 @@
#define EXIT_CODE_INVALID_USER 4
#define EXIT_CODE_NO_BRIGHTNESS_SWITCH 5
+#if !defined(BACKEND_TYPE_FREEBSD)
#define BACKLIGHT_SYSFS_LOCATION "/sys/class/backlight"
#define BRIGHTNESS_SWITCH_LOCATION "/sys/module/video/parameters/brightness_switch_enabled"
+#endif
+
+
+#if defined(BACKEND_TYPE_FREEBSD)
+gboolean
+acpi_video_is_enabled (gchar *device)
+{
+ return (backlight_helper_get_switch (device) == 1) ? TRUE : FALSE;
+}
+
+gint
+backlight_helper_get_switch (gchar *device)
+{
+ size_t size;
+ gint buf, res = -1;
+ gchar *name;
+
+ name = g_strdup_printf ("hw.acpi.video.%s.active", device);
+ size = sizeof (buf);
+
+ if (sysctlbyname (name, &buf, &size, NULL, 0) == 0)
+ res = buf;
+
+ g_free (name);
+ return res;
+}
+
+gint
+backlight_helper_get_brightness (gchar *device)
+{
+ size_t size;
+ gint buf, res = -1;
+ gchar *name;
+
+ name = g_strdup_printf ("hw.acpi.video.%s.brightness", device);
+ size = sizeof (buf);
+
+ if (sysctlbyname (name, &buf, &size, NULL, 0) == 0)
+ res = buf;
+
+ g_free (name);
+ return res;
+}
+
+gint
+int_cmp (gconstpointer a, gconstpointer b)
+{
+ return (gint) a < (gint) b ? -1 : ((gint) a == (gint) b ? 0 : 1);
+}
+
+GList *
+backlight_helper_get_levels (gchar *device)
+{
+ size_t size;
+ gint *levels;
+ gint nlevels, i;
+ GList *list = NULL, *item;
+ gchar *name;
+
+ name = g_strdup_printf ("hw.acpi.video.%s.levels", device);
+
+ /* allocate memory */
+ sysctlbyname (name, NULL, &size, NULL, 0);
+ levels = (int *) malloc (size);
+
+ if (sysctlbyname (name, levels, &size, NULL, 0) == 0) {
+ nlevels = size / sizeof (gint);
+
+ for (i = 0; i < nlevels; i++) {
+ /* no duplicate item */
+ item = g_list_find (list, GINT_TO_POINTER (levels[i]));
+ if (item == NULL)
+ list = g_list_append (list,
+ GINT_TO_POINTER (levels[i]));
+ }
+ }
+
+ g_free (levels);
+ g_free (name);
+
+ if (list != NULL)
+ list = g_list_sort (list, int_cmp);
+
+ return list;
+}
+
+gboolean
+backlight_helper_set_switch (gchar *device, gint value)
+{
+ size_t size;
+ gint buf, old_buf;
+ gchar *name;
+ gint res = -1;
+ gboolean result = FALSE;
+
+ name = g_strdup_printf ("hw.acpi.video.%s.active", device);
+
+ res = backlight_helper_get_switch (device);
+ if (res != -1) {
+ old_buf = res;
+ size = sizeof (buf);
+
+ /* we change value and check if it's really different */
+ if (sysctlbyname (name, &buf, &size, &value, sizeof (value)) == 0) {
+ res = backlight_helper_get_switch (device);
+ if (res != -1 && res != old_buf)
+ result = TRUE;
+ }
+ }
+ g_free (name);
+
+ return result;
+}
+
+gboolean
+backlight_helper_set_brightness (gchar *device, gint value)
+{
+ size_t size;
+ gint buf, old_buf;
+ gchar *name;
+ gint res = -1;
+ gboolean result = FALSE;
+
+ name = g_strdup_printf ("hw.acpi.video.%s.brightness", device);
+
+ res = backlight_helper_get_brightness (device);
+ if (res != -1) {
+ old_buf = res;
+ size = sizeof (buf);
+
+ /* we change value, and check if it's really different */
+ if (sysctlbyname (name, &buf, &size, &value, sizeof (value)) == 0) {
+ res = backlight_helper_get_brightness (device);
+ if (res != -1 && res != old_buf)
+ result = TRUE;
+ }
+ }
+
+ g_free (name);
+
+ return result;
+}
+
+/*
+ * Find device which supports backlight brightness
+ */
+static gchar *
+backlight_helper_get_device (void)
+{
+ /* 'tv' device is also available */
+ gchar *types[] = { "lcd", "crt", "out", "ext", NULL };
+ gchar *device = NULL;
+ gint i;
+
+ device = (gchar *) g_malloc (sizeof (gchar));
+
+ for (i = 0; types[i] != NULL; i++) {
+ g_snprintf (device, 5, "%s0", types[i]);
+
+ /* stop, when first device is found */
+ if (acpi_video_is_enabled (device))
+ break;
+ }
+
+ return device;
+}
+
+/*
+ * Backlight helper main function
+ */
+gint
+main (gint argc, gchar *argv[])
+{
+ GOptionContext *context;
+ gint uid;
+ gint euid;
+ guint retval = 0;
+ const gchar *pkexec_uid_str;
+ gint ret = -1;
+ gint set_brightness = -1;
+ gboolean get_brightness = FALSE;
+ gboolean get_max_brightness = FALSE;
+ gint set_brightness_switch = -1;
+ gboolean get_brightness_switch = FALSE;
+ gchar *device = NULL;
+ GList *list = NULL;
+
+ const GOptionEntry options[] = {
+ { "set-brightness", '\0', 0, G_OPTION_ARG_INT, &set_brightness,
+ /* command line argument */
+ "Set the current brightness", NULL },
+ { "get-brightness", '\0', 0, G_OPTION_ARG_NONE, &get_brightness,
+ /* command line argument */
+ "Get the current brightness", NULL },
+ { "get-max-brightness", '\0', 0, G_OPTION_ARG_NONE, &get_max_brightness,
+ /* command line argument */
+ "Get the number of brightness levels supported", NULL },
+ { "set-brightness-switch", '\0', 0, G_OPTION_ARG_INT, &set_brightness_switch,
+ /* command line argument */
+ "Enable or disable ACPI video brightness switch handling", NULL },
+ { "get-brightness-switch", '\0', 0, G_OPTION_ARG_NONE, &get_brightness_switch,
+ /* command line argument */
+ "Get the current setting of the ACPI video brightness switch handling", NULL },
+ { NULL }
+ };
+
+ context = g_option_context_new (NULL);
+ g_option_context_set_summary (context, "XFCE Power Manager Backlight Helper");
+ g_option_context_add_main_entries (context, options, NULL);
+ g_option_context_parse (context, &argc, &argv, NULL);
+ g_option_context_free (context);
+ /* no input */
+ if (set_brightness == -1 && !get_brightness && !get_max_brightness &&
+ set_brightness_switch == -1 && !get_brightness_switch) {
+ g_print ("No valid option was specifiedi\n");
+ retval = EXIT_CODE_ARGUMENTS_INVALID;
+ goto out;
+ }
+
+ /* find backlight device */
+ device = backlight_helper_get_device ();
+
+ if (device != NULL) {
+ /* get the current setting of the ACPI video brightness switch handling */
+ if (get_brightness_switch) {
+ ret = backlight_helper_get_switch (device);
+ /* just print result to stdout */
+ g_print ("%d", ret);
+ if (ret == -1)
+ retval = EXIT_CODE_FAILED;
+ else
+ retval = EXIT_CODE_SUCCESS;
+ goto out;
+ }
+ /* get current brightness level */
+ if (get_brightness) {
+ ret = backlight_helper_get_brightness (device);
+ /* just print result to stdout */
+ g_print ("%d", ret);
+ if (ret == -1)
+ retval = EXIT_CODE_FAILED;
+ else
+ retval = EXIT_CODE_SUCCESS;
+ goto out;
+ }
+
+ /* get maximum brightness level */
+ if (get_max_brightness) {
+ list = backlight_helper_get_levels (device);
+ if (list != NULL) {
+ /* just print result to stdout */
+ g_print ("%d", (gint) g_list_last (list)->data);
+ g_list_free (list);
+ retval = EXIT_CODE_SUCCESS;
+ goto out;
+ }
+ else {
+ g_print ("Could not get the maximum value of the backlight\n");
+ retval = EXIT_CODE_FAILED;
+ goto out;
+ }
+ }
+
+ /* get calling process */
+ uid = getuid ();
+ euid = geteuid ();
+ if (uid != 0 || euid != 0) {
+ g_print ("This program can only be used by the root user\n");
+ retval = EXIT_CODE_ARGUMENTS_INVALID;
+ goto out;
+ }
+
+ /* check we're not being spoofed */
+ pkexec_uid_str = g_getenv ("PKEXEC_UID");
+ if (pkexec_uid_str == NULL) {
+ g_print ("This program must only be run through pkexec\n");
+ retval = EXIT_CODE_INVALID_USER;
+ goto out;
+ }
+
+ /* set the brightness level */
+ if (set_brightness != -1) {
+ if (backlight_helper_set_brightness (device, set_brightness)) {
+ retval = EXIT_CODE_SUCCESS;
+ goto out;
+ }
+ else {
+ g_print ("Could not set the value of the backlight\n");
+ retval = EXIT_CODE_FAILED;
+ goto out;
+ }
+ }
+
+ /* enable or disable ACPI video brightness switch handling */
+ if (set_brightness_switch != -1) {
+ if (backlight_helper_set_switch (device, set_brightness_switch)) {
+ retval = EXIT_CODE_SUCCESS;
+ goto out;
+ }
+ else {
+ g_print ("Could not set the value of the brightness switch\n");
+ retval = EXIT_CODE_FAILED;
+ goto out;
+ }
+ }
+ }
+ else {
+ retval = ret;
+ goto out;
+ }
+out:
+ return retval;
+}
+#else
/*
* Find best backlight using an ordered interface list
*/
@@ -323,4 +644,4 @@ out:
g_free (contents);
return retval;
}
-
+#endif
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list