Skip to content

Commit

Permalink
Steam: Try to detect Steam install path (#384)
Browse files Browse the repository at this point in the history
GameDetailsPage: reenabled functionality
  • Loading branch information
tkashkin committed Oct 25, 2020
1 parent 307fcbc commit 66a8b16
Show file tree
Hide file tree
Showing 13 changed files with 153 additions and 188 deletions.
2 changes: 1 addition & 1 deletion data/com.github.tkashkin.gamehub.gschema.xml.in
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@
<!-- Paths / Steam -->
<schema path="@SCHEMA_PATH@/paths/steam/" id="@[email protected]">
<key name="home" type="s">
<default>'~/.steam'</default>
<default>'~/.local/share/Steam'</default>
<summary>Steam installation directory</summary>
</key>
</schema>
Expand Down
4 changes: 2 additions & 2 deletions res/styles/common/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -143,11 +143,11 @@ list:not(:backdrop) row:selected:focus label.category-label
opacity: 0.6;
}

.gameinfo-background :not(.igdb-data-container-scrollable-value) > undershoot.left
.gameinfo-background :not(.data-container-scrollable-value) > undershoot.left
{
background: linear-gradient(to left, alpha(@theme_bg_color, 0) 50%, @theme_bg_color);
}
.gameinfo-background :not(.igdb-data-container-scrollable-value) > undershoot.right
.gameinfo-background :not(.data-container-scrollable-value) > undershoot.right
{
background: linear-gradient(to right, alpha(@theme_bg_color, 0) 50%, @theme_bg_color);
}
Expand Down
2 changes: 1 addition & 1 deletion src/data/compat/tools/proton/Proton.vala
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ namespace GameHub.Data.Compat.Tools.Proton
task.env_var("WINEPREFIX", prefix.get_child("pfx").get_path());
}

task.env_var("STEAM_COMPAT_CLIENT_INSTALL_PATH", FS.expand(GameHub.Settings.Paths.Steam.instance.home));
task.env_var("STEAM_COMPAT_CLIENT_INSTALL_PATH", Steam.instance.steam_client_install_dir.get_path());
task.env_var("PROTON_LOG", "1");
}

Expand Down
67 changes: 47 additions & 20 deletions src/data/sources/steam/Steam.vala
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ namespace GameHub.Data.Sources.Steam
public Steam()
{
instance = this;
GameHub.Settings.Paths.Steam.instance.notify["home"].connect(update_install_dir);
update_install_dir();
}

public string api_key;
Expand Down Expand Up @@ -62,6 +64,7 @@ namespace GameHub.Data.Sources.Steam
public string? user_name { get; protected set; }

private bool? installed = null;
public File? steam_client_install_dir;

public BinaryVDF.ListNode? appinfo;
public BinaryVDF.ListNode? packageinfo;
Expand All @@ -70,18 +73,42 @@ namespace GameHub.Data.Sources.Steam
{
get
{
var loginusers = FS.find_case_insensitive(FS.file(GameHub.Settings.Paths.Steam.instance.home), FS.Paths.Steam.LoginUsersVDF);
var loginusers = FS.find_case_insensitive(steam_client_install_dir, FS.Paths.Steam.LoginUsersVDF);
return loginusers != null && loginusers.query_exists();
}
}

private void update_install_dir()
{
var install_dir_path = GameHub.Settings.Paths.Steam.instance.home;
if(install_dir_path.length == 0)
{
foreach(var path in FS.Paths.Steam.InstallDirs)
{
steam_client_install_dir = FS.file(path);
if(steam_client_install_dir != null && steam_client_install_dir.query_exists())
{
GameHub.Settings.Paths.Steam.instance.home = path;
break;
}
}
}
else
{
steam_client_install_dir = FS.file(install_dir_path);
}
_library_folders = null;
}

public override bool is_installed(bool refresh)
{
if(installed != null && !refresh)
{
return (!) installed;
}

update_install_dir();

#if OS_LINUX
var distro = OS.get_distro().down();
if("ubuntu" in distro || "elementary" in distro || "pop!_os" in distro)
Expand All @@ -90,11 +117,11 @@ namespace GameHub.Data.Sources.Steam
|| OS.is_package_installed("steam64")
|| OS.is_package_installed("steam-launcher")
|| OS.is_package_installed("steam-installer")
|| FS.file(GameHub.Settings.Paths.Steam.instance.home).query_exists();
|| (steam_client_install_dir != null && steam_client_install_dir.query_exists());
}
else
{
installed = FS.file(GameHub.Settings.Paths.Steam.instance.home).query_exists();
installed = steam_client_install_dir != null && steam_client_install_dir.query_exists();
}
#endif

Expand All @@ -104,7 +131,7 @@ namespace GameHub.Data.Sources.Steam
public static bool find_app_install_dir(string app, out File? install_dir)
{
install_dir = null;
foreach(var dir in Steam.LibraryFolders)
foreach(var dir in Steam.library_folders)
{
var acf = FS.find_case_insensitive(FS.file(dir), @"appmanifest_$(app).acf");
if(acf != null && acf.query_exists())
Expand Down Expand Up @@ -150,7 +177,7 @@ namespace GameHub.Data.Sources.Steam
}

Utils.thread("Steam-loginusers", () => {
var loginusers = FS.find_case_insensitive(FS.file(GameHub.Settings.Paths.Steam.instance.home), FS.Paths.Steam.LoginUsersVDF);
var loginusers = FS.find_case_insensitive(steam_client_install_dir, FS.Paths.Steam.LoginUsersVDF);

if(loginusers == null || !loginusers.query_exists())
{
Expand Down Expand Up @@ -211,11 +238,11 @@ namespace GameHub.Data.Sources.Steam
{
if(appinfo == null)
{
appinfo = new AppInfoVDF(FS.find_case_insensitive(FS.file(GameHub.Settings.Paths.Steam.instance.home), FS.Paths.Steam.AppInfoVDF)).read();
appinfo = new AppInfoVDF(FS.find_case_insensitive(steam_client_install_dir, FS.Paths.Steam.AppInfoVDF)).read();
}
if(packageinfo == null)
{
packageinfo = new PackageInfoVDF(FS.find_case_insensitive(FS.file(GameHub.Settings.Paths.Steam.instance.home), FS.Paths.Steam.PackageInfoVDF)).read();
packageinfo = new PackageInfoVDF(FS.find_case_insensitive(steam_client_install_dir, FS.Paths.Steam.PackageInfoVDF)).read();
}
}

Expand Down Expand Up @@ -393,7 +420,7 @@ namespace GameHub.Data.Sources.Steam

private void watch_client_registry()
{
var regfile = FS.find_case_insensitive(FS.file(GameHub.Settings.Paths.Steam.instance.home), FS.Paths.Steam.RegistryVDF);
var regfile = steam_client_install_dir.get_child(FS.Paths.Steam.RegistryVDF);
if(regfile == null || !regfile.query_exists()) return;

Timeout.add_seconds(5, () => {
Expand Down Expand Up @@ -435,23 +462,23 @@ namespace GameHub.Data.Sources.Steam
}
}

public static ArrayList<string>? folders = null;
public static ArrayList<string> LibraryFolders
private static ArrayList<string>? _library_folders = null;
public static ArrayList<string> library_folders
{
get
{
if(folders != null) return folders;
folders = new ArrayList<string>();
if(_library_folders != null || instance == null || instance.steam_client_install_dir == null) return _library_folders;
_library_folders = new ArrayList<string>();

var steamapps = FS.find_case_insensitive(FS.file(GameHub.Settings.Paths.Steam.instance.home), FS.Paths.Steam.SteamApps);
var steamapps = FS.find_case_insensitive(instance.steam_client_install_dir, FS.Paths.Steam.SteamApps);

if(steamapps == null || !steamapps.query_exists()) return folders;
if(steamapps == null || !steamapps.query_exists()) return _library_folders;

folders.add(steamapps.get_path());
_library_folders.add(steamapps.get_path());

var libraryfolders = FS.find_case_insensitive(steamapps, FS.Paths.Steam.LibraryFoldersVDF);

if(libraryfolders == null || !libraryfolders.query_exists()) return folders;
if(libraryfolders == null || !libraryfolders.query_exists()) return _library_folders;

var root = Parser.parse_vdf_file(libraryfolders.get_path());
var lf = Parser.json_object(root, {"LibraryFolders"});
Expand All @@ -464,12 +491,12 @@ namespace GameHub.Data.Sources.Steam
if(libdir != null && libdir.query_exists())
{
var dir = FS.find_case_insensitive(libdir, "steamapps");
if(dir != null && dir.query_exists()) folders.add(dir.get_path());
if(dir != null && dir.query_exists()) _library_folders.add(dir.get_path());
}
}
}

return folders;
return _library_folders;
}
}

Expand All @@ -480,10 +507,10 @@ namespace GameHub.Data.Sources.Steam

public static File? get_userdata_dir()
{
if(instance == null || instance.user_id == null) return null;
if(instance == null || instance.user_id == null || instance.steam_client_install_dir == null) return null;
uint64 communityid = uint64.parse(instance.user_id);
uint64 steamid3 = communityid_to_steamid3(communityid);
return FS.find_case_insensitive(FS.file(GameHub.Settings.Paths.Steam.instance.home), @"steam/userdata/$(steamid3)");
return FS.find_case_insensitive(instance.steam_client_install_dir, @"userdata/$(steamid3)");
}

public static void add_game_shortcut(Game game)
Expand Down
48 changes: 1 addition & 47 deletions src/ui/dialogs/SettingsDialog/pages/sources/Steam.vala
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ namespace GameHub.UI.Dialogs.SettingsDialog.Pages.Sources
new DirectoriesMenuSetting.paths(
_("Steam library directories"),
_("Steam library directories that are configured in the Steam client"),
GameHub.Data.Sources.Steam.Steam.LibraryFolders
GameHub.Data.Sources.Steam.Steam.library_folders
)
);
add_widget(sgrp_dirs);
Expand All @@ -84,52 +84,6 @@ namespace GameHub.UI.Dialogs.SettingsDialog.Pages.Sources
sgrp_api_key.add_setting(new EntrySetting(_("API key"), null, get_steam_apikey_entry()));
sgrp_api_key.add_setting(new LinkLabelSetting(_("Provide your API key to access private Steam profile or if default key does not work"), _("Generate key"), "steam://openurl/https://steamcommunity.com/dev/apikey"));
add_widget(sgrp_api_key);

/*sgrp_proton = new SettingsGroup("Proton");
add_widget(sgrp_proton);*/

notify["active"].connect(() => {
update();
//request_restart();
});

update();
}

private void update()
{
/*sgrp_proton.settings.foreach(r => {
if(r != null) r.destroy();
});
foreach(var tool in CompatTools)
{
if(tool is Proton)
{
var proton = tool as Proton;
if(proton != null && !proton.is_latest)
{
Button? install = null;
var description = _("Not installed");
if(proton.installed && proton.executable != null)
{
description = proton.executable.get_path();
}
else
{
install = new Button.with_label(_("Install"));
install.clicked.connect(() => {
install.sensitive = false;
request_restart();
proton.install_app();
});
}
sgrp_proton.add_setting(new BaseSetting("""%s<span alpha="75%"> • %s</span>""".printf(proton.name, proton.appid), description, install)).icon_name = proton.icon;
}
}
}
sgrp_proton.show_all();*/
}

private Entry get_steam_apikey_entry()
Expand Down
30 changes: 30 additions & 0 deletions src/ui/views/GameDetailsView/GameDetailsBlock.vala
Original file line number Diff line number Diff line change
Expand Up @@ -60,5 +60,35 @@ namespace GameHub.UI.Views.GameDetailsView

return box;
}

protected Box? add_scrollable_label(string title, string? text, bool markup=false, Container? parent=null)
{
var title_label = Styled.H4Label(title);
title_label.margin_start = title_label.margin_end = 7;
title_label.get_style_context().add_class("data-container-scrollable-header");
title_label.set_size_request(128, -1);
title_label.valign = Align.CENTER;

var text_scroll = new ScrolledWindow(null, null);
text_scroll.get_style_context().add_class("data-container-scrollable-value");
text_scroll.vscrollbar_policy = PolicyType.NEVER;
text_scroll.hexpand = true;

var text_label = new Label(text);
text_label.margin_start = text_label.margin_end = 7;
text_label.get_style_context().add_class("gameinfo-multiline-value");
text_label.hexpand = false;
text_label.xalign = 0;
text_label.use_markup = markup;

text_scroll.add(text_label);

var box = new Box(Orientation.VERTICAL, 0);
box.add(title_label);
box.add(text_scroll);
(parent ?? this).add(box);

return box;
}
}
}
Loading

0 comments on commit 66a8b16

Please sign in to comment.