// Copyright © 2015-2018 winapi-rs developers
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
//! Procedure declarations, constant definitions, and macros for the NLS component.
use shared::basetsd::UINT32;
use shared::minwindef::{
    BOOL, BYTE, DWORD, HRGN, INT, LPARAM, LPCVOID, LPVOID, LRESULT, UINT, WPARAM
};
use shared::windef::{HBITMAP, HWND, POINT, PSIZE, RECT};
use um::uxtheme::MARGINS;
use um::winnt::{HANDLE, HRESULT, ULONGLONG};
pub const DWM_BB_ENABLE: DWORD = 0x00000001;
pub const DWM_BB_BLURREGION: DWORD = 0x00000002;
pub const DWM_BB_TRANSITIONONMAXIMIZED: DWORD = 0x00000004;
STRUCT!{#[repr(packed)] struct DWM_BLURBEHIND {
    dwFlags: DWORD,
    fEnable: BOOL,
    hRgnBlur: HRGN,
    fTransitionOnMaximized: BOOL,
}}
ENUM!{enum DWMWINDOWATTRIBUTE {
    DWMWA_NCRENDERING_ENABLED = 1,
    DWMWA_NCRENDERING_POLICY = 2,
    DWMWA_TRANSITIONS_FORCEDISABLED = 3,
    DWMWA_ALLOW_NCPAINT = 4,
    DWMWA_CAPTION_BUTTON_BOUNDS = 5,
    DWMWA_NONCLIENT_RTL_LAYOUT = 6,
    DWMWA_FORCE_ICONIC_REPRESENTATION = 7,
    DWMWA_FLIP3D_POLICY = 8,
    DWMWA_EXTENDED_FRAME_BOUNDS = 9,
    DWMWA_HAS_ICONIC_BITMAP = 10,
    DWMWA_DISALLOW_PEEK = 11,
    DWMWA_EXCLUDED_FROM_PEEK = 12,
    DWMWA_CLOAK = 13,
    DWMWA_CLOAKED = 14,
    DWMWA_FREEZE_REPRESENTATION = 15,
    DWMWA_LAST = 16,
}}
ENUM!{enum DWMNCRENDERINGPOLICY {
    DWMNCRP_USEWINDOWSTYLE = 0,
    DWMNCRP_DISABLED = 1,
    DWMNCRP_ENABLED = 2,
    DWMNCRP_LAST = 3,
}}
ENUM!{enum DWMFLIP3DWINDOWPOLICY {
    DWMFLIP3D_DEFAULT = 0,
    DWMFLIP3D_EXCLUDEBELOW = 1,
    DWMFLIP3D_EXCLUDEABOVE = 2,
    DWMFLIP3D_LAST = 3,
}}
pub const DWM_CLOAKED_APP: u32 = 0x00000001;
pub const DWM_CLOAKED_SHELL: u32 = 0x00000002;
pub const DWM_CLOAKED_INHERITED: u32 = 0x00000004;
pub type HTHUMBNAIL = HANDLE;
pub type PHTHUMBNAIL = *mut HTHUMBNAIL;
pub const DWM_TNP_RECTDESTINATION: DWORD = 0x00000001;
pub const DWM_TNP_RECTSOURCE: DWORD = 0x00000002;
pub const DWM_TNP_OPACITY: DWORD = 0x00000004;
pub const DWM_TNP_VISIBLE: DWORD = 0x00000008;
pub const DWM_TNP_SOURCECLIENTAREAONLY: DWORD = 0x00000010;
STRUCT!{#[repr(packed)] struct DWM_THUMBNAIL_PROPERTIES {
    dwFlags: DWORD,
    rcDestination: RECT,
    rcSource: RECT,
    opacity: BYTE,
    fVisible: BOOL,
    fSourceClientAreaOnly: BOOL,
}}
pub type PDWM_THUMBNAIL_PROPERTIES = *mut DWM_THUMBNAIL_PROPERTIES;
pub type DWM_FRAME_COUNT = ULONGLONG;
pub type QPC_TIME = ULONGLONG;
STRUCT!{#[repr(packed)] struct UNSIGNED_RATIO {
    uiNumerator: UINT32,
    uiDenominator: UINT32,
}}
STRUCT!{#[repr(packed)] struct DWM_TIMING_INFO {
    cbSize: UINT32,
    rateRefresh: UNSIGNED_RATIO,
    qpcRefreshPeriod: QPC_TIME,
    rateCompose: UNSIGNED_RATIO,
    qpcVBlank: QPC_TIME,
    cRefresh: DWM_FRAME_COUNT,
    cDXRefresh: UINT,
    qpcCompose: QPC_TIME,
    cFrame: DWM_FRAME_COUNT,
    cDXPresent: UINT,
    cRefreshFrame: DWM_FRAME_COUNT,
    cFrameSubmitted: DWM_FRAME_COUNT,
    cDXPresentSubmitted: UINT,
    cFrameConfirmed: DWM_FRAME_COUNT,
    cDXPresentConfirmed: UINT,
    cRefreshConfirmed: DWM_FRAME_COUNT,
    cDXRefreshConfirmed: UINT,
    cFramesLate: DWM_FRAME_COUNT,
    cFramesOutstanding: UINT,
    cFrameDisplayed: DWM_FRAME_COUNT,
    qpcFrameDisplayed: QPC_TIME,
    cRefreshFrameDisplayed: DWM_FRAME_COUNT,
    cFrameComplete: DWM_FRAME_COUNT,
    qpcFrameComplete: QPC_TIME,
    cFramePending: DWM_FRAME_COUNT,
    qpcFramePending: QPC_TIME,
    cFramesDisplayed: DWM_FRAME_COUNT,
    cFramesComplete: DWM_FRAME_COUNT,
    cFramesPending: DWM_FRAME_COUNT,
    cFramesAvailable: DWM_FRAME_COUNT,
    cFramesDropped: DWM_FRAME_COUNT,
    cFramesMissed: DWM_FRAME_COUNT,
    cRefreshNextDisplayed: DWM_FRAME_COUNT,
    cRefreshNextPresented: DWM_FRAME_COUNT,
    cRefreshesDisplayed: DWM_FRAME_COUNT,
    cRefreshesPresented: DWM_FRAME_COUNT,
    cRefreshStarted: DWM_FRAME_COUNT,
    cPixelsReceived: ULONGLONG,
    cPixelsDrawn: ULONGLONG,
    cBuffersEmpty: DWM_FRAME_COUNT,
}}
ENUM!{enum DWM_SOURCE_FRAME_SAMPLING {
    DWM_SOURCE_FRAME_SAMPLING_POINT = 0,
    DWM_SOURCE_FRAME_SAMPLING_COVERAGE = 1,
    DWM_SOURCE_FRAME_SAMPLING_LAST = 2,
}}
// pub const c_DwmMaxQueuedBuffers: UINT = 8;
// pub const c_DwmMaxMonitors: UINT = 16;
// pub const c_DwmMaxAdapters: UINT = 16;
STRUCT!{#[repr(packed)] struct DWM_PRESENT_PARAMETERS {
    cbSize: UINT32,
    fQueue: BOOL,
    cRefreshStart: DWM_FRAME_COUNT,
    cBuffer: UINT,
    fUseSourceRate: BOOL,
    rateSource: UNSIGNED_RATIO,
    cRefreshesPerFrame: UINT,
    eSampling: DWM_SOURCE_FRAME_SAMPLING,
}}
// pub const DWM_FRAME_DURATION_DEFAULT: i32 = -1;
FN!{stdcall DwmDefWindowProc(
    hWnd: HWND,
    msg: UINT,
    wParam: WPARAM,
    lParam: LPARAM,
    plResult: *mut LRESULT,
) -> BOOL}
extern "system" {
    pub fn DwmEnableBlurBehindWindow(
        hWnd: HWND,
        pBlurBehind: *const DWM_BLURBEHIND,
    ) -> HRESULT;
}
pub const DWM_EC_DISABLECOMPOSITION: UINT = 0;
pub const DWM_EC_ENABLECOMPOSITION: UINT = 1;
extern "system" {
    pub fn DwmEnableComposition(
        uCompositionAction: UINT,
    ) -> HRESULT;
    pub fn DwmEnableMMCSS(
        fEnableMMCSS: BOOL,
    ) -> HRESULT;
    pub fn DwmExtendFrameIntoClientArea(
        hWnd: HWND,
        pMarInset: *const MARGINS,
    ) -> HRESULT;
    pub fn DwmGetColorizationColor(
        pcrColorization: *mut DWORD,
        pfOpaqueBlend: *mut BOOL,
    ) -> HRESULT;
    pub fn DwmGetCompositionTimingInfo(
        hWnd: HWND,
        pTimingInfo: *mut DWM_TIMING_INFO,
    ) -> HRESULT;
    pub fn DwmGetWindowAttribute(
        hWnd: HWND,
        dwAttribute: DWORD,
        pvAttribute: LPVOID,
        cbAttribute: DWORD,
    ) -> HRESULT;
    pub fn DwmIsCompositionEnabled(
        pfEnabled: *mut BOOL,
    ) -> HRESULT;
    pub fn DwmModifyPreviousDxFrameDuration(
        hwnd: HWND,
        cRefreshes: INT,
        fRelative: BOOL,
    ) -> HRESULT;
    pub fn DwmQueryThumbnailSourceSize(
        hThumbnail: HTHUMBNAIL,
        pSize: PSIZE,
    ) -> HRESULT;
    pub fn DwmRegisterThumbnail(
        hwndDestination: HWND,
        hwndSource: HWND,
        phThumbnailId: PHTHUMBNAIL,
    ) -> HRESULT;
    pub fn DwmSetDxFrameDuration(
        hwnd: HWND,
        cRefreshes: INT,
    ) -> HRESULT;
    pub fn DwmSetPresentParameters(
        hwnd: HWND,
        pPresentParams: *mut DWM_PRESENT_PARAMETERS,
    ) -> HRESULT;
    pub fn DwmSetWindowAttribute(
        hWnd: HWND,
        dwAttribute: DWORD,
        pvAttribute: LPCVOID,
        cbAttribute: DWORD,
    ) -> HRESULT;
    pub fn DwmUnregisterThumbnail(
        hThumbnailId: HTHUMBNAIL,
    ) -> HRESULT;
    pub fn DwmUpdateThumbnailProperties(
        hThumbnailId: HTHUMBNAIL,
        ptnProperties: *const DWM_THUMBNAIL_PROPERTIES,
    ) -> HRESULT;
}
pub const DWM_SIT_DISPLAYFRAME: DWORD = 0x00000001;
extern "system" {
    pub fn DwmSetIconicThumbnail(
        hwnd: HWND,
        hbmp: HBITMAP,
        dwSITFlags: DWORD,
    ) -> HRESULT;
    pub fn DwmSetIconicLivePreviewBitmap(
        hwnd: HWND,
        hbmp: HBITMAP,
        pptClient: *mut POINT,
        dwSITFlags: DWORD,
    ) -> HRESULT;
    pub fn DwmInvalidateIconicBitmaps(
        hwnd: HWND,
    ) -> HRESULT;
    // pub fn DwmAttachMilContent(hwnd: HWND) -> HRESULT;
    // pub fn DwmDetachMilContent(hwnd: HWND) -> HRESULT;
    pub fn DwmFlush() -> HRESULT;
    // pub fn DwmGetGraphicsStreamTransformHint();
    // pub fn DwmGetGraphicsStreamClient();
    pub fn DwmGetTransportAttributes(
        pfIsRemoting: *mut BOOL,
        pfIsConnected: *mut BOOL,
        pDwGeneration: *mut DWORD,
    ) -> HRESULT;
}
ENUM!{enum DWMTRANSITION_OWNEDWINDOW_TARGET {
    DWMTRANSITION_OWNEDWINDOW_NULL = -1i32 as u32,
    DWMTRANSITION_OWNEDWINDOW_REPOSITION = 0,
}}
extern "system" {
    pub fn DwmTransitionOwnedWindow(
        hwnd: HWND,
        target: DWMTRANSITION_OWNEDWINDOW_TARGET,
    ) -> HRESULT;
}
ENUM!{enum GESTURE_TYPE {
    GT_PEN_TAP = 0,
    GT_PEN_DOUBLETAP = 1,
    GT_PEN_RIGHTTAP = 2,
    GT_PEN_PRESSANDHOLD = 3,
    GT_PEN_PRESSANDHOLDABORT = 4,
    GT_TOUCH_TAP = 5,
    GT_TOUCH_DOUBLETAP = 6,
    GT_TOUCH_RIGHTTAP = 7,
    GT_TOUCH_PRESSANDHOLD = 8,
    GT_TOUCH_PRESSANDHOLDABORT = 9,
    GT_TOUCH_PRESSANDTAP = 10,
}}
extern "system" {
    pub fn DwmRenderGesture(
        gt: GESTURE_TYPE,
        cContacts: UINT,
        pdwPointerID: *const DWORD,
        pPoints: *const POINT,
    ) -> HRESULT;
    pub fn DwmTetherContact(
        dwPointerID: DWORD,
        fEnable: BOOL,
        ptTether: POINT,
    ) -> HRESULT;
}
ENUM!{enum DWM_SHOWCONTACT {
    DWMSC_DOWN = 0x00000001,
    DWMSC_UP = 0x00000002,
    DWMSC_DRAG = 0x00000004,
    DWMSC_HOLD = 0x00000008,
    DWMSC_PENBARREL = 0x00000010,
    DWMSC_NONE = 0x00000000,
    DWMSC_ALL = 0xFFFFFFFF,
}}
extern "system" {
    pub fn DwmShowContact(
        dwPointerID: DWORD,
        eShowContact: DWM_SHOWCONTACT,
    ) -> HRESULT;
}
