use super::*;
pub(crate) type ViewFn = extern "C" fn(user: *mut c_void, ctx: *mut KuiCtx);
#[cfg(feature = "runner")]
pub(crate) type EventFn = extern "C" fn(user: *mut c_void, ev: *const KuiEvent);
#[cfg(feature = "runner")]
pub(crate) type TeardownFn = extern "C" fn(user: *mut c_void);
pub struct KuiCtx {
pub(crate) core: *mut Core,
pub(crate) _owned: Option<Box<Core>>,
pub(crate) events: Vec<UiEvent>,
pub(crate) last_payload: Option<Box<KuiValue>>,
pub(crate) last_edit_text: Option<String>,
pub(crate) fragment_source: String,
pub(crate) fragment_draws: Vec<KuiFragmentDraw>,
pub(crate) texture_draws: Vec<KuiTextureDraw>,
pub(crate) draws_current: bool,
pub(crate) image_pixels: Option<std::sync::Arc<Vec<u8>>>,
pub(crate) last_warnings: Vec<kui_core::Warning>,
pub(crate) pending_warnings: Vec<kui_core::Warning>,
pub(crate) last_access: kui_core::AccessTree,
pub(crate) last_runs: Vec<kui_core::AccessRun>,
pub(crate) last_announcements: Vec<kui_core::Announcement>,
pub(crate) window_commands: VecDeque<WindowCommand>,
pub(crate) menu_actions: VecDeque<kui_core::MenuAction>,
pub(crate) menu_text: String,
pub(crate) menu_html: String,
pub(crate) row_text: String,
pub(crate) menu_accel: String,
pub(crate) copy_text: String,
pub(crate) devtools_key: String,
pub(crate) file_request: Option<kui_core::FileDialog>,
pub(crate) file_filter_text: String,
pub(crate) devtools_tab: String,
pub(crate) selection_text: String,
pub(crate) selection_html: String,
pub(crate) font_families: Vec<String>,
pub(crate) system_fonts: Vec<kui_core::SystemFont>,
pub(crate) nodes: Option<Box<KuiValue>>,
pub(crate) last_window_name: Option<Rc<str>>,
pub(crate) slot_name: Option<String>,
pub(crate) slot_namespace: Option<String>,
pub(crate) slot_params: Option<KuiValue>,
pub(crate) extensions: kui_core::Extensions,
pub(crate) last_ext_error: String,
pub(crate) host_ui: *mut c_void,
}
impl KuiCtx {
pub(crate) fn core(&mut self) -> &mut Core {
unsafe { &mut *self.core }
}
#[cfg(any(feature = "runner", test))]
pub(crate) fn take_core(&mut self) -> Option<Box<Core>> {
let taken = self._owned.take()?;
let mut fresh = Box::new(Core::new());
fresh.set_diagnostics(false);
self.core = &mut *fresh;
self._owned = Some(fresh);
Some(taken)
}
pub(crate) fn borrowing(core: &mut Core) -> Self {
Self {
core,
_owned: None,
events: Vec::new(),
last_payload: None,
last_edit_text: None,
fragment_source: String::new(),
fragment_draws: Vec::new(),
texture_draws: Vec::new(),
draws_current: false,
image_pixels: None,
last_warnings: Vec::new(),
pending_warnings: Vec::new(),
last_access: Default::default(),
last_runs: Vec::new(),
last_announcements: Vec::new(),
window_commands: VecDeque::new(),
menu_actions: VecDeque::new(),
menu_text: String::new(),
row_text: String::new(),
menu_accel: String::new(),
copy_text: String::new(),
devtools_key: String::new(),
file_request: None,
file_filter_text: String::new(),
devtools_tab: String::new(),
menu_html: String::new(),
selection_text: String::new(),
selection_html: String::new(),
font_families: Vec::new(),
system_fonts: Vec::new(),
nodes: None,
last_window_name: None,
slot_name: None,
slot_namespace: None,
slot_params: None,
extensions: Default::default(),
last_ext_error: String::new(),
host_ui: std::ptr::null_mut(),
}
}
pub(crate) fn borrowing_in(ui: &mut kui_core::Ui<'_>) -> Self {
let mut this = Self::borrowing(ui.core());
this.host_ui = std::ptr::from_mut(ui).cast();
this
}
pub(crate) fn absorb(&mut self, events: impl IntoIterator<Item = UiEvent>) {
let out = &mut self.events;
self.extensions.route(events, |ev| out.push(ev));
}
pub(crate) fn push_tooltip(&mut self, key: kui_core::Key, hint: KuiStr) {
if let Some(h) = opt_str(hint) {
self.core().hint(key, h.into_owned());
}
}
}
#[repr(transparent)]
pub struct KuiValue(pub(crate) Value);
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiStr {
pub ptr: *const u8,
pub len: usize,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiSizing {
pub tag: u32,
pub value: f32,
}
pub const KUI_MIN_FIT: f32 = -1.0;
pub const KUI_MIN_NONE: f32 = -2.0;
pub const KUI_KF_AT: u32 = 1 << 0;
pub const KUI_KF_WIDTH: u32 = 1 << 1;
pub const KUI_KF_HEIGHT: u32 = 1 << 2;
pub const KUI_KF_BG: u32 = 1 << 3;
pub const KUI_KF_RADIUS: u32 = 1 << 4;
pub const KUI_KF_OPACITY: u32 = 1 << 5;
pub const KUI_KF_ROTATE: u32 = 1 << 6;
pub const KUI_KF_SCALE: u32 = 1 << 7;
pub const KUI_KF_OFFSET: u32 = 1 << 8;
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiKeyframe {
pub set: u32,
pub at: f32,
pub width: KuiSizing,
pub height: KuiSizing,
pub bg: u32,
pub radius: f32,
pub opacity: f32,
pub rotate: f32,
pub scale: f32,
pub dx: f32,
pub dy: f32,
}
pub const KUI_GRADIENT_LINEAR: u32 = 0;
pub const KUI_GRADIENT_RADIAL: u32 = 1;
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiGradientStop {
pub color: u32,
pub at: f32,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiGradient {
pub kind: u32,
pub angle: f32,
pub at_x: f32,
pub at_y: f32,
pub stops: *const KuiGradientStop,
pub stops_len: usize,
}
pub const KUI_FLOAT_NONE: u32 = 0;
pub const KUI_FLOAT_PARENT: u32 = 1;
pub const KUI_FLOAT_VIEWPORT: u32 = 2;
pub const KUI_ENTER_OFFSET: u32 = 1 << 0;
pub const KUI_ENTER_WIDTH: u32 = 1 << 1;
pub const KUI_ENTER_HEIGHT: u32 = 1 << 2;
pub const KUI_ENTER_BG: u32 = 1 << 3;
pub const KUI_ENTER_RADIUS: u32 = 1 << 4;
pub const KUI_ENTER_OPACITY: u32 = 1 << 5;
pub const KUI_ENTER_ROTATE: u32 = 1 << 6;
pub const KUI_ENTER_SCALE: u32 = 1 << 7;
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiEnter {
pub set: u32,
pub dx: f32,
pub dy: f32,
pub width: KuiSizing,
pub height: KuiSizing,
pub bg: u32,
pub radius: f32,
pub opacity: f32,
pub rotate: f32,
pub scale: f32,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiSpec {
pub width: KuiSizing,
pub height: KuiSizing,
pub min_w: f32,
pub max_w: f32,
pub min_h: f32,
pub max_h: f32,
pub dir: u32,
pub pad_l: f32,
pub pad_r: f32,
pub pad_t: f32,
pub pad_b: f32,
pub gap: f32,
pub main_align: u32,
pub cross_align: u32,
pub bg: u32,
pub border_color: u32,
pub border_w: f32,
pub radius: f32,
pub overflow: u32,
pub float_mode: u32,
pub float_anchor_x: u32,
pub float_anchor_y: u32,
pub float_self_x: u32,
pub float_self_y: u32,
pub float_dx: f32,
pub float_dy: f32,
pub float_fit: u32,
pub hoverable: u32,
pub window_role: u32,
pub transition_ms: f32,
pub easing: u32,
pub slide: u32,
pub hover_bg: u32,
pub pressed_bg: u32,
pub hover_group: KuiStr,
pub per_corner: u32,
pub radius_tl: f32,
pub radius_tr: f32,
pub radius_br: f32,
pub radius_bl: f32,
pub repeat: u32,
pub delay_ms: f32,
pub keyframes: *const KuiKeyframe,
pub keyframes_len: usize,
pub enter: KuiEnter,
pub click_sound: u64,
pub hover_sound: u64,
pub on_layout: *const KuiValue,
pub role: u32,
pub label: KuiStr,
pub checked: u32,
pub value_set: u32,
pub value_now: f32,
pub value_min: f32,
pub value_max: f32,
pub caret: u32,
pub selection_anchor: u32,
pub focusable: u32,
pub disabled: u32,
pub focus_bg: u32,
pub tooltip: KuiStr,
pub modal: *const KuiValue,
pub on_context_menu: *const KuiValue,
pub cursor: u32,
pub selected: u32,
pub expanded: u32,
pub opacity_set: u32,
pub opacity: f32,
pub shadow_color: u32,
pub shadow_blur: f32,
pub shadow_x: f32,
pub shadow_y: f32,
pub shadow_spread: f32,
pub wrap_children: u32,
pub cross_gap: f32,
pub initial_focus: u32,
pub exit: KuiEnter,
pub live: u32,
pub key_up: u32,
pub value_text: KuiStr,
pub description: KuiStr,
pub animate: u32,
pub accent: u32,
pub selectable: u32,
pub on_force_click: *const KuiValue,
pub focus_region: u32,
pub scrollbar: u32,
pub scrollbar_width: f32,
pub scrollbar_color: u32,
pub scrollbar_active_color: u32,
pub anchor: u32,
pub on_scroll: *const KuiValue,
pub on_drop: *const KuiValue,
pub drop_bg: u32,
pub float_clip: u32,
pub aspect_ratio: f32,
pub mixed: u32,
pub value_step: f32,
pub on_change: *const KuiValue,
pub pixel_snap: u32,
pub keep_focus: u32,
pub on_focus: *const KuiValue,
pub rules: u32,
pub rule_w: f32,
pub on_button: *const KuiValue,
pub buttons: u32,
pub overscroll: u32,
pub scroll_axes: u32,
pub modifier_keys: u32,
pub min_w_size: KuiSizing,
pub max_w_size: KuiSizing,
pub min_h_size: KuiSizing,
pub max_h_size: KuiSizing,
pub bounce: f32,
pub gradient: *const KuiGradient,
pub scroll_mods: u32,
pub backdrop_blur: f32,
pub rotate: f32,
pub scale: f32,
pub pivot_set: u32,
pub pivot_x: f32,
pub pivot_y: f32,
pub iterations: f32,
}
pub const KUI_PIVOT_X: u32 = 1 << 0;
pub const KUI_PIVOT_Y: u32 = 1 << 1;
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiAccessRun {
pub key: u64,
pub line: u32,
pub start: u32,
pub end: u32,
pub text: KuiStr,
pub x: f32,
pub y: f32,
pub w: f32,
pub h: f32,
pub char_count: u32,
pub char_lengths: *const u8,
pub char_positions: *const f32,
pub char_widths: *const f32,
pub word_start_count: u32,
pub word_starts: *const u8,
pub rtl: u32,
}
pub const KUI_VALUE_CARET: u32 = 1 << 3;
pub const KUI_VALUE_ANCHOR: u32 = 1 << 4;
pub const KUI_VALUE_CARET_SOLID: u32 = 1 << 5;
pub const KUI_ACCESS_HAS_TEXT_SELECTION: u32 = 1 << 9;
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiAccessNode {
pub key: u64,
pub parent: u64,
pub origin: u32,
pub role: u32,
pub flags: u32,
pub actions: u32,
pub name: KuiStr,
pub description: KuiStr,
pub value: KuiStr,
pub x: f32,
pub y: f32,
pub w: f32,
pub h: f32,
pub caret: u32,
pub selection_start: u32,
pub selection_end: u32,
pub value_now: f32,
pub value_min: f32,
pub value_max: f32,
pub scroll_x: f32,
pub scroll_y: f32,
pub scroll_max_x: f32,
pub scroll_max_y: f32,
pub anchor_run: u64,
pub anchor_char: u32,
pub focus_run: u64,
pub focus_char: u32,
pub run_count: u32,
pub pos_in_set: u32,
pub set_size: u32,
pub orientation: u32,
}
pub const KUI_ACCESS_HAS_VALUE: u32 = 1 << 0;
pub const KUI_ACCESS_HAS_SELECTION: u32 = 1 << 1;
pub const KUI_ACCESS_FOCUSED: u32 = 1 << 2;
pub const KUI_ACCESS_CHECKED_SET: u32 = 1 << 3;
pub const KUI_ACCESS_CHECKED: u32 = 1 << 4;
pub const KUI_ACCESS_HAS_NUMBER: u32 = 1 << 5;
pub const KUI_ACCESS_HAS_MIN: u32 = 1 << 6;
pub const KUI_ACCESS_HAS_MAX: u32 = 1 << 7;
pub const KUI_ACCESS_HAS_SCROLL: u32 = 1 << 8;
pub const KUI_ACCESS_DISABLED: u32 = 1 << 10;
pub const KUI_ACCESS_MODAL: u32 = 1 << 11;
pub const KUI_ACCESS_SELECTED_SET: u32 = 1 << 12;
pub const KUI_ACCESS_SELECTED: u32 = 1 << 13;
pub const KUI_ACCESS_EXPANDED_SET: u32 = 1 << 14;
pub const KUI_ACCESS_EXPANDED: u32 = 1 << 15;
pub const KUI_ACCESS_HAS_POS_IN_SET: u32 = 1 << 16;
pub const KUI_ACCESS_HAS_SET_SIZE: u32 = 1 << 17;
pub const KUI_ACCESS_MIXED: u32 = 1 << 20;
pub const KUI_ACCESS_LIVE_POLITE: u32 = 1 << 18;
pub const KUI_ACCESS_LIVE_ASSERTIVE: u32 = 1 << 19;
pub const KUI_ORIENTATION_HORIZONTAL: u32 = 1;
pub const KUI_ORIENTATION_VERTICAL: u32 = 2;
pub(crate) fn orientation_code(o: Option<kui_core::Orientation>) -> u32 {
o.and_then(|o| kui_core::Orientation::ALL.iter().position(|x| *x == o))
.map_or(0, |i| i as u32 + 1)
}
pub const KUI_EXPANDED_COLLAPSED: u32 = 1;
pub const KUI_EXPANDED_EXPANDED: u32 = 2;
pub const KUI_SCROLLBAR_VISIBLE: u32 = 1;
pub const KUI_SCROLLBAR_HIDDEN: u32 = 2;
pub const KUI_SCROLLBAR_AUTO: u32 = 3;
pub const KUI_OVERSCROLL_AUTO: u32 = 1;
pub const KUI_OVERSCROLL_CONTAIN: u32 = 2;
pub const KUI_SCROLL_AXES_BOTH: u32 = 1;
pub const KUI_SCROLL_AXES_X: u32 = 2;
pub const KUI_SCROLL_AXES_Y: u32 = 3;
pub const KUI_LIVE_OFF: u32 = 0;
pub const KUI_LIVE_POLITE: u32 = 1;
pub const KUI_LIVE_ASSERTIVE: u32 = 2;
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiAnnouncement {
pub text: KuiStr,
pub live: u32,
}
pub const KUI_VALUE_NOW: u32 = 1 << 0;
pub const KUI_VALUE_MIN: u32 = 1 << 1;
pub const KUI_VALUE_MAX: u32 = 1 << 2;
pub const KUI_VALUE_STEP: u32 = 1 << 6;
pub(crate) fn role_code(role: kui_core::Role) -> u32 {
kui_core::Role::ALL
.iter()
.position(|r| *r == role)
.map_or(0, |i| i as u32 + 1)
}
pub(crate) fn role_of_code(code: u32) -> Option<kui_core::Role> {
(code > 0)
.then(|| kui_core::Role::ALL.get(code as usize - 1).copied())
.flatten()
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiTextMetrics {
pub size: u32,
pub width: f32,
pub height: f32,
pub lines: u32,
}
impl Default for KuiTextMetrics {
fn default() -> Self {
Self {
size: std::mem::size_of::<Self>() as u32,
width: 0.0,
height: 0.0,
lines: 0,
}
}
}
unsafe impl OutParam for KuiTextMetrics {
const ABI_V1_SIZE: u32 = abi_through!(KuiTextMetrics, lines, u32);
fn size_mut(&mut self) -> &mut u32 {
&mut self.size
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiTheme {
pub size: u32,
pub appearance: u32,
pub disabled_opacity: f32,
pub bg: u32,
pub surface: u32,
pub raised: u32,
pub sunken: u32,
pub border: u32,
pub border_strong: u32,
pub fg: u32,
pub muted: u32,
pub faint: u32,
pub accent: u32,
pub accent_hover: u32,
pub accent_pressed: u32,
pub on_accent: u32,
pub accent_soft: u32,
pub selection: u32,
pub focus_ring: u32,
pub hover: u32,
pub pressed: u32,
pub success: u32,
pub warning: u32,
pub danger: u32,
pub scrollbar: u32,
pub scrollbar_active: u32,
}
impl Default for KuiTheme {
fn default() -> Self {
Self {
size: std::mem::size_of::<Self>() as u32,
appearance: 0,
disabled_opacity: 0.0,
bg: 0,
surface: 0,
raised: 0,
sunken: 0,
border: 0,
border_strong: 0,
fg: 0,
muted: 0,
faint: 0,
accent: 0,
accent_hover: 0,
accent_pressed: 0,
on_accent: 0,
accent_soft: 0,
selection: 0,
focus_ring: 0,
hover: 0,
pressed: 0,
success: 0,
warning: 0,
danger: 0,
scrollbar: 0,
scrollbar_active: 0,
}
}
}
unsafe impl OutParam for KuiTheme {
const ABI_V1_SIZE: u32 = abi_through!(KuiTheme, scrollbar_active, u32);
fn size_mut(&mut self) -> &mut u32 {
&mut self.size
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiMetrics {
pub size: u32,
pub control_text: f32,
pub chrome_text: f32,
pub hint_text: f32,
pub radius: f32,
pub radius_inner: f32,
pub control_pad_x: f32,
pub control_pad_y: f32,
pub field_pad_x: f32,
pub field_pad_y: f32,
pub hint_pad_x: f32,
pub hint_pad_y: f32,
pub menu_pad_x: f32,
pub menu_pad_y: f32,
pub menu_width: f32,
pub menu_bar_h: f32,
pub titlebar_h: f32,
}
impl Default for KuiMetrics {
fn default() -> Self {
Self::of(&kui_core::Metrics::default())
}
}
impl KuiMetrics {
pub(crate) fn of(m: &kui_core::Metrics) -> Self {
let mut out = Self {
size: std::mem::size_of::<Self>() as u32,
control_text: 0.0,
chrome_text: 0.0,
hint_text: 0.0,
radius: 0.0,
radius_inner: 0.0,
control_pad_x: 0.0,
control_pad_y: 0.0,
field_pad_x: 0.0,
field_pad_y: 0.0,
hint_pad_x: 0.0,
hint_pad_y: 0.0,
menu_pad_x: 0.0,
menu_pad_y: 0.0,
menu_width: 0.0,
menu_bar_h: 0.0,
titlebar_h: 0.0,
};
for role in kui_core::schema::METRIC_ROLES {
*out.field_mut(role.name) = (role.get)(m);
}
out
}
pub(crate) fn to_core(self) -> kui_core::Metrics {
let mut m = kui_core::Metrics::default();
for role in kui_core::schema::METRIC_ROLES {
(role.set)(&mut m, *self.field(role.name));
}
m
}
fn field(&self, name: &str) -> &f32 {
match name {
"control_text" => &self.control_text,
"chrome_text" => &self.chrome_text,
"hint_text" => &self.hint_text,
"radius" => &self.radius,
"radius_inner" => &self.radius_inner,
"control_pad_x" => &self.control_pad_x,
"control_pad_y" => &self.control_pad_y,
"field_pad_x" => &self.field_pad_x,
"field_pad_y" => &self.field_pad_y,
"hint_pad_x" => &self.hint_pad_x,
"hint_pad_y" => &self.hint_pad_y,
"menu_pad_x" => &self.menu_pad_x,
"menu_pad_y" => &self.menu_pad_y,
"menu_width" => &self.menu_width,
"menu_bar_h" => &self.menu_bar_h,
"titlebar_h" => &self.titlebar_h,
other => panic!("METRIC_ROLES names a metric KuiMetrics lacks: {other}"),
}
}
fn field_mut(&mut self, name: &str) -> &mut f32 {
match name {
"control_text" => &mut self.control_text,
"chrome_text" => &mut self.chrome_text,
"hint_text" => &mut self.hint_text,
"radius" => &mut self.radius,
"radius_inner" => &mut self.radius_inner,
"control_pad_x" => &mut self.control_pad_x,
"control_pad_y" => &mut self.control_pad_y,
"field_pad_x" => &mut self.field_pad_x,
"field_pad_y" => &mut self.field_pad_y,
"hint_pad_x" => &mut self.hint_pad_x,
"hint_pad_y" => &mut self.hint_pad_y,
"menu_pad_x" => &mut self.menu_pad_x,
"menu_pad_y" => &mut self.menu_pad_y,
"menu_width" => &mut self.menu_width,
"menu_bar_h" => &mut self.menu_bar_h,
"titlebar_h" => &mut self.titlebar_h,
other => panic!("METRIC_ROLES names a metric KuiMetrics lacks: {other}"),
}
}
}
unsafe impl OutParam for KuiMetrics {
const ABI_V1_SIZE: u32 = abi_through!(KuiMetrics, titlebar_h, f32);
fn size_mut(&mut self) -> &mut u32 {
&mut self.size
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiWarning {
pub code: KuiStr,
pub key: u64,
pub message: KuiStr,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiSystemFont {
pub family: KuiStr,
pub weights: *const u16,
pub weight_count: u32,
pub monospaced: u32,
pub italic: u32,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiPlay {
pub volume: f32,
pub looped: u32,
pub fade_in_ms: f32,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiAudio {
pub src: u64,
pub volume: f32,
pub looped: u32,
pub paused: u32,
pub finish: u32,
}
#[repr(C)]
#[derive(Clone, Copy, Default)]
pub struct KuiAudioCommand {
pub kind: u32,
pub playback: u64,
pub sound: u64,
pub volume: f32,
pub ms: f32,
pub looped: u32,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiTextStyle {
pub size: f32,
pub line_height: f32,
pub color: u32,
pub family: u32,
pub font: u64,
pub wrap: u32,
pub max_lines: u32,
pub ellipsis: u32,
pub features: KuiStr,
pub decoration: u32,
pub underline_color: u32,
pub underline_style: u32,
pub bold: u32,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiSpan {
pub text: KuiStr,
pub color: u32,
pub flags: u32,
pub bg: u32,
pub underline_color: u32,
pub underline_style: u32,
pub bg_radius: f32,
pub family: u32,
pub size: f32,
pub font: u64,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiColorToken {
pub name: KuiStr,
pub light: u32,
pub dark: u32,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiLengthToken {
pub name: KuiStr,
pub value: f32,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiColorOp {
pub op: u8,
pub t: f32,
pub other: KuiStr,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiDerivedToken {
pub name: KuiStr,
pub from: KuiStr,
pub ops: *const KuiColorOp,
pub op_count: usize,
}
pub const KUI_OP_LIFT: u8 = 0;
pub const KUI_OP_DARKEN: u8 = 1;
pub const KUI_OP_RAISE: u8 = 2;
pub const KUI_OP_ALPHA: u8 = 3;
pub const KUI_OP_MIX: u8 = 4;
pub const KUI_OP_READABLE: u8 = 5;
#[repr(C)]
pub struct KuiReplySink {
pub(crate) push: Option<unsafe extern "C" fn(*mut KuiReplySink, *const KuiValue) -> bool>,
}
#[repr(C)]
pub struct KuiEvent {
pub size: u32,
pub origin: u16,
pub key: u64,
pub payload: *const KuiValue,
pub window: u32,
pub reply_sink: *mut KuiReplySink,
pub slot: u64,
}
impl Default for KuiEvent {
fn default() -> Self {
Self {
size: std::mem::size_of::<Self>() as u32,
origin: 0,
key: 0,
payload: std::ptr::null(),
window: 0,
reply_sink: std::ptr::null_mut(),
slot: 0,
}
}
}
unsafe impl OutParam for KuiEvent {
const ABI_V1_SIZE: u32 = abi_through!(KuiEvent, payload, *const KuiValue);
fn size_mut(&mut self) -> &mut u32 {
&mut self.size
}
}
#[repr(C)]
#[derive(Clone, Copy, Default)]
pub struct KuiWindowConfig {
pub kind: u32,
pub width: f32,
pub height: f32,
pub activates: u32,
pub anchor_x: f32,
pub anchor_y: f32,
pub anchor_w: f32,
pub anchor_h: f32,
}
pub const KUI_WINDOW_KIND_NORMAL: u32 = 0;
pub const KUI_WINDOW_KIND_POPUP: u32 = 1;
pub(crate) fn window_config_of(c: Option<&KuiWindowConfig>) -> WindowConfig {
let Some(c) = c else {
return WindowConfig::default();
};
let size = if c.width > 0.0 && c.height > 0.0 {
Size::new(c.width, c.height)
} else {
WindowConfig::DEFAULT_SIZE
};
WindowConfig {
kind: match c.kind {
KUI_WINDOW_KIND_POPUP => WindowKind::Popup,
_ => WindowKind::Normal,
},
size,
activates: c.activates != 0,
anchor: Rect::new(c.anchor_x, c.anchor_y, c.anchor_w, c.anchor_h),
}
}
#[repr(C)]
#[derive(Clone, Copy, Default, Debug, PartialEq)]
pub struct KuiRunConfig {
pub width: f32,
pub height: f32,
pub min_w: f32,
pub min_h: f32,
pub max_w: f32,
pub max_h: f32,
pub chrome: u32,
pub text_aa: u32,
pub diagnostics: u32,
pub frame_latency: u32,
pub backdrop: u32,
pub titlebar: u32,
}
pub const KUI_CHROME_NATIVE: u32 = 0;
pub const KUI_CHROME_CUSTOM: u32 = 1;
pub const KUI_CHROME_BORDERLESS: u32 = 2;
pub const KUI_TITLEBAR_STANDARD: u32 = 0;
pub const KUI_TITLEBAR_MEDIUM: u32 = 1;
pub const KUI_TITLEBAR_TALL: u32 = 2;
pub const KUI_TEXT_AA_AUTO: u32 = 0;
pub const KUI_TEXT_AA_GRAYSCALE: u32 = 1;
pub const KUI_TEXT_AA_SUBPIXEL: u32 = 2;
pub const KUI_DIAG_DEFAULT: u32 = 0;
pub const KUI_DIAG_ON: u32 = 1;
pub const KUI_DIAG_OFF: u32 = 2;
#[cfg(any(feature = "runner", test))]
#[derive(Debug, PartialEq, Default)]
pub(crate) struct RunOptions {
pub size: Option<(f64, f64)>,
pub min_size: Option<(f64, f64)>,
pub max_size: Option<(f64, f64)>,
pub chrome: u32,
pub text_aa: u32,
pub diagnostics: Option<bool>,
pub frame_latency: Option<u32>,
pub backdrop: kui_core::Backdrop,
pub titlebar: u32,
}
#[cfg(any(feature = "runner", test))]
pub(crate) const UNBOUNDED_SIZE: f64 = 65_535.0;
#[cfg(any(feature = "runner", test))]
pub(crate) fn run_options_of(c: Option<&KuiRunConfig>) -> Result<RunOptions, String> {
let Some(c) = c else {
return Ok(RunOptions::default());
};
let side = |v: f32, what: &str| -> Result<f64, String> {
if v.is_finite() && v >= 0.0 {
Ok(f64::from(v))
} else {
Err(format!(
"KuiRunConfig.{what} must be a finite, non-negative size, not {v}"
))
}
};
let (w, h) = (side(c.width, "width")?, side(c.height, "height")?);
let size =
match (w > 0.0, h > 0.0) {
(true, true) => Some((w, h)),
(false, false) => None,
_ => return Err(
"KuiRunConfig: width and height go together (a min or max side may stand alone)"
.into(),
),
};
let (min_w, min_h) = (side(c.min_w, "min_w")?, side(c.min_h, "min_h")?);
let min_size = (min_w > 0.0 || min_h > 0.0).then_some((min_w, min_h));
let (max_w, max_h) = (side(c.max_w, "max_w")?, side(c.max_h, "max_h")?);
let unbounded = |v: f64| if v > 0.0 { v } else { UNBOUNDED_SIZE };
let max_size = (max_w > 0.0 || max_h > 0.0).then_some((unbounded(max_w), unbounded(max_h)));
if c.chrome > KUI_CHROME_BORDERLESS {
return Err(format!(
"KuiRunConfig.chrome must be KUI_CHROME_NATIVE, KUI_CHROME_CUSTOM or KUI_CHROME_BORDERLESS, not {}",
c.chrome
));
}
if c.text_aa > KUI_TEXT_AA_SUBPIXEL {
return Err(format!(
"KuiRunConfig.text_aa must be KUI_TEXT_AA_AUTO, KUI_TEXT_AA_GRAYSCALE or KUI_TEXT_AA_SUBPIXEL, not {}",
c.text_aa
));
}
let diagnostics = match c.diagnostics {
KUI_DIAG_DEFAULT => None,
KUI_DIAG_ON => Some(true),
KUI_DIAG_OFF => Some(false),
other => {
return Err(format!(
"KuiRunConfig.diagnostics must be KUI_DIAG_DEFAULT, KUI_DIAG_ON or KUI_DIAG_OFF, not {other}"
));
}
};
let Some(backdrop) = kui_core::Backdrop::from_code(c.backdrop) else {
return Err(format!(
"KuiRunConfig.backdrop must be KUI_BACKDROP_OPAQUE, KUI_BACKDROP_TRANSPARENT, KUI_BACKDROP_BLUR or KUI_BACKDROP_TINTED, not {}",
c.backdrop
));
};
if c.titlebar > KUI_TITLEBAR_TALL {
return Err(format!(
"KuiRunConfig.titlebar must be KUI_TITLEBAR_STANDARD, KUI_TITLEBAR_MEDIUM or KUI_TITLEBAR_TALL, not {}",
c.titlebar
));
}
Ok(RunOptions {
size,
min_size,
max_size,
chrome: c.chrome,
text_aa: c.text_aa,
diagnostics,
frame_latency: (c.frame_latency > 0).then_some(c.frame_latency),
backdrop,
titlebar: c.titlebar,
})
}
fn window_config_to_c(c: WindowConfig) -> KuiWindowConfig {
KuiWindowConfig {
kind: match c.kind {
WindowKind::Normal => KUI_WINDOW_KIND_NORMAL,
WindowKind::Popup => KUI_WINDOW_KIND_POPUP,
},
width: c.size.w,
height: c.size.h,
activates: c.activates as u32,
anchor_x: c.anchor.x,
anchor_y: c.anchor.y,
anchor_w: c.anchor.w,
anchor_h: c.anchor.h,
}
}
pub const KUI_DISMISS_OUTSIDE: u32 = 0;
pub const KUI_DISMISS_ESCAPE: u32 = 1;
pub const KUI_OPTION_AS_ALT_NONE: u32 = 0;
pub const KUI_OPTION_AS_ALT_LEFT: u32 = 1;
pub const KUI_OPTION_AS_ALT_RIGHT: u32 = 2;
pub const KUI_OPTION_AS_ALT_BOTH: u32 = 3;
pub const KUI_CMD_START_DRAG: u32 = 1;
pub const KUI_CMD_CLOSE: u32 = 2;
pub const KUI_CMD_MINIMIZE: u32 = 3;
pub const KUI_CMD_TOGGLE_MAXIMIZE: u32 = 4;
pub const KUI_CMD_OPEN: u32 = 5;
pub const KUI_CMD_SET_SIZE: u32 = 6;
pub const KUI_CMD_FOCUS: u32 = 7;
pub const KUI_CMD_REDRAW: u32 = 8;
#[repr(C)]
pub struct KuiWindowCommand {
pub size: u32,
pub kind: u32,
pub window: u32,
pub origin: u16,
pub config: KuiWindowConfig,
pub width: f32,
pub height: f32,
pub owner: u32,
}
impl Default for KuiWindowCommand {
fn default() -> Self {
Self {
size: std::mem::size_of::<Self>() as u32,
kind: 0,
window: 0,
origin: 0,
config: KuiWindowConfig::default(),
width: 0.0,
height: 0.0,
owner: 0,
}
}
}
unsafe impl OutParam for KuiWindowCommand {
const ABI_V1_SIZE: u32 = abi_through!(KuiWindowCommand, config, KuiWindowConfig);
fn size_mut(&mut self) -> &mut u32 {
&mut self.size
}
}
pub(crate) fn window_command_to_c(cmd: WindowCommand) -> KuiWindowCommand {
let mut size = Size::new(0.0, 0.0);
let mut owner = 0;
let (kind, origin, config) = match cmd {
WindowCommand::StartDrag(_) => (KUI_CMD_START_DRAG, 0, KuiWindowConfig::default()),
WindowCommand::Close(_) => (KUI_CMD_CLOSE, 0, KuiWindowConfig::default()),
WindowCommand::Minimize(_) => (KUI_CMD_MINIMIZE, 0, KuiWindowConfig::default()),
WindowCommand::ToggleMaximize(_) => {
(KUI_CMD_TOGGLE_MAXIMIZE, 0, KuiWindowConfig::default())
}
WindowCommand::Open {
owner: o,
origin,
config,
..
} => {
owner = o.0;
(KUI_CMD_OPEN, origin.0, window_config_to_c(config))
}
WindowCommand::SetSize { size: s, .. } => {
size = s;
(KUI_CMD_SET_SIZE, 0, KuiWindowConfig::default())
}
WindowCommand::Focus(_) => (KUI_CMD_FOCUS, 0, KuiWindowConfig::default()),
WindowCommand::Redraw(_) => (KUI_CMD_REDRAW, 0, KuiWindowConfig::default()),
};
KuiWindowCommand {
kind,
window: cmd.window().0,
origin,
config,
width: size.w,
height: size.h,
owner,
..Default::default()
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiQuad {
pub x: f32,
pub y: f32,
pub w: f32,
pub h: f32,
pub color: [f32; 4],
pub border_color: [f32; 4],
pub radius: [f32; 4],
pub border_w: f32,
pub blur: f32,
pub kind: u32,
pub clip: u32,
pub uv: [u32; 4],
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiClip {
pub rect: [f32; 4],
pub radius: [f32; 4],
pub transform: [f32; 4],
pub inner: [f32; 4],
pub inner_radius: [f32; 4],
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiFragmentDraw {
pub fragment: u64,
pub params: [f32; 16],
pub image_source: u32,
pub image_texture: u32,
pub image_uv: [u32; 4],
}
pub const KUI_FRAGMENT_IMAGE_NONE: u32 = 0;
pub const KUI_FRAGMENT_IMAGE_ATLAS: u32 = 1;
pub const KUI_FRAGMENT_IMAGE_TEXTURE: u32 = 2;
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiTextureDraw {
pub image: u64,
pub rev: u32,
pub width: u32,
pub height: u32,
pub uv: [u32; 4],
}
#[repr(C)]
pub struct KuiDrawData {
pub size: u32,
pub quads: *const KuiQuad,
pub quad_count: usize,
pub viewport_w: f32,
pub viewport_h: f32,
pub scale: f32,
pub atlas_pixels: *const u8,
pub atlas_size: u32,
pub atlas_dirty: bool,
pub atlas_epoch: u64,
pub fragments: *const KuiFragmentDraw,
pub fragment_count: usize,
pub time: f32,
pub clips: *const KuiClip,
pub clip_count: usize,
pub textures: *const KuiTextureDraw,
pub texture_count: usize,
}
impl Default for KuiDrawData {
fn default() -> Self {
Self {
size: std::mem::size_of::<Self>() as u32,
quads: std::ptr::null(),
quad_count: 0,
viewport_w: 0.0,
viewport_h: 0.0,
scale: 1.0,
atlas_pixels: std::ptr::null(),
atlas_size: 0,
atlas_dirty: false,
atlas_epoch: 0,
fragments: std::ptr::null(),
fragment_count: 0,
time: 0.0,
clips: std::ptr::null(),
clip_count: 0,
textures: std::ptr::null(),
texture_count: 0,
}
}
}
unsafe impl OutParam for KuiDrawData {
const ABI_V1_SIZE: u32 = abi_through!(KuiDrawData, atlas_epoch, u64);
fn size_mut(&mut self) -> &mut u32 {
&mut self.size
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiScrollGeometry {
pub size: u32,
pub x: f32,
pub y: f32,
pub w: f32,
pub h: f32,
pub content_w: f32,
pub content_h: f32,
pub offset_x: f32,
pub offset_y: f32,
pub max_offset_x: f32,
pub max_offset_y: f32,
}
impl Default for KuiScrollGeometry {
fn default() -> Self {
Self {
size: std::mem::size_of::<Self>() as u32,
x: 0.0,
y: 0.0,
w: 0.0,
h: 0.0,
content_w: 0.0,
content_h: 0.0,
offset_x: 0.0,
offset_y: 0.0,
max_offset_x: 0.0,
max_offset_y: 0.0,
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Default)]
pub struct KuiCell {
pub ch: u32,
pub fg: u32,
pub bg: u32,
pub flags: u32,
pub ul: u32,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiMenuAction {
pub size: u32,
pub kind: u32,
pub text: KuiStr,
pub html: KuiStr,
pub x: f32,
pub y: f32,
}
impl Default for KuiMenuAction {
fn default() -> Self {
Self {
size: std::mem::size_of::<Self>() as u32,
kind: 0,
text: KuiStr {
ptr: std::ptr::null(),
len: 0,
},
html: KuiStr {
ptr: std::ptr::null(),
len: 0,
},
x: 0.0,
y: 0.0,
}
}
}
unsafe impl OutParam for KuiMenuAction {
const ABI_V1_SIZE: u32 = abi_through!(KuiMenuAction, y, f32);
fn size_mut(&mut self) -> &mut u32 {
&mut self.size
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiTextHit {
pub size: u32,
pub line: u32,
pub byte: u64,
}
impl Default for KuiTextHit {
fn default() -> Self {
Self {
size: std::mem::size_of::<Self>() as u32,
line: 0,
byte: 0,
}
}
}
unsafe impl OutParam for KuiTextHit {
const ABI_V1_SIZE: u32 = abi_through!(KuiTextHit, byte, u64);
fn size_mut(&mut self) -> &mut u32 {
&mut self.size
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiLayoutRect {
pub size: u32,
pub x: f32,
pub y: f32,
pub w: f32,
pub h: f32,
}
impl Default for KuiLayoutRect {
fn default() -> Self {
Self {
size: std::mem::size_of::<Self>() as u32,
x: 0.0,
y: 0.0,
w: 0.0,
h: 0.0,
}
}
}
unsafe impl OutParam for KuiLayoutRect {
const ABI_V1_SIZE: u32 = abi_through!(KuiLayoutRect, h, f32);
fn size_mut(&mut self) -> &mut u32 {
&mut self.size
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct KuiCaretRect {
pub size: u32,
pub x: f32,
pub y: f32,
pub w: f32,
pub h: f32,
}
impl Default for KuiCaretRect {
fn default() -> Self {
Self {
size: std::mem::size_of::<Self>() as u32,
x: 0.0,
y: 0.0,
w: 0.0,
h: 0.0,
}
}
}
unsafe impl OutParam for KuiCaretRect {
const ABI_V1_SIZE: u32 = abi_through!(KuiCaretRect, h, f32);
fn size_mut(&mut self) -> &mut u32 {
&mut self.size
}
}
unsafe impl OutParam for KuiScrollGeometry {
const ABI_V1_SIZE: u32 = abi_through!(KuiScrollGeometry, max_offset_y, f32);
fn size_mut(&mut self) -> &mut u32 {
&mut self.size
}
}
pub const KUI_SPAN_BOLD: u32 = 1 << 0;
pub const KUI_SPAN_ITALIC: u32 = 1 << 1;
pub const KUI_SPAN_UNDERLINE: u32 = 1 << 2;
pub const KUI_SPAN_STRIKETHROUGH: u32 = 1 << 3;
pub const KUI_SPAN_FAMILY: u32 = 1 << 4;
pub const KUI_UNDERLINE_SOLID: u32 = 0;
pub const KUI_UNDERLINE_WAVY: u32 = 1;
pub const KUI_UNDERLINE_DOTTED: u32 = 2;
pub const KUI_KMOD_SHIFT: u32 = kui_core::KeyMods::SHIFT;
pub const KUI_KMOD_CTRL: u32 = kui_core::KeyMods::CTRL;
pub const KUI_KMOD_ALT: u32 = kui_core::KeyMods::ALT;
pub const KUI_KMOD_SUPER: u32 = kui_core::KeyMods::SUPER;
pub const KUI_KLOCK_CAPS: u32 = kui_core::KeyLocks::CAPS;
pub const KUI_KLOCK_NUM: u32 = kui_core::KeyLocks::NUM;
pub const KUI_KLOC_LEFT: u32 = 1 << kui_core::KeyLocation::SHIFT;
pub const KUI_KLOC_RIGHT: u32 = 2 << kui_core::KeyLocation::SHIFT;
pub const KUI_KLOC_NUMPAD: u32 = 3 << kui_core::KeyLocation::SHIFT;
pub const KUI_KLAYOUT_NONLATIN: u32 = kui_core::LayoutScript::NON_LATIN;
pub const KUI_EDIT_MULTILINE: u32 = 1 << 0;
pub const KUI_EDIT_AUTOFOCUS: u32 = 1 << 1;
pub const KUI_EDIT_WRAP: u32 = 1 << 2;
pub const KUI_EDIT_KEEP_TAB: u32 = 1 << 3;
pub const KUI_MOD_SHIFT: u32 = 1 << 0;
pub const KUI_MOD_WORD: u32 = 1 << 1;
pub const KUI_MOD_DOC: u32 = 1 << 2;
pub const KUI_EDIT_KEYS: [(&str, EditKey); 16] = [
("KUI_KEY_LEFT", EditKey::Left),
("KUI_KEY_RIGHT", EditKey::Right),
("KUI_KEY_UP", EditKey::Up),
("KUI_KEY_DOWN", EditKey::Down),
("KUI_KEY_HOME", EditKey::Home),
("KUI_KEY_END", EditKey::End),
("KUI_KEY_PAGE_UP", EditKey::PageUp),
("KUI_KEY_PAGE_DOWN", EditKey::PageDown),
("KUI_KEY_BACKSPACE", EditKey::Backspace),
("KUI_KEY_DELETE", EditKey::Delete),
("KUI_KEY_ENTER", EditKey::Enter),
("KUI_KEY_TAB", EditKey::Tab),
("KUI_KEY_SELECT_ALL", EditKey::SelectAll),
("KUI_KEY_ESCAPE", EditKey::Escape),
("KUI_KEY_UNDO", EditKey::Undo),
("KUI_KEY_REDO", EditKey::Redo),
];
pub const KUI_MOUSE_PRIMARY: u32 = 0;
pub const KUI_MOUSE_SECONDARY: u32 = 1;
pub const KUI_MOUSE_MIDDLE: u32 = 2;
pub const KUI_MOUSE_OTHER: u32 = 3;
pub const KUI_MENU_CUSTOM: u32 = 0;
pub const KUI_MENU_SEPARATOR: u32 = 1;
pub const KUI_MENU_CUT: u32 = 2;
pub const KUI_MENU_COPY: u32 = 3;
pub const KUI_MENU_PASTE: u32 = 4;
pub const KUI_MENU_SELECT_ALL: u32 = 5;
pub const KUI_MENU_LOOK_UP: u32 = 6;
pub const KUI_MENU_ABOUT: u32 = 7;
pub const KUI_MENU_HIDE: u32 = 8;
pub const KUI_MENU_HIDE_OTHERS: u32 = 9;
pub const KUI_MENU_SHOW_ALL: u32 = 10;
pub const KUI_MENU_QUIT: u32 = 11;
pub const KUI_MENU_ITEM_ENABLED: u32 = 1 << 0;
pub const KUI_MENU_ITEM_CHECKED: u32 = 1 << 1;
pub const KUI_MENU_ITEM_SUBMENU: u32 = 1 << 2;
pub const KUI_MENU_ITEM_REPLAY: u32 = 1 << 3;
pub const KUI_MENU_ACTION_SET_CLIPBOARD: u32 = 0;
pub const KUI_MENU_ACTION_PASTE: u32 = 1;
pub const KUI_MENU_ACTION_LOOK_UP: u32 = 2;
pub const KUI_MENU_ACTION_SET_CLIPBOARD_SECRET: u32 = 3;
pub const KUI_PASTE_CONCEALED: u32 = 1 << 0;
pub const KUI_PASTE_TRANSIENT: u32 = 1 << 1;
pub const KUI_BUTTONS_SECONDARY: u32 = kui_core::Buttons::SECONDARY.bits();
pub const KUI_BUTTONS_MIDDLE: u32 = kui_core::Buttons::MIDDLE.bits();
pub const KUI_BUTTONS_OTHER: u32 = kui_core::Buttons::OTHER.bits();
pub const KUI_OWED_TRANSITION: u32 = 1 << 0;
pub const KUI_OWED_CYCLE: u32 = 1 << 1;
pub const KUI_OWED_DEPART: u32 = 1 << 2;
pub const KUI_OWED_REQUESTED: u32 = 1 << 3;
pub const KUI_OWED_AUTOSCROLL: u32 = 1 << 4;
pub const KUI_OWED_SCROLL: u32 = 1 << 5;
pub const KUI_FRAME_CAUSE_POINTER_MOVE: u32 = kui_core::FrameCause::POINTER_MOVE.bits();
pub const KUI_FRAME_CAUSE_POINTER_LEAVE: u32 = kui_core::FrameCause::POINTER_LEAVE.bits();
pub const KUI_FRAME_CAUSE_BUTTON: u32 = kui_core::FrameCause::BUTTON.bits();
pub const KUI_FRAME_CAUSE_WHEEL: u32 = kui_core::FrameCause::WHEEL.bits();
pub const KUI_FRAME_CAUSE_KEY: u32 = kui_core::FrameCause::KEY.bits();
pub const KUI_FRAME_CAUSE_MODIFIERS: u32 = kui_core::FrameCause::MODIFIERS.bits();
pub const KUI_FRAME_CAUSE_TEXT: u32 = kui_core::FrameCause::TEXT.bits();
pub const KUI_FRAME_CAUSE_PREEDIT: u32 = kui_core::FrameCause::PREEDIT.bits();
pub const KUI_FRAME_CAUSE_ACCESS: u32 = kui_core::FrameCause::ACCESS.bits();
pub const KUI_FRAME_CAUSE_FILE_DRAG: u32 = kui_core::FrameCause::FILE_DRAG.bits();
pub const KUI_FRAME_CAUSE_FILES: u32 = kui_core::FrameCause::FILES.bits();
pub const KUI_FRAME_CAUSE_FIRST: u32 = kui_core::FrameCause::FIRST.bits();
pub const KUI_FRAME_CAUSE_WAKE: u32 = kui_core::FrameCause::WAKE.bits();
pub const KUI_FRAME_CAUSE_HOST: u32 = kui_core::FrameCause::HOST.bits();
pub const KUI_FRAME_CAUSE_RESIZE: u32 = kui_core::FrameCause::RESIZE.bits();
pub const KUI_FRAME_CAUSE_SCALE: u32 = kui_core::FrameCause::SCALE.bits();
pub const KUI_FRAME_CAUSE_FOCUS: u32 = kui_core::FrameCause::FOCUS.bits();
pub const KUI_FRAME_CAUSE_OCCLUSION: u32 = kui_core::FrameCause::OCCLUSION.bits();
pub const KUI_FRAME_CAUSE_APPEARANCE: u32 = kui_core::FrameCause::APPEARANCE.bits();
pub const KUI_FRAME_CAUSE_CARET: u32 = kui_core::FrameCause::CARET.bits();
pub const KUI_FRAME_CAUSE_RETRY: u32 = kui_core::FrameCause::RETRY.bits();
pub const KUI_FRAME_CAUSE_OVERDUE: u32 = kui_core::FrameCause::OVERDUE.bits();
pub const KUI_FRAME_CAUSE_DEVICE: u32 = kui_core::FrameCause::DEVICE.bits();
pub const KUI_FRAME_CAUSE_AFTER_FRAME: u32 = kui_core::FrameCause::AFTER_FRAME.bits();
pub const KUI_FRAME_CAUSE_ELSEWHERE: u32 = kui_core::FrameCause::ELSEWHERE.bits();
pub const KUI_FRAME_CAUSE_MENU: u32 = kui_core::FrameCause::MENU.bits();
pub const KUI_FRAME_CAUSE_AUDIO: u32 = kui_core::FrameCause::AUDIO.bits();
pub const KUI_FRAME_CAUSE_SMOKE: u32 = kui_core::FrameCause::SMOKE.bits();
pub const KUI_FRAME_CAUSE_OWED: u32 = kui_core::FrameCause::OWED.bits();
pub const KUI_COPY_READY: u32 = 0;
pub const KUI_COPY_ASKED: u32 = 1;
pub const KUI_COPY_NOTHING: u32 = 2;
pub const KUI_AUDIO_PLAY: u32 = 1;
pub const KUI_AUDIO_STOP: u32 = 2;
pub const KUI_AUDIO_SET_VOLUME: u32 = 3;
pub const KUI_AUDIO_PAUSE: u32 = 4;
pub const KUI_AUDIO_RESUME: u32 = 5;
pub const KUI_AUDIO_MASTER_VOLUME: u32 = 6;
pub const KUI_AUDIO_UNLOAD: u32 = 7;
pub const KUI_WINDOW_NONE: u32 = 0;