-/*
+/*
Windows PDF view helper
-Author: Joost Verburg
+Author: Uwe Stöhr and Joost Verburg
This will be installed as pdfview.exe.
The application will launch the default PDF viewer to display the PDF file,
-but works around the file locking problems of Adobe Reader.
-
-Source code of pdfopen/pdfclose is available at:
-http://magic.aladdin.cs.cmu.edu/2005/07/15/pdfopen-and-pdfclose/
+but works around the file locking problems of Adobe Reader and Acrobat.
*/
+Unicode true
+
!include LogicLib.nsh
!include FileFunc.nsh
-# Functions from FileFunc.nsh
-!insertmacro GetParameters
-!insertmacro GetFileName
-!insertmacro GetParent
-
#--------------------------------
# Settings
SilentInstall silent
#--------------------------------
-# Windows Vista settings
+# Windows Vista (and later) settings
RequestExecutionLevel user
-#--------------------------------
-# Constants
-
-!define FALSE 0
-!define TRUE 1
-
-!define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
-!define WAIT_TIMEOUT 0x00000102
-
#--------------------------------
# Variables
Var Character
-Var RunAppReturn
Var OriginalFile
Var OriginalFileName
-Var OriginalDir
Var PDFFile
+Var ViewerFileName
Var Viewer
-
-Var ChangeNotification
-Var WaitReturn
-Var LockedFile
-
-Var OriginalTimeHigh
-Var OriginalTimeLow
-Var CurrentTimeHigh
-Var CurrentTimeLow
-
-#--------------------------------
-# Macros
-
-!macro SystemCall STACK
-
- # Call a Windows API function
-
- Push `${STACK}`
- CallInstDLL "$EXEDIR\System.dll" Call
-
-!macroend
-
-!macro HideConsole COMMAND_LINE
-
- # Run an application and hide console output
-
- Push `${COMMAND_LINE}`
- CallInstDLL "$EXEDIR\Console.dll" Exec
- Pop $RunAppReturn
-
- ${If} $RunAppReturn == "error"
- MessageBox MB_OK|MB_ICONSTOP "Error opening PDF file $PDFFile."
- ${EndIf}
-
-!macroend
+Var ViewerHandle
+Var ViewerVersion
#--------------------------------
# PDF viewing
InitPluginsDir # Temporary directory for PDF file
# Command line parameters
- ${GetParameters} $OriginalFile
+ ${GetParameters} $OriginalFileName
# Trim quotes
- StrCpy $Character $OriginalFile 1
+ StrCpy $Character $OriginalFileName 1
${If} $Character == '"'
- StrCpy $OriginalFile $OriginalFile "" 1
+ StrCpy $OriginalFileName $OriginalFileName "" 1
${EndIf}
- StrCpy $Character $OriginalFile 1 -1
+ StrCpy $Character $OriginalFileName 1 -1
${If} $Character == '"'
- StrCpy $OriginalFile $OriginalFile -1
+ StrCpy $OriginalFileName $OriginalFileName -1
${EndIf}
- GetFullPathName $OriginalFile $OriginalFile
- ${GetFileName} $OriginalFile $OriginalFileName
- ${GetParent} $OriginalFile $OriginalDir
+ GetFullPathName $OriginalFile $OriginalFileName
SetOutPath $TEMP # The LyX tmpbuf should not be locked
StrCpy $PDFFile $PLUGINSDIR\$OriginalFileName
# Check whether the file will be opened with Adobe Reader or Adobe Acrobat
- !insertmacro SystemCall "shell32::FindExecutable(t '$OriginalFile', t '', t .s)"
- Call GetFileName
- Pop $Viewer
+
+ FileOpen $R0 "$PLUGINSDIR\a.pdf" "w" #create a temp pdf file with a simple name
+ FileClose $R0
+
+ #find stadard executable for "a.pdf", writes result in $0 (".r0" below)
+ System::Call "shell32::FindExecutable(t '$PLUGINSDIR\a.pdf', t '', t .r0)"
+ StrCpy $ViewerFileName $0
+ ${GetFileName} $ViewerFileName $Viewer
${If} $Viewer == ""
MessageBox MB_OK|MB_ICONEXCLAMATION "No PDF viewer is installed. \
Please install a PDF viewer such as Adobe Reader."
Quit
${EndIf}
-
- ${If} $Viewer == "AcroRd32.exe"
- ${OrIf} $Viewer == "Acrobat.exe"
+
+ ${if} $Viewer == "AcroRd32.exe"
+ ${orif} $Viewer == "AcroRd64.exe"
+ ${orif} $Viewer == "Acrobat.exe"
- # Using Adobe viewer
+ # get the version of Acrobat - currenly not necessary
+ GetDLLVersion $ViewerFileName $R0 $R1
+ IntOp $R2 $R0 >> 16
+ IntOp $R2 $R2 & 0x0000FFFF ; $R2 now contains major version
+ #IntOp $R3 $R0 & 0x0000FFFF ; $R3 now contains minor version
+ #IntOp $R4 $R1 >> 16
+ #IntOp $R4 $R4 & 0x0000FFFF ; $R4 now contains release
+ #IntOp $R5 $R1 & 0x0000FFFF ; $R5 now contains build
+ StrCpy $ViewerVersion $R2
- # Close existing view
- ${If} ${FileExists} $PDFFile
- !insertmacro HideConsole '"$EXEDIR\pdfclose.exe" --file "$PDFFile"'
- ${EndIf}
+ # check if there is a windows open containing the PDF
+ ${if} $Viewer == "AcroRd32.exe"
+ ${orif} $Viewer == "AcroRd64.exe"
+ ${if} $ViewerVersion > 14
+ FindWindow $ViewerHandle "" "$OriginalFileName - Adobe Acrobat Reader DC"
+ ${else}
+ FindWindow $ViewerHandle "" "$OriginalFileName - Adobe Reader"
+ ${endif}
+ ${elseif} $Viewer == "Acrobat.exe"
+ FindWindow $ViewerHandle "" "$OriginalFileName - Adobe Acrobat"
+ ${if} $ViewerHandle == "0"
+ FindWindow $ViewerHandle "" "$OriginalFileName - Adobe Acrobat Pro"
+ ${endif}
+ ${endif}
+ ${if} $ViewerHandle <> "0" # close the window
+ SendMessage $ViewerHandle 16 0 0
+ ${endif}
# Copy PDF to temporary file to allow LyX to overwrite the original
CopyFiles /SILENT $OriginalFile $PDFFile
# Open a new view
- !insertmacro HideConsole '"$EXEDIR\pdfopen.exe" --back --file "$PDFFile"'
-
- # Monitor for updates of the original file
- GetFileTime $OriginalFile $OriginalTimeHigh $OriginalTimeLow
- !insertmacro SystemCall "kernel32::FindFirstChangeNotification(t '$OriginalDir', \
- i 0, i ${FILE_NOTIFY_CHANGE_LAST_WRITE}) i.s"
- Pop $ChangeNotification
-
- ${Do}
-
- !insertmacro SystemCall "kernel32::WaitForSingleObject(i $ChangeNotification, i 10000) i.s"
- Pop $WaitReturn
-
- # Check whether the PDF still exists (if not, LyX is being closed)
-
- ${IfNot} ${FileExists} $LockedFile
- # Quit this application
- !insertmacro SystemCall "kernel32::FindCloseChangeNotification(i $ChangeNotification)"
- Quit
- ${EndIf}
-
- # Check whether the lock is still active (if not, Adobe Reader being closed)
-
- FileOpen $LockedFile $PDFFile a
-
- ${If} $LockedFile != ""
- # Quit this application
- FileClose $LockedFile
- Delete $PDFFile
- !insertmacro SystemCall "kernel32::FindCloseChangeNotification(i $ChangeNotification)"
- Quit
- ${EndIf}
-
- ${IfNot} $WaitReturn = ${WAIT_TIMEOUT}
- # The LyX tmpbuf has been updated
- # Check whether it's the PDF file that has been updated
-
- GetFileTime $OriginalFile $CurrentTimeHigh $CurrentTimeLow
-
- ${if} $OriginalTimeHigh != $CurrentTimeHigh
- ${orif} $OriginalTimeLow != $CurrentTimeLow
- # PDF has been modified, update view
- !insertmacro HideConsole '"$EXEDIR\pdfclose.exe" --file "$PDFFile"'
- CopyFiles /SILENT $OriginalFile $PDFFile
- !insertmacro HideConsole '"$EXEDIR\pdfopen.exe" --back --file "$PDFFile"'
-
- # Time of new file
- StrCpy $OriginalTimeHigh $CurrentTimeHigh
- StrCpy $OriginalTimeLow $CurrentTimeLow
- ${EndIf}
-
- #Monitor again
- !insertmacro SystemCall "kernel32::FindNextChangeNotification(i $ChangeNotification)"
-
- ${EndIf}
-
- ${Loop}
+ ExecWait '"$ViewerFileName" "$PDFFile"'
${Else}