mirror of
https://github.com/Ryujinx/Opentk.git
synced 2024-12-24 17:35:27 +00:00
Added support for setting the application (use SHGetFileInfo to retrieve the correct icon and set it when constructing a new window).
This commit is contained in:
parent
973839ef2b
commit
ef1a4488d0
|
@ -61,6 +61,7 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
using HRESULT = System.IntPtr;
|
using HRESULT = System.IntPtr;
|
||||||
|
|
||||||
|
using DWORD_PTR = System.IntPtr;
|
||||||
using UINT_PTR = System.UIntPtr;
|
using UINT_PTR = System.UIntPtr;
|
||||||
|
|
||||||
using TIMERPROC = Functions.TimerProc;
|
using TIMERPROC = Functions.TimerProc;
|
||||||
|
@ -1402,6 +1403,13 @@ namespace OpenTK.Platform.Windows
|
||||||
public delegate void TimerProc(HWND hwnd, WindowMessage uMsg, UINT_PTR idEvent, DWORD dwTime);
|
public delegate void TimerProc(HWND hwnd, WindowMessage uMsg, UINT_PTR idEvent, DWORD dwTime);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Shell Functions
|
||||||
|
|
||||||
|
[DllImport("shell32.dll")]
|
||||||
|
public static extern DWORD_PTR SHGetFileInfo(LPCTSTR pszPath, DWORD dwFileAttributes, ref SHFILEINFO psfi, UINT cbFileInfo, ShGetFileIconFlags uFlags);
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
#region --- Constants ---
|
#region --- Constants ---
|
||||||
|
@ -2690,6 +2698,22 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region ShFileInfo
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
|
||||||
|
public struct SHFILEINFO
|
||||||
|
{
|
||||||
|
public IntPtr hIcon;
|
||||||
|
public int iIcon;
|
||||||
|
public uint dwAttributes;
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
|
||||||
|
public string szDisplayName;
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
|
||||||
|
public string szTypeName;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region --- Enums ---
|
#region --- Enums ---
|
||||||
|
@ -3933,6 +3957,51 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region ShGetFileIcon
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
enum ShGetFileIconFlags : int
|
||||||
|
{
|
||||||
|
/// <summary>get icon</summary>
|
||||||
|
Icon = 0x000000100,
|
||||||
|
/// <summary>get display name</summary>
|
||||||
|
DisplayName = 0x000000200,
|
||||||
|
/// <summary>get type name</summary>
|
||||||
|
TypeName = 0x000000400,
|
||||||
|
/// <summary>get attributes</summary>
|
||||||
|
Attributes = 0x000000800,
|
||||||
|
/// <summary>get icon location</summary>
|
||||||
|
IconLocation = 0x000001000,
|
||||||
|
/// <summary>return exe type</summary>
|
||||||
|
ExeType = 0x000002000,
|
||||||
|
/// <summary>get system icon index</summary>
|
||||||
|
SysIconIndex = 0x000004000,
|
||||||
|
/// <summary>put a link overlay on icon</summary>
|
||||||
|
LinkOverlay = 0x000008000,
|
||||||
|
/// <summary>show icon in selected state</summary>
|
||||||
|
Selected = 0x000010000,
|
||||||
|
/// <summary>get only specified attributes</summary>
|
||||||
|
Attr_Specified = 0x000020000,
|
||||||
|
/// <summary>get large icon</summary>
|
||||||
|
LargeIcon = 0x000000000,
|
||||||
|
/// <summary>get small icon</summary>
|
||||||
|
SmallIcon = 0x000000001,
|
||||||
|
/// <summary>get open icon</summary>
|
||||||
|
OpenIcon = 0x000000002,
|
||||||
|
/// <summary>get shell size icon</summary>
|
||||||
|
ShellIconSize = 0x000000004,
|
||||||
|
/// <summary>pszPath is a pidl</summary>
|
||||||
|
PIDL = 0x000000008,
|
||||||
|
/// <summary>use passed dwFileAttribute</summary>
|
||||||
|
UseFileAttributes = 0x000000010,
|
||||||
|
/// <summary>apply the appropriate overlays</summary>
|
||||||
|
AddOverlays = 0x000000020,
|
||||||
|
/// <summary>Get the index of the overlay in the upper 8 bits of the iIcon</summary>
|
||||||
|
OverlayIndex = 0x000000040,
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region --- Callbacks ---
|
#region --- Callbacks ---
|
||||||
|
|
|
@ -33,6 +33,7 @@ using System.Text;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
using OpenTK.Input;
|
using OpenTK.Input;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
namespace OpenTK.Platform.Windows
|
namespace OpenTK.Platform.Windows
|
||||||
{
|
{
|
||||||
|
@ -126,6 +127,8 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
keyboards.Add(keyboard);
|
keyboards.Add(keyboard);
|
||||||
mice.Add(mouse);
|
mice.Add(mouse);
|
||||||
|
|
||||||
|
Icon = GetApplicationIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -539,6 +542,7 @@ namespace OpenTK.Platform.Windows
|
||||||
wc.Instance = Instance;
|
wc.Instance = Instance;
|
||||||
wc.WndProc = WindowProcedureDelegate;
|
wc.WndProc = WindowProcedureDelegate;
|
||||||
wc.ClassName = ClassName;
|
wc.ClassName = ClassName;
|
||||||
|
wc.Icon = Icon != null ? Icon.Handle : IntPtr.Zero;
|
||||||
//wc.Background = Functions.GetStockObject(5);
|
//wc.Background = Functions.GetStockObject(5);
|
||||||
ushort atom = Functions.RegisterClassEx(ref wc);
|
ushort atom = Functions.RegisterClassEx(ref wc);
|
||||||
|
|
||||||
|
@ -579,6 +583,35 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region GetApplicationIcon
|
||||||
|
|
||||||
|
// Gets the shell application icon for the executing process or the default icon, if not available.
|
||||||
|
Icon GetApplicationIcon()
|
||||||
|
{
|
||||||
|
IntPtr retval = IntPtr.Zero;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
SHFILEINFO info = new SHFILEINFO();
|
||||||
|
info.szDisplayName = "";
|
||||||
|
info.szTypeName = "";
|
||||||
|
|
||||||
|
int cbFileInfo = Marshal.SizeOf(info);
|
||||||
|
ShGetFileIconFlags flags = ShGetFileIconFlags.Icon | ShGetFileIconFlags.SmallIcon | ShGetFileIconFlags.UseFileAttributes;
|
||||||
|
string path = System.Reflection.Assembly.GetEntryAssembly().CodeBase;
|
||||||
|
|
||||||
|
retval = Functions.SHGetFileInfo(path, 256, ref info, (uint)cbFileInfo, flags);
|
||||||
|
return Icon.FromHandle(info.hIcon);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Shallow exceptions and fall-back to default icon.
|
||||||
|
Debug.Print("SHGetFileInfo failed, return value: {0}", retval);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region INativeWindow Members
|
#region INativeWindow Members
|
||||||
|
@ -714,8 +747,9 @@ namespace OpenTK.Platform.Windows
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
Functions.SendMessage(window.WindowHandle, WindowMessage.SETICON, (IntPtr)1, icon == null ? IntPtr.Zero : value.Handle);
|
|
||||||
icon = value;
|
icon = value;
|
||||||
|
if (window.WindowHandle != IntPtr.Zero)
|
||||||
|
Functions.SendMessage(window.WindowHandle, WindowMessage.SETICON, (IntPtr)1, icon == null ? IntPtr.Zero : value.Handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1077,6 +1111,8 @@ namespace OpenTK.Platform.Windows
|
||||||
{
|
{
|
||||||
// Safe to clean managed resources
|
// Safe to clean managed resources
|
||||||
DestroyWindow();
|
DestroyWindow();
|
||||||
|
if (Icon != null)
|
||||||
|
Icon.Dispose();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue