mirror of
https://github.com/SourMesen/Mesen.git
synced 2025-04-02 10:52:48 -04:00
Linux: Support for file associations
This commit is contained in:
parent
b916332264
commit
c62ede991f
5 changed files with 129 additions and 32 deletions
104
GUI.NET/Config/FileAssociationHelper.cs
Normal file
104
GUI.NET/Config/FileAssociationHelper.cs
Normal file
|
@ -0,0 +1,104 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using Mesen.GUI.Config;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace Mesen.GUI.Config
|
||||
{
|
||||
class FileAssociationHelper
|
||||
{
|
||||
static private string CreateMimeType(string mimeType, string extension, string description, List<string> mimeTypes, bool addType)
|
||||
{
|
||||
string baseFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), ".local", "share");
|
||||
string filename = Path.Combine(baseFolder, "mime", "packages", mimeType + ".xml");
|
||||
if(addType) {
|
||||
File.WriteAllText(filename,
|
||||
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" + Environment.NewLine +
|
||||
"<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">" + Environment.NewLine +
|
||||
"\t<mime-type type=\"application/" + mimeType + "\">" + Environment.NewLine +
|
||||
"\t\t<glob-deleteall/>" + Environment.NewLine +
|
||||
"\t\t<glob pattern=\"*." + extension + "\"/>" + Environment.NewLine +
|
||||
"\t\t<comment>" + description + "</comment>" + Environment.NewLine +
|
||||
"\t\t<icon>MesenIcon</icon>" + Environment.NewLine +
|
||||
"\t</mime-type>" + Environment.NewLine +
|
||||
"</mime-info>" + Environment.NewLine);
|
||||
|
||||
mimeTypes.Add(mimeType);
|
||||
} else if(File.Exists(filename)) {
|
||||
try {
|
||||
File.Delete(filename);
|
||||
} catch { }
|
||||
}
|
||||
return mimeType;
|
||||
}
|
||||
|
||||
static public void ConfigureLinuxMimeTypes()
|
||||
{
|
||||
PreferenceInfo preferenceInfo = ConfigManager.Config.PreferenceInfo;
|
||||
|
||||
string baseFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), ".local", "share");
|
||||
string desktopFolder = Path.Combine(baseFolder, "applications");
|
||||
string mimeFolder = Path.Combine(baseFolder, "mime");
|
||||
|
||||
//Use a GUID to get a unique filename and then delete old files to force a reset of file associations
|
||||
//Otherwise they are sometimes not refreshed properly
|
||||
string desktopFilename = "mesen." + Guid.NewGuid().ToString() + ".desktop";
|
||||
string desktopFile = Path.Combine(desktopFolder, desktopFilename);
|
||||
|
||||
foreach(string file in Directory.GetFiles(desktopFolder, "mesen.*.desktop")) {
|
||||
if(File.Exists(file)) {
|
||||
try {
|
||||
File.Delete(file);
|
||||
} catch { }
|
||||
}
|
||||
}
|
||||
|
||||
List<string> mimeTypes = new List<string>();
|
||||
CreateMimeType("x-mesen-nes", "nes", "NES Rom", mimeTypes, preferenceInfo.AssociateNesFiles);
|
||||
CreateMimeType("x-mesen-fds", "fds", "FDS Rom", mimeTypes, preferenceInfo.AssociateFdsFiles);
|
||||
CreateMimeType("x-mesen-nsf", "nsf", "Nintendo Sound File", mimeTypes, preferenceInfo.AssociateNsfFiles);
|
||||
CreateMimeType("x-mesen-nsfe", "nsfe", "Nintendo Sound File (extended)", mimeTypes, preferenceInfo.AssociateNsfeFiles);
|
||||
CreateMimeType("x-mesen-mmo", "mmo", "Mesen Movie File", mimeTypes, preferenceInfo.AssociateMmoFiles);
|
||||
CreateMimeType("x-mesen-unif", "unf", "NES Rom (UNIF)", mimeTypes, preferenceInfo.AssociateUnfFiles);
|
||||
|
||||
//Icon used for shortcuts
|
||||
Mesen.GUI.Properties.Resources.MesenLogo.Save(Path.Combine(baseFolder, "icons", "MesenIcon.png"), ImageFormat.Png);
|
||||
|
||||
File.WriteAllText(desktopFile,
|
||||
"[Desktop Entry]" + Environment.NewLine +
|
||||
"Type=Application" + Environment.NewLine +
|
||||
"Name=Mesen" + Environment.NewLine +
|
||||
"Comment=NES/Famicom Emulator" + Environment.NewLine +
|
||||
"Keywords=game;nes;famicom;emulator;emu;ファミコン;nintendo" + Environment.NewLine +
|
||||
"Categories=GNOME;GTK;Game;Emulator;" + Environment.NewLine +
|
||||
"MimeType=" + string.Join(";", mimeTypes.Select(type => "application/" + type)) + Environment.NewLine +
|
||||
"Exec=mono " + System.Reflection.Assembly.GetEntryAssembly().Location + " %f" + Environment.NewLine +
|
||||
"NoDisplay=false" + Environment.NewLine +
|
||||
"StartupNotify=true" + Environment.NewLine +
|
||||
"Icon=MesenIcon" + Environment.NewLine);
|
||||
|
||||
//Update databases
|
||||
System.Diagnostics.Process.Start("update-mime-database", mimeFolder).WaitForExit();
|
||||
System.Diagnostics.Process.Start("update-desktop-database", desktopFolder);
|
||||
}
|
||||
|
||||
static public void UpdateFileAssociation(string extension, bool associate)
|
||||
{
|
||||
string key = @"HKEY_CURRENT_USER\Software\Classes\." + extension;
|
||||
if(associate) {
|
||||
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\Mesen\shell\open\command", null, Application.ExecutablePath + " \"%1\"");
|
||||
Registry.SetValue(key, null, "Mesen");
|
||||
} else {
|
||||
//Unregister Mesen if Mesen was registered for .nes files
|
||||
object regKey = Registry.GetValue(key, null, "");
|
||||
if(regKey != null && regKey.Equals("Mesen")) {
|
||||
Registry.SetValue(key, null, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,14 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Mesen.GUI.Forms;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace Mesen.GUI.Config
|
||||
{
|
||||
|
@ -76,32 +67,21 @@ namespace Mesen.GUI.Config
|
|||
}
|
||||
}
|
||||
|
||||
static private void UpdateFileAssociation(string extension, bool associate)
|
||||
{
|
||||
string key = @"HKEY_CURRENT_USER\Software\Classes\." + extension;
|
||||
if(associate) {
|
||||
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\Mesen\shell\open\command", null, Application.ExecutablePath + " \"%1\"");
|
||||
Registry.SetValue(key, null, "Mesen");
|
||||
} else {
|
||||
//Unregister Mesen if Mesen was registered for .nes files
|
||||
object regKey = Registry.GetValue(key, null, "");
|
||||
if(regKey != null && regKey.Equals("Mesen")) {
|
||||
Registry.SetValue(key, null, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static public void ApplyConfig()
|
||||
{
|
||||
PreferenceInfo preferenceInfo = ConfigManager.Config.PreferenceInfo;
|
||||
|
||||
UpdateFileAssociation("nes", preferenceInfo.AssociateNesFiles);
|
||||
UpdateFileAssociation("fds", preferenceInfo.AssociateFdsFiles);
|
||||
UpdateFileAssociation("mmo", preferenceInfo.AssociateMmoFiles);
|
||||
UpdateFileAssociation("mst", preferenceInfo.AssociateMstFiles);
|
||||
UpdateFileAssociation("nsf", preferenceInfo.AssociateNsfFiles);
|
||||
UpdateFileAssociation("nsfe", preferenceInfo.AssociateNsfeFiles);
|
||||
UpdateFileAssociation("unf", preferenceInfo.AssociateUnfFiles);
|
||||
if(Program.IsMono) {
|
||||
FileAssociationHelper.ConfigureLinuxMimeTypes();
|
||||
} else {
|
||||
FileAssociationHelper.UpdateFileAssociation("nes", preferenceInfo.AssociateNesFiles);
|
||||
FileAssociationHelper.UpdateFileAssociation("fds", preferenceInfo.AssociateFdsFiles);
|
||||
FileAssociationHelper.UpdateFileAssociation("mmo", preferenceInfo.AssociateMmoFiles);
|
||||
FileAssociationHelper.UpdateFileAssociation("mst", preferenceInfo.AssociateMstFiles);
|
||||
FileAssociationHelper.UpdateFileAssociation("nsf", preferenceInfo.AssociateNsfFiles);
|
||||
FileAssociationHelper.UpdateFileAssociation("nsfe", preferenceInfo.AssociateNsfeFiles);
|
||||
FileAssociationHelper.UpdateFileAssociation("unf", preferenceInfo.AssociateUnfFiles);
|
||||
}
|
||||
|
||||
InteropEmu.SetFlag(EmulationFlags.Mmc3IrqAltBehavior, preferenceInfo.UseAlternativeMmc3Irq);
|
||||
InteropEmu.SetFlag(EmulationFlags.AllowInvalidInput, preferenceInfo.AllowInvalidInput);
|
||||
|
|
|
@ -207,7 +207,7 @@ namespace Mesen.GUI.Forms
|
|||
{
|
||||
InteropEmu.InitializeEmu(ConfigManager.HomeFolder, this.Handle, this.ctrlRenderer.Handle, _noAudio, _noVideo, _noInput);
|
||||
foreach(RecentItem recentItem in ConfigManager.Config.RecentFiles) {
|
||||
InteropEmu.AddKnownGameFolder(Path.GetDirectoryName(recentItem.Path).ToLowerInvariant());
|
||||
InteropEmu.AddKnownGameFolder(Path.GetDirectoryName(recentItem.Path));
|
||||
}
|
||||
|
||||
ConfigManager.Config.InitializeDefaults();
|
||||
|
|
|
@ -214,6 +214,7 @@
|
|||
<Compile Include="Config\InputInfo.cs" />
|
||||
<Compile Include="Config\ClientConnection.cs" />
|
||||
<Compile Include="Config\Configuration.cs" />
|
||||
<Compile Include="Config\FileAssociationHelper.cs" />
|
||||
<Compile Include="Config\ImageExtensions.cs" />
|
||||
<Compile Include="Config\AudioInfo.cs" />
|
||||
<Compile Include="Config\PlayerProfile.cs" />
|
||||
|
|
|
@ -28,6 +28,9 @@ string FolderUtilities::GetHomeFolder()
|
|||
void FolderUtilities::AddKnownGameFolder(string gameFolder)
|
||||
{
|
||||
bool alreadyExists = false;
|
||||
string lowerCaseFolder = gameFolder;
|
||||
std::transform(lowerCaseFolder.begin(), lowerCaseFolder.end(), lowerCaseFolder.begin(), ::tolower);
|
||||
|
||||
for(string folder : _gameFolders) {
|
||||
std::transform(folder.begin(), folder.end(), folder.begin(), ::tolower);
|
||||
if(folder.compare(gameFolder) == 0) {
|
||||
|
@ -97,6 +100,10 @@ vector<string> FolderUtilities::GetFolders(string rootFolder)
|
|||
{
|
||||
vector<string> folders;
|
||||
|
||||
if(!fs::is_directory(rootFolder)) {
|
||||
return folders;
|
||||
}
|
||||
|
||||
for(fs::recursive_directory_iterator i(rootFolder), end; i != end; i++) {
|
||||
if(fs::is_directory(i->path())) {
|
||||
folders.push_back(i->path().string());
|
||||
|
@ -110,6 +117,11 @@ vector<string> FolderUtilities::GetFilesInFolder(string rootFolder, string mask,
|
|||
{
|
||||
vector<string> files;
|
||||
vector<string> folders = { { rootFolder } };
|
||||
|
||||
if(!fs::is_directory(rootFolder)) {
|
||||
return files;
|
||||
}
|
||||
|
||||
if(recursive) {
|
||||
for(string subFolder : GetFolders(rootFolder)) {
|
||||
folders.push_back(subFolder);
|
||||
|
|
Loading…
Add table
Reference in a new issue