[ 1604925 ] Fix loading MIME types for KDE
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43723 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -104,6 +104,8 @@ protected:
|
|||||||
const wxArrayString& icondirs);
|
const wxArrayString& icondirs);
|
||||||
void LoadKDELinkFilesFromDir(const wxString& dirbase,
|
void LoadKDELinkFilesFromDir(const wxString& dirbase,
|
||||||
const wxArrayString& icondirs);
|
const wxArrayString& icondirs);
|
||||||
|
void LoadKDEApp(const wxString& filename);
|
||||||
|
void LoadKDEAppsFilesFromDir(const wxString& dirname);
|
||||||
void GetKDEMimeInfo(const wxString& sExtraDir);
|
void GetKDEMimeInfo(const wxString& sExtraDir);
|
||||||
|
|
||||||
// write KDE
|
// write KDE
|
||||||
|
@@ -80,44 +80,19 @@ public:
|
|||||||
|
|
||||||
int pIndexOf(const wxString & sSearch, bool bIncludeComments = false, int iStart = 0)
|
int pIndexOf(const wxString & sSearch, bool bIncludeComments = false, int iStart = 0)
|
||||||
{
|
{
|
||||||
size_t i = iStart;
|
|
||||||
int nResult = wxNOT_FOUND;
|
|
||||||
if (i >= GetLineCount())
|
|
||||||
return wxNOT_FOUND;
|
|
||||||
|
|
||||||
wxString sTest = sSearch;
|
wxString sTest = sSearch;
|
||||||
sTest.MakeLower();
|
sTest.MakeLower();
|
||||||
wxString sLine;
|
for(size_t i = iStart; i < GetLineCount(); i++)
|
||||||
|
|
||||||
if (bIncludeComments)
|
|
||||||
{
|
{
|
||||||
while ( i < GetLineCount() )
|
wxString sLine = GetLine(i).Trim(false);
|
||||||
|
if(bIncludeComments || ! sLine.StartsWith(wxT("#")))
|
||||||
{
|
{
|
||||||
sLine = GetLine(i);
|
|
||||||
sLine.MakeLower();
|
sLine.MakeLower();
|
||||||
if (sLine.Contains(sTest))
|
if(sLine.StartsWith(sTest))
|
||||||
nResult = (int) i;
|
return (int)i;
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
return wxNOT_FOUND;
|
||||||
{
|
|
||||||
while ( (i < GetLineCount()) )
|
|
||||||
{
|
|
||||||
sLine = GetLine(i);
|
|
||||||
sLine.MakeLower();
|
|
||||||
if ( ! sLine.StartsWith(wxT("#")))
|
|
||||||
{
|
|
||||||
if (sLine.Contains(sTest))
|
|
||||||
nResult = (int) i;
|
|
||||||
}
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nResult;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CommentLine(int nIndex)
|
bool CommentLine(int nIndex)
|
||||||
@@ -773,12 +748,12 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase,
|
|||||||
const wxString& filename,
|
const wxString& filename,
|
||||||
const wxArrayString& icondirs)
|
const wxArrayString& icondirs)
|
||||||
{
|
{
|
||||||
|
wxFileName fullname(dirbase, filename);
|
||||||
wxMimeTextFile file;
|
wxMimeTextFile file;
|
||||||
if ( !file.Open(dirbase + filename) )
|
if(! file.Open( fullname.GetFullPath() )) return;
|
||||||
return;
|
|
||||||
|
|
||||||
wxLogTrace(TRACE_MIME, wxT("loading KDE file %s"),
|
wxLogTrace(TRACE_MIME, wxT("loading KDE file %s"),
|
||||||
(dirbase + filename).c_str());
|
fullname.GetFullPath().c_str());
|
||||||
|
|
||||||
wxMimeTypeCommands * entry = new wxMimeTypeCommands;
|
wxMimeTypeCommands * entry = new wxMimeTypeCommands;
|
||||||
wxArrayString sExts;
|
wxArrayString sExts;
|
||||||
@@ -910,55 +885,42 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeType(const wxString& dirbase,
|
|||||||
const wxString& subdir,
|
const wxString& subdir,
|
||||||
const wxArrayString& icondirs)
|
const wxArrayString& icondirs)
|
||||||
{
|
{
|
||||||
wxString dirname = dirbase;
|
wxFileName dirname(dirbase, wxEmptyString);
|
||||||
dirname += subdir;
|
dirname.AppendDir(subdir);
|
||||||
wxDir dir(dirname);
|
wxDir dir(dirname.GetPath());
|
||||||
if ( !dir.IsOpened() )
|
if(! dir.IsOpened())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wxLogTrace(TRACE_MIME, wxT("--- Loading from KDE directory %s ---"),
|
wxLogTrace(TRACE_MIME, wxT("--- Loading from KDE directory %s ---"),
|
||||||
dirname.c_str());
|
dirname.GetPath().c_str());
|
||||||
|
|
||||||
dirname += wxT('/');
|
|
||||||
|
|
||||||
wxString filename;
|
wxString filename;
|
||||||
bool cont = dir.GetFirst(&filename, wxT("*.kdelnk"), wxDIR_FILES);
|
bool cont = dir.GetFirst(&filename, wxT("*.kdelnk"), wxDIR_FILES);
|
||||||
while ( cont )
|
while(cont) {
|
||||||
{
|
LoadKDELinksForMimeSubtype(dirname.GetPath(), subdir,
|
||||||
LoadKDELinksForMimeSubtype(dirname, subdir, filename, icondirs);
|
filename, icondirs);
|
||||||
|
|
||||||
cont = dir.GetNext(&filename);
|
cont = dir.GetNext(&filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
// new standard for Gnome and KDE
|
// new standard for Gnome and KDE
|
||||||
cont = dir.GetFirst(&filename, wxT("*.desktop"), wxDIR_FILES);
|
cont = dir.GetFirst(&filename, wxT("*.desktop"), wxDIR_FILES);
|
||||||
while ( cont )
|
while(cont) {
|
||||||
{
|
LoadKDELinksForMimeSubtype(dirname.GetPath(), subdir,
|
||||||
LoadKDELinksForMimeSubtype(dirname, subdir, filename, icondirs);
|
filename, icondirs);
|
||||||
|
|
||||||
cont = dir.GetNext(&filename);
|
cont = dir.GetNext(&filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxMimeTypesManagerImpl::LoadKDELinkFilesFromDir(const wxString& dirbase,
|
void wxMimeTypesManagerImpl::LoadKDELinkFilesFromDir(const wxString& dirname,
|
||||||
const wxArrayString& icondirs)
|
const wxArrayString& icondirs)
|
||||||
{
|
{
|
||||||
wxASSERT_MSG( !dirbase.empty() && !wxEndsWithPathSeparator(dirbase),
|
if(! wxDir::Exists(dirname))
|
||||||
wxT("base directory shouldn't end with a slash") );
|
|
||||||
|
|
||||||
wxString dirname = dirbase;
|
|
||||||
dirname << wxT("/mimelnk");
|
|
||||||
|
|
||||||
if ( !wxDir::Exists(dirname) )
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wxDir dir(dirname);
|
wxDir dir(dirname);
|
||||||
if ( !dir.IsOpened() )
|
if ( !dir.IsOpened() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// we will concatenate it with dir name to get the full path below
|
|
||||||
dirname += wxT('/');
|
|
||||||
|
|
||||||
wxString subdir;
|
wxString subdir;
|
||||||
bool cont = dir.GetFirst(&subdir, wxEmptyString, wxDIR_DIRS);
|
bool cont = dir.GetFirst(&subdir, wxEmptyString, wxDIR_DIRS);
|
||||||
while ( cont )
|
while ( cont )
|
||||||
@@ -969,131 +931,322 @@ void wxMimeTypesManagerImpl::LoadKDELinkFilesFromDir(const wxString& dirbase,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Read a KDE .desktop file of type 'Application'
|
||||||
|
void wxMimeTypesManagerImpl::LoadKDEApp(const wxString& filename)
|
||||||
|
{
|
||||||
|
wxMimeTextFile file;
|
||||||
|
if ( !file.Open(filename) ) return;
|
||||||
|
wxLogTrace(TRACE_MIME, wxT("loading KDE file %s"), filename.c_str());
|
||||||
|
|
||||||
|
// Here, only type 'Application' should be considered.
|
||||||
|
int nIndex = file.pIndexOf( wxT("Type=") );
|
||||||
|
if (nIndex != wxNOT_FOUND &&
|
||||||
|
file.GetCmd(nIndex).Lower() != wxT("application"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// The hidden entry specifies a file to be ignored.
|
||||||
|
nIndex = file.pIndexOf( wxT("Hidden=") );
|
||||||
|
if (nIndex != wxNOT_FOUND && file.GetCmd(nIndex).Lower() == wxT("true"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Semicolon separated list of mime types handled by the application.
|
||||||
|
nIndex = file.pIndexOf( wxT("MimeType=") );
|
||||||
|
if (nIndex == wxNOT_FOUND)
|
||||||
|
return;
|
||||||
|
wxString mimetypes = file.GetCmd (nIndex);
|
||||||
|
|
||||||
|
// Name of the application
|
||||||
|
wxString nameapp;
|
||||||
|
nIndex = wxNOT_FOUND;
|
||||||
|
#if wxUSE_INTL // try "Name[locale name]" first
|
||||||
|
wxLocale *locale = wxGetLocale();
|
||||||
|
if ( locale )
|
||||||
|
nIndex = file.pIndexOf(_T("Name[")+locale->GetName()+_T("]="));
|
||||||
|
#endif // wxUSE_INTL
|
||||||
|
if(nIndex == wxNOT_FOUND)
|
||||||
|
nIndex = file.pIndexOf( wxT("Name=") );
|
||||||
|
if(nIndex != wxNOT_FOUND)
|
||||||
|
nameapp = file.GetCmd(nIndex);
|
||||||
|
|
||||||
|
// Icon of the application.
|
||||||
|
wxString nameicon, namemini;
|
||||||
|
nIndex = wxNOT_FOUND;
|
||||||
|
#if wxUSE_INTL // try "Icon[locale name]" first
|
||||||
|
if ( locale )
|
||||||
|
nIndex = file.pIndexOf(_T("Icon[")+locale->GetName()+_T("]="));
|
||||||
|
#endif // wxUSE_INTL
|
||||||
|
if(nIndex == wxNOT_FOUND)
|
||||||
|
nIndex = file.pIndexOf( wxT("Icon=") );
|
||||||
|
if(nIndex != wxNOT_FOUND) {
|
||||||
|
nameicon = wxString(wxT("--icon ")) + file.GetCmd(nIndex);
|
||||||
|
namemini = wxString(wxT("--miniicon ")) + file.GetCmd(nIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace some of the field code in the 'Exec' entry.
|
||||||
|
// TODO: deal with %d, %D, %n, %N, %k and %v (but last one is deprecated)
|
||||||
|
nIndex = file.pIndexOf( wxT("Exec=") );
|
||||||
|
if (nIndex == wxNOT_FOUND)
|
||||||
|
return;
|
||||||
|
wxString sCmd = file.GetCmd(nIndex);
|
||||||
|
// we expect %f; others including %F and %U and %u are possible
|
||||||
|
sCmd.Replace(wxT("%F"), wxT("%f"));
|
||||||
|
sCmd.Replace(wxT("%U"), wxT("%f"));
|
||||||
|
sCmd.Replace(wxT("%u"), wxT("%f"));
|
||||||
|
if (0 == sCmd.Replace ( wxT("%f"), wxT("%s") ))
|
||||||
|
sCmd = sCmd + wxT(" %s");
|
||||||
|
sCmd.Replace(wxT("%c"), nameapp);
|
||||||
|
sCmd.Replace(wxT("%i"), nameicon);
|
||||||
|
sCmd.Replace(wxT("%m"), namemini);
|
||||||
|
|
||||||
|
wxStringTokenizer tokenizer(mimetypes, _T(";"));
|
||||||
|
while(tokenizer.HasMoreTokens()) {
|
||||||
|
wxString mimetype = tokenizer.GetNextToken().Lower();
|
||||||
|
int nIndex = m_aTypes.Index(mimetype);
|
||||||
|
if(nIndex != wxNOT_FOUND) { // is this a known MIME type?
|
||||||
|
wxMimeTypeCommands* entry = m_aEntries[nIndex];
|
||||||
|
entry->AddOrReplaceVerb(wxT("open"), sCmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMimeTypesManagerImpl::LoadKDEAppsFilesFromDir(const wxString& dirname)
|
||||||
|
{
|
||||||
|
if(! wxDir::Exists(dirname))
|
||||||
|
return;
|
||||||
|
wxDir dir(dirname);
|
||||||
|
if ( !dir.IsOpened() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
wxString filename;
|
||||||
|
// Look into .desktop files
|
||||||
|
bool cont = dir.GetFirst(&filename, _T("*.desktop"), wxDIR_FILES);
|
||||||
|
while(cont) {
|
||||||
|
wxFileName p(dirname, filename);
|
||||||
|
LoadKDEApp( p.GetFullPath() );
|
||||||
|
cont = dir.GetNext(&filename);
|
||||||
|
}
|
||||||
|
// Look recursively into subdirs
|
||||||
|
cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_DIRS);
|
||||||
|
while(cont) {
|
||||||
|
wxFileName p(dirname, wxEmptyString);
|
||||||
|
p.AppendDir(filename);
|
||||||
|
LoadKDEAppsFilesFromDir( p.GetPath() );
|
||||||
|
cont = dir.GetNext(&filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return base KDE directories.
|
||||||
|
// 1) Environment variable $KDEHOME, or "~/.kde" if not set.
|
||||||
|
// 2) List of directories in colon separated environment variable $KDEDIRS.
|
||||||
|
// 3) Environment variable $KDEDIR in case $KDEDIRS is not set.
|
||||||
|
// Notice at least the local kde directory is added to the list. If it is the
|
||||||
|
// only one, use later the application 'kde-config' to get additional paths.
|
||||||
|
static void GetKDEBaseDirs(wxArrayString& basedirs)
|
||||||
|
{
|
||||||
|
wxString env = wxGetenv( wxT("KDEHOME") );
|
||||||
|
if(env.IsEmpty())
|
||||||
|
env = wxGetHomeDir() + wxT("/.kde");
|
||||||
|
basedirs.Add(env);
|
||||||
|
|
||||||
|
env = wxGetenv( wxT("KDEDIRS") );
|
||||||
|
if(env.IsEmpty()) {
|
||||||
|
env = wxGetenv( wxT("KDEDIR") );
|
||||||
|
if(! env.IsEmpty())
|
||||||
|
basedirs.Add(env);
|
||||||
|
} else {
|
||||||
|
wxStringTokenizer tokenizer(env, wxT(":"));
|
||||||
|
while(tokenizer.HasMoreTokens())
|
||||||
|
basedirs.Add( tokenizer.GetNextToken() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static wxString ReadPathFromKDEConfig(const wxString& request)
|
||||||
|
{
|
||||||
|
wxString str;
|
||||||
|
wxArrayString output;
|
||||||
|
if(wxExecute(wxT("kde-config --path ")+request, output) == 0 &&
|
||||||
|
output.Count() > 0)
|
||||||
|
str = output.Item(0);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to find the "Theme" entry in the configuration file, provided it exists.
|
||||||
|
static wxString GetKDEThemeInFile(const wxFileName& filename)
|
||||||
|
{
|
||||||
|
wxString theme;
|
||||||
|
wxTextFile config;
|
||||||
|
if(filename.FileExists() && config.Open( filename.GetFullPath() )) {
|
||||||
|
size_t cnt = config.GetLineCount();
|
||||||
|
for(size_t i = 0; i < cnt; i++)
|
||||||
|
if(config[i].StartsWith(wxT("Theme="), &theme))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to find a file "kdeglobals" in one of the directories and read the
|
||||||
|
// "Theme" entry there.
|
||||||
|
static wxString GetKDETheme(const wxArrayString& basedirs)
|
||||||
|
{
|
||||||
|
wxString theme;
|
||||||
|
for(size_t i = 0; i < basedirs.Count(); i++) {
|
||||||
|
wxFileName filename(basedirs.Item(i), wxEmptyString);
|
||||||
|
filename.AppendDir( wxT("share") );
|
||||||
|
filename.AppendDir( wxT("config") );
|
||||||
|
filename.SetName( wxT("kdeglobals") );
|
||||||
|
theme = GetKDEThemeInFile(filename);
|
||||||
|
if(! theme.IsEmpty())
|
||||||
|
return theme;
|
||||||
|
}
|
||||||
|
// If $KDEDIRS and $KDEDIR were set, we try nothing more. Otherwise, we
|
||||||
|
// try to get the configuration file with 'kde-config'.
|
||||||
|
if(basedirs.Count() > 1)
|
||||||
|
return theme;
|
||||||
|
wxString paths = ReadPathFromKDEConfig(wxT("config"));
|
||||||
|
if(! paths.IsEmpty()) {
|
||||||
|
wxStringTokenizer tokenizer(paths, wxT(":"));
|
||||||
|
while( tokenizer.HasMoreTokens() ) {
|
||||||
|
wxFileName filename(tokenizer.GetNextToken(), wxT("kdeglobals"));
|
||||||
|
theme = GetKDEThemeInFile(filename);
|
||||||
|
if(! theme.IsEmpty())
|
||||||
|
return theme;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get list of directories of icons.
|
||||||
|
static void GetKDEIconDirs(const wxArrayString& basedirs,
|
||||||
|
wxArrayString& icondirs)
|
||||||
|
{
|
||||||
|
wxString theme = GetKDETheme(basedirs);
|
||||||
|
if(theme.IsEmpty())
|
||||||
|
theme = wxT("default.kde");
|
||||||
|
|
||||||
|
for(size_t i = 0; i < basedirs.Count(); i++) {
|
||||||
|
wxFileName dirname(basedirs.Item(i), wxEmptyString);
|
||||||
|
dirname.AppendDir( wxT("share") );
|
||||||
|
dirname.AppendDir( wxT("icons") );
|
||||||
|
dirname.AppendDir(theme);
|
||||||
|
dirname.AppendDir( wxT("32x32") );
|
||||||
|
dirname.AppendDir( wxT("mimetypes") );
|
||||||
|
if( wxDir::Exists( dirname.GetPath() ) )
|
||||||
|
icondirs.Add( dirname.GetPath() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If $KDEDIRS and $KDEDIR were not set, use 'kde-config'
|
||||||
|
if(basedirs.Count() > 1)
|
||||||
|
return;
|
||||||
|
wxString paths = ReadPathFromKDEConfig(wxT("icon"));
|
||||||
|
if(! paths.IsEmpty()) {
|
||||||
|
wxStringTokenizer tokenizer(paths, wxT(":"));
|
||||||
|
while( tokenizer.HasMoreTokens() ) {
|
||||||
|
wxFileName dirname(tokenizer.GetNextToken(), wxEmptyString);
|
||||||
|
dirname.AppendDir(theme);
|
||||||
|
dirname.AppendDir( wxT("32x32") );
|
||||||
|
dirname.AppendDir( wxT("mimetypes") );
|
||||||
|
if(icondirs.Index(dirname.GetPath()) == wxNOT_FOUND &&
|
||||||
|
wxDir::Exists( dirname.GetPath() ) )
|
||||||
|
icondirs.Add( dirname.GetPath() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get list of directories of mime types.
|
||||||
|
static void GetKDEMimeDirs(const wxArrayString& basedirs,
|
||||||
|
wxArrayString& mimedirs)
|
||||||
|
{
|
||||||
|
for(size_t i = 0; i < basedirs.Count(); i++) {
|
||||||
|
wxFileName dirname(basedirs.Item(i), wxEmptyString);
|
||||||
|
dirname.AppendDir( wxT("share") );
|
||||||
|
dirname.AppendDir( wxT("mimelnk") );
|
||||||
|
if( wxDir::Exists( dirname.GetPath() ) )
|
||||||
|
mimedirs.Add( dirname.GetPath() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If $KDEDIRS and $KDEDIR were not set, use 'kde-config'
|
||||||
|
if(basedirs.Count() > 1)
|
||||||
|
return;
|
||||||
|
wxString paths = ReadPathFromKDEConfig(wxT("mime"));
|
||||||
|
if(! paths.IsEmpty()) {
|
||||||
|
wxStringTokenizer tokenizer(paths, wxT(":"));
|
||||||
|
while( tokenizer.HasMoreTokens() ) {
|
||||||
|
wxFileName p(tokenizer.GetNextToken(), wxEmptyString);
|
||||||
|
wxString dirname = p.GetPath(); // To remove possible trailing '/'
|
||||||
|
if(mimedirs.Index(dirname) == wxNOT_FOUND &&
|
||||||
|
wxDir::Exists(dirname) )
|
||||||
|
mimedirs.Add(dirname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get list of directories of application desktop files.
|
||||||
|
static void GetKDEAppsDirs(const wxArrayString& basedirs,
|
||||||
|
wxArrayString& appsdirs)
|
||||||
|
{
|
||||||
|
for(size_t i = 0; i < basedirs.Count(); i++) {
|
||||||
|
wxFileName dirname(basedirs.Item(i), wxEmptyString);
|
||||||
|
dirname.AppendDir( wxT("share") );
|
||||||
|
dirname.AppendDir( wxT("applnk") );
|
||||||
|
if( wxDir::Exists( dirname.GetPath() ) )
|
||||||
|
appsdirs.Add( dirname.GetPath() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If $KDEDIRS and $KDEDIR were not set, use 'kde-config'
|
||||||
|
if(basedirs.Count() > 1)
|
||||||
|
return;
|
||||||
|
wxString paths = ReadPathFromKDEConfig(wxT("apps"));
|
||||||
|
if(! paths.IsEmpty()) {
|
||||||
|
wxStringTokenizer tokenizer(paths, wxT(":"));
|
||||||
|
while( tokenizer.HasMoreTokens() ) {
|
||||||
|
wxFileName p(tokenizer.GetNextToken(), wxEmptyString);
|
||||||
|
wxString dirname = p.GetPath(); // To remove possible trailing '/'
|
||||||
|
if(appsdirs.Index(dirname) == wxNOT_FOUND &&
|
||||||
|
wxDir::Exists(dirname) )
|
||||||
|
appsdirs.Add(dirname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
paths = ReadPathFromKDEConfig(wxT("xdgdata-apps"));
|
||||||
|
if(! paths.IsEmpty()) {
|
||||||
|
wxStringTokenizer tokenizer(paths, wxT(":"));
|
||||||
|
while( tokenizer.HasMoreTokens() ) {
|
||||||
|
wxFileName p(tokenizer.GetNextToken(), wxEmptyString);
|
||||||
|
wxString dirname = p.GetPath(); // To remove possible trailing '/'
|
||||||
|
if(appsdirs.Index(dirname) == wxNOT_FOUND &&
|
||||||
|
wxDir::Exists(dirname) )
|
||||||
|
appsdirs.Add(dirname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill database with all mime types.
|
||||||
void wxMimeTypesManagerImpl::GetKDEMimeInfo(const wxString& sExtraDir)
|
void wxMimeTypesManagerImpl::GetKDEMimeInfo(const wxString& sExtraDir)
|
||||||
{
|
{
|
||||||
wxArrayString dirs;
|
wxArrayString basedirs;
|
||||||
|
GetKDEBaseDirs(basedirs);
|
||||||
|
|
||||||
wxArrayString icondirs;
|
wxArrayString icondirs;
|
||||||
|
GetKDEIconDirs(basedirs, icondirs);
|
||||||
|
wxArrayString mimedirs;
|
||||||
|
GetKDEMimeDirs(basedirs, mimedirs);
|
||||||
|
wxArrayString appsdirs;
|
||||||
|
GetKDEAppsDirs(basedirs, appsdirs);
|
||||||
|
|
||||||
// FIXME: This code is heavily broken. There are three bugs in it:
|
if(! sExtraDir.IsEmpty()) {
|
||||||
// 1) it uses only KDEDIR, which is deprecated, instead of using
|
icondirs.Add(sExtraDir + wxT("/icons"));
|
||||||
// list of paths from KDEDIRS and using KDEDIR only if KDEDIRS
|
mimedirs.Add(sExtraDir + wxT("/mimelnk"));
|
||||||
// is not set
|
appsdirs.Add(sExtraDir + wxT("/applnk"));
|
||||||
// 2) it doesn't look into ~/.kde/share/config/kdeglobals where
|
|
||||||
// user's settings are stored and thus *ignores* user's settings
|
|
||||||
// instead of respecting them
|
|
||||||
// 3) it "tries to guess KDEDIR" and "tries a few likely theme
|
|
||||||
// names", both of which is completely arbitrary; instead, the
|
|
||||||
// code should give up if KDEDIR(S) is not set and/or the icon
|
|
||||||
// theme cannot be determined, because it means that the user is
|
|
||||||
// not using KDE (and thus is not interested in KDE icons anyway)
|
|
||||||
|
|
||||||
// the variable $KDEDIR is set when KDE is running
|
|
||||||
wxString kdedir = wxGetenv( wxT("KDEDIR") );
|
|
||||||
|
|
||||||
if (!kdedir.empty())
|
|
||||||
{
|
|
||||||
// $(KDEDIR)/share/config/kdeglobals holds info
|
|
||||||
// the current icons theme
|
|
||||||
wxFileName configFile( kdedir, wxEmptyString );
|
|
||||||
configFile.AppendDir( wxT("share") );
|
|
||||||
configFile.AppendDir( wxT("config") );
|
|
||||||
configFile.SetName( wxT("kdeglobals") );
|
|
||||||
|
|
||||||
wxTextFile config;
|
|
||||||
if (configFile.FileExists() && config.Open(configFile.GetFullPath()))
|
|
||||||
{
|
|
||||||
// $(KDEDIR)/share/config -> $(KDEDIR)/share
|
|
||||||
configFile.RemoveDir( configFile.GetDirCount() - 1 );
|
|
||||||
// $(KDEDIR)/share/ -> $(KDEDIR)/share/icons
|
|
||||||
configFile.AppendDir( wxT("icons") );
|
|
||||||
|
|
||||||
// Check for entry
|
|
||||||
wxString theme(wxT("default.kde"));
|
|
||||||
size_t nCount = config.GetLineCount();
|
|
||||||
for (size_t i = 0; i < nCount; i++)
|
|
||||||
{
|
|
||||||
if (config[i].StartsWith(wxT("Theme="), &theme/*rest*/))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
configFile.AppendDir(theme);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// $(KDEDIR)/share/config -> $(KDEDIR)/share
|
|
||||||
configFile.RemoveDir( configFile.GetDirCount() - 1 );
|
|
||||||
|
|
||||||
// $(KDEDIR)/share/ -> $(KDEDIR)/share/icons
|
|
||||||
configFile.AppendDir( wxT("icons") );
|
|
||||||
|
|
||||||
// $(KDEDIR)/share/icons -> $(KDEDIR)/share/icons/default.kde
|
|
||||||
configFile.AppendDir( wxT("default.kde") );
|
|
||||||
}
|
|
||||||
|
|
||||||
configFile.SetName( wxEmptyString );
|
|
||||||
configFile.AppendDir( wxT("32x32") );
|
|
||||||
configFile.AppendDir( wxT("mimetypes") );
|
|
||||||
|
|
||||||
// Just try a few likely icons theme names
|
|
||||||
|
|
||||||
int pos = configFile.GetDirCount() - 3;
|
|
||||||
|
|
||||||
if (!wxDir::Exists(configFile.GetPath()))
|
|
||||||
{
|
|
||||||
configFile.RemoveDir( pos );
|
|
||||||
configFile.InsertDir( pos, wxT("default.kde") );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wxDir::Exists(configFile.GetPath()))
|
|
||||||
{
|
|
||||||
configFile.RemoveDir( pos );
|
|
||||||
configFile.InsertDir( pos, wxT("default") );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wxDir::Exists(configFile.GetPath()))
|
|
||||||
{
|
|
||||||
configFile.RemoveDir( pos );
|
|
||||||
configFile.InsertDir( pos, wxT("crystalsvg") );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wxDir::Exists(configFile.GetPath()))
|
|
||||||
{
|
|
||||||
configFile.RemoveDir( pos );
|
|
||||||
configFile.InsertDir( pos, wxT("crystal") );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wxDir::Exists(configFile.GetPath()))
|
|
||||||
icondirs.Add( configFile.GetFullPath() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// settings in ~/.kde have maximal priority
|
// Load mime types
|
||||||
dirs.Add(wxGetHomeDir() + wxT("/.kde/share"));
|
size_t nDirs = mimedirs.GetCount(), nDir;
|
||||||
icondirs.Add(wxGetHomeDir() + wxT("/.kde/share/icons/"));
|
for(nDir = 0; nDir < nDirs; nDir++)
|
||||||
|
LoadKDELinkFilesFromDir(mimedirs[nDir], icondirs);
|
||||||
|
|
||||||
if (kdedir)
|
// Load application files and associate them to corresponding mime types.
|
||||||
{
|
nDirs = appsdirs.GetCount();
|
||||||
dirs.Add( wxString(kdedir) + wxT("/share") );
|
for(nDir = 0; nDir < nDirs; nDir++)
|
||||||
icondirs.Add( wxString(kdedir) + wxT("/share/icons/") );
|
LoadKDEAppsFilesFromDir(appsdirs[nDir]);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// try to guess KDEDIR
|
|
||||||
dirs.Add(wxT("/usr/share"));
|
|
||||||
dirs.Add(wxT("/opt/kde/share"));
|
|
||||||
icondirs.Add(wxT("/usr/share/icons/"));
|
|
||||||
icondirs.Add(wxT("/usr/X11R6/share/icons/")); // Debian/Corel linux
|
|
||||||
icondirs.Add(wxT("/opt/kde/share/icons/"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sExtraDir.empty())
|
|
||||||
dirs.Add(sExtraDir);
|
|
||||||
icondirs.Add(sExtraDir + wxT("/icons"));
|
|
||||||
|
|
||||||
size_t nDirs = dirs.GetCount();
|
|
||||||
for ( size_t nDir = 0; nDir < nDirs; nDir++ )
|
|
||||||
{
|
|
||||||
LoadKDELinkFilesFromDir(dirs[nDir], icondirs);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user