Steam Library Shortcuts: Difference between revisions
Jump to navigation
Jump to search
(shortcuts.vdf location.) |
(Added C# methods to read and write shortcuts.vdf. TODO: this could be later converted to pseudocode, in case anyone wants to make a script of this.) |
||
Line 3: | Line 3: | ||
= Steam shortcuts file = | = Steam shortcuts file = | ||
Any game/mod could by added to the Steam Library by creating a shortcut. The shortcuts file for a given user are located under the directory '''steam_install_dir\\userdata\\''', and the path ends with '''config'''. The shortcuts are stored inside this directory, in a file named '''shortcuts.vdf'''. | Any game/mod could by added to the Steam Library by creating a shortcut. The shortcuts file for a given user are located under the directory '''steam_install_dir\\userdata\\''', and the path ends with '''config'''. The shortcuts are stored inside this directory, in a file named '''shortcuts.vdf'''. | ||
= Shortcut format = | |||
* string AppName | |||
* string Exe | |||
* string StartDir | |||
* string Icon | |||
* string ShortcutPath | |||
* string LaunchOptions | |||
* bool Hidden | |||
* array<string> Tags | |||
= Reading the shortcuts.vdf = | |||
<code> | |||
List<Shortcut> result = new List<Shortcut>(); | |||
int start = shortcutsString.IndexOf("\u0000shortcuts\u0000") + "\u0000shortcuts\u0000".Length; | |||
int end = shortcutsString.LastIndexOf("\u0008\u0008"); | |||
shortcutsString = shortcutsString.Substring(start, end - start); | |||
Shortcut shortcut = null; | |||
string word = ""; | |||
string key = ""; | |||
bool readingTags = false; | |||
int tagId = -1; | |||
foreach (char c in shortcutsString.ToCharArray()) | |||
{ | |||
if (c == '\u0000') | |||
{ | |||
if (word.EndsWith("\u0001appname")) | |||
{ | |||
if (shortcut != null) | |||
result.Add(shortcut); | |||
// New shortcut | |||
shortcut = new Shortcut(); | |||
key = "\u0001appname"; | |||
} | |||
else if ( | |||
word == "\u0001exe" || | |||
word == "\u0001StartDir" || | |||
word == "\u0001icon" || | |||
word == "\u0001ShortcutPath" || | |||
word == "\u0001LaunchOptions" || | |||
word == "\u0002hidden" | |||
) | |||
{ | |||
key = word; | |||
} | |||
else if (word == "tags") | |||
{ | |||
readingTags = true; | |||
} | |||
else if (key != "") | |||
{ | |||
switch (key) | |||
{ | |||
case "\u0001appname": | |||
shortcut.AppName = word; | |||
break; | |||
case "\u0001exe": | |||
shortcut.Exe = word.Trim('"'); | |||
break; | |||
case "\u0001StartDir": | |||
shortcut.StartDir = word.Trim('"'); | |||
break; | |||
case "\u0001icon": | |||
shortcut.Icon = word; | |||
break; | |||
case "\u0001ShortcutPath": | |||
shortcut.ShortcutPath = word; | |||
break; | |||
case "\u0001LaunchOptions": | |||
shortcut.LaunchOptions = word; | |||
break; | |||
case "\u0002hidden": | |||
shortcut.Hidden = (word == "\u0001"); | |||
break; | |||
default: | |||
break; | |||
} | |||
key = ""; | |||
} | |||
else if (readingTags) | |||
{ | |||
if (word.StartsWith("\u0001")) | |||
{ | |||
tagId = int.Parse(word.Substring("\u0001".Length)); | |||
} | |||
else if (tagId >= 0) | |||
{ | |||
shortcut.Tags.Add(word); | |||
tagId = -1; | |||
} | |||
else | |||
{ | |||
readingTags = false; | |||
} | |||
} | |||
word = ""; | |||
} | |||
else | |||
{ | |||
word += c; | |||
} | |||
} | |||
if (shortcut != null) | |||
result.Add(shortcut); | |||
return result; | |||
</code> | |||
= Writing the shortcuts.vdf = | |||
<code> | |||
private static string BuildShortcuts(List<Shortcut> shortcuts) | |||
{ | |||
string shortcutsString = "\u0000shortcuts\u0000"; | |||
for (int i = 0; i < shortcuts.Count; i++) | |||
{ | |||
shortcutsString += "\u0000" + i + "\u0000"; | |||
shortcutsString += BuildShortcut(shortcuts[i]); | |||
shortcutsString += "\u0008"; | |||
} | |||
shortcutsString += "\u0008\u0008"; | |||
return shortcutsString; | |||
} | |||
private static string BuildShortcut(Shortcut shortcut) | |||
{ | |||
string shortcutString = ""; | |||
//shortcutString += "\u0002appid\u0000" + shortcut.GetAppID() + "\u0000"; | |||
shortcutString += "\u0001appname\u0000" + shortcut.AppName + "\u0000"; | |||
shortcutString += "\u0001exe\u0000\"" + shortcut.Exe + "\"\u0000"; | |||
shortcutString += "\u0001StartDir\u0000\"" + shortcut.StartDir + "\"\u0000"; | |||
shortcutString += "\u0001icon\u0000" + shortcut.Icon + "\u0000"; | |||
shortcutString += "\u0001ShortcutPath\u0000" + shortcut.ShortcutPath + "\u0000"; | |||
shortcutString += "\u0001LaunchOptions\u0000" + shortcut.LaunchOptions + "\u0000"; | |||
shortcutString += "\u0002hidden\u0000" + (shortcut.Hidden ? "\u0001" : "\u0000") + "\u0000\u0000\u0000"; | |||
shortcutString += buildTags(shortcut.Tags); | |||
return shortcutString; | |||
} | |||
private static string buildTags(List<string> tags) | |||
{ | |||
var tagString = "\u0000tags\u0000"; | |||
for (var i = 0; i < tags.Count; ++i) | |||
{ | |||
tagString += "\u0001" + i + "\u0000" + tags[i] + "\u0000"; | |||
} | |||
tagString += "\u0008"; | |||
return tagString; | |||
} | |||
</code> |
Revision as of 17:39, 5 August 2023
Source mods under /sourcemods/, when configured correctly, show up on Steam Library after a restart. Source Mods placed in |all_source_engine_paths|, GoldSrc mods or even Source 2 mods don't show up by default.
Steam shortcuts file
Any game/mod could by added to the Steam Library by creating a shortcut. The shortcuts file for a given user are located under the directory steam_install_dir\\userdata\\, and the path ends with config. The shortcuts are stored inside this directory, in a file named shortcuts.vdf.
Shortcut format
- string AppName
- string Exe
- string StartDir
- string Icon
- string ShortcutPath
- string LaunchOptions
- bool Hidden
- array<string> Tags
Reading the shortcuts.vdf
List<Shortcut> result = new List<Shortcut>();
int start = shortcutsString.IndexOf("\u0000shortcuts\u0000") + "\u0000shortcuts\u0000".Length;
int end = shortcutsString.LastIndexOf("\u0008\u0008");
shortcutsString = shortcutsString.Substring(start, end - start);
Shortcut shortcut = null;
string word = "";
string key = "";
bool readingTags = false;
int tagId = -1;
foreach (char c in shortcutsString.ToCharArray())
{
if (c == '\u0000')
{
if (word.EndsWith("\u0001appname"))
{
if (shortcut != null)
result.Add(shortcut);
// New shortcut
shortcut = new Shortcut();
key = "\u0001appname";
}
else if (
word == "\u0001exe" ||
word == "\u0001StartDir" ||
word == "\u0001icon" ||
word == "\u0001ShortcutPath" ||
word == "\u0001LaunchOptions" ||
word == "\u0002hidden"
)
{
key = word;
}
else if (word == "tags")
{
readingTags = true;
}
else if (key != "")
{
switch (key)
{
case "\u0001appname":
shortcut.AppName = word;
break;
case "\u0001exe":
shortcut.Exe = word.Trim('"');
break;
case "\u0001StartDir":
shortcut.StartDir = word.Trim('"');
break;
case "\u0001icon":
shortcut.Icon = word;
break;
case "\u0001ShortcutPath":
shortcut.ShortcutPath = word;
break;
case "\u0001LaunchOptions":
shortcut.LaunchOptions = word;
break;
case "\u0002hidden":
shortcut.Hidden = (word == "\u0001");
break;
default:
break;
}
key = "";
}
else if (readingTags)
{
if (word.StartsWith("\u0001"))
{
tagId = int.Parse(word.Substring("\u0001".Length));
}
else if (tagId >= 0)
{
shortcut.Tags.Add(word);
tagId = -1;
}
else
{
readingTags = false;
}
}
word = "";
}
else
{
word += c;
}
}
if (shortcut != null)
result.Add(shortcut);
return result;
Writing the shortcuts.vdf
private static string BuildShortcuts(List<Shortcut> shortcuts)
{
string shortcutsString = "\u0000shortcuts\u0000";
for (int i = 0; i < shortcuts.Count; i++)
{
shortcutsString += "\u0000" + i + "\u0000";
shortcutsString += BuildShortcut(shortcuts[i]);
shortcutsString += "\u0008";
}
shortcutsString += "\u0008\u0008";
return shortcutsString;
}
private static string BuildShortcut(Shortcut shortcut)
{
string shortcutString = "";
//shortcutString += "\u0002appid\u0000" + shortcut.GetAppID() + "\u0000";
shortcutString += "\u0001appname\u0000" + shortcut.AppName + "\u0000";
shortcutString += "\u0001exe\u0000\"" + shortcut.Exe + "\"\u0000";
shortcutString += "\u0001StartDir\u0000\"" + shortcut.StartDir + "\"\u0000";
shortcutString += "\u0001icon\u0000" + shortcut.Icon + "\u0000";
shortcutString += "\u0001ShortcutPath\u0000" + shortcut.ShortcutPath + "\u0000";
shortcutString += "\u0001LaunchOptions\u0000" + shortcut.LaunchOptions + "\u0000";
shortcutString += "\u0002hidden\u0000" + (shortcut.Hidden ? "\u0001" : "\u0000") + "\u0000\u0000\u0000";
shortcutString += buildTags(shortcut.Tags);
return shortcutString;
}
private static string buildTags(List<string> tags)
{
var tagString = "\u0000tags\u0000";
for (var i = 0; i < tags.Count; ++i)
{
tagString += "\u0001" + i + "\u0000" + tags[i] + "\u0000";
}
tagString += "\u0008";
return tagString;
}