← Back to team overview

kicad-developers team mailing list archive

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

 

Oh my bad, I'm not used to this style, fixed patch attached, also
realized that everywhere else in kicad you are using "kicad" as the
bundle name in OSX, so I changed that for consistency.

On Mon, Jan 5, 2015 at 6: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
=== 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" ) );
+    lockparh.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
  */