]> git.lyx.org Git - lyx.git/blobdiff - development/Win32/pdfview/pdfview.nsi
installer: uninstall fixes
[lyx.git] / development / Win32 / pdfview / pdfview.nsi
index 1179fd8713e95582f4406f2980666b8913af780e..8bbdd470a7b362e0f7ab5120b51673204a2f4af3 100644 (file)
@@ -13,43 +13,63 @@ http://magic.aladdin.cs.cmu.edu/2005/07/15/pdfopen-and-pdfclose/
 
 */
 
-!include "LogicLib.nsh"
-!include "FileFunc.nsh"
-!insertmacro GetParameters
-!insertmacro GetFileName
+!include LogicLib.nsh
+!include FileFunc.nsh
 
-;--------------------------------
-;Settings
+#--------------------------------
+Settings
 
 Caption "PDF Viewer"
 OutFile pdfview.exe
-Icon "..\packaging\icons\lyx_32x32.ico"
+Icon "..\packaging\icons\lyx.ico"
 SilentInstall silent
 
-;--------------------------------
-;Constants
+#--------------------------------
+# Windows Vista settings
+
+RequestExecutionLevel user
+
+#--------------------------------
+# Constants
 
 !define FALSE 0
 !define TRUE 1
 
-;--------------------------------
-;Variables
+!define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
+!define WAIT_TIMEOUT 0x00000102
+
+#--------------------------------
+# Variables
+
+Var Character
+Var RunAppReturn
 
-Var Dummy
 Var OriginalFile
 Var OriginalFileName
+Var OriginalDir
+
 Var PDFFile
+Var ViewerFileName
 Var Viewer
+Var ViewerVersion
+Var DDEName
+
+Var ChangeNotification
+Var WaitReturn
+Var LockedFile
+
 Var OriginalTimeHigh
 Var OriginalTimeLow
 Var CurrentTimeHigh
 Var CurrentTimeLow
 
-;--------------------------------
-;Macros
+#--------------------------------
+Macros
 
 !macro SystemCall STACK
 
+  # Call a Windows API function
+
   Push `${STACK}`
   CallInstDLL "$EXEDIR\System.dll" Call
 
@@ -57,118 +77,148 @@ Var CurrentTimeLow
 
 !macro HideConsole COMMAND_LINE
 
+  # Run an application and hide console output
+
   Push `${COMMAND_LINE}`
   CallInstDLL "$EXEDIR\Console.dll" Exec
-  Pop $Dummy
+  Pop $RunAppReturn
   
-  ${if} $Dummy == "error"
-    MessageBox MB_OK|MB_ICONSTOP "Error opening PDF file $R0."
-  ${endif}
+  ${If} $RunAppReturn == "error"
+    MessageBox MB_OK|MB_ICONSTOP "Error opening PDF file $PDFFile."
+  ${EndIf}
 
 !macroend
 
-;--------------------------------
-;PDF vieweing
+#--------------------------------
+# PDF viewing
 
 Section "View PDF file"
 
-  InitPluginsDir ;Temporary directory for PDF file
+  InitPluginsDir Temporary directory for PDF file
 
-  ;Command line parameters
-  Call GetParameters
-  Pop $OriginalFile
+  # Command line parameters
+  ${GetParameters} $OriginalFile
 
-  ;Trim quotes
-  StrCpy $Dummy $OriginalFile 1
-  ${if} $Dummy == '"'
+  Trim quotes
+  StrCpy $Character $OriginalFile 1
+  ${If} $Character == '"'
     StrCpy $OriginalFile $OriginalFile "" 1
-  ${endif}
-  StrCpy $Dummy $OriginalFile 1 -1
-  ${if} $Dummy == '"'
+  ${EndIf}
+  StrCpy $Character $OriginalFile 1 -1
+  ${If} $Character == '"'
     StrCpy $OriginalFile $OriginalFile -1
-  ${endif}
+  ${EndIf}
 
   GetFullPathName $OriginalFile $OriginalFile
-  Push $OriginalFile
-  Call GetFileName
-  Pop $OriginalFileName
+  ${GetFileName} $OriginalFile $OriginalFileName
+  ${GetParent} $OriginalFile $OriginalDir # tmpbuf
+  ${GetParent} $OriginalDir $OriginalDir # tmpdir
 
-  SetOutPath $TEMP ;The LyX tmpbuf should not be locked
+  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
-  Push $OriginalFile
-  !insertmacro SystemCall "shell32::FindExecutable(t s, t '', t .s)"
-  Call GetFileName
-  Pop $Viewer
+  # Check whether the file will be opened with Adobe Reader or Adobe Acrobat
+  !insertmacro SystemCall "shell32::FindExecutable(t '$OriginalFile', t '', t .s)"
+  Pop $ViewerFileName
+  ${GetFileName} $ViewerFileName $Viewer
 
-  ${if} $Viewer == ""
+  ${If} $Viewer == ""
     MessageBox MB_OK|MB_ICONEXCLAMATION "No PDF viewer is installed. \
         Please install a PDF viewer such as Adobe Reader."
     Quit        
-  ${endif}
+  ${EndIf}
 
-  ${if} $Viewer == "AcroRd32.exe"
-    ${orif} $Viewer == "Acrobat.exe"
+  ${If} $Viewer == "AcroRd32.exe"
+    ${OrIf} $Viewer == "Acrobat.exe"
     
-    ;Using Adobe viewer
+    # Using Adobe viewer
+
+    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"
+
+    ${If} $ViewerVersion < 10
+      StrCpy $DDEName "AcroView"
+    ${Else}
+      ${If} $Viewer == "AcroRd32.exe"
+        StrCpy $DDEName "AcroViewR$ViewerVersion"
+      ${ElseIf} $Viewer == "Acrobat.exe"
+        StrCpy $DDEName "AcroViewA$ViewerVersion"
+      ${EndIf}
+    ${EndIf}
+
+    # Close existing view
+    ${If} ${FileExists} $PDFFile
+      !insertmacro HideConsole '"$EXEDIR\pdfclose.exe" --reader "$ViewerFileName" --ddename "$DDEName" --file "$PDFFile"'
+    ${EndIf}
     
-    ;Close existing view
-    ${if} ${fileexists} $PDFFile
-      !insertmacro HideConsole '"$EXEDIR\pdfclose.exe" --file "$PDFFile"'
-    ${endif}
-    
-    ;Copy PDF to temporary file to allow LyX to overwrite the original
+    # 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
+    # Open a new view
+    !insertmacro HideConsole '"$EXEDIR\pdfopen.exe" --reader "$ViewerFileName" --ddename "$DDEName" --back --file "$PDFFile"'
     
+    # Monitor for updates of the original file
     GetFileTime $OriginalFile $OriginalTimeHigh $OriginalTimeLow
+    !insertmacro SystemCall "kernel32::FindFirstChangeNotification(t '$OriginalDir', \
+      i 1, i ${FILE_NOTIFY_CHANGE_LAST_WRITE}) i.s"
+    Pop $ChangeNotification
     
-    ${do}
+    ${Do}
     
-      Sleep 500
+      !insertmacro SystemCall "kernel32::WaitForSingleObject(i $ChangeNotification, i 10000) i.s"
+      Pop $WaitReturn
+           
+      # Check whether the lock is still active (if not, Adobe Reader is closed)
       
-      FileOpen $Dummy $PDFFile a
+      FileOpen $LockedFile $PDFFile a
       
-      ${if} $Dummy != ""
-        ;File no longer locked, reader closed
-        FileClose $Dummy
+      ${If} $LockedFile != ""
+        # Quit this application
+        FileClose $LockedFile
         Delete $PDFFile
+        !insertmacro SystemCall "kernel32::FindCloseChangeNotification(i $ChangeNotification)"
         Quit
-      ${endif}
+      ${EndIf}
       
-      ${if} ${fileexists} $OriginalFile
+      ${IfNot} $WaitReturn = ${WAIT_TIMEOUT}
         
+        # The LyX temporary directory has been updated
+        # Check whether it's the PDF file that has been updated
+          
         GetFileTime $OriginalFile $CurrentTimeHigh $CurrentTimeLow
         
-        ${if} $OriginalTimeHigh != $CurrentTimeHigh
-          ${orif} $OriginalTimeLow != $CurrentTimeLow
-          
-          ;Original has been modified, update!
+        ${If} $OriginalTimeHigh != $CurrentTimeHigh
+          ${OrIf} $OriginalTimeLow != $CurrentTimeLow
+          # PDF has been modified, update view
+          !insertmacro HideConsole '"$EXEDIR\pdfclose.exe" --reader "$ViewerFileName" --ddename "$DDEName" --file "$PDFFile"'
+          CopyFiles /SILENT $OriginalFile $PDFFile
+          !insertmacro HideConsole '"$EXEDIR\pdfopen.exe" --reader "$ViewerFileName" --ddename "$DDEName" --back --file "$PDFFile"'
           
+          # Time of new file
           StrCpy $OriginalTimeHigh $CurrentTimeHigh
           StrCpy $OriginalTimeLow  $CurrentTimeLow
-          !insertmacro HideConsole '"$EXEDIR\pdfclose.exe" --file "$PDFFile"'
-          CopyFiles /SILENT $OriginalFile $PDFFile
-          !insertmacro HideConsole '"$EXEDIR\pdfopen.exe" --back --file "$PDFFile"'
-          
-        ${endif}
+        ${EndIf}
+        
+        #Monitor again
+        !insertmacro SystemCall "kernel32::FindNextChangeNotification(i $ChangeNotification)"
         
-      ${endif}
+      ${EndIf}
     
-    ${loop}
+    ${Loop}
     
-  ${else}
+  ${Else}
   
-    ;Another PDF viewer like GSView is used
-    ;No need for special actions, just forward to ShellExecute
+    Another PDF viewer like GSView is used
+    No need for special actions, just forward to ShellExecute
     ExecShell open $OriginalFile
     
-  ${endif}
+  ${EndIf}
     
 SectionEnd