From 93950f7962c22f8a535fef85cf57824b62d74e6f Mon Sep 17 00:00:00 2001 From: Mathieu Albinet Date: Sat, 16 Feb 2013 00:37:26 +0000 Subject: [PATCH] Windows: Add .vik file extension association option in the installer --- win32/installer/FileAssociation.nsh | 190 +++++++++++++++++++++++ win32/installer/langmacros.nsh | 2 + win32/installer/translations/english.nsh | 2 + win32/installer/translations/french.nsh | 2 + win32/installer/translations/spanish.nsh | 4 +- win32/installer/viking-installer.nsi | 20 ++- 6 files changed, 211 insertions(+), 9 deletions(-) create mode 100644 win32/installer/FileAssociation.nsh diff --git a/win32/installer/FileAssociation.nsh b/win32/installer/FileAssociation.nsh new file mode 100644 index 00000000..223aa702 --- /dev/null +++ b/win32/installer/FileAssociation.nsh @@ -0,0 +1,190 @@ +/* +_____________________________________________________________________________ + + File Association +_____________________________________________________________________________ + + Based on code taken from http://nsis.sourceforge.net/File_Association + + Usage in script: + 1. !include "FileAssociation.nsh" + 2. [Section|Function] + ${FileAssociationFunction} "Param1" "Param2" "..." $var + [SectionEnd|FunctionEnd] + + FileAssociationFunction=[RegisterExtension|UnRegisterExtension] + +_____________________________________________________________________________ + + ${RegisterExtension} "[executable]" "[extension]" "[description]" + +"[executable]" ; executable which opens the file format + ; +"[extension]" ; extension, which represents the file format to open + ; +"[description]" ; description for the extension. This will be display in Windows Explorer. + ; + + + ${UnRegisterExtension} "[extension]" "[description]" + +"[extension]" ; extension, which represents the file format to open + ; +"[description]" ; description for the extension. This will be display in Windows Explorer. + ; + +_____________________________________________________________________________ + + Macros +_____________________________________________________________________________ + + Change log window verbosity (default: 3=no script) + + Example: + !include "FileAssociation.nsh" + !insertmacro RegisterExtension + ${FileAssociation_VERBOSE} 4 # all verbosity + !insertmacro UnRegisterExtension + ${FileAssociation_VERBOSE} 3 # no script +*/ + + +!ifndef FileAssociation_INCLUDED +!define FileAssociation_INCLUDED + +!include Util.nsh + +!verbose push +!verbose 3 +!ifndef _FileAssociation_VERBOSE + !define _FileAssociation_VERBOSE 3 +!endif +!verbose ${_FileAssociation_VERBOSE} +!define FileAssociation_VERBOSE `!insertmacro FileAssociation_VERBOSE` +!verbose pop + +!macro FileAssociation_VERBOSE _VERBOSE + !verbose push + !verbose 3 + !undef _FileAssociation_VERBOSE + !define _FileAssociation_VERBOSE ${_VERBOSE} + !verbose pop +!macroend + + + +!macro RegisterExtensionCall _EXECUTABLE _EXTENSION _DESCRIPTION + !verbose push + !verbose ${_FileAssociation_VERBOSE} + Push `${_DESCRIPTION}` + Push `${_EXTENSION}` + Push `${_EXECUTABLE}` + ${CallArtificialFunction} RegisterExtension_ + !verbose pop +!macroend + +!macro UnRegisterExtensionCall _EXTENSION _DESCRIPTION + !verbose push + !verbose ${_FileAssociation_VERBOSE} + Push `${_EXTENSION}` + Push `${_DESCRIPTION}` + ${CallArtificialFunction} UnRegisterExtension_ + !verbose pop +!macroend + + + +!define RegisterExtension `!insertmacro RegisterExtensionCall` +!define un.RegisterExtension `!insertmacro RegisterExtensionCall` + +!macro RegisterExtension +!macroend + +!macro un.RegisterExtension +!macroend + +!macro RegisterExtension_ + !verbose push + !verbose ${_FileAssociation_VERBOSE} + + Exch $R2 ;exe + Exch + Exch $R1 ;ext + Exch + Exch 2 + Exch $R0 ;desc + Exch 2 + Push $0 + Push $1 + + ReadRegStr $1 HKCR $R1 "" ; read current file association + StrCmp "$1" "" NoBackup ; is it empty + StrCmp "$1" "$R0" NoBackup ; is it our own + WriteRegStr HKCR $R1 "backup_val" "$1" ; backup current value +NoBackup: + WriteRegStr HKCR $R1 "" "$R0" ; set our file association + + ReadRegStr $0 HKCR $R0 "" + StrCmp $0 "" 0 Skip + WriteRegStr HKCR "$R0" "" "$R0" + WriteRegStr HKCR "$R0\shell" "" "open" + WriteRegStr HKCR "$R0\DefaultIcon" "" "$R2,0" +Skip: + WriteRegStr HKCR "$R0\shell\open\command" "" '"$R2" "%1"' + WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0" + WriteRegStr HKCR "$R0\shell\edit\command" "" '"$R2" "%1"' + + Pop $1 + Pop $0 + Pop $R2 + Pop $R1 + Pop $R0 + + !verbose pop +!macroend + + + +!define UnRegisterExtension `!insertmacro UnRegisterExtensionCall` +!define un.UnRegisterExtension `!insertmacro UnRegisterExtensionCall` + +!macro UnRegisterExtension +!macroend + +!macro un.UnRegisterExtension +!macroend + +!macro UnRegisterExtension_ + !verbose push + !verbose ${_FileAssociation_VERBOSE} + + Exch $R1 ;desc + Exch + Exch $R0 ;ext + Exch + Push $0 + Push $1 + + ReadRegStr $1 HKCR $R0 "" + StrCmp $1 $R1 0 NoOwn ; only do this if we own it + ReadRegStr $1 HKCR $R0 "backup_val" + StrCmp $1 "" 0 Restore ; if backup="" then delete the whole key + DeleteRegKey HKCR $R0 + Goto NoOwn + +Restore: + WriteRegStr HKCR $R0 "" $1 + DeleteRegValue HKCR $R0 "backup_val" + DeleteRegKey HKCR $R1 ;Delete key with association name settings + +NoOwn: + + Pop $1 + Pop $0 + Pop $R1 + Pop $R0 + + !verbose pop +!macroend + +!endif # !FileAssociation_INCLUDED diff --git a/win32/installer/langmacros.nsh b/win32/installer/langmacros.nsh index 509d1e70..70cee956 100644 --- a/win32/installer/langmacros.nsh +++ b/win32/installer/langmacros.nsh @@ -41,10 +41,12 @@ !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_SHORTCUTS_SECTION_TITLE ${CUR_LANG} !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_DESKTOP_SHORTCUT_SECTION_TITLE ${CUR_LANG} !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_STARTMENU_SHORTCUT_SECTION_TITLE ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_FILE_ASSOCIATION_SECTION_TITLE ${CUR_LANG} !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_SECTION_DESCRIPTION ${CUR_LANG} !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_SHORTCUTS_SECTION_DESCRIPTION ${CUR_LANG} !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_DESKTOP_SHORTCUT_DESC ${CUR_LANG} !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_STARTMENU_SHORTCUT_DESC ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_FILE_ASSOCIATION_DESC ${CUR_LANG} ; Installer Finish Page !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_FINISH_VISIT_WEB_SITE ${CUR_LANG} diff --git a/win32/installer/translations/english.nsh b/win32/installer/translations/english.nsh index 4bb354d4..beefa160 100644 --- a/win32/installer/translations/english.nsh +++ b/win32/installer/translations/english.nsh @@ -24,12 +24,14 @@ !insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_SHORTCUTS_SECTION_TITLE "Shortcuts" !insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_DESKTOP_SHORTCUT_SECTION_TITLE "Desktop" !insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_STARTMENU_SHORTCUT_SECTION_TITLE "Start Menu" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_FILE_ASSOCIATION_SECTION_TITLE "File association" !insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_SECTION_DESCRIPTION "Core Viking files and dlls" !insertmacro VIKING_MACRO_DEFAULT_STRING GTK_SECTION_DESCRIPTION "A multi-platform GUI toolkit, used by Viking" !insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_SHORTCUTS_SECTION_DESCRIPTION "Shortcuts for starting Viking" !insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_DESKTOP_SHORTCUT_DESC "Create a shortcut to Viking on the Desktop" !insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_STARTMENU_SHORTCUT_DESC "Create a Start Menu entry for Viking" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_FILE_ASSOCIATION_DESC "Associate .vik files with Viking" ; Installer Finish Page !insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_FINISH_VISIT_WEB_SITE "Visit the Viking Web Page" diff --git a/win32/installer/translations/french.nsh b/win32/installer/translations/french.nsh index 02f8ce34..fae5d582 100644 --- a/win32/installer/translations/french.nsh +++ b/win32/installer/translations/french.nsh @@ -26,11 +26,13 @@ !define VIKING_SHORTCUTS_SECTION_TITLE "Raccourcis" !define VIKING_DESKTOP_SHORTCUT_SECTION_TITLE "Bureau" !define VIKING_STARTMENU_SHORTCUT_SECTION_TITLE "Menu Démarrer" +!define VIKING_FILE_ASSOCIATION_SECTION_TITLE "Extension .vik" !define VIKING_SECTION_DESCRIPTION "Fichiers et DLLs de base de Viking" !define VIKING_SHORTCUTS_SECTION_DESCRIPTION "Raccourcis pour lancer Viking" !define VIKING_DESKTOP_SHORTCUT_DESC "Créer un raccourci pour Viking sur le bureau" !define VIKING_STARTMENU_SHORTCUT_DESC "Créer un raccourci pour Viking dans le menu Démarrer" +!define VIKING_FILE_ASSOCIATION_DESC "Associer Viking avec l'extension .vik" ; Installer Finish Page !define VIKING_FINISH_VISIT_WEB_SITE "Visitez la page web de Viking" diff --git a/win32/installer/translations/spanish.nsh b/win32/installer/translations/spanish.nsh index 48627e8a..a6630330 100644 --- a/win32/installer/translations/spanish.nsh +++ b/win32/installer/translations/spanish.nsh @@ -5,7 +5,7 @@ ;; Spanish language strings for the Windows Viking NSIS installer. ;; Windows Code page: 1252 ;; -;; Author: Roberto Camarero +;; Author: Roberto ;; ;; Modified for Viking by Mathieu Albinet @@ -25,11 +25,13 @@ !define VIKING_SHORTCUTS_SECTION_TITLE "Accesos directos" !define VIKING_DESKTOP_SHORTCUT_SECTION_TITLE "Escritorio" !define VIKING_STARTMENU_SHORTCUT_SECTION_TITLE "Menú Inicio" +!define VIKING_FILE_ASSOCIATION_SECTION_TITLE "Extensión.vik" !define VIKING_SECTION_DESCRIPTION "Ficheros y DLLs de base de Viking" !define VIKING_SHORTCUTS_SECTION_DESCRIPTION "Accesos directos para lanzar Viking" !define VIKING_DESKTOP_SHORTCUT_DESC "Crear un acceso directo a Viking en el escritorio" !define VIKING_STARTMENU_SHORTCUT_DESC "Crear un acceso directo a Viking en el menú de inicio" +!define VIKING_FILE_ASSOCIATION_DESC "Asociar Viking con la extensión .vik" ; Installer Finish Page !define VIKING_FINISH_VISIT_WEB_SITE "Visite la página web de Viking" diff --git a/win32/installer/viking-installer.nsi b/win32/installer/viking-installer.nsi index cfb2d91d..2ce49dcb 100644 --- a/win32/installer/viking-installer.nsi +++ b/win32/installer/viking-installer.nsi @@ -28,6 +28,8 @@ SetDateSave on !include "Sections.nsh" !include "WinVer.nsh" !include "LogicLib.nsh" +;; http://nsis.sourceforge.net/File_Association +!include "FileAssociation.nsh" !include "FileFunc.nsh" !insertmacro GetParameters @@ -279,15 +281,12 @@ SectionGroup /e $(VIKING_SHORTCUTS_SECTION_TITLE) SecShortcuts SectionEnd SectionGroupEnd +;-------------------------------- +;File association - - - - - - - - +Section $(VIKING_FILE_ASSOCIATION_SECTION_TITLE) SecFileAssociation + ${registerExtension} "$INSTDIR\viking.exe" ".vik" "Viking File" +SectionEnd ;-------------------------------- @@ -326,6 +325,9 @@ Section Uninstall ; Shortcuts.. Delete "$DESKTOP\Viking.lnk" + ; File association + ${unregisterExtension} ".vik" "Viking File" + Goto done cant_uninstall: @@ -351,6 +353,8 @@ SectionEnd ; end of uninstall section $(VIKING_DESKTOP_SHORTCUT_DESC) !insertmacro MUI_DESCRIPTION_TEXT ${SecStartMenuShortcut} \ $(VIKING_STARTMENU_SHORTCUT_DESC) + !insertmacro MUI_DESCRIPTION_TEXT ${SecFileAssociation} \ + $(VIKING_FILE_ASSOCIATION_DESC) !insertmacro MUI_FUNCTION_DESCRIPTION_END -- 2.39.5