--- orig/pbbuttonsd.conf.5 2005-04-03 11:00:25.000000000 +0200 +++ mod/pbbuttonsd.conf.5 2005-04-25 16:01:30.435208760 +0200 @@ -13,7 +13,7 @@ .\" along with this program; see the file COPYING. If not, write to .\" the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. .\" -.TH PBBUTTONSD.CONF 5 "April 3, 2005" +.TH PBBUTTONSD.CONF 5 "April 25, 2005" .\" Please update the above date whenever this man page is modified. .\" .\" Some roff macros, for reference: @@ -66,8 +66,15 @@ defined as follows. .PP The key definition could have multiple parts. The first is the keycode as it -could be found in ..include/linux/input.h. This keycode must be there -otherwise the built-in default value will be used. +can be found in ..include/linux/input.h. This keycode must be there or one +of the virtual keycodes, otherwise the built-in default value will be used. +.PP +Currently, the virtual keycodes that are defined are +.ad l +.in +17 +.ti -17 +pmupowerbutton - the power button on Mac Mini, new PowerBooks and maybe other machines. +.br .PP The other parts are the optional modifiers that could be combined with the keycode to trigger the certain function. The \fIshift\fR, \fIalt\fR and --- orig/src/config_manager.c 2005-04-04 18:38:15.000000000 +0200 +++ mod/src/config_manager.c 2005-04-25 15:41:35.766560699 +0200 @@ -334,7 +334,7 @@ decode_key_and_modifier(char *arg, int *key, int *mod) { char *tag; - int k; + int k, i; *mod = 0; *key = 0; tag = strtok(arg, "+\n"); @@ -348,6 +348,9 @@ *mod |= MOD_ALT; else if (!strncmp("ctrl", tag, 4)) *mod |= MOD_CTRL; + for (i=0; i < VIRTUAL_KEY_NUM; i++) + if (!strcmp(virtual_key_names[i], tag)) + *key = VIRTUAL_KEY_START + i; } else *key = k; tag = strtok(0, "+\n"); --- orig/src/input_manager.c 2005-04-04 18:41:41.000000000 +0200 +++ mod/src/input_manager.c 2005-04-25 15:41:23.030692378 +0200 @@ -26,6 +26,12 @@ #include "init.h" #include "input_manager.h" +char * virtual_key_names[VIRTUAL_KEY_NUM] = + { + "pmupowerbutton", + }; + + /* --- private module data structure of the input manager --- */ struct moddata_inputmanager { --- orig/src/input_manager.h 2005-03-21 11:12:34.000000000 +0100 +++ mod/src/input_manager.h 2005-04-25 15:43:11.965566077 +0200 @@ -41,6 +41,13 @@ #define MOD_ALTCTRL 6 #define MOD_SHIFTALTCTRL 7 +/* virtual keys and their names */ +#define VIRTUAL_KEY_START 1000 +#define VIRTUAL_KEY_POWERBUTTON 0 +#define VIRTUAL_KEY_NUM 1 + +extern char * virtual_key_names[VIRTUAL_KEY_NUM]; + #define BITS_PER_LONG (sizeof(long) * 8) #define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1) #define OFF(x) ((x)%BITS_PER_LONG) --- orig/src/module_pmac.c 2005-04-04 18:30:39.000000000 +0200 +++ mod/src/module_pmac.c 2005-04-25 15:44:12.557939599 +0200 @@ -480,6 +480,11 @@ { unsigned char intr[16]; int n; + struct tagitem taglist[] = {{ TAG_KEYCODE, VIRTUAL_KEY_START + VIRTUAL_KEY_POWERBUTTON }, + { TAG_KEYREPEAT, 0 }, + { TAG_MODIFIER, 0 }, + { TAG_END, 0 }}; + static int powerbutton_old = 0; #if defined(DEBUG) && PMUINTR int i; #endif @@ -489,6 +494,16 @@ if (n < 3 || intr[2] < 1 || intr[2] > 2) break; call_script ("/sbin/cardctl %s %d", "eject", intr[2]-1); + break; + /* FIXME: use some appropriate structures to parse the interrupt */ + case 0x40: + if (n < 2) break; + if ((intr[1] & PMU_ENV_PBTN_PRESSED) != powerbutton_old) { + taglist[1].data = (intr[1] & PMU_ENV_PBTN_PRESSED) ? 1 : 0; + powerbutton_old = intr[1] & PMU_ENV_PBTN_PRESSED; + process_queue (KBDQUEUE, taglist); + } + break; } #if defined(DEBUG) && PMUINTR printf ("\nPMU interrupt: "); --- orig/src/module_pmac.h 2005-04-01 11:29:50.000000000 +0200 +++ mod/src/module_pmac.h 2005-04-25 15:12:20.696706750 +0200 @@ -57,6 +57,9 @@ #ifndef PMU_ENV_BATTERY_PRESENT #define PMU_ENV_BATTERY_PRESENT 0x10 #endif +#ifndef PMU_ENV_PBTN_PRESSED +#define PMU_ENV_PBTN_PRESSED 0x08 +#endif #define LMU_ADDR 0x42