mid commit

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou 2023-04-14 09:42:46 +08:00
parent 06a52e1b54
commit 2988744034

View File

@ -62,7 +62,7 @@ impl Capturer {
let mut desc = unsafe { mem::MaybeUninit::uninit().assume_init() }; let mut desc = unsafe { mem::MaybeUninit::uninit().assume_init() };
let mut gdi_capturer = None; let mut gdi_capturer = None;
let mut res = if display.gdi { let mut res = if display.gdi.is_some() {
wrap_hresult(1) wrap_hresult(1)
} else { } else {
wrap_hresult(unsafe { wrap_hresult(unsafe {
@ -367,48 +367,60 @@ impl Displays {
let mut i: DWORD = 0; let mut i: DWORD = 0;
loop { loop {
#[allow(invalid_value)] #[allow(invalid_value)]
let mut d: DISPLAY_DEVICEW = unsafe { std::mem::MaybeUninit::uninit().assume_init() }; let mut dd: DISPLAY_DEVICEW = unsafe { std::mem::MaybeUninit::uninit().assume_init() };
d.cb = std::mem::size_of::<DISPLAY_DEVICEW>() as _; dd.cb = std::mem::size_of::<DISPLAY_DEVICEW>() as _;
let ok = unsafe { EnumDisplayDevicesW(std::ptr::null(), i, &mut d as _, 0) }; let ok = unsafe { EnumDisplayDevicesW(std::ptr::null(), i, &mut dd as _, 0) };
if ok == FALSE { if ok == FALSE {
break; break;
} }
i += 1; i += 1;
if 0 == (d.StateFlags & DISPLAY_DEVICE_ACTIVE) if 0 == (dd.StateFlags & DISPLAY_DEVICE_ACTIVE)
|| (d.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) > 0 || (dd.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) > 0
{ {
continue; continue;
} }
// let is_primary = (d.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) > 0;
let mut disp = Display { let mut disp = Display {
inner: ComPtr(std::ptr::null_mut()), inner: ComPtr(std::ptr::null_mut()),
adapter: ComPtr(std::ptr::null_mut()), adapter: ComPtr(std::ptr::null_mut()),
desc: unsafe { std::mem::zeroed() }, desc: unsafe { std::mem::zeroed() },
gdi: true, gdi: None,
}; };
disp.desc.DeviceName = d.DeviceName; disp.desc.DeviceName = dd.DeviceName.clone();
#[allow(invalid_value)] #[allow(invalid_value)]
let mut m: DEVMODEW = unsafe { std::mem::MaybeUninit::uninit().assume_init() }; let mut dm: DEVMODEW = unsafe { std::mem::MaybeUninit::uninit().assume_init() };
m.dmSize = std::mem::size_of::<DEVMODEW>() as _; dm.dmSize = std::mem::size_of::<DEVMODEW>() as _;
m.dmDriverExtra = 0; dm.dmDriverExtra = 0;
let ok = unsafe { unsafe {
EnumDisplaySettingsExW( if FALSE
disp.desc.DeviceName.as_ptr(), == EnumDisplaySettingsExW(
ENUM_CURRENT_SETTINGS, disp.desc.DeviceName.as_ptr(),
&mut m as _, ENUM_CURRENT_SETTINGS,
0, &mut dm as _,
) 0,
}; )
if ok == FALSE { {
continue; if FALSE
== EnumDisplaySettingsExW(
disp.desc.DeviceName.as_ptr(),
ENUM_REGISTRY_SETTINGS,
&mut dm as _,
0,
)
{
continue;
}
}
} }
disp.desc.DesktopCoordinates.left = unsafe { m.u1.s2().dmPosition.x }; disp.desc.DesktopCoordinates.left = unsafe { dm.u1.s2().dmPosition.x };
disp.desc.DesktopCoordinates.top = unsafe { m.u1.s2().dmPosition.y }; disp.desc.DesktopCoordinates.top = unsafe { dm.u1.s2().dmPosition.y };
disp.desc.DesktopCoordinates.right = disp.desc.DesktopCoordinates.right =
disp.desc.DesktopCoordinates.left + m.dmPelsWidth as i32; disp.desc.DesktopCoordinates.left + dm.dmPelsWidth as i32;
disp.desc.DesktopCoordinates.bottom = disp.desc.DesktopCoordinates.bottom =
disp.desc.DesktopCoordinates.top + m.dmPelsHeight as i32; disp.desc.DesktopCoordinates.top + dm.dmPelsHeight as i32;
disp.desc.AttachedToDesktop = 1; disp.desc.AttachedToDesktop = 1;
let is_primary = (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) > 0;
disp.gdi = Some(GdiDisplayInfo { dd, dm, is_primary });
all.push(disp); all.push(disp);
} }
all all
@ -476,7 +488,7 @@ impl Displays {
inner: ComPtr(inner), inner: ComPtr(inner),
adapter: ComPtr(self.adapter.0), adapter: ComPtr(self.adapter.0),
desc, desc,
gdi: false, gdi: None,
})) }))
} }
} }
@ -512,7 +524,13 @@ pub struct Display {
inner: ComPtr<IDXGIOutput1>, inner: ComPtr<IDXGIOutput1>,
adapter: ComPtr<IDXGIAdapter1>, adapter: ComPtr<IDXGIAdapter1>,
desc: DXGI_OUTPUT_DESC, desc: DXGI_OUTPUT_DESC,
gdi: bool, gdi: Option<GdiDisplayInfo>,
}
pub struct GdiDisplayInfo {
pub dd: DISPLAY_DEVICEW,
pub dm: DEVMODEW,
pub is_primary: bool,
} }
// optimized for updated region // optimized for updated region
@ -537,6 +555,10 @@ impl Display {
self.desc.Rotation self.desc.Rotation
} }
pub fn gdi(&self) -> &Option<GdiDisplayInfo> {
&self.gdi
}
fn create_gdi(&self) -> Option<CapturerGDI> { fn create_gdi(&self) -> Option<CapturerGDI> {
if let Ok(res) = CapturerGDI::new(self.name(), self.width(), self.height()) { if let Ok(res) = CapturerGDI::new(self.name(), self.width(), self.height()) {
Some(res) Some(res)