Think I have sorted it. The keyboard demo called SYSTEM_Initialize(SYSTEM_STATE_USB_HOST_KEYBOARD) at the top of main. The mouse one doesn't, but calls (SYSTEM_STATE_USB_HOST_MOUSE) in the APP_HostHIDMouseTasks when it's in the WAITING_FOR_DEVICE state.
One of the things that SYSTEM_STATE_USB_HOST_KEYBOARD / SYSTEM_STATE_USB_HOST_MOUSE does is to setup the timer, so if the mouse hadn't been 'seen' it would never set the timer up, so the keyboard didn't do anything.
In case anyone else needs some hints - the changes I did when merging the two projects were:
Merge the two USB_TPLs (usb_config.c) and update NUM_TPL_ENTRIES (usb_config.h)
call SYSTEM_Initialize(SYSTEM_STATE_USB_HOST_KEYBOARD in APP_HostHIDKeyboardTasks (see above).
In the USB_ApplicationEventHandler (main.c)
if (size > 7)
uint8_t class = ((uint8_t*)data);
uint8_t subclass = ((uint8_t*)data);
uint8_t protocol = ((uint8_t*)data);
if ( class == 3 && subclass == 1 )
connected = protocol;
case 0x01: return APP_HostHIDKeyboardReportParser();
case 0x02: return APP_HostHIDMouseReportParser();