Skip to content

Commit

Permalink
live spotify progress & json bar loading
Browse files Browse the repository at this point in the history
  • Loading branch information
WebFreak001 committed Mar 21, 2019
1 parent 8b747b2 commit 54080f6
Show file tree
Hide file tree
Showing 12 changed files with 662 additions and 47 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@ __dummy.html
*.obj
dub.selections.json
dwin-bar
.vscode/
.vscode/
/config.json
/nohup.out
/spotify-auth.json
41 changes: 41 additions & 0 deletions config.json.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"fontPrimary": "Roboto:Medium",
"fontSecondary": "Roboto:Light",
"height": 32,
"spotify": { // or omit this block
"clientId": "<obtain from spotify>",
"clientSecret": "<obtain from spotify>",
"redirectURL": "http://127.0.0.1:3007/spotify/auth"
},
"panels": [
{
"screen": "First",
"dock": "Bottom",
"widgets": [
"dwinbar.widgets.clock.ClockWidget",
"dwinbar.widgets.volume.VolumeWidget",
{
"type": "dwinbar.widgets.mediaplayer.MprisMediaPlayerWidget",
"dest": "org.mpris.MediaPlayer2.spotify",
"spotify": true
},
"dwinbar.widgets.phone_battery.PhoneBatteryWidget",
{
"type": "dwinbar.widgets.workspace.WorkspaceWidget",
"display": "DisplayPort-0"
}
]
},
{
"screen": "Second",
"dock": "Bottom",
"widgets": [
"dwinbar.widgets.clock.ClockWidget",
{
"type": "dwinbar.widgets.workspace.WorkspaceWidget",
"display": "DisplayPort-1"
}
]
}
]
}
3 changes: 2 additions & 1 deletion dub.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
"imageformats": "~>7.0.0",
"derelict-ft": "~>2.0.0-beta.4",
"eventsystem": "~>1.2.0",
"ddbus": "~>2.3.0"
"ddbus": "~>2.3.0",
"vibe-d": "~>0.8.5-rc.1"
},
"libs": [
"Xinerama"
Expand Down
204 changes: 176 additions & 28 deletions source/app.d
Original file line number Diff line number Diff line change
Expand Up @@ -6,54 +6,202 @@ import dwinbar.widgets.notifications;
import dwinbar.widgets.volume;
import dwinbar.widgets.workspace;

import dwinbar.widget;

import dwinbar.kdeconnect;
import dwinbar.webserver;

/*import dwinbar.widgets.volume;
import dwinbar.widgets.tray;
import dwinbar.widgets.workspace;*/

import dwinbar.bar;

import std.conv;
import std.string;
import std.meta;

import vibe.core.file;
import vibe.core.log;
import vibe.data.json;

bool applyBarConfig(string setting, Json value, ref BarConfiguration config)
{
switch (setting)
{
static foreach (member; AliasSeq!("fontPrimary", "fontSecondary",
"fontNeutral", "fontFallback"))
{
case member:
__traits(getMember, config, member) = value.to!string;
return true;
}
case "displayName":
config.displayName = cast(char*) value.to!string.dup.toStringz;
return true;
case "spotify":
clientId = value["clientId"].to!string;
clientSecret = value["clientSecret"].to!string;
redirectURL = value["redirectURL"].to!string;
return true;
default:
return false;
}
}

bool applyPanelConfig(string setting, Json value, ref PanelConfiguration config,
ref Screen screen, ref Dock dock)
{
switch (setting)
{
static foreach (member; AliasSeq!("height", "barBaselinePadding", "appIconPadding",
"appBaselineMargin", "widgetBaselineMargin", "focusStripeHeight", "offsetX", "offsetY"))
{
case member:
__traits(getMember, config, member) = value.to!int;
return true;
}
case "enableAppList":
config.enableAppList = value.to!bool;
return true;
case "screen":
screen = value.to!string
.to!Screen;
return true;
case "dock":
dock = value.to!string
.to!Dock;
return true;
default:
return false;
}
}

void main(string[] args)
{
Json[string] userConfig = parseJsonString(readFileUTF8("config.json"), "config.json").get!(
Json[string]);

BarConfiguration config;
config.fontPrimary = "Roboto:Medium";
config.fontSecondary = "Roboto:Light";

PanelConfiguration panelConfig;
panelConfig.height = 32;

Json[] panels;

foreach (k, v; userConfig)
{
if (k == "panels")
{
panels = v.get!(Json[]);
continue;
}

if (applyBarConfig(k, v, config))
continue;

Screen screen;
Dock dock;
if (applyPanelConfig(k, v, panelConfig, screen, dock))
continue;

logInfo("Unknown json setting: %s: %s", k, v);
}

Bar bar = loadBar(config);
startSpotifyWebServer();
scope (exit)
{
import std.concurrency : send;

string left = args.length > 1 ? args[1] : null;
string right = args.length > 2 ? args[2] : null;

auto phones = KDEConnectDevice.listDevices();

//dfmt off
auto panel1 = bar.addPanel(Screen.First, Dock.Bottom, panelConfig)
.add(new ClockWidget())
// find using `dbus-send --print-reply --system --dest=org.freedesktop.UPower /org/freedesktop/UPower org.freedesktop.UPower.EnumerateDevices`
//.add(new BatteryWidget(bar.fontFamily, "/org/freedesktop/UPower/devices/battery_BAT1"))
//.add(new NotificationsWidget(&bar))
.add(new VolumeWidget())
.add(new MprisMediaPlayerWidget(bar.fontFamily, "org.mpris.MediaPlayer2.spotify"))
//.add(new WorkspaceWidget(bar.x, "DisplayPort-1"))
;
if (phones.length)
panel1.add(new PhoneBatteryWidget(bar.fontFamily, phones[0]));

if (left.length)
panel1.add(new WorkspaceWidget(bar.x, left));

if (right.length)
bar.addPanel(Screen.Second, Dock.Bottom, panelConfig)
.add(new ClockWidget())
.add(new WorkspaceWidget(bar.x, right))
//.add(new WorkspaceWidget(bar.x, "DisplayPort-0"))
;
//dfmt on
send(webServerThread, DoExit());
}

foreach (panel; panels)
{
bar.loadPanel(panel.get!(Json[string]), panelConfig);
}

//bar.tray = panel1;
bar.start();
}

void loadPanel(ref Bar bar, Json[string] settings, PanelConfiguration panelConfig)
{
Screen screen = Screen.First;
Dock dock = Dock.Bottom;

Json[] widgets;
foreach (k, v; settings)
{
if (k == "widgets")
{
widgets = v.get!(Json[]);
continue;
}

if (applyPanelConfig(k, v, panelConfig, screen, dock))
continue;

logInfo("Unknown panel setting: %s: %s", k, v);
}

auto panel = bar.addPanel(screen, dock, panelConfig);

foreach (widget; widgets)
{
panel.addWidget(widget, bar, panelConfig);
}

// .add(new ClockWidget())
// // find using `dbus-send --print-reply --system --dest=org.freedesktop.UPower /org/freedesktop/UPower org.freedesktop.UPower.EnumerateDevices`
// //.add(new BatteryWidget(bar.fontFamily, "/org/freedesktop/UPower/devices/battery_BAT1"))
// //.add(new NotificationsWidget(&bar))
// .add(new VolumeWidget())
// .add(new MprisMediaPlayerWidget(bar.fontFamily, "org.mpris.MediaPlayer2.spotify"))
// //.add(new WorkspaceWidget(bar.x, "DisplayPort-1"))
// ;
// if (phones.length)
// panel1.add(new PhoneBatteryWidget(bar.fontFamily, phones[0]));

// if (left.length)
// panel1.add(new WorkspaceWidget(bar.x, left));

// if (right.length)
// bar.addPanel(Screen.Second, Dock.Bottom, panelConfig)
// .add(new ClockWidget())
// .add(new WorkspaceWidget(bar.x, right))
// //.add(new WorkspaceWidget(bar.x, "DisplayPort-0"))
// ;
// //dfmt on
}

void addWidget(Panel panel, Json widget, ref Bar bar, PanelConfiguration panelConfig)
{
string className = widget.type == Json.Type.string ? widget.to!string : widget["type"].to!string;

auto ret = cast(Widget) Object.factory(className);
if (!ret)
{
logError("Could not find widget %s", className);
return;
}
ret.loadBase(WidgetConfig(&bar, panelConfig));

if (widget.type == Json.Type.object)
{
foreach (k, v; widget.get!(Json[string]))
{
if (k == "type")
continue;
if (ret.setProperty(k, v))
continue;

logInfo("Unknown %s widget config: %s %s", className, k, v);
}
}

panel.add(ret);
}
Loading

0 comments on commit 54080f6

Please sign in to comment.