rsgt 0.2.1

Rust simple GUI Toolkit
//========================================================================
// RSGT | os.rs - https://overtimecoder.github.io
//------------------------------------------------------------------------
// OS-dependent processing
//------------------------------------------------------------------------
//
// Author LatteS
//
// File was created in 2022/12/31
//
//========================================================================

//! # OS-dependent processing

#[cfg(windows)]
/// Enable visual style (Not supported on Linux or MacOS)
pub fn enable_visual_style() {
    use std::iter::once;
    use std::{mem, ptr};
    use winapi::shared::basetsd::ULONG_PTR;
    use winapi::shared::minwindef::{DWORD, ULONG};
    use winapi::um::sysinfoapi::GetSystemDirectoryW;
    use winapi::um::winbase::{ActivateActCtx, CreateActCtxW, ACTCTXW};
    use windows_sys::Win32::Foundation::MAX_PATH;

    const ACTCTX_FLAG_RESOURCE_NAME_VALID: DWORD = 0x008;
    const ACTCTX_FLAG_SET_PROCESS_DEFAULT: DWORD = 0x010;
    const ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID: DWORD = 0x004;

    let mut sys_dir: Vec<u16> = Vec::with_capacity(MAX_PATH as usize);
    unsafe {
        sys_dir.set_len(MAX_PATH as usize);
        GetSystemDirectoryW(sys_dir.as_mut_ptr(), MAX_PATH as u32);
    }

    let mut source = "shell32.dll"
        .encode_utf16()
        .chain(once(0))
        .collect::<Vec<u16>>();

    let mut activation_cookie: ULONG_PTR = 0;
    let mut act_ctx = ACTCTXW {
        cbSize: mem::size_of::<ACTCTXW> as ULONG,
        dwFlags: ACTCTX_FLAG_RESOURCE_NAME_VALID
            | ACTCTX_FLAG_SET_PROCESS_DEFAULT
            | ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID,
        lpSource: source.as_mut_ptr().cast(),
        wProcessorArchitecture: 0,
        wLangId: 0,
        lpAssemblyDirectory: sys_dir.as_mut_ptr(),
        lpResourceName: unsafe { mem::transmute(124usize) },
        lpApplicationName: ptr::null_mut(),
        hModule: ptr::null_mut(),
    };

    unsafe {
        let handle = CreateActCtxW(&mut act_ctx);
        ActivateActCtx(handle, &mut activation_cookie);
    }
}

#[cfg(macos)]
pub fn enable_visual_style() {}

#[cfg(unix)]
pub fn enable_visual_style() {}

#[cfg(windows)]
/// Set the DPI to the appropriate setting (Not supported on Linux or MacOS)
pub fn set_dpi() {
    use windows_sys::Win32::UI::WindowsAndMessaging::SetProcessDPIAware;
    unsafe {
        SetProcessDPIAware();
    }
}

#[cfg(macos)]
pub fn set_dpi() {}

#[cfg(unix)]
pub fn set_dpi() {}