[Geany-Devel] Geany Portable

Oliver Krystal mr.soup12 at xxxxx
Thu Aug 20 03:19:08 UTC 2015

On 08/19/2015 06:25 PM, Matthew Brush wrote:
> On 15-08-19 04:20 PM, Oliver Krystal wrote:
>> Yes, I'm subscribed.  Well, I use to be the developer but the facts
>> should still hold true.  PortableApps.com doesn't modify the source
>> code, but uses a wrapper around the program to achieve "portable-ness".
>> If PortableApps needs a change to achieve portableness, it should be
>> submitted to the maintainers of the original program for inclusion in
>> the upstream(?) source.
> We do have some special code about "binary relocation" for this I
> believe, it was added before my time, but I think it might've broken in
> the last release (1.25).
> My current question though is, do you know it handles the case for the
> GUI/Glade file that it loads on startup? If I understand correctly, we
> hard-code the path to it at compile time, yet I'm able to freely move
> the GeanyPortable folder around and it still loads fine.

I've attached the source code for the launcher which can be found in
Other/Source (along with other goodies).  Looking through the source, it
looks like it hasn't changed much but I did nothing about Glade when I
created the launcher.

Everything in the config file though has its location updated at the
start of Geany Portable.

I'm in #geany on freenode if you care to pick my mind.

> Any info/tips would be appreciated.
> Thanks,
> Matthew Brush
>> On 08/19/2015 05:27 PM, Matthew Brush wrote:
>>> Hi All,
>>> I was working on some changes to Geany that may affect "Geany Portable"
>>> so I figured I'd have a look at the changes it makes to Geany to see how
>>> it handles binary relocation, but I can't seem to find the source
>>> code/changes.
>>> The link on PortableApps.com[0] seems to indicate that 1.24.1 is
>>> available but when I check the sources on SourceForge, it only has 0.20
>>> code (and it's not clear if it includes the changes or is just upstream
>>> source). I'm pretty sure Geany's source code would have to be modified
>>> in order to allow it to be "portable", since the location to the Glade
>>> file is fixed at compile-time, which happens to be tightly related to
>>> what I was curious about.
>>> The website GeanyPortable.org linked on PortableApps.com seems to
>>> redirect somewhere else now (judging by the pictures, I can't read the
>>> language it's in).
>>> Is the person(s) who release GeanyPortable on this mailing list, and if
>>> so, would you mind providing me a copy of the modified source code so
>>> that I could review it to make sure we don't further break "portable"
>>> Geany?
>>> Thanks,
>>> Matthew Brush
>>> [0]: http://portableapps.com/apps/development/geany_portable
>>> _______________________________________________
>>> Devel mailing list
>>> Devel at lists.geany.org
>>> https://lists.geany.org/cgi-bin/mailman/listinfo/devel
>> _______________________________________________
>> Devel mailing list
>> Devel at lists.geany.org
>> https://lists.geany.org/cgi-bin/mailman/listinfo/devel
> _______________________________________________
> Devel mailing list
> Devel at lists.geany.org
> https://lists.geany.org/cgi-bin/mailman/listinfo/devel
-------------- next part --------------
?;Copyright (C) 2007-2011 Oliver Krystal
;Copyright (C) 2004-2012 John T. Haller
;Copyright (C) 2007-2008 Patrick Patience
;This app utilizes some of Erik Pilsits code for implementation of portable fonts.  Applicable copyrights apply. See http://portableapps.com/node/16003 for more information

;Primary Website: http://geanyportable.org
;PortableApps.com Page: http://PortableApps.com/GeanyPortable

;This software is OSI Certified Open Source Software.
;OSI Certified is a certification mark of the Open Source Initiative.

;This program 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 program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;GNU General Public License for more details.

;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

!define NAME "GeanyPortable"
!define PORTABLEAPPNAME "Geany Portable"
!define APPNAME "Geany"
!define VER "" ;increment for official release
!define WEBSITE "PortableApps.com/GeanyPortable"
!define DEFAULTEXE "Geany.exe"
!define DEFAULTAPPDIR "Geany\bin"
!define DEFAULTGTKDIR "Geany"
!define DEFAULTSETTINGSDIR "settings"
!define LAUNCHERLANGUAGE "English"
!define LibGTKDLLCheck "libgtk-win32-2.0-0.dll"

!define WM_FONTCHANGE 0x001D ;for portable fonts
!define HWND_BROADCAST 0xFFFF ;for portable fonts

;=== Program Details
OutFile "..\..\${NAME}.exe"
Caption "${PORTABLEAPPNAME} | PortableApps.com"
VIProductVersion "${VER}"
VIAddVersionKey ProductName "${PORTABLEAPPNAME}"
VIAddVersionKey Comments "Allows ${APPNAME} to be run from a removable drive.  For additional details, visit ${WEBSITE}"
VIAddVersionKey CompanyName "PortableApps.com"
VIAddVersionKey LegalCopyright "OliverK"
VIAddVersionKey FileDescription "${PORTABLEAPPNAME}"
VIAddVersionKey FileVersion "${VER}"
VIAddVersionKey ProductVersion "${VER}"
VIAddVersionKey InternalName "${PORTABLEAPPNAME}"
VIAddVersionKey LegalTrademarks "PortableApps.com is a Trademark of Rare Ideas, LLC."
VIAddVersionKey OriginalFilename "${NAME}.exe"
;VIAddVersionKey PrivateBuild ""
;VIAddVersionKey SpecialBuild ""

;=== Runtime Switches
CRCCheck On
WindowIcon Off
SilentInstall Silent
AutoCloseWindow True
RequestExecutionLevel user
; XP Style
XPStyle on

; Best Compression
SetCompress Auto
SetCompressor /SOLID lzma
SetCompressorDictSize 32
SetDatablockOptimize On

;=== Include
;(Standard NSIS)
!include FileFunc.nsh
!insertmacro GetParent
!insertmacro GetRoot
!insertmacro GetParameters ;Requires NSIS 2.40 or better

;(NSIS Plugins)
!include TextReplace.nsh
!include StrRep.nsh
!include LogicLib.nsh ;portable fonts

!include ReplaceInFileWithTextReplace.nsh
!include ReadINIStrWithDefault.nsh
!include ProcFunc.nsh
!insertmacro GetProcessPath

;=== Program Icon
Icon "..\..\App\AppInfo\appicon.ico"

;=== Icon & Stye ===
;!define MUI_ICON "..\..\App\AppInfo\appicon.ico"

;=== Languages
LoadLanguageFile "${NSISDIR}\Contrib\Language files\${LAUNCHERLANGUAGE}.nlf"
!include PortableApps.comLauncherLANG_${LAUNCHERLANGUAGE}.nsh

Var ProgramDirectory
Var ProgramExecutable
Var SettingsDirectory
Var FontDirectory
Var UseFonts
Var AdditionalParameters
Var ExecString
Var GTKDirectory
Var ExistsFileChooser
Var ExistsXBEL
Var GTKBookmarks
Var AppLanguage
Var PathAdditions
Var LastDrive
Var CurrentDrive
Var DisableSplashScreen
Var LaunchAndExit
Var EnchantExisted

Section "Main"
		;=== Read the parameters from the INI file
		StrCpy $ProgramDirectory "$EXEDIR\App\${DEFAULTAPPDIR}"
		StrCpy $SettingsDirectory "$EXEDIR\Data\${DEFAULTSETTINGSDIR}"
		StrCpy $ProgramExecutable "${DEFAULTEXE}"
		${ReadINIStrWithDefault} $AdditionalParameters "$EXEDIR\${NAME}.ini" "${NAME}" "AdditionalParameters" ""
		${ReadINIStrWithDefault} $DisableSplashScreen "$EXEDIR\${NAME}.ini" "${NAME}" "DisableSplashScreen" "false"
		${ReadINIStrWithDefault} $AppLanguage "$EXEDIR\${NAME}.ini" "${NAME}" "ApplicationLanguage" ""
		${ReadINIStrWithDefault} $PathAdditions "$EXEDIR\${NAME}.ini" "${NAME}" "PathAdditions" ""
		${ReadINIStrWithDefault} $UseFonts "$EXEDIR\${NAME}.ini" "${NAME}" "AdditionalFonts" "false"
		${GetProcessPath} "$ProgramExecutable" $0 ;GetProcessPath will return a 0 if the process doesn't exist
			StrCpy $LaunchAndExit 'false'
			StrCmp $0 0 PrepareGTK ;Process does not exist currently, proceed on course, good day 
				StrCpy $LaunchAndExit 'true' ;process does exist and it may be ours.
			StrCmp $0 "$ProgramDirectory\$ProgramExecutable" PrepareGTK
				;Process does exist, and is ours, so launch Geany with whatever
				;the current Geany isn't ours and we should quit while ahead
				;===Warn Another Instance
				MessageBox MB_OK|MB_ICONINFORMATION `$(LauncherAlreadyRunning)`

;General GTK Stuff.  Yes, 'Legacy' Common File support is implemented, though I don't know how far you'd get.
	;=== CheckGTKDirectory:
		IfFileExists "$EXEDIR\App\${DEFAULTGTKDIR}\bin\${LibGTKDLLCheck}" "" CommonFiles
			StrCpy $GTKDirectory "$EXEDIR\App\${DEFAULTGTKDIR}"
			Goto CheckForFile

		${GetParent} "$EXEDIR" $0
		IfFileExists "$0\CommonFiles\GTK\bin\*.*" "" GTKNotFound
		StrCpy $GTKDirectory "$0\CommonFiles\GTK\"
		Goto CheckForFile
		MessageBox MB_OK|MB_ICONEXCLAMATION `$(LauncherFileNotFound)`
		;CheckForEXE, see if its existant
		IfFileExists "$ProgramDirectory\$ProgramExecutable" DisplaySplash NoProgramEXE

		;=== Program executable not where expected
		StrCpy $MISSINGFILEORPATH $ProgramExecutable
		MessageBox MB_OK|MB_ICONEXCLAMATION `$(LauncherFileNotFound)`
		;===Display the splash screen
		StrCmp $LaunchAndExit "true" PathAdditions
		StrCmp $DisableSplashScreen "true" SkipSplashScreen
			;=== Show the splash screen before processing the files
			File /oname=$PLUGINSDIR\splash.jpg "${NAME}.jpg"		
			newadvsplash::show /NOUNLOAD 1200 0 0 -1 /L $PLUGINSDIR\splash.jpg

		IfFileExists "$SettingsDirectory\*.*" PathAdditions
        CreateDirectory "$EXEDIR\Data\settings"
		CopyFiles /SILENT $EXEDIR\App\DefaultData\settings\*.* $SettingsDirectory

	;Setup GTK and handleCheck to see if we have any path additions to work out for Geany
		StrCpy $0 "" ;Empty the $0 variable so no junk is be inadvertantly copyed at the GTK: heading
		StrCmp $PathAdditions "" SetupPath
		${GetRoot} $EXEDIR $0
		${StrReplace} '$0' '@Drive' '$0' '$PathAdditions'

		ReadEnvStr $1 "PATH"
		StrCpy $0 "$GTKDirectory\bin;$ProgramDirectory;$0;$1"
			System::Call 'Kernel32::SetEnvironmentVariable(t, t) i("PATH", "$0").r0'
			System::Call 'Kernel32::SetEnvironmentVariable(t, t) i("GTK_BASEPATH", "$GTKDirectory").r0'
	;===Add fonts if requested:
	;Code Courtesy wraithdu\ErikPilsits
	StrCmp $LaunchAndExit 'true' LanguageSwitch ;Launch and exit, the Geany fonts has been set up, and we shouldn't do this twice, thrice, etc.
	StrCmp $UseFonts "false" AdjustSettings
			StrCpy $FontDirectory "$EXEDIR\Data\fonts"
			; loop through fonts and add or remove
			FindFirst $0 $1 "$FontDirectory\*.*"
			${DoWhile} $1 != ""
				${If} $1 != "."
				${AndIf} $1 != ".."
					System::Call "gdi32::AddFontResource(t'$FontDirectory\$1')i .r2"
					;${IfThen} $2 = 0 ${|} MessageBox MB_OK|MB_ICONEXCLAMATION "Geany Portable cannot install font <$1>" ${|}
				FindNext $0 $1
			FindClose $0
			; broadcast font change
		;===Handle GTKRC
		Rename "$SettingsDirectory\gtkrc" "$GTKDirectory\etc\gtk-2.0\gtkrc"
		;===Figure out what Drive we are on, and what we were on
		${GetRoot} $EXEDIR $CurrentDrive
		ReadINIStr $LastDrive "$SettingsDirectory\${NAME}Settings.ini" "${NAME}Settings" "LastDriveLetter"
		StrCmp $LastDrive "" StoreCurrentDriveLetter
		StrCmp $LastDrive $CurrentDrive CheckForUserProfileFolders
		;===Fix geany.conf
		${ReplaceInFile} "$SettingsDirectory\geany.conf" "$LastDrive\" "$CurrentDrive\"
		Delete "$SettingsDirectory\geany.conf.old"
		;===Fix spellchecker configuration
		IfFileExists "$SettingsDirectory\plugins\spellcheck\spellcheck.conf" 0 StoreCurrentDriveLetter
		${ReplaceInFile} "$SettingsDirectory\plugins\spellcheck\spellcheck.conf" "$LastDrive\" "$CurrentDrive\"
		Delete "$SettingsDirectory\plugins\spellcheck\spellcheck.conf.old"
		WriteINIStr "$SettingsDirectory\${NAME}Settings.ini" "${NAME}Settings" "LastDriveLetter" "$CurrentDrive"			
		IfFileExists "$USERPROFILE\.recently-used.xbel" 0 +2 ;The number means how many lines to skip
			StrCpy $ExistsXBEL "true"
		IfFileExists "$USERPROFILE\.gtk-bookmarks" 0 +2 ;See above :p
			StrCpy $GTKBookmarks "true"
		IfFileExists "$APPDATA\gtk-2.0\gtkfilechooser.ini" 0 +2
			StrCpy $ExistsFileChooser "true"
		;===Handle the enchant folder bug without using a goto, which is bad coding style
		StrCpy $EnchantExisted "false"
		IfFileExists "$APPDATA\enchant\*.*" 0 LanguageSwitch
		;Okay, so this is a issue I found.  It only exists when using the spellcheck plugin.  The method to fix this is the same as the GTK stuff, but maybe with some extra love
			StrCpy $EnchantExisted "True" ;could set to any other value . . . 
			Rename "$APPDATA\enchant" "$APPDATA\enchant-backup-by-Geany-Portable"			

		StrCmp $AppLanguage "" 0 +3 ;read initially up at the begining.  If you didn't put anything it, its empty and will skip setting with that
		ReadEnvStr $AppLanguage "PortableApps.comLocaleglibc" ;read langauge code broadcasted by menu  If its set, we skip this line, so its just set to whatever the ini says
		StrCmp $AppLanguage "" +2 ;Thanks to Bart.S from the PortableApps.com for this patch.
		System::Call 'Kernel32::SetEnvironmentVariable(t, t) i("LANG", "$AppLanguage").r0' ;set the language for geany to use.  Look it up in the help :D

	;=== Get any passed parameters
		${GetParameters} $0
			;MessageBox MB_OK 'Passed Parameters: $0'
		StrCmp "'$0'" "''" "" LaunchProgramParameters

	;=== No parameters
	;I've left some debug messages in for this release.  They'll leave when I've gotten everything to work 
	;properly with multiple launches I'll delete them
		StrCpy $ExecString '"$ProgramDirectory\$ProgramExecutable" -c "$SettingsDirectory"'
						;MessageBox MB_OK '$ExecString'
		Goto AdditionalParameters

		StrCpy $ExecString '"$ProgramDirectory\$ProgramExecutable" $0 -c "$SettingsDirectory"'
		;MessageBox MB_OK '$ExecString | With Params'

		StrCmp $AdditionalParameters "" Launch
		StrCpy $ExecString '"$ExecString" "$AdditionalParameters"'
		;MessageBox MB_OK '$ExecString | With Addtional'
		;MessageBox MB_OK '$LaunchAndExit'
	StrCmp $LaunchAndExit 'true' LaunchAndExit		
		;===Launch a full standard launch
			CreateDirectory "$PLUGINSDIR\ContainedTemp"
			System::Call 'Kernel32::SetEnvironmentVariable(t, t) i("TEMP", "$PLUGINSDIR\ContainedTemp").r0'
			ExecWait $ExecString
			RMDir /r "$PLUGINSDIR\ContainedTemp"
			;MessageBox MB_OK "$ExecString"

				StrCmp $ExistsXBEL "true" +2
					Delete "$USERPROFILE\.recently-used.xbel"
				StrCmp $GTKBookmarks "true" +2
					Delete "$USERPROFILE\.gtk-bookmarks"
				StrCmp $ExistsFileChooser "true" +3
					Delete "$APPDATA\gtk-2.0\gtkfilechooser.ini"
					RmDir "$APPDATA\gtk-2.0\"
				;===Fix enchant issue
				StrCmp $EnchantExisted "false" +2 0
					IfFileExists "$APPDATA\enchant-backup-by-Geany-Portable\*.*" 0 +3
					RmDir /r "$APPDATA\enchant" ;nothing of worth is in this directory
					Rename "$APPDATA\enchant-backup-by-Geany-Portable" "$APPDATA\enchant"
				;===Put gtkrc back where it belongs
					Rename "$GTKDirectory\etc\gtk-2.0\gtkrc" "$SettingsDirectory\gtkrc"
				;===Remove Fonts
				;Code Courtesy wraithdu\ErikPilsits	
				StrCmp $UseFonts "false" TheEnd
					; loop through fonts and add or remove
					FindFirst $0 $1 "$FontDirectory\*.*"
					${DoWhile} $1 != ""
						${If} $1 != "."
						${AndIf} $1 != ".."
							System::Call "gdi32::RemoveFontResource(t'$FontDirectory\$1')i .r2"
							;${IfThen} $2 = 0 ${|} MessageBox MB_OK|MB_ICONEXCLAMATION "Error removing font <$1>" ${|}
						FindNext $0 $1
					FindClose $0
					; broadcast font change
				Goto TheEnd ;I really wish I could get away without such a blatant goto.  But I can't

		Exec $ExecString

		newadvsplash::stop /WAIT

More information about the Devel mailing list