diff --git a/apps/keymaps/keymap-fiiom3k.c b/apps/keymaps/keymap-fiiom3k.c index 1ccf7e956f..355a87e78f 100644 --- a/apps/keymaps/keymap-fiiom3k.c +++ b/apps/keymaps/keymap-fiiom3k.c @@ -185,20 +185,23 @@ static const struct button_mapping button_context_quickscreen[] = { static const struct button_mapping button_context_pitchscreen[] = { {ACTION_PS_INC_SMALL, BUTTON_UP, BUTTON_NONE}, - {ACTION_PS_INC_SMALL, BUTTON_SCROLL_BACK, BUTTON_NONE}, - {ACTION_PS_INC_BIG, BUTTON_VOL_UP, BUTTON_NONE}, + {ACTION_PS_INC_BIG, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE}, + {ACTION_PS_INC_BIG, BUTTON_SCROLL_BACK, BUTTON_NONE}, + {ACTION_PS_INC_BIG, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE}, {ACTION_PS_DEC_SMALL, BUTTON_DOWN, BUTTON_NONE}, - {ACTION_PS_DEC_SMALL, BUTTON_SCROLL_FWD, BUTTON_NONE}, - {ACTION_PS_DEC_BIG, BUTTON_VOL_DOWN, BUTTON_NONE}, + {ACTION_PS_DEC_BIG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE}, + {ACTION_PS_DEC_BIG, BUTTON_SCROLL_FWD, BUTTON_NONE}, + {ACTION_PS_DEC_BIG, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE}, {ACTION_PS_NUDGE_LEFT, BUTTON_LEFT, BUTTON_NONE}, {ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE}, {ACTION_PS_NUDGE_LEFTOFF, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE}, {ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE}, - {ACTION_PS_TOGGLE_MODE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT}, + {ACTION_PS_TOGGLE_MODE, BUTTON_MENU, BUTTON_NONE}, + {ACTION_PS_EXIT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT}, {ACTION_PS_RESET, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT}, - {ACTION_PS_EXIT, BUTTON_POWER, BUTTON_NONE}, - {ACTION_PS_FASTER, BUTTON_BACK, BUTTON_NONE}, - {ACTION_PS_SLOWER, BUTTON_MENU, BUTTON_NONE}, + {ACTION_PS_EXIT, BUTTON_BACK, BUTTON_NONE}, + {ACTION_PS_FASTER, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, + {ACTION_PS_SLOWER, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, LAST_ITEM_IN_LIST }; /* button_context_pitchscreen */ diff --git a/apps/keymaps/keymap-ipod.c b/apps/keymaps/keymap-ipod.c index aea0c444a2..f074026e60 100644 --- a/apps/keymaps/keymap-ipod.c +++ b/apps/keymaps/keymap-ipod.c @@ -151,8 +151,9 @@ static const struct button_mapping button_context_pitchscreen[] = { { ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, { ACTION_PS_TOGGLE_MODE, BUTTON_PLAY, BUTTON_NONE }, - { ACTION_PS_RESET, BUTTON_MENU, BUTTON_NONE }, - { ACTION_PS_EXIT, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_PS_EXIT, BUTTON_MENU, BUTTON_NONE }, + { ACTION_PS_EXIT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT}, + { ACTION_PS_RESET, BUTTON_SELECT|BUTTON_REPEAT,BUTTON_SELECT}, { ACTION_PS_SLOWER, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_PS_FASTER, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, diff --git a/apps/lang/bulgarian.lang b/apps/lang/bulgarian.lang index 05400fa4d5..8f859fc112 100644 --- a/apps/lang/bulgarian.lang +++ b/apps/lang/bulgarian.lang @@ -14597,11 +14597,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Скриване на информацията" diff --git a/apps/lang/chinese-simp.lang b/apps/lang/chinese-simp.lang index 3e1394f774..1120999871 100644 --- a/apps/lang/chinese-simp.lang +++ b/apps/lang/chinese-simp.lang @@ -14601,11 +14601,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "隐藏信息" diff --git a/apps/lang/deutsch.lang b/apps/lang/deutsch.lang index 66e3e33183..806ee79348 100644 --- a/apps/lang/deutsch.lang +++ b/apps/lang/deutsch.lang @@ -14615,11 +14615,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Information verbergen" diff --git a/apps/lang/english-us.lang b/apps/lang/english-us.lang index febe166dce..db078e77af 100644 --- a/apps/lang/english-us.lang +++ b/apps/lang/english-us.lang @@ -14591,17 +14591,17 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" - *: "Hide information" + *: "Hide Information" - *: "Hide information" + *: "Hide Information" diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 6bb698cd78..aeedbc2541 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -14844,17 +14844,17 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" - *: "Hide information" + *: "Hide Information" - *: "Hide information" + *: "Hide Information" diff --git a/apps/lang/espanol.lang b/apps/lang/espanol.lang index ae9c36cb12..14dd2db561 100644 --- a/apps/lang/espanol.lang +++ b/apps/lang/espanol.lang @@ -14701,11 +14701,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Ocultar información" diff --git a/apps/lang/francais.lang b/apps/lang/francais.lang index adcb05916a..7b92309fe9 100644 --- a/apps/lang/francais.lang +++ b/apps/lang/francais.lang @@ -12290,11 +12290,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Masquer les informations" diff --git a/apps/lang/italiano.lang b/apps/lang/italiano.lang index 621058e074..5e837aa636 100644 --- a/apps/lang/italiano.lang +++ b/apps/lang/italiano.lang @@ -14300,11 +14300,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Nascondere le informazioni" diff --git a/apps/lang/japanese.lang b/apps/lang/japanese.lang index 501d102214..aaf46fa501 100644 --- a/apps/lang/japanese.lang +++ b/apps/lang/japanese.lang @@ -14794,11 +14794,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "情報を隠す" diff --git a/apps/lang/korean.lang b/apps/lang/korean.lang index 9b37d29230..99f91af6fa 100644 --- a/apps/lang/korean.lang +++ b/apps/lang/korean.lang @@ -14609,11 +14609,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "정보 숨기기" diff --git a/apps/lang/latviesu.lang b/apps/lang/latviesu.lang index 94391888a9..e0db4361b6 100644 --- a/apps/lang/latviesu.lang +++ b/apps/lang/latviesu.lang @@ -14706,11 +14706,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Paslēpt informāciju" diff --git a/apps/lang/magyar.lang b/apps/lang/magyar.lang index f88fd31b7e..edac063a7e 100644 --- a/apps/lang/magyar.lang +++ b/apps/lang/magyar.lang @@ -14709,11 +14709,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Információ elrejtése" diff --git a/apps/lang/moldoveneste.lang b/apps/lang/moldoveneste.lang index af4718d647..e1db7daf9d 100644 --- a/apps/lang/moldoveneste.lang +++ b/apps/lang/moldoveneste.lang @@ -14712,11 +14712,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Ascunde informațiile" diff --git a/apps/lang/nederlands.lang b/apps/lang/nederlands.lang index 6f2d2fc19f..d722854d22 100644 --- a/apps/lang/nederlands.lang +++ b/apps/lang/nederlands.lang @@ -14360,11 +14360,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Verberg informatie" diff --git a/apps/lang/norsk-nynorsk.lang b/apps/lang/norsk-nynorsk.lang index fa67417801..eee67b9be8 100644 --- a/apps/lang/norsk-nynorsk.lang +++ b/apps/lang/norsk-nynorsk.lang @@ -14779,11 +14779,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Gøym informasjon" diff --git a/apps/lang/polski.lang b/apps/lang/polski.lang index 8d6816b47b..097211e7dd 100644 --- a/apps/lang/polski.lang +++ b/apps/lang/polski.lang @@ -14306,11 +14306,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Ukryj informacje" diff --git a/apps/lang/portugues-brasileiro.lang b/apps/lang/portugues-brasileiro.lang index c28f304a94..71dc258233 100644 --- a/apps/lang/portugues-brasileiro.lang +++ b/apps/lang/portugues-brasileiro.lang @@ -14817,11 +14817,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Ocultar informações" diff --git a/apps/lang/romaneste.lang b/apps/lang/romaneste.lang index 6a3bd8fa19..a2bf35136b 100644 --- a/apps/lang/romaneste.lang +++ b/apps/lang/romaneste.lang @@ -14712,11 +14712,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Ascunde informațiile" diff --git a/apps/lang/russian.lang b/apps/lang/russian.lang index b9b30004c0..47feb49e30 100644 --- a/apps/lang/russian.lang +++ b/apps/lang/russian.lang @@ -14328,11 +14328,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Ничего не показывать" diff --git a/apps/lang/slovak.lang b/apps/lang/slovak.lang index d481450931..3c3aebca05 100644 --- a/apps/lang/slovak.lang +++ b/apps/lang/slovak.lang @@ -14326,11 +14326,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Skryť info" diff --git a/apps/lang/srpski.lang b/apps/lang/srpski.lang index 90ff30bdd3..1a238f8207 100644 --- a/apps/lang/srpski.lang +++ b/apps/lang/srpski.lang @@ -14705,11 +14705,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Сакриј информације" diff --git a/apps/lang/svenska.lang b/apps/lang/svenska.lang index f254d7aa49..0a7fa0fd6f 100644 --- a/apps/lang/svenska.lang +++ b/apps/lang/svenska.lang @@ -14714,11 +14714,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Göm information" diff --git a/apps/lang/turkce.lang b/apps/lang/turkce.lang index d9407a6173..68ef3f100c 100644 --- a/apps/lang/turkce.lang +++ b/apps/lang/turkce.lang @@ -14597,11 +14597,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Bilgileri gizle" diff --git a/apps/lang/ukrainian.lang b/apps/lang/ukrainian.lang index 5e89c07baa..507ce32de2 100644 --- a/apps/lang/ukrainian.lang +++ b/apps/lang/ukrainian.lang @@ -14706,11 +14706,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Приховати інформацію" diff --git a/apps/lang/vietnamese.lang b/apps/lang/vietnamese.lang index c9562ffa7d..d794a4e2be 100644 --- a/apps/lang/vietnamese.lang +++ b/apps/lang/vietnamese.lang @@ -14615,11 +14615,11 @@ - id: LANG_HIDE_ALBUM_TITLE_NEW - desc: in the pictureflow settings + id: LANG_HIDE_INFO + desc: Hide Information user: core - *: "Hide information" + *: "Hide Information" *: "Ẩn thông tin" diff --git a/apps/plugins/imageviewer/bmp/bmp.c b/apps/plugins/imageviewer/bmp/bmp.c index 019c4982d3..3911917fec 100644 --- a/apps/plugins/imageviewer/bmp/bmp.c +++ b/apps/plugins/imageviewer/bmp/bmp.c @@ -176,7 +176,8 @@ static int load_image(char *filename, struct image_info *info, return PLUGIN_OUTOFMEM; } - if (!iv->running_slideshow) + if (!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_puts(0, 0, rb->strrchr(filename,'/')+1); rb->lcd_putsf(0, 1, "loading %dx%d%s", @@ -206,7 +207,8 @@ static int load_image(char *filename, struct image_info *info, return PLUGIN_ERROR; } - if (!iv->running_slideshow) + if (!iv->settings->hide_info && + !iv->running_slideshow) { rb->snprintf(print, sizeof(print), " %ld.%02ld sec ", time/HZ, time%HZ); rb->lcd_getstringsize(print, &w, &h); /* centered in progress bar */ @@ -225,7 +227,8 @@ static int load_image(char *filename, struct image_info *info, buf_images = buf_root = buf + size; buf_images_size = root_size = *buf_size - size; - if (!iv->running_slideshow) + if (!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_putsf(0, 2, "image %dx%d", bmp.width, bmp.height); rb->lcd_update(); diff --git a/apps/plugins/imageviewer/gif/gif.c b/apps/plugins/imageviewer/gif/gif.c index 61ff1a6146..7fbf573a1a 100644 --- a/apps/plugins/imageviewer/gif/gif.c +++ b/apps/plugins/imageviewer/gif/gif.c @@ -56,7 +56,7 @@ static void draw_image_rect(struct image_info *info, #ifdef HAVE_LCD_COLOR rb->lcd_bitmap_part((fb_data *)*pdisp, info->x + x, info->y + y, - STRIDE(SCREEN_MAIN, info->width, info->height), + STRIDE(SCREEN_MAIN, info->width, info->height), x + MAX(0, (LCD_WIDTH-info->width)/2), y + MAX(0, (LCD_HEIGHT-info->height)/2), width, height); @@ -100,7 +100,7 @@ static int load_image(char *filename, struct image_info *info, } #endif - /* initialize decoder context struct, set buffer decoder is free + /* initialize decoder context struct, set buffer decoder is free * to use. */ gif_decoder_init(p_decoder, memory, memory_size); @@ -111,7 +111,8 @@ static int load_image(char *filename, struct image_info *info, if (!p_decoder->error) { - if (!iv->running_slideshow) + if (!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_putsf(0, 2, "file: %s", filename); @@ -137,7 +138,9 @@ static int load_image(char *filename, struct image_info *info, gif_decoder_destroy_memory_pool(p_decoder); - if (!iv->running_slideshow && !p_decoder->error) + if (!iv->settings->hide_info && + !iv->running_slideshow && + !p_decoder->error) { rb->snprintf(print, sizeof(print), " %ld.%02ld sec ", time/HZ, time%HZ); rb->lcd_getstringsize(print, &w, &h); /* centered in progress bar */ @@ -215,7 +218,9 @@ static int get_image(struct image_info *info, int frame, int ds) /* assign image buffer */ if (ds > 1) { - if (!iv->running_slideshow && (info->frames_count == 1)) + if (!iv->settings->hide_info && + !iv->running_slideshow && + (info->frames_count == 1)) { rb->lcd_putsf(0, 3, "resizing %d*%d", info->width, info->height); rb->lcd_update(); diff --git a/apps/plugins/imageviewer/imageviewer.c b/apps/plugins/imageviewer/imageviewer.c index b67ff764aa..01683c8ace 100644 --- a/apps/plugins/imageviewer/imageviewer.c +++ b/apps/plugins/imageviewer/imageviewer.c @@ -64,7 +64,8 @@ static struct imgview_settings settings = COLOURMODE_COLOUR, DITHER_NONE, #endif - SS_DEFAULT_TIMEOUT + SS_DEFAULT_TIMEOUT, + true }; static struct imgview_settings old_settings; @@ -78,6 +79,7 @@ static struct configdata config[] = #endif { TYPE_INT, SS_MIN_TIMEOUT, SS_MAX_TIMEOUT, { .int_p = &settings.ss_timeout }, "Slideshow Time", NULL }, + { TYPE_BOOL, 0, 1, { .bool_p = &settings.hide_info }, "Hide Info", NULL }, }; static void cb_progress(int current, int total); @@ -244,12 +246,22 @@ static bool set_option_dithering(void) return false; } +static bool set_option_hide_info(void) +{ + rb->set_bool(rb->str(LANG_HIDE_INFO), &settings.hide_info); + return false; +} + MENUITEM_FUNCTION(grayscale_item, 0, ID2P(LANG_GRAYSCALE), set_option_grayscale, NULL, Icon_NOICON); MENUITEM_FUNCTION(dithering_item, 0, ID2P(LANG_DITHERING), set_option_dithering, NULL, Icon_NOICON); -MAKE_MENU(display_menu, "Display Options", NULL, Icon_NOICON, - &grayscale_item, &dithering_item); +MENUITEM_FUNCTION(hide_info_item, 0, ID2P(LANG_HIDE_INFO), + set_option_hide_info, NULL, Icon_NOICON); +MAKE_MENU(display_menu, ID2P(LANG_MENU_DISPLAY_OPTIONS), NULL, Icon_NOICON, + &grayscale_item, + &dithering_item, + &hide_info_item); static void display_options(void) { @@ -451,6 +463,10 @@ static void cb_progress(int current, int total) { /* do not yield or update the progress bar if we did so too recently */ long now = *rb->current_tick; + + if (total == 0) + next_progress_tick = now + HZ/4; /* delay by 250ms initially */ + if(!TIME_AFTER(now, next_progress_tick)) return; @@ -965,6 +981,7 @@ reload_decoder: bool initial_frame = true; do /* loop the image prepare and decoding when zoomed */ { + cb_progress(0, 0); /* delay showing progress bar*/ status = imgdec->get_image(info, frame, ds); /* decode or fetch from cache */ if (status == PLUGIN_ERROR) { @@ -973,8 +990,9 @@ reload_decoder: } set_view(info, cx, cy); - - if(!iv_api.running_slideshow && (info->frames_count == 1)) + if(!settings.hide_info && + !iv_api.running_slideshow && + (info->frames_count == 1)) { rb->lcd_putsf(0, 3, "showing %dx%d", info->width, info->height); rb->lcd_update(); diff --git a/apps/plugins/imageviewer/imageviewer.h b/apps/plugins/imageviewer/imageviewer.h index 79691f747e..7727dd033d 100644 --- a/apps/plugins/imageviewer/imageviewer.h +++ b/apps/plugins/imageviewer/imageviewer.h @@ -77,6 +77,7 @@ struct imgview_settings int jpeg_dither_mode; #endif int ss_timeout; + bool hide_info; }; /* structure passed to image decoder. */ diff --git a/apps/plugins/imageviewer/jpeg/jpeg.c b/apps/plugins/imageviewer/jpeg/jpeg.c index c7969c10c9..1f152e0fc3 100644 --- a/apps/plugins/imageviewer/jpeg/jpeg.c +++ b/apps/plugins/imageviewer/jpeg/jpeg.c @@ -150,7 +150,8 @@ static int load_image(char *filename, struct image_info *info, return PLUGIN_OUTOFMEM; } - if(!iv->running_slideshow) + if(!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_puts(0, 0, rb->strrchr(filename,'/')+1); rb->lcd_putsf(0, 1, "loading %d bytes", filesize); @@ -160,7 +161,8 @@ static int load_image(char *filename, struct image_info *info, rb->read(fd, buf_jpeg, filesize); rb->close(fd); - if(!iv->running_slideshow) + if(!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_puts(0, 2, "decoding markers"); rb->lcd_update(); @@ -190,7 +192,8 @@ static int load_image(char *filename, struct image_info *info, default_huff_tbl(p_jpg); /* use default */ build_lut(p_jpg); /* derive Huffman and other lookup-tables */ - if(!iv->running_slideshow) + if(!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_putsf(0, 2, "image %dx%d", p_jpg->x_size, p_jpg->y_size); rb->lcd_update(); @@ -263,7 +266,8 @@ static int get_image(struct image_info *info, int frame, int ds) buf_images += size; buf_images_size -= size; - if(!iv->running_slideshow) + if(!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_putsf(0, 3, "decoding %d*%d", info->width, info->height); rb->lcd_update(); @@ -288,7 +292,8 @@ static int get_image(struct image_info *info, int frame, int ds) } time = *rb->current_tick - time; - if(!iv->running_slideshow) + if(!iv->settings->hide_info && + !iv->running_slideshow) { rb->snprintf(print, sizeof(print), " %ld.%02ld sec ", time/HZ, time%HZ); rb->lcd_getstringsize(print, &w, &h); /* centered in progress bar */ diff --git a/apps/plugins/imageviewer/jpegp/jpegp.c b/apps/plugins/imageviewer/jpegp/jpegp.c index eee5be8424..a5883e3a28 100644 --- a/apps/plugins/imageviewer/jpegp/jpegp.c +++ b/apps/plugins/imageviewer/jpegp/jpegp.c @@ -117,7 +117,8 @@ static int load_image(char *filename, struct image_info *info, POS(offset); } - if (!iv->running_slideshow) + if (!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_puts(0, 0, rb->strrchr(filename,'/')+1); rb->lcd_puts(0, 2, "decoding..."); @@ -142,7 +143,8 @@ static int load_image(char *filename, struct image_info *info, return PLUGIN_ERROR; } - if (!iv->running_slideshow) + if (!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_putsf(0, 2, "image %dx%d", p_jpg->X, p_jpg->Y); int w, h; /* used to center output */ @@ -262,7 +264,7 @@ static int get_image(struct image_info *info, int frame, int ds) c2 = (sumV + area/2) / area; } - // ITU BT.601 full-range YUV-to-RGB integer approximation + // ITU BT.601 full-range YUV-to-RGB integer approximation { int y = (c0 << 5) + 16; int u = c1 - 128; diff --git a/apps/plugins/imageviewer/png/png.c b/apps/plugins/imageviewer/png/png.c index 34a8a1fd34..68a14a268e 100644 --- a/apps/plugins/imageviewer/png/png.c +++ b/apps/plugins/imageviewer/png/png.c @@ -62,7 +62,7 @@ static void draw_image_rect(struct image_info *info, #ifdef HAVE_LCD_COLOR rb->lcd_bitmap_part((fb_data *)*pdisp, info->x + x, info->y + y, - STRIDE(SCREEN_MAIN, info->width, info->height), + STRIDE(SCREEN_MAIN, info->width, info->height), x + MAX(0, (LCD_WIDTH-info->width)/2), y + MAX(0, (LCD_HEIGHT-info->height)/2), width, height); @@ -82,8 +82,8 @@ static int img_mem(int ds) #ifdef USEGSLIB return (p_decoder->infoPng.width/ds) * (p_decoder->infoPng.height/ds); #else - return (p_decoder->infoPng.width/ds) * - (p_decoder->infoPng.height/ds) * + return (p_decoder->infoPng.width/ds) * + (p_decoder->infoPng.height/ds) * FB_DATA_SZ; #endif } @@ -126,7 +126,9 @@ static int load_image(char *filename, struct image_info *info, DEBUGF("reading file '%s'\n", filename); - if (!iv->running_slideshow) { + if (!iv->settings->hide_info && + !iv->running_slideshow) + { rb->lcd_puts(0, 0, rb->strrchr(filename,'/')+1); rb->lcd_update(); } @@ -136,7 +138,9 @@ static int load_image(char *filename, struct image_info *info, rb->close(fd); } else { - if (!iv->running_slideshow) { + if (!iv->settings->hide_info && + !iv->running_slideshow) + { rb->lcd_putsf(0, 1, "loading %zu bytes", file_size); rb->lcd_update(); } @@ -146,7 +150,9 @@ static int load_image(char *filename, struct image_info *info, rb->read(fd, image, file_size); rb->close(fd); - if (!iv->running_slideshow) { + if (!iv->settings->hide_info && + !iv->running_slideshow) + { rb->lcd_puts(0, 2, "decoding image"); rb->lcd_update(); } @@ -171,7 +177,8 @@ static int load_image(char *filename, struct image_info *info, if (!p_decoder->error) { - if (!iv->running_slideshow) { + if (!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_putsf(0, 2, "image %dx%d", p_decoder->infoPng.width, p_decoder->infoPng.height); @@ -194,7 +201,8 @@ static int load_image(char *filename, struct image_info *info, } } - if (!iv->running_slideshow && !p_decoder->error) + if (!iv->settings->hide_info && + !iv->running_slideshow && !p_decoder->error) { rb->snprintf(print, sizeof(print), " %ld.%02ld sec ", time/HZ, time%HZ); rb->lcd_getstringsize(print, &w, &h); /* centered in progress bar */ @@ -253,7 +261,8 @@ static int get_image(struct image_info *info, int frame, int ds) /* assign image buffer */ if (ds > 1) { - if (!iv->running_slideshow) + if (!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_putsf(0, 3, "resizing %d*%d", info->width, info->height); rb->lcd_update(); diff --git a/apps/plugins/imageviewer/ppm/ppm.c b/apps/plugins/imageviewer/ppm/ppm.c index 6f59b1f6b0..9a88744382 100644 --- a/apps/plugins/imageviewer/ppm/ppm.c +++ b/apps/plugins/imageviewer/ppm/ppm.c @@ -51,7 +51,7 @@ static void draw_image_rect(struct image_info *info, #ifdef HAVE_LCD_COLOR rb->lcd_bitmap_part((fb_data *)*pdisp, info->x + x, info->y + y, - STRIDE(SCREEN_MAIN, info->width, info->height), + STRIDE(SCREEN_MAIN, info->width, info->height), x + MAX(0, (LCD_WIDTH-info->width)/2), y + MAX(0, (LCD_HEIGHT-info->height)/2), width, height); @@ -111,7 +111,8 @@ static int load_image(char *filename, struct image_info *info, } DEBUGF("reading file '%s'\n", filename); - if (!iv->running_slideshow) + if (!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_puts(0, 0, rb->strrchr(filename,'/')+1); rb->lcd_putsf(0, 1, "loading %zu bytes", filesize); @@ -140,7 +141,8 @@ static int load_image(char *filename, struct image_info *info, return rc; } - if (!iv->running_slideshow) + if (!iv->settings->hide_info && + !iv->running_slideshow) { rb->snprintf(print, sizeof(print), " %ld.%02ld sec ", time/HZ, time%HZ); rb->lcd_getstringsize(print, &w, &h); /* centered in progress bar */ @@ -177,7 +179,8 @@ static int get_image(struct image_info *info, int frame, int ds) /* assign image buffer */ if (ds > 1) { - if (!iv->running_slideshow) + if (!iv->settings->hide_info && + !iv->running_slideshow) { rb->lcd_putsf(0, 3, "resizing %d*%d", info->width, info->height); rb->lcd_update(); diff --git a/apps/plugins/pictureflow/pictureflow.c b/apps/plugins/pictureflow/pictureflow.c index 259b95f5f0..affde85b99 100644 --- a/apps/plugins/pictureflow/pictureflow.c +++ b/apps/plugins/pictureflow/pictureflow.c @@ -3619,7 +3619,7 @@ static int settings_menu(void) ID2P(LANG_DISPLAY)); static const struct opt_items album_name_options[] = { - { STR(LANG_HIDE_ALBUM_TITLE_NEW) }, + { STR(LANG_HIDE_INFO) }, { STR(LANG_SHOW_AT_THE_BOTTOM_NEW) }, { STR(LANG_SHOW_AT_THE_TOP_NEW) }, { STR(LANG_SHOW_ALL_AT_THE_TOP) }, diff --git a/apps/talk.c b/apps/talk.c index 167c41e6e8..9aaa93e70f 100644 --- a/apps/talk.c +++ b/apps/talk.c @@ -765,7 +765,7 @@ static int _talk_spell(const char* spell, size_t len, bool enqueue) do_enqueue(enqueue); /* cut off all the pending stuff */ const char *last = spell; - size_t len0 = len - 1; + size_t len0 = len; /* Tokenize into UTF8 codepoints */ while ((spell = utf8decode(spell, &c)), c != '\0') { diff --git a/firmware/target/hosted/button-devinput.c b/firmware/target/hosted/button-devinput.c index a9129f3ea6..1c5e2abea2 100644 --- a/firmware/target/hosted/button-devinput.c +++ b/firmware/target/hosted/button-devinput.c @@ -21,6 +21,7 @@ ****************************************************************************/ #include #include +#include #include #include #include @@ -49,42 +50,60 @@ * Compute to angular velocity (degrees per second) */ -#define NR_POLL_DESC 4 +#define NR_POLL_DESC 5 static int num_devices = 0; static struct pollfd poll_fds[NR_POLL_DESC]; +void button_add_input_device(int i) +{ + int fd = poll_fds[i].fd; + if (fd >= 0) + close(fd); + + char path[32]; + snprintf(path, sizeof(path), "/dev/input/event%d", i); + fd = open(path, O_RDONLY | O_CLOEXEC | O_NONBLOCK); + poll_fds[i].fd = fd >= 0 ? fd : -1; + if(fd >= 0) + { + poll_fds[i].events = POLLIN; + poll_fds[i].revents = 0; + if (num_devices <= i) + num_devices = i + 1; + } +} + void button_init_device(void) { - const char * const input_devs[NR_POLL_DESC] = { - "/dev/input/event0", - "/dev/input/event1", - "/dev/input/event2", - "/dev/input/event3", - }; - for(int i = 0; i < NR_POLL_DESC; i++) { - int fd = open(input_devs[i], O_RDONLY | O_CLOEXEC); - - if(fd >= 0) - { - poll_fds[num_devices].fd = fd; - poll_fds[num_devices].events = POLLIN; - poll_fds[num_devices].revents = 0; - num_devices++; - } + poll_fds[i].fd = -1; + button_add_input_device(i); } } +void button_remove_input_device(int i) +{ + int fd = poll_fds[i].fd; + if (fd < 0) + return; + + if (i == num_devices - 1) + num_devices = i; + + close(fd); + poll_fds[i].fd = -1; +} + void button_close_device(void) { - /* close descriptors */ - for(int i = 0; i < num_devices; i++) - { - close(poll_fds[i].fd); - } num_devices = 0; + /* close descriptors */ + for(int i = 0; i < NR_POLL_DESC; i++) + { + button_remove_input_device(i); + } } #ifdef BUTTON_DELAY_RELEASE @@ -261,6 +280,10 @@ int button_read_device(BDATA) } } } + /* device was removed/disconnected — close it to stop poll returning POLLHUP forever */ + else if (poll_fds[i].revents & (POLLERR | POLLHUP)) { + button_remove_input_device(i); + } } } diff --git a/firmware/target/hosted/button-devinput.h b/firmware/target/hosted/button-devinput.h new file mode 100644 index 0000000000..20c76cab4b --- /dev/null +++ b/firmware/target/hosted/button-devinput.h @@ -0,0 +1,28 @@ +/*************************************************************************** + * __________ __ ___ + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2026 by Roman Artiukhin + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + ****************************************************************************/ + + +#ifndef __BUTTON_DEVINPUT_H__ +#define __BUTTON_DEVINPUT_H__ + +void button_close_device(void); +void button_add_input_device(int i); +void button_remove_input_device(int i); + +#endif diff --git a/firmware/target/hosted/system-hosted.c b/firmware/target/hosted/system-hosted.c index bb20842d79..65b035c640 100644 --- a/firmware/target/hosted/system-hosted.c +++ b/firmware/target/hosted/system-hosted.c @@ -29,6 +29,7 @@ #include "font.h" #include "power.h" #include "button.h" +#include "button-devinput.h" #include "backlight-target.h" #include "lcd.h" #include "filesystem-hosted.h" @@ -92,6 +93,7 @@ static void sig_handler(int sig, siginfo_t *siginfo, void *context) void power_off(void) { backlight_hw_off(); + button_close_device(); sync(); system("/sbin/poweroff"); while (1) { diff --git a/manual/platform/keymap-fiiom3k.tex b/manual/platform/keymap-fiiom3k.tex index 2112673f03..812ef21b9f 100644 --- a/manual/platform/keymap-fiiom3k.tex +++ b/manual/platform/keymap-fiiom3k.tex @@ -78,17 +78,17 @@ \newcommand{\ActionKbdAbort}{\ButtonPower} %Button actions, Pitch Screen context -\newcommand{\ActionPsToggleMode}{\ButtonSelect} -\newcommand{\ActionPsIncSmall}{\ButtonUp{} or \ButtonScrollBack} -\newcommand{\ActionPsDecSmall}{\ButtonDown{} or \ButtonScrollFwd} -\newcommand{\ActionPsIncBig}{\ButtonVolUp} -\newcommand{\ActionPsDecBig}{\ButtonVolDown} +\newcommand{\ActionPsToggleMode}{\ButtonMenu} +\newcommand{\ActionPsIncSmall}{\ButtonUp} +\newcommand{\ActionPsDecSmall}{\ButtonDown} +\newcommand{\ActionPsIncBig}{Long \ButtonUp{} or \ButtonScrollBack} +\newcommand{\ActionPsDecBig}{Long \ButtonDown {} or \ButtonScrollFwd} \newcommand{\ActionPsNudgeLeft}{\ButtonLeft} \newcommand{\ActionPsNudgeRight}{\ButtonRight} \newcommand{\ActionPsReset}{Long \ButtonSelect} -\newcommand{\ActionPsExit}{\ButtonPower} -\newcommand{\ActionPsFaster}{\ButtonBack} -\newcommand{\ActionPsSlower}{\ButtonMenu} +\newcommand{\ActionPsExit}{\ButtonBack{} or \ButtonSelect} +\newcommand{\ActionPsFaster}{Long \ButtonRight} +\newcommand{\ActionPsSlower}{Long \ButtonLeft} %Button actions, Bookmark screen context \newcommand{\ActionBmDelete}{\ButtonPlay} diff --git a/manual/platform/keymap-ipod1g2g.tex b/manual/platform/keymap-ipod1g2g.tex index 2db45b0803..d3825cdb21 100644 --- a/manual/platform/keymap-ipod1g2g.tex +++ b/manual/platform/keymap-ipod1g2g.tex @@ -77,8 +77,8 @@ \newcommand{\ActionPsDecBig}{Long \ButtonScrollBack} \newcommand{\ActionPsNudgeLeft}{\ButtonLeft} \newcommand{\ActionPsNudgeRight}{\ButtonRight} -\newcommand{\ActionPsReset}{\ButtonMenu} -\newcommand{\ActionPsExit}{\ButtonSelect} +\newcommand{\ActionPsReset}{Long \ButtonSelect} +\newcommand{\ActionPsExit}{\ButtonMenu{} or \ButtonSelect} %Button actions, Bookmark screen context \newcommand{\ActionBmDelete}{Long \ButtonMenu} diff --git a/manual/platform/keymap-ipod3g.tex b/manual/platform/keymap-ipod3g.tex index cb855a4a47..7fc7035f6a 100644 --- a/manual/platform/keymap-ipod3g.tex +++ b/manual/platform/keymap-ipod3g.tex @@ -77,8 +77,8 @@ \newcommand{\ActionPsDecBig}{Long \ButtonScrollBack} \newcommand{\ActionPsNudgeLeft}{\ButtonLeft} \newcommand{\ActionPsNudgeRight}{\ButtonRight} -\newcommand{\ActionPsReset}{\ButtonMenu} -\newcommand{\ActionPsExit}{\ButtonSelect} +\newcommand{\ActionPsReset}{Long \ButtonSelect} +\newcommand{\ActionPsExit}{\ButtonMenu{} or \ButtonSelect} %Button actions, Bookmark screen context \newcommand{\ActionBmDelete}{Long \ButtonMenu} diff --git a/manual/platform/keymap-ipod4g.tex b/manual/platform/keymap-ipod4g.tex index e4c49a81a3..c7e663bf3b 100644 --- a/manual/platform/keymap-ipod4g.tex +++ b/manual/platform/keymap-ipod4g.tex @@ -78,8 +78,8 @@ \newcommand{\ActionPsDecBig}{Long \ButtonScrollBack} \newcommand{\ActionPsNudgeLeft}{\ButtonLeft} \newcommand{\ActionPsNudgeRight}{\ButtonRight} -\newcommand{\ActionPsReset}{\ButtonMenu} -\newcommand{\ActionPsExit}{\ButtonSelect} +\newcommand{\ActionPsReset}{Long \ButtonSelect} +\newcommand{\ActionPsExit}{\ButtonMenu{} or \ButtonSelect} %Button actions, Recording screen context \newcommand{\ActionRecPause}{\ButtonPlay}