Skip to content

Commit

Permalink
Merge non-pattern provider methods into patterns! macro
Browse files Browse the repository at this point in the history
This is in preparation for windows-rs 0.32 which moves to a trait-based
`implement` macro.

Closes AccessKit#104.
  • Loading branch information
str4d committed May 21, 2022
1 parent 123e0f0 commit f417b6d
Showing 1 changed file with 70 additions and 82 deletions.
152 changes: 70 additions & 82 deletions platforms/windows/src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -672,6 +672,8 @@ macro_rules! properties {
macro_rules! patterns {
($(($base_pattern_id:ident, $is_supported:ident, (
$(($base_property_id:ident, $getter:ident, $com_type:ident)),*
), (
$($extra_method:item),*
))),+) => {
impl ResolvedPlatformNode<'_> {
fn pattern_provider(&self, pattern_id: i32) -> Option<IUnknown> {
Expand Down Expand Up @@ -712,6 +714,7 @@ macro_rules! patterns {
$(fn $base_property_id(&self) -> Result<$com_type> {
self.0.resolve(|resolved| Ok(resolved.$getter().into()))
})*
$($extra_method)*
})*
};
}
Expand Down Expand Up @@ -744,11 +747,40 @@ struct SelectionItemProvider(PlatformNode);
patterns! {
(Toggle, is_toggle_pattern_supported, (
(ToggleState, toggle_state, ToggleState)
), (
fn Toggle(&self) -> Result<()> {
self.0.resolve(|resolved| {
resolved.toggle();
Ok(())
})
}
)),
(Invoke, is_invoke_pattern_supported, (), (
fn Invoke(&self) -> Result<()> {
self.0.resolve(|resolved| {
resolved.invoke();
Ok(())
})
}
)),
(Invoke, is_invoke_pattern_supported, ()),
(Value, is_value_pattern_supported, (
(Value, value, BSTR),
(IsReadOnly, is_read_only, BOOL)
), (
fn SetValue(&self, value: PWSTR) -> Result<()> {
self.0.resolve(|resolved| {
// Based on BSTR::as_wide in windows-rs
let value_as_wide = if value.0.is_null() {
&[]
} else {
let len = unsafe { libc::wcslen(value.0) };
unsafe { std::slice::from_raw_parts(value.0 as *const _, len) }
};
let value = String::from_utf16(value_as_wide).unwrap();
resolved.set_value(value);
Ok(())
})
}
)),
(RangeValue, is_range_value_pattern_supported, (
(Value, numeric_value, f64),
Expand All @@ -757,89 +789,45 @@ patterns! {
(Maximum, max_numeric_value, f64),
(SmallChange, numeric_value_step, f64),
(LargeChange, numeric_value_jump, f64)
), (
fn SetValue(&self, value: f64) -> Result<()> {
self.0.resolve(|resolved| {
resolved.set_numeric_value(value);
Ok(())
})
}
)),
(SelectionItem, is_selection_item_pattern_supported, (
(IsSelected, is_selected, BOOL)
), (
fn Select(&self) -> Result<()> {
self.0.resolve(|resolved| {
resolved.select();
Ok(())
})
},

fn AddToSelection(&self) -> Result<()> {
self.0.resolve(|resolved| {
resolved.add_to_selection();
Ok(())
})
},

fn RemoveFromSelection(&self) -> Result<()> {
self.0.resolve(|resolved| {
resolved.remove_from_selection();
Ok(())
})
},

fn SelectionContainer(&self) -> Result<IRawElementProviderSimple> {
self.0.resolve(|_resolved| {
// TODO: implement when we work on list boxes (#23)
// We return E_FAIL here because that's what Chromium does
// if it can't find a container.
Err(Error::new(E_FAIL, "".into()))
})
}
))
}

#[allow(non_snake_case)]
impl ToggleProvider {
fn Toggle(&self) -> Result<()> {
self.0.resolve(|resolved| {
resolved.toggle();
Ok(())
})
}
}

#[allow(non_snake_case)]
impl InvokeProvider {
fn Invoke(&self) -> Result<()> {
self.0.resolve(|resolved| {
resolved.invoke();
Ok(())
})
}
}

#[allow(non_snake_case)]
impl ValueProvider {
fn SetValue(&self, value: PWSTR) -> Result<()> {
self.0.resolve(|resolved| {
// Based on BSTR::as_wide in windows-rs
let value_as_wide = if value.0.is_null() {
&[]
} else {
let len = unsafe { libc::wcslen(value.0) };
unsafe { std::slice::from_raw_parts(value.0 as *const _, len) }
};
let value = String::from_utf16(value_as_wide).unwrap();
resolved.set_value(value);
Ok(())
})
}
}

#[allow(non_snake_case)]
impl RangeValueProvider {
fn SetValue(&self, value: f64) -> Result<()> {
self.0.resolve(|resolved| {
resolved.set_numeric_value(value);
Ok(())
})
}
}

#[allow(non_snake_case)]
impl SelectionItemProvider {
fn Select(&self) -> Result<()> {
self.0.resolve(|resolved| {
resolved.select();
Ok(())
})
}

fn AddToSelection(&self) -> Result<()> {
self.0.resolve(|resolved| {
resolved.add_to_selection();
Ok(())
})
}

fn RemoveFromSelection(&self) -> Result<()> {
self.0.resolve(|resolved| {
resolved.remove_from_selection();
Ok(())
})
}

fn SelectionContainer(&self) -> Result<IRawElementProviderSimple> {
self.0.resolve(|_resolved| {
// TODO: implement when we work on list boxes (#23)
// We return E_FAIL here because that's what Chromium does
// if it can't find a container.
Err(Error::new(E_FAIL, "".into()))
})
}
}

0 comments on commit f417b6d

Please sign in to comment.