From 3080ec406527bc274969f2b7a25fcefc4520ece5 Mon Sep 17 00:00:00 2001 From: DRC Date: Wed, 12 Oct 2011 20:00:55 +0000 Subject: [PATCH] Enable WinVNC build with MinGW and MinGW64 git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4723 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- CMakeLists.txt | 14 ++- common/os/CMakeLists.txt | 1 + common/os/os.h | 2 + common/os/w32tiger.c | 33 ++++++ common/os/w32tiger.h | 182 +++++++++++++++++++++++++++++++++ config.h.in | 2 + win/rfb_win32/CleanDesktop.cxx | 1 + win/wm_hooks/wm_hooks.cxx | 1 + 8 files changed, 231 insertions(+), 5 deletions(-) create mode 100644 common/os/w32tiger.c create mode 100644 common/os/w32tiger.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ebf2e539..15394d6b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,11 +66,7 @@ message(STATUS "VERSION = ${VERSION}, BUILD = ${BUILD}") add_definitions(-D__BUILD__="${BUILD}") if(NOT DEFINED BUILD_WINVNC) - if(MSVC) - set(BUILD_WINVNC 1) - else() - set(BUILD_WINVNC 0) - endif() + set(BUILD_WINVNC 1) endif() if(MSVC) @@ -168,6 +164,14 @@ if(MINGW) " -o --output-format=coff ") endif() +# MinGW64 has header support but no library support for IActiveDesktop, so we +# need to check for both the header and library and use our own implementation +# in common/os if either doesn't exist. MSVC should have both. +if(WIN32) + check_c_source_compiles("#include \n#include \n#include \nint main(int c, char** v) {IActiveDesktop iad; return 0;}" HAVE_ACTIVE_DESKTOP_H) + check_c_source_compiles("#include \n#include \n#include \nint main(int c, char** v) {GUID i = CLSID_ActiveDesktop; return 0;}" HAVE_ACTIVE_DESKTOP_L) +endif() + # X11 stuff. It's in a if() so that we can say REQUIRED if(UNIX AND NOT APPLE) find_package(X11 REQUIRED) diff --git a/common/os/CMakeLists.txt b/common/os/CMakeLists.txt index 82f11659..84c259d2 100644 --- a/common/os/CMakeLists.txt +++ b/common/os/CMakeLists.txt @@ -3,5 +3,6 @@ include_directories(${CMAKE_SOURCE_DIR}/common) add_library(os STATIC print.c net.c + w32tiger.c os.cxx tls.cxx) diff --git a/common/os/os.h b/common/os/os.h index 1847a494..f770e2b8 100644 --- a/common/os/os.h +++ b/common/os/os.h @@ -23,6 +23,8 @@ #include #endif +#include + /* * Get VNC home directory ($HOME/.vnc or %APPDATA%/vnc/). * If HOME environment variable is set then it is used. diff --git a/common/os/w32tiger.c b/common/os/w32tiger.c new file mode 100644 index 00000000..3427cf48 --- /dev/null +++ b/common/os/w32tiger.c @@ -0,0 +1,33 @@ +/* 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. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef WIN32 + +#define INITGUID +#include + +#ifndef HAVE_ACTIVE_DESKTOP_L +DEFINE_GUID(CLSID_ActiveDesktop,0x75048700L,0xEF1F,0x11D0,0x98,0x88,0x00,0x60,0x97,0xDE,0xAC,0xF9); +DEFINE_GUID(IID_IActiveDesktop,0xF490EB00L,0x1240,0x11D1,0x98,0x88,0x00,0x60,0x97,0xDE,0xAC,0xF9); +#endif + +#endif /* WIN32 */ diff --git a/common/os/w32tiger.h b/common/os/w32tiger.h new file mode 100644 index 00000000..5e0c5de2 --- /dev/null +++ b/common/os/w32tiger.h @@ -0,0 +1,182 @@ +/* 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 +#include +#include +#include +#include + + +/* 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 */ diff --git a/config.h.in b/config.h.in index 5f7a4c71..612fab7f 100644 --- a/config.h.in +++ b/config.h.in @@ -16,6 +16,8 @@ #cmakedefine HAVE_FLTK_MEDIAKEYS #cmakedefine HAVE_FLTK_FULLSCREEN #cmakedefine HAVE_FLTK_CURSOR +#cmakedefine HAVE_ACTIVE_DESKTOP_H +#cmakedefine HAVE_ACTIVE_DESKTOP_L #cmakedefine ENABLE_NLS 1 #cmakedefine HAVE_PAM diff --git a/win/rfb_win32/CleanDesktop.cxx b/win/rfb_win32/CleanDesktop.cxx index 60ea1597..43252f10 100644 --- a/win/rfb_win32/CleanDesktop.cxx +++ b/win/rfb_win32/CleanDesktop.cxx @@ -27,6 +27,7 @@ #include #include #include +#include #include #ifdef SPI_GETUIEFFECTS diff --git a/win/wm_hooks/wm_hooks.cxx b/win/wm_hooks/wm_hooks.cxx index fd01159c..61328af8 100644 --- a/win/wm_hooks/wm_hooks.cxx +++ b/win/wm_hooks/wm_hooks.cxx @@ -23,6 +23,7 @@ #include #include +#include UINT WM_HK_PingThread = RegisterWindowMessage(_T("RFB.WM_Hooks.PingThread")); -- 2.39.5