Add PsnDialogNoticeOffer, the one place the PSN-only dialog libraries call
when their Open succeeds. With ANYPS5_PSN_DIALOGS unset or silent it does
nothing and never touches the modal dialog. With show it opens an OK
notice on the modal dialog of PR #12379, which is refused when no presenter
is registered, when another modal dialog is showing, and when a notice was
offered less than two seconds before. Refused offers leave the rate-limit
state alone, so a later offer can still show. The notice text says the
feature needs PlayStation Network, or, for the generic kind, that the system
feature is not available; it never names a title.
Add ParsePsnDialogNoticeMode, which reads the opt-in that decides whether a
PSN-only system dialog shows a host notice. Unset or empty and silent select
the current behaviour (no notice); show selects the notice. Any other value
throws an error that names the variable and the value, so the title stops at
first use instead of guessing.
A request carries an owner id (message dialog, error dialog, or none). Poll,
Close and Reset take the id of the caller and only see or act on a session of
that owner, so one library terminating or polling no longer finishes or
answers the dialog another library is showing. Callers that pass no owner keep
acting on whatever session exists.
A session that stays Showing without its view being read for three seconds
becomes Unshown: it no longer captures input or accepts answers, and a caller
that polls it falls back to its own automatic answer. A session whose view was
read once keeps waiting for the player. The bound is checked whenever the
session is touched, so it needs no timer, and ModalDialogSetShowTimeout changes
it.
A common dialog that needs an answer from the player opens a ModalDialogRequest
(message, one to three buttons, the focused one and the button a cancel input
selects). The session is Showing until a Confirm or Cancel input answers it or
the title closes it, and the answer stays readable until the next open or a
reset. Opening is refused while no presenter is registered, so a caller keeps
its own answer when no window can show the dialog.
Input comes through ModalDialogPublishInput (previous, next, confirm, cancel)
and ModalDialogPublishPad, which maps the D-pad and the left stick to focus
changes and Cross and Circle to confirm and cancel once both were seen released
since the dialog opened. An active IME keyboard or pad capture has priority: the
view is not read and the input is ignored until the IME releases it.
An open dialog can now take the pad the way it takes host text: a pad
sink it sets, ImePublishPad_nid_postfix forwarding each pad sample to
it, and ImeCapturesPad_nid_postfix telling the pad's owner that the
dialog has it. A keyboard view provider lets the presentation thread
read the text, caret and key grid it draws. Each is modelled on the
host-text sink: an atomic pointer the dialog sets and clears.
Port the firmware filter for every text type, with the two codepage sets derived from the firmware converters, and declare sceImeCheckFilterText as unimplemented.
sceImeDialogInit wrote "Slayer" into an empty text buffer and the
dialog finished on the second status poll, so a title never got text
from the user: ProsperoRadio's search typed "Slayer" by itself and
found no station.
The dialog now runs until the user answers on the host keyboard, the
way #4756 made sceImeOpen's panel-less IME take it. While no IME panel
is open, libSceIme hands the game window's text and editing keys to
a sink that the dialog registers. Typing edits the text up to
maxTextLength without splitting a surrogate pair, Enter writes it to
the title's buffer and finishes with end status 0, and Escape finishes
with 1. Abort still finishes with 2. A second Init reports busy, and a
null parameter or buffer or a maximum length outside 1 to 2048 is
refused, as in shadPS4.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>