summaryrefslogtreecommitdiffstats
path: root/apps/action.h
diff options
context:
space:
mode:
authorWilliam Wilgus <me.theuser@yahoo.com>2017-09-26 16:32:07 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2017-11-18 16:08:07 +0100
commitb10c0e5b903b0124f4996f68f2433c2b8419d753 (patch)
treed4d04c983f5ced9e6ca09a6d8bef7bd431762af1 /apps/action.h
parentff08c5287dda0ecedba22e8d71d9d75ed3b36342 (diff)
downloadrockbox-b10c0e5b903b0124f4996f68f2433c2b8419d753.tar.gz
rockbox-b10c0e5b903b0124f4996f68f2433c2b8419d753.tar.bz2
rockbox-b10c0e5b903b0124f4996f68f2433c2b8419d753.zip
Action.c FIX / Rework / Clean-up Action System
FIX - softlock not allowing power button to shutdown device when active FIX - autolock not working unless Selective backlight enabled Rework - get_action_worker split into more managable chunks Rework - moved all static variables to a single struct action_last to be passed through all internal functions Rework - current action state moved to struct action_current to be initialized at each get_action /get_action_custom call Rework - action lookup in button maps changed slightly to prefer fully formed actions rather than blindly returning action with BUTTON_NONE as pre_button this should allow actions defined in keymaps positional independence Rework / Clean-up - moved conditionals on internal functions to inside the functions -Allows much cleaner code & empty functions should be optimized out by compiler Rework / Clean-up - softlock and backlight exemptions code Clean-up - remove a lot of (now) unused defines Clean-up - organize / move all exported functions to their own section in the file Comments added to all internal functions to better explain their purpose Change-Id: I0ac02d1a2b45826843611513fea3c20a819d2fed
Diffstat (limited to 'apps/action.h')
-rw-r--r--apps/action.h81
1 files changed, 73 insertions, 8 deletions
diff --git a/apps/action.h b/apps/action.h
index 3bc43c2190..42074071cb 100644
--- a/apps/action.h
+++ b/apps/action.h
@@ -36,11 +36,12 @@
#define LAST_ITEM_IN_LIST { CONTEXT_STOPSEARCHING, BUTTON_NONE, BUTTON_NONE }
#define LAST_ITEM_IN_LIST__NEXTLIST(a) { a, BUTTON_NONE, BUTTON_NONE }
-#ifndef HAS_BUTTON_HOLD
+#if !defined(HAS_BUTTON_HOLD)
#define ALLOW_SOFTLOCK 0x08000000 /* will be stripped.. never needed except in calls to get_action() */
#else
#define ALLOW_SOFTLOCK 0
#endif
+
#if defined(HAVE_BACKLIGHT) || !defined(HAS_BUTTON_HOLD)
/* Selective action selection flags */
#define SEL_ACTION_NONE 0
@@ -61,16 +62,23 @@
#define SEL_ACTION_ENABLED 0x800U
/* Selective Actions flags */
-#ifndef HAS_BUTTON_HOLD
+#if !defined(HAS_BUTTON_HOLD)
+/* returns true if keys_locked and screen_has_lock */
bool is_keys_locked(void);
+/* Enable selected actions to bypass a locked state
+* mask is combination of Selective action selection flags */
void set_selective_softlock_actions(bool selective, unsigned int mask);
#endif
-#ifdef HAVE_BACKLIGHT
+#if defined(HAVE_BACKLIGHT)
+/* Enable selected actions to leave the backlight off
+* mask is combination of Selective action selection flags */
void set_selective_backlight_actions(bool selective, unsigned int mask,
- bool filter_fkp);
+ bool filter_fkp);
#endif
+
#endif /* defined(HAVE_BACKLIGHT) || !defined(HAS_BUTTON_HOLD) */
+
enum {
CONTEXT_STD = 0,
/* These CONTEXT_ values were here before me,
@@ -358,11 +366,56 @@ enum {
LAST_ACTION_PLACEHOLDER, /* custom actions should be this + something */
};
+ /* act_cur holds action state during get_action() call */
+typedef struct
+{
+ int action;
+ int button;
+ int context;
+ int timeout;
+ const struct button_mapping *items;
+ const struct button_mapping* (*get_context_map)(int);
+ bool is_prebutton;
+} action_cur_t;
+
+/* act_last holds action state between get_action() calls */
+typedef struct
+{
+ int action;
+ long tick;
+ int button;
+ int context;
+ intptr_t data;
+
+#if defined(HAVE_BACKLIGHT)
+ unsigned int backlight_mask;
+ long bl_filter_tick;
+#endif
+
+#if !defined(HAS_BUTTON_HOLD)
+ long sl_filter_tick;
+ unsigned int softlock_mask;
+ int unlock_combo;
+ bool keys_locked;
+ bool screen_has_lock;
+
+#endif
+
+ bool repeated;
+ bool wait_for_release;
+
+#ifdef HAVE_TOUCHSCREEN
+ bool ts_short_press;
+ int ts_data;
+#endif
+} action_last_t;
+
struct button_mapping {
int action_code;
int button_code;
int pre_button_code;
};
+
/* use if you want to supply your own button mappings, PLUGINS ONLY */
/* get_context_map is a function which returns a button_mapping* depedning on the given context */
/* custom button_mappings may "chain" to inbuilt CONTEXT's */
@@ -409,10 +462,22 @@ int action_get_touchscreen_press(short *x, short *y);
int action_get_touchscreen_press_in_vp(short *x1, short *y1, struct viewport *vp);
#endif
-/* Don't let get_action*() return any ACTION_* values until the current buttons
- * have been released. SYS_* and BUTTON_NONE will go through.
- * Any actions relying on _RELEASE won't get seen.
- */
+/*******************************************************
+* action_wait_for_release will not allow
+* get_action(|_custom)() to return
+* any ACTION_* values until the current buttons
+* have been released.
+* SYS_* and BUTTON_NONE will pass through.
+* but, any actions relying on _RELEASE won't be seen.
+*
+* Note this doesn't currently work for
+* touchscreen targets if called when the
+* screen isn't currently touched because,
+* if the touch coordinates change they can send
+* normal (non-BUTTON_REPEAT) events repeatedly,
+* this cannot be distinguished
+* from normal button events.
+*/
void action_wait_for_release(void);
#endif /* __ACTION_H__ */