aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt14
-rw-r--r--common/os/CMakeLists.txt1
-rw-r--r--common/os/os.h2
-rw-r--r--common/os/w32tiger.c33
-rw-r--r--common/os/w32tiger.h182
-rw-r--r--config.h.in2
-rw-r--r--win/rfb_win32/CleanDesktop.cxx1
-rw-r--r--win/wm_hooks/wm_hooks.cxx1
8 files changed, 231 insertions, 5 deletions
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)
"<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)
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 <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
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 <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
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 <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 */
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 <rfb_win32/OSVersion.h>
#include <rfb/LogWriter.h>
#include <rdr/Exception.h>
+#include <os/os.h>
#include <set>
#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 <tchar.h>
#include <wm_hooks/wm_hooks.h>
+#include <os/os.h>
UINT WM_HK_PingThread = RegisterWindowMessage(_T("RFB.WM_Hooks.PingThread"));