1#if __GLASGOW_HASKELL__ >= 709
2{-# LANGUAGE Safe #-}
3#elif __GLASGOW_HASKELL__ >= 701
4{-# LANGUAGE Trustworthy #-}
5#endif
6-----------------------------------------------------------------------------
7-- |
8-- Module      :  Graphics.Win32.GDI.Clip
9-- Copyright   :  (c) Alastair Reid, 1997-2003
10-- License     :  BSD-style (see the file libraries/base/LICENSE)
11--
12-- Maintainer  :  Esa Ilari Vuokko <ei@vuokko.info>
13-- Stability   :  provisional
14-- Portability :  portable
15--
16-- A collection of FFI declarations for interfacing with Win32.
17--
18-----------------------------------------------------------------------------
19
20module Graphics.Win32.GDI.Clip where
21
22import Control.Monad
23import Graphics.Win32.GDI.Types
24import System.Win32.Types
25import Graphics.Win32.Message    ( WindowMessage )
26
27import Foreign
28
29##include "windows_cconv.h"
30
31#undef WINVER
32#define WINVER 0x0600
33#undef _WIN32_WINNT
34#define _WIN32_WINNT 0x0600
35
36#include <windows.h>
37
38type ClipboardFormat = UINT
39
40#{enum ClipboardFormat,
41 , cF_BITMAP            = CF_BITMAP
42 , cF_DIB               = CF_DIB
43 , cF_DIF               = CF_DIF
44 , cF_DSPBITMAP         = CF_DSPBITMAP
45 , cF_DSPENHMETAFILE    = CF_DSPENHMETAFILE
46 , cF_DSPMETAFILEPICT   = CF_DSPMETAFILEPICT
47 , cF_DSPTEXT           = CF_DSPTEXT
48 , cF_ENHMETAFILE       = CF_ENHMETAFILE
49 , cF_GDIOBJFIRST       = CF_GDIOBJFIRST
50 , cF_HDROP             = CF_HDROP
51 , cF_LOCALE            = CF_LOCALE
52 , cF_METAFILEPICT      = CF_METAFILEPICT
53 , cF_OEMTEXT           = CF_OEMTEXT
54 , cF_OWNERDISPLAY      = CF_OWNERDISPLAY
55 , cF_PALETTE           = CF_PALETTE
56 , cF_PENDATA           = CF_PENDATA
57 , cF_PRIVATEFIRST      = CF_PRIVATEFIRST
58 , cF_PRIVATELAST       = CF_PRIVATELAST
59 , cF_RIFF              = CF_RIFF
60 , cF_SYLK              = CF_SYLK
61 , cF_TEXT              = CF_TEXT
62 , cF_WAVE              = CF_WAVE
63 , cF_TIFF              = CF_TIFF
64 , cF_DIBV5             = CF_DIBV5
65 , cF_GDIOBJLAST        = CF_GDIOBJLAST
66 , cF_UNICODETEXT       = CF_UNICODETEXT
67 }
68
69wM_CLIPBOARDUPDATE :: WindowMessage
70wM_CLIPBOARDUPDATE = 0x031D -- #const WM_CLIPBOARDUPDATE -- Can't use constant due to GHC 7.8.x support.
71
72-- % , CF_UNICODETEXT  -- WinNT only
73
74foreign import WINDOWS_CCONV unsafe "windows.h ChangeClipboardChain"
75  changeClipboardChain :: HWND -> HWND -> IO Bool
76
77closeClipboard :: IO ()
78closeClipboard =
79  failIfFalse_ "CloseClipboard" c_CloseClipboard
80foreign import WINDOWS_CCONV unsafe "windows.h CloseClipboard"
81  c_CloseClipboard :: IO BOOL
82
83foreign import WINDOWS_CCONV unsafe "windows.h CountClipboardFormats"
84  countClipboardFormats :: IO Int
85
86emptyClipboard :: IO ()
87emptyClipboard =
88  failIfFalse_ "EmptyClipboard" c_EmptyClipboard
89foreign import WINDOWS_CCONV unsafe "windows.h EmptyClipboard"
90  c_EmptyClipboard :: IO BOOL
91
92-- original also tested GetLastError() != NO_ERROR
93
94enumClipboardFormats :: ClipboardFormat -> IO ClipboardFormat
95enumClipboardFormats format = do
96  format' <- c_EnumClipboardFormats format
97  when (format' == 0) $
98    failUnlessSuccess "EnumClipboardFormats" getLastError
99  return format'
100foreign import WINDOWS_CCONV unsafe "windows.h EnumClipboardFormats"
101  c_EnumClipboardFormats :: ClipboardFormat -> IO ClipboardFormat
102
103getClipboardData :: ClipboardFormat -> IO HANDLE
104getClipboardData format =
105  failIfNull "GetClipboardData" $ c_GetClipboardData format
106foreign import WINDOWS_CCONV unsafe "windows.h GetClipboardData"
107  c_GetClipboardData :: ClipboardFormat -> IO HANDLE
108
109getClipboardFormatName :: ClipboardFormat -> IO String
110getClipboardFormatName format =
111  allocaArray 256 $ \ c_name -> do
112  len <- failIfZero "GetClipboardFormatName" $
113    c_GetClipboardFormatName format c_name 256
114  peekTStringLen (c_name, len)
115foreign import WINDOWS_CCONV unsafe "windows.h GetClipboardFormatNameW"
116  c_GetClipboardFormatName :: ClipboardFormat -> LPTSTR -> Int -> IO Int
117
118getClipboardOwner :: IO HWND
119getClipboardOwner =
120  failIfNull "GetClipboardOwner" c_GetClipboardOwner
121foreign import WINDOWS_CCONV unsafe "windows.h GetClipboardOwner"
122  c_GetClipboardOwner :: IO HWND
123
124getClipboardViewer :: IO HWND
125getClipboardViewer =
126  failIfNull "GetClipboardViewer" c_GetClipboardViewer
127foreign import WINDOWS_CCONV unsafe "windows.h GetClipboardViewer"
128  c_GetClipboardViewer :: IO HWND
129
130getOpenClipboardWindow :: IO HWND
131getOpenClipboardWindow =
132  failIfNull "GetClipboardWindow" c_GetOpenClipboardWindow
133foreign import WINDOWS_CCONV unsafe "windows.h GetOpenClipboardWindow"
134  c_GetOpenClipboardWindow :: IO HWND
135
136getPriorityClipboardFormat :: [ClipboardFormat] -> IO Int
137getPriorityClipboardFormat formats =
138  withArray formats $ \ format_array ->
139  failIf (== -1) "GetPriorityClipboardFormat" $
140    c_GetPriorityClipboardFormat format_array (length formats)
141foreign import WINDOWS_CCONV unsafe "windows.h GetPriorityClipboardFormat"
142  c_GetPriorityClipboardFormat :: Ptr UINT -> Int -> IO Int
143
144foreign import WINDOWS_CCONV unsafe "windows.h IsClipboardFormatAvailable"
145  isClipboardFormatAvailable :: ClipboardFormat -> IO BOOL
146
147openClipboard :: HWND -> IO ()
148openClipboard wnd =
149  failIfFalse_ "OpenClipboard" $ c_OpenClipboard wnd
150foreign import WINDOWS_CCONV unsafe "windows.h OpenClipboard"
151  c_OpenClipboard :: HWND -> IO BOOL
152
153registerClipboardFormat :: String -> IO ClipboardFormat
154registerClipboardFormat name =
155  withTString name $ \ c_name ->
156  failIfZero "RegisterClipboardFormat" $
157    c_RegisterClipboardFormat c_name
158foreign import WINDOWS_CCONV unsafe "windows.h RegisterClipboardFormatW"
159  c_RegisterClipboardFormat :: LPCTSTR -> IO ClipboardFormat
160
161setClipboardData :: ClipboardFormat -> HANDLE -> IO HANDLE
162setClipboardData format mem =
163  failIfNull "SetClipboardData" $ c_SetClipboardData format mem
164foreign import WINDOWS_CCONV unsafe "windows.h SetClipboardData"
165  c_SetClipboardData :: ClipboardFormat -> HANDLE -> IO HANDLE
166
167setClipboardViewer :: HWND -> IO HWND
168setClipboardViewer wnd =
169  failIfNull "SetClipboardViewer" $ c_SetClipboardViewer wnd
170foreign import WINDOWS_CCONV unsafe "windows.h SetClipboardViewer"
171  c_SetClipboardViewer :: HWND -> IO HWND
172