Compare commits
12 Commits
c93a9a326e
...
6ad4d9c813
Author | SHA1 | Date | |
---|---|---|---|
6ad4d9c813 | |||
301309737b | |||
ab46442108 | |||
3c1aad7d27 | |||
d1b6d97fe8 | |||
15db118dd6 | |||
67315f90b0 | |||
6d75f88927 | |||
7fdf349c28 | |||
9a5f686dde | |||
b209cb2556 | |||
6e1f43bed0 |
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -54,6 +54,8 @@ namespace unison
|
|||||||
bool _isUpdatingStatus = false;
|
bool _isUpdatingStatus = false;
|
||||||
bool _isUpdatingSong = false;
|
bool _isUpdatingSong = false;
|
||||||
|
|
||||||
|
bool _invalidIp = false;
|
||||||
|
|
||||||
private event EventHandler ConnectionChanged;
|
private event EventHandler ConnectionChanged;
|
||||||
private event EventHandler StatusChanged;
|
private event EventHandler StatusChanged;
|
||||||
private event EventHandler SongChanged;
|
private event EventHandler SongChanged;
|
||||||
@ -95,7 +97,7 @@ namespace unison
|
|||||||
|
|
||||||
void OnConnectionChanged(object sender, EventArgs e)
|
void OnConnectionChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (!_connected)
|
if (!_connected && !_invalidIp)
|
||||||
_retryTimer.Start();
|
_retryTimer.Start();
|
||||||
else
|
else
|
||||||
_retryTimer.Stop();
|
_retryTimer.Stop();
|
||||||
@ -189,12 +191,13 @@ namespace unison
|
|||||||
_connection = await ConnectInternal(token);
|
_connection = await ConnectInternal(token);
|
||||||
_commandConnection = await ConnectInternal(token);
|
_commandConnection = await ConnectInternal(token);
|
||||||
}
|
}
|
||||||
catch(MpcNET.Exceptions.MpcConnectException exception)
|
catch(MpcNET.Exceptions.MpcConnectException)
|
||||||
{
|
{
|
||||||
Trace.WriteLine("exception: " + exception);
|
_invalidIp = true;
|
||||||
}
|
}
|
||||||
if (_connection != null && _commandConnection != null)
|
if (_connection != null && _commandConnection != null)
|
||||||
{
|
{
|
||||||
|
_invalidIp = false;
|
||||||
if (_connection.IsConnected && _commandConnection.IsConnected)
|
if (_connection.IsConnected && _commandConnection.IsConnected)
|
||||||
{
|
{
|
||||||
_connected = true;
|
_connected = true;
|
||||||
@ -218,6 +221,21 @@ namespace unison
|
|||||||
{
|
{
|
||||||
IPAddress.TryParse(Properties.Settings.Default.mpd_host, out IPAddress ipAddress);
|
IPAddress.TryParse(Properties.Settings.Default.mpd_host, out IPAddress ipAddress);
|
||||||
|
|
||||||
|
if (ipAddress == null)
|
||||||
|
{
|
||||||
|
IPAddress[] addrList;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
addrList = Dns.GetHostAddresses(Properties.Settings.Default.mpd_host);
|
||||||
|
if (addrList.Length > 0)
|
||||||
|
ipAddress = addrList[0];
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
throw new MpcNET.Exceptions.MpcConnectException("No correct IP provided by user.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_mpdEndpoint = new IPEndPoint(ipAddress, Properties.Settings.Default.mpd_port);
|
_mpdEndpoint = new IPEndPoint(ipAddress, Properties.Settings.Default.mpd_port);
|
||||||
MpcConnection connection = new MpcConnection(_mpdEndpoint);
|
MpcConnection connection = new MpcConnection(_mpdEndpoint);
|
||||||
await connection.ConnectAsync(token);
|
await connection.ConnectAsync(token);
|
||||||
@ -348,14 +366,14 @@ namespace unison
|
|||||||
List<byte> data = new List<byte>();
|
List<byte> data = new List<byte>();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (_connection == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
long totalBinarySize = 9999;
|
long totalBinarySize = 9999;
|
||||||
long currentSize = 0;
|
long currentSize = 0;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
if (_connection == null)
|
||||||
|
return;
|
||||||
|
|
||||||
var albumReq = await _connection.SendAsync(new AlbumArtCommand(path, currentSize));
|
var albumReq = await _connection.SendAsync(new AlbumArtCommand(path, currentSize));
|
||||||
if (!albumReq.IsResponseValid)
|
if (!albumReq.IsResponseValid)
|
||||||
break;
|
break;
|
||||||
|
2
LICENSE
@ -1,4 +1,4 @@
|
|||||||
MIT License Copyright (c) 2021 Théo Marchal
|
MIT License Copyright (c) 2022 Théo Marchal
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
178
Properties/Settings.Designer.cs
generated
@ -73,7 +73,19 @@ namespace unison.Properties {
|
|||||||
|
|
||||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
[global::System.Configuration.DefaultSettingValueAttribute("snapclient_0.25.0-1_win64")]
|
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||||
|
public bool snapcast_window {
|
||||||
|
get {
|
||||||
|
return ((bool)(this["snapcast_window"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["snapcast_window"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("snapclient_0.26.0-1_win64")]
|
||||||
public string snapcast_path {
|
public string snapcast_path {
|
||||||
get {
|
get {
|
||||||
return ((string)(this["snapcast_path"]));
|
return ((string)(this["snapcast_path"]));
|
||||||
@ -109,13 +121,169 @@ namespace unison.Properties {
|
|||||||
|
|
||||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
[global::System.Configuration.DefaultSettingValueAttribute("2")]
|
||||||
public bool snapcast_window {
|
public uint nextTrack_mod {
|
||||||
get {
|
get {
|
||||||
return ((bool)(this["snapcast_window"]));
|
return ((uint)(this["nextTrack_mod"]));
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
this["snapcast_window"] = value;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<Value Profile="(Default)">False</Value>
|
<Value Profile="(Default)">False</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
<Setting Name="snapcast_path" Type="System.String" Scope="User">
|
<Setting Name="snapcast_path" Type="System.String" Scope="User">
|
||||||
<Value Profile="(Default)">snapclient_0.25.0-1_win64</Value>
|
<Value Profile="(Default)">snapclient_0.26.0-1_win64</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
<Setting Name="snapcast_port" Type="System.Int32" Scope="User">
|
<Setting Name="snapcast_port" Type="System.Int32" Scope="User">
|
||||||
<Value Profile="(Default)">1704</Value>
|
<Value Profile="(Default)">1704</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>
|
13
README.md
@ -5,7 +5,7 @@
|
|||||||
**unison** is a very simple [Music Player Daemon (MPD)](https://www.musicpd.org/) daemon client with the following goals:
|
**unison** is a very simple [Music Player Daemon (MPD)](https://www.musicpd.org/) daemon client with the following goals:
|
||||||
|
|
||||||
* lightweight window that can be toggled with shortcuts
|
* lightweight window that can be toggled with shortcuts
|
||||||
* music control through shortcuts
|
* music control through rebindable shortcuts
|
||||||
* [Snapcast](https://mjaggard.github.io/snapcast/) integration
|
* [Snapcast](https://mjaggard.github.io/snapcast/) integration
|
||||||
* Radio stations
|
* Radio stations
|
||||||
|
|
||||||
@ -19,17 +19,17 @@ By default, unison works as a daemon in the taskbar system tray. You can display
|
|||||||
|
|
||||||
### Shortcuts
|
### Shortcuts
|
||||||
|
|
||||||
You can control your music at anytime with the shortcuts. They can of course be used if the window is not visible.
|
You can control your music at anytime with the shortcuts. They are usable system-wide, even if the window is not visible. They are of course fully rebindable.
|
||||||
|
|
||||||
![Settings => shortcuts](Screenshots/screen3.png)
|
![Settings => shortcuts](Screenshots/screen3.png)
|
||||||
|
|
||||||
### Snapcast
|
### Snapcast
|
||||||
|
|
||||||
The main goal of embedding Snapcast is the ability to listen locally to music when I'm not using my main audio system. The computer running unison can then play music easily.
|
Embedding a Snapcast client allows to listen to music on multiple devices. For example, if you music is on a distant server connected to speakers in your living room, you can still listen to it on your computer running unison with this integrated client.
|
||||||
|
|
||||||
### Radio stations
|
### Radio stations
|
||||||
|
|
||||||
Through [Radio-Browser](https://www.radio-browser.info), a community database, you can play radio-streams directly from unison. There are more than 28,000 stations recorded on this service, so it should be a nice way to discover new music and cultures.
|
Through [Radio-Browser](https://www.radio-browser.info), a community database, you can play radio streams directly from unison. There are more than 28,000 stations recorded on this service, so it is a nice way to discover new music and cultures.
|
||||||
|
|
||||||
![Radio stations](Screenshots/screen4.png)
|
![Radio stations](Screenshots/screen4.png)
|
||||||
|
|
||||||
@ -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
|
### Planned 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.
|
||||||
|
* Playlist, queue and library management. I use other software to do it, but I will implement them at some point.
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
|
|
||||||
|
27
Resources/Resources.Designer.cs
generated
@ -249,15 +249,6 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to 's updated MpcNET.
|
|
||||||
/// </summary>
|
|
||||||
public static string Settings_MpcNET {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("Settings_MpcNET", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Next track.
|
/// Looks up a localized string similar to Next track.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -303,6 +294,24 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Please note that if the input key is not recognized, this is due to a limitation on how virtual keys work..
|
||||||
|
/// </summary>
|
||||||
|
public static string Settings_ShortcutsInfo {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Settings_ShortcutsInfo", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Enter a key....
|
||||||
|
/// </summary>
|
||||||
|
public static string Settings_ShortcutsKey {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Settings_ShortcutsKey", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Show window.
|
/// Looks up a localized string similar to Show window.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -180,9 +180,6 @@
|
|||||||
<data name="Settings_MadeBy" xml:space="preserve">
|
<data name="Settings_MadeBy" xml:space="preserve">
|
||||||
<value>Créé par</value>
|
<value>Créé par</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_MpcNET" xml:space="preserve">
|
|
||||||
<value> et sa version de MpcNET</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_NextTrack" xml:space="preserve">
|
<data name="Settings_NextTrack" xml:space="preserve">
|
||||||
<value>Piste suivante</value>
|
<value>Piste suivante</value>
|
||||||
</data>
|
</data>
|
||||||
@ -198,6 +195,12 @@
|
|||||||
<data name="Settings_Shortcuts" xml:space="preserve">
|
<data name="Settings_Shortcuts" xml:space="preserve">
|
||||||
<value>Raccourcis</value>
|
<value>Raccourcis</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Settings_ShortcutsInfo" xml:space="preserve">
|
||||||
|
<value>Veuillez noter que si votre touche n'est pas reconnue, cela est du à la manière dont les touches virtuelles sont gérées par Windows.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_ShortcutsKey" xml:space="preserve">
|
||||||
|
<value>Appuyez sur une touche...</value>
|
||||||
|
</data>
|
||||||
<data name="Settings_ShowWindow" xml:space="preserve">
|
<data name="Settings_ShowWindow" xml:space="preserve">
|
||||||
<value>Afficher la fenêtre</value>
|
<value>Afficher la fenêtre</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -180,9 +180,6 @@
|
|||||||
<data name="Settings_MadeBy" xml:space="preserve">
|
<data name="Settings_MadeBy" xml:space="preserve">
|
||||||
<value>Made by</value>
|
<value>Made by</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_MpcNET" xml:space="preserve">
|
|
||||||
<value>'s updated MpcNET</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_NextTrack" xml:space="preserve">
|
<data name="Settings_NextTrack" xml:space="preserve">
|
||||||
<value>Next track</value>
|
<value>Next track</value>
|
||||||
</data>
|
</data>
|
||||||
@ -198,6 +195,12 @@
|
|||||||
<data name="Settings_Shortcuts" xml:space="preserve">
|
<data name="Settings_Shortcuts" xml:space="preserve">
|
||||||
<value>Shortcuts</value>
|
<value>Shortcuts</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Settings_ShortcutsInfo" xml:space="preserve">
|
||||||
|
<value>Please note that if the input key is not recognized, this is due to a limitation on how virtual keys work.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_ShortcutsKey" xml:space="preserve">
|
||||||
|
<value>Enter a key...</value>
|
||||||
|
</data>
|
||||||
<data name="Settings_ShowWindow" xml:space="preserve">
|
<data name="Settings_ShowWindow" xml:space="preserve">
|
||||||
<value>Show window</value>
|
<value>Show window</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -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.25.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>
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 21 KiB |
@ -117,7 +117,7 @@
|
|||||||
<TextBlock x:Name="SnapcastText" Text="{x:Static properties:Resources.StartSnapcast}" Margin="5, 0, 0, 0"/>
|
<TextBlock x:Name="SnapcastText" Text="{x:Static properties:Resources.StartSnapcast}" Margin="5, 0, 0, 0"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Button>
|
</Button>
|
||||||
<Button x:Name="Radio" Padding="5, 2" HorizontalAlignment="Left" Click="Radios_Clicked" Margin="5,0,10,0" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" FocusVisualStyle="{x:Null}">
|
<Button x:Name="Radio" Padding="5, 2" HorizontalAlignment="Left" Click="Radios_Clicked" Margin="5,0,10,0" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" FocusVisualStyle="{x:Null}" IsEnabled="False">
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<emoji:TextBlock Text="📻" Padding="0,0,0,2"/>
|
<emoji:TextBlock Text="📻" Padding="0,0,0,2"/>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Radios}" Margin="5, 0, 0, 0"/>
|
<TextBlock Text="{x:Static properties:Resources.Radios}" Margin="5, 0, 0, 0"/>
|
||||||
|
@ -221,6 +221,11 @@ namespace unison
|
|||||||
SnapcastText.Text = unison.Resources.Resources.StartSnapcast;
|
SnapcastText.Text = unison.Resources.Resources.StartSnapcast;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OnRadioBrowserConnected()
|
||||||
|
{
|
||||||
|
Radio.IsEnabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
public void UpdateButton(ref Border border, bool b)
|
public void UpdateButton(ref Border border, bool b)
|
||||||
{
|
{
|
||||||
border.Style = b ? (Style)Resources["SelectedButton"] : (Style)Resources["UnselectedButton"];
|
border.Style = b ? (Style)Resources["SelectedButton"] : (Style)Resources["UnselectedButton"];
|
||||||
|
@ -59,8 +59,21 @@ namespace unison
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
_radioBrowser = new RadioBrowserClient();
|
try
|
||||||
Initialize();
|
{
|
||||||
|
_radioBrowser = new RadioBrowserClient();
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.WriteLine("Exception while connecting to RadioBrowser: " + e.Message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Application.Current.Dispatcher.Invoke(() =>
|
||||||
|
{
|
||||||
|
MainWindow MainWin = (MainWindow)Application.Current.MainWindow;
|
||||||
|
MainWin.OnRadioBrowserConnected();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void Initialize()
|
public async void Initialize()
|
||||||
@ -85,35 +98,42 @@ namespace unison
|
|||||||
|
|
||||||
public async Task SearchAdvanced(string name, string country, string tags)
|
public async Task SearchAdvanced(string name, string country, string tags)
|
||||||
{
|
{
|
||||||
SearchStatus.Text = unison.Resources.Resources.Radio_Loading;
|
try
|
||||||
|
|
||||||
List<StationInfo> advancedSearch = await _radioBrowser.Search.AdvancedAsync(new AdvancedSearchOptions
|
|
||||||
{
|
{
|
||||||
Name = name,
|
SearchStatus.Text = unison.Resources.Resources.Radio_Loading;
|
||||||
Country = country,
|
|
||||||
TagList = tags
|
|
||||||
});
|
|
||||||
|
|
||||||
RadioListGrid.Items.Clear();
|
List<StationInfo> advancedSearch = await _radioBrowser.Search.AdvancedAsync(new AdvancedSearchOptions
|
||||||
if (advancedSearch.Count > 0)
|
|
||||||
{
|
|
||||||
SearchStatus.Text = "";
|
|
||||||
foreach (StationInfo station in advancedSearch)
|
|
||||||
{
|
{
|
||||||
RadioListGrid.Items.Add(new StationListItem
|
Name = name,
|
||||||
|
Country = country,
|
||||||
|
TagList = tags
|
||||||
|
});
|
||||||
|
|
||||||
|
RadioListGrid.Items.Clear();
|
||||||
|
if (advancedSearch.Count > 0)
|
||||||
|
{
|
||||||
|
SearchStatus.Text = "";
|
||||||
|
foreach (StationInfo station in advancedSearch)
|
||||||
{
|
{
|
||||||
Name = CleanString(station.Name),
|
RadioListGrid.Items.Add(new StationListItem
|
||||||
Country = station.CountryCode,
|
{
|
||||||
Codec = station.Codec,
|
Name = CleanString(station.Name),
|
||||||
Bitrate = station.Bitrate,
|
Country = station.CountryCode,
|
||||||
Url = station.Url,
|
Codec = station.Codec,
|
||||||
Tags = string.Join(", ", station.Tags)
|
Bitrate = station.Bitrate,
|
||||||
});
|
Url = station.Url,
|
||||||
|
Tags = string.Join(", ", station.Tags)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
FitToContent();
|
||||||
}
|
}
|
||||||
FitToContent();
|
else
|
||||||
|
SearchStatus.Text = unison.Resources.Resources.Radio_NotFound;
|
||||||
|
}
|
||||||
|
catch (Exception except)
|
||||||
|
{
|
||||||
|
Debug.WriteLine("Error on RadioBrowser search advanced: " + except.Message);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
SearchStatus.Text = unison.Resources.Resources.Radio_NotFound;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FitToContent()
|
private void FitToContent()
|
||||||
@ -148,8 +168,15 @@ namespace unison
|
|||||||
|
|
||||||
private async void Search_Clicked(object sender, RoutedEventArgs e)
|
private async void Search_Clicked(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
CountryListItem a = (CountryListItem)CountryList.SelectedItem;
|
try
|
||||||
await SearchAdvanced(NameSearch.Text, a?.Name, TagSearch.Text);
|
{
|
||||||
|
CountryListItem a = (CountryListItem)CountryList.SelectedItem;
|
||||||
|
await SearchAdvanced(NameSearch.Text, a?.Name, TagSearch.Text);
|
||||||
|
}
|
||||||
|
catch (Exception except)
|
||||||
|
{
|
||||||
|
Debug.WriteLine("Error on RadioBrowser search: " + except.Message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Reset_Clicked(object sender, RoutedEventArgs e)
|
private void Reset_Clicked(object sender, RoutedEventArgs e)
|
||||||
|
@ -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">
|
||||||
@ -44,7 +54,6 @@
|
|||||||
</DockPanel>
|
</DockPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
|
|
||||||
<TabItem Header="{x:Static properties:Resources.Settings_Shortcuts}">
|
<TabItem Header="{x:Static properties:Resources.Settings_Shortcuts}">
|
||||||
<DockPanel Margin="8">
|
<DockPanel Margin="8">
|
||||||
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
||||||
@ -56,11 +65,12 @@
|
|||||||
</GroupBox.Header>
|
</GroupBox.Header>
|
||||||
<Grid>
|
<Grid>
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal" Margin="0,0,0,5">
|
||||||
<TextBox x:Name="VolumeOffset" TextWrapping="Wrap" Width="25" PreviewTextInput="NumberValidationTextBox" Margin="0,2,0,0"/>
|
<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="5,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 Margin="0,5,0,0" x:Name="RebindKeyWrapper">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition/>
|
<ColumnDefinition/>
|
||||||
<ColumnDefinition/>
|
<ColumnDefinition/>
|
||||||
@ -73,23 +83,78 @@
|
|||||||
<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="10,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="10,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="10,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="10,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="10,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="10,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" Margin="10,0,0,0">
|
||||||
|
<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="{x:Static properties:Resources.Settings_ShortcutsInfo}" TextWrapping="Wrap" Margin="0,2,0,0" MaxWidth="420" />
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<Button Content="{x:Static properties:Resources.Settings_SnapcastResetButton}" Margin="0,10,0,0" Width="120" Click="ShortcutsReset_Clicked"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
@ -195,14 +260,14 @@
|
|||||||
</TextBlock>
|
</TextBlock>
|
||||||
<TextBlock TextWrapping="Wrap" VerticalAlignment="Top">
|
<TextBlock TextWrapping="Wrap" VerticalAlignment="Top">
|
||||||
<Run Text="{x:Static properties:Resources.Settings_AboutInfo}" /><LineBreak/>
|
<Run Text="{x:Static properties:Resources.Settings_AboutInfo}" /><LineBreak/>
|
||||||
※ <Hyperlink NavigateUri="https://github.com/Difegue/Stylophone" RequestNavigate="Hyperlink_RequestNavigate">Stylophone</Hyperlink><Run Text="{x:Static properties:Resources.Settings_MpcNET}" /><LineBreak/>
|
※ <Hyperlink NavigateUri="https://github.com/Difegue/MpcNET" RequestNavigate="Hyperlink_RequestNavigate">MpcNET</Hyperlink><LineBreak/>
|
||||||
※ <Hyperlink NavigateUri="https://github.com/hardcodet/wpf-notifyicon" RequestNavigate="Hyperlink_RequestNavigate">wpf-notifyicon</Hyperlink><LineBreak/>
|
※ <Hyperlink NavigateUri="https://github.com/hardcodet/wpf-notifyicon" RequestNavigate="Hyperlink_RequestNavigate">wpf-notifyicon</Hyperlink><LineBreak/>
|
||||||
※ <Hyperlink NavigateUri="https://github.com/samhocevar/emoji.wpf" RequestNavigate="Hyperlink_RequestNavigate">Emoji.WPF</Hyperlink><LineBreak/>
|
※ <Hyperlink NavigateUri="https://github.com/samhocevar/emoji.wpf" RequestNavigate="Hyperlink_RequestNavigate">Emoji.WPF</Hyperlink><LineBreak/>
|
||||||
※ <Hyperlink NavigateUri="https://github.com/tof4/RadioBrowser" RequestNavigate="Hyperlink_RequestNavigate">RadioBrowser</Hyperlink>
|
※ <Hyperlink NavigateUri="https://github.com/tof4/RadioBrowser" RequestNavigate="Hyperlink_RequestNavigate">RadioBrowser</Hyperlink>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
<TextBlock Margin="0,10,0,0">
|
<TextBlock Margin="0,10,0,0">
|
||||||
<Run Text="{x:Static properties:Resources.Settings_SourceCode1}" />
|
<Run Text="{x:Static properties:Resources.Settings_SourceCode1}" />
|
||||||
<Hyperlink NavigateUri="https://git.n700.ovh/keb/unison" RequestNavigate="Hyperlink_RequestNavigate">
|
<Hyperlink NavigateUri="https://github.com/ZetaKebab/unison" RequestNavigate="Hyperlink_RequestNavigate">
|
||||||
<Run Text="{x:Static properties:Resources.Settings_SourceCode2}" />
|
<Run Text="{x:Static properties:Resources.Settings_SourceCode2}" />
|
||||||
</Hyperlink>.
|
</Hyperlink>.
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
|
@ -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 = unison.Resources.Resources.Settings_ShortcutsKey;
|
||||||
|
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BIN
snapclient_0.26.0-1_win64/snapclient.exe
Normal file
@ -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,37 +41,13 @@
|
|||||||
<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>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\FLAC.dll">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\ogg.dll">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\opus.dll">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\snapclient.exe">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\soxr.dll">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="snapclient_0.25.0-1_win64\vorbis.dll">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Emoji.Wpf" Version="0.3.3" />
|
<PackageReference Include="Emoji.Wpf" Version="0.3.3" />
|
||||||
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
|
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
|
||||||
<PackageReference Include="RadioBrowser" Version="0.6.1" />
|
<PackageReference Include="RadioBrowser" Version="0.6.1" />
|
||||||
</ItemGroup>
|
<PackageReference Include="MpcNET" Version="1.3.0" />
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\MpcNET\MpcNET.csproj" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -109,6 +78,27 @@
|
|||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||||
</None>
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\FLAC.dll">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\ogg.dll">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\opus.dll">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\README.txt">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\snapclient.exe">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\soxr.dll">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\vorbis.dll">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
11
unison.sln
@ -4,11 +4,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
|||||||
VisualStudioVersion = 16.0.31515.178
|
VisualStudioVersion = 16.0.31515.178
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "unison", "unison.csproj", "{489048C4-3FCA-4573-B34C-943D03F94D04}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "unison", "unison.csproj", "{489048C4-3FCA-4573-B34C-943D03F94D04}"
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19} = {230556C6-5AC3-4FD8-8947-C9ABF1416D19}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MpcNET", "..\MpcNET\MpcNET.csproj", "{230556C6-5AC3-4FD8-8947-C9ABF1416D19}"
|
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@ -23,12 +18,6 @@ Global
|
|||||||
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release|Any CPU.Build.0 = Release|Any CPU
|
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release-Stable|Any CPU.ActiveCfg = Release|Any CPU
|
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release-Stable|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release-Stable|Any CPU.Build.0 = Release|Any CPU
|
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release-Stable|Any CPU.Build.0 = Release|Any CPU
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Release-Stable|Any CPU.ActiveCfg = Release-Stable|Any CPU
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Release-Stable|Any CPU.Build.0 = Release-Stable|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|