首先解释下这个奇怪的需求哈:
1. 添加 Linux 原生游戏到 Wine Steam 里并记录游戏状态: 可以让 Steam 好友知道自己在玩什么, 而同时又可以避免用 Wine 跑相应游戏带来的性能损失. 如果直接用 Wine 自带的 start.exe 启动 Linux 游戏, 因为 start.exe 会在启动游戏后直接退出 (/wait 参数对 Linux 进程无效), 因此游戏时 Steam 状态会显示为不在游戏中, 这样我们的目的就达不到了…
2. 让 Wine Steam 里的不同游戏用不同的语言(环境变量)运行: Wine 对 CJK 字符编码的修正是和语言(Locale)环境变量有关的, 比如 Touhou 用 ja_JP 环境跑表现一切正常, 而在 zh_CN 或者 en_US 下标题栏均是不同程度的乱码 (其它程序有更严重的问题, 包括全部字符变成问号等). 但是用 Steam 运行游戏时, 所有子进程都直接继承了运行 Steam 时的环境变量, 没有办法修改.
至于为啥不在 Linux 原生版的 Steam 里用? 嗯, 因为想要反向实现需求, 也就是让 Linux 原生版的 Steam 能跑 Wine 的 Steam only 游戏, 这件事情的难度好像不是一般的大… (DRM 什么的, 而且 Steam 是单点登录的)
看起来好像是无关的两个问题哈 <(=^_^=)> 不过呢, 本猫用了相关的方法来解决, 因此放在同一篇博客里介绍啦.
警告: 本方法各种丑陋, 要是产生不适千万不要怪我(
咳咳, 回到正题. 我的思路是使用一个文件锁:
1. Wine 启动一个 wrapper (也就是 Steam 命令行里填写相应的路径)
2. wrapper 首先创建一个临时文件, 然后把文件名传给一个 wine 外运行的脚本
3. 这个时候 wrapper 已经丢失了自己刚刚启动的脚本的运行状态, 但是可以继续通过检测文件是否存在来知道脚本是否已经退出
4. 脚本启动目标程序
5. 脚本等到程序退出再删除临时文件
6. wrapper 检测到临时文件消失后, 退出