use crate::FileDialogCapabilities;
use incular_config::TransientRole;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum CapabilitySupport {
#[default]
Unknown,
Supported,
Unsupported,
}
impl CapabilitySupport {
#[must_use]
pub const fn is_supported(self) -> bool {
matches!(self, Self::Supported)
}
#[must_use]
pub const fn from_supported(supported: bool) -> Self {
if supported {
Self::Supported
} else {
Self::Unsupported
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct WindowControlCapabilities {
pub set_title: CapabilitySupport,
pub set_visibility: CapabilitySupport,
pub set_logical_size: CapabilitySupport,
pub begin_move_drag: CapabilitySupport,
pub begin_resize_drag: CapabilitySupport,
pub minimize: CapabilitySupport,
pub maximize: CapabilitySupport,
pub fullscreen: CapabilitySupport,
pub set_resizable: CapabilitySupport,
pub set_decorations: CapabilitySupport,
pub set_size_limits: CapabilitySupport,
pub set_window_level: CapabilitySupport,
pub set_window_icon: CapabilitySupport,
pub request_user_attention: CapabilitySupport,
pub content_sensitivity: CapabilitySupport,
pub request_focus: CapabilitySupport,
pub request_redraw: CapabilitySupport,
pub close: CapabilitySupport,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct DisplayPlacementCapabilities {
pub enumerate_displays: CapabilitySupport,
pub query_current_display: CapabilitySupport,
pub display_bounds: CapabilitySupport,
pub work_area: CapabilitySupport,
pub query_window_position: CapabilitySupport,
pub set_window_position: CapabilitySupport,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct TransientSurfaceCapabilities {
pub native_surface: CapabilitySupport,
pub popover: CapabilitySupport,
pub menu: CapabilitySupport,
pub context_menu: CapabilitySupport,
pub combo_box: CapabilitySupport,
pub tooltip: CapabilitySupport,
}
impl TransientSurfaceCapabilities {
#[must_use]
pub const fn support(self, role: TransientRole) -> CapabilitySupport {
match role {
TransientRole::Popover => self.popover,
TransientRole::Menu => self.menu,
TransientRole::ContextMenu => self.context_menu,
TransientRole::ComboBox => self.combo_box,
TransientRole::Tooltip => self.tooltip,
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct NativeMenuCapabilities {
pub application_menu: CapabilitySupport,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct DataTransferCapabilities {
pub clipboard_text: CapabilitySupport,
pub clipboard_rich: CapabilitySupport,
pub clipboard_custom: CapabilitySupport,
pub external_drag_drop: CapabilitySupport,
pub external_drag_drop_files: CapabilitySupport,
pub external_drag_drop_rich: CapabilitySupport,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct ApplicationServiceCapabilities {
pub file_dialogs: FileDialogCapabilities,
pub global_shortcuts: CapabilitySupport,
pub single_instance_activation: CapabilitySupport,
pub tray_or_status_item: CapabilitySupport,
pub notifications: CapabilitySupport,
pub notification_actions: CapabilitySupport,
pub notification_update: CapabilitySupport,
pub notification_dismiss: CapabilitySupport,
pub taskbar_progress: CapabilitySupport,
pub application_badge: CapabilitySupport,
pub taskbar_overlay_icon: CapabilitySupport,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct AdvancedInputCapabilities {
pub pointer_metadata: CapabilitySupport,
pub cursor_icons: CapabilitySupport,
pub cursor_visibility: CapabilitySupport,
pub cursor_position: CapabilitySupport,
pub cursor_confine: CapabilitySupport,
pub cursor_lock: CapabilitySupport,
pub stylus: CapabilitySupport,
pub trackpad_gestures: CapabilitySupport,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct PlatformCapabilities {
pub window: WindowControlCapabilities,
pub display: DisplayPlacementCapabilities,
pub transients: TransientSurfaceCapabilities,
pub menus: NativeMenuCapabilities,
pub data_transfer: DataTransferCapabilities,
pub application_services: ApplicationServiceCapabilities,
pub advanced_input: AdvancedInputCapabilities,
}
impl PlatformCapabilities {
#[must_use]
pub const fn unsupported() -> Self {
let unsupported = CapabilitySupport::Unsupported;
Self {
window: WindowControlCapabilities {
set_title: unsupported,
set_visibility: unsupported,
set_logical_size: unsupported,
begin_move_drag: unsupported,
begin_resize_drag: unsupported,
minimize: unsupported,
maximize: unsupported,
fullscreen: unsupported,
set_resizable: unsupported,
set_decorations: unsupported,
set_size_limits: unsupported,
set_window_level: unsupported,
set_window_icon: unsupported,
request_user_attention: unsupported,
content_sensitivity: unsupported,
request_focus: unsupported,
request_redraw: unsupported,
close: unsupported,
},
display: DisplayPlacementCapabilities {
enumerate_displays: unsupported,
query_current_display: unsupported,
display_bounds: unsupported,
work_area: unsupported,
query_window_position: unsupported,
set_window_position: unsupported,
},
transients: TransientSurfaceCapabilities {
native_surface: unsupported,
popover: unsupported,
menu: unsupported,
context_menu: unsupported,
combo_box: unsupported,
tooltip: unsupported,
},
menus: NativeMenuCapabilities {
application_menu: unsupported,
},
data_transfer: DataTransferCapabilities {
clipboard_text: unsupported,
clipboard_rich: unsupported,
clipboard_custom: unsupported,
external_drag_drop: unsupported,
external_drag_drop_files: unsupported,
external_drag_drop_rich: unsupported,
},
application_services: ApplicationServiceCapabilities {
file_dialogs: FileDialogCapabilities::all(unsupported),
global_shortcuts: unsupported,
single_instance_activation: unsupported,
tray_or_status_item: unsupported,
notifications: unsupported,
notification_actions: unsupported,
notification_update: unsupported,
notification_dismiss: unsupported,
taskbar_progress: unsupported,
application_badge: unsupported,
taskbar_overlay_icon: unsupported,
},
advanced_input: AdvancedInputCapabilities {
pointer_metadata: unsupported,
cursor_icons: unsupported,
cursor_visibility: unsupported,
cursor_position: unsupported,
cursor_confine: unsupported,
cursor_lock: unsupported,
stylus: unsupported,
trackpad_gestures: unsupported,
},
}
}
}