libdisplay_info/
displayid2.rs

1//! Low-level API for VESA Display Identification Data (DisplayID) version 2.
2//!
3//! The library implements DisplayID version 2.1, available at:
4//! <https://vesa.org/vesa-standards/>
5use std::marker::PhantomData;
6
7use libdisplay_info_derive::FFIFrom;
8
9use crate::{edid::ExtensionRef, ffi};
10
11pub struct DisplayId2<'ext> {
12    display_id: *const ffi::displayid2::di_displayid2,
13    phantom: PhantomData<&'ext ()>,
14}
15
16impl<'ext> DisplayId2<'ext> {
17    /// Get a DisplayID v2 extension block
18    ///
19    /// Returns `None` if the extension block tag is not [DisplayId](crate::edid::ExtensionTag::DisplayId) or if
20    /// the block does not contain a version 2 DisplayID blob.
21    pub fn from_extension(extensions: &'ext ExtensionRef) -> Option<DisplayId2<'ext>> {
22        let display_id = unsafe { ffi::edid::di_edid_ext_get_displayid2(extensions.as_ptr()) };
23
24        if display_id.is_null() {
25            None
26        } else {
27            Some(Self {
28                display_id: display_id as *const ffi::displayid2::di_displayid2,
29                phantom: PhantomData,
30            })
31        }
32    }
33
34    /// Get the DisplayID v2 revision.
35    pub fn revision(&self) -> i32 {
36        unsafe { ffi::displayid2::di_displayid2_get_revision(self.display_id) }
37    }
38
39    /// Get the DisplayID v2 product primary use case.
40    pub fn product_primary_use_case(&self) -> PrimaryUseCase {
41        PrimaryUseCase::from(unsafe {
42            ffi::displayid2::di_displayid2_get_product_primary_use_case(self.display_id)
43        })
44    }
45}
46
47/// Product primary use case identifier, defined in table 2-3.
48#[derive(Debug, Clone, Copy, PartialEq, Eq, FFIFrom)]
49#[ffi(ffi::displayid2::di_displayid2_product_primary_use_case)]
50#[repr(u32)]
51pub enum PrimaryUseCase {
52    Extension = ffi::displayid2::di_displayid2_product_primary_use_case_DI_DISPLAYID2_PRODUCT_PRIMARY_USE_CASE_EXTENSION,
53    Test = ffi::displayid2::di_displayid2_product_primary_use_case_DI_DISPLAYID2_PRODUCT_PRIMARY_USE_CASE_TEST,
54    Generic = ffi::displayid2::di_displayid2_product_primary_use_case_DI_DISPLAYID2_PRODUCT_PRIMARY_USE_CASE_GENERIC,
55    TV = ffi::displayid2::di_displayid2_product_primary_use_case_DI_DISPLAYID2_PRODUCT_PRIMARY_USE_CASE_TV,
56    DesktopProductivity = ffi::displayid2::di_displayid2_product_primary_use_case_DI_DISPLAYID2_PRODUCT_PRIMARY_USE_CASE_DESKTOP_PRODUCTIVITY,
57    DesktopGaming = ffi::displayid2::di_displayid2_product_primary_use_case_DI_DISPLAYID2_PRODUCT_PRIMARY_USE_CASE_DESKTOP_GAMING,
58    Presentation = ffi::displayid2::di_displayid2_product_primary_use_case_DI_DISPLAYID2_PRODUCT_PRIMARY_USE_CASE_PRESENTATION,
59    HMDVR = ffi::displayid2::di_displayid2_product_primary_use_case_DI_DISPLAYID2_PRODUCT_PRIMARY_USE_CASE_HMD_VR,
60    HMDAR = ffi::displayid2::di_displayid2_product_primary_use_case_DI_DISPLAYID2_PRODUCT_PRIMARY_USE_CASE_HMD_AR,
61}