| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #
- # NCD input event handling example program.
- #
- # This program responds to volume key presses by synchronously calling an external
- # script for muting and adjusting volume, and responds to power button presses by
- # suspending using pm-suspend.
- #
- # It uses process_manager() and sys.watch_input() to dynamically create and remove
- # processes that deal with specific input devices. The individual input device processes
- # then use sys.evdev() to handle input events from their input device.
- #
- process events_main {
- # Volume control script, called with argument "up", "down" or "mute".
- var("/usr/local/bin/volumekey") volume_script;
- # Suspend command.
- list("/usr/sbin/pm-suspend") suspend_cmd;
- provide("GLOBAL");
- }
- process events_watcher {
- depend("GLOBAL");
-
- # Create process manager.
- process_manager() manager;
- # Wait for input device events.
- sys.watch_input("event") watcher;
- # Dispatch.
- concat("events_watcher_", watcher.event_type) func;
- call(func, {});
- # Next event.
- watcher->nextevent();
- }
- template events_watcher_added {
- # Start event handling process for this device.
- _caller.manager->start(_caller.watcher.devname, "events_input_device", {_caller.watcher.devname});
- }
- template events_watcher_removed {
- # Stop event handling process for this device.
- _caller.manager->stop(_caller.watcher.devname);
- }
- template events_input_device {
- # Alias arguments.
- var(_arg0) dev;
- # Get global.
- depend("GLOBAL") gdep;
- # Wait for input events.
- sys.evdev(dev) evdev;
- # Query event details.
- strcmp(evdev.code, "KEY_MUTE") is_mute;
- strcmp(evdev.code, "KEY_VOLUMEUP") is_vup;
- strcmp(evdev.code, "KEY_VOLUMEDOWN") is_vdown;
- strcmp(evdev.code, "KEY_POWER") is_power;
- strcmp(evdev.value, "1") is_pressed;
- # Compute where to dispatch the event.
- and(is_mute, is_pressed) dispatch_mute;
- and(is_vup, is_pressed) dispatch_vup;
- and(is_vdown, is_pressed) dispatch_vdown;
- and(is_power, is_pressed) dispatch_power;
- # Dispatch event.
- choose({
- {dispatch_mute, "events_input_event_mute"},
- {dispatch_vup, "events_input_event_vup"},
- {dispatch_vdown, "events_input_event_vdown"},
- {dispatch_power, "events_input_event_power"}},
- "<none>"
- ) func;
- call(func, {});
- # Next event.
- evdev->nextevent();
- }
- template events_input_event_mute {
- runonce({_caller.gdep.volume_script, "mute"});
- }
- template events_input_event_vup {
- runonce({_caller.gdep.volume_script, "up"});
- }
- template events_input_event_vdown {
- runonce({_caller.gdep.volume_script, "down"});
- }
- template events_input_event_power {
- runonce(_caller.gdep.suspend_cmd);
- }
|