Browse Source

DBus init and usage fixes

pull/16111/head
Nikita Tsukanov 2 years ago
committed by Jumar Macato
parent
commit
833da084dc
  1. 30
      src/Avalonia.FreeDesktop/DBusHelper.cs
  2. 2
      src/Avalonia.FreeDesktop/DBusIme/X11DBusImeHelper.cs
  3. 2
      src/Avalonia.FreeDesktop/DBusMenuExporter.cs
  4. 6
      src/Avalonia.FreeDesktop/DBusPlatformSettings.cs
  5. 9
      src/Avalonia.FreeDesktop/DBusSystemDialog.cs
  6. 2
      src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs
  7. 3
      src/Avalonia.X11/X11Platform.cs

30
src/Avalonia.FreeDesktop/DBusHelper.cs

@ -7,37 +7,51 @@ namespace Avalonia.FreeDesktop
{
internal static class DBusHelper
{
public static Connection? Connection { get; private set; }
private static Connection? s_defaultConntection;
private static bool s_defaultConnectionFailed;
public static Connection? DefaultConnection
{
get
{
if (s_defaultConntection == null && !s_defaultConnectionFailed)
{
s_defaultConntection = TryCreateNewConnection();
if (s_defaultConntection == null)
s_defaultConnectionFailed = true;
}
public static Connection? TryInitialize(string? dbusAddress = null)
=> Connection ?? TryCreateNewConnection(dbusAddress);
return s_defaultConntection;
}
}
public static Connection? TryCreateNewConnection(string? dbusAddress = null)
{
var oldContext = SynchronizationContext.Current;
Connection? conn = null;
try
{
var conn = new Connection(new ClientConnectionOptions(dbusAddress ?? Address.Session!)
SynchronizationContext.SetSynchronizationContext(null);
conn = new Connection(new ClientConnectionOptions(dbusAddress ?? Address.Session!)
{
AutoConnect = false
AutoConnect = false,
});
// Connect synchronously
conn.ConnectAsync().GetAwaiter().GetResult();
Connection = conn;
return conn;
}
catch (Exception e)
{
Logger.TryGet(LogEventLevel.Error, "DBUS")
?.Log(null, "Unable to connect to DBus: " + e);
conn?.Dispose();
}
finally
{
SynchronizationContext.SetSynchronizationContext(oldContext);
}
return Connection;
return null;
}
}
}

2
src/Avalonia.FreeDesktop/DBusIme/X11DBusImeHelper.cs

@ -37,7 +37,7 @@ namespace Avalonia.FreeDesktop.DBusIme
var factory = DetectInputMethod();
if (factory is not null)
{
var conn = DBusHelper.TryInitialize();
var conn = DBusHelper.DefaultConnection;
if (conn is not null)
{
AvaloniaLocator.CurrentMutable.Bind<IX11InputMethodFactory>().ToConstant(factory(conn));

2
src/Avalonia.FreeDesktop/DBusMenuExporter.cs

@ -17,7 +17,7 @@ namespace Avalonia.FreeDesktop
internal class DBusMenuExporter
{
public static ITopLevelNativeMenuExporter? TryCreateTopLevelNativeMenu(IntPtr xid) =>
DBusHelper.Connection is null ? null : new DBusMenuExporterImpl(DBusHelper.Connection, xid);
DBusHelper.DefaultConnection is {} conn ? new DBusMenuExporterImpl(conn, xid) : null;
public static INativeMenuExporter TryCreateDetachedNativeMenu(string path, Connection currentConnection) =>
new DBusMenuExporterImpl(currentConnection, path);

6
src/Avalonia.FreeDesktop/DBusPlatformSettings.cs

@ -2,6 +2,7 @@
using System.Threading.Tasks;
using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Threading;
using Tmds.DBus.Protocol;
using Tmds.DBus.SourceGenerator;
@ -17,10 +18,11 @@ namespace Avalonia.FreeDesktop
public DBusPlatformSettings()
{
if (DBusHelper.Connection is null)
if (DBusHelper.DefaultConnection is not {} conn)
return;
using var restoreContext = AvaloniaSynchronizationContext.Ensure(DispatcherPriority.Input);
_settings = new OrgFreedesktopPortalSettings(DBusHelper.Connection, "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop");
_settings = new OrgFreedesktopPortalSettings(conn, "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop");
_ = _settings.WatchSettingChangedAsync(SettingsChangedHandler);
_ = TryGetInitialValuesAsync();
}

9
src/Avalonia.FreeDesktop/DBusSystemDialog.cs

@ -7,6 +7,7 @@ using System.Threading.Tasks;
using Avalonia.Platform;
using Avalonia.Platform.Storage;
using Avalonia.Platform.Storage.FileIO;
using Avalonia.Threading;
using Tmds.DBus.Protocol;
using Tmds.DBus.SourceGenerator;
@ -16,10 +17,12 @@ namespace Avalonia.FreeDesktop
{
internal static async Task<IStorageProvider?> TryCreateAsync(IPlatformHandle handle)
{
if (DBusHelper.Connection is null)
if (DBusHelper.DefaultConnection is not {} conn)
return null;
var dbusFileChooser = new OrgFreedesktopPortalFileChooser(DBusHelper.Connection, "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop");
using var restoreContext = AvaloniaSynchronizationContext.Ensure(DispatcherPriority.Input);
var dbusFileChooser = new OrgFreedesktopPortalFileChooser(conn, "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop");
uint version;
try
{
@ -30,7 +33,7 @@ namespace Avalonia.FreeDesktop
return null;
}
return new DBusSystemDialog(DBusHelper.Connection, handle, dbusFileChooser, version);
return new DBusSystemDialog(conn, handle, dbusFileChooser, version);
}
private readonly Connection _connection;

2
src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs

@ -6,6 +6,7 @@ using System.Threading.Tasks;
using Avalonia.Controls.Platform;
using Avalonia.Logging;
using Avalonia.Platform;
using Avalonia.Threading;
using Tmds.DBus.Protocol;
using Tmds.DBus.SourceGenerator;
@ -39,6 +40,7 @@ namespace Avalonia.FreeDesktop
public DBusTrayIconImpl()
{
using var restoreContext = AvaloniaSynchronizationContext.Ensure(DispatcherPriority.Input);
_connection = DBusHelper.TryCreateNewConnection();
if (_connection is null)

3
src/Avalonia.X11/X11Platform.cs

@ -68,9 +68,6 @@ namespace Avalonia.X11
Info = new X11Info(Display, DeferredDisplay, useXim);
Globals = new X11Globals(this);
Resources = new XResources(this);
//TODO: log
if (options.UseDBusMenu)
DBusHelper.TryInitialize();
IRenderTimer timer = options.ShouldRenderOnUIThread
? new UiThreadRenderTimer(60)

Loading…
Cancel
Save