Platform: Desktop
Settings flexibility, window management, and kb/mouse precision define desktop gaming.
NEVER Do (Expert Desktop Rules)
Window & Display
- NEVER hardcode resolution or fullscreen modes — Always provide a settings menu with resolution + mode toggle.
- NEVER ignore DPI scale factors — Use
DisplayServer.screen_get_scale() / usable rects.
- NEVER skip a borderless window option — Offer
WINDOW_MODE_FULLSCREEN (borderless) for multi-monitor focus.
Input & Persistence
- NEVER use
keycode for movement rebinds — Use physical_keycode for AZERTY/Dvorak.
- NEVER save settings or user data to
res:// — Always user://.
- NEVER skip
NOTIFICATION_WM_CLOSE_REQUEST — Flush ConfigFile before get_tree().quit().
Performance & Integration
- NEVER run utility tools at max framerate — Enable
OS.low_processor_usage_mode for static tools.
- NEVER call proprietary SDKs (Steam/Epic) directly — Wrap with
Engine.has_singleton() guards.
- NEVER block the main thread with massive I/O — Offload to
WorkerThreadPool.
Available Scripts
MANDATORY: Read the appropriate script before implementing the corresponding pattern. Do not paste inline settings/rebind/Steam tutorials — the scripts are the golden path.
desktop_window_manager.gd
Expert DPI-aware multi-monitor window positioning using DisplayServer.
desktop_settings_persistent.gd
Production settings persistence using ConfigFile for persistent INI data.
physical_input_rebinder.gd
Expert positional rebind system using physical_keycode for AZERTY/Dvorak.
platform_sdk_wrapper.gd
Safe PC SDK singleton wrapper (Steamworks/Epic) with crash guards.
native_dialog_helper.gd
Expert native OS file dialogs and system alerts logic.
secondary_window_spawner.gd
True multi-window management for secondary Viewports/Windows.
graceful_shutdown_handler.gd
Safe close-request interceptor for data flushing and exit guards.
low_processor_eco_mode.gd
Eco mode optimization for desktop tools and launchers.
desktop_performance_monitor.gd
OS-level hardware detection for dynamic graphics presets.
native_shell_executor.gd
Expert native shell command execution and output capture.
Desktop Golden Path (MANDATORY scripts)
- Resolution / stretch — use the mini-tree below, then MANDATORY desktop_window_manager.gd.
- Window / DPI — MANDATORY desktop_window_manager.gd: multi-monitor position, scale, mode restore.
- ConfigFile settings — MANDATORY desktop_settings_persistent.gd: graphics/audio/window under
user://.
- Physical rebinds — MANDATORY physical_input_rebinder.gd:
physical_keycode only.
- Close flush — MANDATORY graceful_shutdown_handler.gd:
NOTIFICATION_WM_CLOSE_REQUEST → save → quit.
- Store SDK — MANDATORY platform_sdk_wrapper.gd before any store call:
if Engine.has_singleton("Steam") → Steam API; elif Engine.has_singleton("EOS") → Epic; else no-op stub. Gate features with export feature tags (steam / epic).
Resolution / stretch mini-tree
| Player need |
Window mode |
Script hook |
| Fullscreen game, alt-tab friendly |
WINDOW_MODE_FULLSCREEN (borderless) |
desktop_window_manager.gd |
| Exclusive fullscreen (lowest latency) |
WINDOW_MODE_EXCLUSIVE_FULLSCREEN |
Same — persist choice in ConfigFile |
| Windowed / multi-monitor drag |
WINDOW_MODE_WINDOWED + usable rect / DPI scale |
Same + desktop_settings_persistent.gd |
CI smoke: headless --path . --quit-after 1 with settings round-trip write/read under user:// before merge (pairs with godot-export-builds).
Expert Callouts (keep short — not full tutorials)
1. Alt-Tab stuck-input guard
On NOTIFICATION_APPLICATION_FOCUS_OUT, pause and Input.action_release held movement actions so OS-swallowed key-ups do not strand velocity.
2. Desktop launcher note
Lightweight launcher projects may OS.create_process the main pack after writing user://settings.cfg; pair with low_processor_eco_mode.gd while idle in menus.
Deep dives (on demand)
- Settings menu, rebind, Steam, alt-tab guard, launcher → desktop-expert-patterns.md
Reference
Progressive disclosure: open Official Documentation links only when researching a specific API;
load Related Skills when routing work to a peer domain — do not preload the whole lattice.
Official Documentation
- DisplayServer — Window modes,
screen_get_scale / usable rects, and native file-dialog features behind multi-monitor and HiDPI desktop settings.
- Multiple resolutions — Stretch modes, aspect, and content scale so resolution dropdowns stay sharp across 1080p–4K displays.
- Handling quit requests —
NOTIFICATION_WM_CLOSE_REQUEST / set_auto_accept_quit(false) so Alt+F4 and window-close flush ConfigFile before exit.
- ConfigFile — INI-style persistence for graphics, audio, and window state under
user://.
- File paths in Godot projects — Why settings and saves must use
user:// (exported res:// is read-only).
- InputEventKey —
physical_keycode vs keycode so WASD rebinds survive AZERTY/Dvorak layouts.
- InputMap — Runtime
action_erase_events / action_add_event for desktop rebind UIs.
- Using InputEvent — Focus-loss stuck-key pitfalls (
NOTIFICATION_APPLICATION_FOCUS_OUT) when Alt-Tabbing on PC.
- Window — Secondary/tool windows and mode/size/position restore for true multi-window desktop apps.
- OS —
low_processor_usage_mode, create_process / execute, and alert for launchers and native shell hooks.
- Creating applications — Desktop-style app chrome, dialogs, and quit UX beyond game-only loops.
- Engine —
has_singleton / get_singleton guards so Steam/Epic GDExtensions never crash standalone builds.
Related Skills
Prerequisites
- godot-project-foundations — Display stretch, feature tags (
windows/linux/macos), and project defaults every desktop settings menu depends on.
- godot-input-handling — InputEvent buffering and action design before wiring
physical_keycode rebind UIs.
- godot-ui-containers — Settings screens, dropdowns, and remapper rows that stay layout-correct across resolutions.
Complements
Downstream / consumers
- godot-export-builds — Windows/Linux/macOS export presets, icons, and store packaging once desktop settings and SDK wrappers are stable.
- godot-platform-mobile — Sibling platform skill for dual-target projects that must not assume desktop quit/window APIs on phones.
- godot-platform-web — Browser constraints (no multi-window / limited shell) when shipping the same settings stack to HTML5.
Master
- godot-master — Library router and mirrored module entry for discovering this platform skill beside sibling domains.
1---2name: godot-platform-desktop3description: Expert blueprint for desktop platforms (Windows/Linux/macOS) covering keyboard/mouse controls, settings menus, window management (fullscreen, resolution), keybind remapping, and Steam integration. Use when targeting PC platforms or implementing desktop-specific features. Keywords desktop, Windows, Linux, macOS, settings, keybinds, ConfigFile, DisplayServer, Steam, fullscreen.4---5
6# Platform: Desktop
7
8Settings flexibility, window management, and kb/mouse precision define desktop gaming.
9
10## NEVER Do (Expert Desktop Rules)
11
12### Window & Display
13- **NEVER hardcode resolution or fullscreen modes** — Always provide a settings menu with resolution + mode toggle.
14- **NEVER ignore DPI scale factors** — Use `DisplayServer.screen_get_scale()` / usable rects.
15- **NEVER skip a borderless window option** — Offer `WINDOW_MODE_FULLSCREEN` (borderless) for multi-monitor focus.
16
17### Input & Persistence
18- **NEVER use `keycode` for movement rebinds** — Use `physical_keycode` for AZERTY/Dvorak.
19- **NEVER save settings or user data to `res://`** — Always `user://`.
20- **NEVER skip `NOTIFICATION_WM_CLOSE_REQUEST`** — Flush ConfigFile before `get_tree().quit()`.
21
22### Performance & Integration
23- **NEVER run utility tools at max framerate** — Enable `OS.low_processor_usage_mode` for static tools.
24- **NEVER call proprietary SDKs (Steam/Epic) directly** — Wrap with `Engine.has_singleton()` guards.
25- **NEVER block the main thread with massive I/O** — Offload to `WorkerThreadPool`.
26
27---
28
29## Available Scripts
30
31> **MANDATORY**: Read the appropriate script before implementing the corresponding pattern. Do not paste inline settings/rebind/Steam tutorials — the scripts are the golden path.
32
33### [desktop_window_manager.gd](scripts/desktop_window_manager.gd)
34Expert DPI-aware multi-monitor window positioning using `DisplayServer`.
35
36### [desktop_settings_persistent.gd](scripts/desktop_settings_persistent.gd)
37Production settings persistence using `ConfigFile` for persistent INI data.
38
39### [physical_input_rebinder.gd](scripts/physical_input_rebinder.gd)
40Expert positional rebind system using `physical_keycode` for AZERTY/Dvorak.
41
42### [platform_sdk_wrapper.gd](scripts/platform_sdk_wrapper.gd)
43Safe PC SDK singleton wrapper (Steamworks/Epic) with crash guards.
44
45### [native_dialog_helper.gd](scripts/native_dialog_helper.gd)
46Expert native OS file dialogs and system alerts logic.
47
48### [secondary_window_spawner.gd](scripts/secondary_window_spawner.gd)
49True multi-window management for secondary Viewports/Windows.
50
51### [graceful_shutdown_handler.gd](scripts/graceful_shutdown_handler.gd)
52Safe close-request interceptor for data flushing and exit guards.
53
54### [low_processor_eco_mode.gd](scripts/low_processor_eco_mode.gd)
55Eco mode optimization for desktop tools and launchers.
56
57### [desktop_performance_monitor.gd](scripts/desktop_performance_monitor.gd)
58OS-level hardware detection for dynamic graphics presets.
59
60### [native_shell_executor.gd](scripts/native_shell_executor.gd)
61Expert native shell command execution and output capture.
62
63---
64
65## Desktop Golden Path (MANDATORY scripts)
66
670. **Resolution / stretch** — use the mini-tree below, then **MANDATORY** [desktop_window_manager.gd](scripts/desktop_window_manager.gd).
681. **Window / DPI** — **MANDATORY** [desktop_window_manager.gd](scripts/desktop_window_manager.gd): multi-monitor position, scale, mode restore.
692. **ConfigFile settings** — **MANDATORY** [desktop_settings_persistent.gd](scripts/desktop_settings_persistent.gd): graphics/audio/window under `user://`.
703. **Physical rebinds** — **MANDATORY** [physical_input_rebinder.gd](scripts/physical_input_rebinder.gd): `physical_keycode` only.
714. **Close flush** — **MANDATORY** [graceful_shutdown_handler.gd](scripts/graceful_shutdown_handler.gd): `NOTIFICATION_WM_CLOSE_REQUEST` → save → quit.
725. **Store SDK** — **MANDATORY** [platform_sdk_wrapper.gd](scripts/platform_sdk_wrapper.gd) before any store call: `if Engine.has_singleton("Steam")` → Steam API; `elif Engine.has_singleton("EOS")` → Epic; else no-op stub. Gate features with export feature tags (`steam` / `epic`).
73
74### Resolution / stretch mini-tree
75
76| Player need | Window mode | Script hook |
77| :--- | :--- | :--- |
78| Fullscreen game, alt-tab friendly | `WINDOW_MODE_FULLSCREEN` (borderless) | [desktop_window_manager.gd](scripts/desktop_window_manager.gd) |
79| Exclusive fullscreen (lowest latency) | `WINDOW_MODE_EXCLUSIVE_FULLSCREEN` | Same — persist choice in ConfigFile |
80| Windowed / multi-monitor drag | `WINDOW_MODE_WINDOWED` + usable rect / DPI scale | Same + [desktop_settings_persistent.gd](scripts/desktop_settings_persistent.gd) |
81
82**CI smoke:** headless `--path . --quit-after 1` with settings round-trip write/read under `user://` before merge (pairs with [godot-export-builds](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-export-builds/SKILL.md)).
83
84## Expert Callouts (keep short — not full tutorials)
85
86### 1. Alt-Tab stuck-input guard
87On `NOTIFICATION_APPLICATION_FOCUS_OUT`, pause and `Input.action_release` held movement actions so OS-swallowed key-ups do not strand velocity.
88
89### 2. Desktop launcher note
90Lightweight launcher projects may `OS.create_process` the main pack after writing `user://settings.cfg`; pair with [low_processor_eco_mode.gd](scripts/low_processor_eco_mode.gd) while idle in menus.
91
92## Deep dives (on demand)
93
94- Settings menu, rebind, Steam, alt-tab guard, launcher → [desktop-expert-patterns.md](references/desktop-expert-patterns.md)
95
96## Reference
97
98> Progressive disclosure: open Official Documentation links only when researching a specific API;
99> load Related Skills when routing work to a peer domain — do not preload the whole lattice.
100
101### Official Documentation
102- [DisplayServer](https://docs.godotengine.org/en/stable/classes/class_displayserver.html) — Window modes, `screen_get_scale` / usable rects, and native file-dialog features behind multi-monitor and HiDPI desktop settings.
103- [Multiple resolutions](https://docs.godotengine.org/en/stable/tutorials/rendering/multiple_resolutions.html) — Stretch modes, aspect, and content scale so resolution dropdowns stay sharp across 1080p–4K displays.
104- [Handling quit requests](https://docs.godotengine.org/en/stable/tutorials/inputs/handling_quit_requests.html) — `NOTIFICATION_WM_CLOSE_REQUEST` / `set_auto_accept_quit(false)` so Alt+F4 and window-close flush ConfigFile before exit.
105- [ConfigFile](https://docs.godotengine.org/en/stable/classes/class_configfile.html) — INI-style persistence for graphics, audio, and window state under `user://`.
106- [File paths in Godot projects](https://docs.godotengine.org/en/stable/tutorials/io/data_paths.html) — Why settings and saves must use `user://` (exported `res://` is read-only).
107- [InputEventKey](https://docs.godotengine.org/en/stable/classes/class_inputeventkey.html) — `physical_keycode` vs `keycode` so WASD rebinds survive AZERTY/Dvorak layouts.
108- [InputMap](https://docs.godotengine.org/en/stable/classes/class_inputmap.html) — Runtime `action_erase_events` / `action_add_event` for desktop rebind UIs.
109- [Using InputEvent](https://docs.godotengine.org/en/stable/tutorials/inputs/inputevent.html) — Focus-loss stuck-key pitfalls (`NOTIFICATION_APPLICATION_FOCUS_OUT`) when Alt-Tabbing on PC.
110- [Window](https://docs.godotengine.org/en/stable/classes/class_window.html) — Secondary/tool windows and mode/size/position restore for true multi-window desktop apps.
111- [OS](https://docs.godotengine.org/en/stable/classes/class_os.html) — `low_processor_usage_mode`, `create_process` / `execute`, and `alert` for launchers and native shell hooks.
112- [Creating applications](https://docs.godotengine.org/en/stable/tutorials/ui/creating_applications.html) — Desktop-style app chrome, dialogs, and quit UX beyond game-only loops.
113- [Engine](https://docs.godotengine.org/en/stable/classes/class_engine.html) — `has_singleton` / `get_singleton` guards so Steam/Epic GDExtensions never crash standalone builds.
114
115### Related Skills
116
117#### Prerequisites
118- [godot-project-foundations](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-project-foundations/SKILL.md) — Display stretch, feature tags (`windows`/`linux`/`macos`), and project defaults every desktop settings menu depends on.
119- [godot-input-handling](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-input-handling/SKILL.md) — InputEvent buffering and action design before wiring `physical_keycode` rebind UIs.
120- [godot-ui-containers](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-ui-containers/SKILL.md) — Settings screens, dropdowns, and remapper rows that stay layout-correct across resolutions.
121
122#### Complements
123- [godot-save-load-systems](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-save-load-systems/SKILL.md) — Game-save ownership that pairs with ConfigFile settings and graceful close-request flushes.
124- [godot-autoload-architecture](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-autoload-architecture/SKILL.md) — Singleton homes for window managers, SDK wrappers, and shutdown handlers.
125- [godot-audio-systems](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-audio-systems/SKILL.md) — Bus volume persistence that desktop graphics/audio options menus usually expose together.
126- [godot-adapt-desktop-to-mobile](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-adapt-desktop-to-mobile/SKILL.md) — Touch/safe-area remaps when the same project keeps desktop kb/mouse paths after a mobile port.
127- [godot-adapt-mobile-to-desktop](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-adapt-mobile-to-desktop/SKILL.md) — Bringing touch-first titles up to window modes, keybinds, and multi-monitor expectations.
128- [godot-composition-apps](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-composition-apps/SKILL.md) — Tooling/launcher composition patterns that lean on eco mode, native dialogs, and secondary windows.
129- [godot-performance-optimization](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-performance-optimization/SKILL.md) — Profiling and quality presets after OS-level hardware detection suggests Ultra vs Balanced.
130
131#### Downstream / consumers
132- [godot-export-builds](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-export-builds/SKILL.md) — Windows/Linux/macOS export presets, icons, and store packaging once desktop settings and SDK wrappers are stable.
133- [godot-platform-mobile](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-platform-mobile/SKILL.md) — Sibling platform skill for dual-target projects that must not assume desktop quit/window APIs on phones.
134- [godot-platform-web](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-platform-web/SKILL.md) — Browser constraints (no multi-window / limited shell) when shipping the same settings stack to HTML5.
135
136#### Master
137- [godot-master](https://github.com/thedivergentai/gd-agentic-skills/blob/main/skills/godot-master/SKILL.md) — Library router and mirrored module entry for discovering this platform skill beside sibling domains.