← Back to team overview

kicad-developers team mailing list archive

Re: [PATCH] Fix lockfile placement on Linux/OSX

 

Thanks for testing! also fixed a tiny whitespace issue reported by
Nick on IRC (indentation of a comment in line 41 of the patch), Thank
you all for helping fix some issues with it!

~José

On Mon, Jan 5, 2015 at 11:34 PM, Adam Wolf
<adamwolf@xxxxxxxxxxxxxxxxxxxx> wrote:
> Hi,
>
> There was a minor typo spotted by Bob in the patch.  I fixed it, and tested
> it on OS X.  Works great.
>
> Adam Wolf
> Cofounder and Engineer
> W&L
>
> On Mon, Jan 5, 2015 at 3:38 PM, Wayne Stambaugh <stambaughw@xxxxxxxxx>
> wrote:
>>
>> Jose,
>>
>> The formatting of the if/else if statements does not follow the coding
>> policy.  They should be formatted:
>>
>> if( condition )
>> {
>> }
>> else if( condition )
>> {
>> }
>>
>> Thanks,
>>
>> Wayne
>>
>> On 1/5/2015 4:36 PM, José Ignacio wrote:
>> > Whoops, I didn't realize my pre-approval email went through the list
>> > after all, sorry for littering the mailing list with two slightly
>> > different versions of the same patch. the one in this thread is the
>> > most current.
>> >
>> > Cheers,
>> > José
>> >
>> > On Mon, Jan 5, 2015 at 6:33 PM, Adam Wolf
>> > <adamwolf@xxxxxxxxxxxxxxxxxxxx> wrote:
>> >> I will test this on OS X.
>> >>
>> >> Adam Wolf
>> >> Cofounder and Engineer
>> >> W&L
>> >>
>> >> On Mon, Jan 5, 2015 at 3:31 PM, José Ignacio <jose.cyborg@xxxxxxxxx>
>> >> wrote:
>> >>>
>> >>> Hello, I wrote a patch to fix the issue of Kicad creating lock/PID
>> >>> files for applications and open files in the user's home directory,
>> >>> which is unsightly and wrong according to the XDG[1]/Apple[2]
>> >>> standards/spec.
>> >>>
>> >>> To fix it I created a new function in common.cpp which fetches the
>> >>> proper path to use using environment variables and a couple fallbacks,
>> >>> and edited all calls to wxSingleInstanceChecker's constructor to use
>> >>> it. According to wxwidgets's documentation [3] the constructor
>> >>> *should* ignore that extra argument on windows since it uses mutexes
>> >>> instead of lock files. In Mac OSX I used the standard user-specific
>> >>> cache directory, choosing somewhat arbitrarily "org.kicad-pcb.kicad"
>> >>> as the app bundle name, feel free to change it if you think something
>> >>> else would suit better.
>> >>>
>> >>> In any case, it does need testing in those platforms. It works as
>> >>> expected on Debian Jessie.
>> >>>
>> >>> [1]:
>> >>> http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
>> >>> [2]:
>> >>>
>> >>> https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html#//apple_ref/doc/uid/TP40010672-CH10-SW1
>> >>> [3]:
>> >>>
>> >>> http://docs.wxwidgets.org/trunk/classwx_single_instance_checker.html#aa69725041ea6c0479f65f6b468a42f1e
>> >>>
>> >>> _______________________________________________
>> >>> Mailing list: https://launchpad.net/~kicad-developers
>> >>> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>> >>> Unsubscribe : https://launchpad.net/~kicad-developers
>> >>> More help   : https://help.launchpad.net/ListHelp
>> >>>
>> >>
>> >
>> > _______________________________________________
>> > Mailing list: https://launchpad.net/~kicad-developers
>> > Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>> > Unsubscribe : https://launchpad.net/~kicad-developers
>> > More help   : https://help.launchpad.net/ListHelp
>> >
>>
>>
>> _______________________________________________
>> Mailing list: https://launchpad.net/~kicad-developers
>> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>> Unsubscribe : https://launchpad.net/~kicad-developers
>> More help   : https://help.launchpad.net/ListHelp
>
>
>
> _______________________________________________
> Mailing list: https://launchpad.net/~kicad-developers
> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~kicad-developers
> More help   : https://help.launchpad.net/ListHelp
>
=== modified file 'common/common.cpp'
--- common/common.cpp	2014-12-23 13:01:59 +0000
+++ common/common.cpp	2015-01-05 21:51:33 +0000
@@ -305,6 +305,46 @@
     return cfg;
 }
 
+wxString GetKicadLockFilePath()
+{
+    wxFileName lockpath;
+    lockpath.AssignDir( wxGetHomeDir() ); // Default wx behavior
+
+#if defined( __WXMAC__ )
+    // In OSX use the standard per user cache directory
+    lockpath.AppendDir( wxT( "Library" ) );
+    lockpath.AppendDir( wxT( "Caches" ) );
+    lockpath.AppendDir( wxT( "kicad" ) );
+#elif defined( __UNIX__ )
+    wxString envstr;
+    // Try first the standard XDG_RUNTIME_DIR, falling back to XDG_CACHE_HOME
+    if( wxGetEnv( wxT( "XDG_RUNTIME_DIR" ), &envstr ) && !envstr.IsEmpty() )
+    {
+        lockpath.AssignDir( envstr );
+    }
+    else if( wxGetEnv( wxT( "XDG_CACHE_HOME" ), &envstr ) && !envstr.IsEmpty() )
+    {
+        lockpath.AssignDir( envstr );
+    }
+    else
+    {
+        // If all fails, just use ~/.cache
+        lockpath.AppendDir( wxT( ".cache" ) ); 
+    }
+
+    lockpath.AppendDir( wxT( "kicad" ) );
+#endif
+
+#if defined( __WXMAC__ ) || defined( __UNIX__ )
+    if( !lockpath.DirExists() )
+    {
+        // Lockfiles should be only readable by the user
+        lockpath.Mkdir( 0700, wxPATH_MKDIR_FULL );
+    }
+#endif
+    return lockpath.GetPath();
+}
+
 
 wxString GetKicadConfigPath()
 {

=== modified file 'common/lockfile.cpp'
--- common/lockfile.cpp	2014-10-19 20:20:16 +0000
+++ common/lockfile.cpp	2015-01-05 04:00:09 +0000
@@ -24,6 +24,7 @@
 
 #include <wx/filename.h>
 #include <wx/snglinst.h>
+#include <common.h>
 
 
 wxSingleInstanceChecker* LockFile( const wxString& aFileName )
@@ -41,7 +42,7 @@
     // We can have filenames coming from Windows, so also convert Windows separator
     lockFileName.Replace( wxT( "\\" ), wxT( "_" ) );
 
-    wxSingleInstanceChecker* p = new wxSingleInstanceChecker( lockFileName );
+    wxSingleInstanceChecker* p = new wxSingleInstanceChecker( lockFileName, GetKicadLockFilePath() );
 
     if( p->IsAnotherRunning() )
     {

=== modified file 'common/pgm_base.cpp'
--- common/pgm_base.cpp	2014-10-17 17:45:33 +0000
+++ common/pgm_base.cpp	2015-01-05 03:31:13 +0000
@@ -353,7 +353,7 @@
 
     wxInitAllImageHandlers();
 
-    m_pgm_checker = new wxSingleInstanceChecker( pgm_name.GetName().Lower() + wxT( "-" ) + wxGetUserId() );
+    m_pgm_checker = new wxSingleInstanceChecker( pgm_name.GetName().Lower() + wxT( "-" ) + wxGetUserId(), GetKicadLockFilePath() );
 
     if( m_pgm_checker->IsAnotherRunning() )
     {

=== modified file 'include/common.h'
--- include/common.h	2014-12-23 13:01:59 +0000
+++ include/common.h	2015-01-05 03:29:04 +0000
@@ -434,6 +434,12 @@
 wxConfigBase* GetNewConfig( const wxString& aProgName );
 
 /**
+ * Function GetKicadLockFilePath
+ * @return A wxString containing the path for lockfiles in Kicad
+ */
+wxString GetKicadLockFilePath();
+
+/**
  * Function GetKicadConfigPath
  * @return A wxString containing the config path for Kicad
  */


References