fix(launcher): restore open_in_os win routing, fix cfg_json in IDB, fix display state

open_in_os = 'win': get_launch_profile() now maps pptx→pptxwin, ppt→pptwin,
odp→odpwin, pdf→pdfwin when open_in_os is 'win', routing to the Windows-variant
launch profiles (Parallels/CrossOver). Was never wired in native mode — feature
was silently lost in the MasterKey→Launcher port.

cfg_json missing from properties_to_save: the per-file display override was
always read as undefined from Dexie because cfg_json was never saved. Added
cfg_json to properties_to_save so display_override and any other cfg fields
persist correctly. NOTE: IDB_CONTENT_VERSIONS for event_file is not yet wired;
existing devices need a manual cache clear to pick up the new field.

Display override button: removed $ae_loc.is_native gate — must be configurable
from any device ahead of the event, not only on the podium Mac.

Display toggle persistence: quick_display_mode now reads from and writes to
$events_loc.launcher.display_mode so the last-set state survives page reloads
instead of always defaulting to 'extend'.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-05-22 14:12:12 -04:00
parent 33e9eeef78
commit 21fad1a698
3 changed files with 28 additions and 5 deletions

View File

@@ -539,6 +539,7 @@ export const properties_to_save = [
'filename',
'extension',
'open_in_os',
'cfg_json',
'lu_file_purpose_id',
'lu_event_file_purpose_name',
'file_purpose',

View File

@@ -136,8 +136,22 @@ function get_launch_profile(
null;
const local_profiles = ($events_loc as any).launcher?.launch_profiles ?? null;
const display_override = file_obj?.cfg_json?.display_override ?? null;
// open_in_os = 'win' routes to the Windows-variant profile for apps that have one.
// These profiles target Windows PowerPoint / LibreOffice / Acrobat running via Parallels or CrossOver.
const WIN_EXTENSION_MAP: Record<string, string> = {
pptx: 'pptxwin',
ppt: 'pptwin',
odp: 'odpwin',
pdf: 'pdfwin'
};
const effective_extension =
file_obj?.open_in_os === 'win'
? (WIN_EXTENSION_MAP[extension] ?? extension)
: extension;
return resolve_launch_profile(
extension,
effective_extension,
display_override,
device_profiles,
local_profiles
@@ -714,10 +728,11 @@ function prevent_default<T extends Event>(fn: (event: T) => void) {
{/if}
</button>
{#if $ae_loc.trusted_access && $ae_loc.is_native}
{#if $ae_loc.trusted_access}
<!-- Display override: per-file display_mode override for this file only.
null = use profile default, 'extend' = force extend, 'mirror' = force mirror.
Stored in event_file.cfg_json.display_override. Cycles null → extend → mirror → null. -->
Stored in event_file.cfg_json.display_override. Cycles null → extend → mirror → null.
Settable from any device — takes effect when the file is opened in native mode. -->
<button
type="button"
onclick={async () => {

View File

@@ -30,7 +30,10 @@ interface Props {
let { log_lvl = $bindable(0) }: Props = $props();
let quick_display_mode = $state<'extend' | 'mirror'>('extend');
// Persist display mode across reloads — reflects the last-set state, not hardware-queried state.
let quick_display_mode = $state<'extend' | 'mirror'>(
($events_loc.launcher as any)?.display_mode ?? 'extend'
);
const is_native_launcher_mode = $derived(
!!$ae_loc.is_native && $events_loc.launcher.app_mode === 'native'
@@ -40,9 +43,13 @@ async function toggle_display_mode() {
const next = quick_display_mode === 'extend' ? 'mirror' : 'extend';
if (is_native_launcher_mode) {
const res = await native.set_display_layout({ mode: next });
if (res?.success) quick_display_mode = next;
if (res?.success) {
quick_display_mode = next;
($events_loc.launcher as any).display_mode = next;
}
} else {
quick_display_mode = next;
($events_loc.launcher as any).display_mode = next;
}
}
</script>