I like the idea very much! I just noticed the original behavior (which prevents from taking several shots with the same focus/exposure settings in a script without burst mode), and was investigating.
I guess we have KEY_SHOOT_FULL = KEY_SHOOT_FULL | KEY_SHOOT_HALF because when shoot_full is pressed, shoot_half must be pressed too. The problem with waldo's solution, as he admitted, is that if you just do "click shoot_full" with everything else released, then shoot_half stays pressed.
So what I would suggest is to set KEY_SHOOT_FULL such that KEY_SHOOT_FULL & KEY_SHOOT_HALF = 0, as waldo suggested, when KEY_SHOOT_FULL is pressed to press KEY_SHOOT_HALF too as waldo suggested as well, but also to raise a flag when KEY_SHOOT_HALF is automatically pressed because of KEY_SHOOT_FULL, so that we can release KEY_SHOOT_HALF only if it was automatically pressed because of KEY_SHOOT_FULL. And still fixing kbd_sched_shoot as waldo suggested, because it assumes that releasing shoot_full releases shoot_half (it seems to be the only place in CHDK).
Shouldn't break anything, allows more possibilities, and more intuitive behavior (if you press shoot_half, you have to release it, if you don't press it, you don't have to release it).
Am I missing something?
For SD1000, it would be:
platform/ixus70_sd1000/kbd.c:22
+static int auto_pressed_half=0;
platform/ixus70_sd1000/kbd.c:299,kbd_key_press
if (keymap[i].hackkey == key){
+ if ((key == KEY_SHOOT_FULL) && (kbd_mod_state[keymap[i+1].grp] & keymap[i+1].canonkey))
+ {
+ auto_pressed_half = 1;
+ kbd_mod_state[keymap[i+1].grp] &= ~keymap[i+1].canonkey;
+ } else
+ if (key == KEY_SHOOT_HALF) auto_pressed_half = 0;
platform/ixus70_sd1000/kbd.c:316,kbd_key_release
if (keymap[i].hackkey == key){
+ if ((key == KEY_SHOOT_FULL) && auto_pressed_half)
+ kbd_mod_state[keymap[i+1].grp] |= keymap[i+1].canonkey;
+ if (key == KEY_SHOOT_HALF)
+ kbd_mod_state[keymap[i-1].grp] |= keymap[i-1].canonkey;
platform/ixus70_sd1000/kbd.c:458
- {1, KEY_SHOOT_FULL, 0xC0000000 }, // note 3 here!
+ {1, KEY_SHOOT_FULL, 0x80000000 }, // note 3 here!
core/kbd.c:167,kbd_sched_shoot
KBD_STACK_PUSH(SCRIPT_WAIT_SAVE);
+ KBD_STACK_PUSH(KEY_SHOOT_HALF);
+ KBD_STACK_PUSH(SCRIPT_RELEASE);
PS @ waldo: thanks for your contribution