Repository navigation
feat(libSceIme): show a notice when PSN-only system dialogs open - #13701
Merged
adriadam10 merged 28 commits intoOct 31, 2026
Merged
Conversation
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.
Check that an unset or empty variable and silent select no notice, show selects it, and that the spellings that are not exactly show or silent (case, spaces, numbers, yes/on) are refused with an error naming the variable and the value.
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 boykopovar#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.
Check that no notice is shown without a presenter and in silent mode, that the PSN and generic texts reach the modal dialog with one OK button, that a notice is owned by its own library and captures input, that a second offer is refused while one shows, that a notice is refused within two seconds of the last one and allowed at two seconds, and that a refused offer does not start the interval.
Open and OpenA send the notice after the parameter checks pass and the dialog moves to FINISHED, so a refused call shows nothing. The status and the result are unchanged. With ANYPS5_PSN_DIALOGS unset the notice is not shown, as before. The library links libSceIme for the shared notice.
Check that silent mode and an unset variable show nothing, that show mode shows the PSN notice once for Open and once for OpenA, that a refused null parameter and an Open that throws show nothing, and that no notice is shown when no presenter is registered. The guest test links libSceIme.
Add the row for the mode that shows a notice when a PlayStation Network dialog opens, with its unset and invalid behaviour. The row is in its own libSceIme section because the variable is read in that library.
…ist opens OpenA sends the notice after its null check passes and the dialog moves to FINISHED. Status and result are unchanged, and nothing is shown unless ANYPS5_PSN_DIALOGS is show.
…k dialog opens Open sends the notice after its null check passes and the dialog moves to FINISHED. Status and result are unchanged, and nothing is shown unless ANYPS5_PSN_DIALOGS is show.
Open and Open2 send the notice after their parameter checks pass and the dialog moves to FINISHED, so a refused call shows nothing. Status, result and the store icon calls are unchanged. The store is the PlayStation Store, which needs PlayStation Network; nothing is shown unless ANYPS5_PSN_DIALOGS is show.
…ialog opens Open sends the notice after its checks pass and the dialog moves to FINISHED. Status and result are unchanged, and nothing is shown unless ANYPS5_PSN_DIALOGS is show.
… dialog opens Open sends the notice after its parameter checks pass and the dialog moves to FINISHED. The recipients are PlayStation Network online or account ids (shadPS4 invitation_dialog.cpp, friend picker). Status and result are unchanged, and nothing is shown unless ANYPS5_PSN_DIALOGS is show.
…opens Open and OpenForPredeterminedContent send the generic notice after their checks pass and the dialog moves to FINISHED. The browser's open-parameter layout has no public source and nothing ties this dialog to PlayStation Network, so the notice says only that the system feature is not available. Status and result are unchanged, and nothing is shown unless ANYPS5_PSN_DIALOGS is show.
Check that silent mode and an unset variable show nothing, that show mode shows the PSN notice once when OpenA succeeds, that a null parameter shows nothing, and that no notice is shown without a presenter. The guest test links libSceIme.
Check that silent mode shows nothing, that show mode shows the PSN notice when Open succeeds, that a null parameter shows nothing, and that no notice is shown without a presenter. The guest test links libSceIme.
Check that silent mode shows nothing, that show mode shows the PSN notice when Open and Open2 succeed with a valid store parameter, that a null parameter shows nothing, and that no notice is shown without a presenter. The guest test links libSceIme.
Check that silent mode shows nothing, that show mode shows the PSN notice once when Open succeeds, that a null parameter shows nothing, and that the dialog still finishes with the same result. The guest test links libSceIme.
Check that silent mode shows nothing, that show mode shows the PSN notice when Open succeeds with a valid parameter, and that a null parameter shows nothing. The guest test links libSceIme.
Check that silent mode shows nothing, that show mode shows the generic notice for Open and OpenForPredeterminedContent, and that a null parameter shows nothing. The guest test links libSceIme.
Add a section on ANYPS5_PSN_DIALOGS: which dialogs finish silently without PlayStation Network, what show displays, how the notice takes input and how often it appears, and what the other values do.
The debt entry says that the notice shown with ANYPS5_PSN_DIALOGS=show is AnyPS5's, and that what the console displays for this call without PlayStation Network is not measured.
The debt entry says that the notice shown with ANYPS5_PSN_DIALOGS=show is AnyPS5's, and that what the console displays for this call without PlayStation Network is not measured.
The debt entry says that the notice shown with ANYPS5_PSN_DIALOGS=show is AnyPS5's, and that what the console displays for this call without PlayStation Network is not measured.
The debt entry says that the notice shown with ANYPS5_PSN_DIALOGS=show is AnyPS5's, and that what the console displays for this call without PlayStation Network is not measured.
The debt entry says that the notice shown with ANYPS5_PSN_DIALOGS=show is AnyPS5's, and that what the console displays for this call without PlayStation Network is not measured.
The debt entry says that the notice shown with ANYPS5_PSN_DIALOGS=show is AnyPS5's, and that what the console displays for this call without PlayStation Network is not measured.
The debt entry says that the notice shown with ANYPS5_PSN_DIALOGS=show is AnyPS5's, and that what the console displays for this call without PlayStation Network is not measured.
|
Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.
Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.
|
12 tasks done
Collaborator
|
Checked the notice hook in each of the eight |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds
ANYPS5_PSN_DIALOGS(showorsilent, defaultsilent). Some system dialogs need PlayStation Network. Today theirOpensucceeds and the dialog finishes at once with the cancelled result, so the title sees nothing happen. WithANYPS5_PSN_DIALOGS=show, a successfulOpendisplays a short host notice on the modal dialog that PR #12379 added to libSceIme (one OK button, takes the controller until answered). The status and result codes are unchanged in both modes.Libraries that call the shared notice after their
Openchecks pass (status and result unchanged):sceNpProfileDialogOpen,sceNpProfileDialogOpenAsceNpFriendListDialogOpenAsceNpCommerceDialogOpen,sceNpCommerceDialogOpen2sceNpSnsFacebookDialogOpensceInvitationDialogOpen(recipients are PSN online or account ids: shadPS4src/core/libraries/invitation_dialog/invitation_dialog.cppat 1d8004a22feb0d5cc58828bac066018e80b6d73f, lines 158-159 and 269-285)sceNpAuthAuthorizedAppDialogOpensceWebBrowserDialogOpen,sceWebBrowserDialogOpenForPredeterminedContent, with a generic text ("This system feature is not available in AnyPS5."). No source ties this dialog to PlayStation Network, so its notice does not claim it.Not included, with the reason:
src/libs/dialog.cppat 4919fdb6e6e28f46f1f5df8cf931a7a0823cb93f,LoginDialog), not PSN.Openalready throws (NotImplemented_nid_no_patch) or that have noOpen(libSceNpSnsYouTubeDialog, libSceNpEulaDialog, libScePlayerInvitationDialog, libSceSocialScreen): no silent close to replace.Default decision: notices are opt-in. A default notice would put a modal over every title that opens these dialogs, take the controller until OK, and change what the console-side behaviour is taken to be; nothing measured on a console supports either. With
silent, unset or empty, nothing changes: the notice code never calls the modal dialog.Notice behaviour (libSceIme
PsnDialogNotice.hpp/.cpp): refused when no presenter is registered, while another modal dialog or notice is showing, and within 2000 ms of the previous notice; a refused offer does not start the interval. Invalid values (anything other thanshow,silent, unset or empty, includingShowand1) stop the title at its first offer with an error naming the variable.Debt: each library's debt doc records that the console's own display is not measured and that the notice wording is AnyPS5's.
Overlap (checked against current
maine49d43d, 2026-10-31, withtools/pr_overlap.py --branch):libSceNpSnsFacebookDialog/Export.cpp,GuestNpSnsFacebookDialog.cpp), test(libSceNpCommerce): cover store icon layout and visibility stubs in GuestNpCommerceDialog #11743 (GuestNpCommerceDialog.cpp), test(libSceNpFriendListDialog): cover null result precedence in sceNpFriendListDialogGetResultA matching firmware 13.42 #12804 (libSceNpFriendListDialog.md), fix(libSceGnmDriver): report type-0 packets and optionally wait at each submission #9676 (ENVIRONMENT.mdrow).git merge-tree) conflicts in the same files for fix(libSceNpSnsFacebookDialog): keep a terminated dialog terminated during Open and Close #12893 (both files), test(libSceNpCommerce): cover store icon layout and visibility stubs in GuestNpCommerceDialog #11743 (the test file), test(libSceNpFriendListDialog): cover null result precedence in sceNpFriendListDialogGetResultA matching firmware 13.42 #12804 (the debt doc).libSceIme/CMakeLists.txt) and feat(libSceSystemService): open sceSystemServiceLaunchWebBrowser URLs in the host browser, opt-in with ANYPS5_OPEN_URLS #12895 (ENVIRONMENT.md,USAGE.md,libSceWebBrowserDialog.md) are open and conflict with main. Their merge simulation against this branch conflicts inlibSceIme/CMakeLists.txt(feat(ime): show host IME composition in the dialog and paste the clipboard #12596) and inlibSceWebBrowserDialog.mdandUSAGE.md(feat(libSceSystemService): open sceSystemServiceLaunchWebBrowser URLs in the host browser, opt-in with ANYPS5_OPEN_URLS #12895).ENVIRONMENT.md,USAGE.mdor other files thatpr_overlapcould not merge with main, so they were not compared: perf(agc): pipeline indirect draws behind the packet worker (APS5_PIPELINE_INDIRECT) #1896, feat(tools): add a graphical launcher #3786, perf(agc): stop pooling released device buffers over the memory budget #4472, feat(aot): consolidate native ARM64 compiler, runtime and consumers #5021, perf(agc): build the pipelines of a submission ahead on a compile pool #5925, fix(agc): copy only the dwords a shader changed back from a GPU-copied buffer #6185, fix(agc): keep CPU stores made after a deferred DCC key store was recorded #6186, perf(recompiler): keep runtime-specialized shader modules in the shader disk cache #6924, perf(agc): clear the mirror of a depth plane instead of dispatching the UAV clear over it #7449, perf(agc): remember structural host import misses #7457, perf(agc): answer Refresh's registry and host-import lookups from an index and a cache #7514, feat(agc): trace ranges that leave the write watch #7604, perf(shader): span single-wave wave64 compute by default after a uniformity check #7922, perf(shader): let spanned waves run at any host subgroup size where it can be narrower than 32 #8004, fix(agc): preserve CPU writes after resident linear target draws #8246, perf(agc): expand single-key DCC storage uploads on the GPU from the host import #8484, fix(agc): bound a journal replay's graphics and compute pipelines apart #8542, perf(agc): audit a cached template only after the host import set changed #9012, feat(pad): stream vibration ports to a Bluetooth DualSense as haptics reports #9154, feat(agc): batch a dispatch run's staged copy-ins ahead of it #9289, feat(libSceUserService): take the user name from ANYPS5_USER_NAME #9345, feat(agc): run mesh-path draws through a compute pass on devices without mesh shaders #9356, feat(agc): emulate mesh-fallback barycentrics through tessellation #9387, perf(agc): keep draw snapshots in resizable BAR memory #9712, perf(agc): draws that only update a buffer atomically continue one render pass #9852, fix(agc): hash an idle unit when its range leaves the write watch instead of at every upload #10026, feat(agc): serve lane-keyed, pointer and runtime image-table columns #10193, perf(agc): store an unimported label at once when unfinished work leaves guest memory alone #10442, perf(shader): reuse an evicted result's storage for the next patched result #10757, feat(relinker): route ps5-payload-dev pathconf stub to libkernel export #10792, fix(relinker): analyze referenced code beyond SCE scan boundaries #10861, perf(agc): reuse a cached resource build that samples a texture remade per use #10894, perf(agc): read depth planes into storage images in a compute pass #12120, perf(shader): run wave64 compute at one lane where no lane can tell #12324, feat(videoout): add ANYPS5_FPS_LIMIT to cap the rate the window presents #12536, perf(libkernel): pin guest threads to the efficiency cores on request #12544, feat(libSceSystemService): take the console date and time format from ANYPS5_DATE_FORMAT and ANYPS5_TIME_FORMAT, with auto from the host #12848, feat(libSceVideoOut): opt-in host pause with a key or on focus loss #12863, feat(libkernel): stop a second copy of a title with ANYPS5_INSTANCE_LOCK #12970 (feat(ime): show host IME composition in the dialog and paste the clipboard #12596 and feat(libSceSystemService): open sceSystemServiceLaunchWebBrowser URLs in the host browser, opt-in with ANYPS5_OPEN_URLS #12895 are among them; they are also listed above).Tested
Head
8f3cb16c8d(28 commits; the merge of upstream/main at 91db3f7 is kept). Debian 12, Linux 6.1.0-54-amd64, gcc 12.2.0, Release,BUILD_TESTING=ON. This host lacks some CPU extensions the PS5 target has, so the scratch archive relaxes the host CPU gate (asbuild-template.shdoes).Run and measured:
ctestafter the negative controls and a rebuild of the 17 targets; the same 17 passed before the controls).ime_dialog_pad_keyboardandguest_ime_dialog(existing libSceImeDialog tests, built for this run): 2/2 passed on the branch.a09a85c925(git worktree, same flags, same 17 targets built from clean main): the 17 pre-existing tests among these pass 17/17. Per test, every pre-existing test passes on both trees;psn_dialog_noticeandpsn_dialog_notice_modeexist only on the branch and pass.sceNpCommerceDialogOpensceNpCommerceDialogOpen2Openclaims PSN (kind changed to PsnFeature)sceWebBrowserDialogOpenForPredeterminedContentShowCaveat for NC1 to NC12: the test helpers abort without printing the assertion, so the failing assertion is inferred from which test fails, not read from a message.
Static and environment checks (run on this candidate):
git diff --check upstream/main...HEAD: clean.tools/check_conventions.py --base upstream/main: all checks passed.tools/pr_abi_audit.py(run manually from the candidate tree, whose snapshot lacks the tool): status passed.tools/pr_test_quality.py(run manually on the nine changed test files): 9 "possible-unregistered-cpp-test" findings. All are false positives: each file is registered in CMake through${LIBS_INCLUDE_DIR}/tests/<file>.tools/pr_precheck.py(no-build): the diff check and conventions steps pass; its ABI-audit and test-quality steps report missing files in the candidate snapshot, which is why they were run by hand above.python3 tools/env_reference.py --check: fails with the same single line on upstream/maina09a85c925and on this branch:error: APS5_PAD_SPEAKER_FALLBACK_DB has a row in docs/dev/ENVIRONMENT.md but the code no longer reads it/0 name(s) undocumented, 1 stale. Known baseline failure; this branch adds no new one.git merge-treeof this branch with currentmaine49d43d6(101 commits after the baseline) reports no conflicts. This is a tree-level check; the build and tests above are ona09a85c925.Not run: Windows, macOS, real console, hardware GPU, the full ctest suite, a build and test on
e49d43d6, and the 41 PRs listed under Overlap (not compared).Checklist
main; no other open PR implements the same functionsNotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file.mdfiles or images added to the repository (attach them to this PR)