]> source.dussan.org Git - tigervnc.git/commitdiff
Enable WinVNC build with MinGW and MinGW64
authorDRC <dcommander@users.sourceforge.net>
Wed, 12 Oct 2011 20:00:55 +0000 (20:00 +0000)
committerDRC <dcommander@users.sourceforge.net>
Wed, 12 Oct 2011 20:00:55 +0000 (20:00 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4723 3789f03b-4d11-0410-bbf8-ca57d06f2519

CMakeLists.txt
common/os/CMakeLists.txt
common/os/os.h
common/os/w32tiger.c [new file with mode: 0644]
common/os/w32tiger.h [new file with mode: 0644]
config.h.in
win/rfb_win32/CleanDesktop.cxx
win/wm_hooks/wm_hooks.cxx

index ebf2e5390b0fc9e4bc56dad9753a4d9600dc6e3b..15394d6bf3903974d55168e57beac23d60e8a4bb 100644 (file)
@@ -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)
     "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> --output-format=coff <SOURCE>")
 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 <windows.h>\n#include <wininet.h>\n#include <shlobj.h>\nint main(int c, char** v) {IActiveDesktop iad; return 0;}" HAVE_ACTIVE_DESKTOP_H)
+  check_c_source_compiles("#include <windows.h>\n#include <wininet.h>\n#include <shlobj.h>\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)
index 82f11659abec1006bc28aea2cf4552588d30d6b1..84c259d25c5be4ff22ab19a2d1bd42ddf3632107 100644 (file)
@@ -3,5 +3,6 @@ include_directories(${CMAKE_SOURCE_DIR}/common)
 add_library(os STATIC
   print.c
   net.c
+  w32tiger.c
   os.cxx
   tls.cxx)
index 1847a494acdb1626af563a9957aa7d3032557a96..f770e2b82796e6da9c49ae159abd577326531d13 100644 (file)
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#include <os/w32tiger.h>
+
 /*
  * 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 (file)
index 0000000..3427cf4
--- /dev/null
@@ -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 <config.h>
+#endif
+
+#ifdef WIN32 
+
+#define INITGUID
+#include <basetyps.h>
+
+#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 (file)
index 0000000..5e0c5de
--- /dev/null
@@ -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 <windows.h>
+#include <wininet.h>
+#include <shlobj.h>
+#include <shlguid.h>
+#include <wininet.h>
+
+
+/* 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 */
index 5f7a4c710cb4da721f19fc1cf40f8637e48c1040..612fab7f0b42f499b9a0aae03cc647a03952e173 100644 (file)
@@ -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
 
index 60ea1597840a9a90182412d05d82df394b8ff322..43252f1048ce4cb8b591dfcde99c9d7af240d743 100644 (file)
@@ -27,6 +27,7 @@
 #include <rfb_win32/OSVersion.h>
 #include <rfb/LogWriter.h>
 #include <rdr/Exception.h>
+#include <os/os.h>
 #include <set>
 
 #ifdef SPI_GETUIEFFECTS
index fd01159c6ee45eb28aa6ca36de3543695a79d57e..61328af8b3c665509721c48f35ccf2f36a4c3f48 100644 (file)
@@ -23,6 +23,7 @@
 #include <tchar.h>
 
 #include <wm_hooks/wm_hooks.h>
+#include <os/os.h>
 
 UINT WM_HK_PingThread = RegisterWindowMessage(_T("RFB.WM_Hooks.PingThread"));