gui: usb_screen: drawing adjustments

- Eliminate separate display update for USB screen UI vp;
  wait for skin_render instead

- Eliminate outer loop around handle_usb_events

- Use handle_usb_events in Simulator as well.
  Fixes USB screen being dismissed by any button presses,
  or by system events.

- When USB keypad mode is changed, only redraw the title viewport

- Delete unused MODE_NAME_LEN #define

- Hide "USB keypad mode:" prefix. Only display current mode setting,
  which requires less scrolling and ensures that the new setting
  is always visible immediately after it has been changed

- Change comment from:

  /* Don't return until we get SYS_USB_DISCONNECTED or SYS_TIMEOUT */
  to: /* Don't return until we get SYS_USB_DISCONNECTED */

  which reflects existing behavior (comment may have been
  copy-pasted from usb_wait_for_disconnect_w_tmo)

- Don't scroll USB keypad mode unless UI vp's width is > 1, since
  some themes try to hide the USB viewport and display a custom UI
  instead

Change-Id: I9b9703025b00ad807920ee60a843f269f414f6f9
This commit is contained in:
Christian Soffke 2026-05-18 14:02:30 +02:00 committed by Solomon Peachy
parent 69b6c97e58
commit 13a0e58b1c

View file

@ -53,55 +53,63 @@
#include "ata_mmc.h"
#endif
#ifdef USB_ENABLE_HID
int usb_keypad_mode;
static bool usb_hid;
#endif
#ifndef SIMULATOR
static int handle_usb_events(void)
struct usb_screen_vps_t
{
#if (CONFIG_STORAGE & STORAGE_MMC)
int next_update=0;
#endif /* STORAGE_MMC */
struct viewport parent;
struct viewport logo;
#ifndef USB_ENABLE_HID
};
#else
struct viewport title;
};
/* Don't return until we get SYS_USB_DISCONNECTED or SYS_TIMEOUT */
int usb_keypad_mode;
static void draw_usb_keypad_mode(struct viewport *title)
{
struct screen *screen = &screens[SCREEN_MAIN];
struct viewport *last_vp = screen->set_viewport(title);
screen->clear_viewport();
title->flags |= VP_FLAG_ALIGN_CENTER;
if (title->width > 1)
screen->puts_scroll(0, 0, str(keypad_mode_name_get(usb_keypad_mode)));
screen->set_viewport(last_vp);
}
#endif /* USB_ENABLE_HID */
static void handle_usb_events(struct viewport *title)
{
#if (CONFIG_STORAGE & STORAGE_MMC) && !defined(SIMULATOR)
int next_update = 0;
#endif /* STORAGE_MMC */
int button;
/* Don't return until we get SYS_USB_DISCONNECTED */
while(1)
{
int button;
#ifdef USB_ENABLE_HID
if (usb_hid)
#ifndef USB_ENABLE_HID
(void)title;
#else
if (global_settings.usb_hid)
{
button = get_hid_usb_action();
/* On mode change, we need to refresh the screen */
if (button == ACTION_USB_HID_MODE_SWITCH_NEXT ||
button == ACTION_USB_HID_MODE_SWITCH_PREV)
{
break;
}
draw_usb_keypad_mode(title);
}
else
#endif
{
button = button_get_w_tmo(HZ/2);
/* hid emits the event in get_action */
send_event(GUI_EVENT_ACTIONUPDATE, NULL);
button = button_get_w_tmo(HZ/2);
}
switch(button)
{
case SYS_USB_DISCONNECTED:
return 1;
case SYS_CHARGER_DISCONNECTED:
if (button == SYS_USB_DISCONNECTED)
return;
if (button == SYS_CHARGER_DISCONNECTED)
reset_runtime();
break;
case SYS_TIMEOUT:
break;
}
#if (CONFIG_STORAGE & STORAGE_MMC) /* USB-MMC bridge can report activity */
/* USB-MMC bridge can report activity */
#if (CONFIG_STORAGE & STORAGE_MMC) && !defined(SIMULATOR)
if(TIME_AFTER(current_tick,next_update))
{
if(usb_inserted()) {
@ -111,21 +119,7 @@ static int handle_usb_events(void)
}
#endif /* STORAGE_MMC */
}
return 0;
}
#endif /* SIMULATOR */
#define MODE_NAME_LEN 32
struct usb_screen_vps_t
{
struct viewport parent;
struct viewport logo;
#ifdef USB_ENABLE_HID
struct viewport title;
#endif
};
static void usb_screen_fix_viewports(struct screen *screen,
struct usb_screen_vps_t *usb_screen_vps)
@ -178,7 +172,7 @@ static void usb_screen_fix_viewports(struct screen *screen,
logo->height = logo_height;
#ifdef USB_ENABLE_HID
if (usb_hid)
if (global_settings.usb_hid)
{
struct viewport *title = &usb_screen_vps->title;
int char_height = font_get(parent->font)->height;
@ -211,11 +205,9 @@ static void usb_screens_draw(struct usb_screen_vps_t *usb_screen_vps_ar)
&bm_remote_usblogo,
#endif
};
FOR_NB_SCREENS(i)
{
struct screen *screen = &screens[i];
struct usb_screen_vps_t *usb_screen_vps = &usb_screen_vps_ar[i];
struct viewport *parent = &usb_screen_vps->parent;
struct viewport *logo = &usb_screen_vps->logo;
@ -223,29 +215,14 @@ static void usb_screens_draw(struct usb_screen_vps_t *usb_screen_vps_ar)
last_vp = screen->set_viewport(parent);
screen->clear_viewport();
screen->backlight_on();
screen->set_viewport(logo);
screen->bmp(logos[i], 0, 0);
if (i == SCREEN_MAIN)
{
#ifdef USB_ENABLE_HID
if (usb_hid)
{
char modestring[100];
screen->set_viewport(&usb_screen_vps->title);
usb_screen_vps->title.flags |= VP_FLAG_ALIGN_CENTER;
snprintf(modestring, sizeof(modestring), "%s: %s",
str(LANG_USB_KEYPAD_MODE),
str(keypad_mode_name_get(usb_keypad_mode)));
screen->puts_scroll(0, 0, modestring);
}
#endif /* USB_ENABLE_HID */
}
screen->set_viewport(parent);
screen->set_viewport(last_vp);
screen->update_viewport();
}
#ifdef USB_ENABLE_HID
if (global_settings.usb_hid)
draw_usb_keypad_mode(&usb_screen_vps_ar[SCREEN_MAIN].title);
#endif
}
void gui_usb_screen_run(bool early_usb, intptr_t seqnum)
@ -258,6 +235,7 @@ void gui_usb_screen_run(bool early_usb, intptr_t seqnum)
#endif
struct usb_screen_vps_t usb_screen_vps_ar[NB_SCREENS];
struct viewport *title;
#if defined HAVE_TOUCHSCREEN
enum touchscreen_mode old_mode = touchscreen_get_mode();
@ -269,8 +247,8 @@ void gui_usb_screen_run(bool early_usb, intptr_t seqnum)
push_current_activity(ACTIVITY_USBSCREEN);
#ifdef USB_ENABLE_HID
usb_hid = global_settings.usb_hid;
usb_keypad_mode = global_settings.usb_keypad_mode;
title = &usb_screen_vps_ar[SCREEN_MAIN].title;
#endif
FOR_NB_SCREENS(i)
@ -296,33 +274,13 @@ void gui_usb_screen_run(bool early_usb, intptr_t seqnum)
/* The font system leaves the .fnt fd's open, so we need for force close them all */
font_disable_all();
}
usb_acknowledge(SYS_USB_CONNECTED_ACK, seqnum);
while (1)
{
usb_screens_draw(usb_screen_vps_ar);
#ifdef SIMULATOR
if (button_get_w_tmo(HZ/2))
break;
send_event(GUI_EVENT_ACTIONUPDATE, NULL);
#else
if (handle_usb_events())
break;
#endif /* SIMULATOR */
}
FOR_NB_SCREENS(i)
{
const struct viewport* vp = NULL;
handle_usb_events(title);
#if defined(USB_ENABLE_HID)
vp = usb_hid ? &usb_screen_vps_ar[i].title : NULL;
#endif
if (vp)
screens[i].scroll_stop_viewport(vp);
}
#ifdef USB_ENABLE_HID
if (global_settings.usb_hid)
screens[SCREEN_MAIN].scroll_stop_viewport(title);
if (global_settings.usb_keypad_mode != usb_keypad_mode)
{
global_settings.usb_keypad_mode = usb_keypad_mode;