/* Copyright (C) 2011 TigerVNC Team.  All Rights Reserved.
 *
 * This is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this software; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
 * USA.
 */

#ifndef OS_W32TIGER_H
#define OS_W32TIGER_H

#ifdef WIN32 

#include <windows.h>
#include <wininet.h>
#include <shlobj.h>
#include <shlguid.h>
#include <wininet.h>


/* Windows has different names for these */
#define strcasecmp _stricmp
#define strncasecmp _strnicmp


/* MSLLHOOKSTRUCT structure*/
#ifndef LLMHF_INJECTED
#define LLMHF_INJECTED          0x00000001
#endif


/* IActiveDesktop. As of 2011-10-12, MinGW does not define
   IActiveDesktop in any way (see tracker 2877129), while MinGW64 is
   broken: has the headers but not the lib symbols. */
#ifndef HAVE_ACTIVE_DESKTOP_H
extern const GUID CLSID_ActiveDesktop;
extern const GUID IID_IActiveDesktop;

/* IActiveDesktop::AddUrl */
#define ADDURL_SILENT		0x0001

/* IActiveDesktop::AddDesktopItemWithUI */
#define DTI_ADDUI_DEFAULT	0x00000000
#define DTI_ADDUI_DISPSUBWIZARD	0x00000001
#define DTI_ADDUI_POSITIONITEM	0x00000002

/* IActiveDesktop::ModifyDesktopItem */
#define COMP_ELEM_TYPE		0x00000001
#define COMP_ELEM_CHECKED	0x00000002
#define COMP_ELEM_DIRTY		0x00000004
#define COMP_ELEM_NOSCROLL	0x00000008
#define COMP_ELEM_POS_LEFT	0x00000010
#define COMP_ELEM_POS_TOP	0x00000020
#define COMP_ELEM_SIZE_WIDTH	0x00000040
#define COMP_ELEM_SIZE_HEIGHT	0x00000080
#define COMP_ELEM_POS_ZINDEX	0x00000100
#define COMP_ELEM_SOURCE	0x00000200
#define COMP_ELEM_FRIENDLYNAME	0x00000400
#define COMP_ELEM_SUBSCRIBEDURL	0x00000800
#define COMP_ELEM_ORIGINAL_CSI	0x00001000
#define COMP_ELEM_RESTORED_CSI	0x00002000
#define COMP_ELEM_CURITEMSTATE	0x00004000
#define COMP_ELEM_ALL		0x00007FFF /* OR-ed all COMP_ELEM_ */

/* IActiveDesktop::GetWallpaper */
#define AD_GETWP_BMP		0x00000000
#define AD_GETWP_IMAGE		0x00000001
#define AD_GETWP_LAST_APPLIED	0x00000002

/* IActiveDesktop::ApplyChanges */
#define AD_APPLY_SAVE		0x00000001
#define AD_APPLY_HTMLGEN	0x00000002
#define AD_APPLY_REFRESH	0x00000004
#define AD_APPLY_ALL		0x00000007 /* OR-ed three AD_APPLY_ above */
#define AD_APPLY_FORCE		0x00000008
#define AD_APPLY_BUFFERED_REFRESH 0x00000010
#define AD_APPLY_DYNAMICREFRESH	0x00000020

/* Structures for IActiveDesktop */
typedef struct {
	DWORD dwSize;
	int iLeft;
	int iTop;
	DWORD dwWidth;
	DWORD dwHeight;
	DWORD dwItemState;
} COMPSTATEINFO, *LPCOMPSTATEINFO;
typedef const COMPSTATEINFO *LPCCOMPSTATEINFO;

typedef struct {
	DWORD dwSize;
	int iLeft;
	int iTop;
	DWORD dwWidth;
	DWORD dwHeight;
	int izIndex;
	BOOL fCanResize;
	BOOL fCanResizeX;
	BOOL fCanResizeY;
	int iPreferredLeftPercent;
	int iPreferredTopPercent;
} COMPPOS, *LPCOMPPOS;
typedef const COMPPOS *LPCCOMPPOS;

typedef struct {
	DWORD dwSize;
	DWORD dwID;
	int iComponentType;
	BOOL fChecked;
	BOOL fDirty;
	BOOL fNoScroll;
	COMPPOS cpPos;
	WCHAR wszFriendlyName[MAX_PATH];
	WCHAR wszSource[INTERNET_MAX_URL_LENGTH];
	WCHAR wszSubscribedURL[INTERNET_MAX_URL_LENGTH];
	DWORD dwCurItemState;
	COMPSTATEINFO csiOriginal;
	COMPSTATEINFO csiRestored;
} COMPONENT, *LPCOMPONENT;
typedef const COMPONENT *LPCCOMPONENT;

typedef struct {
	DWORD dwSize;
	BOOL fEnableComponents;
	BOOL fActiveDesktop;
} COMPONENTSOPT, *LPCOMPONENTSOPT;
typedef const COMPONENTSOPT *LPCCOMPONENTSOPT;

typedef struct {
    DWORD dwSize;
    DWORD dwStyle;
} WALLPAPEROPT, *LPWALLPAPEROPT;
typedef const WALLPAPEROPT *LPCWALLPAPEROPT;

/* WALLPAPEROPT styles */
#define WPSTYLE_CENTER		0x0
#define WPSTYLE_TILE		0x1
#define WPSTYLE_STRETCH		0x2
#define WPSTYLE_MAX		0x3

/* Those two are defined in Windows 7 and newer, we don't need them now */
#if 0
#define WPSTYLE_KEEPASPECT	0x3
#define WPSTYLE_CROPTOFIT	0x4
#endif

#define INTERFACE IActiveDesktop
DECLARE_INTERFACE_(IActiveDesktop, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(AddDesktopItem)(THIS_ LPCOMPONENT,DWORD) PURE;
	STDMETHOD(AddDesktopItemWithUI)(THIS_ HWND,LPCOMPONENT,DWORD) PURE;
	STDMETHOD(AddUrl)(THIS_ HWND,LPCWSTR,LPCOMPONENT,DWORD) PURE;
	STDMETHOD(ApplyChanges)(THIS_ DWORD) PURE;
	STDMETHOD(GenerateDesktopItemHtml)(THIS_ LPCWSTR,LPCOMPONENT,DWORD) PURE;
	STDMETHOD(GetDesktopItem)(THIS_ int,LPCOMPONENT,DWORD) PURE;
	STDMETHOD(GetDesktopItemByID)(THIS_ DWORD,LPCOMPONENT,DWORD) PURE;
	STDMETHOD(GetDesktopItemBySource)(THIS_ LPCWSTR,LPCOMPONENT,DWORD) PURE;
	STDMETHOD(GetDesktopItemCount)(THIS_ LPINT,DWORD) PURE;
	STDMETHOD(GetDesktopItemOptions)(THIS_ LPCOMPONENTSOPT,DWORD) PURE;
	STDMETHOD(GetPattern)(THIS_ LPWSTR,UINT,DWORD) PURE;
	STDMETHOD(GetWallpaper)(THIS_ LPWSTR,UINT,DWORD) PURE;
	STDMETHOD(GetWallpaperOptions)(THIS_ LPWALLPAPEROPT,DWORD) PURE;
	STDMETHOD(ModifyDesktopItem)(THIS_ LPCCOMPONENT,DWORD) PURE;
	STDMETHOD(RemoveDesktopItem)(THIS_ LPCCOMPONENT,DWORD) PURE;
	STDMETHOD(SetDesktopItemOptions)(THIS_ LPCCOMPONENTSOPT,DWORD) PURE;
	STDMETHOD(SetPattern)(THIS_ LPCWSTR,DWORD) PURE;
	STDMETHOD(SetWallpaper)(THIS_ LPCWSTR,DWORD) PURE;
	STDMETHOD(SetWallpaperOptions)(THIS_ LPCWALLPAPEROPT,DWORD) PURE;
};
#undef INTERFACE
#endif /* HAVE_ACTIVE_DESKTOP_H */

#endif /* WIN32 */
#endif /* OS_W32TIGER_H */