Skip to main content

fret_runtime/capabilities/
leaf.rs

1use super::{
2    ExternalDragPayloadKind, ExternalDragPositionQuality, WindowHoverDetectionQuality,
3    WindowSetOuterPositionQuality, WindowZLevelQuality,
4};
5
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize)]
9pub struct ClipboardTextCapabilities {
10    pub read: bool,
11    pub write: bool,
12}
13
14impl<'de> Deserialize<'de> for ClipboardTextCapabilities {
15    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
16    where
17        D: serde::Deserializer<'de>,
18    {
19        #[derive(Deserialize)]
20        #[serde(untagged)]
21        enum Compat {
22            // Legacy shape: `"clipboard": { "text": true }`
23            Bool(bool),
24            // New shape: `"clipboard": { "text": { "read": true, "write": false } }`
25            Struct {
26                #[serde(default)]
27                read: bool,
28                #[serde(default)]
29                write: bool,
30            },
31        }
32
33        Ok(match Compat::deserialize(deserializer)? {
34            Compat::Bool(v) => Self { read: v, write: v },
35            Compat::Struct { read, write } => Self { read, write },
36        })
37    }
38}
39
40#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
41#[serde(default)]
42pub struct UiCapabilities {
43    pub multi_window: bool,
44    pub window_tear_off: bool,
45    pub cursor_icons: bool,
46
47    pub window_hover_detection: WindowHoverDetectionQuality,
48    pub window_set_outer_position: WindowSetOuterPositionQuality,
49    pub window_z_level: WindowZLevelQuality,
50
51    // Window style facets (ADR 0139 + follow-ups).
52    pub window_decorations: bool,
53    pub window_resizable: bool,
54    pub window_transparent: bool,
55    pub window_skip_taskbar: bool,
56    pub window_non_activating: bool,
57    pub window_hit_test_passthrough_all: bool,
58    pub window_hit_test_passthrough_regions: bool,
59    pub window_set_visible: bool,
60    pub window_begin_drag: bool,
61    pub window_begin_resize: bool,
62
63    // Background materials (ADR 0310).
64    pub window_background_material_system_default: bool,
65    pub window_background_material_mica: bool,
66    pub window_background_material_acrylic: bool,
67    pub window_background_material_vibrancy: bool,
68
69    // Non-portable escape hatch (ADR 0139).
70    pub native_window_handle: bool,
71}
72
73#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
74#[serde(default)]
75pub struct ClipboardCapabilities {
76    pub text: ClipboardTextCapabilities,
77    pub files: bool,
78    /// Linux/X11/Wayland primary selection text support.
79    ///
80    /// This is intentionally modeled as a capability separate from `clipboard.text`:
81    /// on Linux, primary selection is typically used as "copy-on-select" + middle-click paste,
82    /// and should not overwrite the explicit clipboard used by `Ctrl+C` / `edit.copy`.
83    pub primary_text: bool,
84}
85
86#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
87#[serde(default)]
88pub struct DndCapabilities {
89    pub external: bool,
90    pub external_payload: ExternalDragPayloadKind,
91    pub external_position: ExternalDragPositionQuality,
92}
93
94#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
95#[serde(default)]
96pub struct ImeCapabilities {
97    pub enabled: bool,
98    pub set_cursor_area: bool,
99}
100
101#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
102#[serde(default)]
103pub struct FsCapabilities {
104    pub real_paths: bool,
105    pub file_dialogs: bool,
106}
107
108#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
109#[serde(default)]
110pub struct ShellCapabilities {
111    pub open_url: bool,
112    pub share_sheet: bool,
113    pub incoming_open: bool,
114}
115
116#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
117#[serde(default)]
118pub struct GfxCapabilities {
119    pub webgpu: bool,
120    pub native_gpu: bool,
121}