This keyword is not expanded by Git which means it's not replaced with the correct revision value in the releases made using git-based scripts and it's confusing to have lines with unexpanded "$Id$" in the released files. As expanding them with Git is not that simple (it could be done with git archive and export-subst attribute) and there are not many benefits in having them in the first place, just remove all these lines. If nothing else, this will make an eventual transition to Git simpler. Closes #14487. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
279 lines
7.8 KiB
C++
279 lines
7.8 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/unix/stdpaths.cpp
|
|
// Purpose: wxStandardPaths implementation for Unix & OpenVMS systems
|
|
// Author: Vadim Zeitlin
|
|
// Modified by:
|
|
// Created: 2004-10-19
|
|
// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org>
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ============================================================================
|
|
// declarations
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// for compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#if wxUSE_STDPATHS
|
|
|
|
#include "wx/stdpaths.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/app.h"
|
|
#include "wx/wxcrt.h"
|
|
#include "wx/utils.h"
|
|
#endif //WX_PRECOMP
|
|
|
|
#include "wx/filename.h"
|
|
#include "wx/log.h"
|
|
#include "wx/textfile.h"
|
|
|
|
#if defined( __LINUX__ ) || defined( __VMS )
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
// ============================================================================
|
|
// common VMS/Unix part of wxStandardPaths implementation
|
|
// ============================================================================
|
|
|
|
void wxStandardPaths::SetInstallPrefix(const wxString& prefix)
|
|
{
|
|
m_prefix = prefix;
|
|
}
|
|
|
|
wxString wxStandardPaths::GetUserConfigDir() const
|
|
{
|
|
return wxFileName::GetHomeDir();
|
|
}
|
|
|
|
|
|
// ============================================================================
|
|
// wxStandardPaths implementation for VMS
|
|
// ============================================================================
|
|
|
|
#ifdef __VMS
|
|
|
|
wxString wxStandardPaths::GetInstallPrefix() const
|
|
{
|
|
if ( m_prefix.empty() )
|
|
{
|
|
const_cast<wxStandardPaths *>(this)->m_prefix = wxT("/sys$system");
|
|
}
|
|
|
|
return m_prefix;
|
|
}
|
|
|
|
wxString wxStandardPaths::GetConfigDir() const
|
|
{
|
|
return wxT("/sys$manager");
|
|
}
|
|
|
|
wxString wxStandardPaths::GetDataDir() const
|
|
{
|
|
return AppendAppInfo(GetInstallPrefix() + wxT("/sys$share"));
|
|
}
|
|
|
|
wxString wxStandardPaths::GetLocalDataDir() const
|
|
{
|
|
return AppendAppInfo(wxT("/sys$manager"));
|
|
}
|
|
|
|
wxString wxStandardPaths::GetUserDataDir() const
|
|
{
|
|
return wxFileName::GetHomeDir();
|
|
}
|
|
|
|
wxString wxStandardPaths::GetPluginsDir() const
|
|
{
|
|
return wxString(); // TODO: this is wrong, it should return something
|
|
}
|
|
|
|
wxString
|
|
wxStandardPaths::GetLocalizedResourcesDir(const wxString& lang,
|
|
ResourceCat category) const
|
|
{
|
|
return wxStandardPathsBase::GetLocalizedResourcesDir(lang, category);
|
|
}
|
|
|
|
wxString wxStandardPaths::GetExecutablePath() const
|
|
{
|
|
return wxStandardPathsBase::GetExecutablePath();
|
|
}
|
|
|
|
#else // !__VMS
|
|
|
|
// ============================================================================
|
|
// wxStandardPaths implementation for Unix
|
|
// ============================================================================
|
|
|
|
wxString wxStandardPaths::GetExecutablePath() const
|
|
{
|
|
#ifdef __LINUX__
|
|
wxString exeStr;
|
|
|
|
char buf[4096];
|
|
int result = readlink("/proc/self/exe", buf, WXSIZEOF(buf) - 1);
|
|
if ( result != -1 )
|
|
{
|
|
buf[result] = '\0'; // readlink() doesn't NUL-terminate the buffer
|
|
|
|
// if the /proc/self/exe symlink has been dropped by the kernel for
|
|
// some reason, then readlink() could also return success but
|
|
// "(deleted)" as link destination...
|
|
if ( strcmp(buf, "(deleted)") != 0 )
|
|
exeStr = wxString(buf, wxConvLibc);
|
|
}
|
|
|
|
if ( exeStr.empty() )
|
|
{
|
|
// UPX-specific hack: when using UPX on linux, the kernel will drop the
|
|
// /proc/self/exe link; in this case we try to look for a special
|
|
// environment variable called " " which is created by UPX to save
|
|
// /proc/self/exe contents. See
|
|
// http://sf.net/tracker/?func=detail&atid=309863&aid=1565357&group_id=9863
|
|
// for more information about this issue.
|
|
wxGetEnv(wxT(" "), &exeStr);
|
|
}
|
|
|
|
if ( !exeStr.empty() )
|
|
return exeStr;
|
|
#endif // __LINUX__
|
|
|
|
return wxStandardPathsBase::GetExecutablePath();
|
|
}
|
|
|
|
void wxStandardPaths::DetectPrefix()
|
|
{
|
|
// we can try to infer the prefix from the location of the executable
|
|
wxString exeStr = GetExecutablePath();
|
|
if ( !exeStr.empty() )
|
|
{
|
|
// consider that we're in the last "bin" subdirectory of our prefix
|
|
size_t pos = exeStr.rfind(wxT("/bin/"));
|
|
if ( pos != wxString::npos )
|
|
m_prefix.assign(exeStr, 0, pos);
|
|
}
|
|
|
|
if ( m_prefix.empty() )
|
|
{
|
|
m_prefix = wxT("/usr/local");
|
|
}
|
|
}
|
|
|
|
wxString wxStandardPaths::GetInstallPrefix() const
|
|
{
|
|
if ( m_prefix.empty() )
|
|
{
|
|
wxStandardPaths *pathPtr = const_cast<wxStandardPaths *>(this);
|
|
pathPtr->DetectPrefix();
|
|
}
|
|
|
|
return m_prefix;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// public functions
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxString wxStandardPaths::GetConfigDir() const
|
|
{
|
|
return wxT("/etc");
|
|
}
|
|
|
|
wxString wxStandardPaths::GetDataDir() const
|
|
{
|
|
// allow to override the location of the data directory by setting
|
|
// WX_APPNAME_DATA_DIR environment variable: this is very useful in
|
|
// practice for running well-written (and so using wxStandardPaths to find
|
|
// their files) wx applications without installing them
|
|
static const wxString
|
|
envOverride(
|
|
getenv(
|
|
("WX_" + wxTheApp->GetAppName().Upper() + "_DATA_DIR").c_str()
|
|
)
|
|
);
|
|
|
|
if ( !envOverride.empty() )
|
|
return envOverride;
|
|
|
|
return AppendAppInfo(GetInstallPrefix() + wxT("/share"));
|
|
}
|
|
|
|
wxString wxStandardPaths::GetLocalDataDir() const
|
|
{
|
|
return AppendAppInfo(wxT("/etc"));
|
|
}
|
|
|
|
wxString wxStandardPaths::GetUserDataDir() const
|
|
{
|
|
return AppendAppInfo(wxFileName::GetHomeDir() + wxT("/."));
|
|
}
|
|
|
|
wxString wxStandardPaths::GetPluginsDir() const
|
|
{
|
|
return AppendAppInfo(GetInstallPrefix() + wxT("/lib"));
|
|
}
|
|
|
|
wxString
|
|
wxStandardPaths::GetLocalizedResourcesDir(const wxString& lang,
|
|
ResourceCat category) const
|
|
{
|
|
if ( category != ResourceCat_Messages )
|
|
return wxStandardPathsBase::GetLocalizedResourcesDir(lang, category);
|
|
|
|
return GetInstallPrefix() + wxT("/share/locale/") + lang + wxT("/LC_MESSAGES");
|
|
}
|
|
|
|
wxString wxStandardPaths::GetDocumentsDir() const
|
|
{
|
|
{
|
|
wxLogNull logNull;
|
|
wxString homeDir = wxFileName::GetHomeDir();
|
|
wxString configPath;
|
|
if (wxGetenv(wxT("XDG_CONFIG_HOME")))
|
|
configPath = wxGetenv(wxT("XDG_CONFIG_HOME"));
|
|
else
|
|
configPath = homeDir + wxT("/.config");
|
|
wxString dirsFile = configPath + wxT("/user-dirs.dirs");
|
|
if (wxFileExists(dirsFile))
|
|
{
|
|
wxTextFile textFile;
|
|
if (textFile.Open(dirsFile))
|
|
{
|
|
size_t i;
|
|
for (i = 0; i < textFile.GetLineCount(); i++)
|
|
{
|
|
wxString line(textFile[i]);
|
|
int pos = line.Find(wxT("XDG_DOCUMENTS_DIR"));
|
|
if (pos != wxNOT_FOUND)
|
|
{
|
|
wxString value = line.AfterFirst(wxT('='));
|
|
value.Replace(wxT("$HOME"), homeDir);
|
|
value.Trim(true);
|
|
value.Trim(false);
|
|
if (!value.IsEmpty() && wxDirExists(value))
|
|
return value;
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return wxStandardPathsBase::GetDocumentsDir();
|
|
}
|
|
|
|
#endif // __VMS/!__VMS
|
|
|
|
#endif // wxUSE_STDPATHS
|