Electron support for Linux (#1074)

* init

* SQLite changes

* Move html folder, edit build scripts

* AppApi interface

* Build flags

* AppApi inheritance

* Finishing touches

* Merge upstream changes

* Test CI

* Fix class inits

* Rename AppApi

* Merge upstream changes

* Fix SQLiteLegacy on Linux, Add Linux interop, build tools

* Linux specific localisation strings

* Make it run

* Bring back most of Linux functionality

* Clean up

* Fix TTS voices

* Fix UI var

* Changes

* Electron minimise to tray

* Remove separate toggle for WlxOverlay

* Fixes

* Touchups

* Move csproj

* Window zoom, Desktop Notifications, VR check on Linux

* Fix desktop notifications, VR check spam

* Fix building on Linux

* Clean up

* Fix WebApi headers

* Rewrite VRCX updater

* Clean up

* Linux updater

* Add Linux to build action

* init

* SQLite changes

* Move html folder, edit build scripts

* AppApi interface

* Build flags

* AppApi inheritance

* Finishing touches

* Merge upstream changes

* Test CI

* Fix class inits

* Rename AppApi

* Merge upstream changes

* Fix SQLiteLegacy on Linux, Add Linux interop, build tools

* Linux specific localisation strings

* Make it run

* Bring back most of Linux functionality

* Clean up

* Fix TTS voices

* Changes

* Electron minimise to tray

* Remove separate toggle for WlxOverlay

* Fixes

* Touchups

* Move csproj

* Window zoom, Desktop Notifications, VR check on Linux

* Fix desktop notifications, VR check spam

* Fix building on Linux

* Clean up

* Fix WebApi headers

* Rewrite VRCX updater

* Clean up

* Linux updater

* Add Linux to build action

* Test updater

* Rebase and handle merge conflicts

* Fix Linux updater

* Fix Linux app restart

* Fix friend order

* Handle AppImageInstaller, show an install message on Linux

* Updates to the AppImage installer

* Fix Linux updater, fix set version, check for .NET, copy wine prefix

* Handle random errors

* Rotate tall prints

* try fix Linux restart bug

* Final

---------

Co-authored-by: rs189 <35667100+rs189@users.noreply.github.com>
This commit is contained in:
Natsumi
2025-01-11 13:09:44 +13:00
committed by GitHub
parent a39eb9d5ed
commit 938fff63d0
223 changed files with 15841 additions and 9562 deletions

View File

@@ -1,15 +1,16 @@
using CefSharp;
using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.IO;
using System.Text.Json.Nodes;
using System.Threading;
using System.Text.Json;
namespace VRCX
{
public class SQLiteLegacy
{
public static readonly SQLiteLegacy Instance;
public static SQLiteLegacy Instance;
private readonly ReaderWriterLockSlim m_ConnectionLock;
private SQLiteConnection m_Connection;
@@ -23,8 +24,11 @@ namespace VRCX
m_ConnectionLock = new ReaderWriterLockSlim();
}
internal void Init()
public void Init()
{
#if LINUX
Instance = this;
#endif
var dataSource = Program.ConfigLocation;
var jsonDataSource = VRCXStorage.Instance.Get("VRCX_DatabaseLocation");
if (!string.IsNullOrEmpty(jsonDataSource))
@@ -35,89 +39,60 @@ namespace VRCX
m_Connection.Open();
}
internal void Exit()
public void Exit()
{
m_Connection.Close();
m_Connection.Dispose();
}
public void Execute(IJavascriptCallback callback, string sql, IDictionary<string, object> args = null)
public string ExecuteJson(string sql, IDictionary<string, object> args = null)
{
try
var result = Execute(sql, args);
if (result.Item1 != null)
{
m_ConnectionLock.EnterReadLock();
try
return JsonSerializer.Serialize(new
{
using (var command = new SQLiteCommand(sql, m_Connection))
{
if (args != null)
{
foreach (var arg in args)
{
command.Parameters.Add(new SQLiteParameter(arg.Key, arg.Value));
}
}
using (var reader = command.ExecuteReader())
{
while (reader.Read() == true)
{
var values = new object[reader.FieldCount];
reader.GetValues(values);
if (callback.CanExecute == true)
{
callback.ExecuteAsync(null, values);
}
}
}
}
if (callback.CanExecute == true)
{
callback.ExecuteAsync(null, null);
}
}
finally
{
m_ConnectionLock.ExitReadLock();
}
status = "error",
message = result.Item1
});
}
catch (Exception e)
return JsonSerializer.Serialize(new
{
if (callback.CanExecute == true)
{
callback.ExecuteAsync(e.Message, null);
}
}
callback.Dispose();
status = "success",
data = result.Item2
});
}
public void Execute(Action<object[]> callback, string sql, IDictionary<string, object> args = null)
public Tuple<string, object[]> Execute(string sql, IDictionary<string, object> args = null)
{
m_ConnectionLock.EnterReadLock();
try
{
using (var command = new SQLiteCommand(sql, m_Connection))
using var command = new SQLiteCommand(sql, m_Connection);
if (args != null)
{
if (args != null)
foreach (var arg in args)
{
foreach (var arg in args)
{
command.Parameters.Add(new SQLiteParameter(arg.Key, arg.Value));
}
}
using (var reader = command.ExecuteReader())
{
while (reader.Read() == true)
{
var values = new object[reader.FieldCount];
reader.GetValues(values);
callback(values);
}
command.Parameters.Add(new SQLiteParameter(arg.Key, arg.Value));
}
}
using var reader = command.ExecuteReader();
var result = new List<object[]>();
while (reader.Read())
{
var values = new object[reader.FieldCount];
for (var i = 0; i < reader.FieldCount; i++)
{
values[i] = reader.GetValue(i);
}
result.Add(values);
}
return new Tuple<string, object[]>(null, result.ToArray());
}
catch
catch (Exception ex)
{
return new Tuple<string, object[]>(ex.Message, null);
}
finally
{
@@ -128,21 +103,18 @@ namespace VRCX
public int ExecuteNonQuery(string sql, IDictionary<string, object> args = null)
{
int result = -1;
m_ConnectionLock.EnterWriteLock();
try
{
using (var command = new SQLiteCommand(sql, m_Connection))
using var command = new SQLiteCommand(sql, m_Connection);
if (args != null)
{
if (args != null)
foreach (var arg in args)
{
foreach (var arg in args)
{
command.Parameters.Add(new SQLiteParameter(arg.Key, arg.Value));
}
command.Parameters.Add(new SQLiteParameter(arg.Key, arg.Value));
}
result = command.ExecuteNonQuery();
}
result = command.ExecuteNonQuery();
}
finally
{