diff --git a/languages/en.ini b/languages/en.ini index 7e598a0..e146382 100644 --- a/languages/en.ini +++ b/languages/en.ini @@ -45,6 +45,10 @@ OFF = Off SELECT_GAME_MENU = Select game to play\n\n SELECT_THEME_MENU = Select theme\n\n +KBD_MODE_NORMAL = Normal +KBD_MODE_SMART = Smart +KBD_MODE_INVERSE = Inverse + SETTINGS_MENU = \ Volume\n\ <<< %d%% >>>\n\ @@ -60,6 +64,7 @@ Font scaling: <<%d>>\n\ Refs highlighting: %s\n\ Motion mode: %s\n\ Mouse filter: %s\n\ +Keyboard mode: %s\n\ \n\ Language: <<%s>>\n\ Custom game themes: %s\n\ diff --git a/languages/ru.ini b/languages/ru.ini index b1d519e..146f08e 100644 --- a/languages/ru.ini +++ b/languages/ru.ini @@ -46,6 +46,10 @@ BACK_MENU = Назад ON = Да OFF = Нет +KBD_MODE_NORMAL = Обычное +KBD_MODE_SMART = Умное +KBD_MODE_INVERSE = Обратное + SETTINGS_MENU = \ Громкость\n\ <<< %d%% >>>\n\ @@ -60,6 +64,7 @@ SETTINGS_MENU = \ Подсветка ссылок: %s\n\ Режим прокрутки: %s\n\ Фильтр мышки: %s\n\ +Режим клавиатуры: %s\n\ \n\ Язык: <<%s>>\n\ Собственные темы игр: %s\n\ diff --git a/src/sdl-instead/config.c b/src/sdl-instead/config.c index ee504ae..16d4716 100644 --- a/src/sdl-instead/config.c +++ b/src/sdl-instead/config.c @@ -18,6 +18,7 @@ int opt_click = 1; int opt_music = 1; int opt_autosave = 1; int opt_filter = 1; +int opt_kbd = KBD_SMART; char *opt_game = NULL; char *opt_theme = NULL; @@ -38,6 +39,7 @@ static struct parser cfg_parser[] = { { "filter", parse_int, &opt_filter }, { "owntheme", parse_int, &opt_owntheme }, { "lang", parse_string, &opt_lang }, + { "kbd", parse_int, &opt_kbd }, { NULL, }, }; @@ -68,11 +70,11 @@ int cfg_save(void) fprintf(fp, "fs = %d\nhl = %d\nhz = %d\nvol = %d\nautosave = %d\n\ game = %s\nfscale = %d\nmotion = %d\n\ click = %d\nmusic = %d\ntheme = %s\n\ -filter = %d\nowntheme = %d\nlang = %s", +filter = %d\nowntheme = %d\nlang = %s\nkbd = %d", opt_fs, opt_hl, opt_hz, opt_vol, opt_autosave, curgame_dir?curgame_dir:"", opt_fsize, opt_motion, opt_click, opt_music, curtheme_dir?curtheme_dir:DEFAULT_THEME, - opt_filter, opt_owntheme, opt_lang); + opt_filter, opt_owntheme, opt_lang, opt_kbd); fclose(fp); return 0; } diff --git a/src/sdl-instead/config.h b/src/sdl-instead/config.h index 9ed74f1..25558d4 100644 --- a/src/sdl-instead/config.h +++ b/src/sdl-instead/config.h @@ -3,6 +3,11 @@ #define FONT_SZ(v) ((v) * (1.0f + ((0.1f * opt_fsize)))) +#define KBD_NORMAL 0 +#define KBD_SMART 1 +#define KBD_INVERSE 2 +#define KBD_MAX 3 + extern int opt_fsize; extern int opt_fs; extern int opt_owntheme; @@ -14,6 +19,8 @@ extern int opt_click; extern int opt_music; extern int opt_autosave; extern int opt_filter; +extern int opt_kbd; + extern char *opt_game; extern char *opt_theme; extern char *opt_lang; diff --git a/src/sdl-instead/game.c b/src/sdl-instead/game.c index de1032a..2b3c2ef 100644 --- a/src/sdl-instead/game.c +++ b/src/sdl-instead/game.c @@ -1827,22 +1827,23 @@ int game_loop(void) menu_toggle(); } else if (!is_key(&ev, "tab")) { select_frame(shift_pressed); - } else if (!is_key(&ev, "up")) { - if (menu_shown || (!alt_pressed && !shift_pressed)) { - if (select_ref(1, 0)) { - game_scroll_up(1); - select_ref(0, 1); + } else if (!is_key(&ev, "up") || !is_key(&ev, "down")) { + int lm; + int prev = !is_key(&ev, "up"); + + if (opt_kbd == KBD_INVERSE) + lm = (alt_pressed || shift_pressed); + else + lm = (!alt_pressed && !shift_pressed); + + if (menu_shown || lm) { + if (select_ref(prev, 0)) { + if (opt_kbd == KBD_SMART) + (prev)?game_scroll_up(1):game_scroll_down(1); + select_ref(!prev, 1); } } else - game_scroll_up(1); - } else if (!is_key(&ev, "down")) { - if (menu_shown || (!alt_pressed && !shift_pressed)) { - if (select_ref(0, 0)) { - game_scroll_down(1); - select_ref(1, 1); - } - } else - game_scroll_down(1); + (prev)?game_scroll_up(1):game_scroll_down(1); } else if (!is_key(&ev, "left")) { select_ref(1, 0); } else if (!is_key(&ev, "right")) { diff --git a/src/sdl-instead/menu.c b/src/sdl-instead/menu.c index 368a270..5dae8b7 100644 --- a/src/sdl-instead/menu.c +++ b/src/sdl-instead/menu.c @@ -38,6 +38,10 @@ char *QUIT_MENU = NULL; char *ON = NULL; char *OFF = NULL; +char *KBD_MODE_NORMAL = NULL; +char *KBD_MODE_SMART = NULL; +char *KBD_MODE_INVERSE = NULL; + static char menu_buff[4096]; static char *slot_name(const char *path) @@ -178,9 +182,10 @@ char *game_menu_gen(void) } else if (cur_menu == menu_about) { snprintf(menu_buff, sizeof(menu_buff), ABOUT_MENU, VERSION); } else if (cur_menu == menu_settings) { + char *kbd [KBD_MAX] = { KBD_MODE_NORMAL, KBD_MODE_SMART, KBD_MODE_INVERSE }; snprintf(menu_buff, sizeof(menu_buff), SETTINGS_MENU, snd_vol_to_pcn(snd_volume_mus(-1)), snd_hz(), opt_music?ON:OFF, opt_click?ON:OFF, - opt_fs?ON:OFF, opt_fsize, opt_hl?ON:OFF, opt_motion?ON:OFF, opt_filter?ON:OFF, + opt_fs?ON:OFF, opt_fsize, opt_hl?ON:OFF, opt_motion?ON:OFF, opt_filter?ON:OFF, kbd[opt_kbd], langs[cur_lang].name, opt_owntheme?ON:OFF, opt_autosave?ON:OFF); } else if (cur_menu == menu_askquit) { snprintf(menu_buff, sizeof(menu_buff), QUIT_MENU); @@ -221,6 +226,11 @@ int game_menu_act(const char *a) if (!strcmp(a, "/autosave")) { opt_autosave ^= 1; game_menu_box(1, game_menu_gen()); + } else if (!strcmp(a, "/kbd")) { + opt_kbd += 1; + if (opt_kbd == KBD_MAX) + opt_kbd = 0; + game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/owntheme")) { opt_owntheme ^= 1; if (game_own_theme) @@ -460,6 +470,9 @@ static void lang_free(void) FREE(QUIT_MENU); FREE(ON); FREE(OFF); + FREE(KBD_MODE_NORMAL); + FREE(KBD_MODE_SMART); + FREE(KBD_MODE_INVERSE); } static int lang_ok(void) @@ -469,7 +482,7 @@ static int lang_ok(void) MAIN_MENU && ABOUT_MENU && BACK_MENU && SETTINGS_MENU && CUSTOM_THEME_MENU && OWN_THEME_MENU && SELECT_GAME_MENU && SELECT_THEME_MENU && SAVED_MENU && NOGAMES_MENU && NOTHEMES_MENU && QUIT_MENU && - ON && OFF) + ON && OFF && KBD_MODE_NORMAL && KBD_MODE_SMART && KBD_MODE_INVERSE) return 0; return -1; } @@ -497,6 +510,9 @@ struct parser lang_parser[] = { { "QUIT_MENU", parse_esc_string, &QUIT_MENU }, { "ON", parse_esc_string, &ON }, { "OFF", parse_esc_string, &OFF }, + { "KBD_MODE_NORMAL", parse_esc_string, &KBD_MODE_NORMAL }, + { "KBD_MODE_SMART", parse_esc_string, &KBD_MODE_SMART }, + { "KBD_MODE_INVERSE", parse_esc_string, &KBD_MODE_INVERSE }, { NULL, }, }; diff --git a/themes/default/theme.ini b/themes/default/theme.ini index 0087a05..cab67b9 100644 --- a/themes/default/theme.ini +++ b/themes/default/theme.ini @@ -3,8 +3,8 @@ scr.w = 800 scr.h = 480 scr.gfx.bg = bg.png scr.col.bg = white -scr.gfx.cursor.x = 0 -scr.gfx.cursor.y = 0 +scr.gfx.cursor.x = 1 +scr.gfx.cursor.y = 1 scr.gfx.cursor.normal = cursor.png scr.gfx.cursor.use = cursor-use.png scr.gfx.pad = 16