mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-08 20:27:36 +02:00
reorganize methods
This commit is contained in:
@@ -74,19 +74,7 @@ namespace Wox.Plugin.Program.Programs
|
|||||||
var appListEntry = manifestApp.GetStringValue("AppListEntry");
|
var appListEntry = manifestApp.GetStringValue("AppListEntry");
|
||||||
if (appListEntry != "none")
|
if (appListEntry != "none")
|
||||||
{
|
{
|
||||||
var app = new Application
|
var app = new Application(manifestApp, this);
|
||||||
{
|
|
||||||
UserModelId = manifestApp.GetAppUserModelId(),
|
|
||||||
DisplayName = manifestApp.GetStringValue("DisplayName"),
|
|
||||||
Description = manifestApp.GetStringValue("Description"),
|
|
||||||
BackgroundColor = manifestApp.GetStringValue("BackgroundColor"),
|
|
||||||
Location = Location
|
|
||||||
};
|
|
||||||
app.DisplayName = ResourceFromPri(FullName, app.DisplayName);
|
|
||||||
app.Description = ResourceFromPri(FullName, app.Description);
|
|
||||||
// todo move into Application class, so it can specific app info when logo error
|
|
||||||
app.LogoUri = LogoUriFromManifest(manifestApp);
|
|
||||||
app.LogoPath = LogoPathFromUri(app.LogoUri);
|
|
||||||
apps.Add(app);
|
apps.Add(app);
|
||||||
}
|
}
|
||||||
manifestApps.MoveNext();
|
manifestApps.MoveNext();
|
||||||
@@ -95,8 +83,10 @@ namespace Wox.Plugin.Program.Programs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// http://www.hanselman.com/blog/GetNamespacesFromAnXMLDocumentWithXPathDocumentAndLINQToXML.aspx
|
/// http://www.hanselman.com/blog/GetNamespacesFromAnXMLDocumentWithXPathDocumentAndLINQToXML.aspx
|
||||||
private static string[] XmlNamespaces(string path)
|
private string[] XmlNamespaces(string path)
|
||||||
{
|
{
|
||||||
XDocument z = XDocument.Load(path);
|
XDocument z = XDocument.Load(path);
|
||||||
if (z.Root != null)
|
if (z.Root != null)
|
||||||
@@ -114,7 +104,7 @@ namespace Wox.Plugin.Program.Programs
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Error($"can't find namespaces for <{path}>");
|
Log.Error($"can't find namespaces for <{path}>");
|
||||||
return new string[] {};
|
return new string[] { };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,156 +126,18 @@ namespace Wox.Plugin.Program.Programs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Error($"Unknown Appmanifest version: {FullName}");
|
Log.Error($"Unknown Appmanifest version: {FullName}, Package location: <{Location}>.");
|
||||||
Version = PackageVersion.Unknown;
|
Version = PackageVersion.Unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string LogoUriFromManifest(IAppxManifestApplication app)
|
|
||||||
{
|
|
||||||
var logoKeyFromVersion = new Dictionary<PackageVersion, string>
|
|
||||||
{
|
|
||||||
{PackageVersion.Windows10, "Square44x44Logo"},
|
|
||||||
{PackageVersion.Windows81, "Square30x30Logo"},
|
|
||||||
{PackageVersion.Windows8, "SmallLogo"},
|
|
||||||
};
|
|
||||||
if (logoKeyFromVersion.ContainsKey(Version))
|
|
||||||
{
|
|
||||||
var key = logoKeyFromVersion[Version];
|
|
||||||
var logoUri = app.GetStringValue(key);
|
|
||||||
return logoUri;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private string LogoPathFromUri(string uri)
|
|
||||||
{
|
|
||||||
// all https://msdn.microsoft.com/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets
|
|
||||||
// windows 10 https://msdn.microsoft.com/en-us/library/windows/apps/dn934817.aspx
|
|
||||||
// windows 8.1 https://msdn.microsoft.com/en-us/library/windows/apps/hh965372.aspx#target_size
|
|
||||||
// windows 8 https://msdn.microsoft.com/en-us/library/windows/apps/br211475.aspx
|
|
||||||
|
|
||||||
string path;
|
|
||||||
if (uri.Contains("\\"))
|
|
||||||
{
|
|
||||||
path = Path.Combine(Location, uri);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// for C:\Windows\MiracastView etc
|
|
||||||
path = Path.Combine(Location, "Assets", uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
var extension = Path.GetExtension(path);
|
|
||||||
if (extension != null)
|
|
||||||
{
|
|
||||||
var end = path.Length - extension.Length;
|
|
||||||
var prefix = path.Substring(0, end);
|
|
||||||
var paths = new List<string> {path};
|
|
||||||
|
|
||||||
// todo hidpi icon
|
|
||||||
if (Version == PackageVersion.Windows10)
|
|
||||||
{
|
|
||||||
paths.Add($"{prefix}.scale-100{extension}");
|
|
||||||
paths.Add($"{prefix}.scale-200{extension}");
|
|
||||||
}
|
|
||||||
else if (Version == PackageVersion.Windows81)
|
|
||||||
{
|
|
||||||
paths.Add($"{prefix}.scale-100{extension}");
|
|
||||||
paths.Add($"{prefix}.scale-120{extension}");
|
|
||||||
paths.Add($"{prefix}.scale-140{extension}");
|
|
||||||
paths.Add($"{prefix}.scale-160{extension}");
|
|
||||||
paths.Add($"{prefix}.scale-180{extension}");
|
|
||||||
}
|
|
||||||
else if (Version == PackageVersion.Windows8)
|
|
||||||
{
|
|
||||||
paths.Add($"{prefix}.scale-100{extension}");
|
|
||||||
}
|
|
||||||
|
|
||||||
var selected = paths.FirstOrDefault(File.Exists);
|
|
||||||
if (!string.IsNullOrEmpty(selected))
|
|
||||||
{
|
|
||||||
return selected;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Log.Error($"<{FullName}> can't find logo uri: <{uri}>");
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Log.Error($"<{FullName}> cantains uri doesn't have extension: <{uri}>");
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private string ResourceFromPri(string packageFullName, string resourceReference)
|
|
||||||
{
|
|
||||||
const string prefix = "ms-resource:";
|
|
||||||
if (!string.IsNullOrWhiteSpace(resourceReference) && resourceReference.StartsWith(prefix))
|
|
||||||
{
|
|
||||||
// magic comes from @talynone
|
|
||||||
// https://github.com/talynone/Wox.Plugin.WindowsUniversalAppLauncher/blob/master/StoreAppLauncher/Helpers/NativeApiHelper.cs#L139-L153
|
|
||||||
string key = resourceReference.Substring(prefix.Length);
|
|
||||||
string parsed;
|
|
||||||
if (key.StartsWith("//"))
|
|
||||||
{
|
|
||||||
parsed = prefix + key;
|
|
||||||
}
|
|
||||||
else if (key.StartsWith("/"))
|
|
||||||
{
|
|
||||||
parsed = prefix + "//" + key;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
parsed = $"{prefix}//{Name}/resources/{key}";
|
|
||||||
}
|
|
||||||
|
|
||||||
var outBuffer = new StringBuilder(128);
|
|
||||||
string source = $"@{{{packageFullName}? {parsed}}}";
|
|
||||||
var capacity = (uint) outBuffer.Capacity;
|
|
||||||
var hResult = SHLoadIndirectString(source, outBuffer, capacity, IntPtr.Zero);
|
|
||||||
if (hResult == Hresult.Ok)
|
|
||||||
{
|
|
||||||
var loaded = outBuffer.ToString();
|
|
||||||
if (!string.IsNullOrEmpty(loaded))
|
|
||||||
{
|
|
||||||
return loaded;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var error = $"Load {source} failed, null or empty result";
|
|
||||||
Log.Error(error);
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// known hresult 2147942522:
|
|
||||||
// 'Microsoft Corporation' violates pattern constraint of '\bms-resource:.{1,256}'.
|
|
||||||
// for
|
|
||||||
// Microsoft.MicrosoftOfficeHub_17.7608.23501.0_x64__8wekyb3d8bbwe: ms-resource://Microsoft.MicrosoftOfficeHub/officehubintl/AppManifest_GetOffice_Description
|
|
||||||
// Microsoft.BingFoodAndDrink_3.0.4.336_x64__8wekyb3d8bbwe: ms-resource:AppDescription
|
|
||||||
var message = $"Load {source} failed, HResult error code: {hResult}";
|
|
||||||
Log.Error(message);
|
|
||||||
var exception = Marshal.GetExceptionForHR((int) hResult);
|
|
||||||
Log.Exception(exception);
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return resourceReference;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Application[] All()
|
public static Application[] All()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
var windows10 = new Version(10, 0);
|
var windows10 = new Version(10, 0);
|
||||||
var support = Environment.OSVersion.Version.Major >= windows10.Major;
|
var support = Environment.OSVersion.Version.Major >= windows10.Major;
|
||||||
@@ -304,7 +156,7 @@ namespace Wox.Plugin.Program.Programs
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return new Application[] {};
|
return new Application[] { };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -326,7 +178,7 @@ namespace Wox.Plugin.Program.Programs
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return new Package[] {};
|
return new Package[] { };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -365,13 +217,14 @@ namespace Wox.Plugin.Program.Programs
|
|||||||
public string LogoUri { get; set; }
|
public string LogoUri { get; set; }
|
||||||
public string LogoPath { get; set; }
|
public string LogoPath { get; set; }
|
||||||
public string Location { get; set; }
|
public string Location { get; set; }
|
||||||
|
public UWP Package { get; set; }
|
||||||
|
|
||||||
private int Score(string query)
|
private int Score(string query)
|
||||||
{
|
{
|
||||||
var score1 = StringMatcher.Score(DisplayName, query);
|
var score1 = StringMatcher.Score(DisplayName, query);
|
||||||
var score2 = StringMatcher.ScoreForPinyin(DisplayName, query);
|
var score2 = StringMatcher.ScoreForPinyin(DisplayName, query);
|
||||||
var score3 = StringMatcher.Score(Description, query);
|
var score3 = StringMatcher.Score(Description, query);
|
||||||
var score = new[] {score1, score2, score3}.Max();
|
var score = new[] { score1, score2, score3 }.Max();
|
||||||
return score;
|
return score;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -445,6 +298,162 @@ namespace Wox.Plugin.Program.Programs
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Application(IAppxManifestApplication manifestApp, UWP package)
|
||||||
|
{
|
||||||
|
UserModelId = manifestApp.GetAppUserModelId();
|
||||||
|
DisplayName = manifestApp.GetStringValue("DisplayName");
|
||||||
|
Description = manifestApp.GetStringValue("Description");
|
||||||
|
BackgroundColor = manifestApp.GetStringValue("BackgroundColor");
|
||||||
|
Location = Location;
|
||||||
|
Package = package;
|
||||||
|
|
||||||
|
DisplayName = ResourceFromPri(package.FullName, DisplayName);
|
||||||
|
Description = ResourceFromPri(package.FullName, Description);
|
||||||
|
LogoUri = LogoUriFromManifest(manifestApp);
|
||||||
|
LogoPath = LogoPathFromUri(LogoUri);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal string ResourceFromPri(string packageFullName, string resourceReference)
|
||||||
|
{
|
||||||
|
const string prefix = "ms-resource:";
|
||||||
|
if (!string.IsNullOrWhiteSpace(resourceReference) && resourceReference.StartsWith(prefix))
|
||||||
|
{
|
||||||
|
// magic comes from @talynone
|
||||||
|
// https://github.com/talynone/Wox.Plugin.WindowsUniversalAppLauncher/blob/master/StoreAppLauncher/Helpers/NativeApiHelper.cs#L139-L153
|
||||||
|
string key = resourceReference.Substring(prefix.Length);
|
||||||
|
string parsed;
|
||||||
|
if (key.StartsWith("//"))
|
||||||
|
{
|
||||||
|
parsed = prefix + key;
|
||||||
|
}
|
||||||
|
else if (key.StartsWith("/"))
|
||||||
|
{
|
||||||
|
parsed = prefix + "//" + key;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
parsed = prefix + "///resources/" + key;
|
||||||
|
}
|
||||||
|
|
||||||
|
var outBuffer = new StringBuilder(128);
|
||||||
|
string source = $"@{{{packageFullName}? {parsed}}}";
|
||||||
|
var capacity = (uint)outBuffer.Capacity;
|
||||||
|
var hResult = SHLoadIndirectString(source, outBuffer, capacity, IntPtr.Zero);
|
||||||
|
if (hResult == Hresult.Ok)
|
||||||
|
{
|
||||||
|
var loaded = outBuffer.ToString();
|
||||||
|
if (!string.IsNullOrEmpty(loaded))
|
||||||
|
{
|
||||||
|
return loaded;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.Error($"Load {source} failed, null or empty result. Package location: <{Location}>.");
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// known hresult 2147942522:
|
||||||
|
// 'Microsoft Corporation' violates pattern constraint of '\bms-resource:.{1,256}'.
|
||||||
|
// for
|
||||||
|
// Microsoft.MicrosoftOfficeHub_17.7608.23501.0_x64__8wekyb3d8bbwe: ms-resource://Microsoft.MicrosoftOfficeHub/officehubintl/AppManifest_GetOffice_Description
|
||||||
|
// Microsoft.BingFoodAndDrink_3.0.4.336_x64__8wekyb3d8bbwe: ms-resource:AppDescription
|
||||||
|
Log.Error($"Load {source} failed, HResult error code: {hResult}. Package location: <{Location}>.");
|
||||||
|
var exception = Marshal.GetExceptionForHR((int)hResult);
|
||||||
|
Log.Exception(exception);
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return resourceReference;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
internal string LogoUriFromManifest(IAppxManifestApplication app)
|
||||||
|
{
|
||||||
|
var logoKeyFromVersion = new Dictionary<PackageVersion, string>
|
||||||
|
{
|
||||||
|
{PackageVersion.Windows10, "Square44x44Logo"},
|
||||||
|
{PackageVersion.Windows81, "Square30x30Logo"},
|
||||||
|
{PackageVersion.Windows8, "SmallLogo"},
|
||||||
|
};
|
||||||
|
if (logoKeyFromVersion.ContainsKey(Package.Version))
|
||||||
|
{
|
||||||
|
var key = logoKeyFromVersion[Package.Version];
|
||||||
|
var logoUri = app.GetStringValue(key);
|
||||||
|
return logoUri;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal string LogoPathFromUri(string uri)
|
||||||
|
{
|
||||||
|
// all https://msdn.microsoft.com/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets
|
||||||
|
// windows 10 https://msdn.microsoft.com/en-us/library/windows/apps/dn934817.aspx
|
||||||
|
// windows 8.1 https://msdn.microsoft.com/en-us/library/windows/apps/hh965372.aspx#target_size
|
||||||
|
// windows 8 https://msdn.microsoft.com/en-us/library/windows/apps/br211475.aspx
|
||||||
|
|
||||||
|
string path;
|
||||||
|
if (uri.Contains("\\"))
|
||||||
|
{
|
||||||
|
path = Path.Combine(Location, uri);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// for C:\Windows\MiracastView etc
|
||||||
|
path = Path.Combine(Location, "Assets", uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
var extension = Path.GetExtension(path);
|
||||||
|
if (extension != null)
|
||||||
|
{
|
||||||
|
var end = path.Length - extension.Length;
|
||||||
|
var prefix = path.Substring(0, end);
|
||||||
|
var paths = new List<string> { path };
|
||||||
|
|
||||||
|
// todo hidpi icon
|
||||||
|
if (Package.Version == PackageVersion.Windows10)
|
||||||
|
{
|
||||||
|
paths.Add($"{prefix}.scale-100{extension}");
|
||||||
|
paths.Add($"{prefix}.scale-200{extension}");
|
||||||
|
}
|
||||||
|
else if (Package.Version == PackageVersion.Windows81)
|
||||||
|
{
|
||||||
|
paths.Add($"{prefix}.scale-100{extension}");
|
||||||
|
paths.Add($"{prefix}.scale-120{extension}");
|
||||||
|
paths.Add($"{prefix}.scale-140{extension}");
|
||||||
|
paths.Add($"{prefix}.scale-160{extension}");
|
||||||
|
paths.Add($"{prefix}.scale-180{extension}");
|
||||||
|
}
|
||||||
|
else if (Package.Version == PackageVersion.Windows8)
|
||||||
|
{
|
||||||
|
paths.Add($"{prefix}.scale-100{extension}");
|
||||||
|
}
|
||||||
|
|
||||||
|
var selected = paths.FirstOrDefault(File.Exists);
|
||||||
|
if (!string.IsNullOrEmpty(selected))
|
||||||
|
{
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.Error($"<{UserModelId}> can't find logo uri: <{uri}>, Package location: <{Package.Location}>.");
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.Error($"<{UserModelId}> cantains uri doesn't have extension: <{uri}>, Package location: <{Package.Location}>.");
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public ImageSource Logo()
|
public ImageSource Logo()
|
||||||
{
|
{
|
||||||
@@ -466,7 +475,7 @@ namespace Wox.Plugin.Program.Programs
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Error($"Can't get logo for <{UserModelId}> with path <{path}>");
|
Log.Error($"Can't get logo for <{UserModelId}> with path <{path}>, Package location: <{Package.Location}>..");
|
||||||
return new BitmapImage(new Uri(Constant.ErrorIcon));
|
return new BitmapImage(new Uri(Constant.ErrorIcon));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -485,7 +494,7 @@ namespace Wox.Plugin.Program.Programs
|
|||||||
var converted = ColorConverter.ConvertFromString(BackgroundColor);
|
var converted = ColorConverter.ConvertFromString(BackgroundColor);
|
||||||
if (converted != null)
|
if (converted != null)
|
||||||
{
|
{
|
||||||
var color = (Color) converted;
|
var color = (Color)converted;
|
||||||
var brush = new SolidColorBrush(color);
|
var brush = new SolidColorBrush(color);
|
||||||
var pen = new Pen(brush, 1);
|
var pen = new Pen(brush, 1);
|
||||||
var backgroundArea = new Rect(0, 0, width, width);
|
var backgroundArea = new Rect(0, 0, width, width);
|
||||||
@@ -513,7 +522,7 @@ namespace Wox.Plugin.Program.Programs
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Error($"Can't convert background string <{BackgroundColor}> to color");
|
Log.Error($"Can't convert background string <{BackgroundColor}> to color, Package location: <{Package.Location}>.");
|
||||||
return new BitmapImage(new Uri(Constant.ErrorIcon));
|
return new BitmapImage(new Uri(Constant.ErrorIcon));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user