aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/org.ayatana.indicator.sound.AccountsService.xml7
-rw-r--r--src/accounts-service-access.vala161
-rw-r--r--src/accounts-service-sound-settings.vala24
-rw-r--r--src/media-player-list-greeter.vala18
-rw-r--r--src/volume-control-pulse.vala12
5 files changed, 155 insertions, 67 deletions
diff --git a/data/org.ayatana.indicator.sound.AccountsService.xml b/data/org.ayatana.indicator.sound.AccountsService.xml
index 7a8c2bd..874473f 100644
--- a/data/org.ayatana.indicator.sound.AccountsService.xml
+++ b/data/org.ayatana.indicator.sound.AccountsService.xml
@@ -37,6 +37,11 @@
<property name="ArtUrl" type="s" access="readwrite">
<annotation name="org.freedesktop.Accounts.DefaultValue" value=""/>
</property>
-
+ <property name="Volume" type="d" access="readwrite">
+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="1.0"/>
+ </property>
+ <property name="Muted" type="b" access="readwrite">
+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="false"/>
+ </property>
</interface>
</node>
diff --git a/src/accounts-service-access.vala b/src/accounts-service-access.vala
index c6b53d7..1b66370 100644
--- a/src/accounts-service-access.vala
+++ b/src/accounts-service-access.vala
@@ -1,6 +1,6 @@
/*
* Copyright 2016 Canonical Ltd.
- * Copyright 2021 Robert Tari
+ * Copyright 2021-2023 Robert Tari
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,17 +23,17 @@ using PulseAudio;
using Notify;
using Gee;
-[DBus (name="org.ayatana.Greeter.List")]
-interface GreeterListInterfaceAccess : Object
+[DBus (name="org.ayatana.greeter")]
+interface GreeterInterfaceAccess : Object
{
- public abstract async string get_active_entry () throws GLib.DBusError, GLib.IOError;
- public signal void entry_selected (string entry_name);
+ public abstract async string GetUser () throws GLib.DBusError, GLib.IOError;
+ public signal void UserChanged (string user);
}
public class AccountsServiceAccess : Object
{
private DBusProxy _user_proxy;
- private GreeterListInterfaceAccess _greeter_proxy;
+ private GreeterInterfaceAccess _greeter_proxy;
private double _volume = 0.0;
private string _last_running_player = "";
private bool _mute = false;
@@ -90,24 +90,32 @@ public class AccountsServiceAccess : Object
private void accountsservice_props_changed_cb (DBusProxy proxy, Variant changed_properties, string[]? invalidated_properties)
{
Variant volume_variant = changed_properties.lookup_value ("Volume", VariantType.DOUBLE);
- if (volume_variant != null) {
+
+ if (volume_variant != null)
+ {
var volume = volume_variant.get_double ();
- if (volume >= 0 && _volume != volume) {
+
+ if (volume >= 0 && _volume != volume)
+ {
_volume = volume;
- this.notify_property("volume");
+ this.notify_property ("volume");
}
}
Variant mute_variant = changed_properties.lookup_value ("Muted", VariantType.BOOLEAN);
- if (mute_variant != null) {
+
+ if (mute_variant != null)
+ {
_mute = mute_variant.get_boolean ();
- this.notify_property("mute");
+ this.notify_property ("mute");
}
Variant last_running_player_variant = changed_properties.lookup_value ("LastRunningPlayer", VariantType.STRING);
- if (last_running_player_variant != null) {
+
+ if (last_running_player_variant != null)
+ {
_last_running_player = last_running_player_variant.get_string ();
- this.notify_property("last-running-player");
+ this.notify_property ("last-running-player");
}
}
@@ -117,40 +125,67 @@ public class AccountsServiceAccess : Object
_user_proxy = null;
// Look up currently selected greeter user, if asked
- if (username == null) {
- try {
- username = yield _greeter_proxy.get_active_entry ();
+ if (username == null)
+ {
+ try
+ {
+ username = yield _greeter_proxy.GetUser ();
+
if (username == "" || username == null)
+ {
return;
- } catch (GLib.Error e) {
+ }
+ }
+ catch (GLib.Error e)
+ {
warning ("unable to find Accounts path for user %s: %s", username == null ? "null" : username, e.message);
+
return;
}
}
// Get master AccountsService object
DBusProxy accounts_proxy;
- try {
+
+ try
+ {
accounts_proxy = yield new DBusProxy.for_bus (BusType.SYSTEM, DBusProxyFlags.DO_NOT_LOAD_PROPERTIES | DBusProxyFlags.DO_NOT_CONNECT_SIGNALS, null, "org.freedesktop.Accounts", "/org/freedesktop/Accounts", "org.freedesktop.Accounts");
- } catch (GLib.Error e) {
+ }
+ catch (GLib.Error e)
+ {
warning ("unable to get greeter proxy: %s", e.message);
+
return;
}
// Find user's AccountsService object
- try {
+ try
+ {
var user_path_variant = yield accounts_proxy.call ("FindUserByName", new Variant ("(s)", username), DBusCallFlags.NONE, -1);
string user_path;
- if (user_path_variant.check_format_string ("(o)", true)) {
+
+ if (user_path_variant.check_format_string ("(o)", true))
+ {
user_path_variant.get ("(o)", out user_path);
-#if LOMIRI_FEATURES_ENABLED
- _user_proxy = yield new DBusProxy.for_bus (BusType.SYSTEM, DBusProxyFlags.GET_INVALIDATED_PROPERTIES, null, "org.freedesktop.Accounts", user_path, "com.lomiri.AccountsService.Sound");
-#endif
- } else {
+ bool bLomiri = AyatanaCommon.utils_is_lomiri ();
+
+ if (bLomiri)
+ {
+ _user_proxy = yield new DBusProxy.for_bus (BusType.SYSTEM, DBusProxyFlags.GET_INVALIDATED_PROPERTIES, null, "org.freedesktop.Accounts", user_path, "com.lomiri.AccountsService.Sound");
+ }
+ else
+ {
+ _user_proxy = yield new DBusProxy.for_bus (BusType.SYSTEM, DBusProxyFlags.GET_INVALIDATED_PROPERTIES, null, "org.freedesktop.Accounts", user_path, "org.ayatana.indicator.sound.AccountsService");
+ }
+ }
+ else
+ {
warning ("Unable to find user name after calling FindUserByName. Expected type: %s and obtained %s", "(o)", user_path_variant.get_type_string () );
return;
}
- } catch (GLib.Error e) {
+ }
+ catch (GLib.Error e)
+ {
warning ("unable to find Accounts path for user %s: %s", username, e.message);
return;
}
@@ -159,17 +194,26 @@ public class AccountsServiceAccess : Object
{
// Get current values and listen for changes
_user_proxy.g_properties_changed.connect (accountsservice_props_changed_cb);
- try {
+
+ try
+ {
var props_variant = yield _user_proxy.get_connection ().call (_user_proxy.get_name (), _user_proxy.get_object_path (), "org.freedesktop.DBus.Properties", "GetAll", new Variant ("(s)", _user_proxy.get_interface_name ()), null, DBusCallFlags.NONE, -1);
- if (props_variant.check_format_string ("(@a{sv})", true)) {
+
+ if (props_variant.check_format_string ("(@a{sv})", true))
+ {
Variant props;
props_variant.get ("(@a{sv})", out props);
- accountsservice_props_changed_cb(_user_proxy, props, null);
- } else {
- warning ("Unable to get accounts service properties after calling GetAll. Expected type: %s and obtained %s", "(@a{sv})", props_variant.get_type_string () );
+ accountsservice_props_changed_cb (_user_proxy, props, null);
+ }
+ else
+ {
+ warning ("Unable to get accounts service properties after calling GetAll. Expected type: %s and obtained %s", "(@a{sv})", props_variant.get_type_string ());
+
return;
}
- } catch (GLib.Error e) {
+ }
+ catch (GLib.Error e)
+ {
debug("Unable to get properties for user %s at first try: %s", username, e.message);
}
}
@@ -182,19 +226,28 @@ public class AccountsServiceAccess : Object
private async void setup_accountsservice ()
{
- if (Environment.get_variable ("XDG_SESSION_CLASS") == "greeter") {
- try {
- _greeter_proxy = yield Bus.get_proxy (BusType.SESSION, "org.ayatana.Greeter", "/list");
- } catch (GLib.Error e) {
+ if (Environment.get_variable ("XDG_SESSION_CLASS") == "greeter")
+ {
+ try
+ {
+ _greeter_proxy = yield Bus.get_proxy (BusType.SESSION, "org.ayatana.greeter", "/org/ayatana/greeter");
+ }
+ catch (GLib.Error e)
+ {
warning ("unable to get greeter proxy: %s", e.message);
+
return;
}
- _greeter_proxy.entry_selected.connect (greeter_user_changed);
+
+ _greeter_proxy.UserChanged.connect (greeter_user_changed);
yield setup_user_proxy ();
- } else {
- // We are in a user session. We just need our own proxy
+ }
+ else
+ {
unowned string username = Environment.get_variable ("USER");
- if (username != null && username != "") {
+
+ if (username != null && username != "")
+ {
yield setup_user_proxy (username);
}
}
@@ -203,24 +256,35 @@ public class AccountsServiceAccess : Object
private async void sync_last_running_player_to_accountsservice (string last_running_player)
{
if (_user_proxy == null)
+ {
return;
+ }
- try {
+ try
+ {
yield _user_proxy.get_connection ().call (_user_proxy.get_name (), _user_proxy.get_object_path (), "org.freedesktop.DBus.Properties", "Set", new Variant ("(ssv)", _user_proxy.get_interface_name (), "LastRunningPlayer", new Variant ("s", last_running_player)), null, DBusCallFlags.NONE, -1, _dbus_call_cancellable);
- } catch (GLib.Error e) {
+ }
+ catch (GLib.Error e)
+ {
warning ("unable to sync last running player %s to AccountsService: %s",last_running_player, e.message);
}
+
_last_running_player = last_running_player;
}
private async void sync_volume_to_accountsservice (double volume)
{
if (_user_proxy == null)
+ {
return;
+ }
- try {
+ try
+ {
yield _user_proxy.get_connection ().call (_user_proxy.get_name (), _user_proxy.get_object_path (), "org.freedesktop.DBus.Properties", "Set", new Variant ("(ssv)", _user_proxy.get_interface_name (), "Volume", new Variant ("d", volume)), null, DBusCallFlags.NONE, -1, _dbus_call_cancellable);
- } catch (GLib.Error e) {
+ }
+ catch (GLib.Error e)
+ {
warning ("unable to sync volume %f to AccountsService: %s", volume, e.message);
}
}
@@ -228,11 +292,16 @@ public class AccountsServiceAccess : Object
private async void sync_mute_to_accountsservice (bool mute)
{
if (_user_proxy == null)
+ {
return;
+ }
- try {
+ try
+ {
yield _user_proxy.get_connection ().call (_user_proxy.get_name (), _user_proxy.get_object_path (), "org.freedesktop.DBus.Properties", "Set", new Variant ("(ssv)", _user_proxy.get_interface_name (), "Muted", new Variant ("b", mute)), null, DBusCallFlags.NONE, -1, _dbus_call_cancellable);
- } catch (GLib.Error e) {
+ }
+ catch (GLib.Error e)
+ {
warning ("unable to sync mute %s to AccountsService: %s", mute ? "true" : "false", e.message);
}
}
diff --git a/src/accounts-service-sound-settings.vala b/src/accounts-service-sound-settings.vala
index bbd6852..54c6ad6 100644
--- a/src/accounts-service-sound-settings.vala
+++ b/src/accounts-service-sound-settings.vala
@@ -1,5 +1,6 @@
/*
* Copyright 2014 Canonical Ltd.
+ * Copyright 2023 Robert Tari
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -15,18 +16,21 @@
*
* Authors:
* Ted Gould <ted@canonical.com>
+ * Robert Tari <robert@tari.in>
*/
[DBus (name = "org.ayatana.indicator.sound.AccountsService")]
public interface AccountsServiceSoundSettings : Object {
- // properties
- public abstract uint64 timestamp {owned get; set;}
- public abstract string player_name {owned get; set;}
- public abstract Variant player_icon {owned get; set;}
- public abstract bool running {owned get; set;}
- public abstract string state {owned get; set;}
- public abstract string title {owned get; set;}
- public abstract string artist {owned get; set;}
- public abstract string album {owned get; set;}
- public abstract string art_url {owned get; set;}
+ // properties
+ public abstract uint64 timestamp {owned get; set;}
+ public abstract string player_name {owned get; set;}
+ public abstract Variant player_icon {owned get; set;}
+ public abstract bool running {owned get; set;}
+ public abstract string state {owned get; set;}
+ public abstract string title {owned get; set;}
+ public abstract string artist {owned get; set;}
+ public abstract string album {owned get; set;}
+ public abstract string art_url {owned get; set;}
+ public abstract double volume {owned get; set;}
+ public abstract bool mute {owned get; set;}
}
diff --git a/src/media-player-list-greeter.vala b/src/media-player-list-greeter.vala
index 83e1d3f..8965cba 100644
--- a/src/media-player-list-greeter.vala
+++ b/src/media-player-list-greeter.vala
@@ -1,6 +1,6 @@
/*
* Copyright 2014 Canonical Ltd.
- * Copyright 2021 Robert Tari
+ * Copyright 2021-2023 Robert Tari
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,10 +19,10 @@
* Robert Tari <robert@tari.in>
*/
-[DBus (name="org.ayatana.Greeter.List")]
+[DBus (name="org.ayatana.greeter")]
public interface AyatanaGreeterList : Object {
- public abstract async string get_active_entry () throws GLib.DBusError, GLib.IOError;
- public signal void entry_selected (string entry_name);
+ public abstract async string GetUser () throws GLib.DBusError, GLib.IOError;
+ public signal void UserChanged (string user);
}
public class MediaPlayerListGreeter : MediaPlayerList {
@@ -33,8 +33,8 @@ public class MediaPlayerListGreeter : MediaPlayerList {
public MediaPlayerListGreeter () {
Bus.get_proxy.begin<AyatanaGreeterList> (
BusType.SESSION,
- "org.ayatana.Greeter",
- "/list",
+ "org.ayatana.greeter",
+ "/org/ayatana/greeter",
DBusProxyFlags.NONE,
null,
new_proxy);
@@ -44,14 +44,14 @@ public class MediaPlayerListGreeter : MediaPlayerList {
try {
this.proxy = Bus.get_proxy.end(res);
- this.proxy.entry_selected.connect(active_user_changed);
- this.proxy.get_active_entry.begin ((obj, res) => {
+ this.proxy.UserChanged.connect(active_user_changed);
+ this.proxy.GetUser.begin ((obj, res) => {
try {
var list = (obj as AyatanaGreeterList);
if (list != null)
{
- var value = list.get_active_entry.end(res);
+ var value = list.GetUser.end(res);
active_user_changed(value);
}
} catch (Error e) {
diff --git a/src/volume-control-pulse.vala b/src/volume-control-pulse.vala
index 706b0fe..460b098 100644
--- a/src/volume-control-pulse.vala
+++ b/src/volume-control-pulse.vala
@@ -1,6 +1,6 @@
/*
* Copyright 2013 Canonical Ltd.
- * Copyright 2021 Robert Tari
+ * Copyright 2021-2023 Robert Tari
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -78,6 +78,16 @@ public class VolumeControlPulse : VolumeControl
start_account_service_volume_timer();
}
});
+
+ this._accounts_service_access.notify["mute"].connect(() => {
+
+ if (_mute != this._accounts_service_access.mute)
+ {
+ set_mute_internal (this._accounts_service_access.mute);
+ start_account_service_volume_timer();
+ }
+ });
+
this.reconnect_to_pulse ();
}