Add command line options
This commit is contained in:
parent
cca7f91303
commit
f93a3cef4d
2 changed files with 130 additions and 107 deletions
|
@ -12,6 +12,7 @@
|
|||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="GirCore.Gtk-4.0" Version="0.6.3" />
|
||||
<PackageReference Include="System.CommandLine" Version="2.0.0-beta7.25380.108" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -1,130 +1,152 @@
|
|||
using Gdk;
|
||||
using System.CommandLine;
|
||||
using Gdk;
|
||||
using Gio;
|
||||
using GLib;
|
||||
using Gtk;
|
||||
using Pango;
|
||||
using ZwlrLayerShell;
|
||||
using Application = Gtk.Application;
|
||||
using TimeSpan = System.TimeSpan;
|
||||
using Variant = GLib.Variant;
|
||||
|
||||
if (!LayerShell.IsSupported())
|
||||
var overlayLayer = new Option<bool>("--overlay", "-o")
|
||||
{ Description = "Use the overlay layer instead of the top layer." };
|
||||
var horizontalMargin = new Option<uint>("--hmargin", "-H")
|
||||
{ Description = "Horizontal margin from screen edge in pixels.", DefaultValueFactory = parseResult => 55 };
|
||||
var verticalMargin = new Option<uint>("--vmargin", "-V")
|
||||
{ Description = "Vertical margin from screen edge in pixels.", DefaultValueFactory = parseResult => 15 };
|
||||
|
||||
var root = new RootCommand("Displays your current song like in Deltarune Chapter 1.")
|
||||
{ Options = { overlayLayer, horizontalMargin, verticalMargin } };
|
||||
|
||||
root.SetAction(RunApplication);
|
||||
|
||||
var rootParsed = root.Parse(args);
|
||||
|
||||
return rootParsed.Invoke();
|
||||
|
||||
void RunApplication(ParseResult parseResult)
|
||||
{
|
||||
Console.WriteLine("You must be running on a Wayland compositor that supports zwlr_layer_shell_v1");
|
||||
return 255;
|
||||
}
|
||||
|
||||
ApplicationWindow? window = null;
|
||||
|
||||
var application = Application.New("gay.pancakes.deltatune_wls", Gio.ApplicationFlags.FlagsNone);
|
||||
|
||||
GLib.Functions.TimeoutAdd(GLib.Constants.PRIORITY_DEFAULT, 500, () =>
|
||||
{
|
||||
if (window == null) return true;
|
||||
|
||||
var playerctl = Subprocess.New(["playerctl", "metadata", "--format", "{{ title }}"],
|
||||
SubprocessFlags.StdoutPipe | SubprocessFlags.StderrSilence);
|
||||
|
||||
var pipe = playerctl.GetStdoutPipe();
|
||||
if (pipe == null) return true;
|
||||
|
||||
var stdout = DataInputStream.New(pipe);
|
||||
var line = stdout.ReadLineUtf8(out UIntPtr length, null);
|
||||
|
||||
window.ActivateAction("new_song", Variant.NewString(line?.Trim() ?? ""));
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
application.OnActivate += (sender, eventArgs) =>
|
||||
{
|
||||
window = ApplicationWindow.New((Application)sender);
|
||||
|
||||
LayerShell.InitForWindow(window);
|
||||
LayerShell.SetNamespace(window, "deltatune-wls");
|
||||
LayerShell.SetLayer(window, Layer.Top);
|
||||
LayerShell.SetAnchor(window, Edge.Left, true);
|
||||
LayerShell.SetAnchor(window, Edge.Right, true);
|
||||
LayerShell.SetAnchor(window, Edge.Top, true);
|
||||
LayerShell.SetMargin(window, 15);
|
||||
LayerShell.SetMargin(window, Edge.Left, 55);
|
||||
|
||||
var label = Label.New(null);
|
||||
label.Halign = Align.Start;
|
||||
label.Ellipsize = EllipsizeMode.End;
|
||||
|
||||
window.SetChild(label);
|
||||
|
||||
window.OnDestroy += (widget, args1) => application.Quit();
|
||||
|
||||
var action = SimpleAction.NewStateful("new_song", VariantType.String, Variant.NewString(""));
|
||||
action.OnActivate += (simpleAction, signalArgs) =>
|
||||
if (!LayerShell.IsSupported())
|
||||
{
|
||||
var title = simpleAction.GetState()!.GetString(out _);
|
||||
var newTitle = signalArgs.Parameter!.GetString(out _);
|
||||
Console.WriteLine("You must be running on a Wayland compositor that supports zwlr_layer_shell_v1");
|
||||
return;
|
||||
}
|
||||
|
||||
if (newTitle != title)
|
||||
ApplicationWindow? window = null;
|
||||
|
||||
var application = Application.New("gay.pancakes.deltatune_wls", Gio.ApplicationFlags.FlagsNone);
|
||||
|
||||
GLib.Functions.TimeoutAdd(GLib.Constants.PRIORITY_DEFAULT, 500, () =>
|
||||
{
|
||||
if (window == null) return true;
|
||||
|
||||
var playerctl = Subprocess.New(["playerctl", "metadata", "--format", "{{ title }}"],
|
||||
SubprocessFlags.StdoutPipe | SubprocessFlags.StderrSilence);
|
||||
|
||||
var pipe = playerctl.GetStdoutPipe();
|
||||
if (pipe == null) return true;
|
||||
|
||||
var stdout = DataInputStream.New(pipe);
|
||||
var line = stdout.ReadLineUtf8(out UIntPtr length, null);
|
||||
|
||||
window.ActivateAction("new_song", Variant.NewString(line?.Trim() ?? ""));
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
application.OnActivate += (sender, eventArgs) =>
|
||||
{
|
||||
window = ApplicationWindow.New((Application)sender);
|
||||
|
||||
LayerShell.InitForWindow(window);
|
||||
LayerShell.SetNamespace(window, "deltatune-wls");
|
||||
LayerShell.SetLayer(window, parseResult.GetValue(overlayLayer) ? Layer.Overlay : Layer.Top);
|
||||
LayerShell.SetAnchor(window, Edge.Left, true);
|
||||
LayerShell.SetAnchor(window, Edge.Right, true);
|
||||
LayerShell.SetAnchor(window, Edge.Top, true);
|
||||
LayerShell.SetMargin(window, Edge.Left, (int)parseResult.GetValue(horizontalMargin));
|
||||
LayerShell.SetMargin(window, Edge.Right, (int)parseResult.GetValue(horizontalMargin));
|
||||
LayerShell.SetMargin(window, Edge.Top, (int)parseResult.GetValue(verticalMargin));
|
||||
LayerShell.SetMargin(window, Edge.Bottom, (int)parseResult.GetValue(verticalMargin));
|
||||
|
||||
var label = Label.New(null);
|
||||
label.Halign = Align.Start;
|
||||
label.Ellipsize = EllipsizeMode.End;
|
||||
|
||||
window.SetChild(label);
|
||||
|
||||
window.OnDestroy += (widget, args1) => application.Quit();
|
||||
|
||||
var action = SimpleAction.NewStateful("new_song", VariantType.String, Variant.NewString(""));
|
||||
action.OnActivate += (simpleAction, signalArgs) =>
|
||||
{
|
||||
simpleAction.SetState(signalArgs.Parameter);
|
||||
label.SetLabel($"♪ ~ {newTitle}");
|
||||
if (!label.HasCssClass("fade-in"))
|
||||
var title = simpleAction.GetState()!.GetString(out _);
|
||||
var newTitle = signalArgs.Parameter!.GetString(out _);
|
||||
|
||||
if (newTitle != title)
|
||||
{
|
||||
label.AddCssClass("fade-in");
|
||||
GLib.Functions.TimeoutAddSeconds(GLib.Constants.PRIORITY_DEFAULT, 9, () => {
|
||||
label.RemoveCssClass("fade-in");
|
||||
return false;
|
||||
});
|
||||
simpleAction.SetState(signalArgs.Parameter);
|
||||
label.SetLabel($"♪ ~ {newTitle}");
|
||||
if (!label.HasCssClass("fade-in"))
|
||||
{
|
||||
label.AddCssClass("fade-in");
|
||||
GLib.Functions.TimeoutAddSeconds(GLib.Constants.PRIORITY_DEFAULT, 9, () =>
|
||||
{
|
||||
label.RemoveCssClass("fade-in");
|
||||
return false;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
window.AddAction(action);
|
||||
|
||||
window.Present();
|
||||
};
|
||||
window.AddAction(action);
|
||||
|
||||
window.Present();
|
||||
};
|
||||
var css = CssProvider.New();
|
||||
css.LoadFromString("""
|
||||
window {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
var css = CssProvider.New();
|
||||
css.LoadFromString("""
|
||||
window {
|
||||
background-color: transparent;
|
||||
}
|
||||
window label {
|
||||
font-size: x-large;
|
||||
color: white;
|
||||
text-shadow: -1px -1px 0 #15249a, 1px -1px 0 #15249a, -1px 1px 0 #15249a, 1px 1px 0 #15249a;;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
window label {
|
||||
font-size: x-large;
|
||||
color: white;
|
||||
text-shadow: -1px -1px 0 #15249a, 1px -1px 0 #15249a, -1px 1px 0 #15249a, 1px 1px 0 #15249a;;
|
||||
opacity: 0;
|
||||
}
|
||||
.fade-in {
|
||||
animation: 8s fade-in ease-in-out both;
|
||||
}
|
||||
|
||||
.fade-in {
|
||||
animation: 8s fade-in ease-in-out both;
|
||||
}
|
||||
@keyframes fade-in {
|
||||
0% {
|
||||
transform: translateX(80px);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
@keyframes fade-in {
|
||||
0% {
|
||||
transform: translateX(80px);
|
||||
opacity: 0;
|
||||
}
|
||||
5% {
|
||||
transform: translateX(50px);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
80% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
5% {
|
||||
transform: translateX(50px);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
80% {
|
||||
opacity: 1;
|
||||
}
|
||||
85% {
|
||||
transform: translateX(50px);
|
||||
}
|
||||
|
||||
85% {
|
||||
transform: translateX(50px);
|
||||
}
|
||||
100% {
|
||||
transform: translateX(0);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
""");
|
||||
StyleContext.AddProviderForDisplay(Display.GetDefault()!, css,
|
||||
Gtk.Constants.STYLE_PROVIDER_PRIORITY_APPLICATION);
|
||||
|
||||
100% {
|
||||
transform: translateX(0);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
""");
|
||||
StyleContext.AddProviderForDisplay(Display.GetDefault()!, css,
|
||||
Gtk.Constants.STYLE_PROVIDER_PRIORITY_APPLICATION);
|
||||
|
||||
return application.RunWithSynchronizationContext(null);
|
||||
application.RunWithSynchronizationContext(null);
|
||||
}
|
Loading…
Add table
Reference in a new issue