if (GetUserName(login_name, &buffer_size) == 0)
strcpy(login_name, ANONYMOUS_NAME);
}
-#else
+#elif defined(PLATFORM_UNIX) && !defined(PLATFORM_ANDROID)
if (login_name == NULL)
{
struct passwd *pwd;
else
login_name = getStringCopy(pwd->pw_name);
}
+#else
+ login_name = ANONYMOUS_NAME;
#endif
return login_name;
options.sounds_directory = getPath2(ro_base_path, SOUNDS_DIRECTORY);
options.music_directory = getPath2(ro_base_path, MUSIC_DIRECTORY);
options.docs_directory = getPath2(ro_base_path, DOCS_DIRECTORY);
+ options.conf_directory = getPath2(ro_base_path, CONF_DIRECTORY);
options.execute_command = NULL;
options.special_flags = NULL;
if (*options_left == NULL) /* no options given -- enable verbose mode */
options.verbose = TRUE;
#endif
+#endif
+
+#if DEBUG
+#if defined(PLATFORM_ANDROID)
+ options.debug = TRUE;
+#endif
#endif
while (*options_left)
options.sounds_directory = getPath2(ro_base_path, SOUNDS_DIRECTORY);
options.music_directory = getPath2(ro_base_path, MUSIC_DIRECTORY);
options.docs_directory = getPath2(ro_base_path, DOCS_DIRECTORY);
+ options.conf_directory = getPath2(ro_base_path, CONF_DIRECTORY);
}
else if (strncmp(option, "-levels", option_len) == 0)
{
ANDROID_LOG_UNKNOWN);
#endif
+ /* display debug messages only when running in debug mode */
+ if (mode & ERR_DEBUG && !options.debug)
+ return;
+
/* display warnings only when running in verbose mode */
if (mode & ERR_WARN && !options.verbose)
return;
{ KSYM_Page_Down, "XK_Page_Down", "page down" },
#if defined(TARGET_SDL2)
+ { KSYM_Select, "XK_Select", "select" },
{ KSYM_Menu, "XK_Menu", "menu" }, /* menu key */
{ KSYM_Back, "XK_Back", "back" }, /* back key */
+ { KSYM_PlayPause, "XK_PlayPause", "play/pause" },
+#if defined(PLATFORM_ANDROID)
+ { KSYM_Rewind, "XK_Rewind", "rewind" },
+ { KSYM_FastForward, "XK_FastForward", "fast forward" },
+#endif
#endif
/* ASCII 0x20 to 0x40 keys (except numbers) */
{ "global.anim_6" },
{ "global.anim_7" },
{ "global.anim_8" },
+ { "global.anim_9" },
+ { "global.anim_10" },
+ { "global.anim_11" },
+ { "global.anim_12" },
+ { "global.anim_13" },
+ { "global.anim_14" },
+ { "global.anim_15" },
+ { "global.anim_16" },
+ { "global.anim_17" },
+ { "global.anim_18" },
+ { "global.anim_19" },
+ { "global.anim_20" },
+ { "global.anim_21" },
+ { "global.anim_22" },
+ { "global.anim_23" },
+ { "global.anim_24" },
+ { "global.anim_25" },
+ { "global.anim_26" },
+ { "global.anim_27" },
+ { "global.anim_28" },
+ { "global.anim_29" },
+ { "global.anim_30" },
+ { "global.anim_31" },
+ { "global.anim_32" },
{ NULL }
};
return string_has_parameter(substring, s_contained);
}
-static boolean string_has_anim_parameter(char *s, char *s_contained)
-{
- char *s_copy = getStringCopy(s);
- boolean has_parameter = FALSE;
- int len_s_copy = strlen(s_copy);
- int i;
-
- // replace all "anim" and "part" numbers with 'X'
- for (i = 0; i < len_s_copy; i++)
- if (s_copy[i] >= '1' && s_copy[i] <= '8')
- s_copy[i] = 'X';
-
- has_parameter = string_has_parameter(s_copy, s_contained);
-
- checked_free(s_copy);
-
- return has_parameter;
-}
-
int get_anim_parameter_value(char *s)
{
char *pattern_1 = "click:anim_";
matching_char = strstr(s_ptr, pattern_1);
if (matching_char == NULL)
- return result;
+ return ANIM_EVENT_NONE;
s_ptr = matching_char + strlen(pattern_1);
- if (*s_ptr == '\0')
- return result;
- // check for "click:anim_X"
- if (*s_ptr >= '1' && *s_ptr <= '8')
+ // check for main animation number ("anim_X" or "anim_XX")
+ if (*s_ptr >= '0' && *s_ptr <= '9')
{
- result |= ANIM_EVENT_CLICK_ANIM_1 << (*s_ptr - '1');
- s_ptr++;
+ int gic_anim_nr = (*s_ptr++ - '0');
- // check for "click:anim_X.part_X"
- if (strPrefix(s_ptr, pattern_2))
+ if (*s_ptr >= '0' && *s_ptr <= '9')
+ gic_anim_nr = 10 * gic_anim_nr + (*s_ptr++ - '0');
+
+ if (gic_anim_nr < 1 || gic_anim_nr > MAX_GLOBAL_ANIMS)
+ return ANIM_EVENT_NONE;
+
+ result |= gic_anim_nr << ANIM_EVENT_ANIM_BIT;
+ }
+ else
+ {
+ // invalid main animation number specified
+
+ return ANIM_EVENT_NONE;
+ }
+
+ // check for animation part number ("part_X" or "part_XX") (optional)
+ if (strPrefix(s_ptr, pattern_2))
+ {
+ s_ptr += strlen(pattern_2);
+
+ if (*s_ptr >= '0' && *s_ptr <= '9')
{
- s_ptr += strlen(pattern_2);
+ int gic_part_nr = (*s_ptr++ - '0');
- if (*s_ptr >= '1' && *s_ptr <= '8')
- {
- result |= ANIM_EVENT_CLICK_PART_1 << (*s_ptr - '1');
- s_ptr++;
- }
+ if (*s_ptr >= '0' && *s_ptr <= '9')
+ gic_part_nr = 10 * gic_part_nr + (*s_ptr++ - '0');
+
+ if (gic_part_nr < 1 || gic_part_nr > MAX_GLOBAL_ANIM_PARTS)
+ return ANIM_EVENT_NONE;
+
+ result |= gic_part_nr << ANIM_EVENT_PART_BIT;
}
else
{
- // no "part_X" specified -- trigger by click on any part
- result |= ANIM_EVENT_CLICK_PART_ALL;
+ // invalid animation part number specified
+
+ return ANIM_EVENT_NONE;
}
}
/* discard result if next character is neither delimiter nor whitespace */
if (!(*s_ptr == ',' || *s_ptr == '\0' ||
*s_ptr == ' ' || *s_ptr == '\t'))
- return get_anim_parameter_value(s_ptr);
-
- /* check if string contains another parameter string after a comma */
- s_ptr = strchr(s_ptr, ',');
- if (s_ptr == NULL) /* string does not contain a comma */
- return result;
+ return ANIM_EVENT_NONE;
- return result | get_anim_parameter_value(s_ptr);
+ return result;
}
int get_parameter_value(char *value_raw, char *suffix, int type)
strEqual(value, "middle") ? POS_MIDDLE :
strEqual(value, "lower") ? POS_LOWER :
strEqual(value, "bottom") ? POS_BOTTOM :
- strEqual(value, "any") ? POS_ANY : POS_UNDEFINED);
+ strEqual(value, "any") ? POS_ANY :
+ strEqual(value, "last") ? POS_LAST : POS_UNDEFINED);
}
else if (strEqual(suffix, ".align"))
{
{
result = ANIM_EVENT_DEFAULT;
+ if (string_has_parameter(value, "any"))
+ result |= ANIM_EVENT_ANY;
+
if (string_has_parameter(value, "click"))
- result |= ANIM_EVENT_CLICK_SELF;
+ result |= ANIM_EVENT_SELF;
- if (string_has_anim_parameter(value, "click:anim_X") ||
- string_has_anim_parameter(value, "click:anim_X.part_X"))
- result |= get_anim_parameter_value(value);
+ // add optional "click:anim_X" or "click:anim_X.part_X" parameter
+ result |= get_anim_parameter_value(value);
}
else if (strEqual(suffix, ".class"))
{
if (string_has_parameter(value, "inner_corners"))
result |= STYLE_INNER_CORNERS;
+
+ if (string_has_parameter(value, "reverse"))
+ result |= STYLE_REVERSE;
}
else if (strEqual(suffix, ".fade_mode"))
{