fix(wm): pass *const u8 to enum_display_devices

Thanks to @ids1024 for pointing out that the failing system calls were
likely due to optimizations being made with the release profile's
opt-level=3 and to @saethlin for pointing out that in the previous
commit I was returning a pointer to a temporary that was about to be
deallocated.

https://fosstodon.org/@ids1024/111627094548141620
https://hachyderm.io/@saethlin/111627135615930244

With this commit, the display ids are now successfully returned from
calls to EnumDisplayDevicesA on release builds.
This commit is contained in:
LGUG2Z
2023-12-22 17:44:35 -08:00
parent 657ac441ae
commit d3bc78097c
2 changed files with 6 additions and 6 deletions

View File

@@ -242,13 +242,12 @@ impl WindowsApi {
pub fn enum_display_devices( pub fn enum_display_devices(
index: u32, index: u32,
lp_device: Option<[u8; 32]>, lp_device: Option<*const u8>,
) -> Result<DISPLAY_DEVICEA> { ) -> Result<DISPLAY_DEVICEA> {
#[allow(clippy::option_if_let_else)] #[allow(clippy::option_if_let_else)]
let lp_device = if let Some(lp_device) = lp_device { let lp_device = match lp_device {
PCSTR::from_raw(lp_device.as_ptr()) None => PCSTR::null(),
} else { Some(lp_device) => PCSTR(lp_device),
PCSTR::null()
}; };
let mut display_device = DISPLAY_DEVICEA { let mut display_device = DISPLAY_DEVICEA {

View File

@@ -85,7 +85,8 @@ pub extern "system" fn enum_display_monitor(
.to_string(); .to_string();
if clean_name.eq(m.name()) { if clean_name.eq(m.name()) {
if let Ok(device) = WindowsApi::enum_display_devices(0, Some(d.DeviceName)) { if let Ok(device) = WindowsApi::enum_display_devices(0, Some(d.DeviceName.as_ptr()))
{
let id = String::from_utf8_lossy(&device.DeviceID); let id = String::from_utf8_lossy(&device.DeviceID);
let clean_id = id.replace('\u{0000}', ""); let clean_id = id.replace('\u{0000}', "");