It doesn't work very well so it shouldn't be included by default.tags/v1.10.90
export PATH=/C/tools/msys64/mingw64/bin:$PATH | export PATH=/C/tools/msys64/mingw64/bin:$PATH | ||||
export MAKE=mingw32-make # so that Autotools can find it | export MAKE=mingw32-make # so that Autotools can find it | ||||
script: | script: | ||||
- cmake -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=mingw32-make -DCMAKE_C_COMPILER=gcc -DCMAKE=CXX_COMPILER=g++ . && mingw32-make && mingw32-make installer | |||||
- cmake -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=mingw32-make -DCMAKE_C_COMPILER=gcc -DCMAKE=CXX_COMPILER=g++ . && mingw32-make && mingw32-make installer winvnc_installer | |||||
before_cache: | before_cache: | ||||
- |- | - |- | ||||
# https://unix.stackexchange.com/a/137322/107554 | # https://unix.stackexchange.com/a/137322/107554 |
if(WIN32) | if(WIN32) | ||||
if(CMAKE_SIZEOF_VOID_P MATCHES 8) | if(CMAKE_SIZEOF_VOID_P MATCHES 8) | ||||
set(INST_NAME ${CMAKE_PROJECT_NAME}64-${VERSION}) | |||||
set(INST_SUFFIX 64) | |||||
set(INST_DEFS -DWIN64) | set(INST_DEFS -DWIN64) | ||||
else() | |||||
set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}) | |||||
endif() | |||||
set(INST_DEPS vncviewer) | |||||
if(BUILD_WINVNC) | |||||
set(INST_DEFS ${INST_DEFS} -DBUILD_WINVNC) | |||||
if(BUILD_JAVA) | |||||
set(INST_DEPS ${INST_DEPS} java) | |||||
endif() | |||||
set(INST_DEPS ${INST_DEPS} winvnc4 wm_hooks vncconfig) | |||||
endif() | endif() | ||||
configure_file(tigervnc.iss.in tigervnc.iss) | configure_file(tigervnc.iss.in tigervnc.iss) | ||||
add_custom_target(installer | add_custom_target(installer | ||||
iscc -o. ${INST_DEFS} -F${INST_NAME} tigervnc.iss | |||||
DEPENDS ${INST_DEPS} | |||||
iscc -o. ${INST_DEFS} -F${CMAKE_PROJECT_NAME}${INST_SUFFIX}-${VERSION} tigervnc.iss | |||||
DEPENDS vncviewer | |||||
SOURCES tigervnc.iss) | SOURCES tigervnc.iss) | ||||
if(BUILD_WINVNC) | |||||
configure_file(winvnc.iss.in winvnc.iss) | |||||
add_custom_target(winvnc_installer | |||||
iscc -o. ${INST_DEFS} -F${CMAKE_PROJECT_NAME}${INST_SUFFIX}-winvnc-${VERSION} winvnc.iss | |||||
DEPENDS winvnc4 wm_hooks vncconfig | |||||
SOURCES winvnc.iss) | |||||
endif() | |||||
endif() # WIN32 | endif() # WIN32 | ||||
#endif | #endif | ||||
LicenseFile=@CMAKE_SOURCE_DIR@\LICENCE.txt | LicenseFile=@CMAKE_SOURCE_DIR@\LICENCE.txt | ||||
[Dirs] | |||||
; This directory is necessary to prevent the X509 file chooser from causing | |||||
; an error dialog to appear when GetOpenFileName is called by SYSTEM account. | |||||
Name: "{sys}\config\systemprofile\Desktop" | |||||
[Files] | [Files] | ||||
#ifdef BUILD_WINVNC | |||||
Source: "@CMAKE_BINARY_DIR@\win\winvnc\winvnc4.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace; | |||||
Source: "@CMAKE_BINARY_DIR@\win\wm_hooks\wm_hooks.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace; | |||||
Source: "@CMAKE_BINARY_DIR@\win\vncconfig\vncconfig.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace; | |||||
#endif | |||||
Source: "@CMAKE_BINARY_DIR@\vncviewer\vncviewer.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace; | Source: "@CMAKE_BINARY_DIR@\vncviewer\vncviewer.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace; | ||||
Source: "@CMAKE_SOURCE_DIR@\README.rst"; DestDir: "{app}"; Flags: ignoreversion | Source: "@CMAKE_SOURCE_DIR@\README.rst"; DestDir: "{app}"; Flags: ignoreversion | ||||
Source: "@CMAKE_SOURCE_DIR@\LICENCE.TXT"; DestDir: "{app}"; Flags: ignoreversion | Source: "@CMAKE_SOURCE_DIR@\LICENCE.TXT"; DestDir: "{app}"; Flags: ignoreversion | ||||
[Icons] | [Icons] | ||||
Name: "{group}\TigerVNC Viewer"; FileName: "{app}\vncviewer.exe"; | Name: "{group}\TigerVNC Viewer"; FileName: "{app}\vncviewer.exe"; | ||||
Name: "{group}\Listening TigerVNC Viewer"; FileName: "{app}\vncviewer.exe"; Parameters: "-listen"; | Name: "{group}\Listening TigerVNC Viewer"; FileName: "{app}\vncviewer.exe"; Parameters: "-listen"; | ||||
#ifdef BUILD_WINVNC | |||||
Name: "{group}\VNC Server (User-Mode)\Run VNC Server"; FileName: "{app}\winvnc4.exe"; Parameters: "-noconsole"; | |||||
Name: "{group}\VNC Server (User-Mode)\Configure VNC Server"; FileName: "{app}\vncconfig.exe"; Parameters: "-user"; | |||||
Name: "{group}\VNC Server (Service-Mode)\Configure VNC Service"; FileName: "{app}\vncconfig.exe"; Parameters: "-noconsole -service"; | |||||
Name: "{group}\VNC Server (Service-Mode)\Register VNC Service"; FileName: "{app}\winvnc4.exe"; Parameters: "-register"; | |||||
Name: "{group}\VNC Server (Service-Mode)\Unregister VNC Service"; FileName: "{app}\winvnc4.exe"; Parameters: "-unregister"; | |||||
Name: "{group}\VNC Server (Service-Mode)\Start VNC Service"; FileName: "{app}\winvnc4.exe"; Parameters: "-noconsole -start"; | |||||
Name: "{group}\VNC Server (Service-Mode)\Stop VNC Service"; FileName: "{app}\winvnc4.exe"; Parameters: "-noconsole -stop"; | |||||
#endif | |||||
Name: "{group}\License"; FileName: "write.exe"; Parameters: "LICENCE.TXT"; WorkingDir: "{app}"; Flags: "useapppaths" | Name: "{group}\License"; FileName: "write.exe"; Parameters: "LICENCE.TXT"; WorkingDir: "{app}"; Flags: "useapppaths" | ||||
Name: "{group}\Read Me"; FileName: "write.exe"; Parameters: "README.rst"; WorkingDir: "{app}"; Flags: "useapppaths" | Name: "{group}\Read Me"; FileName: "write.exe"; Parameters: "README.rst"; WorkingDir: "{app}"; Flags: "useapppaths" | ||||
Name: "{group}\Uninstall TigerVNC"; FileName: "{uninstallexe}"; WorkingDir: "{app}"; | Name: "{group}\Uninstall TigerVNC"; FileName: "{uninstallexe}"; WorkingDir: "{app}"; | ||||
#ifdef BUILD_WINVNC | |||||
[Tasks] | |||||
Name: installservice; Description: "&Register new TigerVNC Server as a system service"; GroupDescription: "Server configuration:"; | |||||
Name: startservice; Description: "&Start or restart TigerVNC service"; GroupDescription: "Server configuration:"; | |||||
[Run] | |||||
Filename: "{app}\winvnc4.exe"; Parameters: "-register"; Tasks: installservice | |||||
Filename: "net"; Parameters: "start winvnc4"; Tasks: startservice | |||||
#endif | |||||
#ifdef BUILD_WINVNC | |||||
[Code] | |||||
{--- IShellLink ---} | |||||
const | |||||
CLSID_ShellLink = '{00021401-0000-0000-C000-000000000046}'; | |||||
SLDF_RUNAS_USER = $2000; | |||||
type | |||||
IShellLinkW = interface(IUnknown) | |||||
'{000214F9-0000-0000-C000-000000000046}' | |||||
procedure Dummy; | |||||
procedure Dummy2; | |||||
procedure Dummy3; | |||||
function GetDescription(pszName: String; cchMaxName: Integer): HResult; | |||||
function SetDescription(pszName: String): HResult; | |||||
function GetWorkingDirectory(pszDir: String; cchMaxPath: Integer): HResult; | |||||
function SetWorkingDirectory(pszDir: String): HResult; | |||||
function GetArguments(pszArgs: String; cchMaxPath: Integer): HResult; | |||||
function SetArguments(pszArgs: String): HResult; | |||||
function GetHotkey(var pwHotkey: Word): HResult; | |||||
function SetHotkey(wHotkey: Word): HResult; | |||||
function GetShowCmd(out piShowCmd: Integer): HResult; | |||||
function SetShowCmd(iShowCmd: Integer): HResult; | |||||
function GetIconLocation(pszIconPath: String; cchIconPath: Integer; | |||||
out piIcon: Integer): HResult; | |||||
function SetIconLocation(pszIconPath: String; iIcon: Integer): HResult; | |||||
function SetRelativePath(pszPathRel: String; dwReserved: DWORD): HResult; | |||||
function Resolve(Wnd: HWND; fFlags: DWORD): HResult; | |||||
function SetPath(pszFile: String): HResult; | |||||
end; | |||||
IShellLinkDataList = interface(IUnknown) | |||||
'{45E2B4AE-B1C3-11D0-B92F-00A0C90312E1}' | |||||
function AddDataBlock(pDataBlock : DWORD) : HResult; | |||||
function CopyDataBlock(dwSig : DWORD; var ppDataBlock : DWORD) : HResult; | |||||
function RemoveDataBlock(dwSig : DWORD) : HResult; | |||||
function GetFlags(var pdwFlags : DWORD) : HResult; | |||||
function SetFlags(dwFlags : DWORD) : HResult; | |||||
end; | |||||
IPersist = interface(IUnknown) | |||||
'{0000010C-0000-0000-C000-000000000046}' | |||||
function GetClassID(var classID: TGUID): HResult; | |||||
end; | |||||
IPersistFile = interface(IPersist) | |||||
'{0000010B-0000-0000-C000-000000000046}' | |||||
function IsDirty: HResult; | |||||
function Load(pszFileName: String; dwMode: Longint): HResult; | |||||
function Save(pszFileName: String; fRemember: BOOL): HResult; | |||||
function SaveCompleted(pszFileName: String): HResult; | |||||
function GetCurFile(out pszFileName: String): HResult; | |||||
end; | |||||
var | |||||
OSVersion: TWindowsVersion; | |||||
function InitializeSetup: Boolean; | |||||
begin | |||||
GetWindowsVersionEx(OSVersion); | |||||
Result := True; | |||||
end; | |||||
procedure SetRunAsUserFlag(Path: String); | |||||
var | |||||
Obj: IUnknown; | |||||
SL: IShellLinkW; | |||||
SDL: IShellLinkDataList; | |||||
PF: IPersistFile; | |||||
Flags: DWord; | |||||
begin | |||||
Obj := CreateComObject(StringToGuid(CLSID_ShellLink)); | |||||
SL := IShellLinkW(Obj); | |||||
PF := IPersistFile(Obj); | |||||
SDL := IShellLinkDataList(Obj); | |||||
Path := ExpandConstant(Path); | |||||
OleCheck(PF.Load(Path, 0)); | |||||
OleCheck(SDL.GetFlags(Flags)); | |||||
OleCheck(SDL.SetFlags(Flags or SLDF_RUNAS_USER)); | |||||
OleCheck(PF.Save(Path, True)); | |||||
end; | |||||
procedure CurStepChanged(CurStep: TSetupStep); | |||||
var | |||||
Flags: DWord; | |||||
begin | |||||
{ Post-install actions on Windows Vista and higher: | |||||
o Modify Service-Mode start menu commands so they run as administrator. | |||||
o Set up the SoftwareSASGeneration system policy so as to allow services to simulate Ctrl+Alt+Del. } | |||||
if (CurStep = ssPostInstall) and (OSVersion.Major >= 6) then begin | |||||
SetRunAsUserFlag('{group}\VNC Server (Service-Mode)\Configure VNC Service.lnk'); | |||||
SetRunAsUserFlag('{group}\VNC Server (Service-Mode)\Register VNC Service.lnk'); | |||||
SetRunAsUserFlag('{group}\VNC Server (Service-Mode)\Unregister VNC Service.lnk'); | |||||
SetRunAsUserFlag('{group}\VNC Server (Service-Mode)\Start VNC Service.lnk'); | |||||
SetRunAsUserFlag('{group}\VNC Server (Service-Mode)\Stop VNC Service.lnk'); | |||||
if not RegQueryDWordValue( | |||||
HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System', | |||||
'SoftwareSASGeneration', Flags | |||||
) then Flags := 0; | |||||
RegWriteDWordValue( | |||||
HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System', | |||||
'SoftwareSASGeneration', Flags or 1 | |||||
); | |||||
end; | |||||
end; | |||||
#endif |
[Setup] | |||||
#ifdef WIN64 | |||||
ArchitecturesInstallIn64BitMode=x64 | |||||
AppName=TigerVNC Server 64-bit | |||||
AppVerName=TigerVNC Server 64-bit @VERSION@ (@BUILD@) | |||||
#else | |||||
AppName=TigerVNC Server | |||||
AppVerName=TigerVNC Server v@VERSION@ (@BUILD@) | |||||
#endif | |||||
AppVersion=@VERSION@ | |||||
AppPublisher=TigerVNC project | |||||
AppPublisherURL=https://tigervnc.org | |||||
DefaultDirName={pf}\TigerVNC Server | |||||
#ifdef WIN64 | |||||
DefaultGroupName=TigerVNC Server 64-bit | |||||
#else | |||||
DefaultGroupName=TigerVNC Server | |||||
#endif | |||||
LicenseFile=@CMAKE_SOURCE_DIR@\LICENCE.txt | |||||
[Dirs] | |||||
; This directory is necessary to prevent the X509 file chooser from causing | |||||
; an error dialog to appear when GetOpenFileName is called by SYSTEM account. | |||||
Name: "{sys}\config\systemprofile\Desktop" | |||||
[Files] | |||||
Source: "@CMAKE_BINARY_DIR@\win\winvnc\winvnc4.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace; | |||||
Source: "@CMAKE_BINARY_DIR@\win\wm_hooks\wm_hooks.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace; | |||||
Source: "@CMAKE_BINARY_DIR@\win\vncconfig\vncconfig.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace; | |||||
Source: "@CMAKE_SOURCE_DIR@\README.rst"; DestDir: "{app}"; Flags: ignoreversion | |||||
Source: "@CMAKE_SOURCE_DIR@\LICENCE.TXT"; DestDir: "{app}"; Flags: ignoreversion | |||||
[Icons] | |||||
Name: "{group}\VNC Server (User-Mode)\Run VNC Server"; FileName: "{app}\winvnc4.exe"; Parameters: "-noconsole"; | |||||
Name: "{group}\VNC Server (User-Mode)\Configure VNC Server"; FileName: "{app}\vncconfig.exe"; Parameters: "-user"; | |||||
Name: "{group}\VNC Server (Service-Mode)\Configure VNC Service"; FileName: "{app}\vncconfig.exe"; Parameters: "-noconsole -service"; | |||||
Name: "{group}\VNC Server (Service-Mode)\Register VNC Service"; FileName: "{app}\winvnc4.exe"; Parameters: "-register"; | |||||
Name: "{group}\VNC Server (Service-Mode)\Unregister VNC Service"; FileName: "{app}\winvnc4.exe"; Parameters: "-unregister"; | |||||
Name: "{group}\VNC Server (Service-Mode)\Start VNC Service"; FileName: "{app}\winvnc4.exe"; Parameters: "-noconsole -start"; | |||||
Name: "{group}\VNC Server (Service-Mode)\Stop VNC Service"; FileName: "{app}\winvnc4.exe"; Parameters: "-noconsole -stop"; | |||||
Name: "{group}\License"; FileName: "write.exe"; Parameters: "LICENCE.TXT"; WorkingDir: "{app}"; Flags: "useapppaths" | |||||
Name: "{group}\Read Me"; FileName: "write.exe"; Parameters: "README.rst"; WorkingDir: "{app}"; Flags: "useapppaths" | |||||
Name: "{group}\Uninstall TigerVNC Server"; FileName: "{uninstallexe}"; WorkingDir: "{app}"; | |||||
[Tasks] | |||||
Name: installservice; Description: "&Register new TigerVNC Server as a system service"; GroupDescription: "Server configuration:"; | |||||
Name: startservice; Description: "&Start or restart TigerVNC service"; GroupDescription: "Server configuration:"; | |||||
[Run] | |||||
Filename: "{app}\winvnc4.exe"; Parameters: "-register"; Tasks: installservice | |||||
Filename: "net"; Parameters: "start winvnc4"; Tasks: startservice | |||||
[Code] | |||||
{--- IShellLink ---} | |||||
const | |||||
CLSID_ShellLink = '{00021401-0000-0000-C000-000000000046}'; | |||||
SLDF_RUNAS_USER = $2000; | |||||
type | |||||
IShellLinkW = interface(IUnknown) | |||||
'{000214F9-0000-0000-C000-000000000046}' | |||||
procedure Dummy; | |||||
procedure Dummy2; | |||||
procedure Dummy3; | |||||
function GetDescription(pszName: String; cchMaxName: Integer): HResult; | |||||
function SetDescription(pszName: String): HResult; | |||||
function GetWorkingDirectory(pszDir: String; cchMaxPath: Integer): HResult; | |||||
function SetWorkingDirectory(pszDir: String): HResult; | |||||
function GetArguments(pszArgs: String; cchMaxPath: Integer): HResult; | |||||
function SetArguments(pszArgs: String): HResult; | |||||
function GetHotkey(var pwHotkey: Word): HResult; | |||||
function SetHotkey(wHotkey: Word): HResult; | |||||
function GetShowCmd(out piShowCmd: Integer): HResult; | |||||
function SetShowCmd(iShowCmd: Integer): HResult; | |||||
function GetIconLocation(pszIconPath: String; cchIconPath: Integer; | |||||
out piIcon: Integer): HResult; | |||||
function SetIconLocation(pszIconPath: String; iIcon: Integer): HResult; | |||||
function SetRelativePath(pszPathRel: String; dwReserved: DWORD): HResult; | |||||
function Resolve(Wnd: HWND; fFlags: DWORD): HResult; | |||||
function SetPath(pszFile: String): HResult; | |||||
end; | |||||
IShellLinkDataList = interface(IUnknown) | |||||
'{45E2B4AE-B1C3-11D0-B92F-00A0C90312E1}' | |||||
function AddDataBlock(pDataBlock : DWORD) : HResult; | |||||
function CopyDataBlock(dwSig : DWORD; var ppDataBlock : DWORD) : HResult; | |||||
function RemoveDataBlock(dwSig : DWORD) : HResult; | |||||
function GetFlags(var pdwFlags : DWORD) : HResult; | |||||
function SetFlags(dwFlags : DWORD) : HResult; | |||||
end; | |||||
IPersist = interface(IUnknown) | |||||
'{0000010C-0000-0000-C000-000000000046}' | |||||
function GetClassID(var classID: TGUID): HResult; | |||||
end; | |||||
IPersistFile = interface(IPersist) | |||||
'{0000010B-0000-0000-C000-000000000046}' | |||||
function IsDirty: HResult; | |||||
function Load(pszFileName: String; dwMode: Longint): HResult; | |||||
function Save(pszFileName: String; fRemember: BOOL): HResult; | |||||
function SaveCompleted(pszFileName: String): HResult; | |||||
function GetCurFile(out pszFileName: String): HResult; | |||||
end; | |||||
var | |||||
OSVersion: TWindowsVersion; | |||||
function InitializeSetup: Boolean; | |||||
begin | |||||
GetWindowsVersionEx(OSVersion); | |||||
Result := True; | |||||
end; | |||||
procedure SetRunAsUserFlag(Path: String); | |||||
var | |||||
Obj: IUnknown; | |||||
SL: IShellLinkW; | |||||
SDL: IShellLinkDataList; | |||||
PF: IPersistFile; | |||||
Flags: DWord; | |||||
begin | |||||
Obj := CreateComObject(StringToGuid(CLSID_ShellLink)); | |||||
SL := IShellLinkW(Obj); | |||||
PF := IPersistFile(Obj); | |||||
SDL := IShellLinkDataList(Obj); | |||||
Path := ExpandConstant(Path); | |||||
OleCheck(PF.Load(Path, 0)); | |||||
OleCheck(SDL.GetFlags(Flags)); | |||||
OleCheck(SDL.SetFlags(Flags or SLDF_RUNAS_USER)); | |||||
OleCheck(PF.Save(Path, True)); | |||||
end; | |||||
procedure CurStepChanged(CurStep: TSetupStep); | |||||
var | |||||
Flags: DWord; | |||||
begin | |||||
{ Post-install actions on Windows Vista and higher: | |||||
o Modify Service-Mode start menu commands so they run as administrator. | |||||
o Set up the SoftwareSASGeneration system policy so as to allow services to simulate Ctrl+Alt+Del. } | |||||
if (CurStep = ssPostInstall) and (OSVersion.Major >= 6) then begin | |||||
SetRunAsUserFlag('{group}\VNC Server (Service-Mode)\Configure VNC Service.lnk'); | |||||
SetRunAsUserFlag('{group}\VNC Server (Service-Mode)\Register VNC Service.lnk'); | |||||
SetRunAsUserFlag('{group}\VNC Server (Service-Mode)\Unregister VNC Service.lnk'); | |||||
SetRunAsUserFlag('{group}\VNC Server (Service-Mode)\Start VNC Service.lnk'); | |||||
SetRunAsUserFlag('{group}\VNC Server (Service-Mode)\Stop VNC Service.lnk'); | |||||
if not RegQueryDWordValue( | |||||
HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System', | |||||
'SoftwareSASGeneration', Flags | |||||
) then Flags := 0; | |||||
RegWriteDWordValue( | |||||
HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System', | |||||
'SoftwareSASGeneration', Flags or 1 | |||||
); | |||||
end; | |||||
end; |