From e349ebb73c40cab199d0a1a73b504483dfb0d511 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sun, 16 Oct 2016 12:53:19 +0200 Subject: [PATCH 2/2] UpKbdBacklight: Watch for POLL_PRI on the brightness fd Watch for POLL_PRI on the brightness fd, to detect hardware initiated brightness changes, such as done by e.g. hardwired keyboard backlight brightness control hotkeys. Note this relies on the LED kernel driver actually calling sysfs_notify_dirent on the brightness sysfs attribute when this happens. I've added patches pending to make this happen on at least Dell laptops. Signed-off-by: Hans de Goede --- src/up-kbd-backlight.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/up-kbd-backlight.c b/src/up-kbd-backlight.c index 7b78e71..ee8bce5 100644 --- a/src/up-kbd-backlight.c +++ b/src/up-kbd-backlight.c @@ -45,6 +45,7 @@ struct UpKbdBacklightPrivate gint fd; gint brightness; gint max_brightness; + GIOChannel *channel; }; G_DEFINE_TYPE (UpKbdBacklight, up_kbd_backlight, UP_TYPE_EXPORTED_KBD_BACKLIGHT_SKELETON) @@ -208,6 +209,25 @@ up_kbd_backlight_class_init (UpKbdBacklightClass *klass) } /** + * up_kbd_backlight_event_io: + **/ +static gboolean +up_kbd_backlight_event_io (GIOChannel *channel, GIOCondition condition, gpointer data) +{ + UpKbdBacklight *kbd_backlight = (UpKbdBacklight*) data; + gint brightness; + + brightness = up_kbd_backlight_brightness_read (kbd_backlight); + if (brightness >= 0 && brightness != kbd_backlight->priv->brightness) { + kbd_backlight->priv->brightness = brightness; + up_exported_kbd_backlight_emit_brightness_changed ( + UP_EXPORTED_KBD_BACKLIGHT (kbd_backlight), brightness); + } + + return TRUE; +} + +/** * up_kbd_backlight_find: **/ static gboolean @@ -266,6 +286,8 @@ up_kbd_backlight_find (UpKbdBacklight *kbd_backlight) /* open the brightness file for read and write operations */ path_now = g_build_filename (dir_path, "brightness", NULL); kbd_backlight->priv->fd = open (path_now, O_RDWR); + kbd_backlight->priv->channel = g_io_channel_unix_new (kbd_backlight->priv->fd); + g_io_add_watch (kbd_backlight->priv->channel, G_IO_PRI, up_kbd_backlight_event_io, kbd_backlight); /* read brightness and check if it has an acceptable value */ kbd_backlight->priv->brightness = up_kbd_backlight_brightness_read (kbd_backlight); -- 2.9.3