Merge branch 'shortcuts'
This commit is contained in:
commit
3c1aad7d27
@ -37,7 +37,7 @@ namespace unison
|
|||||||
{
|
{
|
||||||
_systray.Dispose();
|
_systray.Dispose();
|
||||||
_snapcast.LaunchOrExit(true);
|
_snapcast.LaunchOrExit(true);
|
||||||
_hotkeys.RemoveHotKeys();
|
_hotkeys.RemoveHotkeys();
|
||||||
base.OnExit(e);
|
base.OnExit(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,21 +15,168 @@ namespace unison
|
|||||||
|
|
||||||
private const int HOTKEY_ID = 9000;
|
private const int HOTKEY_ID = 9000;
|
||||||
|
|
||||||
// modifiers
|
public enum MOD : int
|
||||||
private const uint MOD_NONE = 0x0000;
|
{
|
||||||
private const uint MOD_ALT = 0x0001;
|
None = 0x0000,
|
||||||
private const uint MOD_CONTROL = 0x0002;
|
Alt = 0x0001,
|
||||||
private const uint MOD_SHIFT = 0x0004;
|
Control = 0x0002,
|
||||||
private const uint MOD_WIN = 0x0008;
|
Shift = 0x0004,
|
||||||
|
//Win = 0x0008
|
||||||
|
};
|
||||||
|
|
||||||
// reference => https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
|
// reference => https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
|
||||||
private const uint VK_MEDIA_PREV_TRACK = 0xB1;
|
public enum VK : int
|
||||||
private const uint VK_MEDIA_NEXT_TRACK = 0xB0;
|
{
|
||||||
private const uint VK_MEDIA_PLAY_PAUSE = 0xB3;
|
None = 0x00,
|
||||||
private const uint VK_VOLUME_UP = 0xAF;
|
Back = 0x08,
|
||||||
private const uint VK_VOLUME_DOWN = 0xAE;
|
Tab = 0x09,
|
||||||
private const uint VK_VOLUME_MUTE = 0xAD;
|
Clear = 0x0c,
|
||||||
private const uint VK_ENTER = 0x0D;
|
Return = 0x0d,
|
||||||
|
Menu = 0x12,
|
||||||
|
Pause = 0x13,
|
||||||
|
Capital = 0x14,
|
||||||
|
Kana = 0x15,
|
||||||
|
Hangul = 0x15,
|
||||||
|
Junja = 0x17,
|
||||||
|
Final = 0x18,
|
||||||
|
Hanja = 0x19,
|
||||||
|
Kanji = 0x19,
|
||||||
|
Escape = 0x1b,
|
||||||
|
Convert = 0x1c,
|
||||||
|
NonConvert = 0x1d,
|
||||||
|
Accept = 0x1e,
|
||||||
|
ModeChange = 0x1f,
|
||||||
|
Space = 0x20,
|
||||||
|
Prior = 0x21,
|
||||||
|
Next = 0x22,
|
||||||
|
End = 0x23,
|
||||||
|
Home = 0x24,
|
||||||
|
Left = 0x25,
|
||||||
|
Up = 0x26,
|
||||||
|
Right = 0x27,
|
||||||
|
Down = 0x28,
|
||||||
|
Select = 0x29,
|
||||||
|
Print = 0x2a,
|
||||||
|
Execute = 0x2b,
|
||||||
|
Snapshot = 0x2c,
|
||||||
|
Insert = 0x2d,
|
||||||
|
Delete = 0x2e,
|
||||||
|
Help = 0x2f,
|
||||||
|
NumRow0 = 0x30,
|
||||||
|
NumRow1 = 0x31,
|
||||||
|
NumRow2 = 0x32,
|
||||||
|
NumRow3 = 0x33,
|
||||||
|
NumRow4 = 0x34,
|
||||||
|
NumRow5 = 0x35,
|
||||||
|
NumRow6 = 0x36,
|
||||||
|
NumRow7 = 0x37,
|
||||||
|
NumRow8 = 0x38,
|
||||||
|
NumRow9 = 0x39,
|
||||||
|
A = 0x41,
|
||||||
|
B = 0x42,
|
||||||
|
C = 0x43,
|
||||||
|
D = 0x44,
|
||||||
|
E = 0x45,
|
||||||
|
F = 0x46,
|
||||||
|
G = 0x47,
|
||||||
|
H = 0x48,
|
||||||
|
I = 0x49,
|
||||||
|
J = 0x4a,
|
||||||
|
K = 0x4b,
|
||||||
|
L = 0x4c,
|
||||||
|
M = 0x4d,
|
||||||
|
N = 0x4e,
|
||||||
|
O = 0x4f,
|
||||||
|
P = 0x50,
|
||||||
|
Q = 0x51,
|
||||||
|
R = 0x52,
|
||||||
|
S = 0x53,
|
||||||
|
T = 0x54,
|
||||||
|
U = 0x55,
|
||||||
|
V = 0x56,
|
||||||
|
W = 0x57,
|
||||||
|
X = 0x58,
|
||||||
|
Y = 0x59,
|
||||||
|
Z = 0x5a,
|
||||||
|
Apps = 0x5d,
|
||||||
|
Sleep = 0x5f,
|
||||||
|
NumPad0 = 0x60,
|
||||||
|
NumPad1 = 0x61,
|
||||||
|
NumPad2 = 0x62,
|
||||||
|
NumPad3 = 0x63,
|
||||||
|
NumPad4 = 0x64,
|
||||||
|
NumPad5 = 0x65,
|
||||||
|
NumPad6 = 0x66,
|
||||||
|
NumPad7 = 0x67,
|
||||||
|
NumPad8 = 0x68,
|
||||||
|
NumPad9 = 0x69,
|
||||||
|
Multiply = 0x6a,
|
||||||
|
Add = 0x6b,
|
||||||
|
Separator = 0x6c,
|
||||||
|
Subtract = 0x6d,
|
||||||
|
Decimal = 0x6e,
|
||||||
|
Divide = 0x6f,
|
||||||
|
F1 = 0x70,
|
||||||
|
F2 = 0x71,
|
||||||
|
F3 = 0x72,
|
||||||
|
F4 = 0x73,
|
||||||
|
F5 = 0x74,
|
||||||
|
F6 = 0x75,
|
||||||
|
F7 = 0x76,
|
||||||
|
F8 = 0x77,
|
||||||
|
F9 = 0x78,
|
||||||
|
F10 = 0x79,
|
||||||
|
F11 = 0x7a,
|
||||||
|
F12 = 0x7b,
|
||||||
|
F13 = 0x7c,
|
||||||
|
F14 = 0x7d,
|
||||||
|
F15 = 0x7e,
|
||||||
|
F16 = 0x7f,
|
||||||
|
F17 = 0x80,
|
||||||
|
F18 = 0x81,
|
||||||
|
F19 = 0x82,
|
||||||
|
F20 = 0x83,
|
||||||
|
F21 = 0x84,
|
||||||
|
F22 = 0x85,
|
||||||
|
F23 = 0x86,
|
||||||
|
F24 = 0x87,
|
||||||
|
NumLock = 0x90,
|
||||||
|
Scroll = 0x91,
|
||||||
|
LMenu = 0xa4,
|
||||||
|
RMenu = 0xa5,
|
||||||
|
BrowserBack = 0xa6,
|
||||||
|
BrowserForward = 0xa7,
|
||||||
|
BrowserRefresh = 0xa8,
|
||||||
|
BrowserStop = 0xa9,
|
||||||
|
BrowserSearch = 0xaa,
|
||||||
|
BrowserFavorites = 0xab,
|
||||||
|
BrowserHome = 0xac,
|
||||||
|
VolumeMute = 0xad,
|
||||||
|
VolumeDown = 0xae,
|
||||||
|
VolumeUp = 0xaf,
|
||||||
|
MediaNextTrack = 0xb0,
|
||||||
|
MediaPreviousTrack = 0xb1,
|
||||||
|
MediaStop = 0xb2,
|
||||||
|
MediaPlayPause = 0xb3,
|
||||||
|
LaunchMail = 0xb4,
|
||||||
|
LaunchMediaSelect = 0xb5,
|
||||||
|
LaunchApp1 = 0xb6,
|
||||||
|
LaunchApp2 = 0xb7,
|
||||||
|
};
|
||||||
|
|
||||||
|
public struct HotkeyPair
|
||||||
|
{
|
||||||
|
public MOD mod;
|
||||||
|
public VK vk;
|
||||||
|
|
||||||
|
public HotkeyPair(MOD _mod, VK _vk) { mod = _mod; vk = _vk; }
|
||||||
|
|
||||||
|
public uint GetMOD() { return (uint)mod; }
|
||||||
|
public uint GetVK() { return (uint)vk; }
|
||||||
|
|
||||||
|
public void SetMOD(MOD modmod) { mod = modmod; }
|
||||||
|
public void SetVK(VK vkvk) { vk = vkvk; }
|
||||||
|
}
|
||||||
|
|
||||||
private MainWindow _appWindow;
|
private MainWindow _appWindow;
|
||||||
private readonly MPDHandler _mpd;
|
private readonly MPDHandler _mpd;
|
||||||
@ -37,9 +184,31 @@ namespace unison
|
|||||||
private IntPtr _windowHandle;
|
private IntPtr _windowHandle;
|
||||||
private HwndSource _source;
|
private HwndSource _source;
|
||||||
|
|
||||||
|
public HotkeyPair _NextTrack;
|
||||||
|
public HotkeyPair _PreviousTrack;
|
||||||
|
public HotkeyPair _PlayPause;
|
||||||
|
public HotkeyPair _VolumeUp;
|
||||||
|
public HotkeyPair _VolumeDown;
|
||||||
|
public HotkeyPair _VolumeMute;
|
||||||
|
public HotkeyPair _ShowWindow;
|
||||||
|
public HotkeyPair[] _Shortcuts;
|
||||||
|
|
||||||
public HotkeyHandler()
|
public HotkeyHandler()
|
||||||
{
|
{
|
||||||
_mpd = (MPDHandler)Application.Current.Properties["mpd"];
|
_mpd = (MPDHandler)Application.Current.Properties["mpd"];
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initialize()
|
||||||
|
{
|
||||||
|
_NextTrack = new HotkeyPair((MOD)Properties.Settings.Default.nextTrack_mod, (VK)Properties.Settings.Default.nextTrack_vk);
|
||||||
|
_PreviousTrack = new HotkeyPair((MOD)Properties.Settings.Default.previousTrack_mod, (VK)Properties.Settings.Default.previousTrack_vk);
|
||||||
|
_PlayPause = new HotkeyPair((MOD)Properties.Settings.Default.playPause_mod, (VK)Properties.Settings.Default.playPause_vk);
|
||||||
|
_VolumeUp = new HotkeyPair((MOD)Properties.Settings.Default.volumeUp_mod, (VK)Properties.Settings.Default.volumeUp_vk);
|
||||||
|
_VolumeDown = new HotkeyPair((MOD)Properties.Settings.Default.volumeDown_mod, (VK)Properties.Settings.Default.volumeDown_vk);
|
||||||
|
_VolumeMute = new HotkeyPair((MOD)Properties.Settings.Default.volumeMute_mod, (VK)Properties.Settings.Default.volumeMute_vk);
|
||||||
|
_ShowWindow = new HotkeyPair((MOD)Properties.Settings.Default.showWindow_mod, (VK)Properties.Settings.Default.showWindow_vk);
|
||||||
|
_Shortcuts = new HotkeyPair[] { _NextTrack, _PreviousTrack, _PlayPause, _VolumeUp, _VolumeDown, _VolumeMute, _ShowWindow };
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Activate(Window win)
|
public void Activate(Window win)
|
||||||
@ -48,18 +217,28 @@ namespace unison
|
|||||||
{
|
{
|
||||||
_windowHandle = new WindowInteropHelper(win).Handle;
|
_windowHandle = new WindowInteropHelper(win).Handle;
|
||||||
_source = HwndSource.FromHwnd(_windowHandle);
|
_source = HwndSource.FromHwnd(_windowHandle);
|
||||||
_source.AddHook(HwndHook);
|
AddHotkeys();
|
||||||
|
|
||||||
RegisterHotKey(_windowHandle, HOTKEY_ID, MOD_CONTROL, VK_MEDIA_PREV_TRACK);
|
|
||||||
RegisterHotKey(_windowHandle, HOTKEY_ID, MOD_CONTROL, VK_MEDIA_NEXT_TRACK);
|
|
||||||
RegisterHotKey(_windowHandle, HOTKEY_ID, MOD_CONTROL, VK_MEDIA_PLAY_PAUSE);
|
|
||||||
RegisterHotKey(_windowHandle, HOTKEY_ID, MOD_CONTROL, VK_VOLUME_UP);
|
|
||||||
RegisterHotKey(_windowHandle, HOTKEY_ID, MOD_CONTROL, VK_VOLUME_DOWN);
|
|
||||||
RegisterHotKey(_windowHandle, HOTKEY_ID, MOD_CONTROL, VK_VOLUME_MUTE);
|
|
||||||
RegisterHotKey(_windowHandle, HOTKEY_ID, MOD_CONTROL | MOD_ALT, VK_ENTER);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddHotkeys()
|
||||||
|
{
|
||||||
|
_source.AddHook(HwndHook);
|
||||||
|
RegisterHotKey(_windowHandle, HOTKEY_ID, _NextTrack.GetMOD(), _NextTrack.GetVK());
|
||||||
|
RegisterHotKey(_windowHandle, HOTKEY_ID, _PreviousTrack.GetMOD(), _PreviousTrack.GetVK());
|
||||||
|
RegisterHotKey(_windowHandle, HOTKEY_ID, _PlayPause.GetMOD(), _PlayPause.GetVK());
|
||||||
|
RegisterHotKey(_windowHandle, HOTKEY_ID, _VolumeUp.GetMOD(), _VolumeUp.GetVK());
|
||||||
|
RegisterHotKey(_windowHandle, HOTKEY_ID, _VolumeDown.GetMOD(), _VolumeDown.GetVK());
|
||||||
|
RegisterHotKey(_windowHandle, HOTKEY_ID, _VolumeMute.GetMOD(), _VolumeMute.GetVK());
|
||||||
|
RegisterHotKey(_windowHandle, HOTKEY_ID, _ShowWindow.GetMOD(), _ShowWindow.GetVK());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveHotkeys()
|
||||||
|
{
|
||||||
|
_source.RemoveHook(HwndHook);
|
||||||
|
UnregisterHotKey(_windowHandle, HOTKEY_ID);
|
||||||
|
}
|
||||||
|
|
||||||
private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
|
private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
|
||||||
{
|
{
|
||||||
const int WM_HOTKEY = 0x0312;
|
const int WM_HOTKEY = 0x0312;
|
||||||
@ -67,61 +246,48 @@ namespace unison
|
|||||||
if (msg == WM_HOTKEY && wParam.ToInt32() == HOTKEY_ID)
|
if (msg == WM_HOTKEY && wParam.ToInt32() == HOTKEY_ID)
|
||||||
{
|
{
|
||||||
uint vkey = ((uint)lParam >> 16) & 0xFFFF;
|
uint vkey = ((uint)lParam >> 16) & 0xFFFF;
|
||||||
switch (vkey)
|
|
||||||
{
|
|
||||||
case VK_MEDIA_NEXT_TRACK:
|
|
||||||
_mpd.Next();
|
|
||||||
break;
|
|
||||||
case VK_MEDIA_PREV_TRACK:
|
|
||||||
_mpd.Prev();
|
|
||||||
break;
|
|
||||||
case VK_VOLUME_DOWN:
|
|
||||||
_mpd.VolumeDown();
|
|
||||||
break;
|
|
||||||
case VK_VOLUME_UP:
|
|
||||||
_mpd.VolumeUp();
|
|
||||||
break;
|
|
||||||
case VK_VOLUME_MUTE:
|
|
||||||
_mpd.VolumeMute();
|
|
||||||
break;
|
|
||||||
case VK_MEDIA_PLAY_PAUSE:
|
|
||||||
_mpd.PlayPause();
|
|
||||||
break;
|
|
||||||
case VK_ENTER:
|
|
||||||
if (_appWindow == null)
|
|
||||||
_appWindow = (MainWindow)Application.Current.MainWindow;
|
|
||||||
|
|
||||||
if (_appWindow.WindowState == WindowState.Minimized)
|
if (vkey == _NextTrack.GetVK())
|
||||||
|
_mpd.Next();
|
||||||
|
else if (vkey == _PreviousTrack.GetVK())
|
||||||
|
_mpd.Prev();
|
||||||
|
else if (vkey == _PlayPause.GetVK())
|
||||||
|
_mpd.PlayPause();
|
||||||
|
else if (vkey == _VolumeUp.GetVK())
|
||||||
|
_mpd.VolumeUp();
|
||||||
|
else if (vkey == _VolumeDown.GetVK())
|
||||||
|
_mpd.VolumeDown();
|
||||||
|
else if (vkey == _VolumeMute.GetVK())
|
||||||
|
_mpd.VolumeMute();
|
||||||
|
else if (vkey == _ShowWindow.GetVK())
|
||||||
|
{
|
||||||
|
if (_appWindow == null)
|
||||||
|
_appWindow = (MainWindow)Application.Current.MainWindow;
|
||||||
|
|
||||||
|
if (_appWindow.WindowState == WindowState.Minimized)
|
||||||
|
{
|
||||||
|
_appWindow.Show();
|
||||||
|
_appWindow.Activate();
|
||||||
|
_appWindow.WindowState = WindowState.Normal;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_appWindow.IsActive)
|
||||||
|
{
|
||||||
|
_appWindow.Hide();
|
||||||
|
_appWindow.WindowState = WindowState.Minimized;
|
||||||
|
}
|
||||||
|
else // not minimized but not in front
|
||||||
{
|
{
|
||||||
_appWindow.Show();
|
_appWindow.Show();
|
||||||
_appWindow.Activate();
|
_appWindow.Activate();
|
||||||
_appWindow.WindowState = WindowState.Normal;
|
_appWindow.WindowState = WindowState.Normal;
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
{
|
|
||||||
if (_appWindow.IsActive)
|
|
||||||
{
|
|
||||||
_appWindow.Hide();
|
|
||||||
_appWindow.WindowState = WindowState.Minimized;
|
|
||||||
}
|
|
||||||
else // not minimized but not in front
|
|
||||||
{
|
|
||||||
_appWindow.Show();
|
|
||||||
_appWindow.Activate();
|
|
||||||
_appWindow.WindowState = WindowState.Normal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
handled = true;
|
handled = true;
|
||||||
}
|
}
|
||||||
return IntPtr.Zero;
|
return IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveHotKeys()
|
|
||||||
{
|
|
||||||
_source.RemoveHook(HwndHook);
|
|
||||||
UnregisterHotKey(_windowHandle, HOTKEY_ID);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
168
Properties/Settings.Designer.cs
generated
168
Properties/Settings.Designer.cs
generated
@ -118,5 +118,173 @@ namespace unison.Properties {
|
|||||||
this["volume_offset"] = value;
|
this["volume_offset"] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("2")]
|
||||||
|
public uint nextTrack_mod {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["nextTrack_mod"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["nextTrack_mod"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("176")]
|
||||||
|
public uint nextTrack_vk {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["nextTrack_vk"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["nextTrack_vk"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("2")]
|
||||||
|
public uint previousTrack_mod {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["previousTrack_mod"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["previousTrack_mod"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("177")]
|
||||||
|
public uint previousTrack_vk {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["previousTrack_vk"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["previousTrack_vk"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("2")]
|
||||||
|
public uint playPause_mod {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["playPause_mod"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["playPause_mod"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("179")]
|
||||||
|
public uint playPause_vk {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["playPause_vk"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["playPause_vk"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("2")]
|
||||||
|
public uint volumeUp_mod {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["volumeUp_mod"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["volumeUp_mod"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("175")]
|
||||||
|
public uint volumeUp_vk {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["volumeUp_vk"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["volumeUp_vk"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("2")]
|
||||||
|
public uint volumeDown_mod {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["volumeDown_mod"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["volumeDown_mod"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("174")]
|
||||||
|
public uint volumeDown_vk {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["volumeDown_vk"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["volumeDown_vk"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("2")]
|
||||||
|
public uint volumeMute_mod {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["volumeMute_mod"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["volumeMute_mod"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("173")]
|
||||||
|
public uint volumeMute_vk {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["volumeMute_vk"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["volumeMute_vk"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("3")]
|
||||||
|
public uint showWindow_mod {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["showWindow_mod"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["showWindow_mod"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("13")]
|
||||||
|
public uint showWindow_vk {
|
||||||
|
get {
|
||||||
|
return ((uint)(this["showWindow_vk"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["showWindow_vk"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,5 +26,47 @@
|
|||||||
<Setting Name="volume_offset" Type="System.Int32" Scope="User">
|
<Setting Name="volume_offset" Type="System.Int32" Scope="User">
|
||||||
<Value Profile="(Default)">5</Value>
|
<Value Profile="(Default)">5</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
|
<Setting Name="nextTrack_mod" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">2</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="nextTrack_vk" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">176</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="previousTrack_mod" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">2</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="previousTrack_vk" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">177</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="playPause_mod" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">2</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="playPause_vk" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">179</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="volumeUp_mod" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">2</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="volumeUp_vk" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">175</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="volumeDown_mod" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">2</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="volumeDown_vk" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">174</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="volumeMute_mod" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">2</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="volumeMute_vk" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">173</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="showWindow_mod" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">3</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="showWindow_vk" Type="System.UInt32" Scope="User">
|
||||||
|
<Value Profile="(Default)">13</Value>
|
||||||
|
</Setting>
|
||||||
</Settings>
|
</Settings>
|
||||||
</SettingsFile>
|
</SettingsFile>
|
@ -37,13 +37,12 @@ Through [Radio-Browser](https://www.radio-browser.info), a community database, y
|
|||||||
|
|
||||||
### Missing features
|
### Missing features
|
||||||
|
|
||||||
* Custom shortcuts.
|
|
||||||
* MPD passwords: I don't really see the point, but if asked, I will integrate them.
|
* MPD passwords: I don't really see the point, but if asked, I will integrate them.
|
||||||
* Any sort of playlist and queue management. I use other software to do it, but I might implement them at some point.
|
|
||||||
|
|
||||||
### Wanted features
|
### Wanted features
|
||||||
|
|
||||||
* A complete shuffle system based on set criteria, aka a smart playlist.
|
* A complete shuffle system based on set criteria, aka a smart playlist.
|
||||||
|
* Any sort of playlist and queue management. I use other software to do it, but I will implement them at some point.
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
|
|
||||||
|
@ -1,15 +1,28 @@
|
|||||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:system="clr-namespace:System;assembly=mscorlib">
|
xmlns:system="clr-namespace:System;assembly=mscorlib" xmlns:sys="clr-namespace:System;assembly=System.Runtime">
|
||||||
|
|
||||||
<system:String x:Key="snapcastPath">snapclient_0.26.0-1_win64</system:String>
|
<system:String x:Key="snapcastPath">snapclient_0.26.0-1_win64</system:String>
|
||||||
<system:String x:Key="snapcastPort">1704</system:String>
|
<system:String x:Key="snapcastPort">1704</system:String>
|
||||||
|
|
||||||
<system:String x:Key="connectionOk1"></system:String>
|
|
||||||
<system:String x:Key="connectionOk2"></system:String>
|
|
||||||
<system:String x:Key="connectionFail"></system:String>
|
|
||||||
|
|
||||||
<system:String x:Key="playButton"></system:String>
|
<system:String x:Key="playButton"></system:String>
|
||||||
<system:String x:Key="pauseButton"></system:String>
|
<system:String x:Key="pauseButton"></system:String>
|
||||||
|
|
||||||
|
<system:String x:Key="volume_offset">5</system:String>
|
||||||
|
|
||||||
|
<system:UInt32 x:Key="nextTrack_mod">2</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="nextTrack_vk">176</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="previousTrack_mod">2</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="previousTrack_vk">177</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="playPause_mod">2</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="playPause_vk">179</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="volumeUp_mod">2</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="volumeUp_vk">175</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="volumeDown_mod">2</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="volumeDown_vk">174</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="volumeMute_mod">2</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="volumeMute_vk">173</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="showWindow_mod">3</system:UInt32>
|
||||||
|
<system:UInt32 x:Key="showWindow_vk">13</system:UInt32>
|
||||||
|
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
@ -4,9 +4,19 @@
|
|||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:emoji="clr-namespace:Emoji.Wpf;assembly=Emoji.Wpf"
|
xmlns:emoji="clr-namespace:Emoji.Wpf;assembly=Emoji.Wpf"
|
||||||
xmlns:properties="clr-namespace:unison.Resources"
|
xmlns:properties="clr-namespace:unison.Resources" xmlns:sys="clr-namespace:System;assembly=System.Runtime"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Closing="Window_Closing" Title="{x:Static properties:Resources.Settings}" ResizeMode="CanMinimize" Icon="/Resources/icon-full.ico" WindowStyle="ToolWindow" SizeToContent="WidthAndHeight">
|
Closing="Window_Closing" Title="{x:Static properties:Resources.Settings}" ResizeMode="CanMinimize" Icon="/Resources/icon-full.ico" WindowStyle="ToolWindow" SizeToContent="WidthAndHeight">
|
||||||
|
|
||||||
|
<Window.Resources>
|
||||||
|
<x:Array x:Key="ShortcutItems" Type="sys:String">
|
||||||
|
<sys:String>None</sys:String>
|
||||||
|
<sys:String>Alt</sys:String>
|
||||||
|
<sys:String>Control</sys:String>
|
||||||
|
<sys:String>Shift</sys:String>
|
||||||
|
</x:Array>
|
||||||
|
</Window.Resources>
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<StackPanel Orientation="Vertical">
|
<StackPanel Orientation="Vertical">
|
||||||
<TabControl Margin="10">
|
<TabControl Margin="10">
|
||||||
@ -109,11 +119,12 @@
|
|||||||
</GroupBox.Header>
|
</GroupBox.Header>
|
||||||
<Grid>
|
<Grid>
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal" Margin="0,0,0,5">
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_VolumeOffset}" TextWrapping="Wrap" Margin="0,2,0,0"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_VolumeOffset}" TextWrapping="Wrap" Margin="0,2,0,0"/>
|
||||||
<TextBox x:Name="VolumeOffset" TextWrapping="Wrap" Width="25" PreviewTextInput="NumberValidationTextBox" Margin="8,2,0,0"/>
|
<TextBox x:Name="VolumeOffset" TextWrapping="Wrap" Width="25" PreviewTextInput="NumberValidationTextBox" Margin="8,2,0,0"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Grid MinWidth="300" Margin="0,5,0,0">
|
|
||||||
|
<Grid MinWidth="420" Margin="0,5,0,0" x:Name="RebindKeyWrapper">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition/>
|
<ColumnDefinition/>
|
||||||
<ColumnDefinition/>
|
<ColumnDefinition/>
|
||||||
@ -126,23 +137,79 @@
|
|||||||
<RowDefinition/>
|
<RowDefinition/>
|
||||||
<RowDefinition/>
|
<RowDefinition/>
|
||||||
<RowDefinition/>
|
<RowDefinition/>
|
||||||
|
<RowDefinition/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_NextTrack}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="0" Margin="1"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_NextTrack}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="0" Margin="1,1,1,1" Grid.RowSpan="2"/>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_PreviousTrack}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="1" Margin="1"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_PreviousTrack}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="2" Margin="1,1,1,1"/>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_PlayPause}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="2" Margin="1"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_PlayPause}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="3" Margin="1,1,1,1"/>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_VolumeUp}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="3" Margin="1"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_VolumeUp}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="4" Margin="1,1,1,1"/>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_VolumeDown}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="4" Margin="1"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_VolumeDown}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="5" Margin="1,1,1,1"/>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_VolumeMute}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="5" Margin="1"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_VolumeMute}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="6" Margin="1,1,1,1"/>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_ShowWindow}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="6" Margin="1"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_ShowWindow}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="7" Margin="1,1,1,1"/>
|
||||||
|
|
||||||
<TextBlock Text="ctrl + media_next" TextWrapping="Wrap" Grid.Column="1" Grid.Row="0" Margin="1" HorizontalAlignment="Right" FontWeight="Bold"/>
|
<StackPanel x:Name="Shortcut_NextTrack" Orientation="Horizontal" Grid.Column="1" Grid.Row="0" Margin="0,0,0,2" Grid.RowSpan="2">
|
||||||
<TextBlock Text="ctrl + media_prev" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Margin="1" HorizontalAlignment="Right" FontWeight="Bold"/>
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD1" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
<TextBlock Text="ctrl + media_play" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Margin="1" HorizontalAlignment="Right" FontWeight="Bold"/>
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD2" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
<TextBlock Text="ctrl + volume_up" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" Margin="1" HorizontalAlignment="Right" FontWeight="Bold"/>
|
<Button Click="RemapKey_Clicked" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FocusVisualStyle="{x:Null}">
|
||||||
<TextBlock Text="ctrl + volume_down" TextWrapping="Wrap" Grid.Column="1" Grid.Row="4" Margin="1" HorizontalAlignment="Right" FontWeight="Bold"/>
|
<TextBlock Text="None" TextAlignment="Center" TextWrapping="Wrap" MinWidth="150" Margin="5,1,5,1" HorizontalAlignment="Stretch" FontWeight="Light" VerticalAlignment="Stretch"/>
|
||||||
<TextBlock Text="ctrl + volume_mute" TextWrapping="Wrap" Grid.Column="1" Grid.Row="5" Margin="1" HorizontalAlignment="Right" FontWeight="Bold"/>
|
</Button>
|
||||||
<TextBlock Text="ctrl + alt + enter" TextWrapping="Wrap" Grid.Column="1" Grid.Row="6" Margin="1" HorizontalAlignment="Right" FontWeight="Bold"/>
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel x:Name="Shortcut_PreviousTrack" Orientation="Horizontal" Grid.Column="1" Grid.Row="2" Margin="0,0,0,2">
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD1" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD2" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<Button Click="RemapKey_Clicked" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FocusVisualStyle="{x:Null}">
|
||||||
|
<TextBlock Text="None" TextAlignment="Center" TextWrapping="Wrap" MinWidth="150" Margin="5,1,5,1" HorizontalAlignment="Stretch" FontWeight="Light" VerticalAlignment="Stretch"/>
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel x:Name="Shortcut_PlayPause" Orientation="Horizontal" Grid.Column="1" Grid.Row="3" Margin="0,0,0,2">
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD1" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD2" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<Button Click="RemapKey_Clicked" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FocusVisualStyle="{x:Null}">
|
||||||
|
<TextBlock Text="None" TextAlignment="Center" TextWrapping="Wrap" MinWidth="150" Margin="5,1,5,1" HorizontalAlignment="Stretch" FontWeight="Light" VerticalAlignment="Stretch"/>
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel x:Name="Shortcut_VolumeUp" Orientation="Horizontal" Grid.Column="1" Grid.Row="4" Margin="0,0,0,2">
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD1" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD2" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<Button Click="RemapKey_Clicked" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FocusVisualStyle="{x:Null}">
|
||||||
|
<TextBlock Text="None" TextAlignment="Center" TextWrapping="Wrap" MinWidth="150" Margin="5,1,5,1" HorizontalAlignment="Stretch" FontWeight="Light" VerticalAlignment="Stretch"/>
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel x:Name="Shortcut_VolumeDown" Orientation="Horizontal" Grid.Column="1" Grid.Row="5" Margin="0,0,0,2">
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD1" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD2" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<Button Click="RemapKey_Clicked" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FocusVisualStyle="{x:Null}">
|
||||||
|
<TextBlock Text="None" TextAlignment="Center" TextWrapping="Wrap" MinWidth="150" Margin="5,1,5,1" HorizontalAlignment="Stretch" FontWeight="Light" VerticalAlignment="Stretch"/>
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel x:Name="Shortcut_VolumeMute" Orientation="Horizontal" Grid.Column="1" Grid.Row="6" Margin="0,0,0,2">
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD1" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD2" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<Button Click="RemapKey_Clicked" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FocusVisualStyle="{x:Null}">
|
||||||
|
<TextBlock Text="None" TextAlignment="Center" TextWrapping="Wrap" MinWidth="150" Margin="5,1,5,1" HorizontalAlignment="Stretch" FontWeight="Light" VerticalAlignment="Stretch"/>
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel x:Name="Shortcut_ShowWindow" Orientation="Horizontal" Grid.Column="1" Grid.Row="7">
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD1" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<ComboBox ItemsSource="{StaticResource ShortcutItems}" Margin="0,0,5,0" MinWidth="70" SelectionChanged="MOD_SelectionChanged" Tag="MOD2" FontWeight="Light" SelectedIndex="0" BorderBrush="{x:Null}" FocusVisualStyle="{x:Null}"></ComboBox>
|
||||||
|
<Button Click="RemapKey_Clicked" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FocusVisualStyle="{x:Null}">
|
||||||
|
<TextBlock Text="None" TextAlignment="Center" TextWrapping="Wrap" MinWidth="150" Margin="5,1,5,1" HorizontalAlignment="Stretch" FontWeight="Light" VerticalAlignment="Stretch"/>
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||||
|
<TextBlock Text="Please note that if the input key is not recognized, this is due to a limitation on how virtual keys work." TextWrapping="Wrap" Margin="0,2,0,0" MaxWidth="420" />
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<Button Content="{x:Static properties:Resources.Settings_SnapcastResetButton}" Margin="0,5,0,0" Width="120" Click="ShortcutsReset_Clicked"/>
|
||||||
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
|
@ -2,9 +2,11 @@
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Windows.Interop;
|
using System.Windows.Interop;
|
||||||
using System.Windows.Navigation;
|
using System.Windows.Navigation;
|
||||||
@ -33,6 +35,8 @@ namespace unison
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HotkeyHandler _hotkeys = (HotkeyHandler)Application.Current.Properties["hotkeys"];
|
||||||
|
|
||||||
public Settings()
|
public Settings()
|
||||||
{
|
{
|
||||||
InitHwnd();
|
InitHwnd();
|
||||||
@ -41,6 +45,11 @@ namespace unison
|
|||||||
|
|
||||||
WindowState = WindowState.Minimized;
|
WindowState = WindowState.Minimized;
|
||||||
|
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Initialize()
|
||||||
|
{
|
||||||
MpdHost.Text = Properties.Settings.Default.mpd_host;
|
MpdHost.Text = Properties.Settings.Default.mpd_host;
|
||||||
MpdPort.Text = Properties.Settings.Default.mpd_port.ToString();
|
MpdPort.Text = Properties.Settings.Default.mpd_port.ToString();
|
||||||
//MpdPassword.Text = Properties.Settings.Default.mpd_password;
|
//MpdPassword.Text = Properties.Settings.Default.mpd_password;
|
||||||
@ -49,6 +58,54 @@ namespace unison
|
|||||||
SnapcastPath.Text = Properties.Settings.Default.snapcast_path;
|
SnapcastPath.Text = Properties.Settings.Default.snapcast_path;
|
||||||
SnapcastPort.Text = Properties.Settings.Default.snapcast_port.ToString();
|
SnapcastPort.Text = Properties.Settings.Default.snapcast_port.ToString();
|
||||||
VolumeOffset.Text = Properties.Settings.Default.volume_offset.ToString();
|
VolumeOffset.Text = Properties.Settings.Default.volume_offset.ToString();
|
||||||
|
|
||||||
|
InitializeShortcuts();
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitializeShortcuts()
|
||||||
|
{
|
||||||
|
System.Collections.Generic.IEnumerable<StackPanel> stackPanelCollection = RebindKeyWrapper.Children.OfType<StackPanel>();
|
||||||
|
StackPanel[] stackPanelList = stackPanelCollection.ToArray();
|
||||||
|
|
||||||
|
// Default state
|
||||||
|
for (int i = 0; i < stackPanelList.Length; i++)
|
||||||
|
{
|
||||||
|
ComboBox[] comboBoxList = stackPanelList[i].Children.OfType<ComboBox>().ToArray();
|
||||||
|
foreach (ComboBox comboBox in comboBoxList) // default status (for reset)
|
||||||
|
{
|
||||||
|
comboBox.FontWeight = FontWeights.Light;
|
||||||
|
comboBox.SelectedItem = "None";
|
||||||
|
}
|
||||||
|
TextBlock textBlock = (TextBlock)stackPanelList[i].Children.OfType<Button>().FirstOrDefault().Content;
|
||||||
|
textBlock.Text = "None";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate values
|
||||||
|
for (int i = 0; i < stackPanelList.Length; i++)
|
||||||
|
{
|
||||||
|
// setup MOD
|
||||||
|
HotkeyHandler.MOD mod = _hotkeys._Shortcuts[i].mod;
|
||||||
|
|
||||||
|
HotkeyHandler.MOD[] MODList = System.Enum.GetValues(typeof(HotkeyHandler.MOD))
|
||||||
|
.OfType<HotkeyHandler.MOD>()
|
||||||
|
.Select(x => x & _hotkeys._Shortcuts[i].mod)
|
||||||
|
.Where(x => x != HotkeyHandler.MOD.None)
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
ComboBox[] comboBox = stackPanelList[i].Children.OfType<ComboBox>().ToArray();
|
||||||
|
for (int j = 0; j < MODList.Length; j++)
|
||||||
|
{
|
||||||
|
comboBox[j].SelectedItem = MODList[j].ToString();
|
||||||
|
if (comboBox[j].SelectedItem.ToString() != "None")
|
||||||
|
comboBox[j].FontWeight = FontWeights.Bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup VK
|
||||||
|
TextBlock textBlock = (TextBlock)stackPanelList[i].Children.OfType<Button>().FirstOrDefault().Content;
|
||||||
|
textBlock.Text = _hotkeys._Shortcuts[i].vk.ToString();
|
||||||
|
if (textBlock.Text != "None")
|
||||||
|
textBlock.FontWeight = FontWeights.Bold;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void NumberValidationTextBox(object sender, TextCompositionEventArgs e)
|
private void NumberValidationTextBox(object sender, TextCompositionEventArgs e)
|
||||||
@ -100,6 +157,157 @@ namespace unison
|
|||||||
StatDatabaseUpdate.Text = mpd.GetStats().DatabaseUpdate.ToString();
|
StatDatabaseUpdate.Text = mpd.GetStats().DatabaseUpdate.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void HotkeyChanged()
|
||||||
|
{
|
||||||
|
_hotkeys.RemoveHotkeys();
|
||||||
|
_hotkeys.AddHotkeys();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ref HotkeyHandler.HotkeyPair GetHotkeyVariable(string Name)
|
||||||
|
{
|
||||||
|
if (Name == "Shortcut_NextTrack")
|
||||||
|
return ref _hotkeys._NextTrack;
|
||||||
|
if (Name == "Shortcut_PreviousTrack")
|
||||||
|
return ref _hotkeys._PreviousTrack;
|
||||||
|
if (Name == "Shortcut_PlayPause")
|
||||||
|
return ref _hotkeys._PlayPause;
|
||||||
|
if (Name == "Shortcut_VolumeUp")
|
||||||
|
return ref _hotkeys._VolumeUp;
|
||||||
|
if (Name == "Shortcut_VolumeDown")
|
||||||
|
return ref _hotkeys._VolumeDown;
|
||||||
|
if (Name == "Shortcut_VolumeMute")
|
||||||
|
return ref _hotkeys._VolumeMute;
|
||||||
|
if (Name == "Shortcut_ShowWindow")
|
||||||
|
return ref _hotkeys._ShowWindow;
|
||||||
|
return ref _hotkeys._NextTrack;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateHotkey_MOD(string Name, HotkeyHandler.MOD mod) => GetHotkeyVariable(Name).SetMOD(mod);
|
||||||
|
private void UpdateHotkey_VK(string Name, HotkeyHandler.VK vk) => GetHotkeyVariable(Name).SetVK(vk);
|
||||||
|
|
||||||
|
private void MOD_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (!IsLoaded)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ComboBox comboBox = (ComboBox)sender;
|
||||||
|
StackPanel stackPanel = (StackPanel)comboBox.Parent;
|
||||||
|
System.Collections.Generic.IEnumerable<ComboBox> stackPanelCollection = stackPanel.Children.OfType<ComboBox>();
|
||||||
|
|
||||||
|
HotkeyHandler.MOD MOD1, MOD2;
|
||||||
|
|
||||||
|
// we need to do this because the element is modified -after- this function
|
||||||
|
if (comboBox.Tag.ToString() == "MOD1")
|
||||||
|
{
|
||||||
|
MOD1 = GetMOD(e.AddedItems[0].ToString());
|
||||||
|
MOD2 = GetMOD(stackPanelCollection.Last().Text);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MOD1 = GetMOD(stackPanelCollection.First().Text);
|
||||||
|
MOD2 = GetMOD(e.AddedItems[0].ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.AddedItems[0].ToString() == "None")
|
||||||
|
comboBox.FontWeight = FontWeights.Light;
|
||||||
|
else
|
||||||
|
comboBox.FontWeight = FontWeights.Bold;
|
||||||
|
|
||||||
|
HotkeyHandler.MOD ModKey = MOD1 | MOD2;
|
||||||
|
|
||||||
|
UpdateHotkey_MOD(stackPanel.Name, ModKey);
|
||||||
|
HotkeyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemapKey_Clicked(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Button button = (Button)sender;
|
||||||
|
TextBlock textBlock = (TextBlock)button.Content;
|
||||||
|
textBlock.Text = "Enter key...";
|
||||||
|
textBlock.FontWeight = FontWeights.Bold;
|
||||||
|
button.PreviewKeyDown += DetectPressedKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DetectPressedKey(object sender, KeyEventArgs e)
|
||||||
|
{
|
||||||
|
e.Handled = true;
|
||||||
|
|
||||||
|
Key pressedKey = e.Key;
|
||||||
|
HotkeyHandler.VK VirtualKey = GetVirtualKey(pressedKey);
|
||||||
|
|
||||||
|
Button button = (Button)sender;
|
||||||
|
TextBlock textBlock = (TextBlock)button.Content;
|
||||||
|
StackPanel stackPanel = (StackPanel)button.Parent;
|
||||||
|
|
||||||
|
if (VirtualKey == HotkeyHandler.VK.None)
|
||||||
|
{
|
||||||
|
pressedKey = Key.None;
|
||||||
|
textBlock.FontWeight = FontWeights.Light;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
textBlock.FontWeight = FontWeights.Bold;
|
||||||
|
|
||||||
|
textBlock.Text = pressedKey.ToString();
|
||||||
|
button.PreviewKeyDown -= DetectPressedKey;
|
||||||
|
|
||||||
|
UpdateHotkey_VK(stackPanel.Name, VirtualKey);
|
||||||
|
HotkeyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private HotkeyHandler.VK GetVirtualKey(Key key)
|
||||||
|
{
|
||||||
|
foreach (object value in System.Enum.GetValues(typeof(HotkeyHandler.VK)))
|
||||||
|
{
|
||||||
|
if (key.ToString().ToLower() == value.ToString().ToLower())
|
||||||
|
return (HotkeyHandler.VK)value;
|
||||||
|
}
|
||||||
|
return HotkeyHandler.VK.None;
|
||||||
|
}
|
||||||
|
|
||||||
|
private HotkeyHandler.MOD GetMOD(string str)
|
||||||
|
{
|
||||||
|
foreach (object value in System.Enum.GetValues(typeof(HotkeyHandler.MOD)))
|
||||||
|
{
|
||||||
|
if (str.ToLower() == value.ToString().ToLower())
|
||||||
|
return (HotkeyHandler.MOD)value;
|
||||||
|
}
|
||||||
|
return HotkeyHandler.MOD.None;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ShortcutsReset_Clicked(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Properties.Settings.Default.nextTrack_mod = (uint)Application.Current.FindResource("nextTrack_mod");
|
||||||
|
Properties.Settings.Default.nextTrack_vk = (uint)Application.Current.FindResource("nextTrack_vk");
|
||||||
|
Properties.Settings.Default.previousTrack_mod = (uint)Application.Current.FindResource("previousTrack_mod");
|
||||||
|
Properties.Settings.Default.previousTrack_vk = (uint)Application.Current.FindResource("previousTrack_vk");
|
||||||
|
Properties.Settings.Default.playPause_mod = (uint)Application.Current.FindResource("playPause_mod");
|
||||||
|
Properties.Settings.Default.playPause_vk = (uint)Application.Current.FindResource("playPause_vk");
|
||||||
|
Properties.Settings.Default.volumeUp_mod = (uint)Application.Current.FindResource("volumeUp_mod");
|
||||||
|
Properties.Settings.Default.volumeUp_vk = (uint)Application.Current.FindResource("volumeUp_vk");
|
||||||
|
Properties.Settings.Default.volumeDown_mod = (uint)Application.Current.FindResource("volumeDown_mod");
|
||||||
|
Properties.Settings.Default.volumeDown_vk = (uint)Application.Current.FindResource("volumeDown_vk");
|
||||||
|
Properties.Settings.Default.volumeMute_mod = (uint)Application.Current.FindResource("volumeMute_mod");
|
||||||
|
Properties.Settings.Default.volumeMute_vk = (uint)Application.Current.FindResource("volumeMute_vk");
|
||||||
|
Properties.Settings.Default.showWindow_mod = (uint)Application.Current.FindResource("showWindow_mod");
|
||||||
|
Properties.Settings.Default.showWindow_vk = (uint)Application.Current.FindResource("showWindow_vk");
|
||||||
|
|
||||||
|
_hotkeys.Initialize();
|
||||||
|
HotkeyChanged();
|
||||||
|
InitializeShortcuts();
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint GetMod(StackPanel stackPanel)
|
||||||
|
{
|
||||||
|
return (uint)(GetMOD(stackPanel.Children.OfType<ComboBox>().First().SelectedItem.ToString()) | GetMOD(stackPanel.Children.OfType<ComboBox>().Last().SelectedItem.ToString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint GetVk(StackPanel stackPanel)
|
||||||
|
{
|
||||||
|
Button button = stackPanel.Children.OfType<Button>().First();
|
||||||
|
TextBlock textBlock = (TextBlock)button.Content;
|
||||||
|
return (uint)(HotkeyHandler.VK)System.Enum.Parse(typeof(HotkeyHandler.VK), textBlock.Text, true);
|
||||||
|
}
|
||||||
|
|
||||||
public void SaveSettings()
|
public void SaveSettings()
|
||||||
{
|
{
|
||||||
Properties.Settings.Default.mpd_host = MpdHost.Text;
|
Properties.Settings.Default.mpd_host = MpdHost.Text;
|
||||||
@ -110,6 +318,22 @@ namespace unison
|
|||||||
Properties.Settings.Default.snapcast_path = SnapcastPath.Text;
|
Properties.Settings.Default.snapcast_path = SnapcastPath.Text;
|
||||||
Properties.Settings.Default.snapcast_port = int.Parse(SnapcastPort.Text, CultureInfo.InvariantCulture);
|
Properties.Settings.Default.snapcast_port = int.Parse(SnapcastPort.Text, CultureInfo.InvariantCulture);
|
||||||
Properties.Settings.Default.volume_offset = int.Parse(VolumeOffset.Text, CultureInfo.InvariantCulture);
|
Properties.Settings.Default.volume_offset = int.Parse(VolumeOffset.Text, CultureInfo.InvariantCulture);
|
||||||
|
|
||||||
|
Properties.Settings.Default.nextTrack_mod = GetMod(Shortcut_NextTrack);
|
||||||
|
Properties.Settings.Default.nextTrack_vk = GetVk(Shortcut_NextTrack);
|
||||||
|
Properties.Settings.Default.previousTrack_mod = GetMod(Shortcut_PreviousTrack);
|
||||||
|
Properties.Settings.Default.previousTrack_vk = GetVk(Shortcut_PreviousTrack);
|
||||||
|
Properties.Settings.Default.playPause_mod = GetMod(Shortcut_PlayPause);
|
||||||
|
Properties.Settings.Default.playPause_vk = GetVk(Shortcut_PlayPause);
|
||||||
|
Properties.Settings.Default.volumeUp_mod = GetMod(Shortcut_VolumeUp);
|
||||||
|
Properties.Settings.Default.volumeUp_vk = GetVk(Shortcut_VolumeUp);
|
||||||
|
Properties.Settings.Default.volumeDown_mod = GetMod(Shortcut_VolumeDown);
|
||||||
|
Properties.Settings.Default.volumeDown_vk = GetVk(Shortcut_VolumeDown);
|
||||||
|
Properties.Settings.Default.volumeMute_mod = GetMod(Shortcut_VolumeMute);
|
||||||
|
Properties.Settings.Default.volumeMute_vk = GetVk(Shortcut_VolumeMute);
|
||||||
|
Properties.Settings.Default.showWindow_mod = GetMod(Shortcut_ShowWindow);
|
||||||
|
Properties.Settings.Default.showWindow_vk = GetVk(Shortcut_ShowWindow);
|
||||||
|
|
||||||
Properties.Settings.Default.Save();
|
Properties.Settings.Default.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<ApplicationIcon>Resources\icon-full.ico</ApplicationIcon>
|
<ApplicationIcon>Resources\icon-full.ico</ApplicationIcon>
|
||||||
<Win32Resource></Win32Resource>
|
<Win32Resource></Win32Resource>
|
||||||
<StartupObject>unison.App</StartupObject>
|
<StartupObject>unison.App</StartupObject>
|
||||||
<Version>1.1</Version>
|
<Version>1.2</Version>
|
||||||
<Company />
|
<Company />
|
||||||
<Authors>Théo Marchal</Authors>
|
<Authors>Théo Marchal</Authors>
|
||||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||||
@ -22,13 +22,6 @@
|
|||||||
<None Remove="Resources\icon-mini.ico" />
|
<None Remove="Resources\icon-mini.ico" />
|
||||||
<None Remove="Resources\nocover.png" />
|
<None Remove="Resources\nocover.png" />
|
||||||
<None Remove="LICENSE" />
|
<None Remove="LICENSE" />
|
||||||
<None Remove="snapclient_0.25.0-1_win64\FLAC.dll" />
|
|
||||||
<None Remove="snapclient_0.25.0-1_win64\ogg.dll" />
|
|
||||||
<None Remove="snapclient_0.25.0-1_win64\opus.dll" />
|
|
||||||
<None Remove="snapclient_0.25.0-1_win64\README.txt" />
|
|
||||||
<None Remove="snapclient_0.25.0-1_win64\snapclient.exe" />
|
|
||||||
<None Remove="snapclient_0.25.0-1_win64\soxr.dll" />
|
|
||||||
<None Remove="snapclient_0.25.0-1_win64\vorbis.dll" />
|
|
||||||
<None Include="LICENSE">
|
<None Include="LICENSE">
|
||||||
<Pack>True</Pack>
|
<Pack>True</Pack>
|
||||||
<PackagePath></PackagePath>
|
<PackagePath></PackagePath>
|
||||||
@ -48,27 +41,6 @@
|
|||||||
<Content Include="LICENSE">
|
<Content Include="LICENSE">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="snapclient_0.25.0-1_win64\README.txt">
|
|
||||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\FLAC.dll">
|
|
||||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\ogg.dll">
|
|
||||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\opus.dll">
|
|
||||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\snapclient.exe">
|
|
||||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\soxr.dll">
|
|
||||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\vorbis.dll">
|
|
||||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
Loading…
Reference in New Issue
Block a user