Index: apps/plugins/clock/clock.c =================================================================== --- apps/plugins/clock/clock.c (révision 16195) +++ apps/plugins/clock/clock.c (copie de travail) @@ -30,30 +30,211 @@ PLUGIN_HEADER -/* Keymaps */ -const struct button_mapping* plugin_contexts[]={ - generic_actions, - generic_increase_decrease, - generic_directions, -#if NB_SCREENS == 2 - remote_directions +/* Keymap */ +enum {/* Actions definitions */ + ACTION_COUNTER_TOGGLE = LAST_ACTION_PLACEHOLDER+1, + ACTION_COUNTER_RESET, + ACTION_MENU, + ACTION_EXIT, + ACTION_MODE_NEXT, + ACTION_MODE_PREV, + ACTION_SKIN_NEXT, + ACTION_SKIN_PREV +}; + +const struct button_mapping actions[] = { +#if (CONFIG_KEYPAD == RECORDER_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_ON|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_ON|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_PLAY, BUTTON_NONE}, + { ACTION_MENU, BUTTON_F1, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_OFF, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == ARCHOS_AV300_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_ON|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_ON|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_SELECT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_F1, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_OFF, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) \ + || (CONFIG_KEYPAD == IPOD_3G_PAD) \ + || (CONFIG_KEYPAD == IPOD_4G_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_SELECT, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_MENU, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_SCROLL_FWD, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_SCROLL_BACK, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == IRIVER_H300_PAD) || (CONFIG_KEYPAD == IRIVER_H100_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_ON|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_ON|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_SELECT, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_OFF, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE}, + /* Remote */ + { ACTION_COUNTER_TOGGLE, BUTTON_RC_ON|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_RC_ON|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_RC_MENU, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_RC_STOP, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RC_VOL_UP, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_RC_VOL_DOWN, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_RC_BITRATE, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_RC_BITRATE|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_RC_SOURCE, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_RC_SOURCE|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_SELECT, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_POWER, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE}, + /* Fixme: no remote */ +#elif (CONFIG_KEYPAD == SANSA_E200_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_UP, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_POWER, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_VOL_UP, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_VOL_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_REW, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_POWER, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_SCROLL_UP, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_SCROLL_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == GIGABEAT_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_MENU, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_A, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_SCROLL_UP, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_SCROLL_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_MODE, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_EQ, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == SANSA_C200_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_DOWN, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_POWER, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_VOL_UP, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_VOL_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == MROBE100_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_FF, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_POWER, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == MROBE500_PAD) + { ACTION_COUNTER_TOGGLE, BUTTON_RC_HEART|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_RC_HEART|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MENU, BUTTON_RC_MODE, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_POWER, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RC_FF, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_RC_REW, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_RC_PLAY, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_RC_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_RC_DOWN|BUTTON_REPEAT, BUTTON_NONE}, +#elif (CONFIG_KEYPAD == COWOND2_PAD)/* FIXME:no counter key */ + /*{ ACTION_COUNTER_TOGGLE, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE}, + { ACTION_COUNTER_RESET, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE},*/ + { ACTION_MENU, BUTTON_MENU, BUTTON_NONE}, + { ACTION_EXIT, BUTTON_POWER, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT, BUTTON_NONE}, + { ACTION_MODE_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT, BUTTON_NONE}, + { ACTION_MODE_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP, BUTTON_NONE}, + { ACTION_SKIN_NEXT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN, BUTTON_NONE}, + { ACTION_SKIN_PREV, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE}, +#error pluginlib_actions: Unsupported keypad #endif + {CONTEXT_CUSTOM,BUTTON_NONE,BUTTON_NONE} }; -#define PLA_ARRAY_COUNT sizeof(plugin_contexts)/sizeof(plugin_contexts[0]) -#define ACTION_COUNTER_TOGGLE PLA_FIRE -#define ACTION_COUNTER_RESET PLA_FIRE_REPEAT -#define ACTION_MENU PLA_MENU -#define ACTION_EXIT PLA_QUIT -#define ACTION_MODE_NEXT PLA_RIGHT -#define ACTION_MODE_NEXT_REPEAT PLA_RIGHT_REPEAT -#define ACTION_MODE_PREV PLA_LEFT -#define ACTION_MODE_PREV_REPEAT PLA_LEFT_REPEAT -#define ACTION_SKIN_NEXT PLA_INC -#define ACTION_SKIN_NEXT_REPEAT PLA_INC_REPEAT -#define ACTION_SKIN_PREV PLA_DEC -#define ACTION_SKIN_PREV_REPEAT PLA_DEC_REPEAT - extern struct plugin_api* rb; /************************** @@ -130,7 +311,7 @@ xlcd_init(rb); counter_init(&counter); clock_draw_set_colors(); - + action_init(actions); while(!exit_clock){ clock_update_time(&time); @@ -140,7 +321,7 @@ /************************* * Scan for button presses ************************/ - button = pluginlib_getaction(rb, HZ/10, plugin_contexts, PLA_ARRAY_COUNT); + button = action_get(rb, HZ/10); redraw=true;/* we'll set it to false afterwards if there was no action */ switch (button){ case ACTION_COUNTER_TOGGLE: /* start/stop counter */ @@ -153,27 +334,26 @@ counter_reset(&counter); break; - case ACTION_MODE_NEXT_REPEAT: case ACTION_MODE_NEXT: clock_settings.mode++; if(clock_settings.mode >= NB_CLOCK_MODES) clock_settings.mode = 0; break; - case ACTION_MODE_PREV_REPEAT: case ACTION_MODE_PREV: clock_settings.mode--; if(clock_settings.mode < 0) clock_settings.mode = NB_CLOCK_MODES-1; break; - case ACTION_SKIN_PREV_REPEAT: + case ACTION_SKIN_PREV: clock_settings_skin_next(&clock_settings); break; - case ACTION_SKIN_NEXT_REPEAT: + case ACTION_SKIN_NEXT: clock_settings_skin_previous(&clock_settings); break; + case ACTION_MENU: clock_draw_restore_colors(); exit_clock=main_menu(); Index: apps/plugins/lib/pluginlib_actions.c =================================================================== --- apps/plugins/lib/pluginlib_actions.c (révision 16195) +++ apps/plugins/lib/pluginlib_actions.c (copie de travail) @@ -405,3 +405,37 @@ last_context = 0; return api->get_custom_action(CONTEXT_CUSTOM,timeout,get_context_map); } + + +/** + * Another approach with only one context, will require every plugin to + * define all the buttons it uses, with the benefit of avoiding action + * collisions + */ + +static const struct button_mapping *plugin_actions; +static bool already_called_flag; + +void action_init(const struct button_mapping *actions) +{ + plugin_actions=actions; +} + +const struct button_mapping* action_calback(int context) +{ + (void)context; + if(already_called_flag==false){ + already_called_flag=true; + return plugin_actions; + } + return NULL; +} + +/** + * A simple getaction for only one context + */ +int action_get(struct plugin_api *rb, int timeout) +{ + already_called_flag=false; + return rb->get_custom_action(CONTEXT_CUSTOM,timeout,action_calback); +} Index: apps/plugins/lib/pluginlib_actions.h =================================================================== --- apps/plugins/lib/pluginlib_actions.h (révision 16195) +++ apps/plugins/lib/pluginlib_actions.h (copie de travail) @@ -62,4 +62,7 @@ const struct button_mapping *plugin_contexts[], int count); +void action_init(const struct button_mapping *actions); +int action_get(struct plugin_api *api, int timeout); + #endif /* __PLUGINLIB_ACTIONS_H__ */