Skip to content

Commit 0f9c260

Browse files
committed
Migrate to windows-rs 0.37
1 parent 123e0f0 commit 0f9c260

File tree

4 files changed

+101
-86
lines changed

4 files changed

+101
-86
lines changed

Cargo.lock

Lines changed: 24 additions & 53 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

platforms/windows/Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ libc = "0.2.112"
1919
paste = "1.0"
2020

2121
[dependencies.windows]
22-
version = "0.27.0"
22+
version = "0.37.0"
2323
features = [
2424
"alloc",
25-
"build",
26-
"std",
25+
"implement",
2726
"Win32_Foundation",
2827
"Win32_Graphics_Gdi",
2928
"Win32_System_Com",

platforms/windows/examples/hello_world.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,12 @@ use windows::{
2121
lazy_static! {
2222
static ref WIN32_INSTANCE: HINSTANCE = {
2323
let instance = unsafe { GetModuleHandleW(None) };
24-
if instance.0 == 0 {
25-
let result: Result<()> = Err(Error::from_win32());
26-
result.unwrap();
27-
}
28-
instance
24+
instance.unwrap()
2925
};
3026

3127
static ref DEFAULT_CURSOR: HCURSOR = {
3228
let cursor = unsafe { LoadCursorW(None, IDC_ARROW) };
33-
if cursor.0 == 0 {
34-
let result: Result<()> = Err(Error::from_win32());
35-
result.unwrap();
36-
}
37-
cursor
29+
cursor.unwrap()
3830
};
3931

4032
static ref WINDOW_CLASS_ATOM: u16 = {
@@ -48,7 +40,7 @@ lazy_static! {
4840
let wc = WNDCLASSW {
4941
hCursor: *DEFAULT_CURSOR,
5042
hInstance: *WIN32_INSTANCE,
51-
lpszClassName: PWSTR(class_name_wsz.as_ptr() as _),
43+
lpszClassName: PCWSTR(class_name_wsz.as_ptr() as _),
5244
style: CS_HREDRAW | CS_VREDRAW,
5345
lpfnWndProc: Some(wndproc),
5446
..Default::default()
@@ -334,7 +326,7 @@ fn create_window(title: &str, initial_state: TreeUpdate, initial_focus: NodeId)
334326
let window = unsafe {
335327
CreateWindowExW(
336328
Default::default(),
337-
PWSTR(*WINDOW_CLASS_ATOM as usize as _),
329+
PCWSTR(*WINDOW_CLASS_ATOM as usize as _),
338330
title,
339331
WS_OVERLAPPEDWINDOW,
340332
CW_USEDEFAULT,

platforms/windows/src/node.rs

Lines changed: 71 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -539,9 +539,16 @@ impl PlatformNode {
539539
{
540540
self.node
541541
.map(|node| f(ResolvedPlatformNode::new(node, self.hwnd)))
542-
.unwrap_or_else(|| Err(Error::new(HRESULT(UIA_E_ELEMENTNOTAVAILABLE), "".into())))
542+
.unwrap_or_else(|| {
543+
Err(Error::new(
544+
HRESULT(UIA_E_ELEMENTNOTAVAILABLE as i32),
545+
"".into(),
546+
))
547+
})
543548
}
549+
}
544550

551+
impl IRawElementProviderSimple_Impl for PlatformNode {
545552
fn ProviderOptions(&self) -> Result<ProviderOptions> {
546553
// We don't currently have to resolve the node to implement this.
547554
// But we might have to in the future. So to avoid leaking
@@ -552,7 +559,7 @@ impl PlatformNode {
552559
self.resolve(|resolved| Ok(resolved.provider_options()))
553560
}
554561

555-
fn GetPatternProvider(&mut self, pattern_id: i32) -> Result<IUnknown> {
562+
fn GetPatternProvider(&self, pattern_id: i32) -> Result<IUnknown> {
556563
let provider = self.resolve(|resolved| Ok(resolved.pattern_provider(pattern_id)))?;
557564
provider.map_or_else(|| Err(Error::OK), Ok)
558565
}
@@ -567,7 +574,9 @@ impl PlatformNode {
567574
fn HostRawElementProvider(&self) -> Result<IRawElementProviderSimple> {
568575
self.resolve(|resolved| resolved.host_provider())
569576
}
577+
}
570578

579+
impl IRawElementProviderFragment_Impl for PlatformNode {
571580
fn Navigate(&self, direction: NavigateDirection) -> Result<IRawElementProviderFragment> {
572581
self.resolve(|resolved| match resolved.navigate(direction) {
573582
Some(result) => Ok(result.downgrade().into()),
@@ -598,14 +607,14 @@ impl PlatformNode {
598607
})
599608
}
600609

601-
fn FragmentRoot(&mut self) -> Result<IRawElementProviderFragmentRoot> {
610+
fn FragmentRoot(&self) -> Result<IRawElementProviderFragmentRoot> {
602611
enum FragmentRootResult {
603-
This,
612+
This(PlatformNode),
604613
Other(PlatformNode),
605614
}
606615
let result = self.resolve(|resolved| {
607616
if resolved.node.is_root() {
608-
Ok(FragmentRootResult::This)
617+
Ok(FragmentRootResult::This(resolved.downgrade()))
609618
} else {
610619
let root = resolved.node.tree_reader.root();
611620
Ok(FragmentRootResult::Other(
@@ -614,11 +623,13 @@ impl PlatformNode {
614623
}
615624
})?;
616625
match result {
617-
FragmentRootResult::This => Ok(self.into()),
626+
FragmentRootResult::This(node) => Ok(node.into()),
618627
FragmentRootResult::Other(node) => Ok(node.into()),
619628
}
620629
}
630+
}
621631

632+
impl IRawElementProviderFragmentRoot_Impl for PlatformNode {
622633
fn ElementProviderFromPoint(&self, x: f64, y: f64) -> Result<IRawElementProviderFragment> {
623634
self.resolve(|resolved| {
624635
let point = Point::new(x, y);
@@ -707,12 +718,6 @@ macro_rules! patterns {
707718
})*
708719
}
709720
}
710-
$(#[allow(non_snake_case)]
711-
impl paste! { [< $base_pattern_id Provider>] } {
712-
$(fn $base_property_id(&self) -> Result<$com_type> {
713-
self.0.resolve(|resolved| Ok(resolved.$getter().into()))
714-
})*
715-
})*
716721
};
717722
}
718723

@@ -764,17 +769,22 @@ patterns! {
764769
}
765770

766771
#[allow(non_snake_case)]
767-
impl ToggleProvider {
772+
impl IToggleProvider_Impl for ToggleProvider {
768773
fn Toggle(&self) -> Result<()> {
769774
self.0.resolve(|resolved| {
770775
resolved.toggle();
771776
Ok(())
772777
})
773778
}
779+
780+
fn ToggleState(&self) -> Result<ToggleState> {
781+
self.0
782+
.resolve(|resolved| Ok(resolved.toggle_state().into()))
783+
}
774784
}
775785

776786
#[allow(non_snake_case)]
777-
impl InvokeProvider {
787+
impl IInvokeProvider_Impl for InvokeProvider {
778788
fn Invoke(&self) -> Result<()> {
779789
self.0.resolve(|resolved| {
780790
resolved.invoke();
@@ -784,8 +794,8 @@ impl InvokeProvider {
784794
}
785795

786796
#[allow(non_snake_case)]
787-
impl ValueProvider {
788-
fn SetValue(&self, value: PWSTR) -> Result<()> {
797+
impl IValueProvider_Impl for ValueProvider {
798+
fn SetValue(&self, value: &PCWSTR) -> Result<()> {
789799
self.0.resolve(|resolved| {
790800
// Based on BSTR::as_wide in windows-rs
791801
let value_as_wide = if value.0.is_null() {
@@ -799,20 +809,59 @@ impl ValueProvider {
799809
Ok(())
800810
})
801811
}
812+
813+
fn Value(&self) -> Result<BSTR> {
814+
self.0.resolve(|resolved| Ok(resolved.value().into()))
815+
}
816+
817+
fn IsReadOnly(&self) -> Result<BOOL> {
818+
self.0
819+
.resolve(|resolved| Ok(resolved.is_read_only().into()))
820+
}
802821
}
803822

804823
#[allow(non_snake_case)]
805-
impl RangeValueProvider {
824+
impl IRangeValueProvider_Impl for RangeValueProvider {
806825
fn SetValue(&self, value: f64) -> Result<()> {
807826
self.0.resolve(|resolved| {
808827
resolved.set_numeric_value(value);
809828
Ok(())
810829
})
811830
}
831+
832+
fn Value(&self) -> Result<f64> {
833+
self.0
834+
.resolve(|resolved| Ok(resolved.numeric_value().into()))
835+
}
836+
837+
fn IsReadOnly(&self) -> Result<BOOL> {
838+
self.0
839+
.resolve(|resolved| Ok(resolved.is_read_only().into()))
840+
}
841+
842+
fn Maximum(&self) -> Result<f64> {
843+
self.0
844+
.resolve(|resolved| Ok(resolved.max_numeric_value().into()))
845+
}
846+
847+
fn Minimum(&self) -> Result<f64> {
848+
self.0
849+
.resolve(|resolved| Ok(resolved.min_numeric_value().into()))
850+
}
851+
852+
fn LargeChange(&self) -> Result<f64> {
853+
self.0
854+
.resolve(|resolved| Ok(resolved.numeric_value_jump().into()))
855+
}
856+
857+
fn SmallChange(&self) -> Result<f64> {
858+
self.0
859+
.resolve(|resolved| Ok(resolved.numeric_value_step().into()))
860+
}
812861
}
813862

814863
#[allow(non_snake_case)]
815-
impl SelectionItemProvider {
864+
impl ISelectionItemProvider_Impl for SelectionItemProvider {
816865
fn Select(&self) -> Result<()> {
817866
self.0.resolve(|resolved| {
818867
resolved.select();
@@ -834,6 +883,10 @@ impl SelectionItemProvider {
834883
})
835884
}
836885

886+
fn IsSelected(&self) -> Result<BOOL> {
887+
self.0.resolve(|resolved| Ok(resolved.is_selected().into()))
888+
}
889+
837890
fn SelectionContainer(&self) -> Result<IRawElementProviderSimple> {
838891
self.0.resolve(|_resolved| {
839892
// TODO: implement when we work on list boxes (#23)

0 commit comments

Comments
 (0)