diff --git a/examples/mdview2/mdview2.c b/examples/mdview2/mdview2.c index 400a8ae..415339e 100644 --- a/examples/mdview2/mdview2.c +++ b/examples/mdview2/mdview2.c @@ -252,8 +252,6 @@ static uint8_t g_disp_doc = DOC_8BIT; /* какой набор показа static void doc_switch(uint8_t target); /* forward (нужна в progress_tick) */ -#define HPAN_STEP 8u - /* Спиннер в статус-баре (col=8,row=0). * Включается во время загрузки/индексации, чтобы показать, * что программа занята и не зависла. */ @@ -1020,36 +1018,21 @@ int main(int argc, char **argv) } #endif /* WITH_RAW */ - switch (scan) { - case KEY_F1: show_help(); break; - case KEY_F8: { /* цикл CP866→CP1251→KOI8R→UTF8→CP866; нужный набор дособерётся лениво */ - uint8_t next = (g_encoding == ENC_CP866) ? ENC_CP1251 : - (g_encoding == ENC_CP1251) ? ENC_KOI8R : - (g_encoding == ENC_KOI8R) ? ENC_UTF8 : ENC_CP866; - if (next == ENC_UTF8 && g_utf_failed) next = ENC_CP866; /* UTF-8 недоступен */ - switch_encoding(next); - if (g_abort) goto exit_loop; /* Esc/F10 во время ленивой досборки */ - render_full_status(); /* перерисовка — в MD-режиме */ - draw_viewport_from_cache(); - continue; - } - case KEY_F10: goto exit_loop; - case KEY_UP: scroll_up(1); break; - case KEY_DOWN: scroll_down(1); break; - case KEY_LEFT: scroll_h(-(int8_t)HPAN_STEP); break; - case KEY_RIGHT: scroll_h(+(int8_t)HPAN_STEP); break; - case KEY_PGUP: scroll_up(VIEW_H); break; - case KEY_PGDN: scroll_down(VIEW_H); break; - case KEY_HOME: top_line = 0; - viewport_x = 0; - draw_viewport_from_cache(); break; - case KEY_END: top_line = (n_lines > VIEW_H) - ? (uint16_t)(n_lines - VIEW_H) : 0; - viewport_x = 0; - draw_viewport_from_cache(); break; - default: continue; + /* MD-режим: F1/F8/F10 здесь, навигация — в md_key() (peer к raw_key). */ + if (scan == KEY_F10) goto exit_loop; + if (scan == KEY_F1) { show_help(); continue; } /* show_help сам перерисует */ + if (scan == KEY_F8) { /* цикл CP866→CP1251→KOI8R→UTF8→CP866; набор дособерётся лениво */ + uint8_t next = (g_encoding == ENC_CP866) ? ENC_CP1251 : + (g_encoding == ENC_CP1251) ? ENC_KOI8R : + (g_encoding == ENC_KOI8R) ? ENC_UTF8 : ENC_CP866; + if (next == ENC_UTF8 && g_utf_failed) next = ENC_CP866; /* UTF-8 недоступен */ + switch_encoding(next); + if (g_abort) goto exit_loop; /* Esc/F10 во время ленивой досборки */ + render_full_status(); /* перерисовка — в MD-режиме */ + draw_viewport_from_cache(); + continue; } - render_updated_status(); + md_key(scan); /* навигация MD (сама рисует+статус); незнакомые игнорит */ } exit_loop: unload_file(); diff --git a/examples/mdview2/mdview2.h b/examples/mdview2/mdview2.h index 7f22936..f6a99cc 100644 --- a/examples/mdview2/mdview2.h +++ b/examples/mdview2/mdview2.h @@ -20,6 +20,7 @@ #define VIEW_H 30 /* видимая область: строки 1..30 включительно */ #define MENU_ROW 31 #define TAB_STOP 4 +#define HPAN_STEP 8u /* шаг горизонтального сдвига (←/→) */ /* ---- Параметры файла и памяти ------------------------------------ */ #define PAGE_BITS 14u @@ -174,6 +175,7 @@ void clamp_top(void); /* привести top_line к ди void scroll_up(uint16_t n); void scroll_down(uint16_t n); void scroll_h(int8_t delta); /* горизонтальный сдвиг nowrap-блоков */ +uint8_t md_key(uint8_t scan); /* навигация MD (после загрузки); 1 = обработано */ /* ================================================================== * * API модуля справки (mdview2_help.c). diff --git a/examples/mdview2/mdview2_md.c b/examples/mdview2/mdview2_md.c index 4a496a9..e184e93 100644 --- a/examples/mdview2/mdview2_md.c +++ b/examples/mdview2/mdview2_md.c @@ -246,3 +246,28 @@ void scroll_h(int8_t delta) if (new_vx != old_vx) draw_viewport_from_cache(); } + +/* ---- навигация MD после загрузки (peer к raw_key) ---------------- */ + +/* Обрабатывает навигационную клавишу в MD-режиме (вызывается из главного + * цикла). Сама перерисовывает область/статус. Возврат: 1 — обработано, + * 0 — не наша клавиша (F1/F8/F10 разбирает main). */ +uint8_t md_key(uint8_t scan) +{ + switch (scan) { + case KEY_UP: scroll_up(1); break; + case KEY_DOWN: scroll_down(1); break; + case KEY_LEFT: scroll_h(-(int8_t)HPAN_STEP); break; + case KEY_RIGHT: scroll_h(+(int8_t)HPAN_STEP); break; + case KEY_PGUP: scroll_up(VIEW_H); break; + case KEY_PGDN: scroll_down(VIEW_H); break; + case KEY_HOME: top_line = 0; viewport_x = 0; + draw_viewport_from_cache(); break; + case KEY_END: top_line = (n_lines > VIEW_H) ? (uint16_t)(n_lines - VIEW_H) : 0; + viewport_x = 0; + draw_viewport_from_cache(); break; + default: return 0; /* не наша клавиша */ + } + render_updated_status(); + return 1; +} diff --git a/examples/mdview2/mdview2_raw.c b/examples/mdview2/mdview2_raw.c index 3b087e8..d151f85 100644 --- a/examples/mdview2/mdview2_raw.c +++ b/examples/mdview2/mdview2_raw.c @@ -22,8 +22,6 @@ static uint32_t raw_top = 0; /* байт-offset верхней строки экрана */ static uint16_t raw_hpan = 0; /* гориз. сдвиг (только HSCROLL) */ -#define HPAN_STEP 8u - /* ---- примитивы навигации по физическим строкам / переносам -------- */ static uint32_t raw_line_start(uint32_t off)