diff options
author | Danny Kukawka <danny.kukawka@web.de> | 2007-03-30 15:44:08 +0200 |
---|---|---|
committer | Danny Kukawka <danny.kukawka@web.de> | 2007-03-30 15:44:08 +0200 |
commit | 9afee233753225e4884bc4caef58da048f07b4ef (patch) | |
tree | 0baaa0d80e03c3558ac71e84c484e153df418a0a | |
parent | 6ea370ecbc29638a40bd991909e7ae401243f520 (diff) |
added optional support for IBM ACPI (hotkey) events.
Added support for optional IBM ACPI (hotkey) events to HAL. This
feature is disabled by default and need to get enabled by using the
configure option --enable-acpi-ibm. This include also support for the
display rotation events of IBM Tablet PCs.
-rw-r--r-- | configure.in | 9 | ||||
-rw-r--r-- | fdi/policy/10osvendor/10-laptop-buttons.fdi | 20 | ||||
-rw-r--r-- | fdi/policy/10osvendor/10-toshiba-buttons.fdi | 15 | ||||
-rw-r--r-- | fdi/policy/10osvendor/Makefile.am | 2 | ||||
-rw-r--r-- | hald/linux/addons/addon-acpi.c | 100 |
5 files changed, 129 insertions, 17 deletions
diff --git a/configure.in b/configure.in index 009624e6..58dfec01 100644 --- a/configure.in +++ b/configure.in @@ -168,6 +168,14 @@ fi AC_SUBST(ACPI_PROC) AM_CONDITIONAL(ACPI_PROC, test x$acpi_proc = xyes) +AC_ARG_ENABLE([acpi-ibm], AC_HELP_STRING([--enable-acpi-ibm], [catch IBM ACPI events]), [acpi_ibm=$enableval], [acpi_ibm=no]) +if test "x$acpi_proc" = "xyes" ; then + AC_DEFINE(ACPI_IBM_EVENTS,1,[catch and forward IBM ACPI hotkey and button events]) +fi +AC_SUBST(ACPI_IBM_EVENTS) +AM_CONDITIONAL(ACPI_IBM_EVENTS, test x$acpi_ibm = xyes) + + dnl libparted AC_ARG_ENABLE([parted], AC_HELP_STRING([--enable-parted], [Use libparted]), [use_parted=$enableval], [use_parted=no]) @@ -927,6 +935,7 @@ echo " Macbook Pro utils: ${BUILD_MACBOOKPRO} (Linux only, x86 only, requires libpci) OMAP utils: ${BUILD_OMAP} (Linux only, arm only) CPU frequency scaling: ${BUILD_CPUFREQ} (Linux only) + catch IBM acpi events: ${acpi_ibm} (Linux only) USB wireless mouse power: ${BUILD_USBCSR} (Linux only, requires libusb) Dell Backlight: ${BUILD_DELL} (Linux only, requires libsmbios >= 0.13.4) diff --git a/fdi/policy/10osvendor/10-laptop-buttons.fdi b/fdi/policy/10osvendor/10-laptop-buttons.fdi new file mode 100644 index 00000000..ee7cd0bf --- /dev/null +++ b/fdi/policy/10osvendor/10-laptop-buttons.fdi @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<deviceinfo version="0.2"> + + <device> + <match key="system.formfactor" string="laptop"> + <!-- Only launch the addon for Toshiba laptops. --> + <match key="system.hardware.vendor" string="TOSHIBA"> + <append key="info.addons" type="strlist">hald-addon-acpi-buttons-toshiba</append> + <append key="info.capabilities" type="strlist">button</append> + </match> + + <!-- button capability for IBM laptops --> + <match key="system.hardware.vendor" string="IBM"> + <append key="info.capabilities" type="strlist">button</append> + </match> + </match> + </device> + +</deviceinfo> diff --git a/fdi/policy/10osvendor/10-toshiba-buttons.fdi b/fdi/policy/10osvendor/10-toshiba-buttons.fdi deleted file mode 100644 index d60bee2a..00000000 --- a/fdi/policy/10osvendor/10-toshiba-buttons.fdi +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<deviceinfo version="0.2"> - - <!-- Only launch the addon for Toshiba laptops. --> - <device> - <match key="system.hardware.vendor" string="TOSHIBA"> - <match key="system.formfactor" string="laptop"> - <append key="info.addons" type="strlist">hald-addon-acpi-buttons-toshiba</append> - <append key="info.capabilities" type="strlist">button</append> - </match> - </match> - </device> - -</deviceinfo> diff --git a/fdi/policy/10osvendor/Makefile.am b/fdi/policy/10osvendor/Makefile.am index 98bbe927..d60d5b3b 100644 --- a/fdi/policy/10osvendor/Makefile.am +++ b/fdi/policy/10osvendor/Makefile.am @@ -4,7 +4,7 @@ fdidir = $(datadir)/hal/fdi/policy/10osvendor dist_fdi_DATA = \ 10-keyboard-policy.fdi \ 10-power-mgmt-policy.fdi \ - 10-toshiba-buttons.fdi \ + 10-laptop-buttons.fdi \ 10-rfkill-switch.fdi \ 10-laptop-panel-mgmt-policy.fdi \ 15-storage-luks.fdi \ diff --git a/hald/linux/addons/addon-acpi.c b/hald/linux/addons/addon-acpi.c index f0561caf..dd27e9c6 100644 --- a/hald/linux/addons/addon-acpi.c +++ b/hald/linux/addons/addon-acpi.c @@ -89,6 +89,99 @@ acpi_get_event_fp_acpid (void) } #endif +#ifdef ACPI_IBM_EVENTS +static void +handle_ibm_acpi_events (LibHalContext *ctx, int type, int event) +{ + DBusError error; + char udi[256]; + char *button; + char **devices; + int num_devices; + + dbus_error_init (&error); + button = NULL; + snprintf (udi, sizeof (udi), "/org/freedesktop/Hal/devices/computer"); + + if (type == 128) { + switch (event) { + case 4097: /* Fn+F1 */ + button = "Fn+F1"; + break; + case 4098: + button = "Fn+F2"; + break; + case 4099: /* dpms off */ + button = "display_off"; + break; + case 4100: /* sleep button */ + button = "sleep"; + devices = libhal_manager_find_device_string_match (ctx, "button.type", + "sleep", &num_devices, + &error); + if (devices != NULL && num_devices > 0) { + snprintf (udi, sizeof (udi), devices[0]); + libhal_free_string_array (devices); + } + if (dbus_error_is_set (&error)) + dbus_error_free (&error); + break; + case 4101: /* wireless */ + button = "wifi-power"; + break; + case 4102: + button = "Fn+F6"; + break; + case 4103: /* switch display */ + button = "display_switch"; + break; + case 4104: + button = "Fn+F8"; + break; + case 4105: /* undock */ + button = "undock"; + break; + case 4106: + button = "Fn+F10"; + break; + case 4107: + button = "Fn+F11"; + break; + case 4108: /* Fn+F12 , hibernate/s2disk */ + button = "hibernate"; + break; + case 4109: /* Fn+Backspace*/ + button = "Fn+Backspace"; + break; + case 4110: /* Fn+Insert*/ + button = "Fn=Insert"; + break; + case 4111: /* Fn+Delete*/ + button = "Fn+Delete"; + break; + case 4112: /* Fn+Home*/ + button = "brightness-up"; + break; + case 20489: /* Tablet rotated */ + button = "tabletpc_rotate_180"; + break; + case 20490: /* Tablet rotated back*/ + button = "tabletpc_rotate_normal"; + break; + default: + break; + + } + + if (button) { + libhal_device_emit_condition (ctx, udi, "ButtonPressed", + button, &error); + if (dbus_error_is_set (&error)) + dbus_error_free (&error); + } + } +} +#endif static void main_loop (LibHalContext *ctx, FILE *eventfp) @@ -137,7 +230,12 @@ main_loop (LibHalContext *ctx, FILE *eventfp) HAL_DEBUG (("battery event")); dbus_error_init (&error); libhal_device_rescan (ctx, udi, &error); - } +#ifdef ACPI_IBM_EVENTS + } else if (strncmp (acpi_path, "ibm/hotkey", sizeof ("ibm/hotkey") -1) == 0) { + /* handle ibm ACPI hotkey events*/ + handle_ibm_acpi_events(ctx, acpi_num1, acpi_num2); +#endif + } } else { HAL_DEBUG (("cannot parse event")); |