From 05916a3cc6782f9ec4265ac89e12a20d206901c5 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Fri, 26 Jun 2026 11:21:51 +0300 Subject: [PATCH] =?UTF-8?q?mdview2:=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20md=5Fkey()=20=D0=B2=20mdview2=5Fmd.c=20(=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=BC=D0=B5=D1=82=D1=80=D0=B8=D1=8F=20=D1=81=20raw=5Fkey?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MD-навигация после загрузки (стрелки/PgUp/PgDn/Home/End/←/→) вынесена из switch в main() в md_key(scan) — peer к raw_key(): возвращает 1/0, сама перерисовывает область+статус. main() теперь симметричен для обоих видов: F-клавиши (F1/F8/F10, для RAW ещё F2/F3) разбираются в цикле, навигация делегируется md_key()/raw_key(). HPAN_STEP вынесен в mdview2.h (был продублирован в ядре и raw). load_key() (навигация во время прогрессивной загрузки, bounded по drawable_lines) остаётся в ядре — у неё нет RAW-аналога. Поведение сохранено (F1 теперь без лишнего render_updated_status — show_help и так перерисовывает всё). Размер: exe 28115→28173 (+58 Б — стоимость границы функции, как у raw_key). Сборка чистая. Co-Authored-By: Claude Opus 4.8 --- examples/mdview2/mdview2.c | 45 +++++++++++----------------------- examples/mdview2/mdview2.h | 2 ++ examples/mdview2/mdview2_md.c | 25 +++++++++++++++++++ examples/mdview2/mdview2_raw.c | 2 -- 4 files changed, 41 insertions(+), 33 deletions(-) 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)