{-# LINE 1 "libraries\\Win32\\Graphics\\Win32\\Window\\HotKey.hsc" #-}
{-# LANGUAGE CPP #-}
{- |
   Module      :  Graphics.Win32.Window.HotKey
   Copyright   :  2013 shelarcy
   License     :  BSD-style

   Maintainer  :  shelarcy@gmail.com
   Stability   :  Provisional
   Portability :  Non-portable (Win32 API)

   An FFI binding to the hot key part of the Win32 API.
-}
module Graphics.Win32.Window.HotKey where

import Data.Bits                 ( (.|.) )
import Graphics.Win32.GDI.Types  ( HWND, MbHWND )
import Graphics.Win32.Key        ( VKey )
import Graphics.Win32.Message    ( WindowMessage )
import System.Win32.Types        ( UINT, BOOL, maybePtr, failIfFalse_ )
import System.Win32.Exception.Unsupported ( unsupportedVal, upgradeWindowsOS )
import System.Win32.Info.Version ( is7OrLater )


#include "windows_cconv.h"

type FsModifiers = [FsModifier]
type FsModifier  = UINT

mOD_ALT       :: FsModifier
mOD_ALT       =  1
mOD_CONTROL   :: FsModifier
mOD_CONTROL   =  2
mOD_SHIFT     :: FsModifier
mOD_SHIFT     =  4
mOD_WIN       :: FsModifier
mOD_WIN       =  8

{-# LINE 35 "libraries\\Win32\\Graphics\\Win32\\Window\\HotKey.hsc" #-}

-- | This parameter requires to use Windows 7 or later.

mOD_NOREPEAT :: FsModifier
mOD_NOREPEAT
  = unsupportedVal "MOD_NOREPEAT"
      is7OrLater (upgradeWindowsOS "Windows 7") 0x4000
{-
 , mOD_NOREPEAT = MOD_NOREPEAT
-}

wM_HOTKEY :: WindowMessage
wM_HOTKEY = 786
{-# LINE 47 "libraries\\Win32\\Graphics\\Win32\\Window\\HotKey.hsc" #-}

joinModifiers :: FsModifiers -> FsModifier
joinModifiers = foldr (.|.) 0

registerHotKey :: MbHWND -> Int -> FsModifier -> VKey -> IO ()
registerHotKey mb_wnd kid md vkey =
  failIfFalse_ (unwords ["RegisterHotKey", show mb_wnd, show kid, show md, show vkey])
    $ c_RegisterHotKey (maybePtr mb_wnd) kid md vkey

foreign import WINDOWS_CCONV "windows.h RegisterHotKey"
  c_RegisterHotKey :: HWND -> Int -> UINT -> VKey -> IO BOOL

unregisterHotKey :: MbHWND -> Int -> IO ()
unregisterHotKey mb_wnd kid =
  failIfFalse_ (unwords ["UnregisterHotKey", show mb_wnd, show kid])
    $ c_UnregisterHotKey (maybePtr mb_wnd) kid

foreign import WINDOWS_CCONV "windows.h UnregisterHotKey"
  c_UnregisterHotKey :: HWND -> Int -> IO BOOL