mirror of
https://github.com/clearlinux/linux-steam-integration.git
synced 2026-09-06 22:01:27 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6137c52bab | ||
|
|
524810bbd2 | ||
|
|
d7006fdb74 | ||
|
|
211ac7613c | ||
|
|
5352b5deab | ||
|
|
54bd49281c | ||
|
|
8b09218039 | ||
|
|
89e7b7cfbb | ||
|
|
ffe7825f62 | ||
|
|
0f24683688 | ||
|
|
abcb5feeaf | ||
|
|
6963c34892 | ||
|
|
8d9aac19f6 | ||
|
|
c4ded16115 | ||
|
|
6bc12dde6e | ||
|
|
8968b69788 | ||
|
|
6a5fff703c | ||
|
|
11e9ff2137 | ||
|
|
05343c140f | ||
|
|
c03d5cdff8 | ||
|
|
4c68fcc7d7 | ||
|
|
09c84f0866 | ||
|
|
fc9ae2e9c2 | ||
|
|
9624bde1b9 | ||
|
|
a951a49910 | ||
|
|
fc88ee1496 | ||
|
|
ae48c61932 | ||
|
|
fb56eca35d | ||
|
|
1c3a39ebfa | ||
|
|
62cf7443ac | ||
|
|
46c423d065 | ||
|
|
c34938a43a | ||
|
|
62bd3dffb7 | ||
|
|
5c809fdc07 | ||
|
|
e7eae9d577 | ||
|
|
a1c2235120 | ||
|
|
5b59075ec0 | ||
|
|
c640f2f215 | ||
|
|
b80f79c8d0 | ||
|
|
851f354f9f | ||
|
|
10d3be6a38 | ||
|
|
c8a45b7303 | ||
|
|
1b932e94fa | ||
|
|
003c462a77 | ||
|
|
7880b98f87 | ||
|
|
a91a00f1f5 | ||
|
|
5998318a20 | ||
|
|
1a725088af | ||
|
|
f185b54c4d | ||
|
|
368e6ca7c7 | ||
|
|
f12643039a | ||
|
|
7cfdd41c7c | ||
|
|
889a4a7b7b | ||
|
|
4f810bfe97 | ||
|
|
97e5813e4c | ||
|
|
0faa29aecd | ||
|
|
383b6492b5 | ||
|
|
f8b583bc0b | ||
|
|
9975bd5780 | ||
|
|
00ee48ee22 | ||
|
|
16a0750ed2 | ||
|
|
947654d9d3 | ||
|
|
c59949cf0e | ||
|
|
657a911004 | ||
|
|
1d339cab05 | ||
|
|
a518fc6720 | ||
|
|
03758879ab | ||
|
|
7131fd9771 | ||
|
|
5013e0d747 | ||
|
|
05bd0e0dac | ||
|
|
aa1b7374db | ||
|
|
82130bfbe8 | ||
|
|
d73b7e7381 | ||
|
|
9f57d0ebf0 | ||
|
|
f8d12b9800 | ||
|
|
b3a562f4f9 | ||
|
|
94e5d09eba | ||
|
|
04e32cd5c5 | ||
|
|
cd5a1e6f97 | ||
|
|
287781356c | ||
|
|
80603598af | ||
|
|
e81f379882 | ||
|
|
8d7b56f68c | ||
|
|
87fab0c747 | ||
|
|
208585eebc | ||
|
|
01237d30c6 | ||
|
|
4b6ec38bbf | ||
|
|
70fb1de048 | ||
|
|
393d335af4 | ||
|
|
02ccceae42 | ||
|
|
2462f93f39 | ||
|
|
b34e3f928d | ||
|
|
9da279eeda | ||
|
|
8effde3adf | ||
|
|
c7882a9ac7 | ||
|
|
3e15d71936 | ||
|
|
8d50a4f289 | ||
|
|
589dda31a5 | ||
|
|
c2ba77b5ab | ||
|
|
aa485def04 | ||
|
|
6d2791b475 | ||
|
|
492d7d02f9 | ||
|
|
8efc9a6b76 | ||
|
|
00d0889280 | ||
|
|
608907b6d0 | ||
|
|
68e3df8d1a | ||
|
|
a358864785 | ||
|
|
60664c4c6b | ||
|
|
e27d80156f | ||
|
|
6dbc333ea0 | ||
|
|
0e10afd27d | ||
|
|
8d93b6b0ca | ||
|
|
103ab0a673 | ||
|
|
5ed71d781e | ||
|
|
3eeb731224 | ||
|
|
ce3cab3270 | ||
|
|
53fec0a8b6 | ||
|
|
41c117918c | ||
|
|
88792a27ea | ||
|
|
24c26aeab7 | ||
|
|
ed0153c825 | ||
|
|
7d5ff6a5d4 | ||
|
|
b1852cb803 | ||
|
|
c524679428 | ||
|
|
2388f6f693 | ||
|
|
8cdb63fd7e | ||
|
|
8591b35a8e | ||
|
|
950897ab0d | ||
|
|
45b5652109 | ||
|
|
329f8de9aa | ||
|
|
b001cbf750 | ||
|
|
ec78c17316 | ||
|
|
20db0cad18 | ||
|
|
446152e8ad | ||
|
|
65805e2d0a | ||
|
|
32326af2b3 | ||
|
|
8c304bcd16 | ||
|
|
893100c174 | ||
|
|
709f5cd1c2 | ||
|
|
8f531f3be8 | ||
|
|
e1e4c11b8d | ||
|
|
347b41f990 | ||
|
|
e7b2d6f70e | ||
|
|
5732bc2fca | ||
|
|
514a7fabb1 | ||
|
|
44a195274b | ||
|
|
212d938e25 | ||
|
|
db4c33fce1 | ||
|
|
3355bb7cff | ||
|
|
3b40061748 | ||
|
|
1edead3929 | ||
|
|
da439aa484 | ||
|
|
991e12d6cd | ||
|
|
87bf493350 | ||
|
|
22c9805c16 | ||
|
|
84a4dd59a9 | ||
|
|
8684a992b0 | ||
|
|
4303b14f45 | ||
|
|
7456c9c26a | ||
|
|
0a84ba7fc4 | ||
|
|
981fe43071 | ||
|
|
63aba59c27 | ||
|
|
3485ab87eb | ||
|
|
e2325befba | ||
|
|
a89de2bb58 | ||
|
|
ede4e130f4 | ||
|
|
d4eb0ca042 | ||
|
|
bfb703be68 | ||
|
|
d0708a2332 | ||
|
|
a7c59cacef | ||
|
|
799c4b1e48 | ||
|
|
ada9b92f53 | ||
|
|
60c3ddc6e9 | ||
|
|
c3a071e2a0 | ||
|
|
4001ffc814 | ||
|
|
e3a4640c04 | ||
|
|
bddeda6ef3 | ||
|
|
71322156e3 | ||
|
|
c5bb4ca040 | ||
|
|
a2502c1ec7 | ||
|
|
2b2e73b572 | ||
|
|
a98ebc3607 | ||
|
|
78fcdf6247 | ||
|
|
516823ae3c | ||
|
|
f2352546d4 | ||
|
|
b87210a253 | ||
|
|
2d6ab6d497 | ||
|
|
ffdc14c109 | ||
|
|
e45340973a | ||
|
|
1f73dd3e0b | ||
|
|
fb50dca553 | ||
|
|
edf3176c70 | ||
|
|
e73d384726 | ||
|
|
30152b9604 | ||
|
|
a83b1c24b2 | ||
|
|
0f33bb1fbd | ||
|
|
88550aeffc | ||
|
|
fe83d34984 | ||
|
|
9b4187ed27 | ||
|
|
b40eba8ad9 | ||
|
|
1179763531 | ||
|
|
627c7639cf | ||
|
|
290260c09e | ||
|
|
a691985541 | ||
|
|
1811ff5225 | ||
|
|
a932486826 | ||
|
|
3c69b6dc05 | ||
|
|
c8f0cecb15 | ||
|
|
3b01919148 | ||
|
|
474aca0b69 | ||
|
|
fa81893d41 | ||
|
|
f958b8ac3f | ||
|
|
971d0c280e | ||
|
|
4f6166bdce | ||
|
|
be98e146ed | ||
|
|
5c131f6b28 | ||
|
|
8768730414 | ||
|
|
68fe3c1c11 | ||
|
|
dc85a14bfb | ||
|
|
c646ee516e | ||
|
|
bb29a04078 | ||
|
|
0eb0d09119 | ||
|
|
5810e63576 | ||
|
|
01faa3754d | ||
|
|
b4e512b708 | ||
|
|
95613a45f8 | ||
|
|
312b7a888a | ||
|
|
071304d8bd | ||
|
|
36e6cf5455 | ||
|
|
26dc2503d2 | ||
|
|
1d81c2094f | ||
|
|
fe063b1624 | ||
|
|
fa41b2c572 | ||
|
|
feae99a359 | ||
|
|
34fe25a533 | ||
|
|
6349652740 | ||
|
|
665caee634 | ||
|
|
be3023263f | ||
|
|
27e5cd0ae0 | ||
|
|
79fece840c | ||
|
|
478a0f1810 | ||
|
|
2cf5db42b3 | ||
|
|
191ea02946 | ||
|
|
03dd537574 | ||
|
|
8ded405801 | ||
|
|
35b3f132fd | ||
|
|
4b718a4bc7 | ||
|
|
5ceacb27fb | ||
|
|
d1b7a86867 | ||
|
|
0c252321e3 | ||
|
|
b9d677dee1 | ||
|
|
86fbf11040 | ||
|
|
ec67c801ad | ||
|
|
0a02c111a0 | ||
|
|
48a9bac406 | ||
|
|
8de8962099 | ||
|
|
de9380dc8d | ||
|
|
9bd423fb34 | ||
|
|
75d2e9cc45 | ||
|
|
7d0acc9891 | ||
|
|
7bae532d85 | ||
|
|
4f332c9acf | ||
|
|
f2dddd9f88 | ||
|
|
94d5c6d939 | ||
|
|
f4564e2ab8 | ||
|
|
8d85cb3bed | ||
|
|
fb2e84cb97 | ||
|
|
e1f2783d11 | ||
|
|
13afbe69c3 | ||
|
|
b458346f5a | ||
|
|
bf4fcfe533 | ||
|
|
b7ba890433 | ||
|
|
faa0c3a154 | ||
|
|
99e54dd74b | ||
|
|
5d18366a17 | ||
|
|
6154f2373c | ||
|
|
fe80861f66 | ||
|
|
38ec05ce98 | ||
|
|
d983f8ebdf | ||
|
|
4d3abc5e37 | ||
|
|
47e50b789f | ||
|
|
9905a2bc81 | ||
|
|
11e1d8ae5f | ||
|
|
00e78f705e | ||
|
|
54c685bb1a | ||
|
|
a61e22d677 | ||
|
|
93b0f82279 | ||
|
|
d870577a55 | ||
|
|
fd252e265d | ||
|
|
3684dfe11e | ||
|
|
d5b31dbf54 | ||
|
|
f6dcc30d33 | ||
|
|
7a2670f3e1 | ||
|
|
61d9296a6c | ||
|
|
f2bbe963b6 | ||
|
|
4547d8582a | ||
|
|
1db376fa38 | ||
|
|
0bf704fc79 | ||
|
|
cf023ffb6a | ||
|
|
4b36347ade | ||
|
|
d3469e3eb0 | ||
|
|
29081c492d | ||
|
|
ac76372b84 | ||
|
|
6b107f33b5 | ||
|
|
ba8ae8f384 | ||
|
|
d77ad58934 | ||
|
|
2aae934271 | ||
|
|
12d5268252 | ||
|
|
15253b97df | ||
|
|
8dd27f6f24 | ||
|
|
f21559ee78 | ||
|
|
5b17fe9447 | ||
|
|
9ca7ffdd85 | ||
|
|
3b552ec17d | ||
|
|
a3226a293c | ||
|
|
9c40a9d106 | ||
|
|
49d68c52a7 | ||
|
|
d20c230067 | ||
|
|
bd4707f3ca | ||
|
|
1a70578cb1 | ||
|
|
7995688ea2 |
Binary file not shown.
|
After Width: | Height: | Size: 104 KiB |
+2
-19
@@ -1,19 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
autom4te.cache/
|
||||
build-aux/
|
||||
config.*
|
||||
configure
|
||||
libtool
|
||||
stamp-h1
|
||||
m4/*.m4
|
||||
.deps
|
||||
.dirstamp
|
||||
*.o
|
||||
*.lo
|
||||
*.la
|
||||
.libs
|
||||
/steam
|
||||
/lsi-steam
|
||||
/lsi-settings
|
||||
/buildroot/
|
||||
/build/
|
||||
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
[submodule "src/libnica"]
|
||||
path = src/libnica
|
||||
url = git@github.com:ikeydoherty/libnica.git
|
||||
url = https://github.com/intel/libnica.git
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[linux-steam-integration.linux-steam-integrationpot]
|
||||
file_filter = po/<lang>.po
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
-99
@@ -1,99 +0,0 @@
|
||||
EXTRA_DIST = \
|
||||
LICENSE.LGPL2.1 \
|
||||
README.rst \
|
||||
data/lsi-settings.desktop \
|
||||
data/lsi-steam.desktop
|
||||
|
||||
AM_CFLAGS = \
|
||||
-fstack-protector -Wall -pedantic \
|
||||
-Wstrict-prototypes -Wundef -fno-common \
|
||||
-Werror-implicit-function-declaration \
|
||||
-Wformat -Wformat-security -Werror=format-security \
|
||||
-Wno-conversion -Wunused-variable -Wunreachable-code \
|
||||
-Wall -W -D_FORTIFY_SOURCE=2 -std=c99
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I $(top_srcdir)/src \
|
||||
-I $(top_srcdir)/src/shim \
|
||||
-I $(top_srcdir)/src/libnica/src/include \
|
||||
-DSYSTEMCONFDIR=\"$(sysconfdir)\" \
|
||||
-DVENDORDIR=\"$(datadir)/defaults/linux-steam-integration\"
|
||||
|
||||
SUBDIRS = src/libnica
|
||||
|
||||
noinst_LTLIBRARIES = \
|
||||
liblsi.la
|
||||
|
||||
bin_PROGRAMS =
|
||||
desktopdir = $(datadir)/applications
|
||||
desktop_DATA =
|
||||
|
||||
if HAVE_FRONTEND
|
||||
bin_PROGRAMS += lsi-settings
|
||||
|
||||
lsi_settings_SOURCES = \
|
||||
src/frontend/main.c
|
||||
|
||||
lsi_settings_CFLAGS = \
|
||||
$(GTK_CFLAGS) \
|
||||
$(AM_CFLAGS) \
|
||||
-DGDK_VERSION_MAX_ALLOWED=GDK_VERSION_3_4 \
|
||||
-DGDK_VERSION_MIN_REQUIRED=GDK_VERSION_3_4
|
||||
|
||||
lsi_settings_LDADD = \
|
||||
liblsi.la \
|
||||
$(GTK_LIBS)
|
||||
|
||||
desktopdir = $(datadir)/applications
|
||||
desktop_DATA += \
|
||||
data/lsi-settings.desktop
|
||||
|
||||
endif
|
||||
|
||||
# Convenience library for shared LSI functions
|
||||
liblsi_la_SOURCES = \
|
||||
src/shim/lsi.h \
|
||||
src/shim/lsi.c
|
||||
|
||||
liblsi_la_CFLAGS = \
|
||||
$(AM_CFLAGS) \
|
||||
-I$(top_srcdir)/src/libnica/src/include/nica
|
||||
|
||||
liblsi_la_LIBADD = \
|
||||
src/libnica/libnica.la
|
||||
|
||||
# Replace the main steam binary with our own steam file
|
||||
if REPLACE_STEAM
|
||||
|
||||
bin_PROGRAMS += steam
|
||||
|
||||
steam_SOURCES = \
|
||||
src/shim/shim.c
|
||||
|
||||
steam_LDADD = \
|
||||
src/libnica/libnica.la \
|
||||
liblsi.la
|
||||
|
||||
steam_CFLAGS = \
|
||||
$(AM_CFLAGS)
|
||||
|
||||
else
|
||||
# Don't replace steam - use a non conflicting filename
|
||||
|
||||
bin_PROGRAMS += lsi-steam
|
||||
|
||||
lsi_steam_SOURCES = \
|
||||
src/shim/shim.c
|
||||
|
||||
lsi_steam_LDADD = \
|
||||
src/libnica/libnica.la \
|
||||
liblsi.la
|
||||
|
||||
lsi_steam_CFLAGS = \
|
||||
$(AM_CFLAGS)
|
||||
|
||||
# Install custom .desktop file for steam
|
||||
desktop_DATA += \
|
||||
data/lsi-steam.desktop
|
||||
|
||||
endif
|
||||
@@ -0,0 +1,91 @@
|
||||
linux-steam-integration
|
||||
-----------------------
|
||||
|
||||
Linux Steam* Integration is a helper system to make the Steam Client and Steam
|
||||
games run better on Linux. In a nutshell, LSI automatically applies various workarounds
|
||||
to get games working, and fixes long standing bugs in both games and the client.
|
||||
|
||||

|
||||
|
||||
In many cases this will involve controlling which libraries are allowed to be used
|
||||
at any given time, and these libraries may be overriden for any of the following
|
||||
reasons:
|
||||
|
||||
- Security
|
||||
- Compatibility
|
||||
- Performance
|
||||
|
||||
This project, and by extension the platforms it runs on, are not officially endorsed by, or affiliated with, Steam, or its parent company, Valve*.
|
||||
This fork of linux-steam-integration is now being maintained separately from the original project, to suit the cadence and requirements of the
|
||||
Clear Linux* Project for Intel Architecture.
|
||||
|
||||
This project will retain backwards compatibility with the original project at the time of forking to alleviate maintainer concerns, whilst focusing
|
||||
on improvements to match a wider audience than the original project, and ensuring native runtimes continue to work unimpeded.
|
||||
|
||||
### Linking compatibility
|
||||
|
||||
With LSI, you don't need to worry any more about manually mangling your Steam installation
|
||||
just to make the open source drivers work, or manually creating links and installing
|
||||
unsupported libraries. LSI is designed to take care of all of this for you.
|
||||
|
||||
Many library names are redirected through the main "intercept" module, which ensures
|
||||
games will (where appropriate) use the updated system libraries. Additionally the
|
||||
module can override how games and the Steam client are allowed to make use of
|
||||
vendored libraries. This will help with many launch failures involving outdated
|
||||
libraries, or indeed the infamous `libstdc++.so.6` vendoring which breaks open
|
||||
source graphics drivers on systems compiled with the new GCC C++ ABI.
|
||||
|
||||
|
||||
### Apply path based hotfixes to games
|
||||
|
||||
The redirect module contains some profiles to allow us to dynamically fix some
|
||||
issues that would otherwise require new builds of the games to see those issues
|
||||
resolved.
|
||||
|
||||
- Project Highrise: Ensure we don't `mmap` a directory as a file (fixes invalid prefs path)
|
||||
- ARK Survival Evolved: Use the correct shader asset from TheCenter DLC to fix broken water surfaces.
|
||||
|
||||
### Unity3D Black Screen Of Nope
|
||||
|
||||
Older builds of Unity3D had (long since fixed) issues with launching to a black
|
||||
screen when defaulting to full screen mode. This is commonly addressed by launching the
|
||||
games with `-screen-fullscreen 0`, and is due to an invalid internal condition clamping
|
||||
the renderer size to 0x0 after setting the fullscreen (borderless) window size.
|
||||
|
||||
Note - updating these games to newer versions of Unity will fix this bug on Linux, however
|
||||
LSI currently ships a workaround. This workaround will abstract access to the configuration
|
||||
file in `$XDG_CONFIG_HOME/.config/unity3d/*/prefs` through the Linux `/dev/shm` system,
|
||||
and will provide initial game configuration whilst also masking the harmful fullscreen
|
||||
setting.
|
||||
|
||||
Net result - all Unity3D games using this pref path (the older generation) will start
|
||||
in windowed mode always. They can be fullscreened from inside the game, and this will
|
||||
help with making sure games **actually launch**.
|
||||
|
||||
### Notes
|
||||
|
||||
Note that LSI will not modify your Steam installation, and instead makes use of two
|
||||
modules, `liblsi-redirect.so` and `liblsi-intercept.so`, to dynamically apply all of the
|
||||
workarounds at runtime, which in turn is set up by the main LSI `shim` binary.
|
||||
|
||||
For a more in depth view of what LSI is, and how to integrate it into your distribution,
|
||||
please check the [technical README document](https://github.com/clearlinux/linux-steam-integration/blob/master/TECHNICAL.md).
|
||||
|
||||
|
||||
## License
|
||||
|
||||
Copyright © 2016-2018 Ikey Doherty
|
||||
|
||||
Copyright © 2018-2019 Intel Corporation
|
||||
|
||||
linux-steam-integration is available under the terms of the `LGPL-2.1` license.
|
||||
|
||||
See the accompanying `LICENSE.LGPL2.1` file for more details
|
||||
|
||||
|
||||
`data/lsi-steam.desktop`:
|
||||
|
||||
This file borrows translations from the official `steam.desktop` launcher.
|
||||
These are copyright of Valve*.
|
||||
|
||||
`* Some names may be claimed as the property of others.`
|
||||
-158
@@ -1,158 +0,0 @@
|
||||
linux-steam-integration
|
||||
-----------------------
|
||||
|
||||
A helper shim to enable better Steam* integration on Linux systems.
|
||||
This is part of an effort by Solus to enhance Steam for everyone.
|
||||
|
||||
This project, and by extension Solus, is not officially endorsed by, or
|
||||
affiliated with, Steam*, or its parent company, Valve*.
|
||||
|
||||
|
||||
Linux Steam Integration (LSI) is a `Solus Project <https://solus-project.com/>`_
|
||||
|
||||
.. image:: https://build.solus-project.com/logo.png
|
||||
:align: center
|
||||
:alt: LSI is a Solus Project
|
||||
|
||||
|
||||
Integrating LSI
|
||||
===============
|
||||
|
||||
To correctly integrate LSI, your Steam package will require modification.
|
||||
LSI must provide the /usr/bin/steam binary, so your Steam package must
|
||||
move the main launcher to a shadow location.
|
||||
|
||||
For users who do not have access to LSI in their distribution, because it has
|
||||
not been integrated yet, please configure with ``--disable-replace-steam`` to
|
||||
preserve your existing Steam integrity. Then use the "LSI Steam" shortcut in
|
||||
your menu to launch Steam via LSI.
|
||||
|
||||
**Configuring LSI build**
|
||||
|
||||
There are a number of configure options you should be aware of when integrating
|
||||
LSI correctly. The prominent ones are explained here.
|
||||
|
||||
|
||||
``--disable-replace-steam``
|
||||
|
||||
This will disable building a ``steam`` binary, and instead build an
|
||||
``lsi-steam`` binary, and install ``lsi-steam.desktop``. Use this
|
||||
option if you are not a distribution integrator, and wish to use
|
||||
LSI yourself.
|
||||
|
||||
|
||||
``--with-real-steam-binary=$NAME``
|
||||
|
||||
Set the absolute path for the shadowed Steam binary.
|
||||
LSI will execv Steam after it has initialised the environment.
|
||||
Note that execv, not execvp, is used, to mask programs that may be
|
||||
in the ``$PATH``, hence requiring an absolute path.
|
||||
|
||||
The default value for this option is::
|
||||
|
||||
/usr/lib/steam/steam
|
||||
|
||||
This option is only applicable for distribution integrators, when
|
||||
Steam replacement is enabled.
|
||||
|
||||
|
||||
``--with-preload-libs=$LIBS``
|
||||
|
||||
A colon separated list of libraries that are required to launch Steam
|
||||
when using its own runtime. LSI enables users to switch back to the Steam
|
||||
runtime, and in this instance we manage the LD_PRELOAD environmental variable.
|
||||
Ensure this is correct, and escape $LIB for correct Linux usage.
|
||||
|
||||
The default value for this option is::
|
||||
|
||||
/usr/\$LIB/libX11.so.6:/usr/\$LIB/libstdc++.so.6
|
||||
|
||||
``--enable-frontend``
|
||||
|
||||
A small UI application is shipped to enable configuration of LSI, which presents
|
||||
a simple GTK3 Dialog to the user. It is not enabled by default, it is up
|
||||
to the integrator to decide if they wish to employ lsi-settings, or implement
|
||||
an alternative.
|
||||
|
||||
The lsi-settings application will only ever write new configurations to the
|
||||
**user** settings file, and requires no special permissions.
|
||||
|
||||
The default value for this option is::
|
||||
|
||||
disabled
|
||||
|
||||
|
||||
**How LSI Works**
|
||||
|
||||
LSI provides a /usr/bin/steam binary to be used in place of the existing Steam script,
|
||||
which will then correctly set up the environment before swapping the process for the
|
||||
Steam process.
|
||||
|
||||
Configuration options can be placed in an INI-style configuration file in a series
|
||||
of locations, which are ordered by priority in a cascade::
|
||||
|
||||
~/.config/linux-steam-integration.conf
|
||||
/etc/linux-steam-integration.conf
|
||||
/usr/share/defaults/linux-steam-integration/linux-steam-integration.conf
|
||||
|
||||
The user configuration takes immediate priority. Secondly we have the system-wide
|
||||
configuration for affecting all accounts, and lastly the vendor configuration,
|
||||
which may be provided by the integrator.
|
||||
|
||||
Currently this INI file supports two options. The root section in this INI file
|
||||
must be ``[Steam]``.
|
||||
|
||||
``use-native-runtime = $boolean``
|
||||
|
||||
If set to a true boolean value, (yes/true/on), the host OS's native runtime
|
||||
will be used instead of the Steam provided runtime. If this is set to
|
||||
a false boolean value (no/false/off), then the startup will be modified
|
||||
to export the relevant ``LD_PRELOAD`` and ``STEAM_RUNTIME`` settings.
|
||||
|
||||
The default value of this variable is ``true``.
|
||||
|
||||
``force-32bit = $boolean``
|
||||
|
||||
If set to a true boolean value (yes/true/on), the shadowed Steam binary will
|
||||
be run via the ``linux32`` command. This will force the ``steam`` process
|
||||
and all children to believe they are running on a 32-bit system. This
|
||||
may be useful for 64-bit games that are buggy only on 64-bit.
|
||||
|
||||
If this is set to a false boolean value (no/false/off), then the
|
||||
shadowed Steam binary will be directly executed. Note that on 32-bit
|
||||
OSs this setting is ignored.
|
||||
|
||||
The default value of this variable is ``false``.
|
||||
|
||||
|
||||
Common issues
|
||||
=============
|
||||
|
||||
**Missing tray icon for Steam client using native OS runtime**
|
||||
|
||||
Ensure you have the 32-bit version of libappindicator installed. This
|
||||
is required for the tray icon. libappindicator falls back to a standard
|
||||
X11 tray icon in the absence of desktop appindicator support.
|
||||
|
||||
Related issue: `Steam tray icon missing #2 <https://github.com/solus-project/linux-steam-integration/issues/2>`_
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
``src/shim src/frontend``::
|
||||
|
||||
Copyright © 2016 Ikey Doherty
|
||||
|
||||
|
||||
linux-steam-integration is available under the terms of the `LGPL-2.1`
|
||||
|
||||
``data/lsi-steam.desktop``::
|
||||
|
||||
This file borrows translations from the official ``steam.desktop`` launcher.
|
||||
These are copyright of Valve*.
|
||||
|
||||
See `LICENSE.LGPL2.1 <LICENSE.LGPL2.1>`_ for more details
|
||||
|
||||
|
||||
* Some names may be claimed as the property of others.
|
||||
+276
@@ -0,0 +1,276 @@
|
||||
linux-steam-integration
|
||||
-----------------------
|
||||
|
||||
Linux Steam Integration is a software package aimed squarely at Linux distribution developers.
|
||||
It is designed to offer a far better Steam* experience than the stock client, doing away with old
|
||||
integration issues and crashes.
|
||||
|
||||
### Native Libraries
|
||||
|
||||
LSI enforces the use of host-native libraries, both in the Steam Client (via `lsi-intercept`) and
|
||||
games themselves. This ensures Steam integrates properly, games run with the latest libraries
|
||||
and users get the best performance.
|
||||
|
||||
Currently the officially provided Steam runtime is based on very old Ubuntu 12.04 packages,
|
||||
and has some cherry-picked updates (SDL, for example). This causes lots of integration issues
|
||||
on most newer distributions, such as broken client behaviour with full screen videos, outright
|
||||
crashes on startup, mismatched C++ ABI, missing sound, ugly menus, broken font rendering,
|
||||
poor performance, etc.
|
||||
|
||||
In a nut shell, LSI will force most of Steam over to using native libraries. The intercept
|
||||
system is new as of 0.4, and will be extended in future to allow improving certain games
|
||||
on a process-name whitelisting basis.
|
||||
|
||||
### Configurable
|
||||
|
||||
You can easily toggle the use of the native runtime or the runtime provided with the official
|
||||
Steam package distribution. LSI doesn't butcher any files, so your local Steam directory does
|
||||
not need to be repaired or reinstalled. Just run `lsi-settings` and restart Steam.
|
||||
|
||||
Currently you can control whether the native runtime is used, force 32-bit mode for some troublesome
|
||||
ports, and control whether the intercept library is enabled (which will undo the various library
|
||||
mangling tricks of the Steam distribution to force the usage of the system libs via rtld-audit)
|
||||
|
||||
### Portable
|
||||
|
||||
You can (and should) stick this into any distro. Hit us up if you need help integrating, or need some
|
||||
portability changes made. We won't bite.
|
||||
|
||||
### Going beyond LSI
|
||||
|
||||
LSI solves a great many issues, however there is then still a responsibility for the integrating distribution
|
||||
to provide basic ABI compatibility, as well as being functionally comparable to the "stock" runtime.
|
||||
Our future plans will basically involve creating a project based around LSI and a specially produced,
|
||||
optimised Steam runtime, usable on all Linux distributions.
|
||||
|
||||
If you want to be part of that effort - and help bring a modern, optimised gaming experience to your Linux
|
||||
users, please get in contact. Let's do this once, and do it right.
|
||||
|
||||
|
||||
## Integrating LSI
|
||||
|
||||
To correctly integrate LSI, your Steam package will require modification. LSI must provide the `/usr/bin/steam binary`, so your Steam package must move the main launcher to a shadow location.
|
||||
|
||||
For users who do not have access to LSI in their distribution, because it has not been integrated yet, please configure with `-Dwith-shim=co-exist` to preserve your existing Steam integrity. Then use the "LSI Steam" shortcut in your menu to launch Steam via LSI.
|
||||
|
||||
**Configuring LSI build**
|
||||
|
||||
There are a number of meson configure options you should be aware of when integrating LSI correctly. The prominent ones are explained here.
|
||||
|
||||
`-Dwith-shim= none | co-exist | replacement`
|
||||
|
||||
Control behaviour of the shim build. `none` will disable building the main
|
||||
shim, required for actually launching Steam in the first place.
|
||||
|
||||
`co-exist` will ensure this does not conflict with the `/usr/bin/steam`
|
||||
path, providing a new `lsi-steam` binary and desktop file.
|
||||
|
||||
`replacement` will provide a drop-in replacement `/usr/bin/steam` binary
|
||||
shim responsible for bootstrapping Steam via LSI. This will require you
|
||||
to mask the original steam binary to a new location.
|
||||
|
||||
The default value for this option is:
|
||||
|
||||
`replacement`
|
||||
|
||||
|
||||
`-Dwith-steam-binary=$PATH`
|
||||
|
||||
Set the absolute path for the shadowed Steam binary.
|
||||
LSI will execv Steam after it has initialised the environment.
|
||||
Note that execv, not execvp, is used, to mask programs that may be
|
||||
in the `$PATH`, hence requiring an absolute path.
|
||||
|
||||
The default value for this option is:
|
||||
|
||||
`/usr/lib/steam/steam`
|
||||
|
||||
This option is only applicable for distribution integrators, when
|
||||
Steam replacement is enabled.
|
||||
|
||||
|
||||
`-Dwith-preload-libs=$LIBS`
|
||||
|
||||
A colon separated list of libraries that are required to launch Steam
|
||||
when using its own runtime. LSI enables users to switch back to the Steam
|
||||
runtime, and in this instance we manage the LD_PRELOAD environmental variable.
|
||||
Ensure this is correct, and escape $LIB for correct Linux usage.
|
||||
|
||||
The default value for this option is:
|
||||
|
||||
`/usr/\$LIB/libX11.so.6:/usr/\$LIB/libstdc++.so.6`
|
||||
|
||||
`-Dwith-new-libcxx-abi=$boolean`
|
||||
|
||||
Enable this if your distribution uses a recent libstdc++ build, from
|
||||
GCC 6 or higher.
|
||||
|
||||
`-Dwith-frontend=$boolean`
|
||||
|
||||
A small UI application is shipped to enable configuration of LSI, which presents
|
||||
a simple GTK3 Dialog to the user. It is not enabled by default, it is up
|
||||
to the integrator to decide if they wish to employ lsi-settings, or implement
|
||||
an alternative.
|
||||
|
||||
The lsi-settings application will only ever write new configurations to the
|
||||
**user** settings file, and requires no special permissions.
|
||||
|
||||
The default value for this option is:
|
||||
|
||||
`false`
|
||||
|
||||
`-Dwith-libressl-mode= none | native | shim`
|
||||
|
||||
Control how LSI's `liblsi-intercept.so` handles LibreSSL.
|
||||
|
||||
The intercept module can be configured to enhance security of Linux ports
|
||||
by ensuring they use up to date LibreSSL builds.
|
||||
|
||||
When set to `native`, it is assumed the distro is employing LibreSSL as the
|
||||
default libSSL ABI (i.e. `libssl.so.1.0.0`)
|
||||
|
||||
When set to `shim`, LSI will redirect name requests for the `libssl` and
|
||||
`libcrypto` libraries to a uniquely named LibreSSL build of libraries,
|
||||
allowing libressl + openssl to co-exist on disk.
|
||||
|
||||
The default value for this option is:
|
||||
|
||||
`none`
|
||||
|
||||
`-Dwith-libressl-suffix=$suffix`
|
||||
|
||||
This option is only used when `-Dwith-libressl-mode=shim`, and sets the
|
||||
suffix for the libraries that LSI will attempt to use when transforming
|
||||
requests for LibreSSL libraries.
|
||||
|
||||
This will transform `libssl.so.$VERSION` to `libssl-$suffix.so`, i.e.
|
||||
`libssl.so.37` would become `libssl-libressl.so`. This allows distros
|
||||
to provide up to date `libressl` and `openssl` builds in parallel to
|
||||
improve the security of games relying on LibreSSL.
|
||||
|
||||
The default value for this option is:
|
||||
|
||||
`-libressl`
|
||||
|
||||
## How LSI Works
|
||||
|
||||
LSI provides a /usr/bin/steam binary to be used in place of the existing Steam script, which will then correctly set up the environment before swapping the process for the Steam process.
|
||||
When using a full build of LSI, the bootstrap shim will force a correct environment, removing any issues that can cause various older SDL versions to kill Steam. Additionally it will then
|
||||
force `STEAM_RUNTIME=0` if this is set in the config (default behaviour).
|
||||
|
||||
When using the native runtime, and the `intercept` library is enabled, the LSI shim will also set up `LD_AUDIT` to use `liblsi-intercept.so`. This library will intercept all dynamic linking operations
|
||||
for the main Steam binaries and override their behaviour, allowing Steam to only load a handful of vendored libraries (`libav` fork) as well as its own private libraries. It is then forced to use
|
||||
system libraries for everything else. This means the Steam client, web helper, etc, will use the native SDL, X11, fixing many bugs with video playback, font rendering and such.
|
||||
|
||||
As of the `0.6` release of LSI, we now also support a `redirect` module. When enabled, the LSI shim will set `LD_PRELOAD` to use `liblsi-redirect.so`, which will conditionally enable it's own
|
||||
internal logic based on the game being played. This module currently overrides the `open()` and `fopen64()` system calls to apply dynamic bug fixes to games, and may be expanded in future to
|
||||
provide more fixes.
|
||||
|
||||
Currently the `redirect` module supports:
|
||||
|
||||
- ARK: Survival Evolved* (Use fixed shader asset from `TheCenter` DLC to fix invalid water appearance)
|
||||
- Project Highrise* (Fix crash where the game attempts to use a directory as a config file `prefs.txt`)
|
||||
|
||||
If you are packaging LSI for a distribution, please ensure you provide both a 32-bit and 64-bit build of the intercept library so that the entirety of Steam's library (`.so`) mechanism is tightly
|
||||
controlled by LSI. See the scripts in the root directory of this repository for examples of how to do this.
|
||||
|
||||
Configuration options can be placed in an INI-style configuration file in a series of locations, which are ordered by priority in a cascade:
|
||||
|
||||
~/.config/linux-steam-integration.conf
|
||||
/etc/linux-steam-integration.conf
|
||||
/usr/share/defaults/linux-steam-integration/linux-steam-integration.conf
|
||||
|
||||
The user configuration takes immediate priority. Secondly we have the system-wide configuration for affecting all accounts, and lastly the vendor configuration, which may be provided by the integrator.
|
||||
|
||||
Currently this INI file supports three options. The root section in this INI file must be `[Steam]`.
|
||||
|
||||
`use-native-runtime = $boolean`
|
||||
|
||||
If set to a true boolean value, (yes/true/on), the host OS's native runtime
|
||||
will be used instead of the Steam provided runtime. If this is set to
|
||||
a false boolean value (no/false/off), then the startup will be modified
|
||||
to export the relevant `LD_PRELOAD` and `STEAM_RUNTIME` settings.
|
||||
|
||||
The default value of this variable is `true`.
|
||||
|
||||
`force-32bit = $boolean`
|
||||
|
||||
If set to a true boolean value (yes/true/on), the shadowed Steam binary will
|
||||
be run via the `setarch linux32` command. This will force the `steam` process
|
||||
and all children to believe they are running on a 32-bit system. This
|
||||
may be useful for 64-bit games that are buggy only on 64-bit.
|
||||
|
||||
If this is set to a false boolean value (no/false/off), then the
|
||||
shadowed Steam binary will be directly executed. Note that on 32-bit
|
||||
OSs this setting is ignored.
|
||||
|
||||
The default value of this variable is `false`.
|
||||
|
||||
`use-libintercept = $boolean`
|
||||
|
||||
If set to a true boolean value (yes/true/on), the `liblsi-intercept.so`
|
||||
library will be utilised to control dynamic linking within the Steam client
|
||||
and associated processes.
|
||||
|
||||
Note this requires `use-native-runtime` to be set.
|
||||
|
||||
The default value of this variable is `true`.
|
||||
|
||||
`use-libredirect = $boolean`
|
||||
|
||||
If set to a true boolean value (yes/true/on), the `liblsi-redirect.so`
|
||||
library will be utilised to apply "hot" workarounds to certain games to
|
||||
fix various runtime issues.
|
||||
|
||||
Note this requires `use-native-runtime` to be set.
|
||||
|
||||
The default value of this variable is `true`.
|
||||
|
||||
`use-unity-hack = $boolean`
|
||||
|
||||
If set to a true boolean value (yes/true/on), the `liblsi-redirect.so`
|
||||
library will apply a preference workaround to Unity3D based games and
|
||||
abstract access to their configuration files. This is used to force
|
||||
Unity3D games to always start in windowed mode, and to ensure that
|
||||
they're unable to make use of the stored fullscreen setting.
|
||||
|
||||
|
||||
## Common issues
|
||||
|
||||
Virtually all issues will come down to having the right dependencies. LSI puts an emphasis on
|
||||
host-first libraries, so make sure all the correct libraries are available for both 32-bit and
|
||||
64-bit.
|
||||
|
||||
Steam has both 32-bit and 64-bit processes/libraries, having the full dependency set for both
|
||||
the client and common games/engines is a must.
|
||||
|
||||
### Steam fails to launch with libintercept/native-runtime
|
||||
|
||||
Make sure you enable full debugging when first assigning dependencies to your runtime package:
|
||||
|
||||
```bash
|
||||
$ LSI_DEBUG=1 steam
|
||||
# If you use co-exist option:
|
||||
$ LSI_DEBUG=1 lsi-steam
|
||||
```
|
||||
|
||||
### liblsi-intercept regressing performance
|
||||
|
||||
There exists a bug in `glibc` which incorrectly configures profiling for all PLT calls when using `LD_AUDIT` (rtld-audit)
|
||||
even if the audit library doesn't implement `la_pltenter` or `la_pltexit`. This leads to a performance hit on every
|
||||
runtime call via PLT.
|
||||
|
||||
The issue was first reported to this project by @amonakov [here](https://github.com/solus-project/linux-steam-integration/issues/15).
|
||||
The upstream glibc issue is reported on the upstream glibc [bugzilla](https://sourceware.org/bugzilla/show_bug.cgi?id=15533).
|
||||
A patch to resolve the issue was submitted by @amonakov [here](https://sourceware.org/ml/libc-alpha/2013-05/msg00888.html).
|
||||
|
||||
If you are noticing performance regressions, you can:
|
||||
|
||||
- As a user: Disable `liblsi-intercept` via `lsi-settings`. This will hurt compatibility.
|
||||
- As a packager: Disable `liblsi-intercept` via build flags. This will hurt compatibility.
|
||||
- As a distribution integrator: Add weight to upstream issue and import patch into your distribution.
|
||||
This will retain LSI compatibility magic and mitigate performance issues.
|
||||
As an example, Solus has already [integrated the patch](https://dev.getsol.us/R927:afa5b639e8a9b62618457a304d1e6fb42a9f2066).
|
||||
|
||||
|
||||
`* Some names may be claimed as the property of others.`
|
||||
@@ -0,0 +1,19 @@
|
||||
Initial test list for next release of LSI
|
||||
|
||||
- DOTA 2
|
||||
- Don't Starve Together
|
||||
- Requires curl-gnutls (integrating into CLR now)
|
||||
- Vendored SDL is patched in non upstreamable fashion
|
||||
https://forums.kleientertainment.com/forums/topic/30218-crash-on-linux-steam-without-error/?page=0&tab=comments#comment-386249
|
||||
We'll need to allow certain games to vendor SDL now.
|
||||
Fixed in https://github.com/clearlinux/linux-steam-integration/commit/c4ded161159d2d6faa5a1dba45af8426738632b7
|
||||
- Oxygen Not Included (working perfectly)
|
||||
- Cities:Skylines
|
||||
- Various Source titles (L4D2, Portal, etc)
|
||||
- Various Feral titles (2018/2019 kits)
|
||||
- Stardew Valley
|
||||
- Rocket League
|
||||
|
||||
+1 release:
|
||||
|
||||
- Proton compat
|
||||
@@ -1,20 +0,0 @@
|
||||
LSI is still in its infancy, currently only at a 0.1 release. The time to
|
||||
release was dramatic due to an absolute requirement for non-broken Steam
|
||||
to accompany the Solus 1.2 release
|
||||
|
||||
Going forward, there are more items that need implementing to start shaving
|
||||
more rough edges off of Linux gaming.
|
||||
|
||||
Immediate LSI worklist:
|
||||
|
||||
- [x] Add configurable shim to replace /usr/bin/steam, relying on shadowed launcher
|
||||
- [x] Add super-basic UI to configure said shim
|
||||
- [x] Shove out a 0.1 for Solus 1.2
|
||||
- [ ] Replace existing /usr/bin/steam entirely and decouple the tight runtime logic
|
||||
that is currently enforced.
|
||||
- [ ] Remove requirement for steam.sh $bindir/steam entirely - allowing parallel clients.
|
||||
LSI becomes more self contained and no longer needs to prop up Steam, but replaces
|
||||
much of the support tools.
|
||||
- [ ] Replace the existing Steam "run.sh" style launch facilities
|
||||
- [ ] Get to a point that current ubuntu12_32 runtime is no longer required or
|
||||
wanted.
|
||||
-14
@@ -1,14 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
autoreconf --force --install --symlink --warnings=all
|
||||
|
||||
args="\
|
||||
--sysconfdir=/etc \
|
||||
--localstatedir=/var \
|
||||
--prefix=/usr \
|
||||
--enable-silent-rules"
|
||||
|
||||
./configure CFLAGS="-g -O1 $CFLAGS" $args "$@"
|
||||
make clean
|
||||
-119
@@ -1,119 +0,0 @@
|
||||
AC_INIT([linux-steam-integration], 0.3, [ikey@solus-project.com], [linux-steam-integration], [https://github.com/solus-project/linux-steam-integration/issues])
|
||||
AC_CONFIG_AUX_DIR([build-aux])
|
||||
AM_INIT_AUTOMAKE([-Wno-portability no-dist-gzip dist-xz foreign subdir-objects])
|
||||
AC_PROG_CC
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CC_STDC
|
||||
LT_PREREQ(2.2)
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_PREFIX_DEFAULT(/usr/local)
|
||||
AM_SILENT_RULES([yes])
|
||||
LT_INIT([disable-static])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
# Turn on the nica submodule support
|
||||
AM_CONDITIONAL([NICA_SUBMODULE], true)
|
||||
AM_CONDITIONAL([COVERAGE], false)
|
||||
|
||||
AC_CONFIG_FILES([Makefile
|
||||
src/libnica/Makefile])
|
||||
|
||||
# Check if we're using the new C++ ABI, which will require LD_PRELOAD magic
|
||||
AC_LANG_PUSH([C++])
|
||||
AC_MSG_CHECKING(['_GLIBCXX_USE_CXX11_ABI' value])
|
||||
AC_COMPUTE_INT([LSI_NEW_CXX_ABI], [_GLIBCXX_USE_CXX11_ABI], [[#include <string>]], [LSI_NEW_CXX_ABI=0])
|
||||
AC_MSG_RESULT([$LSI_NEW_CXX_ABI])
|
||||
AC_LANG_POP([C++])
|
||||
|
||||
if test x$LSI_NEW_CXX_ABI = "x1"; then
|
||||
use_new_abi="yes"
|
||||
AC_DEFINE([LSI_USE_NEW_ABI], [1], [Using new C++ ABI])
|
||||
else
|
||||
use_new_abi="no"
|
||||
fi
|
||||
|
||||
# Source: https://mail.gnome.org/archives/commits-list/2012-September/msg01730.html
|
||||
# adl_RECURSIVE_EVAL(VALUE, RESULT)
|
||||
# =================================
|
||||
# Interpolate the VALUE in loop until it doesn't change,
|
||||
# and set the result to $RESULT.
|
||||
# WARNING: It's easy to get an infinite loop with some unsane input.
|
||||
# For example ${datadir} becomes ${datarootdir}, and then ${prefix}/share, and
|
||||
# finally ${prefix} is replaced by the prefix.
|
||||
AC_DEFUN([adl_RECURSIVE_EVAL],
|
||||
[_lcl_receval="$1"
|
||||
$2=`(test "x$prefix" = xNONE && prefix="$ac_default_prefix"
|
||||
test "x$exec_prefix" = xNONE && exec_prefix="${prefix}"
|
||||
_lcl_receval_old=''
|
||||
while test "[$]_lcl_receval_old" != "[$]_lcl_receval"; do
|
||||
_lcl_receval_old="[$]_lcl_receval"
|
||||
eval _lcl_receval="\"[$]_lcl_receval\""
|
||||
done
|
||||
echo "[$]_lcl_receval")`])
|
||||
|
||||
# Shadow location of real Steam
|
||||
AC_ARG_WITH([real-steam-binary], AS_HELP_STRING([--with-real-steam-binary],
|
||||
[the real Steam binary to use]), [steambin=${withval}],
|
||||
[steambin="$libdir/steam/steam"])
|
||||
|
||||
adl_RECURSIVE_EVAL(["$steambin"], [STEAMBIN])
|
||||
AC_SUBST(STEAMBIN)
|
||||
|
||||
AC_DEFINE_UNQUOTED(STEAM_BINARY, "$STEAMBIN",
|
||||
[The location of the real Steam binary])
|
||||
|
||||
# The LD_PRELOAD list required to integrate gracefully with the official Steam Runtime
|
||||
AC_ARG_WITH([preload-libs], AS_HELP_STRING([--with-preload-libs],
|
||||
[the preload libs to use with Steams own runtime]), [preloadlibs="${withval}"],
|
||||
[preloadlibs="/usr/\$LIB/libxcb.so.1:/usr/\$LIB/libX11.so.6:/usr/\$LIB/libstdc++.so.6"])
|
||||
|
||||
AC_DEFINE_UNQUOTED([LSI_PRELOAD_LIBS], "$preloadlibs",
|
||||
[Libraries to preload with Steams runtime])
|
||||
|
||||
m4_define([gtk_required_version], [3.4.0])
|
||||
|
||||
# Check if frontend is requested
|
||||
have_frontend="no"
|
||||
AC_ARG_ENABLE(frontend, AS_HELP_STRING([--enable-frontend], [enable GTK frontend]))
|
||||
if test "x$enable_frontend" = "xyes" ; then
|
||||
PKG_CHECK_MODULES([GTK], [gtk+-3.0 >= gtk_required_version])
|
||||
AC_DEFINE([HAVE_FRONTEND], [1], [Enabled GTK+ frontend])
|
||||
have_frontend="yes"
|
||||
|
||||
fi
|
||||
AM_CONDITIONAL([HAVE_FRONTEND], [test x$have_frontend = "xyes"])
|
||||
|
||||
# Whether LSI should stand in for steam binary
|
||||
replace_steam="yes"
|
||||
AC_ARG_ENABLE(replace-steam, AS_HELP_STRING([--disable-replace-steam], [disable Steam binary replacement]))
|
||||
if test "x$enable_replace_steam" = "xno"; then
|
||||
replace_steam="no"
|
||||
fi
|
||||
if test "x$replace_steam" = "xyes" ; then
|
||||
AC_DEFINE([REPLACE_STEAM], [1], [Steam binary will be replaced])
|
||||
fi
|
||||
AM_CONDITIONAL([REPLACE_STEAM], [test x$replace_steam = "xyes"])
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
AC_MSG_RESULT([
|
||||
linux-steam-integration $VERSION
|
||||
========
|
||||
|
||||
prefix: ${prefix}
|
||||
libdir: ${libdir}
|
||||
sysconfdir: ${sysconfdir}
|
||||
exec_prefix: ${exec_prefix}
|
||||
bindir: ${bindir}
|
||||
datarootdir: ${datarootdir}
|
||||
|
||||
New C++ ABI: ${use_new_abi}
|
||||
Replace Steam: ${replace_steam}
|
||||
Real Steam binary: ${STEAMBIN}
|
||||
GTK+ Frontend: ${have_frontend}
|
||||
preload-libs: ${preloadlibs}
|
||||
|
||||
compiler: ${CC}
|
||||
cflags: ${CFLAGS}
|
||||
ldflags: ${LDFLAGS}
|
||||
])
|
||||
@@ -1,7 +1,7 @@
|
||||
[Desktop Entry]
|
||||
Name=Linux Steam Integration
|
||||
Comment=Application for managing Steam integration settings
|
||||
Exec=lsi-settings
|
||||
Exec=@LSI_SETTINGS@
|
||||
Icon=steam
|
||||
Terminal=false
|
||||
Type=Application
|
||||
@@ -8,6 +8,7 @@ Type=Application
|
||||
Categories=Network;FileTransfer;Game;
|
||||
MimeType=x-scheme-handler/steam;
|
||||
Actions=Store;Community;Library;Servers;Screenshots;News;Settings;BigPicture;Friends;
|
||||
StartupWMClass=Steam
|
||||
|
||||
[Desktop Action Store]
|
||||
Name=Store
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
path_appsdir = join_paths(path_datadir, 'applications')
|
||||
|
||||
# If frontend is enabled, install lsi-settings.desktop
|
||||
if with_frontend == true
|
||||
data_conf = configuration_data()
|
||||
if with_snap_support == true
|
||||
data_conf.set('LSI_SETTINGS', 'linux-steam-integration.exec linux-steam-integration.settings')
|
||||
else
|
||||
data_conf.set('LSI_SETTINGS', 'lsi-settings')
|
||||
endif
|
||||
configure_file(
|
||||
input: 'lsi-settings.desktop.in',
|
||||
output: 'lsi-settings.desktop',
|
||||
configuration: data_conf,
|
||||
install_dir: path_appsdir,
|
||||
)
|
||||
endif
|
||||
|
||||
# If we need to co-exist, install alternative .desktop file (not conflicting with Steam)
|
||||
if shim_behaviour == 'co-exist'
|
||||
install_data(
|
||||
'lsi-steam.desktop',
|
||||
install_dir: path_appsdir,
|
||||
)
|
||||
endif
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
+172
@@ -0,0 +1,172 @@
|
||||
project(
|
||||
'linux-steam-integration',
|
||||
['c'],
|
||||
version: '0.7.3',
|
||||
license: [
|
||||
'LGPL-2.1',
|
||||
],
|
||||
default_options: [
|
||||
'c_std=c11',
|
||||
],
|
||||
)
|
||||
|
||||
am_cflags = [
|
||||
'-fstack-protector',
|
||||
'-pedantic',
|
||||
'-Wstrict-prototypes',
|
||||
'-Wundef',
|
||||
'-fno-common',
|
||||
'-Werror-implicit-function-declaration',
|
||||
'-Wformat',
|
||||
'-Wformat-security',
|
||||
'-Werror=format-security',
|
||||
'-Wno-conversion',
|
||||
'-Wunused-variable',
|
||||
'-Wunreachable-code',
|
||||
'-Wall',
|
||||
'-W',
|
||||
'-D_FORTIFY_SOURCE=2',
|
||||
]
|
||||
|
||||
add_global_arguments(am_cflags, language: 'c')
|
||||
|
||||
dep_gtk3 = dependency('gtk+-3.0', version: '>= 3.4.0')
|
||||
|
||||
# Grab all our main paths
|
||||
path_prefix = get_option('prefix')
|
||||
path_bindir = join_paths(path_prefix, get_option('bindir'))
|
||||
path_datadir = join_paths(path_prefix, get_option('datadir'))
|
||||
path_vendordir = join_paths(path_datadir, 'defaults', meson.project_name())
|
||||
path_sysconfdir = join_paths(path_prefix, get_option('sysconfdir'))
|
||||
path_localedir = join_paths(path_prefix, get_option('localedir'))
|
||||
|
||||
# Set up our basic configuration
|
||||
cdata = configuration_data()
|
||||
cdata.set_quoted('PACKAGE_NAME', meson.project_name())
|
||||
cdata.set_quoted('SYSTEMCONFDIR', path_sysconfdir)
|
||||
cdata.set_quoted('VENDORDIR', path_vendordir)
|
||||
cdata.set_quoted('LOCALEDIR', path_localedir)
|
||||
cdata.set_quoted('GETTEXT_PACKAGE', meson.project_name())
|
||||
|
||||
# Configurables
|
||||
with_preload_libs = get_option('with-preload-libs')
|
||||
cdata.set_quoted('LSI_PRELOAD_LIBS', with_preload_libs)
|
||||
cdata.set_quoted('STEAM_BINARY', get_option('with-steam-binary'))
|
||||
|
||||
# Future reports
|
||||
shim_system_report = []
|
||||
intercept_module_report = []
|
||||
redirect_module_report = []
|
||||
|
||||
# Control the shim behaviour
|
||||
shim_behaviour = get_option('with-shim')
|
||||
shim_enabled = false
|
||||
if shim_behaviour == 'replacement'
|
||||
cdata.set('REPLACE_STEAM', '1')
|
||||
endif
|
||||
if shim_behaviour != 'none'
|
||||
shim_enabled = true
|
||||
endif
|
||||
shim_system_report += ' behaviour: @0@'.format(shim_behaviour)
|
||||
shim_system_report += ' preload libraries: @0@'.format(with_preload_libs)
|
||||
|
||||
# Do we have liblsi-intercept?
|
||||
with_libintercept = get_option('with-libintercept')
|
||||
if with_libintercept == true
|
||||
cdata.set('HAVE_LIBINTERCEPT', '1')
|
||||
endif
|
||||
|
||||
# Do we have liblsi-redirect?
|
||||
with_libredirect = get_option('with-libredirect')
|
||||
if with_libredirect == true
|
||||
cdata.set('HAVE_LIBREDIRECT', '1')
|
||||
endif
|
||||
|
||||
# Do we have the frontend?
|
||||
with_frontend = get_option('with-frontend')
|
||||
|
||||
# Using the new libc++ ABI? Important for mesa drivers
|
||||
with_new_libcxx_abi = get_option('with-new-libcxx-abi')
|
||||
if with_new_libcxx_abi == true
|
||||
cdata.set('LSI_USE_NEW_ABI', '1')
|
||||
endif
|
||||
shim_system_report += ' New C++ ABI: @0@'.format(with_new_libcxx_abi)
|
||||
|
||||
# How are we handling LibreSSL?
|
||||
with_libressl_mode = get_option('with-libressl-mode')
|
||||
intercept_module_report += ' LibreSSL handling: @0@'.format(with_libressl_mode)
|
||||
|
||||
if with_libressl_mode == 'native'
|
||||
# LibreSSL is provided by the distro as the native libssl, libcrypto, etc
|
||||
cdata.set('LSI_LIBRESSL_MODE_NATIVE', '1')
|
||||
cdata.set('LSI_OVERRIDE_LIBRESSL', '1')
|
||||
elif with_libressl_mode == 'shim'
|
||||
# A shim package has been provided for soname redirects to updated/secure libressl
|
||||
# This allows distros to secure libressl without making it the system libssl/libcrypto option
|
||||
cdata.set('LSI_LIBRESSL_MODE_SHIM', '1')
|
||||
cdata.set('LSI_OVERRIDE_LIBRESSL', '1')
|
||||
with_libressl_suffix = get_option('with-libressl-suffix')
|
||||
intercept_module_report += ' LibreSSL library suffix: @0@'.format(with_libressl_suffix)
|
||||
cdata.set_quoted('LSI_LIBRESSL_SUFFIX', with_libressl_suffix)
|
||||
else
|
||||
message('LibreSSL mode isn\'t configured which may impact security')
|
||||
endif
|
||||
|
||||
# Got snap support?
|
||||
with_snap_support = get_option('with-snap-support')
|
||||
if with_snap_support == true
|
||||
cdata.set('HAVE_SNAPD_SUPPORT', '1')
|
||||
path_fake_scripts_dir = join_paths(path_datadir, meson.project_name(), 'scripts')
|
||||
cdata.set_quoted('FAKE_SCRIPTS_DIR', path_fake_scripts_dir)
|
||||
subdir('snapd')
|
||||
message('Enabling snapd support. Do NOT do this for distribution builds!')
|
||||
endif
|
||||
|
||||
# Let's write the global config.h now
|
||||
config_h = configure_file(
|
||||
configuration: cdata,
|
||||
output: 'config.h',
|
||||
)
|
||||
# Make it discoverable
|
||||
config_h_dir = include_directories('.')
|
||||
|
||||
# Descend into source trees
|
||||
subdir('data')
|
||||
subdir('src')
|
||||
subdir('po')
|
||||
|
||||
report = [
|
||||
' Build configuration:',
|
||||
' ====================',
|
||||
'',
|
||||
' prefix: @0@'.format(path_prefix),
|
||||
' datadir: @0@'.format(path_datadir),
|
||||
' sysconfdir: @0@'.format(path_sysconfdir),
|
||||
' bindir: @0@'.format(path_bindir),
|
||||
'',
|
||||
' Shim System (Execution/Environment Control):',
|
||||
' ============================================',
|
||||
'',
|
||||
' enabled: @0@'.format(shim_enabled),
|
||||
'@0@'.format('\n'.join(shim_system_report)),
|
||||
'',
|
||||
' Intercept Module (Dynamic Linker Control):',
|
||||
' ==========================================',
|
||||
'',
|
||||
' enabled: @0@'.format(with_libintercept),
|
||||
'@0@'.format('\n'.join(intercept_module_report)),
|
||||
'',
|
||||
' Redirect Module (Standard Library Control):',
|
||||
' ===========================================',
|
||||
'',
|
||||
' enabled: @0@'.format(with_libredirect),
|
||||
'',
|
||||
' Snap Support (run as a snap):',
|
||||
' =============================',
|
||||
'',
|
||||
' enabled: @0@'.format(with_snap_support),
|
||||
'@0@'.format('\n'.join(redirect_module_report)),
|
||||
]
|
||||
|
||||
# Output some stuff to validate the build config
|
||||
message('\n\n\n' + '\n'.join(report) + '\n\n')
|
||||
@@ -0,0 +1,16 @@
|
||||
option('with-shim', type : 'combo', choices : ['replacement', 'co-exist', 'none'], value: 'replacement',
|
||||
description : 'control how the shim is deployed')
|
||||
option('with-steam-binary', type: 'string', description: 'Set the path to the Steam binary', value: '/usr/lib/steam/steam')
|
||||
option('with-frontend', type: 'boolean', description: 'Build the LSI Settings UI', value: false)
|
||||
option('with-preload-libs', type: 'string', description: 'Colon separated list of libraries required to launch Steam games',
|
||||
value: '/usr/$LIB/libxcb.so.1:/usr/$LIB/libX11.so.6:/usr/$LIB/libstdc++.so.6')
|
||||
option('with-libintercept', type: 'boolean', description: 'Enable libintercept library for controlling Steam linking', value: true)
|
||||
option('with-libredirect', type: 'boolean', description: 'Enable libredirect library for fine-tuning Steam games', value: true)
|
||||
option('with-new-libcxx-abi', type: 'boolean', description: 'Enable when using the new libstdc++ ABI', value: false)
|
||||
|
||||
option('with-libressl-mode', type: 'combo', choices: ['native', 'shim', 'none'], value: 'none',
|
||||
description: 'Control how LibreSSL replacements are performed')
|
||||
option('with-libressl-suffix', type: 'string', value: '-libressl',
|
||||
description: 'Suffix for shim LibreSSL library when using --with-libressl-mode=shim')
|
||||
|
||||
option('with-snap-support', type: 'boolean', description: 'Build LSI with explicit support for snapd', value: false)
|
||||
Executable
+35
@@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
DEFAULT_ARGS="-Dwith-libressl-mode=shim -Dwith-new-libcxx-abi=true"
|
||||
|
||||
if [[ ! -d buildroot/build32 ]]; then
|
||||
ASFLAGS="$ASFLAGS --32" CFLAGS="$CFLAGS -m32" CXXFLAGS="$CXXFLAGS -m32" LDFLAGS="$LDFLAGS -m32" \
|
||||
meson buildroot/build32 $DEFAULT_ARGS \
|
||||
--prefix=/usr \
|
||||
--sysconfdir=/etc \
|
||||
--datadir=/usr/share \
|
||||
--libdir=/usr/lib32 \
|
||||
-Dwith-shim=none \
|
||||
--buildtype debugoptimized
|
||||
fi
|
||||
|
||||
if [[ ! -d buildroot/build64 ]]; then
|
||||
meson buildroot/build64 $DEFAULT_ARGS \
|
||||
--prefix=/usr \
|
||||
--sysconfdir=/etc \
|
||||
--datadir=/usr/share \
|
||||
--libdir=/usr/lib64 \
|
||||
-Dwith-shim=replacement \
|
||||
-Dwith-steam-binary=/usr/lib64/steam/steam \
|
||||
-Dwith-frontend=true \
|
||||
--buildtype debugoptimized
|
||||
fi
|
||||
|
||||
ninja -C buildroot/build32
|
||||
ninja -C buildroot/build64
|
||||
|
||||
sudo ninja -C buildroot/build32 install
|
||||
sudo ninja -C buildroot/build64 install
|
||||
|
||||
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
git submodule init
|
||||
git submodule update
|
||||
|
||||
# Script for ikey because he went with meson. *shrug*
|
||||
VERSION="0.7.3"
|
||||
NAME="linux-steam-integration"
|
||||
git-archive-all.sh --format tar --prefix ${NAME}-${VERSION}/ --verbose -t HEAD ${NAME}-${VERSION}.tar
|
||||
xz -9 "${NAME}-${VERSION}.tar"
|
||||
|
||||
gpg --armor --detach-sign "${NAME}-${VERSION}.tar.xz"
|
||||
gpg --verify "${NAME}-${VERSION}.tar.xz.asc"
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
ar
|
||||
ca_ES
|
||||
ca
|
||||
cs
|
||||
da_DK
|
||||
da
|
||||
de_CH
|
||||
de
|
||||
en_GB
|
||||
eo
|
||||
es_419
|
||||
es_AR
|
||||
es_ES
|
||||
es_MX
|
||||
es_PE
|
||||
es
|
||||
fi
|
||||
fr_FR
|
||||
he
|
||||
hu
|
||||
id_ID
|
||||
it_IT
|
||||
ko_KR
|
||||
ko
|
||||
lt
|
||||
nb_NO
|
||||
ne_NP
|
||||
nl_BE
|
||||
nl_NL
|
||||
pl_PL
|
||||
pl
|
||||
pt_BR
|
||||
pt_PT
|
||||
ro_RO
|
||||
ru
|
||||
sv_SE
|
||||
tr
|
||||
zh_CN
|
||||
@@ -0,0 +1 @@
|
||||
src/frontend/main-window.c
|
||||
@@ -0,0 +1,81 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Ahmed Lemine <aljakany@gmail.com>, 2017\n"
|
||||
"Language-Team: Arabic (https://www.transifex.com/solus-project/teams/68407/ar/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ar\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "دمج ستيم® ولينكس"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"التحكم في سلوك عميل ستيم والألعاب. لن تكون الإعدادات سارية المفعول ما لم يتم"
|
||||
" إعادة تشغيل عميل ستيم. استخدم خيار \"الخروج من ستيم\" للتأكد من إغلاقه."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "استخدم زمن تشغيل أصيل"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "بدّل بين زمن التشغيل الأصيل وزمن التشغيل المرفق مع ستيم."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "تم تعطيل هذا الخيار لأن النظام أساساً ذو معمارية 32 بت"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr "قد يصلح هذا بعض الألعاب المعطلة، لكن سيعطل متصفح متجر ستيم."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "افرض وضع 32 بت لستيم"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "استخدم مكتبة الاعتراض"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"أجبر تطبيقات ستيم على استخدام مزيد من المكتبات الأصيلة لزيادة التوافق إلى "
|
||||
"أقصى درجة."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "استخدم مكتبة إعادة التوجيه"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr "تجاوز استدعاءات النظام لإصلاح مشكلات معروفة في بعض نسخ لينكس."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "فشل في حفظ الإعدادات"
|
||||
@@ -0,0 +1,98 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-19 12:48+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Davidmp <medipas@gmail.com>, 2017\n"
|
||||
"Language-Team: Catalan (https://www.transifex.com/solus-project/teams/68407/ca/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ca\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:132 src/frontend/main-window.c:149
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integració de Linux Steam®"
|
||||
|
||||
#: src/frontend/main-window.c:163
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controleu el comportament del client i dels jocs d'Steam. La configuració no"
|
||||
" tindrà efecte fins que no es reiniciï el client d'Steam. Useu l'opció "
|
||||
"\"Surt de l'Steam\" per assegurar-vos que es tanqui."
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Use native runtime"
|
||||
msgstr "Usa l'entorn d'execució natiu"
|
||||
|
||||
#: src/frontend/main-window.c:193
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Canvieu entre l'entorn natiu i l'entorn d'Steam agrupat."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:202
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Aquesta opció s'ha inhabilitat ja que el sistema ja és de 32 bits."
|
||||
|
||||
#: src/frontend/main-window.c:206
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Això pot solucionar alguns jocs trencats, però inhabilitarà el navegador de "
|
||||
"la botiga d'Steam."
|
||||
|
||||
#: src/frontend/main-window.c:211
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Força el mode de 32 bits per a l'Steam"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Usa la biblioteca d'intercepció"
|
||||
|
||||
#: src/frontend/main-window.c:220
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Força que les aplicacions de l'Steam usin més biblioteques natives per "
|
||||
"maximitzar la compatibilitat."
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Usa la biblioteca de redirecció"
|
||||
|
||||
#: src/frontend/main-window.c:230
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Anul·la les crides de sistema per corregir errors coneguts en algunes "
|
||||
"versions de Linux."
|
||||
|
||||
#: src/frontend/main-window.c:237
|
||||
msgid "Use the Unity fullscreen workaround"
|
||||
msgstr "Usa la solució provisional de pantalla completa de l'Unity."
|
||||
|
||||
#: src/frontend/main-window.c:238
|
||||
msgid ""
|
||||
"Prevent some Unity games from launching in full screen mode to fix numerous "
|
||||
"issues"
|
||||
msgstr ""
|
||||
"Evita que alguns jocs d'Unity s'obrin en pantalla completa per tal de "
|
||||
"corregir uns quants problemes."
|
||||
|
||||
#: src/frontend/main-window.c:403
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Ha fallat desar la configuració"
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Davidmp <medipas@gmail.com>, 2017\n"
|
||||
"Language-Team: Catalan (Spain) (https://www.transifex.com/solus-project/teams/68407/ca_ES/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ca_ES\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integració de Linux Steam®"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controleu el comportament del client i dels jocs d'Steam. La configuració no"
|
||||
" tindrà efecte fins que no es reiniciï el client d'Steam. Useu l'opció "
|
||||
"\"Surt de l'Steam\" per assegurar-vos que es tanqui."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Usa l'entorn d'execució natiu"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Canvieu entre l'entorn natiu i l'entorn d'Steam agrupat."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Aquesta opció s'ha inhabilitat ja que el sistema ja és de 32 bits."
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Això pot solucionar alguns jocs trencats, però inhabilitarà el navegador de "
|
||||
"la botiga d'Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Força el mode de 32 bits per a l'Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Usa la biblioteca d'intercepció"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Força que les aplicacions de l'Steam usin més biblioteques natives per "
|
||||
"maximitzar la compatibilitat."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Usa la biblioteca de redirecció"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Anul·la les crides de sistema per corregir errors coneguts en algunes "
|
||||
"versions de Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Ha fallat desar la configuració"
|
||||
@@ -0,0 +1,85 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Ondřej Pucholt <o.pucholt@windowslive.com>, 2017\n"
|
||||
"Language-Team: Czech (https://www.transifex.com/solus-project/teams/68407/cs/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: cs\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integrace služby Steam®"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Ovládá chování her a klienta služby Steam. Změny nastavení se projeví až po "
|
||||
"restartování služby. Pro její zaručené ukončení zvolte možnost \"Ukončit "
|
||||
"službu Steam\"."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Používat nativní běhové prostředí"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Přepíná mezi nativním a přibaleným běhovým prostředím služby Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Tato volba není dostupná, protože systém už je 32bitový"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Umožňuje obejít některé problémy se hrami, ale deaktivuje prohlížeč obchodu "
|
||||
"služby Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Přinutit službu Steam používat 32bitový režim"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Používat knihovnu pro zachytávání"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Přinutí programy ze služby Steam používat více nativních knihoven pro "
|
||||
"zajištění maximální kompatibility."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Používat knihovnu pro přesměrování"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Přepsáním systémových volání opraví známé chyby v linuxových portech her."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Uložení konfigurace selhalo"
|
||||
@@ -0,0 +1,85 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: scootergrisen <scootergrisen@gmail.com>, 2017\n"
|
||||
"Language-Team: Danish (https://www.transifex.com/solus-project/teams/68407/da/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: da\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integration med Linux Steam®"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Styr opførslen af Steam-klienten og spil. Indstillingerne vil ikke træde i "
|
||||
"kraft før Steam-klienten er blevet genstartet. Brug 'Afslut Steam' for af "
|
||||
"sikre at programmet lukkes."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Brug nativ runtime"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Skift mellem nativ runtime og den runtime som følger med Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr ""
|
||||
"Denne mulighed er blevet deaktiveret eftersom systemet allerede er 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Det løser muligvis problemer for nogle ødelagte spil, til gengæld "
|
||||
"deaktiveres Steam butik-browseren."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Tving 32-bit-tilstand for Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Brug intercept-biblioteket"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Tving Steam-programmer til at bruge flere native biblioteker for at "
|
||||
"maksimere kompatibilitet."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Brug redirect-biblioteket"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr "Tilsidesæt systemkald for at rette kendte fejl i nogle Linux-porte."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Kunne ikke gemme konfiguration"
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Yavuznie <y.z@live.dk>, 2017\n"
|
||||
"Language-Team: Danish (Denmark) (https://www.transifex.com/solus-project/teams/68407/da_DK/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: da_DK\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integration med Linux Steam®"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Styr opførslen af Steam-klienten og spil. Indstillingerne vil ikke træde i "
|
||||
"kraft før Steam-klienten er blevet genstartet. Brug 'Afslut Steam' for af "
|
||||
"sikre at programmet lukkes."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Brug nativ runtime"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Skift mellem nativ runtime og den runtime som følger med Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr ""
|
||||
"Denne mulighed er blevet deaktiveret eftersom systemet allerede er 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Det løser muligvis problemer for nogle ødelagte spil, til gengæld "
|
||||
"deaktiveres Steam butik-browseren."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Tving 32-bit-tilstand for Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Brug intercept-biblioteket"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Tving Steam-programmer til at bruge flere native biblioteker for at "
|
||||
"maksimere kompatibilitet."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Brug redirect-biblioteket"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr "Tilsidesæt systemkald for at rette kendte fejl i nogle Linux-porte."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Kunne ikke gemme konfiguration"
|
||||
@@ -0,0 +1,90 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Thomas Staudinger <staudi.kaos@gmail.com>, 2017\n"
|
||||
"Language-Team: German (https://www.transifex.com/solus-project/teams/68407/de/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: de\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Kontrolliere das Verhalten des Steam-Clients und von Spielen. Die "
|
||||
"Einstellungen werden erst aktiv, nachdem der Steam-Client neu gestartet "
|
||||
"wurde. Nutze \"Steam beenden\", um sicherzugehen, dass es beendet wird."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Nutze native Laufzeitumgebung"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Wechsle zwischen der nativen Laufzeitumgebung und der Steam-"
|
||||
"Laufzeitumgebung."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr ""
|
||||
"Diese Option ist deaktiviert, da es sich bereits um ein 32-Bit-System "
|
||||
"handelt."
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Diese Option behebt möglicherweise Probleme mit Steam-Spielen, wird aber den"
|
||||
" Steam Store Browser deaktivieren."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Erzwinge 32-Bit-Modus für Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Nutze die Intercept-Bibliothek"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Zwinge Steam-Anwendungen dazu, mehr native Bibliotheken zu nutzen, um die "
|
||||
"Kompatibilität zu maximieren."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Nutze die Redirect-Bibliothek"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Überschreibe Systemaufrufe, um bekannte Bugs in manchen Linux-Ports zu "
|
||||
"beheben."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Konfiguration konnte nicht gespeichert werden"
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: f vg <f_vongellhorn@outlook.de>, 2017\n"
|
||||
"Language-Team: German (Switzerland) (https://www.transifex.com/solus-project/teams/68407/de_CH/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: de_CH\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration "
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Kontrolliere das Verhalten des Steam-Clients und der Spiele. Die "
|
||||
"Einstellungen werden erst wirksam, wenn der Steam Client neu gestartet wird."
|
||||
" Verwenden Sie die Option \"Steam beenden\", um sicherzustellen, dass Steam "
|
||||
"geschlossen wird."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Verwende Systemeigene Laufzeitumgebung "
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Wechseln zwischen Systemeigene und der gebündelten Steam Laufzeitumgebung"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr ""
|
||||
"Diese Option wurde deaktiviert, da das System bereits auf 32-Bit läuft."
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Dies könnte einige Probleme von fehlerhafte Spiele umgehen, wird jedoch den "
|
||||
"Steam Store Browser deaktivieren. "
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Erzwinge den 32-Bit-Modus für Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Verwende die intercept-Bibliothek "
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Zwingen Sie die Steam-Anwendungen dazu mehr Systemeigene Bibliotheken zu "
|
||||
"verwenden, um die Kompatibilität zu maximieren."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Verwende die Redirect-Bibliothek "
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Überschreiben Sie Systemaufrufe, um bekannte Fehler in einigen Linux-Ports "
|
||||
"zu beheben."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Konfiguration konnte nicht gespeichert werden"
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-19 12:48+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: \n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:132 src/frontend/main-window.c:149
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration"
|
||||
|
||||
#: src/frontend/main-window.c:163
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Use native runtime"
|
||||
msgstr "Use native runtime"
|
||||
|
||||
#: src/frontend/main-window.c:193
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Switch between the native runtime and the bundled Steam runtime."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:202
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "This option has been disabled as the system is already 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:206
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
|
||||
#: src/frontend/main-window.c:211
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Force 32-bit mode for Steam"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Use the intercept library"
|
||||
|
||||
#: src/frontend/main-window.c:220
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Use the redirect library"
|
||||
|
||||
#: src/frontend/main-window.c:230
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr "Override system calls to fix known bugs in some Linux ports."
|
||||
|
||||
#: src/frontend/main-window.c:237
|
||||
msgid "Use the Unity fullscreen workaround"
|
||||
msgstr "Use the Unity fullscreen workaround"
|
||||
|
||||
#: src/frontend/main-window.c:238
|
||||
msgid ""
|
||||
"Prevent some Unity games from launching in full screen mode to fix numerous "
|
||||
"issues"
|
||||
msgstr ""
|
||||
"Prevent some Unity games from launching in full screen mode to fix numerous "
|
||||
"issues"
|
||||
|
||||
#: src/frontend/main-window.c:403
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Failed to save configuration"
|
||||
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Pablo Chere <pablo.foche@gmail.com>, 2017\n"
|
||||
"Language-Team: Esperanto (https://www.transifex.com/solus-project/teams/68407/eo/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: eo\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Steam® Linuksa Integriĝo"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Ĝi kontrolas la konduton de la Steam-kliento kaj la ludoj. Agordoj ne "
|
||||
"efektiviĝos ĝis la restartigo de la Steam-kliento. Uzu la elekton \"Eliri el"
|
||||
" Steam\" por certiĝi pri tio ke ĝi fermiĝas."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Uzi denaskan rultempon"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Ŝanĝi inter la denaska rultempo kaj la faskigita rultempo de Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Ĉi tiu elekto estis malŝaltita kaj la sistemo estas ankoraŭ 32-bita."
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Ĉi tio povas funkciigi kelkajn rompitajn ludojn sed malŝaltos la navigilon "
|
||||
"de la Steam-vendejo."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Devigi 32-bitan reĝimon por Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Uzi la interkaptan bibliotekon"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Devigi la aplikaĵojn de Steam uzi pliajn denaskajn bibliotekojn por "
|
||||
"maksimumigi kongruecon"
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Uzi la alidirektan bibliotekon"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Transpasi sistemajn alvokojn por solvi konatajn erarojn en kelkaj linuksaj "
|
||||
"portoj."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Agordo-konservado malsukcesis"
|
||||
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: mrkucho <vhugo642@gmail.com>, 2017\n"
|
||||
"Language-Team: Spanish (https://www.transifex.com/solus-project/teams/68407/es/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: es\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controla el comportamiento del cliente y los juegos de Steam. La "
|
||||
"configuración no tendrá efecto hasta que el cliente de Steam se reinicie. "
|
||||
"Use la opción 'Salir de Steam' para asegurarse de que se cierre."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Usar librerías nativas"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Cambie entre las librerías nativas y las incluidas por Steam"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Esta opción ha sido desactivada ya que el sistema ya es de 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Esto puede mejorar algunos juegos rotos, pero desactivará el navegador de la"
|
||||
" tienda de Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forzar modo de 32-bit para Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Usar librería de intercepción"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Forzar a las aplicaciones de Steam a usar más librerías del sistema para "
|
||||
"maximizar la compatibilidad."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Usar librería de redirección"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Anular las llamadas del sistema para solucionar algunos problemas conocidos "
|
||||
"en adaptaciones de Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Error al guardar la configuración"
|
||||
@@ -0,0 +1,87 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: mrkucho <vhugo642@gmail.com>, 2017\n"
|
||||
"Language-Team: Spanish (Latin America) (https://www.transifex.com/solus-project/teams/68407/es_419/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: es_419\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controla el comportamiento del cliente y los juegos de Steam. La "
|
||||
"configuración no tendrá efecto hasta que el cliente de Steam se reinicie. "
|
||||
"Use la opción 'Salir de Steam' para asegurarse de que se cierre."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Usar librerías nativas"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Cambie entre las librerías nativas del sistema y las incluidas por Steam"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Esta opción ha sido desactivada ya que el sistema ya es de 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Esto puede mejorar algunos juegos rotos, pero desactivará el navegador de la"
|
||||
" tienda de Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forzar modo de 32-bit para Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Utilizar librería de intercepción"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Forzar a las aplicaciones de Steam a usar más librerías nativas para "
|
||||
"maximizar la compatibilidad."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Utilizar la biblioteca de redirección"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Anular las llamadas del sistema para solucionar algunos problemas conocidos "
|
||||
"en adaptaciones de Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Error al guardar la configuración"
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Abe Linux <m.delvalle01@gmail.com>, 2017\n"
|
||||
"Language-Team: Spanish (Argentina) (https://www.transifex.com/solus-project/teams/68407/es_AR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: es_AR\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integración Steam® para Linux"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controla el comportamiento del cliente y juegos de Steam. Las preferencias "
|
||||
"no tomarán efecto hasta que el cliente de Steam sea reiniciado. Usa la "
|
||||
"opción \"Salir de Steam\" para asegurarte de que se cierre."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Usar el entorno nativo"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Cambiar entre el entorno nativo y el incluido por Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Esta opción ha sido deshabilitada dado que el sistema ya es de 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Esto puede solucionar algunos juegos que no funcionen, pero deshabilitará la"
|
||||
" tienda Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forzar modo 32-bit para Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Usar la librería intercept"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Forzar a las aplicaciones de Steam a utilizar más librerías nativas para "
|
||||
"maximizar la compatibilidad."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Usar la librería intercept"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Sobrescribir llamadas de sistema para corregir problemas conocidos en "
|
||||
"algunas adaptaciones de juegos para Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Falló en guardar la configuración"
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: mrkucho <vhugo642@gmail.com>, 2017\n"
|
||||
"Language-Team: Spanish (Spain) (https://www.transifex.com/solus-project/teams/68407/es_ES/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: es_ES\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controla el comportamiento del cliente y los juegos de Steam. La "
|
||||
"configuración no tendrá efecto hasta que el cliente de Steam se reinicie. "
|
||||
"Use la opción 'Salir de Steam' para asegurarse de que se cierre."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Usar librerías nativas"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Cambie entre las librerías nativas y las incluidas por Steam"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Esta opción ha sido desactivada ya que el sistema ya es de 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Esto puede mejorar algunos juegos rotos, pero desactivará el navegador de la"
|
||||
" tienda de Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forzar modo de 32-bit para Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Usar librería de intercepción"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Forzar a las aplicaciones de Steam a usar más librerías del sistema para "
|
||||
"maximizar la compatibilidad."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Usar librería de redirección"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Anular las llamadas del sistema para solucionar algunos problemas conocidos "
|
||||
"en adaptaciones de Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Error al guardar la configuración"
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Fernando Macias <FernandoMaciasR@yahoo.com.mx>, 2017\n"
|
||||
"Language-Team: Spanish (Mexico) (https://www.transifex.com/solus-project/teams/68407/es_MX/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: es_MX\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integración de Steam® con Linux"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controla el comportamiento del cliente y los juegos de Steam. Los ajustes no"
|
||||
" tendrán efecto hasta que el cliente de Steam sea reiniciado. Use la opción "
|
||||
"de 'Salir de Steam' para asegurarse de que sea cerrado."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Usar tiempo de ejecución nativo"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Cambia entre el tiempo de ejecución nativo y el tiempo de ejecución incluido"
|
||||
" en Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr ""
|
||||
"Esta opción ha sido deshabilitada debido a que el sistema ya es de 32 bits"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Esto puede solucionar algunos juegos que no funcionen, pero desactivará el "
|
||||
"navegador de la tienda de Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forzar modo de 32 bits para Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Usar la librería de intercepción"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Forzar a las aplicaciones de Steam a que utilizen más librerias nativas para"
|
||||
" maximizar la compatibilidad."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Usar la librería de redirección"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Anular las llamadas del sistema para corregir errores conocidos en algunos "
|
||||
"puertos Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "No se pudo guardar la configuración"
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: mrkucho <vhugo642@gmail.com>, 2017\n"
|
||||
"Language-Team: Spanish (Peru) (https://www.transifex.com/solus-project/teams/68407/es_PE/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: es_PE\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controla el comportamiento del cliente y los juegos de Steam. La "
|
||||
"configuración no tendrá efecto hasta que el cliente de Steam se reinicie. "
|
||||
"Use la opción 'Salir de Steam' para asegurarse de que se cierre."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Usar librerías nativas"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Cambie entre las librerías nativas del sistema y las incluidas por Steam"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Esta opción ha sido desactivada ya que el sistema ya es de 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Esto puede mejorar algunos juegos rotos, pero desactivará el navegador de la"
|
||||
" tienda de Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forzar modo de 32-bit para Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Usar librería de intercepción"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Forzar a las aplicaciones de Steam a usar más librerías del sistema para "
|
||||
"maximizar la compatibilidad."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Usar librería de redirección"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Anular las llamadas del sistema para solucionar algunos problemas conocidos "
|
||||
"en adaptaciones de Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Error al guardar la configuración"
|
||||
@@ -0,0 +1,88 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Kim Kröger <kroger.kim@gmail.com>, 2017\n"
|
||||
"Language-Team: Finnish (https://www.transifex.com/solus-project/teams/68407/fi/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: fi\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integraatio"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Ohjaa Steam-sovelluksen ja -pelien toimintaa. Asetukset tulevat voimaan "
|
||||
"vasta Steam-sovelluksen uudelleenkäynnistyksen myötä. Käytä \"Sulje Steam\" "
|
||||
"-toimintoa varmistaaksesi sen sulkeutumisen."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Käytä paikallista ohjelmakirjastoa"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Vaihda paikallisen ohjelmakirjaston ja Steamin mukana tulevan "
|
||||
"ohjelmakirjaston välillä."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Tämä asetus ei ole käytössä, koska järjestelmä on jo 32-bittinen"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Tämä voi väliaikaisesti korjata joidenkin pelien yhteensopivuusongelmat, "
|
||||
"mutta ottaa myös Steamin Kaupan pois käytöstä."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Pakota 32-bittinen tila Steamille"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Käytä intercept-kirjastoa"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Pakottaa Steamin sovellusten käyttämään enemmän paikallisia "
|
||||
"ohjelmakirjastoja yhteensopivuuden maksimoimiseksi."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Käytä redirect-kirjastoa"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Ohittaa järjestelmän kutsut tunnettujen ongelmien korjaamiseksi joissakin "
|
||||
"peleissä."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Asetusten tallentaminen epäonnistui"
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Serge <vanmechelen.serge@gmail.com>, 2017\n"
|
||||
"Language-Team: French (France) (https://www.transifex.com/solus-project/teams/68407/fr_FR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: fr_FR\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Intégration Steam® Linux"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Contrôle le comportement du client et des jeux Steam. Les paramètres ne "
|
||||
"prendront effet qu'après le redémarrage du client Steam. Utilisez l'option "
|
||||
"'Quitter Steam' pour vous assurer que l'application a bien été arrêtée."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Utiliser l'environnement d'exécution natif"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Basculer entre l'environnement d'exécution natif et l'environnement "
|
||||
"d'exécution Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Cette option a été désactivée car le système est déjà en 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Ceci permet d'éviter des problèmes rencontrés avec certains jeux mais "
|
||||
"désactive le magasin Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forcer le mode 32-bit pour Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Utiliser la bibliothèque d'interception"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Obliger les applications Steam à utiliser davantage de bibliothèques natives"
|
||||
" pour maximiser la compatibilité."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Utiliser la bibliothèque de redirection"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Remplacer les appels système pour corriger les bogues connus pour certains "
|
||||
"ports sous Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Echec dans la sauvegarde de la configuration"
|
||||
@@ -0,0 +1,81 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Moshe Sh <7moshe7@gmail.com>, 2017\n"
|
||||
"Language-Team: Hebrew (https://www.transifex.com/solus-project/teams/68407/he/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: he\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "שילוב לינוקס וסטים "
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"שליטה על ההתנהגות של Steam Client ומשחקים. ההגדרות לא יכנסו לתוקף עד להפעלה "
|
||||
"מחדש של Steam Client. מומלץ להשתמש באופציה 'יציאה מסטים' על מנת לוודא שנסגר."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "שימוש בהרצה מקומית"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "החלפה בין הרצה מקומית להרצה של סטים."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "אפשרות זו הושבתה מאחר שהמערכת כבר 32 סיביות"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"פעולה זו עשויה לעקוף בעיה של כמה משחקים לא תקינים, אבל ישבית את הדפדפן של "
|
||||
"חנות סטים."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "הכרח מצב 32 סיביות עבור סטים"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "שימוש בספריית intercept"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr "הכרח יישומי סטים להשתמש בספריות מקומיות כדי להגדיל את התאימות."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "שימוש בספריית redirect"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr "מעקף לקריאות המערכת כדי לתקן באגים ידועים בכמה יציאות לינוקס."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "שמירת ההגדרות נכשלה"
|
||||
@@ -0,0 +1,87 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Kevin Németh <keiro@vivaldi.net>, 2017\n"
|
||||
"Language-Team: Hungarian (https://www.transifex.com/solus-project/teams/68407/hu/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: hu\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Szabályozza a Steam-kliens működését és a játékokat. A beállításoknak nem "
|
||||
"lesz hatásuk a Steam-kliens újraindításáig. Használja a 'Kilépés a Steamből'"
|
||||
" opciót, hogy biztosan bezáródjon."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Natív futtatási környezet használata"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Váltás a natív futtási környezet és a csomagolt Steam futtatási környezet "
|
||||
"között."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Ez az opció le van tiltva, ha a rendszer már 32 bites."
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Ez megoldja néhány játék problémáját, de le fogja tiltani a Steam Áruház "
|
||||
"keresőjét."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "32 bites mód kényszerítése a Steamnek"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Az elfogó könyvtár használata"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Steam alkalmazások kényszerítése a natív könyvtársak használatára a "
|
||||
"kompatibilitás maximalizálására."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Az átirányítási könyvtár használata"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Rendszerhívások felüllbírálása ismert bugok javítására néhány Linux porton."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "A konfiguráció mentése sikertelen"
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Yurizal Susanto <rizal.sagi@gmail.com>, 2017\n"
|
||||
"Language-Team: Indonesian (Indonesia) (https://www.transifex.com/solus-project/teams/68407/id_ID/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: id_ID\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integrasi Steam® Linux"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Atur sifat klien Steam dan permainan. Pengaturan tidak akan berlaku sebelum "
|
||||
"klien Steam dimulai ulang. Gunakan pilihan 'Exit Steam' untuk memastikan "
|
||||
"klien tertutup."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Gunakan runtime bawaan"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Tukar antara runtime bawaan dan runtime yang dibundel Steam"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Pilihan ini dimatikan karena sistem sudah 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Ini bisa menyelesaikan masalah pada beberapa permainan, tapi akan "
|
||||
"menonaktifkan penjelajahan toko Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Paksa mode 32-bit untuk Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Gunakan pustaka pencegat"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Paksa aplikasi Steam untuk menggunakan lebih banyak pustaka bawaan untuk "
|
||||
"memaksimalkan kompabilitas."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Gunakan pustaka pengalihan"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Timpa panggilan sistem untuk memperbaiki bug yang diketahui di beberapa port"
|
||||
" Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Gagal menyimpan konfigurasi"
|
||||
+98
@@ -0,0 +1,98 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-19 12:48+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Fabio <fabio0x@keemail.me>, 2017\n"
|
||||
"Language-Team: Italian (Italy) (https://www.transifex.com/solus-project/teams/68407/it_IT/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: it_IT\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:132 src/frontend/main-window.c:149
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration"
|
||||
|
||||
#: src/frontend/main-window.c:163
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controlla il comportamento dei giochi e del client Steam. Le impostazioni "
|
||||
"non avranno effetto finché il client Steam non sarà riavviato. Usa l'opzione"
|
||||
" \"Esci da Steam\" per assicurarti che venga davvero chiuso."
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Use native runtime"
|
||||
msgstr "Use ambiente di runtime nativo"
|
||||
|
||||
#: src/frontend/main-window.c:193
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Scegli tra l'ambiente di runtime nativo e quello integrato in Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:202
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Questa opzione è disabilitata perché il sistema è già a 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:206
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Può correggere alcuni giochi non funzionanti, ma disabiliterà la navigazione"
|
||||
" nel negozio Steam."
|
||||
|
||||
#: src/frontend/main-window.c:211
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forza Steam a 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Usa la libreria di intercettazione"
|
||||
|
||||
#: src/frontend/main-window.c:220
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Forza le applicazioni di Steam a usare ancor più librerie native per "
|
||||
"massimizzare la compatibilità."
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Usa la libreria di redirezione"
|
||||
|
||||
#: src/frontend/main-window.c:230
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Sostituisce le chiamate di sistema per correggere i bug noti di alcuni "
|
||||
"porting su Linux."
|
||||
|
||||
#: src/frontend/main-window.c:237
|
||||
msgid "Use the Unity fullscreen workaround"
|
||||
msgstr "Aggira il problema di Unity a schermo intero"
|
||||
|
||||
#: src/frontend/main-window.c:238
|
||||
msgid ""
|
||||
"Prevent some Unity games from launching in full screen mode to fix numerous "
|
||||
"issues"
|
||||
msgstr ""
|
||||
"Evita che alcuni giochi basati su Unity partano a schermo intero per "
|
||||
"correggere svariate problematiche"
|
||||
|
||||
#: src/frontend/main-window.c:403
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Errore durante il salvataggio della configurazione"
|
||||
@@ -0,0 +1,80 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: jemin_jeon <jemin.jeon@posteo.net>, 2017\n"
|
||||
"Language-Team: Korean (https://www.transifex.com/solus-project/teams/68407/ko/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ko\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "리눅스 스팀® 통합 설정"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"스팀 클라이언트와 게임의 작동방식을 설정합니다. 설정값은 스팀 클라이언트를 재시작하면 적용됩니다. \"스팀 종료하기\" 옵션을 이용해서 "
|
||||
"스팀이 확실히 종료되게 해주세요."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "리눅스 자체 런타임 사용하기"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "리눅스 자체 런타임과 스팀 내장 런타임간 전환하기"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "시스템이 이미 32비트 운영체제이므로 이 옵션은 비활성화 되었습니다."
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"이 옵션을 활성화하면 올바르게 실행되지 않는 특정 게임이 정상 작동 할 수도 있습니다. 그러나 스팀 상점은 이용이 불가능합니다."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "스팀이 32비트 모드에서 실행되도록 강제합니다."
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Intercept 라이브러리를 사용합니다."
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr "스팀이 더 많은 리눅스 자체 라이브러리를 사용하여 호환성을 최대화 할 수 있도록 강제합니다."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Redirect 라이브러리 사용하기"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr "시스템 콜을 오버라이드하여 리눅스로 이식된 프로그램에서 발생하는 알려진 특정 오류를 수정합니다."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "설정 저장에 실패했습니다."
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: jemin_jeon <jemin.jeon@posteo.net>, 2017\n"
|
||||
"Language-Team: Korean (Korea) (https://www.transifex.com/solus-project/teams/68407/ko_KR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ko_KR\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "리눅스 스팀® 통합 설정"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"스팀 클라이언트와 게임의 작동방식을 설정합니다. 설정값은 스팀 클라이언트를 재시작하면 적용됩니다. \"스팀 종료하기\" 옵션을 이용해서 "
|
||||
"스팀이 확실히 종료되게 해주세요."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "리눅스 자체 런타임 사용하기"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "리눅스 자체 런타임과 스팀 내장 런타임간 전환하기"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "시스템이 이미 32비트 운영체제이므로 이 옵션은 비활성화 되었습니다."
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"이 옵션을 활성화하면 올바르게 실행되지 않는 특정 게임이 정상 작동 할 수도 있습니다. 그러나 스팀 상점은 이용이 불가능합니다."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "스팀이 32비트 모드에서 실행되도록 강제합니다."
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Intercept 라이브러리를 사용합니다."
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr "스팀이 더 많은 리눅스 자체 라이브러리를 사용하여 호환성을 최대화 할 수 있도록 강제합니다."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Redirect 라이브러리 사용하기"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr "시스템 콜을 오버라이드하여 리눅스로 이식된 프로그램에서 발생하는 알려진 특정 오류를 수정합니다."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "설정 저장에 실패했습니다."
|
||||
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-19 12:48+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:132 src/frontend/main-window.c:149
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:163
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Use native runtime"
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:193
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:202
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:206
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:211
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid "Use the intercept library"
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:220
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Use the redirect library"
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:230
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:237
|
||||
msgid "Use the Unity fullscreen workaround"
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:238
|
||||
msgid ""
|
||||
"Prevent some Unity games from launching in full screen mode to fix numerous "
|
||||
"issues"
|
||||
msgstr ""
|
||||
|
||||
#: src/frontend/main-window.c:403
|
||||
msgid "Failed to save configuration"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,99 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-19 12:48+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Moo <moose@mail.ru>, 2017\n"
|
||||
"Language-Team: Lithuanian (https://www.transifex.com/solus-project/teams/68407/lt/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: lt\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:132 src/frontend/main-window.c:149
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® integracija"
|
||||
|
||||
#: src/frontend/main-window.c:163
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Valdykite Steam kliento ir žaidimų elgseną. Nustatymai neįsigalios tol, kol "
|
||||
"Steam klientas nebus paleistas iš naujo. Norėdami užtikrinti, kad programa "
|
||||
"Steam baigtų darbą, naudokite parametrą \"Išeiti iš Steam\"."
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Use native runtime"
|
||||
msgstr "Naudoti savą vykdymo aplinką"
|
||||
|
||||
#: src/frontend/main-window.c:193
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Perjungti tarp savos vykdymo aplinkos ir pridėtinės Steam vykdymo aplinkos."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:202
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Šis parametras buvo išjungtas, nes sistema jau ir yra 32-bitų"
|
||||
|
||||
#: src/frontend/main-window.c:206
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Tai galėti padėti apeiti kai kurių neveikiančių žaidimų problemas, tačiau "
|
||||
"išjungs Steam parduotuvės naršyklę."
|
||||
|
||||
#: src/frontend/main-window.c:211
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Programai Steam priverstinai naudoti 32-bitų veikseną"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Naudoti perėmimo biblioteką"
|
||||
|
||||
#: src/frontend/main-window.c:220
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Priversti Steam programas naudoti labiau savas bibliotekas, siekiant "
|
||||
"padidinti suderinamumą."
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Naudoti peradresavimo biblioteką"
|
||||
|
||||
#: src/frontend/main-window.c:230
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Nustelbti sistemines iškvietas, siekiant pataisyti žinomas klaidas kai "
|
||||
"kuriuose Linux perkėlimuose."
|
||||
|
||||
#: src/frontend/main-window.c:237
|
||||
msgid "Use the Unity fullscreen workaround"
|
||||
msgstr "Naudoti Unity viso ekrano problemos apėjimą"
|
||||
|
||||
#: src/frontend/main-window.c:238
|
||||
msgid ""
|
||||
"Prevent some Unity games from launching in full screen mode to fix numerous "
|
||||
"issues"
|
||||
msgstr ""
|
||||
"Neleisti kai kuriems Unity žaidimams pasileisti viso ekrano veiksenoje, "
|
||||
"siekiant pataisyti daugelį klaidų"
|
||||
|
||||
#: src/frontend/main-window.c:403
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Nepavyko įrašyti konfigūracijos"
|
||||
@@ -0,0 +1,3 @@
|
||||
i18n = import('i18n')
|
||||
|
||||
i18n.gettext(meson.project_name(), preset: 'glib')
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Lars-Eivind Bjørtvedt <larseivind.bjoertvedt@gmail.com>, 2017\n"
|
||||
"Language-Team: Norwegian Bokmål (Norway) (https://www.transifex.com/solus-project/teams/68407/nb_NO/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: nb_NO\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integrasjon"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Endre oppførselen til Steam-klienten og spill. Innstillingene vil ikke tre i"
|
||||
" kraft før Steam-klienten er restartet. Bruk 'Avslutt Steam '-valget for å "
|
||||
"være sikker på at det lukkes helt."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Bruk lokal kjøreomgivelse"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Bytt mellom lokal kjøreomgivelse og Steams innebygde kjøreomgivelse."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Dette valget er deaktivert siden systemet allerede er 32-bits"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Dette kan få visse defekte spill til å fungere, men vil deaktivere "
|
||||
"nettleseren i Steam-butikken."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Tving 32-bits modus for Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Bruk avskjæringsbiblioteket"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Tving Steam-applikasjoner til å bruke flere lokale kjøreomgivelser for å "
|
||||
"maksimere kompatibiliteten."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Bruk videresendingsbiblioteket"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Overstyr systemkall for å fikse kjente feil i enkelte Linux-versjoner av "
|
||||
"spill."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Kunne ikke lagre konfigurasjon"
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Rabin Adhikari <rabin.adk1@gmail.com>, 2017\n"
|
||||
"Language-Team: Nepali (Nepal) (https://www.transifex.com/solus-project/teams/68407/ne_NP/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ne_NP\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "लिनक्स स्टिम® एकीकरण"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"स्टिम क्लाइन्ट र खेलहरूको व्यवहार नियन्त्रण गर्नुहोस्। स्टिम क्लाइन्ट पुन: "
|
||||
"सुरु नभएसम्म सेटिङहरूमा प्रभाव पर्ने छैन। यो बन्द गर्न सुनिश्चित गर्नको लागि"
|
||||
" 'बाहिर निस्कनुहोस्' विकल्प प्रयोग गर्नुहोस्।"
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "मूल रनटाइम प्रयोग गर्नुहोस्"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "मूल रनटाइम र बन्डल स्टिम रनटाइम बीच स्विच गर्नुहोस्।"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "यो विकल्प असक्षम गरिएको छ किनभने प्रणाली पहिले नै 32-बिट छ"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"यसले केही बिच्छेद खेलहरूको गर्न वैकल्पिक समाधान गर्न सक्दछ, तर स्टिम भण्डार "
|
||||
"ब्राउजर असक्षम पार्नेछ।"
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "स्टिमको लागि 32-बिट मोड बल गर्नुहोस्"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "इन्टरसेप्ट लाइब्रेरी प्रयोग गर्नुहोस्"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"अनुकूलता अधिकतम गर्नका लागी थप मूल पुस्तकालयहरू प्रयोग गर्न स्टिम "
|
||||
"एप्लिकेसनहरूलाई बल गर्नुहोस्।"
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "पुन: निर्देशित पुस्तकालय प्रयोग गर्नुहोस्"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"केहि लिनक्स पोर्टहरूमा ज्ञात बगहरू ठीक गर्न प्रणाली कलहरू ओभरराइड गर्नुहोस्।"
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "कन्फिगरेसन सुरक्षित गर्न असफल भयो"
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Geert Verheyde <geert.verheyde@gmail.com>, 2017\n"
|
||||
"Language-Team: Dutch (Belgium) (https://www.transifex.com/solus-project/teams/68407/nl_BE/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: nl_BE\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Beheer het gedrag van de Steam Client en games. Wijzigingen zijn pas "
|
||||
"effectief na het herstarten van de Steam Client. Gebruik de \"Exit Steam\" "
|
||||
"optie om definitief af te sluiten."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Gebruik de systeemeigen runtime"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Wissel tussen de systeemeigen runtime en de gebundelde Steam runtime"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Deze optie werd uitgezet omdat het systeem reeds 32-bit is"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Dit kan gebroken games doen werken, maar zal de Steam store browser "
|
||||
"uitzetten."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forceer 32-bit modus voor Steam."
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Gebruik de opvangende bibliotheek"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Forceer Steam toepassingen meer systeemeigen bibliotheken te gebruiken om de"
|
||||
" compatibiliteit te maximaliseren"
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Gebruik de omleidende bibliotheek"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Negeer systeemoproepen om gekende fouten te herstellen in bepaalde Linux "
|
||||
"ports"
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Het opslaan van de configuratie is mislukt."
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Thimo dZ <tsdezwart@protonmail.com>, 2017\n"
|
||||
"Language-Team: Dutch (Netherlands) (https://www.transifex.com/solus-project/teams/68407/nl_NL/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: nl_NL\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Beheer het gedrag van de Steam-client en spellen. De wijzigingen zijn pas "
|
||||
"effectief na het herstarten van de Steam-client. Gebruik de \"Steam "
|
||||
"afsluiten\"-optie om Steam definitief af te sluiten."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Gebruik de systeemeigen runtime"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Wissel tussen de systeemeigen runtime en de gebundelde Steam runtime"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Deze optie is uitgeschakeld omdat het systeem reeds 32-bit is"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Dit kan niet werkende spellen doen werken, maar zal de Steam store browser "
|
||||
"uitschakelen."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forceer 32-bitsmodus voor Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Gebruik de opvangende bibliotheek"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Forceer Steam-toepassingen meer systeemeigen bibliotheken te gebruiken om de"
|
||||
" compatibiliteit te maximaliseren."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Gebruik de omleidende bibliotheek"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Negeer systeemoproepen om bekende fouten te herstellen in bepaalde Linux-"
|
||||
"ports"
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Het opslaan van de configuratie is mislukt"
|
||||
@@ -0,0 +1,88 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Kacper Herchel <kacperski1@gmail.com>, 2017\n"
|
||||
"Language-Team: Polish (https://www.transifex.com/solus-project/teams/68407/pl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: pl\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integracja Linuksa ze Steam®"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Zarządzaj zachowaniem klienta Steam i gier. Ustawienia dadzą efekt dopiero "
|
||||
"po zrestartowaniu klienta Steam. Użyj opcji „Zamknij Steam” aby upewnić się,"
|
||||
" że klient został zamknięty."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Używaj natywnego środowiska"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Przełączaj się między natywnym środowiskiem uruchomieniowym i wersją "
|
||||
"dołączaną do klienta Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Ta opcja została zablokowana, ponieważ używany system jest 32-bitowy"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"To może naprawić działanie niektórych gier, ale wyłączy możliwość "
|
||||
"przeglądania sklepu Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Wymuś tryb 32-bitowy dla Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Używaj biblioteki przechwytującej"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Wymusza na grach Steam używanie większej ilości natywnych bibliotek, co "
|
||||
"zwiększa kompatybilność."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Używaj biblioteki przekierowującej"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Nadpisuje wywołania systemowe, aby poprawić błędy w niektórych linuksowych "
|
||||
"portach."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Nie udało się zapisać konfiguracji"
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Kacper Herchel <kacperski1@gmail.com>, 2017\n"
|
||||
"Language-Team: Polish (Poland) (https://www.transifex.com/solus-project/teams/68407/pl_PL/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: pl_PL\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integracja Linuksa ze Steam®"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Zarządzaj zachowaniem klienta Steam i gier. Ustawienia dadzą efekt dopiero "
|
||||
"po zrestartowaniu klienta Steam. Użyj opcji „Opuść Steam” aby upewnić się, "
|
||||
"że klient został zamknięty."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Używaj natywnego środowiska"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Przełączaj się między natywnym środowiskiem uruchomieniowym i wersją "
|
||||
"dołączaną do klienta Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Ta opcja została zablokowana, ponieważ używany system jest 32-bitowy"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"To może naprawić działanie niektórych gier, ale wyłączy możliwość "
|
||||
"przeglądania sklepu Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Wymuś tryb 32-bitowy dla Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Używaj biblioteki przechwytującej"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Wymusza na grach Steam używanie większej ilości natywnych bibliotek, co "
|
||||
"zwiększa kompatybilność."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Używaj biblioteki przekierowującej"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Nadpisuje wywołania systemowe, aby poprawić błędy w niektórych linuksowych "
|
||||
"portach."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Nie udało się zapisać konfiguracji"
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Marcelo Ferreira <marceloffdeoliveira@gmail.com>, 2017\n"
|
||||
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/solus-project/teams/68407/pt_BR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: pt_BR\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integração Steam® com Linux"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controla o comportamento dos jogos e do programa da Steam. As configurações "
|
||||
"não terão efeito até que o programa seja reiniciado. Utilize a opção \"Sair "
|
||||
"da Steam\" para garantir que ele seja fechado."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Usar runtime nativo"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Alternar entre o runtime nativo e o incluso da Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Esta opção foi desativada, uma vez que o sistema já é de 32-bits"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Isto pode funcionar em alguns jogos defeituosos, mas irá desativar o "
|
||||
"navegador da loja da Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forçar modo 32-bits para a Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Usar a biblioteca de interceptação"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Forçar aplicativos da Steam a usar mais bibliotecas nativas para maximizar a"
|
||||
" compatibilidade."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Usar a biblioteca de redirecionamento"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Sobrescrever chamadas do sistema para corrigir bugs conhecidos em algumas "
|
||||
"adaptações para Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Falha ao salvar configuração"
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Christophe Silva <christophesilva80@gmail.com>, 2017\n"
|
||||
"Language-Team: Portuguese (Portugal) (https://www.transifex.com/solus-project/teams/68407/pt_PT/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: pt_PT\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integração Linux Steam®"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controla o comportamento do cliente e jogos em Steam. As configurações não "
|
||||
"terão efeito antes de o Cliente de Steam ser reinicializado. Use a opção "
|
||||
"\"Sair do Steam\" para ter a certeza que o cliente fecha."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Usar \"runtime\" nativo"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Alternar entre o \"runtime\" nativo e o \"runtime\" Steam incluído."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Esta opção foi desativada, já que o sistema já possui 32 bits"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Isto pode resolver alguns jogos danificados, mas irá desativar o navegador "
|
||||
"da loja Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forçar o modo de 32 bits para Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Use a biblioteca de intercetação"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Força aplicativos do Steam para usar mais bibliotecas nativas para maximizar"
|
||||
" a compatibilidade."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Use a biblioteca de redirecionamento"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Substitua as chamadas do sistema para corrigir erros conhecidos em algumas "
|
||||
"portas Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Falha ao salvar a configuração"
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Andrei B <snoozeisdoze@gmail.com>, 2017\n"
|
||||
"Language-Team: Romanian (Romania) (https://www.transifex.com/solus-project/teams/68407/ro_RO/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ro_RO\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Integrare Steam® Linux"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Controleaza comportamentul jocurilor si al clientului Steam. Setarile nu vor"
|
||||
" avea efect pana cand Clientul Steam nu este restartat. Utilizati optiunea "
|
||||
"\"Exit Steam\" pentru a va asigura ca se inchide."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Utilizati runtime-ul nativ"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Comuta intre runtime-ul nativ si cel inclus in Steam"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Aceasta optiune a fost dezactivata deoarece sistemul este deja 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Aceasta poate fi o solutie pentru unele jocuri nefunctionale, dar va "
|
||||
"dezactiva navigatorul magazinul Steam."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Forteaza modul 32-bit pentru Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Utilizati libraria de interceptare"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Fortati aplicatiile Steam sa foloseasca mai multe librarii native pentru a "
|
||||
"maximiza compatibilitatea."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Utilizati libraria de redirectionare"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Suprascrie apelurile de sistem pentru a repara erori cunoscute in unele "
|
||||
"portari Linux."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Nu s-a reusit salvarea configuratiei"
|
||||
@@ -0,0 +1,88 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Alex Vorobyev <avorobyev@protonmail.com>, 2017\n"
|
||||
"Language-Team: Russian (https://www.transifex.com/solus-project/teams/68407/ru/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Интеграция Steam в Linux"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Настройте поведение клиента Steam и игр. Настройки не возымеют эффекта, пока"
|
||||
" клиент Steam не будет перезапущен. Выберите пункт \"Выход из Steam\", чтобы"
|
||||
" закрыть клиент."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Использовать системные библиотеки"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Переключение между системными библиотеками и библиотеками, поставляемыми с "
|
||||
"клиентом Steam."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Эта настройка отключена, поскольку система является 32-битной"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Эта настройка может помочь с запуском некоторых \"сломанных\" игр, но при "
|
||||
"этом магазин Steam будет недоступен."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Включить 32-битный режим в Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Использовать библиотеку intercept"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Приложения в Steam будут использовать системные библиотеки для лучшей "
|
||||
"совместимости."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Использовать библиотеку redirect"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Перехват системных вызовов в некоторых Linux-портах для исправления "
|
||||
"известных ошибок."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Не удалось сохранить конфигурацию"
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Puppelimies <max.haureus@gmail.com>, 2017\n"
|
||||
"Language-Team: Swedish (Sweden) (https://www.transifex.com/solus-project/teams/68407/sv_SE/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: sv_SE\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Integration"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Styr beteendet av Steam klienten och spel. Inställningarna kommer inte att "
|
||||
"träda i kraft förrän Steam klienten startas om. Använd 'Avsluta Steam' "
|
||||
"alternativet för att se till att den stängs."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Använd inbyggd runtime"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "Växla mellan inbyggd runtime och inkluderad Steam runtime."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Detta alternativ är inaktiverat eftersom systemet redan är 32-bit"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Detta kan lösa endel trasiga spel, men inaktiverar Steam butik bläddraren."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Tvinga 32-bit läge för Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Använd avledningsbiblioteket"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Tvinga Steam applikationer att använda fler inbyggda bibliotek för att "
|
||||
"maximera kompatibilitet."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Använd omdirigeringsbiblioteket"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr "Åsidosätt systemanrop för att åtgärda kända fel i vissa Linux-portar."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Spara konfiguration misslyckades"
|
||||
@@ -0,0 +1,88 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Demiray Muhterem <mdemiray@msn.com>, 2017\n"
|
||||
"Language-Team: Turkish (https://www.transifex.com/solus-project/teams/68407/tr/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: tr\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Linux Steam® Bütünleşmesi"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr ""
|
||||
"Steam istemcisinin ve oyunların davranışını denetleyin. Ayarlar, Steam "
|
||||
"İstemcisi yeniden başlatılıncaya kadar etkili olmaz. Kapanmasını sağlamak "
|
||||
"için 'Exit Steam' seçeneğini kullanın."
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "Yerel çalışma zamanını kullan"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr ""
|
||||
"Yerli çalışma zamanı ve birlikte verilen Steam çalışma zamanı arasında geçiş"
|
||||
" yapın."
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "Sistem zaten 32-bit olduğu için bu seçenek devre dışı bırakılmıştır"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr ""
|
||||
"Bu, bazı kırık oyunları geçici olarak çözebilir, ancak Steam deposu "
|
||||
"tarayıcısını devre dışı bırakır."
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "Steam için 32 bitlik modu zorla"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "Kesme kitaplığını kullanın"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr ""
|
||||
"Steam uygulamalarının uyumluluğu en üst düzeye çıkarmak için daha fazla "
|
||||
"yerel kütüphane kullanmalarını zorunlu tutun."
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "Yönlendirme kütüphanesini kullanın"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr ""
|
||||
"Bazı Linux bağlantı noktalarında bilinen hataları düzeltmek için sistem "
|
||||
"çağrılarını geçersiz kılın."
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Yapılandırma kaydedilemedi"
|
||||
Executable
+9
@@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
tx pull -a --minimum-perc=100
|
||||
|
||||
cd po
|
||||
rm LINGUAS
|
||||
|
||||
for i in *.po ; do
|
||||
echo `echo $i|sed 's/.po$//'` >> LINGUAS
|
||||
done
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the linux-steam-integration package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: linux-steam-integration\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-05 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: plantman <weihanlin@live.com>, 2017\n"
|
||||
"Language-Team: Chinese (China) (https://www.transifex.com/solus-project/teams/68407/zh_CN/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: zh_CN\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#. Sort out window bits
|
||||
#. header label
|
||||
#: src/frontend/main-window.c:131 src/frontend/main-window.c:148
|
||||
msgid "Linux Steam® Integration"
|
||||
msgstr "Steam® 的 Linux 系统整合"
|
||||
|
||||
#: src/frontend/main-window.c:162
|
||||
msgid ""
|
||||
"Control the behaviour of the Steam client and games. Settings will not take "
|
||||
"effect until the Steam Client is restarted. Use the 'Exit Steam' option to "
|
||||
"ensure it closes."
|
||||
msgstr "控制 Steam 客户端和游戏的运行方式。配置在重启后生效。使用“退出 Steam”选项来确保完全退出。"
|
||||
|
||||
#: src/frontend/main-window.c:191
|
||||
msgid "Use native runtime"
|
||||
msgstr "使用系统运行时"
|
||||
|
||||
#: src/frontend/main-window.c:192
|
||||
msgid "Switch between the native runtime and the bundled Steam runtime."
|
||||
msgstr "在系统运行时跟 Steam 自带运行时之间切换"
|
||||
|
||||
#. Label is shown to indicate we can't enable 32-bit option
|
||||
#: src/frontend/main-window.c:201
|
||||
msgid "This option has been disabled as the system is already 32-bit"
|
||||
msgstr "此选项已禁用,因为系统已经是 32 位了"
|
||||
|
||||
#: src/frontend/main-window.c:205
|
||||
msgid ""
|
||||
"This may workaround some broken games, but will disable the Steam store "
|
||||
"browser."
|
||||
msgstr "这个解决方法可能会修复某些运行不正常的游戏,但是会禁用 Steam 商店浏览器"
|
||||
|
||||
#: src/frontend/main-window.c:210
|
||||
msgid "Force 32-bit mode for Steam"
|
||||
msgstr "强制以 32 位模式运行 Steam"
|
||||
|
||||
#: src/frontend/main-window.c:218
|
||||
msgid "Use the intercept library"
|
||||
msgstr "使用 “Intercept” 库"
|
||||
|
||||
#: src/frontend/main-window.c:219
|
||||
msgid ""
|
||||
"Force Steam applications to use more native libraries to maximise "
|
||||
"compatibility."
|
||||
msgstr "强制让 Steam 尽可能使用系统自带库,以确保最好的兼容性"
|
||||
|
||||
#: src/frontend/main-window.c:228
|
||||
msgid "Use the redirect library"
|
||||
msgstr "使用 \"Redirect\" 库"
|
||||
|
||||
#: src/frontend/main-window.c:229
|
||||
msgid "Override system calls to fix known bugs in some Linux ports."
|
||||
msgstr "覆盖系统调用以修复某些已知的游戏运行问题"
|
||||
|
||||
#: src/frontend/main-window.c:383
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "无法保存配置"
|
||||
@@ -0,0 +1,4 @@
|
||||
install_data(
|
||||
'pulseaudio',
|
||||
install_dir: join_paths(path_fake_scripts_dir, 'pulseaudio'),
|
||||
)
|
||||
Executable
+12
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Work around games using libfmod which is determined to execute:
|
||||
# pulseaudio --check > /dev/null 2>&1
|
||||
|
||||
if [[ ! -z "$1" ]]; then
|
||||
if [[ "$1" == "--check" ]] ; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
exec /usr/bin/pulseaudio $*
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2017 Ikey Doherty
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
/* Mark a variable/argument as unused to skip warnings */
|
||||
#define __lsi_unused__ __attribute__((unused))
|
||||
|
||||
/* Force inlining of a function */
|
||||
#define __lsi_inline__ __attribute__((always_inline))
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,247 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <ctype.h>
|
||||
#include <pwd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "files.h"
|
||||
#include "log.h"
|
||||
#include "nica/array.h"
|
||||
#include "nica/util.h"
|
||||
#include "vdf.h"
|
||||
|
||||
DEF_AUTOFREE(VdfFile, vdf_file_close)
|
||||
|
||||
bool lsi_file_exists(const char *path)
|
||||
{
|
||||
__lsi_unused__ struct stat st = { 0 };
|
||||
return lstat(path, &st) == 0;
|
||||
}
|
||||
|
||||
const char *lsi_get_home_dir()
|
||||
{
|
||||
char *c = NULL;
|
||||
struct passwd *p = NULL;
|
||||
|
||||
c = getenv("HOME");
|
||||
if (c) {
|
||||
return c;
|
||||
}
|
||||
p = getpwuid(getuid());
|
||||
if (!p) {
|
||||
return NULL;
|
||||
}
|
||||
return p->pw_dir;
|
||||
}
|
||||
|
||||
char *lsi_get_user_config_dir()
|
||||
{
|
||||
const char *home = NULL;
|
||||
char *c = NULL;
|
||||
char *xdg_config = getenv("XDG_CONFIG_HOME");
|
||||
char *p = NULL;
|
||||
|
||||
/* Respect the XDG_CONFIG_HOME variable if it is set */
|
||||
if (xdg_config) {
|
||||
p = realpath(xdg_config, NULL);
|
||||
if (p) {
|
||||
return p;
|
||||
}
|
||||
return strdup(xdg_config);
|
||||
}
|
||||
|
||||
home = lsi_get_home_dir();
|
||||
if (asprintf(&c, "%s/.config", home) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
p = realpath(c, NULL);
|
||||
if (p) {
|
||||
free(c);
|
||||
return p;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* Just use .local/share/Steam at this point..
|
||||
*/
|
||||
static inline char *lsi_get_fallback_steam_dir(const char *home)
|
||||
{
|
||||
char *p = NULL;
|
||||
char *xdg_data = getenv("XDG_DATA_HOME");
|
||||
int r = 0;
|
||||
|
||||
/* Respect the XDG_CONFIG_HOME variable if it is set */
|
||||
if (xdg_data) {
|
||||
r = asprintf(&p, "%s/Steam", xdg_data);
|
||||
} else {
|
||||
r = asprintf(&p, "%s/.local/share/Steam", home);
|
||||
}
|
||||
|
||||
if (r < 0) {
|
||||
return NULL;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
char *lsi_get_steam_dir()
|
||||
{
|
||||
const char *homedir = NULL;
|
||||
autofree(char) *candidate = NULL;
|
||||
autofree(char) *resolv = NULL;
|
||||
|
||||
homedir = lsi_get_home_dir();
|
||||
if (asprintf(&candidate, "%s/.steam/root", homedir) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
resolv = realpath(candidate, NULL);
|
||||
if (!resolv || !lsi_file_exists(resolv)) {
|
||||
return lsi_get_fallback_steam_dir(homedir);
|
||||
}
|
||||
return strdup(resolv);
|
||||
}
|
||||
|
||||
char *lsi_get_process_name(void)
|
||||
{
|
||||
char *realp = NULL;
|
||||
|
||||
realp = realpath("/proc/self/exe", NULL);
|
||||
if (!realp) {
|
||||
return NULL;
|
||||
}
|
||||
return realp;
|
||||
}
|
||||
|
||||
char *lsi_get_process_base_name(void)
|
||||
{
|
||||
autofree(char) *p = NULL;
|
||||
char *basep = NULL;
|
||||
|
||||
p = lsi_get_process_name();
|
||||
if (!p) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
basep = basename(p);
|
||||
return strdup(basep);
|
||||
}
|
||||
|
||||
/**
|
||||
* Quickly determine if a string is numeric..
|
||||
*/
|
||||
static inline bool lsi_is_string_numeric(char *p)
|
||||
{
|
||||
char *s;
|
||||
|
||||
for (s = p; *s; s++) {
|
||||
if (!isdigit(*s)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Didn't wind, empty string */
|
||||
if (s == p) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
char **lsi_get_steam_paths(void)
|
||||
{
|
||||
autofree(char) *steam_root = NULL;
|
||||
autofree(char) *lib_conf = NULL;
|
||||
autofree(VdfFile) *vdf = NULL;
|
||||
VdfNode *root = NULL;
|
||||
VdfNode *node = NULL;
|
||||
NcArray *array = NULL;
|
||||
|
||||
steam_root = lsi_get_steam_dir();
|
||||
if (!steam_root) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
array = nc_array_new();
|
||||
if (!nc_array_add(array, strdup(steam_root))) {
|
||||
goto bail;
|
||||
}
|
||||
|
||||
if (asprintf(&lib_conf, "%s/steamapps/libraryfolders.vdf", steam_root) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vdf = vdf_file_open(lib_conf);
|
||||
if (!vdf) {
|
||||
goto fallback;
|
||||
}
|
||||
|
||||
if (!vdf_file_parse(vdf)) {
|
||||
goto fallback;
|
||||
}
|
||||
|
||||
/* Look up LibraryFolders under root */
|
||||
root = vdf_file_get_root(vdf);
|
||||
node = vdf_node_get(root, "LibraryFolders", NULL);
|
||||
if (!node) {
|
||||
goto fallback;
|
||||
}
|
||||
|
||||
/* Walk all nodes immediately within LibraryFolders and ignore sections */
|
||||
for (VdfNode *n = node->child; n; n = n->sibling) {
|
||||
if (!n->value) {
|
||||
continue;
|
||||
}
|
||||
if (lsi_is_string_numeric(n->key)) {
|
||||
if (!nc_array_add(array, strdup(n->value))) {
|
||||
goto bail;
|
||||
}
|
||||
lsi_log_debug("vdf: discovered LibraryFolders: %s", n->value);
|
||||
}
|
||||
}
|
||||
|
||||
fallback:
|
||||
/* Trick nica into storing empty value to so we can terminate the array */
|
||||
if (!nc_array_add(array, (void *)(long)1)) {
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* Steal the blob straight out of the array */
|
||||
char **data = (char **)array->data;
|
||||
data[array->len - 1] = NULL;
|
||||
free(array);
|
||||
return data;
|
||||
|
||||
bail:
|
||||
nc_array_free(&array, free);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2017 Ikey Doherty <ikey@solus-project.com>
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* Determine the home directory
|
||||
*/
|
||||
const char *lsi_get_home_dir(void);
|
||||
|
||||
/**
|
||||
* Determine the home config directory
|
||||
*/
|
||||
char *lsi_get_user_config_dir(void);
|
||||
|
||||
/**
|
||||
* Find out where Steam is installed
|
||||
*/
|
||||
char *lsi_get_steam_dir(void);
|
||||
|
||||
/**
|
||||
* Grab all the valid steam installation directories
|
||||
*/
|
||||
char **lsi_get_steam_paths(void);
|
||||
|
||||
/**
|
||||
* Quick helper to determine if the path exists
|
||||
*/
|
||||
bool lsi_file_exists(const char *path);
|
||||
|
||||
/**
|
||||
* Return the full process name
|
||||
*/
|
||||
char *lsi_get_process_name(void);
|
||||
|
||||
/**
|
||||
* Determine the basename'd process
|
||||
*/
|
||||
char *lsi_get_process_base_name(void);
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,117 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "nica/util.h"
|
||||
|
||||
static const char *_log_id = "__init__";
|
||||
|
||||
void lsi_log_set_id(const char *id)
|
||||
{
|
||||
_log_id = id;
|
||||
}
|
||||
|
||||
void lsi_log_debug(const char *format, ...)
|
||||
{
|
||||
if (!getenv("LSI_DEBUG")) {
|
||||
return;
|
||||
}
|
||||
|
||||
autofree(char) *p = NULL;
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
|
||||
if (!vasprintf(&p, format, va)) {
|
||||
/* At least print *something */
|
||||
fprintf(stderr, "%s\n", format);
|
||||
goto end;
|
||||
}
|
||||
|
||||
fprintf(stderr, "\033[32;1m[lsi:%s]\033[0m %s\n", _log_id, p);
|
||||
|
||||
end:
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
void lsi_log_info(const char *format, ...)
|
||||
{
|
||||
autofree(char) *p = NULL;
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
|
||||
if (!vasprintf(&p, format, va)) {
|
||||
/* At least print *something */
|
||||
fprintf(stderr, "%s\n", format);
|
||||
goto end;
|
||||
}
|
||||
|
||||
fprintf(stderr, "\033[34;1m[lsi:%s]\033[0m %s\n", _log_id, p);
|
||||
|
||||
end:
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
void lsi_log_warn(const char *format, ...)
|
||||
{
|
||||
autofree(char) *p = NULL;
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
|
||||
if (!vasprintf(&p, format, va)) {
|
||||
/* At least print *something */
|
||||
fprintf(stderr, "%s\n", format);
|
||||
goto end;
|
||||
}
|
||||
|
||||
fprintf(stderr, "\033[33;1m[lsi:%s]\033[0m %s\n", _log_id, p);
|
||||
|
||||
end:
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
void lsi_log_error(const char *format, ...)
|
||||
{
|
||||
autofree(char) *p = NULL;
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
|
||||
if (!vasprintf(&p, format, va)) {
|
||||
/* At least print *something */
|
||||
fprintf(stderr, "%s\n", format);
|
||||
goto end;
|
||||
}
|
||||
|
||||
fprintf(stderr, "\033[31;1m[lsi:%s]\033[0m %s\n", _log_id, p);
|
||||
|
||||
end:
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2017 Ikey Doherty <ikey@solus-project.com>
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* Set the ID used in all log output
|
||||
*/
|
||||
void lsi_log_set_id(const char *id);
|
||||
|
||||
/**
|
||||
* Emit some debug information if LSI_DEBUG is set
|
||||
*/
|
||||
void lsi_log_debug(const char *format, ...) __attribute__((format(printf, 1, 2)));
|
||||
|
||||
/**
|
||||
* Emit information, always shown
|
||||
*/
|
||||
void lsi_log_info(const char *format, ...) __attribute__((format(printf, 1, 2)));
|
||||
|
||||
/**
|
||||
* Emit a warning, always shown
|
||||
*/
|
||||
void lsi_log_warn(const char *format, ...) __attribute__((format(printf, 1, 2)));
|
||||
|
||||
/**
|
||||
* Emit an error, always shown
|
||||
*/
|
||||
void lsi_log_error(const char *format, ...) __attribute__((format(printf, 1, 2)));
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,19 @@
|
||||
# Build the common library to share functionality between various components
|
||||
|
||||
lsi_common_sources = [
|
||||
'files.c',
|
||||
'log.c',
|
||||
'vdf.c',
|
||||
]
|
||||
|
||||
lib_lsi_common = static_library(
|
||||
'lsi-lsi-common',
|
||||
sources: lsi_common_sources + nica_sources,
|
||||
c_args: ['-fvisibility=hidden'],
|
||||
include_directories: nica_includes,
|
||||
)
|
||||
|
||||
link_lsi_common = declare_dependency(
|
||||
link_with: lib_lsi_common,
|
||||
include_directories: include_directories('.'),
|
||||
)
|
||||
@@ -0,0 +1,706 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "vdf.h"
|
||||
|
||||
#define VDF_CHAR_QUOTE '"'
|
||||
#define VDF_CHAR_SLASH '\\'
|
||||
#define VDF_CHAR_OPEN '{'
|
||||
#define VDF_CHAR_CLOSE '}'
|
||||
|
||||
typedef enum {
|
||||
VDF_FLAG_MIN = 1 << 0,
|
||||
VDF_FLAG_QUOTED = 1 << 1, /**< Inside a quoted block */
|
||||
VDF_FLAG_COMMENT = 1 << 2, /**< Inside a comment block */
|
||||
VDF_FLAG_BLOCK_COMMENT = 1 << 3, /**< Inside a multiline comment block */
|
||||
VDF_FLAG_CHEW_WHITESPACE = 1 << 4,
|
||||
} VdfFlags;
|
||||
|
||||
/**
|
||||
* VdfFile is the main dude required for parsing a file
|
||||
*/
|
||||
struct VdfFile {
|
||||
/* Input */
|
||||
size_t buffer_len;
|
||||
char *buffer;
|
||||
|
||||
/* Output (memstream) */
|
||||
FILE *ring;
|
||||
char *out_buffer;
|
||||
size_t out_len;
|
||||
|
||||
/* Input file */
|
||||
int fd;
|
||||
|
||||
/* Tracking */
|
||||
size_t index;
|
||||
int flags;
|
||||
char *key_id;
|
||||
int n_quote; /**only allow 2 sets per "line" */
|
||||
VdfNode *section;
|
||||
VdfNode *root;
|
||||
|
||||
bool error; /**< Allow breaking. */
|
||||
};
|
||||
|
||||
/**
|
||||
* Function pointer to the generic handler functions.
|
||||
*/
|
||||
typedef bool (*vdf_handle_func)(VdfFile *file, char c);
|
||||
|
||||
/**
|
||||
* Free node
|
||||
*/
|
||||
static void vdf_node_free(VdfNode *node)
|
||||
{
|
||||
if (!node) {
|
||||
return;
|
||||
}
|
||||
if (node->key) {
|
||||
free(node->key);
|
||||
}
|
||||
if (node->value) {
|
||||
free(node->value);
|
||||
}
|
||||
|
||||
vdf_node_free(node->sibling);
|
||||
vdf_node_free(node->child);
|
||||
free(node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate a new VdfNode, copying the key and value if they exist.
|
||||
*/
|
||||
static VdfNode *vdf_node_new(const char *key, const char *value)
|
||||
{
|
||||
VdfNode *ret = NULL;
|
||||
|
||||
ret = calloc(1, sizeof(VdfNode));
|
||||
if (!ret) {
|
||||
return NULL;
|
||||
}
|
||||
if (key) {
|
||||
ret->key = strdup(key);
|
||||
if (!ret->key) {
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
if (value) {
|
||||
ret->value = strdup(value);
|
||||
if (!ret->value) {
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
failed:
|
||||
vdf_node_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void vdf_file_close(VdfFile *file)
|
||||
{
|
||||
if (!file) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (file->buffer) {
|
||||
munmap(file->buffer, file->buffer_len);
|
||||
}
|
||||
if (file->fd > -1) {
|
||||
close(file->fd);
|
||||
}
|
||||
if (file->ring) {
|
||||
fclose(file->ring);
|
||||
}
|
||||
if (file->out_buffer) {
|
||||
free(file->out_buffer);
|
||||
}
|
||||
if (file->key_id) {
|
||||
free(file->key_id);
|
||||
}
|
||||
/* TODO: Make free separate from close, so we can just keep the node */
|
||||
vdf_node_free(file->root);
|
||||
free(file);
|
||||
}
|
||||
|
||||
VdfFile *vdf_file_open(const char *path)
|
||||
{
|
||||
VdfFile *ret = NULL;
|
||||
struct stat st = { 0 };
|
||||
|
||||
ret = calloc(1, sizeof(VdfFile));
|
||||
if (!ret) {
|
||||
return NULL;
|
||||
}
|
||||
ret->fd = -1;
|
||||
|
||||
ret->fd = open(path, O_RDONLY);
|
||||
if (ret->fd < 0) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (fstat(ret->fd, &st) != 0) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ret->buffer_len = (size_t)st.st_size;
|
||||
|
||||
ret->buffer = mmap(NULL, ret->buffer_len, PROT_READ, MAP_PRIVATE, ret->fd, 0);
|
||||
if (!ret->buffer) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Now we have input map, build output memstream */
|
||||
ret->ring = open_memstream(&ret->out_buffer, &ret->out_len);
|
||||
if (!ret->ring) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
return ret;
|
||||
fail:
|
||||
vdf_file_close(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
VdfNode *vdf_file_get_root(VdfFile *file)
|
||||
{
|
||||
if (!file) {
|
||||
return NULL;
|
||||
}
|
||||
return file->root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Advance the buffer pointer forward if possible.
|
||||
*/
|
||||
static char vdf_file_next(VdfFile *file)
|
||||
{
|
||||
file->index++;
|
||||
if (file->index > file->buffer_len) {
|
||||
file->index = file->buffer_len;
|
||||
return '\0';
|
||||
}
|
||||
return file->buffer[file->index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to peek at the next character in the buffer
|
||||
*/
|
||||
static char vdf_file_peek(VdfFile *file)
|
||||
{
|
||||
if (file->index + 1 > file->buffer_len) {
|
||||
return '\0';
|
||||
}
|
||||
return file->buffer[file->index + 1];
|
||||
}
|
||||
|
||||
/**
|
||||
* Skip a character in the stream
|
||||
*/
|
||||
static void vdf_file_skip(VdfFile *file)
|
||||
{
|
||||
if (++file->index > file->buffer_len) {
|
||||
file->index = file->buffer_len;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Push a char to the ring buffer
|
||||
*/
|
||||
static bool vdf_file_push_ring(VdfFile *file, char c)
|
||||
{
|
||||
if (fwrite(&c, 1, sizeof(c), file->ring) != 1) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* End the ring buffer by writing a NUL byte
|
||||
*/
|
||||
static bool vdf_file_end_ring(VdfFile *file)
|
||||
{
|
||||
if (!vdf_file_push_ring(file, '\0')) {
|
||||
return false;
|
||||
}
|
||||
if (fflush(file->ring) != 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the ring once more to begin writing again.
|
||||
*/
|
||||
static bool vdf_file_reset_ring(VdfFile *file)
|
||||
{
|
||||
if (fflush(file->ring) != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (fseek(file->ring, 0, SEEK_SET) != 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle newlines
|
||||
*
|
||||
* When encountering a newline we need to do a bit of state cleanup
|
||||
*/
|
||||
static bool vdf_file_handle_newline(VdfFile *file, char c)
|
||||
{
|
||||
if (c != '\n') {
|
||||
return false;
|
||||
}
|
||||
file->flags &= ~VDF_FLAG_COMMENT;
|
||||
if (file->flags & VDF_FLAG_QUOTED) {
|
||||
file->flags |= VDF_FLAG_CHEW_WHITESPACE;
|
||||
} else {
|
||||
file->flags &= ~VDF_FLAG_CHEW_WHITESPACE;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle quote characters
|
||||
*
|
||||
* This function deals with the start/end quotes encountered in the stream
|
||||
* to set keys and values
|
||||
*/
|
||||
static bool vdf_file_handle_quote(VdfFile *file, char c)
|
||||
{
|
||||
if (c != VDF_CHAR_QUOTE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Start tracking quoting if necessary */
|
||||
if (!(file->flags & VDF_FLAG_QUOTED)) {
|
||||
/* Start tracking the quoted thing */
|
||||
if (file->n_quote > 2) {
|
||||
lsi_log_error("vdf: Cannot start a third section");
|
||||
goto bail;
|
||||
}
|
||||
file->flags |= VDF_FLAG_QUOTED;
|
||||
file->flags &= ~VDF_FLAG_CHEW_WHITESPACE;
|
||||
vdf_file_reset_ring(file);
|
||||
return true;
|
||||
}
|
||||
|
||||
++file->n_quote;
|
||||
|
||||
/* Stop tracking the quoted thing */
|
||||
file->flags ^= VDF_FLAG_QUOTED;
|
||||
vdf_file_end_ring(file);
|
||||
|
||||
/* Capture the ID */
|
||||
if (file->n_quote == 1) {
|
||||
if (file->key_id) {
|
||||
lsi_log_error("vdf: Key should not already be set!");
|
||||
goto bail;
|
||||
}
|
||||
file->key_id = strdup(file->out_buffer);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!file->key_id) {
|
||||
lsi_log_error("vdf: Missing key for value!");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
if (file->n_quote != 2) {
|
||||
lsi_log_error("vdf: Invalid number of quotes on line");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* Reset n_quote now */
|
||||
file->n_quote = 0;
|
||||
|
||||
/* Store the node now */
|
||||
VdfNode *t = vdf_node_new(file->key_id, file->out_buffer);
|
||||
if (!t) {
|
||||
fputs("OOM\n", stderr);
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* dispose of key ID now */
|
||||
free(file->key_id);
|
||||
file->key_id = NULL;
|
||||
file->flags &= ~VDF_FLAG_CHEW_WHITESPACE;
|
||||
|
||||
/* Store the new key->value mapping */
|
||||
t->parent = file->section->parent;
|
||||
t->sibling = file->section->child;
|
||||
file->section->child = t;
|
||||
|
||||
return true;
|
||||
|
||||
bail:
|
||||
file->error = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle opening of a section
|
||||
*
|
||||
* This will perform some basic validation, and when all conditions are satisfied
|
||||
* we'll attempt construction of a new section
|
||||
*/
|
||||
static bool vdf_file_handle_section_open(VdfFile *file)
|
||||
{
|
||||
VdfNode *node = NULL;
|
||||
vdf_file_reset_ring(file);
|
||||
|
||||
if (file->n_quote == 2) {
|
||||
lsi_log_error("vdf: section cannot have value!");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
if (file->n_quote != 1) {
|
||||
lsi_log_error("vdf: Section is missing id!");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
file->n_quote = 0;
|
||||
|
||||
if (!file->key_id) {
|
||||
lsi_log_error("vdf: key_id should not be NULL!");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
node = vdf_node_new(file->out_buffer, NULL);
|
||||
if (!node) {
|
||||
goto bail;
|
||||
}
|
||||
free(file->key_id);
|
||||
file->key_id = NULL;
|
||||
|
||||
node->parent = file->section;
|
||||
node->sibling = file->section->child;
|
||||
file->section->child = node;
|
||||
|
||||
file->section = node;
|
||||
return true;
|
||||
|
||||
bail:
|
||||
file->error = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle closing of a section
|
||||
*
|
||||
* This will perform some basic error checking to ensure we're closing it
|
||||
* correctly. At this point we'll wind back to the nodes parent
|
||||
*/
|
||||
static bool vdf_file_handle_section_close(VdfFile *file)
|
||||
{
|
||||
if (file->n_quote != 0) {
|
||||
lsi_log_error("vdf: unterminated section!");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
if (!file->section) {
|
||||
lsi_log_error("vdf: Closed section without creating one!");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* Wind back */
|
||||
file->section = file->section->parent;
|
||||
if (!file->section) {
|
||||
goto bail;
|
||||
}
|
||||
return true;
|
||||
|
||||
bail:
|
||||
file->error = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle brace characters
|
||||
*
|
||||
* This function will proxy to the relevant handler function
|
||||
*/
|
||||
static bool vdf_file_handle_section(VdfFile *file, char c)
|
||||
{
|
||||
switch (c) {
|
||||
case VDF_CHAR_CLOSE:
|
||||
return vdf_file_handle_section_close(file);
|
||||
case VDF_CHAR_OPEN:
|
||||
return vdf_file_handle_section_open(file);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle normal text
|
||||
*
|
||||
* Whilst in QUOTED mode we'll keep pushing text to the buffer, which will
|
||||
* later become keys and values.
|
||||
*
|
||||
* We'll also do some sanity checks here to escape any common text sequences,
|
||||
* so as not to break the quotes
|
||||
*/
|
||||
static bool vdf_file_handle_text(VdfFile *file, char c)
|
||||
{
|
||||
char next = '\0';
|
||||
|
||||
/* Must be within quoting */
|
||||
if (!(file->flags & VDF_FLAG_QUOTED)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (file->flags & VDF_FLAG_CHEW_WHITESPACE && isspace(c)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
file->flags &= ~VDF_FLAG_CHEW_WHITESPACE;
|
||||
|
||||
/* Check if we need to do any escaping */
|
||||
if (c != VDF_CHAR_SLASH) {
|
||||
vdf_file_push_ring(file, c);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Perform text escaping */
|
||||
switch ((next = vdf_file_peek(file))) {
|
||||
case 'r':
|
||||
vdf_file_push_ring(file, '\r');
|
||||
vdf_file_skip(file);
|
||||
return true;
|
||||
case 'n':
|
||||
vdf_file_push_ring(file, '\n');
|
||||
vdf_file_skip(file);
|
||||
return true;
|
||||
case 't':
|
||||
vdf_file_push_ring(file, '\t');
|
||||
vdf_file_skip(file);
|
||||
return true;
|
||||
case '"':
|
||||
vdf_file_push_ring(file, '"');
|
||||
vdf_file_skip(file);
|
||||
return true;
|
||||
case '\'':
|
||||
vdf_file_push_ring(file, '\'');
|
||||
vdf_file_skip(file);
|
||||
return true;
|
||||
case '\\':
|
||||
vdf_file_push_ring(file, '\\');
|
||||
vdf_file_skip(file);
|
||||
return true;
|
||||
default:
|
||||
// TODO: Handle errors properly!
|
||||
lsi_log_error("vdf: Invalid escape sequence '\\%c'", next);
|
||||
file->error = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle multiline comments
|
||||
*
|
||||
* This method will attempt to look for the start and ends of multiline comment
|
||||
* blocks, which will result in all text from the start until the trailing
|
||||
* characters of the comment to be ignored.
|
||||
*/
|
||||
static bool vdf_file_handle_multiline_comment(VdfFile *file, char c)
|
||||
{
|
||||
if (c == '/' && vdf_file_peek(file) == '*') {
|
||||
vdf_file_skip(file);
|
||||
if (file->flags & VDF_FLAG_BLOCK_COMMENT) {
|
||||
lsi_log_error("vdf: Starting nested block comment");
|
||||
goto bail;
|
||||
}
|
||||
file->flags |= VDF_FLAG_BLOCK_COMMENT;
|
||||
} else if (c == '*' && vdf_file_peek(file) == '/') {
|
||||
vdf_file_skip(file);
|
||||
if (!(file->flags & VDF_FLAG_BLOCK_COMMENT)) {
|
||||
lsi_log_error("vdf: Ended comment without starting one");
|
||||
goto bail;
|
||||
}
|
||||
file->flags ^= VDF_FLAG_BLOCK_COMMENT;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
bail:
|
||||
file->error = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle single comments
|
||||
*
|
||||
* This will handle C++ style '//' comments and cause the remaining text on
|
||||
* the line to be ignored
|
||||
*/
|
||||
static bool vdf_file_handle_single_comment(VdfFile *file, char c)
|
||||
{
|
||||
/* Don't switch us on if we're inside a multiline comment! */
|
||||
if (file->flags & VDF_FLAG_BLOCK_COMMENT) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Must be a C++ style comment. */
|
||||
if (!(c == '/' && vdf_file_peek(file) == '/')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Skip the next character, and turn on comment mode */
|
||||
vdf_file_skip(file);
|
||||
file->flags |= VDF_FLAG_COMMENT;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle comment state
|
||||
*
|
||||
* If we're in a comment we might need to skip this line entirely, however
|
||||
* if its a multiline comment we need to preemptively evaluate the termination.
|
||||
*/
|
||||
static bool vdf_file_handle_commented(VdfFile *file, char c)
|
||||
{
|
||||
if (file->flags & VDF_FLAG_COMMENT) {
|
||||
return true;
|
||||
}
|
||||
if (file->flags & VDF_FLAG_BLOCK_COMMENT) {
|
||||
/* Always return true here, must ignore the line! */
|
||||
vdf_file_handle_multiline_comment(file, c);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool vdf_file_parse(VdfFile *file)
|
||||
{
|
||||
char c = file->buffer[0];
|
||||
bool ret = false;
|
||||
static vdf_handle_func funcs[] = {
|
||||
&vdf_file_handle_newline,
|
||||
&vdf_file_handle_commented,
|
||||
&vdf_file_handle_quote,
|
||||
&vdf_file_handle_text,
|
||||
&vdf_file_handle_section,
|
||||
&vdf_file_handle_single_comment,
|
||||
&vdf_file_handle_multiline_comment,
|
||||
};
|
||||
static size_t n_funcs = sizeof(funcs) / sizeof(funcs[0]);
|
||||
|
||||
file->flags = 0;
|
||||
file->key_id = NULL;
|
||||
file->section = file->root = vdf_node_new(NULL, NULL);
|
||||
if (!file->root) {
|
||||
goto bail;
|
||||
}
|
||||
|
||||
while (c != '\0') {
|
||||
/* Pass through all of our functions */
|
||||
for (size_t i = 0; i < n_funcs; i++) {
|
||||
if (funcs[i](file, c)) {
|
||||
goto next;
|
||||
}
|
||||
}
|
||||
if (file->error) {
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* Now the only thing left is to allow whitespace */
|
||||
if (!isspace(c)) {
|
||||
lsi_log_error("vdf: Illegal character in stream: '%c'", c);
|
||||
goto bail;
|
||||
}
|
||||
next:
|
||||
c = vdf_file_next(file);
|
||||
}
|
||||
|
||||
ret = true;
|
||||
|
||||
/* Check a comment actually ended .. */
|
||||
if (file->flags & VDF_FLAG_BLOCK_COMMENT) {
|
||||
lsi_log_error("vdf: Started block comment without ending one");
|
||||
ret = false;
|
||||
}
|
||||
|
||||
bail:
|
||||
if (file->key_id) {
|
||||
free(file->key_id);
|
||||
file->key_id = NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
VdfNode *vdf_node_get_child(VdfNode *node, const char *id)
|
||||
{
|
||||
if (!id || !node) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (VdfNode *tmp = node->child; tmp; tmp = tmp->sibling) {
|
||||
if (tmp->key && strcmp(tmp->key, id) == 0) {
|
||||
return tmp;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
VdfNode *vdf_node_get(VdfNode *node, ...)
|
||||
{
|
||||
va_list va;
|
||||
va_start(va, node);
|
||||
char *id = NULL;
|
||||
VdfNode *retr = node;
|
||||
|
||||
while ((id = va_arg(va, char *)) != NULL) {
|
||||
retr = vdf_node_get_child(retr, id);
|
||||
if (!retr) {
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
va_end(va);
|
||||
return retr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2017 Ikey Doherty <ikey@solus-project.com>
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
/**
|
||||
* VdfFile is an opaque type containing fields used primarily for parsing
|
||||
* a .vdf file
|
||||
*
|
||||
* A VdfFile is used to parse the Valve Data Format file, allowing LSI to
|
||||
* parse the users library paths, etc.
|
||||
*/
|
||||
typedef struct VdfFile VdfFile;
|
||||
|
||||
/**
|
||||
* A VdfNode may be any element in a VDF document, and has optional value,
|
||||
* children and parent.
|
||||
* The root node in a document has no parent
|
||||
*/
|
||||
typedef struct VdfNode {
|
||||
struct VdfNode *sibling; /**First sibling */
|
||||
struct VdfNode *child; /**<First child, may have siblings. */
|
||||
struct VdfNode *parent; /**<Parent if not the root */
|
||||
|
||||
char *key; /**<Only null for the root node */
|
||||
char *value; /**<Only exists for key-value nodes */
|
||||
} VdfNode;
|
||||
|
||||
/**
|
||||
* Close and free an existing VdfFile
|
||||
*/
|
||||
void vdf_file_close(VdfFile *file);
|
||||
|
||||
/**
|
||||
* Attempt to map the source path and open a .vdf file
|
||||
*/
|
||||
VdfFile *vdf_file_open(const char *path);
|
||||
|
||||
/**
|
||||
* Return the root node for this file, if it has been parsed
|
||||
*/
|
||||
VdfNode *vdf_file_get_root(VdfFile *file);
|
||||
|
||||
/**
|
||||
* Attempt to parse a file
|
||||
*
|
||||
* @file Pointer to a VdfFile instance
|
||||
* @returns true if parsing succeeds
|
||||
*/
|
||||
bool vdf_file_parse(VdfFile *file);
|
||||
|
||||
/**
|
||||
* Grab a child node by the given ID
|
||||
*
|
||||
* @node Parent node
|
||||
* @id Child ID
|
||||
*/
|
||||
VdfNode *vdf_node_get_child(VdfNode *node, const char *id);
|
||||
|
||||
/**
|
||||
* Variadic function to retrieve a child node
|
||||
*
|
||||
* This function will keep iterating the args passed until it hits NULL and
|
||||
* has a node, or no node can be found prior to this and it returns NULL.
|
||||
*/
|
||||
__attribute__((sentinel(0))) VdfNode *vdf_node_get(VdfNode *node, ...);
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,421 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include "main-window.h"
|
||||
#include "config.h"
|
||||
#include "lsi.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <glib/gi18n.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
struct _LsiSettingsWindow {
|
||||
GtkWindow parent;
|
||||
LsiConfig config; /**<Current LSI config */
|
||||
|
||||
/* Only when libintercept is enabled will we have this option */
|
||||
#ifdef HAVE_LIBINTERCEPT
|
||||
GtkWidget *check_intercept;
|
||||
#endif
|
||||
|
||||
/* Only when libredirect is enabled will we have this option */
|
||||
#ifdef HAVE_LIBREDIRECT
|
||||
GtkWidget *check_redirect;
|
||||
GtkWidget *check_unity_hack;
|
||||
#endif
|
||||
|
||||
/* Always have these guys */
|
||||
GtkWidget *check_native;
|
||||
GtkWidget *check_emul32;
|
||||
};
|
||||
|
||||
struct _LsiSettingsWindowClass {
|
||||
GtkWindowClass parent_class;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE(LsiSettingsWindow, lsi_settings_window, GTK_TYPE_WINDOW)
|
||||
|
||||
static void _align_label(GtkWidget *label);
|
||||
static void insert_grid(GtkWidget *grid, int *row, const char *title, const char *description,
|
||||
GtkWidget *widget);
|
||||
static GtkWidget *insert_grid_toggle(GtkWidget *grid, int *row, const char *title,
|
||||
const char *description);
|
||||
static void set_row_sensitive(GtkWidget *toggle, gboolean sensitive);
|
||||
static void lsi_native_swapped(LsiSettingsWindow *window, gpointer v);
|
||||
static gboolean lsi_window_closed(LsiSettingsWindow *window, GdkEvent *event, gpointer v);
|
||||
|
||||
/**
|
||||
* lsi_settings_window_new:
|
||||
*
|
||||
* Construct a new LsiSettingsWindow object
|
||||
*/
|
||||
GtkWidget *lsi_settings_window_new()
|
||||
{
|
||||
return g_object_new(LSI_TYPE_SETTINGS_WINDOW, "type", GTK_WINDOW_TOPLEVEL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* lsi_settings_window_dispose:
|
||||
*
|
||||
* Clean up a LsiSettingsWindow instance
|
||||
*/
|
||||
static void lsi_settings_window_dispose(GObject *obj)
|
||||
{
|
||||
G_OBJECT_CLASS(lsi_settings_window_parent_class)->dispose(obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* lsi_settings_window_class_init:
|
||||
*
|
||||
* Handle class initialisation
|
||||
*/
|
||||
static void lsi_settings_window_class_init(LsiSettingsWindowClass *klazz)
|
||||
{
|
||||
GObjectClass *obj_class = G_OBJECT_CLASS(klazz);
|
||||
|
||||
/* gobject vtable hookup */
|
||||
obj_class->dispose = lsi_settings_window_dispose;
|
||||
}
|
||||
|
||||
/**
|
||||
* lsi_settings_window_init:
|
||||
*
|
||||
* Handle construction of the LsiSettingsWindow
|
||||
*/
|
||||
static void lsi_settings_window_init(LsiSettingsWindow *self)
|
||||
{
|
||||
GtkWidget *grid = NULL;
|
||||
GtkWidget *layout = NULL;
|
||||
GtkWidget *header = NULL;
|
||||
GtkWidget *widget = NULL;
|
||||
GtkStyleContext *style = NULL;
|
||||
const gchar *xdg_desktop = NULL;
|
||||
const gchar *emul32_desc = NULL;
|
||||
bool is_64bit = false;
|
||||
gchar *label = NULL;
|
||||
int row = 0;
|
||||
|
||||
/* Ensure we correctly clean this up.. */
|
||||
memset(&self->config, 0, sizeof(LsiConfig));
|
||||
|
||||
/* Load the LSI configuration now */
|
||||
if (!lsi_config_load(&self->config)) {
|
||||
lsi_config_load_defaults(&self->config);
|
||||
}
|
||||
|
||||
/* Conditionally apply CSD */
|
||||
#if GTK_CHECK_VERSION(3, 12, 0)
|
||||
xdg_desktop = g_getenv("XDG_CURRENT_DESKTOP");
|
||||
if (xdg_desktop && (strstr(xdg_desktop, "GNOME:") || strstr(xdg_desktop, ":GNOME") ||
|
||||
g_str_equal(xdg_desktop, "GNOME"))) {
|
||||
widget = gtk_header_bar_new();
|
||||
gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(widget), TRUE);
|
||||
gtk_window_set_titlebar(GTK_WINDOW(self), widget);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* For now we'll just exit on close */
|
||||
g_signal_connect(self, "delete-event", G_CALLBACK(lsi_window_closed), NULL);
|
||||
|
||||
/* Sort out window bits */
|
||||
gtk_window_set_title(GTK_WINDOW(self), _("Linux Steam® Integration"));
|
||||
gtk_window_set_icon_name(GTK_WINDOW(self), "steam");
|
||||
gtk_window_set_position(GTK_WINDOW(self), GTK_WIN_POS_CENTER);
|
||||
gtk_widget_set_size_request(GTK_WIDGET(self), 320, 500);
|
||||
gtk_window_set_resizable(GTK_WINDOW(self), FALSE);
|
||||
|
||||
/* Add main layout */
|
||||
layout = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
|
||||
gtk_container_add(GTK_CONTAINER(self), layout);
|
||||
gtk_container_set_border_width(GTK_CONTAINER(self), 12);
|
||||
gtk_widget_set_valign(GTK_WIDGET(layout), GTK_ALIGN_START);
|
||||
|
||||
/* Header box */
|
||||
header = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
||||
gtk_box_pack_start(GTK_BOX(layout), header, FALSE, FALSE, 0);
|
||||
|
||||
/* header label */
|
||||
label = g_strdup_printf("<big>%s</big>", _("Linux Steam® Integration"));
|
||||
widget = gtk_label_new(label);
|
||||
gtk_label_set_use_markup(GTK_LABEL(widget), TRUE);
|
||||
g_free(label);
|
||||
_align_label(widget);
|
||||
gtk_box_pack_start(GTK_BOX(header), widget, FALSE, FALSE, 0);
|
||||
|
||||
/* header image */
|
||||
widget = gtk_image_new_from_icon_name("steam", GTK_ICON_SIZE_DIALOG);
|
||||
gtk_widget_set_valign(widget, GTK_ALIGN_START);
|
||||
gtk_box_pack_end(GTK_BOX(header), widget, FALSE, FALSE, 0);
|
||||
|
||||
/* small label */
|
||||
widget = gtk_label_new(
|
||||
_("Control the behaviour of the Steam client and games. Settings will not take effect "
|
||||
"until the Steam Client is restarted. Use the 'Exit Steam' option to ensure it "
|
||||
"closes."));
|
||||
g_object_set(widget, "xalign", 0.0, NULL);
|
||||
gtk_label_set_max_width_chars(GTK_LABEL(widget), 80);
|
||||
gtk_label_set_line_wrap(GTK_LABEL(widget), TRUE);
|
||||
gtk_label_set_line_wrap_mode(GTK_LABEL(widget), PANGO_WRAP_WORD);
|
||||
_align_label(widget);
|
||||
gtk_box_pack_start(GTK_BOX(layout), widget, TRUE, TRUE, 0);
|
||||
style = gtk_widget_get_style_context(widget);
|
||||
gtk_style_context_add_class(style, GTK_STYLE_CLASS_DIM_LABEL);
|
||||
#if GTK_CHECK_VERSION(3, 12, 0)
|
||||
gtk_widget_set_margin_end(widget, 100);
|
||||
#else
|
||||
gtk_widget_set_margin_right(widget, 100);
|
||||
#endif
|
||||
/* add a separator now */
|
||||
widget = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
|
||||
gtk_box_pack_start(GTK_BOX(layout), widget, FALSE, FALSE, 0);
|
||||
g_object_set(widget, "margin-top", 12, "margin-bottom", 4, NULL);
|
||||
|
||||
/* Start populating main grid with controls */
|
||||
grid = gtk_grid_new();
|
||||
gtk_box_pack_start(GTK_BOX(layout), grid, FALSE, FALSE, 0);
|
||||
|
||||
/* Start populating options into the UI */
|
||||
self->check_native = insert_grid_toggle(
|
||||
grid,
|
||||
&row,
|
||||
_("Use native runtime"),
|
||||
_("Switch between the native runtime and the bundled Steam runtime."));
|
||||
|
||||
/* Load in the existing configuration */
|
||||
gtk_switch_set_active(GTK_SWITCH(self->check_native), self->config.use_native_runtime);
|
||||
|
||||
is_64bit = lsi_system_is_64bit();
|
||||
/* Can only force on a 64-bit system. */
|
||||
if (!is_64bit) {
|
||||
/* Label is shown to indicate we can't enable 32-bit option */
|
||||
emul32_desc = _("This option has been disabled as the system is already 32-bit");
|
||||
} else {
|
||||
/* Label is shown on 64-bit systems only */
|
||||
emul32_desc =
|
||||
_("This may workaround some broken games, but will disable the Steam store "
|
||||
"browser.");
|
||||
}
|
||||
|
||||
self->check_emul32 =
|
||||
insert_grid_toggle(grid, &row, _("Force 32-bit mode for Steam"), emul32_desc);
|
||||
set_row_sensitive(self->check_emul32, is_64bit);
|
||||
gtk_switch_set_active(GTK_SWITCH(self->check_emul32), self->config.force_32);
|
||||
|
||||
#ifdef HAVE_LIBINTERCEPT
|
||||
self->check_intercept = insert_grid_toggle(
|
||||
grid,
|
||||
&row,
|
||||
_("Use the intercept library"),
|
||||
_("Force Steam applications to use more native libraries to maximise compatibility."));
|
||||
set_row_sensitive(self->check_intercept, FALSE);
|
||||
gtk_switch_set_active(GTK_SWITCH(self->check_intercept), self->config.use_libintercept);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBREDIRECT
|
||||
self->check_redirect =
|
||||
insert_grid_toggle(grid,
|
||||
&row,
|
||||
_("Use the redirect library"),
|
||||
_("Override system calls to fix known bugs in some "
|
||||
"Linux ports."));
|
||||
set_row_sensitive(self->check_redirect, FALSE);
|
||||
gtk_switch_set_active(GTK_SWITCH(self->check_redirect), self->config.use_libredirect);
|
||||
|
||||
self->check_unity_hack = insert_grid_toggle(grid,
|
||||
&row,
|
||||
_("Use the Unity fullscreen workaround"),
|
||||
_("Prevent some Unity games from launching in "
|
||||
"full screen mode to fix numerous issues"));
|
||||
set_row_sensitive(self->check_unity_hack, FALSE);
|
||||
gtk_switch_set_active(GTK_SWITCH(self->check_unity_hack), self->config.use_unity_hack);
|
||||
#endif
|
||||
|
||||
/* Hook up our signals. Basically the "native runtime" option controls the two library
|
||||
* options, they must be used in conjunction.
|
||||
*/
|
||||
g_signal_connect_swapped(self->check_native,
|
||||
"notify::active",
|
||||
G_CALLBACK(lsi_native_swapped),
|
||||
self);
|
||||
|
||||
/* Changes to redirect will disable/enable unity hack */
|
||||
g_signal_connect_swapped(self->check_redirect,
|
||||
"notify::active",
|
||||
G_CALLBACK(lsi_native_swapped),
|
||||
self);
|
||||
|
||||
/* Ensure our properties are now in sync. */
|
||||
lsi_native_swapped(self, self->check_native);
|
||||
|
||||
/* Finally, make sure we're visible will we. */
|
||||
gtk_widget_show_all(GTK_WIDGET(self));
|
||||
}
|
||||
|
||||
static void _align_label(GtkWidget *label)
|
||||
{
|
||||
#if GTK_CHECK_VERSION(3, 12, 0)
|
||||
gtk_widget_set_halign(label, GTK_ALIGN_START);
|
||||
#else
|
||||
gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
|
||||
#endif
|
||||
gtk_widget_set_hexpand(label, FALSE);
|
||||
gtk_widget_set_valign(label, GTK_ALIGN_START);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generic function to add titled description box with a custom widget into the grid.
|
||||
*/
|
||||
static void insert_grid(GtkWidget *grid, int *row, const char *title, const char *description,
|
||||
GtkWidget *widget)
|
||||
{
|
||||
GtkWidget *label = NULL;
|
||||
GtkWidget *desc = NULL;
|
||||
GtkStyleContext *style = NULL;
|
||||
|
||||
/* Sort out title label */
|
||||
label = gtk_label_new(title);
|
||||
_align_label(label);
|
||||
g_object_set(label, "margin-top", 12, "hexpand", TRUE, NULL);
|
||||
gtk_grid_attach(GTK_GRID(grid), label, 0, *row, 1, 1);
|
||||
|
||||
g_object_set(widget,
|
||||
"halign",
|
||||
GTK_ALIGN_END,
|
||||
"valign",
|
||||
GTK_ALIGN_END,
|
||||
"vexpand",
|
||||
FALSE,
|
||||
NULL);
|
||||
gtk_grid_attach(GTK_GRID(grid), widget, 1, *row, 1, 1);
|
||||
|
||||
*row += 1;
|
||||
|
||||
/* Sort out description label */
|
||||
desc = gtk_label_new(description);
|
||||
_align_label(desc);
|
||||
style = gtk_widget_get_style_context(desc);
|
||||
gtk_style_context_add_class(style, GTK_STYLE_CLASS_DIM_LABEL);
|
||||
#if GTK_CHECK_VERSION(3, 12, 0)
|
||||
gtk_widget_set_margin_end(desc, 12);
|
||||
#else
|
||||
gtk_widget_set_margin_right(desc, 12);
|
||||
#endif
|
||||
/* Deprecated but line wrap is busted without it.. */
|
||||
g_object_set(desc, "xalign", 0.0, NULL);
|
||||
gtk_label_set_line_wrap(GTK_LABEL(desc), TRUE);
|
||||
gtk_label_set_line_wrap_mode(GTK_LABEL(desc), PANGO_WRAP_WORD);
|
||||
gtk_label_set_max_width_chars(GTK_LABEL(desc), 90);
|
||||
|
||||
gtk_grid_attach(GTK_GRID(grid), desc, 0, *row, 1, 1);
|
||||
*row += 1;
|
||||
|
||||
/* Allow accessing these dynamic items again */
|
||||
g_object_set_data(G_OBJECT(widget), "lsi_title", label);
|
||||
g_object_set_data(G_OBJECT(widget), "lsi_desc", desc);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the complete row within the grid to the given sensitivity state
|
||||
*/
|
||||
static void set_row_sensitive(GtkWidget *toggle, gboolean sensitive)
|
||||
{
|
||||
GtkWidget *title = NULL;
|
||||
GtkWidget *desc = NULL;
|
||||
|
||||
title = g_object_get_data(G_OBJECT(toggle), "lsi_title");
|
||||
desc = g_object_get_data(G_OBJECT(toggle), "lsi_desc");
|
||||
|
||||
gtk_widget_set_sensitive(toggle, sensitive);
|
||||
gtk_widget_set_sensitive(title, sensitive);
|
||||
gtk_widget_set_sensitive(desc, sensitive);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds on the insert_grid function to insert a GtkSwitch and return only the
|
||||
* switch widget.
|
||||
*/
|
||||
static GtkWidget *insert_grid_toggle(GtkWidget *grid, int *row, const char *title,
|
||||
const char *description)
|
||||
{
|
||||
GtkWidget *toggle = NULL;
|
||||
|
||||
/* Sort out widget */
|
||||
toggle = gtk_switch_new();
|
||||
insert_grid(grid, row, title, description, toggle);
|
||||
return toggle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the sensitivity of the UI controls based on whether or not we have
|
||||
* native runtime turned on
|
||||
*/
|
||||
static void lsi_native_swapped(LsiSettingsWindow *self, __lsi_unused__ gpointer v)
|
||||
{
|
||||
gboolean native_runtime;
|
||||
gboolean redirect;
|
||||
|
||||
native_runtime = gtk_switch_get_active(GTK_SWITCH(self->check_native));
|
||||
|
||||
#ifdef HAVE_LIBREDIRECT
|
||||
redirect = gtk_switch_get_active(GTK_SWITCH(self->check_redirect));
|
||||
|
||||
set_row_sensitive(self->check_redirect, native_runtime);
|
||||
set_row_sensitive(self->check_unity_hack, native_runtime && redirect);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBINTERCEPT
|
||||
set_row_sensitive(self->check_intercept, native_runtime);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Window is closed, so let's write our config out
|
||||
*/
|
||||
static gboolean lsi_window_closed(LsiSettingsWindow *self, __lsi_unused__ GdkEvent *event,
|
||||
__lsi_unused__ gpointer v)
|
||||
{
|
||||
/* Just pop the properties back into the struct */
|
||||
self->config.force_32 = gtk_switch_get_active(GTK_SWITCH(self->check_emul32));
|
||||
self->config.use_native_runtime = gtk_switch_get_active(GTK_SWITCH(self->check_native));
|
||||
|
||||
#ifdef HAVE_LIBREDIRECT
|
||||
self->config.use_libredirect = gtk_switch_get_active(GTK_SWITCH(self->check_redirect));
|
||||
self->config.use_unity_hack = gtk_switch_get_active(GTK_SWITCH(self->check_unity_hack));
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBINTERCEPT
|
||||
self->config.use_libintercept = gtk_switch_get_active(GTK_SWITCH(self->check_intercept));
|
||||
#endif
|
||||
|
||||
/* Try to write new config */
|
||||
if (!lsi_config_store(&self->config)) {
|
||||
lsi_report_failure("%s: %s", _("Failed to save configuration"), strerror(errno));
|
||||
}
|
||||
|
||||
gtk_main_quit();
|
||||
return FALSE;
|
||||
}
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2017 Ikey Doherty <ikey@solus-project.com>
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _LsiSettingsWindow LsiSettingsWindow;
|
||||
typedef struct _LsiSettingsWindowClass LsiSettingsWindowClass;
|
||||
|
||||
#define LSI_TYPE_SETTINGS_WINDOW lsi_settings_window_get_type()
|
||||
#define LSI_SETTINGS_WINDOW(o) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((o), LSI_TYPE_SETTINGS_WINDOW, LsiSettingsWindow))
|
||||
#define LSI_IS_SETTINGS_WINDOW(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), LSI_TYPE_SETTINGS_WINDOW))
|
||||
#define LSI_SETTINGS_WINDOW_CLASS(o) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((o), LSI_TYPE_SETTINGS_WINDOW, LsiSettingsWindowClass))
|
||||
#define LSI_IS_SETTINGS_WINDOW_CLASS(o) (G_TYPE_CHECK_CLASS_TYPE((o), LSI_TYPE_SETTINGS_WINDOW))
|
||||
#define LSI_SETTINGS_WINDOW_GET_CLASS(o) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS((o), LSI_TYPE_SETTINGS_WINDOW, LsiSettingsWindowClass))
|
||||
|
||||
GtkWidget *lsi_settings_window_new(void);
|
||||
|
||||
GType lsi_settings_window_get_type(void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
+18
-124
@@ -1,7 +1,8 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016 Ikey Doherty
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
@@ -11,138 +12,31 @@
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <errno.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include <glib/gi18n.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "lsi.h"
|
||||
|
||||
static inline void _align_label(GtkWidget *label)
|
||||
{
|
||||
#if GTK_MINOR_VERSION <= 12
|
||||
gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
|
||||
#else
|
||||
gtk_widget_set_halign(label, GTK_ALIGN_START);
|
||||
#endif
|
||||
gtk_widget_set_hexpand(label, FALSE);
|
||||
gtk_widget_set_valign(label, GTK_ALIGN_START);
|
||||
}
|
||||
#include "config.h"
|
||||
#include "main-window.h"
|
||||
|
||||
/**
|
||||
* Main application entry.
|
||||
*/
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
GtkWidget *window = NULL;
|
||||
|
||||
setlocale(LC_ALL, "");
|
||||
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
|
||||
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
|
||||
textdomain(GETTEXT_PACKAGE);
|
||||
|
||||
gtk_init(&argc, &argv);
|
||||
GtkWidget *dialog = NULL;
|
||||
GtkWidget *grid = NULL;
|
||||
GtkWidget *container = NULL;
|
||||
GtkWidget *button = NULL;
|
||||
GtkWidget *image = NULL;
|
||||
GtkWidget *check_native = NULL;
|
||||
GtkWidget *check_emul32 = NULL;
|
||||
GtkWidget *label = NULL;
|
||||
GtkSettings *settings = NULL;
|
||||
int response = 0;
|
||||
bool is_x86_64 = lsi_system_is_64bit();
|
||||
LsiConfig lconfig = { 0 };
|
||||
|
||||
dialog = gtk_dialog_new();
|
||||
g_object_set(G_OBJECT(dialog),
|
||||
"title",
|
||||
"Linux Steam® Integration",
|
||||
"icon-name",
|
||||
"steam",
|
||||
NULL);
|
||||
window = lsi_settings_window_new();
|
||||
gtk_widget_show(window);
|
||||
|
||||
settings = gtk_settings_get_default();
|
||||
g_object_set(settings, "gtk-application-prefer-dark-theme", TRUE, NULL);
|
||||
gtk_main();
|
||||
|
||||
/* Sort out the buttons */
|
||||
(void)gtk_dialog_add_button(GTK_DIALOG(dialog), "Cancel", GTK_RESPONSE_REJECT);
|
||||
button = gtk_dialog_add_button(GTK_DIALOG(dialog), "OK", GTK_RESPONSE_ACCEPT);
|
||||
gtk_style_context_add_class(gtk_widget_get_style_context(button), "suggested-action");
|
||||
|
||||
/* Pack the grid */
|
||||
grid = gtk_grid_new();
|
||||
gtk_grid_set_column_spacing(GTK_GRID(grid), 12);
|
||||
gtk_grid_set_row_spacing(GTK_GRID(grid), 12);
|
||||
|
||||
container = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
|
||||
gtk_container_add(GTK_CONTAINER(container), grid);
|
||||
gtk_container_set_border_width(GTK_CONTAINER(container), 6);
|
||||
|
||||
/* Add a splash of colour. */
|
||||
image = gtk_image_new_from_icon_name("steam", GTK_ICON_SIZE_DIALOG);
|
||||
gtk_image_set_pixel_size(GTK_IMAGE(image), 64);
|
||||
gtk_grid_attach(GTK_GRID(grid), image, 0, 0, 1, 1);
|
||||
|
||||
label = gtk_label_new(
|
||||
"<big>Linux Steam® Integration</big>\n"
|
||||
"Note that settings are not applied until the next time Steam® starts.\n"
|
||||
"Use the \'Exit Steam\' option on the Steam® tray icon to exit the application.");
|
||||
_align_label(label);
|
||||
gtk_grid_attach(GTK_GRID(grid), label, 1, 0, 2, 1);
|
||||
gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
|
||||
gtk_widget_set_margin_bottom(label, 8);
|
||||
|
||||
label = gtk_label_new("Use the native runtime provided by the Operating System");
|
||||
_align_label(label);
|
||||
gtk_widget_set_tooltip_text(label,
|
||||
"Alternatively, the default Steam® runtime "
|
||||
"will be used, which may cause issues.");
|
||||
gtk_grid_attach(GTK_GRID(grid), label, 1, 1, 1, 1);
|
||||
check_native = gtk_switch_new();
|
||||
gtk_grid_attach(GTK_GRID(grid), check_native, 2, 1, 1, 1);
|
||||
|
||||
/* Handle the 32-bit cruft */
|
||||
label = gtk_label_new("Force 32-bit mode for Steam®");
|
||||
_align_label(label);
|
||||
if (is_x86_64) {
|
||||
gtk_widget_set_tooltip_text(label,
|
||||
"Some games may run better using 32-bit than 64-bit");
|
||||
} else {
|
||||
gtk_widget_set_tooltip_text(label, "You are using a 32-bit operating system");
|
||||
}
|
||||
|
||||
gtk_grid_attach(GTK_GRID(grid), label, 1, 2, 1, 1);
|
||||
check_emul32 = gtk_switch_new();
|
||||
gtk_grid_attach(GTK_GRID(grid), check_emul32, 2, 2, 1, 1);
|
||||
|
||||
gtk_widget_set_sensitive(label, is_x86_64);
|
||||
gtk_widget_set_sensitive(check_emul32, is_x86_64);
|
||||
gtk_container_set_border_width(GTK_CONTAINER(grid), 6);
|
||||
gtk_widget_set_margin_bottom(grid, 18);
|
||||
|
||||
/* Load the config */
|
||||
if (!lsi_config_load(&lconfig)) {
|
||||
lsi_config_load_defaults(&lconfig);
|
||||
}
|
||||
|
||||
/* Adapt UI to match config */
|
||||
gtk_switch_set_active(GTK_SWITCH(check_native), lconfig.use_native_runtime);
|
||||
gtk_switch_set_active(GTK_SWITCH(check_emul32), lconfig.force_32);
|
||||
|
||||
/* Run the dialog */
|
||||
gtk_widget_show_all(container);
|
||||
response = gtk_dialog_run(GTK_DIALOG(dialog));
|
||||
|
||||
if (response == GTK_RESPONSE_REJECT) {
|
||||
gtk_widget_destroy(dialog);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
/* Get the config from the UI */
|
||||
lconfig.use_native_runtime = gtk_switch_get_active(GTK_SWITCH(check_native));
|
||||
lconfig.force_32 = gtk_switch_get_active(GTK_SWITCH(check_emul32));
|
||||
|
||||
/* Cleanup */
|
||||
gtk_widget_destroy(dialog);
|
||||
|
||||
/* Try to write new config */
|
||||
if (!lsi_config_store(&lconfig)) {
|
||||
lsi_report_failure("Failed to save configuration: %s", strerror(errno));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
if with_frontend == true
|
||||
dep_gtk3 = dependency('gtk+-3.0', version: '>= 3.4.0')
|
||||
|
||||
frontend_sources = [
|
||||
'main.c',
|
||||
'main-window.c',
|
||||
]
|
||||
|
||||
frontend_name = 'lsi-settings'
|
||||
if with_snap_support == true
|
||||
frontend_name = 'linux-steam-integration.settings'
|
||||
endif
|
||||
|
||||
frontend = executable(
|
||||
frontend_name,
|
||||
sources: frontend_sources + nica_sources,
|
||||
include_directories: nica_includes,
|
||||
dependencies: [
|
||||
dep_gtk3,
|
||||
link_lsi,
|
||||
],
|
||||
install: true,
|
||||
install_dir: path_bindir,
|
||||
)
|
||||
endif
|
||||
@@ -0,0 +1,670 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <libgen.h>
|
||||
#include <link.h>
|
||||
#include <linux/limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "../common/common.h"
|
||||
#include "../common/files.h"
|
||||
#include "../common/log.h"
|
||||
#include "config.h"
|
||||
#include "nica/util.h"
|
||||
|
||||
/**
|
||||
* What's the known process name?
|
||||
*/
|
||||
static const char *matched_process = NULL;
|
||||
|
||||
static bool lsi_override_replace_with_host(const char *orig_name, const char **soname,
|
||||
const char *msg);
|
||||
static bool lsi_override_soname(unsigned int flag, const char *orig_name, const char **soname);
|
||||
|
||||
/**
|
||||
* We support a number of modes, but we mostly exist to make Steam behave
|
||||
*/
|
||||
typedef enum {
|
||||
INTERCEPT_MODE_NONE = 0,
|
||||
INTERCEPT_MODE_STEAM,
|
||||
INTERCEPT_MODE_VENDOR_OFFENDER,
|
||||
} InterceptMode;
|
||||
|
||||
/**
|
||||
* by default, we're not "on"
|
||||
*/
|
||||
static InterceptMode work_mode = INTERCEPT_MODE_NONE;
|
||||
|
||||
/* Patterns we'll permit Steam to privately load */
|
||||
static const char *steam_allowed[] = {
|
||||
/* general */
|
||||
"libicui18n.so",
|
||||
"libicuuc.so",
|
||||
"libavcodec.so.",
|
||||
"libavformat.so.",
|
||||
"libavresample.so.",
|
||||
"libavutil.so.",
|
||||
"libswscale.so.",
|
||||
"libx264.so.",
|
||||
|
||||
/* core plugins */
|
||||
"chromehtml.so",
|
||||
"crashhandler.so",
|
||||
"filesystem_stdio.so",
|
||||
"friendsui.so",
|
||||
"gameoverlayrenderer.so",
|
||||
"gameoverlayui.so",
|
||||
"libaudio.so",
|
||||
"libmiles.so",
|
||||
"libopenvr_api.so",
|
||||
"liboverride.so",
|
||||
"libsteam.so",
|
||||
"libtier0_s.so",
|
||||
"libv8.so",
|
||||
"libvideo.so",
|
||||
"libvstdlib_s.so",
|
||||
"serverbrowser.so",
|
||||
"steamclient.so",
|
||||
"steamoverlayvulkanlayer.so",
|
||||
"steamservice.so",
|
||||
"steamui.so",
|
||||
"vgui2_s.so",
|
||||
|
||||
/* big picture mode */
|
||||
"panorama",
|
||||
"libpangoft2-1.0.so",
|
||||
"libpango-1.0.so",
|
||||
"libpangocairo-1.0.so",
|
||||
|
||||
/* steamwebhelper */
|
||||
"libcef.so",
|
||||
|
||||
/* Swift shader */
|
||||
"libGLESv2.so",
|
||||
"libEGL.so",
|
||||
|
||||
/* widevine */
|
||||
"libwidevinecdmadapter.so",
|
||||
"libwidevinecdm.so",
|
||||
};
|
||||
|
||||
static const char *wanted_steam_processes[] = {
|
||||
"html5app_steam",
|
||||
"opengl-program",
|
||||
"steam",
|
||||
"steamwebhelper",
|
||||
};
|
||||
|
||||
/**
|
||||
* Vendor offendors should not be allowed to load replacements for libraries
|
||||
* that are KNOWN to cause issues, i.e. SDL + libstdc++
|
||||
*/
|
||||
static const char *vendor_blacklist[] = {
|
||||
/* base libraries being replaced will cause a C++ ABI issue when
|
||||
* loading the mesalib drivers. */
|
||||
"libgcc_",
|
||||
"libstdc++",
|
||||
|
||||
/* Ensure we don't match weird made up cruft like "libSDL2_locale" */
|
||||
"libSDL-1.2",
|
||||
|
||||
#if UINTPTR_MAX == 0xffffffffffffffff
|
||||
/* Only blacklist SDL on native 64-bit builds
|
||||
* 32-bit builds tend to do weird stuff, like ship incompatible
|
||||
* patched builds of libSDL (Don't Starve, for example)
|
||||
*/
|
||||
"libSDL2-2",
|
||||
#endif
|
||||
"libSDL2_ttf",
|
||||
"libSDL_ttf",
|
||||
"libSDL2_image",
|
||||
"libSDL_image",
|
||||
"libSDL2_mixer",
|
||||
"libSDL_mixer",
|
||||
"libSDL2_net",
|
||||
"libSDL_net",
|
||||
"libSDL2_gfx",
|
||||
"libSDL_gfx",
|
||||
|
||||
/* vendor-owned */
|
||||
"libz.so.1",
|
||||
"libfreetype.so.6",
|
||||
"libmpg123.so.0",
|
||||
|
||||
/* general problem causer. */
|
||||
"libopenal.so.",
|
||||
|
||||
/* glews (provide glew + glew110 in your distro for full compat) */
|
||||
"libGLEW.so.1.10",
|
||||
"libGLEW.so.1.12",
|
||||
|
||||
/* libglu has stable soname */
|
||||
"libGLU.so.",
|
||||
|
||||
/* Security sensitive libraries should not be replaced */
|
||||
"libcurl.so.",
|
||||
|
||||
#ifdef LSI_OVERRIDE_LIBRESSL
|
||||
/* Sometimes libressl but this is handled separately. */
|
||||
"libcrypto.so.",
|
||||
"libssl.so.",
|
||||
#else
|
||||
"libcrypto.so.1.0.0",
|
||||
"libssl.so.1.0.0",
|
||||
#endif
|
||||
/* TODO/FUTURE:
|
||||
"libaudiofile.so.1", */
|
||||
};
|
||||
|
||||
/**
|
||||
* Determine if we're in a given process set, i.e. the process name matches
|
||||
* the given table
|
||||
*/
|
||||
static bool is_in_process_set(char *process_name, const char **processes, size_t n_processes)
|
||||
{
|
||||
/* Are we some portion of the process set? */
|
||||
for (size_t i = 0; i < n_processes; i++) {
|
||||
if (streq(processes[i], process_name)) {
|
||||
work_mode = INTERCEPT_MODE_STEAM;
|
||||
matched_process = processes[i];
|
||||
lsi_log_debug("loading libintercept for '%s'", matched_process);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find out if we're being executed by a process we actually need to override,
|
||||
* otherwise we'd not be loaded by rtld-audit
|
||||
*/
|
||||
static void check_is_intercept_candidate(void)
|
||||
{
|
||||
autofree(char) *nom = NULL;
|
||||
|
||||
nom = lsi_get_process_base_name();
|
||||
if (!nom) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_in_process_set(nom, wanted_steam_processes, ARRAY_SIZE(wanted_steam_processes))) {
|
||||
work_mode = INTERCEPT_MODE_STEAM;
|
||||
} else {
|
||||
work_mode = INTERCEPT_MODE_VENDOR_OFFENDER;
|
||||
matched_process = "vendor_offender";
|
||||
}
|
||||
lsi_log_set_id(matched_process);
|
||||
}
|
||||
|
||||
/**
|
||||
* la_version is our main entry point and will only continue if our
|
||||
* process is explicitly Steam
|
||||
*/
|
||||
_nica_public_ unsigned int la_version(unsigned int supported_version)
|
||||
{
|
||||
/* Unfortunately glibc will die if we tell it to skip us .. */
|
||||
check_is_intercept_candidate();
|
||||
return supported_version;
|
||||
}
|
||||
|
||||
/**
|
||||
* lsi_search_steam handles whitelisting for the main Steam processes
|
||||
*/
|
||||
char *lsi_search_steam(unsigned int flag, const char *name)
|
||||
{
|
||||
const char *soname = NULL;
|
||||
|
||||
/* Preemptively catch transmutations */
|
||||
if (lsi_override_soname(flag, name, &soname)) {
|
||||
return (char *)soname;
|
||||
}
|
||||
|
||||
if (!lsi_file_exists(name)) {
|
||||
return (char *)name;
|
||||
}
|
||||
|
||||
/* Find out if its a Steam private lib.. These are relative "./" files too! */
|
||||
if (name && (strstr(name, "/Steam/") || strncmp(name, "./", 2) == 0)) {
|
||||
for (size_t i = 0; i < ARRAY_SIZE(steam_allowed); i++) {
|
||||
if (strstr(name, steam_allowed[i])) {
|
||||
return (char *)name;
|
||||
}
|
||||
}
|
||||
lsi_log_debug("blacklisted loading of vendor library: \033[34;1m%s\033[0m", name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (char *)name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Source identifier patterns that indicate a soname replacement is happening.
|
||||
* Note that this is a basic pattern match for the soname and just allows us
|
||||
* to lookup the transmute target
|
||||
*/
|
||||
static const char *vendor_transmute_source[] = {
|
||||
/* Common */
|
||||
"libSDL2-2.0.",
|
||||
"libSDL2_image-2.0.",
|
||||
|
||||
/* ".so" renames */
|
||||
"libSDL2_ttf.so",
|
||||
"libSDL2_image.so",
|
||||
"libSDL2_mixer.so",
|
||||
"libSDL2_net.so",
|
||||
"libSDL2_gfx.so",
|
||||
|
||||
/* libressl (security updates) */
|
||||
#ifdef LSI_OVERRIDE_LIBRESSL
|
||||
"libcrypto.so.36",
|
||||
"libssl.so.37",
|
||||
"libcrypto.so.42",
|
||||
"libssl.so.44",
|
||||
#endif
|
||||
|
||||
/* old name for openal */
|
||||
"libopenal-soft.so.1",
|
||||
|
||||
/* invalid curls */
|
||||
"libcurl-gnutls.so.3",
|
||||
"libcurl.so.3",
|
||||
|
||||
"libbz2.so.1.0",
|
||||
|
||||
"libudev.so.0",
|
||||
};
|
||||
|
||||
/**
|
||||
* The transmute target is the intended replacement for any source name, assuming
|
||||
* that the soname doesn't identically match the currently requested soname.
|
||||
* This allows us to do on the fly replacements for re-soname'd libraries.
|
||||
*/
|
||||
static const char *vendor_transmute_target[] = {
|
||||
/* Common */
|
||||
"libSDL2-2.0.so.0",
|
||||
"libSDL2_image-2.0.so.0",
|
||||
|
||||
/* ".so" renames */
|
||||
"libSDL2_ttf-2.0.so.0",
|
||||
"libSDL2_image-2.0.so.0",
|
||||
"libSDL2_mixer-2.0.so.0",
|
||||
"libSDL2_net-2.0.so.0",
|
||||
"libSDL2_gfx-1.0.so.0",
|
||||
|
||||
/* libressl (security updates) */
|
||||
#if defined(LSI_LIBRESSL_MODE_SHIM)
|
||||
"libcrypto" LSI_LIBRESSL_SUFFIX ".so",
|
||||
"libssl" LSI_LIBRESSL_SUFFIX ".so",
|
||||
"libcrypto" LSI_LIBRESSL_SUFFIX ".so",
|
||||
"libssl" LSI_LIBRESSL_SUFFIX ".so",
|
||||
#elif defined(LSI_LIBRESSL_MODE_NATIVE)
|
||||
"libcrypto.so.1.0.0",
|
||||
"libssl.so.1.0.0",
|
||||
"libcrypto.so.1.0.0",
|
||||
"libssl.so.1.0.0",
|
||||
#endif
|
||||
|
||||
/* new name for openal */
|
||||
"libopenal.so.1",
|
||||
|
||||
/* invalid curls */
|
||||
"libcurl-gnutls.so.4",
|
||||
"libcurl.so.4",
|
||||
|
||||
"libbz2.so.1.0.6",
|
||||
|
||||
"libudev.so.1",
|
||||
};
|
||||
|
||||
/**
|
||||
* Every so often a game comes along that does the following:
|
||||
*
|
||||
* open("path") ? dlopen("path").
|
||||
* Except: path = "*.dll", dlopen() is transformed to ".dll.so"
|
||||
*
|
||||
* This is unrelated to the ".la" errors
|
||||
*/
|
||||
static bool lsi_override_dll_fail(const char *orig_name, const char **soname)
|
||||
{
|
||||
size_t len = strlen(orig_name);
|
||||
static char path_lookup[PATH_MAX];
|
||||
|
||||
if (len < 7) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strncmp(orig_name + (len - 7), ".dll.so", 7) != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!strncpy(path_lookup, orig_name, len - 3)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!lsi_file_exists(path_lookup)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*soname = path_lookup;
|
||||
lsi_log_debug("fixed invalid suffix dlopen() \033[31;1m%s\033[0m -> \033[34;1m%s\033[0m",
|
||||
orig_name,
|
||||
path_lookup);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mono games might try looking for /x86/ plugin directory for a 64-bit process,
|
||||
* as seen with testing with Project Highrise.
|
||||
*
|
||||
* This function simply redirects the dlopen to the file in the x86_64 directory,
|
||||
* if it actually exists.
|
||||
*
|
||||
* Typically this is for libCSteamWorks, libsteam_api, and Unity ScreenSelector.so
|
||||
*/
|
||||
#if UINTPTR_MAX == 0xffffffffffffffff
|
||||
static bool lsi_override_x86_derp(const char *orig_name, const char **soname)
|
||||
{
|
||||
static char path_copy[PATH_MAX];
|
||||
static char path_lookup[PATH_MAX];
|
||||
char *small_name = NULL;
|
||||
char *dir = NULL;
|
||||
|
||||
if (!(strstr(orig_name, "/Plugins/x86/") && strstr(orig_name, ".so"))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!strcpy(path_copy, orig_name)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
small_name = basename(path_copy);
|
||||
dir = dirname(path_copy);
|
||||
|
||||
if (snprintf(path_lookup, sizeof(path_lookup), "%s/../x86_64/%s", dir, small_name) < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!lsi_file_exists(path_lookup)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*soname = path_lookup;
|
||||
lsi_log_debug(
|
||||
"fixed invalid architecture dlopen() \033[31;1m%s\033[0m -> \033[34;1m%s\033[0m",
|
||||
orig_name,
|
||||
path_lookup);
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
static bool lsi_override_x86_derp(__lsi_unused__ const char *orig_name,
|
||||
__lsi_unused__ const char **soname)
|
||||
{
|
||||
/* Don't perform x86 translation on 32-bit machines */
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Internal helper for path replacement to host lib
|
||||
*/
|
||||
static bool lsi_override_replace_with_host(const char *orig_name, const char **soname,
|
||||
const char *msg)
|
||||
{
|
||||
static char path_lookup[PATH_MAX];
|
||||
static char path_copy[PATH_MAX];
|
||||
char *small_name = NULL;
|
||||
static const char *library_paths[] = {
|
||||
#if UINTPTR_MAX == 0xffffffffffffffff
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
"/var/lib/snapd/lib/gl",
|
||||
#endif
|
||||
"/usr/lib64",
|
||||
"/usr/lib/x86_64-linux-gnu",
|
||||
"/usr/lib",
|
||||
#else
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
"/var/lib/snapd/lib/gl32",
|
||||
#endif
|
||||
"/usr/lib32",
|
||||
"/usr/lib/i386-linux-gnu",
|
||||
"/usr/lib",
|
||||
#endif
|
||||
};
|
||||
|
||||
if (!strcpy(path_copy, orig_name)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
small_name = basename(path_copy);
|
||||
|
||||
/* Iterate all of the library paths for this process architecture and try
|
||||
* to find a system variant of the library instead of allowing the process
|
||||
* to dlopen() the vendored version.
|
||||
*/
|
||||
for (size_t i = 0; i < ARRAY_SIZE(library_paths); i++) {
|
||||
if (snprintf(path_lookup,
|
||||
sizeof(path_lookup),
|
||||
"%s/%s",
|
||||
library_paths[i],
|
||||
small_name) < 0) {
|
||||
return false;
|
||||
}
|
||||
if (!lsi_file_exists(path_lookup)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* We hit a match but it was identical to our expectation */
|
||||
if (strcmp(path_lookup, orig_name) == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*soname = path_lookup;
|
||||
if (!msg) {
|
||||
return true;
|
||||
}
|
||||
lsi_log_debug("%s \033[31;1m%s\033[0m -> \033[34;1m%s\033[0m",
|
||||
msg,
|
||||
orig_name,
|
||||
path_lookup);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* lsi_override_dlopen is used to override simple dlopen() requests typically
|
||||
* used by Mono games, i.e.:
|
||||
*
|
||||
* <dllmap dll="SDL2.dll" os="linux" cpu="x86-64" target="./lib64/libSDL2-2.0.so.0"/>
|
||||
*
|
||||
* We'll attempt to do a trivial lookup for "/usr/./lib64/libSDL2-2.0.so.0 in this
|
||||
* case.
|
||||
*/
|
||||
static bool lsi_override_dlopen(const char *orig_name, const char **soname)
|
||||
{
|
||||
if (lsi_override_dll_fail(orig_name, soname)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!lsi_file_exists(orig_name)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (lsi_override_x86_derp(orig_name, soname)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return lsi_override_replace_with_host(orig_name, soname, "intercepting vendor dlopen()");
|
||||
}
|
||||
|
||||
/**
|
||||
* lsi_override_soname will deal with LA_SER_ORIG entries, i.e. the original
|
||||
* soname request when the linker tries to load a library.
|
||||
*
|
||||
* Certain Steam games (notably Feral Interactive ports) use their own vendored
|
||||
* SDL libraries with changed sonames, which are implicitly blacklisted by the
|
||||
* lsi_blacklist_vendor function.
|
||||
*
|
||||
* As such, we intercept those renamed libraries, and convert their names back
|
||||
* to the ABI stable system libraries on the fly.
|
||||
*/
|
||||
static bool lsi_override_soname(unsigned int flag, const char *orig_name, const char **soname)
|
||||
{
|
||||
*soname = NULL;
|
||||
|
||||
/* We only need to deal with LA_SER_ORIG */
|
||||
if ((flag & LA_SER_ORIG) != LA_SER_ORIG) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Don't transform dlopen */
|
||||
if (strstr(orig_name, "/")) {
|
||||
return lsi_override_dlopen(orig_name, soname);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < ARRAY_SIZE(vendor_transmute_source); i++) {
|
||||
if (!strstr(orig_name, vendor_transmute_source[i])) {
|
||||
continue;
|
||||
}
|
||||
/* Ensure we're not just replacing the same thing here as the
|
||||
* string would be identical, no real replacement would happen,
|
||||
* and ld will be confused about memory and die.
|
||||
*/
|
||||
if (streq(orig_name, vendor_transmute_target[i])) {
|
||||
continue;
|
||||
}
|
||||
*soname = vendor_transmute_target[i];
|
||||
lsi_log_debug(
|
||||
"transforming vendor soname: \033[31;1m%s\033[0m -> \033[34;1m%s\033[0m",
|
||||
orig_name,
|
||||
*soname);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* If the library exists locally, and we're attempting to load this from a
|
||||
* relative location, strongly attempt to actually use the system-version instead.
|
||||
*
|
||||
* Thus, if our CWD is our LD_LIBRARY_PATH and contains "libfreetype.so.6", we'll
|
||||
* try to use the host version of the library if that exists, instead of relying
|
||||
* on the locally vendored, potentially insecure/buggy version.
|
||||
*/
|
||||
static bool lsi_override_local(unsigned int flag, const char *orig_name, const char **soname)
|
||||
{
|
||||
*soname = NULL;
|
||||
|
||||
/* We only need to deal with LA_SER_ORIG */
|
||||
if ((flag & LA_SER_ORIG) != LA_SER_ORIG) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* We only care about relative paths */
|
||||
if (strstr(orig_name, "/")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* We also only care about relative paths */
|
||||
if (!lsi_file_exists(orig_name)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Resolve all paths back to the real library path version if they exist */
|
||||
for (size_t i = 0; i < ARRAY_SIZE(vendor_blacklist); i++) {
|
||||
if (!strstr(orig_name, vendor_blacklist[i])) {
|
||||
continue;
|
||||
}
|
||||
return lsi_override_replace_with_host(orig_name,
|
||||
soname,
|
||||
"forcing use of host library");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
char *lsi_blacklist_vendor(unsigned int flag, const char *name)
|
||||
{
|
||||
/* Find out if it exists */
|
||||
bool file_exists = lsi_file_exists(name);
|
||||
const char *override_soname = NULL;
|
||||
|
||||
/* Find out if we have to rename some libraries on the fly */
|
||||
if (lsi_override_soname(flag, name, &override_soname)) {
|
||||
return (char *)override_soname;
|
||||
}
|
||||
|
||||
/* Locally exists due to directory foobar */
|
||||
if (lsi_override_local(flag, name, &override_soname)) {
|
||||
return (char *)override_soname;
|
||||
}
|
||||
|
||||
/* Find out if its a Steam private lib.. These are relative "./" files too! */
|
||||
if (name && (strstr(name, "/Steam/") || strstr(name, "/steamapps/") ||
|
||||
strncmp(name, "./", 2) == 0)) {
|
||||
for (size_t i = 0; i < ARRAY_SIZE(vendor_blacklist); i++) {
|
||||
if (!strstr(name, vendor_blacklist[i])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (file_exists) {
|
||||
lsi_log_debug(
|
||||
"blacklisted loading of vendor library: \033[34;1m%s\033[0m",
|
||||
name);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
/* Allowed to exist */
|
||||
return (char *)name;
|
||||
}
|
||||
|
||||
return (char *)name;
|
||||
}
|
||||
|
||||
/**
|
||||
* la_objsearch will allow us to blacklist certain LD_LIBRARY_PATH duplicate
|
||||
* libraries being loaded by the Steam client, such as the broken libSDL shipped
|
||||
* as a private vendored lib
|
||||
*/
|
||||
_nica_public_ char *la_objsearch(const char *name, __lsi_unused__ uintptr_t *cookie,
|
||||
unsigned int flag)
|
||||
{
|
||||
switch (work_mode) {
|
||||
case INTERCEPT_MODE_STEAM:
|
||||
return lsi_search_steam(flag, name);
|
||||
case INTERCEPT_MODE_VENDOR_OFFENDER:
|
||||
return lsi_blacklist_vendor(flag, name);
|
||||
case INTERCEPT_MODE_NONE:
|
||||
default:
|
||||
return (char *)name;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,22 @@
|
||||
# Only build libintercept if told to!
|
||||
|
||||
if with_libintercept == true
|
||||
|
||||
intercept_sources = [
|
||||
'main.c',
|
||||
]
|
||||
|
||||
sym_map = join_paths(meson.current_source_dir(), 'sym.map')
|
||||
|
||||
main_intercept = shared_library(
|
||||
'lsi-intercept',
|
||||
sources: intercept_sources,
|
||||
c_args: ['-fvisibility=hidden'],
|
||||
link_args: ['-Wl,--version-script=@0@'.format(sym_map)],
|
||||
include_directories: nica_includes,
|
||||
dependencies: [
|
||||
link_lsi_common,
|
||||
],
|
||||
install: true,
|
||||
)
|
||||
endif
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
global:
|
||||
la_objsearch;
|
||||
la_version;
|
||||
local:
|
||||
*;
|
||||
};
|
||||
+1
-1
Submodule src/libnica updated: e71a442667...8ec3cf2291
@@ -1,7 +1,8 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016 Ikey Doherty
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
@@ -26,6 +27,8 @@
|
||||
#include "nica/hashmap.h"
|
||||
#include "nica/inifile.h"
|
||||
|
||||
#include "../common/files.h"
|
||||
|
||||
/**
|
||||
* Configuration file suffix, i.e. ~/.config/linux-steam-integration.conf
|
||||
*/
|
||||
@@ -42,38 +45,6 @@
|
||||
*/
|
||||
#define LSI_VENDOR_CONFIG_FILE VENDORDIR "/ " LSI_CONFIG_FILE
|
||||
|
||||
/**
|
||||
* Determine the home directory
|
||||
*/
|
||||
static const char *lsi_get_home_dir(void)
|
||||
{
|
||||
char *c = NULL;
|
||||
struct passwd *p = NULL;
|
||||
|
||||
c = getenv("HOME");
|
||||
if (c) {
|
||||
return c;
|
||||
}
|
||||
p = getpwuid(getuid());
|
||||
if (!p) {
|
||||
return NULL;
|
||||
}
|
||||
return p->pw_dir;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the home config directory
|
||||
*/
|
||||
static char *lsi_get_user_config_dir(void)
|
||||
{
|
||||
const char *home = lsi_get_home_dir();
|
||||
char *c = NULL;
|
||||
if (asprintf(&c, "%s/.config", home) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the user config file path
|
||||
*/
|
||||
@@ -143,6 +114,27 @@ bool lsi_config_load(LsiConfig *config)
|
||||
map_val = NULL;
|
||||
}
|
||||
|
||||
/* Do we want libintercept? */
|
||||
map_val = nc_hashmap_get(nc_hashmap_get(mconfig, "Steam"), "use-libintercept");
|
||||
if (map_val) {
|
||||
config->use_libintercept = lsi_is_boolean_true(map_val);
|
||||
map_val = NULL;
|
||||
}
|
||||
|
||||
/* Do we want libredirect? */
|
||||
map_val = nc_hashmap_get(nc_hashmap_get(mconfig, "Steam"), "use-libredirect");
|
||||
if (map_val) {
|
||||
config->use_libredirect = lsi_is_boolean_true(map_val);
|
||||
map_val = NULL;
|
||||
}
|
||||
|
||||
/* Do we want unity3d hack? */
|
||||
map_val = nc_hashmap_get(nc_hashmap_get(mconfig, "Steam"), "use-unity-hack");
|
||||
if (map_val) {
|
||||
config->use_unity_hack = lsi_is_boolean_true(map_val);
|
||||
map_val = NULL;
|
||||
}
|
||||
|
||||
/* Check if 32-bit is being forced */
|
||||
map_val = nc_hashmap_get(nc_hashmap_get(mconfig, "Steam"), "force-32bit");
|
||||
if (map_val) {
|
||||
@@ -163,11 +155,23 @@ bool lsi_config_store(LsiConfig *config)
|
||||
{
|
||||
autofree(FILE) *fp = NULL;
|
||||
autofree(char) *conf = NULL;
|
||||
autofree(char) *dir = NULL;
|
||||
|
||||
if (!config) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Ensure we have config directory, i.e. when as a snap.. */
|
||||
dir = lsi_get_user_config_dir();
|
||||
if (!dir) {
|
||||
return false;
|
||||
}
|
||||
if (!lsi_file_exists(dir)) {
|
||||
if (mkdir(dir, 00755) < 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
conf = lsi_get_user_config_file();
|
||||
if (!conf) {
|
||||
return false;
|
||||
@@ -178,9 +182,13 @@ bool lsi_config_store(LsiConfig *config)
|
||||
return false;
|
||||
}
|
||||
if (fprintf(fp,
|
||||
"[Steam]\nuse-native-runtime = %s\nforce-32bit = %s\n",
|
||||
"[Steam]\nuse-native-runtime = %s\nforce-32bit = %s\nuse-libintercept = "
|
||||
"%s\nuse-libredirect = %s\nuse-unity-hack = %s\n",
|
||||
lsi_bool_to_string(config->use_native_runtime),
|
||||
lsi_bool_to_string(config->force_32)) < 0) {
|
||||
lsi_bool_to_string(config->force_32),
|
||||
lsi_bool_to_string(config->use_libintercept),
|
||||
lsi_bool_to_string(config->use_libredirect),
|
||||
lsi_bool_to_string(config->use_unity_hack)) < 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -194,6 +202,9 @@ void lsi_config_load_defaults(LsiConfig *config)
|
||||
* things that LSI knows about */
|
||||
config->force_32 = false;
|
||||
config->use_native_runtime = true;
|
||||
config->use_libintercept = true;
|
||||
config->use_libredirect = true;
|
||||
config->use_unity_hack = true;
|
||||
}
|
||||
|
||||
void lsi_report_failure(const char *s, ...)
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016 Ikey Doherty
|
||||
* Copyright © 2016-2017 Ikey Doherty <ikey@solus-project.com>
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
@@ -16,25 +16,21 @@
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../common/common.h"
|
||||
#include "config.h"
|
||||
|
||||
/* Mark a variable/argument as unused to skip warnings */
|
||||
#define __lsi_unused__ __attribute__((unused))
|
||||
|
||||
/* Force inlining of a function */
|
||||
#define __lsi_inline__ __attribute__((always_inline))
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
|
||||
|
||||
/**
|
||||
* Current Linux Steam Integration settings.
|
||||
*/
|
||||
typedef struct LsiConfig {
|
||||
bool force_32; /**<Do we force 32-bit? */
|
||||
bool use_native_runtime; /**<Do we force our native runtime? */
|
||||
bool use_libintercept; /**<Do we force libintercept? */
|
||||
bool use_libredirect; /**<Do we force libredirect? */
|
||||
bool use_unity_hack; /**<Do we enable unity3d hack? */
|
||||
} LsiConfig;
|
||||
|
||||
/**
|
||||
@@ -101,15 +97,6 @@ __lsi_inline__ static inline const char *lsi_preload_list(void)
|
||||
*/
|
||||
void lsi_report_failure(const char *s, ...);
|
||||
|
||||
/**
|
||||
* Quick helper to determine if the path exists
|
||||
*/
|
||||
__lsi_inline__ static inline bool lsi_file_exists(const char *path)
|
||||
{
|
||||
__lsi_unused__ struct stat st = { 0 };
|
||||
return lstat(path, &st) == 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
@@ -0,0 +1,21 @@
|
||||
# Only build liblsi if told to!
|
||||
|
||||
if shim_behaviour != 'none' or with_frontend == true
|
||||
|
||||
lsi_sources = [
|
||||
'lsi.c',
|
||||
]
|
||||
|
||||
lib_lsi = static_library(
|
||||
'lsi-lsi',
|
||||
sources: lsi_sources,
|
||||
dependencies: [
|
||||
link_lsi_common,
|
||||
],
|
||||
include_directories: nica_includes,
|
||||
)
|
||||
link_lsi = declare_dependency(
|
||||
link_with: lib_lsi,
|
||||
include_directories: include_directories('.'),
|
||||
)
|
||||
endif
|
||||
@@ -0,0 +1,24 @@
|
||||
# Track how to build nica, as we actually build it twice..
|
||||
|
||||
nica_sources = [
|
||||
'../libnica/src/array.c',
|
||||
'../libnica/src/hashmap.c',
|
||||
'../libnica/src/files.c',
|
||||
'../libnica/src/inifile.c',
|
||||
'../libnica/src/list.c',
|
||||
'../libnica/src/nc-string.c',
|
||||
'../libnica/src/util.c',
|
||||
]
|
||||
|
||||
nica_includes = [
|
||||
include_directories('libnica/src/include'),
|
||||
include_directories('libnica/src/include/nica'),
|
||||
config_h_dir,
|
||||
]
|
||||
|
||||
subdir('common')
|
||||
subdir('lsi')
|
||||
subdir('frontend')
|
||||
subdir('intercept')
|
||||
subdir('redirect')
|
||||
subdir('shim')
|
||||
@@ -0,0 +1,390 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <libgen.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
/* Expose getpwuid override in snapd */
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
#include <pwd.h>
|
||||
#endif
|
||||
|
||||
#include "../common/common.h"
|
||||
#include "../common/files.h"
|
||||
#include "../common/log.h"
|
||||
#include "nica/util.h"
|
||||
|
||||
#include "private.h"
|
||||
#include "profile.h"
|
||||
#include "redirect.h"
|
||||
|
||||
#define _STRINGIFY(x) #x
|
||||
|
||||
#define SYMBOL_BINDING(l, x) \
|
||||
{ \
|
||||
.handle = &lsi_table.handles.l, .name = _STRINGIFY(x), \
|
||||
.func = (void **)(&lsi_table.x), .func_size = sizeof(lsi_table.x) \
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether we've initialised yet or not.
|
||||
*/
|
||||
static volatile bool lsi_init = false;
|
||||
|
||||
/**
|
||||
* Whether we should actually perform overrides
|
||||
* This is determined by the process name
|
||||
*/
|
||||
static volatile bool lsi_override = false;
|
||||
|
||||
/**
|
||||
* Known profiles
|
||||
*/
|
||||
static lsi_profile_generator_func generators[] = {
|
||||
&lsi_redirect_profile_new_ark,
|
||||
&lsi_redirect_profile_new_project_highrise,
|
||||
};
|
||||
|
||||
/**
|
||||
* Easy mapping to make it quick and easy to add new function overrides
|
||||
*/
|
||||
typedef struct LsiSymbolBinding {
|
||||
void **handle;
|
||||
char *name;
|
||||
void **func;
|
||||
size_t func_size;
|
||||
} LsiSymbolBinding;
|
||||
|
||||
/**
|
||||
* Our redirect instance, stack only.
|
||||
*/
|
||||
static LsiRedirectTable lsi_table = { 0 };
|
||||
|
||||
/**
|
||||
* Contains all of our replacement rules.
|
||||
*/
|
||||
static LsiRedirectProfile *lsi_profile = NULL;
|
||||
|
||||
/**
|
||||
* Our current set of libc bindings. This sets up the LsiRedirectTable with
|
||||
* all of our needed dlsym() functions from libc.so.6.
|
||||
*/
|
||||
static LsiSymbolBinding lsi_libc_bindings[] = {
|
||||
SYMBOL_BINDING(libc, open),
|
||||
SYMBOL_BINDING(libc, fopen64),
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
SYMBOL_BINDING(libc, getpwuid),
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* We'll only perform teardown code if the process doesn't `abort()` or `_exit()`
|
||||
*/
|
||||
__attribute__((destructor)) static void lsi_redirect_shutdown(void)
|
||||
{
|
||||
if (lsi_profile) {
|
||||
lsi_redirect_profile_free(lsi_profile);
|
||||
lsi_profile = NULL;
|
||||
}
|
||||
|
||||
if (!lsi_init) {
|
||||
return;
|
||||
}
|
||||
lsi_init = false;
|
||||
|
||||
lsi_unity_cleanup(&lsi_table);
|
||||
|
||||
if (lsi_table.handles.libc) {
|
||||
dlclose(lsi_table.handles.libc);
|
||||
lsi_table.handles.libc = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal helper to perform the symbol binding
|
||||
*/
|
||||
static bool lsi_redirect_bind_function(void *handle, const char *name, void **out_func,
|
||||
size_t func_size)
|
||||
{
|
||||
void *symbol_lookup = NULL;
|
||||
char *dl_error = NULL;
|
||||
|
||||
/* Safely look up the symbol */
|
||||
symbol_lookup = dlsym(handle, name);
|
||||
dl_error = dlerror();
|
||||
if (dl_error || !symbol_lookup) {
|
||||
fprintf(stderr, "Failed to bind '%s': %s\n", name, dl_error);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Have the symbol correctly, copy it to make it usable */
|
||||
memcpy(out_func, &symbol_lookup, func_size);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Responsible for setting up the vfunc redirect table so that we're able to
|
||||
* get `open` and such working before we've hit the constructor, and ensure
|
||||
* we only init once.
|
||||
*/
|
||||
static void lsi_redirect_init_tables(void)
|
||||
{
|
||||
if (lsi_init) {
|
||||
return;
|
||||
}
|
||||
|
||||
lsi_init = true;
|
||||
|
||||
/* Try to explicitly open libc. We can't safely rely on RTLD_NEXT
|
||||
* as we might be dealing with a strange link order
|
||||
*/
|
||||
lsi_table.handles.libc = dlopen("libc.so.6", RTLD_LAZY);
|
||||
if (!lsi_table.handles.libc) {
|
||||
fprintf(stderr, "Unable to grab libc.so.6 handle: %s\n", dlerror());
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/* Hook up all necessary symbol binding */
|
||||
for (size_t i = 0; i < ARRAY_SIZE(lsi_libc_bindings); i++) {
|
||||
LsiSymbolBinding *binding = &lsi_libc_bindings[i];
|
||||
if (!lsi_redirect_bind_function(*(binding->handle),
|
||||
binding->name,
|
||||
binding->func,
|
||||
binding->func_size)) {
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
|
||||
/* We might not get an unload, so chain onto atexit */
|
||||
atexit(lsi_redirect_shutdown);
|
||||
return;
|
||||
|
||||
failed:
|
||||
/* Pretty damn fatal. */
|
||||
lsi_redirect_shutdown();
|
||||
abort();
|
||||
}
|
||||
|
||||
/**
|
||||
* Main entry point into this redirect module.
|
||||
*
|
||||
* We'll check the process name and determine if we're interested in installing
|
||||
* some redirect hooks into this library.
|
||||
* Otherwise we'll continue to operate in a pass-through mode
|
||||
*/
|
||||
__attribute__((constructor)) static void lsi_redirect_init(void)
|
||||
{
|
||||
/* Ensure we're open. */
|
||||
lsi_redirect_init_tables();
|
||||
autofree(char) *process_name = NULL;
|
||||
char **paths = NULL;
|
||||
char **orig = NULL;
|
||||
|
||||
/* Absolute path to the process for fine-grained matching */
|
||||
process_name = lsi_get_process_name();
|
||||
|
||||
if (!process_name) {
|
||||
fputs("Out of memory!\n", stderr);
|
||||
return;
|
||||
}
|
||||
|
||||
lsi_unity_startup(&lsi_table);
|
||||
|
||||
/* Grab the steam installation directories */
|
||||
orig = paths = lsi_get_steam_paths();
|
||||
|
||||
/* For each path try to form a valid profile for the process name and Steam directory */
|
||||
while (*paths) {
|
||||
for (size_t i = 0; i < ARRAY_SIZE(generators); i++) {
|
||||
lsi_profile = generators[i](process_name, *paths);
|
||||
if (lsi_profile) {
|
||||
goto use_profile;
|
||||
}
|
||||
}
|
||||
++paths;
|
||||
}
|
||||
|
||||
use_profile:
|
||||
/* Rewind path set */
|
||||
paths = orig;
|
||||
|
||||
if (!lsi_profile) {
|
||||
goto clean_array;
|
||||
}
|
||||
|
||||
lsi_override = true;
|
||||
lsi_log_debug("Enable lsi_redirect for '%s'", lsi_profile->name);
|
||||
|
||||
clean_array:
|
||||
|
||||
/* Free them again */
|
||||
if (paths) {
|
||||
while (*paths) {
|
||||
free(*paths);
|
||||
++paths;
|
||||
}
|
||||
free(orig);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a redirect path from the table if it exists, otherwise return NULL
|
||||
*/
|
||||
static char *lsi_get_redirect_path(const char *syscall_id, LsiRedirectOperation op, const char *p)
|
||||
{
|
||||
autofree(char) *path = NULL;
|
||||
LsiRedirect *redirect = NULL;
|
||||
|
||||
/* Get the absolute path here */
|
||||
path = realpath(p, NULL);
|
||||
if (!path) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* find a valid replacement */
|
||||
for (redirect = lsi_profile->op_table[op]; redirect; redirect = redirect->next) {
|
||||
/* Currently we only known path replacements */
|
||||
if (redirect->type != LSI_REDIRECT_PATH) {
|
||||
continue;
|
||||
}
|
||||
if (strcmp(redirect->path_source, path) != 0) {
|
||||
continue;
|
||||
}
|
||||
if (!lsi_file_exists(redirect->path_target)) {
|
||||
lsi_log_warn("Replacement path does not exist: %s", redirect->path_target);
|
||||
return NULL;
|
||||
}
|
||||
lsi_log_info("%s(): Replaced '%s' with '%s'",
|
||||
syscall_id,
|
||||
path,
|
||||
redirect->path_target);
|
||||
return strdup(redirect->path_target);
|
||||
}
|
||||
|
||||
/* Got nothin' */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_nica_public_ int open(const char *p, int flags, ...)
|
||||
{
|
||||
va_list va;
|
||||
mode_t mode;
|
||||
LsiRedirectOperation op = LSI_OPERATION_OPEN;
|
||||
autofree(char) *replacement = NULL;
|
||||
|
||||
/* Must ensure we're **really** initialised, as we might see open happen
|
||||
* before the constructor..
|
||||
*/
|
||||
lsi_redirect_init_tables();
|
||||
|
||||
/* Grab the mode_t */
|
||||
va_start(va, flags);
|
||||
mode = va_arg(va, mode_t);
|
||||
va_end(va);
|
||||
|
||||
lsi_maybe_init_unity3d(&lsi_table, p);
|
||||
|
||||
/* Not interested in this guy apparently */
|
||||
if (!lsi_override) {
|
||||
goto fallback_open;
|
||||
}
|
||||
|
||||
replacement = lsi_get_redirect_path("open", op, p);
|
||||
if (replacement) {
|
||||
return lsi_table.open(replacement, flags, mode);
|
||||
}
|
||||
|
||||
fallback_open:
|
||||
return lsi_table.open(p, flags, mode);
|
||||
}
|
||||
|
||||
_nica_public_ FILE *fopen64(const char *p, const char *modes)
|
||||
{
|
||||
LsiRedirectOperation op = LSI_OPERATION_OPEN;
|
||||
autofree(char) *replacement = NULL;
|
||||
|
||||
/* Must ensure we're **really** initialised, as we might see open happen
|
||||
* before the constructor..
|
||||
*/
|
||||
lsi_redirect_init_tables();
|
||||
|
||||
lsi_maybe_init_unity3d(&lsi_table, p);
|
||||
|
||||
/* Not interested in this guy apparently */
|
||||
if (!lsi_override) {
|
||||
goto fallback_open;
|
||||
}
|
||||
|
||||
replacement = lsi_get_redirect_path("fopen64", op, p);
|
||||
if (replacement) {
|
||||
return lsi_table.fopen64(replacement, modes);
|
||||
}
|
||||
|
||||
fallback_open:
|
||||
|
||||
if (is_unity3d_prefs_file(&lsi_table, p)) {
|
||||
return lsi_unity_redirect(&lsi_table, p, modes);
|
||||
}
|
||||
return lsi_table.fopen64(p, modes);
|
||||
}
|
||||
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
_nica_public_ struct passwd *getpwuid(uid_t uid)
|
||||
{
|
||||
/* Must ensure we're **really** initialised, as we might see open happen
|
||||
* before the constructor..
|
||||
*/
|
||||
lsi_redirect_init_tables();
|
||||
|
||||
struct passwd *ret = NULL;
|
||||
const char *snap_root = getenv("SNAP_USER_COMMON");
|
||||
|
||||
/* If they're requesting our uid and SNAP_USER_COMMON is set, then
|
||||
* let us override the home directory to be correct.
|
||||
*/
|
||||
ret = lsi_table.getpwuid(uid);
|
||||
if (!ret) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (uid == getuid() && snap_root && *snap_root) {
|
||||
ret->pw_dir = (char *)snap_root;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,32 @@
|
||||
# Only build libredirect if told to!
|
||||
|
||||
if with_libredirect == true
|
||||
|
||||
# Might not need libdl for alt libcs
|
||||
libdl = meson.get_compiler('c').find_library('dl', required : false)
|
||||
librt = meson.get_compiler('c').find_library('rt', required : false)
|
||||
|
||||
redirect_sources = [
|
||||
'main.c',
|
||||
'profile.c',
|
||||
'profiles/ark.c',
|
||||
'profiles/project_highrise.c',
|
||||
'unity.c',
|
||||
]
|
||||
|
||||
sym_map = join_paths(meson.current_source_dir(), 'sym.map')
|
||||
|
||||
main_redirect = shared_library(
|
||||
'lsi-redirect',
|
||||
sources: redirect_sources,
|
||||
c_args: ['-fvisibility=hidden'],
|
||||
link_args: ['-Wl,--version-script=@0@'.format(sym_map)],
|
||||
include_directories: nica_includes,
|
||||
dependencies: [
|
||||
libdl,
|
||||
librt,
|
||||
link_lsi_common,
|
||||
],
|
||||
install: true,
|
||||
)
|
||||
endif
|
||||
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2017 Ikey Doherty <ikey@solus-project.com>
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
#include <pwd.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Handle definitions
|
||||
*/
|
||||
typedef int (*lsi_open_file)(const char *p, int flags, mode_t mode);
|
||||
|
||||
typedef FILE *(*lsi_fopen64_file)(const char *p, const char *modes);
|
||||
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
typedef struct passwd *(*lsi_getpwuid)(uid_t uid);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Global storage of handles for nicer organisation.
|
||||
*/
|
||||
typedef struct LsiRedirectTable {
|
||||
lsi_open_file open;
|
||||
lsi_fopen64_file fopen64;
|
||||
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
lsi_getpwuid getpwuid;
|
||||
#endif
|
||||
|
||||
/* Allow future handle opens.. */
|
||||
struct {
|
||||
void *libc;
|
||||
} handles;
|
||||
|
||||
/* Our shm_open() unity3d redirect.. */
|
||||
struct {
|
||||
char *original_config_path;
|
||||
char *config_path;
|
||||
char *shm_path;
|
||||
bool enabled;
|
||||
bool failed;
|
||||
bool had_init;
|
||||
} unity3d;
|
||||
} LsiRedirectTable;
|
||||
|
||||
void lsi_unity_startup(LsiRedirectTable *lsi_table);
|
||||
void lsi_unity_cleanup(LsiRedirectTable *lsi_table);
|
||||
|
||||
/* API Definitions for Unity handlers */
|
||||
void lsi_maybe_init_unity3d(LsiRedirectTable *lsi_table, const char *p);
|
||||
void lsi_unity_backup_config(LsiRedirectTable *lsi_table);
|
||||
FILE *lsi_unity_redirect(LsiRedirectTable *lsi_table, const char *p, const char *modes);
|
||||
FILE *lsi_unity_get_config_file(LsiRedirectTable *lsi_table, const char *modes);
|
||||
void lsi_unity_trim_copy_config(FILE *from, FILE *to);
|
||||
bool is_unity3d_prefs_file(LsiRedirectTable *lsi_table, const char *p);
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../common/log.h"
|
||||
#include "redirect.h"
|
||||
|
||||
LsiRedirectProfile *lsi_redirect_profile_new(const char *name)
|
||||
{
|
||||
LsiRedirectProfile p = { .name = strdup(name), { 0 } };
|
||||
LsiRedirectProfile *ret = NULL;
|
||||
if (!p.name) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = calloc(1, sizeof(LsiRedirectProfile));
|
||||
if (!ret) {
|
||||
return NULL;
|
||||
}
|
||||
*ret = p;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void lsi_redirect_profile_free(LsiRedirectProfile *self)
|
||||
{
|
||||
if (!self) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Free all chains */
|
||||
for (unsigned int i = 0; i < LSI_NUM_OPERATIONS; i++) {
|
||||
LsiRedirect *r = self->op_table[i];
|
||||
if (!r) {
|
||||
continue;
|
||||
}
|
||||
lsi_redirect_free(r);
|
||||
}
|
||||
|
||||
free(self->name);
|
||||
free(self);
|
||||
}
|
||||
|
||||
void lsi_redirect_profile_insert_rule(LsiRedirectProfile *self, LsiRedirect *redirect)
|
||||
{
|
||||
LsiRedirectOperation op;
|
||||
|
||||
switch (redirect->type) {
|
||||
case LSI_REDIRECT_PATH:
|
||||
op = LSI_OPERATION_OPEN;
|
||||
break;
|
||||
default:
|
||||
lsi_log_error("Attempted insert of unknown rule into '%s'", self->name);
|
||||
lsi_redirect_free(redirect);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Set head or prepend the rule */
|
||||
if (self->op_table[op]) {
|
||||
redirect->next = self->op_table[op];
|
||||
self->op_table[op] = redirect;
|
||||
} else {
|
||||
self->op_table[op] = redirect;
|
||||
}
|
||||
}
|
||||
|
||||
LsiRedirect *lsi_redirect_new_path_replacement(const char *source_path, const char *target_path)
|
||||
{
|
||||
LsiRedirect *ret = NULL;
|
||||
|
||||
ret = calloc(1, sizeof(LsiRedirect));
|
||||
if (!ret) {
|
||||
return NULL;
|
||||
}
|
||||
ret->type = LSI_REDIRECT_PATH;
|
||||
ret->path_source = realpath(source_path, NULL);
|
||||
ret->path_target = realpath(target_path, NULL);
|
||||
|
||||
if (!ret->path_source || !ret->path_target) {
|
||||
lsi_redirect_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void lsi_redirect_free(LsiRedirect *self)
|
||||
{
|
||||
if (!self) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Pass it along */
|
||||
if (self->next) {
|
||||
lsi_redirect_free(self->next);
|
||||
}
|
||||
|
||||
switch (self->type) {
|
||||
case LSI_REDIRECT_PATH:
|
||||
default:
|
||||
free(self->path_source);
|
||||
free(self->path_target);
|
||||
break;
|
||||
}
|
||||
|
||||
free(self);
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2017 Ikey Doherty <ikey@solus-project.com>
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "redirect.h"
|
||||
|
||||
/**
|
||||
* Generator function is used to attempt creation of profiles based on the
|
||||
* steam directory
|
||||
*/
|
||||
typedef LsiRedirectProfile *(*lsi_profile_generator_func)(char *process_name, char *steam_root);
|
||||
|
||||
/**
|
||||
* Profile generator for Ark survival evolved
|
||||
*/
|
||||
LsiRedirectProfile *lsi_redirect_profile_new_ark(char *process_name, char *steam_root);
|
||||
|
||||
/**
|
||||
* Profile generator for Project Highrise
|
||||
*/
|
||||
LsiRedirectProfile *lsi_redirect_profile_new_project_highrise(char *process_name, char *steam_root);
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "../common/log.h"
|
||||
#include "nica/util.h"
|
||||
#include "profile.h"
|
||||
#include "redirect.h"
|
||||
|
||||
#define ARK_BASE "steamapps/common/ARK/ShooterGame"
|
||||
#define ARK_CONTENT ARK_BASE "/Content"
|
||||
#define ARK_BINARY ARK_BASE "/Binaries/Linux/ShooterGame"
|
||||
|
||||
/**
|
||||
* This generator function is responsible for supporting ARK: Survival Evolved
|
||||
*
|
||||
* Simply it redirects the executable to open the correct asset when TheCenter
|
||||
* DLC is installed.
|
||||
*/
|
||||
LsiRedirectProfile *lsi_redirect_profile_new_ark(char *process_name, char *steam_path)
|
||||
{
|
||||
LsiRedirectProfile *p = NULL;
|
||||
LsiRedirect *redirect = NULL;
|
||||
autofree(char) *mic_source = NULL;
|
||||
autofree(char) *mic_target = NULL;
|
||||
autofree(char) *match_process = NULL;
|
||||
autofree(char) *test_process = NULL;
|
||||
|
||||
if (asprintf(&match_process, "%s/%s", steam_path, ARK_BINARY) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Check it even exists */
|
||||
test_process = realpath(match_process, NULL);
|
||||
if (!test_process) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Check the process name now */
|
||||
if (strcmp(test_process, process_name) != 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char *def_mic_source =
|
||||
ARK_CONTENT "/PrimalEarth/Environment/Water/Water_DepthBlur_MIC.uasset";
|
||||
static const char *def_mic_target =
|
||||
ARK_CONTENT "/Mods/TheCenter/Assets/Mic/Water_DepthBlur_MIC.uasset";
|
||||
|
||||
p = lsi_redirect_profile_new("ARK: Survival Evolved");
|
||||
if (!p) {
|
||||
fputs("OUT OF MEMORY\n", stderr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (asprintf(&mic_source, "%s/%s", steam_path, def_mic_source) < 0) {
|
||||
goto failed;
|
||||
}
|
||||
if (asprintf(&mic_target, "%s/%s", steam_path, def_mic_target) < 0) {
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/* Don't add a redirect if the paths don't exist. */
|
||||
redirect = lsi_redirect_new_path_replacement(mic_source, mic_target);
|
||||
if (!redirect) {
|
||||
goto unused;
|
||||
}
|
||||
|
||||
/* We're in, set our log ID now */
|
||||
lsi_log_set_id("ARK");
|
||||
|
||||
lsi_redirect_profile_insert_rule(p, redirect);
|
||||
|
||||
return p;
|
||||
|
||||
failed:
|
||||
/* Dead in the water.. */
|
||||
fputs("OUT OF MEMORY\n", stderr);
|
||||
unused:
|
||||
lsi_redirect_profile_free(p);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "../common/files.h"
|
||||
#include "../common/log.h"
|
||||
#include "nica/util.h"
|
||||
#include "profile.h"
|
||||
#include "redirect.h"
|
||||
|
||||
#define PHR_PREF_DIR "unity3d/SomaSim/Project Highrise/prefs"
|
||||
#define PHR_PREF_FILE "unity3d/SomaSim/Project Highrise/prefs/prefs.txt"
|
||||
|
||||
#if UINTPTR_MAX == 0xffffffffffffffff
|
||||
#define PHR_BINARY "steamapps/common/Project Highrise/Game.x86_64"
|
||||
#else
|
||||
#define PHR_BINARY "steamapps/common/Project Highrise/Game.x86"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* This generator function is responsible for supporting: Project Highrise
|
||||
*
|
||||
* Currently a bug exists in Projec Highrise, where on the second launch, i.e.
|
||||
* preferences tree exists, it will try to load/map the preferences directory
|
||||
* as a file, and fails to use the correct *file path*
|
||||
*
|
||||
* This is a temporary workaround and we'll let them know what we found.
|
||||
*/
|
||||
LsiRedirectProfile *lsi_redirect_profile_new_project_highrise(char *process_name, char *steam_path)
|
||||
{
|
||||
LsiRedirectProfile *p = NULL;
|
||||
LsiRedirect *redirect = NULL;
|
||||
autofree(char) *p_source = NULL;
|
||||
autofree(char) *p_target = NULL;
|
||||
autofree(char) *match_process = NULL;
|
||||
autofree(char) *test_process = NULL;
|
||||
autofree(char) *config_dir = NULL;
|
||||
|
||||
if (asprintf(&match_process, "%s/%s", steam_path, PHR_BINARY) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Check it even exists */
|
||||
test_process = realpath(match_process, NULL);
|
||||
if (!test_process) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Check the process name now */
|
||||
if (strcmp(test_process, process_name) != 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
config_dir = lsi_get_user_config_dir();
|
||||
if (!config_dir) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
p = lsi_redirect_profile_new("Project Highrise");
|
||||
if (!p) {
|
||||
fputs("OUT OF MEMORY\n", stderr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (asprintf(&p_source, "%s/%s", config_dir, PHR_PREF_DIR) < 0) {
|
||||
goto failed;
|
||||
}
|
||||
if (asprintf(&p_target, "%s/%s", config_dir, PHR_PREF_FILE) < 0) {
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/* Don't add a redirect if the paths don't exist. */
|
||||
redirect = lsi_redirect_new_path_replacement(p_source, p_target);
|
||||
if (!redirect) {
|
||||
goto unused;
|
||||
}
|
||||
|
||||
/* We're in, set our log ID now */
|
||||
lsi_log_set_id("ProjectHighrise");
|
||||
|
||||
lsi_redirect_profile_insert_rule(p, redirect);
|
||||
|
||||
return p;
|
||||
|
||||
failed:
|
||||
/* Dead in the water.. */
|
||||
fputs("OUT OF MEMORY\n", stderr);
|
||||
unused:
|
||||
lsi_redirect_profile_free(p);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2017 Ikey Doherty <ikey@solus-project.com>
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* The type of redirect required
|
||||
*/
|
||||
typedef enum {
|
||||
LSI_REDIRECT_MIN = 1,
|
||||
LSI_REDIRECT_PATH,
|
||||
} LsiRedirectType;
|
||||
|
||||
/**
|
||||
* LsiRedirect describes the configuration required for each operation.
|
||||
*/
|
||||
typedef struct LsiRedirect {
|
||||
LsiRedirectType type;
|
||||
union {
|
||||
/* Path replacement */
|
||||
struct {
|
||||
char *path_source;
|
||||
char *path_target;
|
||||
};
|
||||
};
|
||||
struct LsiRedirect *next;
|
||||
} LsiRedirect;
|
||||
|
||||
/**
|
||||
* LsiRedirectOperation specifies the syscall we're intended for.
|
||||
*/
|
||||
typedef enum { LSI_OPERATION_OPEN = 0, LSI_NUM_OPERATIONS } LsiRedirectOperation;
|
||||
|
||||
/**
|
||||
* We build an LsiRedirectProfile to match the current process.
|
||||
* It contains a table of LsiRedirect members corresponding to a given
|
||||
* op, i.e:
|
||||
*
|
||||
* op_table[LSI_OPERATION_OPEN]
|
||||
*/
|
||||
typedef struct LsiRedirectProfile {
|
||||
char *name; /**< Name for this profile */
|
||||
|
||||
LsiRedirect *op_table[LSI_NUM_OPERATIONS]; /* vtable information */
|
||||
} LsiRedirectProfile;
|
||||
|
||||
/**
|
||||
* Construct a new LsiRedirectProfile
|
||||
*
|
||||
* @param name Profile name
|
||||
* @returns A newly allocated LsiRedirectProfile
|
||||
*/
|
||||
LsiRedirectProfile *lsi_redirect_profile_new(const char *name);
|
||||
|
||||
/**
|
||||
* Free a previously allocated LsiRedirectProfile
|
||||
*
|
||||
* @param profile Pointer to an allocated LsiRedirectProfile
|
||||
*/
|
||||
void lsi_redirect_profile_free(LsiRedirectProfile *profile);
|
||||
|
||||
/**
|
||||
* Attempt insert of a redirect rule into this profile
|
||||
*
|
||||
* @param profile Pointer to a valid LsiRedirectProfile
|
||||
* @param redirect Pointer to an allocated LsiRedirect
|
||||
*/
|
||||
void lsi_redirect_profile_insert_rule(LsiRedirectProfile *self, LsiRedirect *redirect);
|
||||
|
||||
/* LsiRedirect APIs follow */
|
||||
|
||||
/**
|
||||
* Construct a new LsiRedirect to perform path replacements
|
||||
*/
|
||||
LsiRedirect *lsi_redirect_new_path_replacement(const char *source_path, const char *target_path);
|
||||
|
||||
/**
|
||||
* Attempt to free this redirect
|
||||
*
|
||||
* @param redirect Pointer to allocated LsiRedirect
|
||||
*/
|
||||
void lsi_redirect_free(LsiRedirect *self);
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
global:
|
||||
fopen64;
|
||||
getpwuid;
|
||||
open;
|
||||
local:
|
||||
*;
|
||||
};
|
||||
@@ -0,0 +1,333 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../common/files.h"
|
||||
#include "../common/log.h"
|
||||
#include "nica/util.h"
|
||||
|
||||
#include "private.h"
|
||||
|
||||
/**
|
||||
* Cheap and cheerful, this is our default fake unity3d config which we write
|
||||
* out to trick unity3d games into reading a non broken config on Linux.
|
||||
* This forces the equivalent of "-screen-fullscreen 0" because the older
|
||||
* Unity builds will set fullscreen to 1, but they'll also set the resolution
|
||||
* width and height to 0 (which is then clamped)
|
||||
*/
|
||||
static const char *unity3d_config =
|
||||
"\
|
||||
<unity_prefs version_major=\"1\" version_minor=\"1\">\n\
|
||||
<pref name=\"Screenmanager Is Fullscreen mode\" type=\"int\">0</pref>\n\
|
||||
</unity_prefs>\n\
|
||||
";
|
||||
|
||||
/**
|
||||
* When we rewrite the config file in place we'll repllace the "Is Fullscreen mode"
|
||||
* line with this one so that we forcibly disable it.
|
||||
*/
|
||||
static const char *unity3d_snippet =
|
||||
" <pref name=\"Screenmanager Is Fullscreen mode\" type=\"int\">0</pref>\n";
|
||||
|
||||
static inline bool str_has_prefix(const char *a, const char *b)
|
||||
{
|
||||
size_t lena, lenb;
|
||||
lena = strlen(a);
|
||||
lenb = strlen(b);
|
||||
if (lenb > lena) {
|
||||
return false;
|
||||
}
|
||||
return strncmp(a, b, lenb) == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* The unity3d config path has been accessed, so we need to turn on our
|
||||
* workaround for unity3d prefs
|
||||
*/
|
||||
void lsi_maybe_init_unity3d(LsiRedirectTable *lsi_table, const char *p)
|
||||
{
|
||||
if (lsi_table->unity3d.enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!lsi_table->unity3d.config_path) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!str_has_prefix(p, lsi_table->unity3d.config_path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Set by the main shim */
|
||||
if (!getenv("LSI_USE_UNITY_HACK")) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* We're in action */
|
||||
lsi_table->unity3d.enabled = true;
|
||||
lsi_log_set_id("unity3d");
|
||||
lsi_log_info("Activating \"black screen of nope\" workaround");
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the input path is a unity3d "prefs" file
|
||||
*/
|
||||
bool is_unity3d_prefs_file(LsiRedirectTable *lsi_table, const char *p)
|
||||
{
|
||||
autofree(char) *clone = NULL;
|
||||
char *basenom = NULL;
|
||||
|
||||
/* Must only happen when enabled */
|
||||
if (!lsi_table->unity3d.enabled) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* We found it already */
|
||||
if (lsi_table->unity3d.original_config_path) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Must be in config path */
|
||||
if (!str_has_prefix(p, lsi_table->unity3d.config_path)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
clone = strdup(p);
|
||||
if (!clone) {
|
||||
return false;
|
||||
}
|
||||
basenom = basename(clone);
|
||||
if (!basenom) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Must be called "prefs" */
|
||||
return strcmp(basenom, "prefs") == 0 ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy the config from the @from file to the @to file, which
|
||||
* will also strip out any "evil" lines, i.e. the fullscreen
|
||||
* stanza.
|
||||
*
|
||||
* If the input file does not exist, the default configuration
|
||||
* will be used.
|
||||
*/
|
||||
void lsi_unity_trim_copy_config(FILE *from, FILE *to)
|
||||
{
|
||||
char *buf = NULL;
|
||||
size_t sn = 0;
|
||||
ssize_t r = 0;
|
||||
|
||||
/* No input? Write the default configuration then */
|
||||
if (!from) {
|
||||
if (fwrite(unity3d_config, strlen(unity3d_config), 1, to) != 1) {
|
||||
lsi_log_error("Failed to create initial Unity3D config: %s",
|
||||
strerror(errno));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* Have an input file, write to the output but omit all the bad lines */
|
||||
while ((r = getline(&buf, &sn, from)) != -1) {
|
||||
const char *to_write = NULL;
|
||||
|
||||
/* Rewrite this line, it breaks games. */
|
||||
if (strstr(buf, "Screenmanager Is Fullscreen mode")) {
|
||||
to_write = unity3d_snippet;
|
||||
r = strlen(to_write);
|
||||
} else {
|
||||
to_write = buf;
|
||||
}
|
||||
|
||||
if (fwrite(to_write, r, 1, to) != 1) {
|
||||
lsi_log_error("Failed to write Unity3D config: %s", strerror(errno));
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (buf) {
|
||||
free(buf);
|
||||
buf = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
fflush(to);
|
||||
|
||||
failed:
|
||||
if (buf) {
|
||||
free(buf);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clone the existing shm configuration into the real config path, and copy
|
||||
* all lines that we "like"
|
||||
*
|
||||
* Basically this ensures we force the dumped config to omit the fullscreen
|
||||
* options as they break so many games.
|
||||
*/
|
||||
void lsi_unity_backup_config(LsiRedirectTable *lsi_table)
|
||||
{
|
||||
autofree(FILE) *shm_file = NULL;
|
||||
autofree(FILE) *dest_file = NULL;
|
||||
|
||||
if (!lsi_table->unity3d.enabled || !lsi_table->unity3d.original_config_path) {
|
||||
return;
|
||||
}
|
||||
|
||||
shm_file = lsi_unity_get_config_file(lsi_table, "r");
|
||||
if (!shm_file) {
|
||||
return;
|
||||
}
|
||||
|
||||
dest_file = lsi_table->fopen64(lsi_table->unity3d.original_config_path, "w");
|
||||
if (!dest_file) {
|
||||
return;
|
||||
}
|
||||
|
||||
lsi_log_debug("Saved Unity3D config to %s", lsi_table->unity3d.original_config_path);
|
||||
lsi_unity_trim_copy_config(shm_file, dest_file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the shm file as a FILE stream
|
||||
*/
|
||||
FILE *lsi_unity_get_config_file(LsiRedirectTable *lsi_table, const char *modes)
|
||||
{
|
||||
int perm = O_RDONLY;
|
||||
|
||||
if (strstr(modes, "w")) {
|
||||
perm = O_RDWR | O_CREAT | O_TRUNC;
|
||||
}
|
||||
|
||||
/* Attempt to shm_open our fake path */
|
||||
int fd = shm_open(lsi_table->unity3d.shm_path, perm, 0666);
|
||||
if (!fd) {
|
||||
return NULL;
|
||||
}
|
||||
return fdopen(fd, modes);
|
||||
}
|
||||
|
||||
/**
|
||||
* We now need to initialise the unity3d config if we haven't done so
|
||||
*/
|
||||
static void lsi_unity_init_config(LsiRedirectTable *lsi_table)
|
||||
{
|
||||
autofree(FILE) *source = NULL;
|
||||
autofree(FILE) *dest = NULL;
|
||||
|
||||
if (lsi_table->unity3d.had_init || lsi_table->unity3d.failed) {
|
||||
return;
|
||||
}
|
||||
|
||||
lsi_table->unity3d.had_init = true;
|
||||
|
||||
dest = lsi_unity_get_config_file(lsi_table, "w");
|
||||
source = lsi_table->fopen64(lsi_table->unity3d.original_config_path, "r");
|
||||
|
||||
lsi_unity_trim_copy_config(source, dest);
|
||||
}
|
||||
|
||||
/**
|
||||
* Redirect requests for non-existant config files in Unity3D to a temporary
|
||||
* shm file which we'll write our initial "sane" configuration to.
|
||||
*/
|
||||
FILE *lsi_unity_redirect(LsiRedirectTable *lsi_table, const char *p, const char *modes)
|
||||
{
|
||||
FILE *ret = NULL;
|
||||
|
||||
/* Preserve this path for later cloning.. */
|
||||
lsi_table->unity3d.original_config_path = strdup(p);
|
||||
|
||||
lsi_unity_init_config(lsi_table);
|
||||
|
||||
ret = lsi_unity_get_config_file(lsi_table, modes);
|
||||
if (!ret) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
lsi_log_debug("fopen64(%s): Redirecting unity config '%s' to shm(%s)",
|
||||
modes,
|
||||
p,
|
||||
lsi_table->unity3d.shm_path);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up any needed variables for future unity usage
|
||||
*/
|
||||
void lsi_unity_startup(LsiRedirectTable *lsi_table)
|
||||
{
|
||||
autofree(char) *xdg_config_dir = NULL;
|
||||
|
||||
/* Ensure we know the path to unity3d config */
|
||||
xdg_config_dir = lsi_get_user_config_dir();
|
||||
if (asprintf(&lsi_table->unity3d.config_path, "%s/unity3d", xdg_config_dir) < 0) {
|
||||
fputs("OOM\n", stderr);
|
||||
abort();
|
||||
}
|
||||
|
||||
/* shm path for our fake unity3d config path */
|
||||
if (asprintf(&lsi_table->unity3d.shm_path,
|
||||
"/u%d-LinuxSteamIntegration.unity3d.%d",
|
||||
getuid(),
|
||||
getpgrp()) < 0) {
|
||||
fputs("OOM\n", stderr);
|
||||
abort();
|
||||
}
|
||||
|
||||
/* Symbolic, we don't just use this for anyone, yknow. :P */
|
||||
lsi_table->unity3d.enabled = false;
|
||||
lsi_table->unity3d.failed = false;
|
||||
}
|
||||
|
||||
void lsi_unity_cleanup(LsiRedirectTable *lsi_table)
|
||||
{
|
||||
if (lsi_table->unity3d.original_config_path) {
|
||||
lsi_unity_backup_config(lsi_table);
|
||||
free(lsi_table->unity3d.original_config_path);
|
||||
lsi_table->unity3d.original_config_path = NULL;
|
||||
}
|
||||
|
||||
if (lsi_table->unity3d.config_path) {
|
||||
free(lsi_table->unity3d.config_path);
|
||||
lsi_table->unity3d.config_path = NULL;
|
||||
}
|
||||
|
||||
if (lsi_table->unity3d.shm_path) {
|
||||
(void)shm_unlink(lsi_table->unity3d.shm_path);
|
||||
free(lsi_table->unity3d.shm_path);
|
||||
lsi_table->unity3d.shm_path = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <linux/limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lsi.h"
|
||||
#include "shim.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const char *command = NULL;
|
||||
|
||||
if (!shim_bootstrap()) {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Drop our own binary from the passed in options */
|
||||
--argc;
|
||||
++argv;
|
||||
|
||||
if (argc < 1) {
|
||||
lsi_report_failure("lsi-exec was not passed a valid command");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
command = argv[0];
|
||||
--argc;
|
||||
++argv;
|
||||
|
||||
/* Now execute. */
|
||||
return shim_execute_path(command, argc, argv);
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <linux/limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../common/files.h"
|
||||
#include "config.h"
|
||||
#include "lsi.h"
|
||||
#include "shim.h"
|
||||
|
||||
/**
|
||||
* Helper to get the Steam binary, respecting "$SNAP" if needed
|
||||
*/
|
||||
static const char *shim_get_steam_binary(const char *prefix)
|
||||
{
|
||||
static char tgt[PATH_MAX] = { 0 };
|
||||
|
||||
if (snprintf(tgt, sizeof(tgt), "%s%s", prefix ? prefix : "", STEAM_BINARY) < 0) {
|
||||
return STEAM_BINARY;
|
||||
}
|
||||
|
||||
return tgt;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const char *operation_prefix = NULL;
|
||||
const char *steam_binary = NULL;
|
||||
__attribute__((unused)) const char *tdir = NULL;
|
||||
__attribute__((unused)) int dir_ret = 0;
|
||||
|
||||
if (!shim_bootstrap()) {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
operation_prefix = getenv("SNAP");
|
||||
tdir = getenv("SNAP_USER_COMMON");
|
||||
#endif
|
||||
|
||||
steam_binary = shim_get_steam_binary(operation_prefix);
|
||||
|
||||
if (!lsi_file_exists(steam_binary)) {
|
||||
lsi_report_failure("Steam isn't currently installed at %s", steam_binary);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (tdir) {
|
||||
dir_ret = chdir(tdir);
|
||||
}
|
||||
|
||||
return shim_execute(steam_binary, --argc, ++argv);
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=8 tabstop=8 expandtab:
|
||||
* :indentSize=8:tabSize=8:noTabs=true:
|
||||
*/
|
||||
@@ -0,0 +1,45 @@
|
||||
if shim_behaviour == 'replacement'
|
||||
shim_target_name = 'steam'
|
||||
else
|
||||
shim_target_name = 'lsi-steam'
|
||||
endif
|
||||
|
||||
if shim_behaviour != 'none'
|
||||
shim_sources = [
|
||||
'shim.c',
|
||||
'main.c',
|
||||
]
|
||||
|
||||
exec_sources = [
|
||||
'shim.c',
|
||||
'lsi-exec.c',
|
||||
]
|
||||
|
||||
exec_name = 'lsi-exec'
|
||||
frontend_name = 'lsi-settings'
|
||||
if with_snap_support == true
|
||||
exec_name = 'linux-steam-integration.exec'
|
||||
endif
|
||||
|
||||
shim = executable(
|
||||
shim_target_name,
|
||||
sources: shim_sources + nica_sources,
|
||||
include_directories: nica_includes,
|
||||
dependencies: [
|
||||
link_lsi,
|
||||
],
|
||||
install: true,
|
||||
install_dir: path_bindir,
|
||||
)
|
||||
|
||||
lsi_exec = executable(
|
||||
exec_name,
|
||||
sources: exec_sources + nica_sources,
|
||||
include_directories: nica_includes,
|
||||
dependencies: [
|
||||
link_lsi,
|
||||
],
|
||||
install: true,
|
||||
install_dir: path_bindir,
|
||||
)
|
||||
endif
|
||||
+330
-44
@@ -1,7 +1,8 @@
|
||||
/*
|
||||
* This file is part of linux-steam-integration.
|
||||
*
|
||||
* Copyright © 2016 Ikey Doherty
|
||||
* Copyright © 2016-2018 Ikey Doherty <ikey@solus-project.com>
|
||||
* Copyright © 2018-2019 Intel Corporation
|
||||
*
|
||||
* linux-steam-integration is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License as
|
||||
@@ -12,57 +13,306 @@
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <errno.h>
|
||||
#include <glob.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../common/files.h"
|
||||
#include "../common/log.h"
|
||||
#include "../nica/files.h"
|
||||
#include "config.h"
|
||||
#include "lsi.h"
|
||||
#include "shim.h"
|
||||
|
||||
/**
|
||||
* Required to force Steam into 32-bit detection mode, which is useful for
|
||||
* recent issues like the CS:GO 64-bit update with huge FPS drops
|
||||
* Audit path is used for the libintercept library to ensure Steam only uses the
|
||||
* host SDL, etc.
|
||||
*/
|
||||
#define EMUL32BIN "linux32"
|
||||
#define AUDIT_PATH "/usr/$LIB/liblsi-intercept.so"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
/**
|
||||
* Redirect path is used for the libredirect library to perform internal
|
||||
* redirections in functions like `open()` where needed to hotfix games
|
||||
* at runtime.
|
||||
*/
|
||||
#define REDIRECT_PATH "/usr/$LIB/liblsi-redirect.so"
|
||||
|
||||
/**
|
||||
* Potential for the host Vulkan ICD files (old vs new)
|
||||
*/
|
||||
#define VK_GLOB "/var/lib/snapd/lib/gl/*nvidia*.json"
|
||||
#define VK_GLOB_2 "/var/lib/snapd/lib/vulkan/*nvidia*.json"
|
||||
|
||||
/**
|
||||
* Used to update a value in the environment, and perform a prepend if the variable
|
||||
* is already set.
|
||||
*/
|
||||
static void shim_export_merge_vars(const char *var_name, const char *prefix, const char *value)
|
||||
{
|
||||
LsiConfig config = { 0 };
|
||||
bool is_x86_64;
|
||||
const char *n_argv[argc + 2];
|
||||
const char *exec_command = NULL;
|
||||
/* Use the appropriate Steam depending on configuration */
|
||||
const char *lsi_exec_bin = NULL;
|
||||
int i = 1;
|
||||
int8_t off = 0;
|
||||
int (*vfunc)(const char *, char *const argv[]) = NULL;
|
||||
static char copy_buffer[PATH_MAX] = { 0 };
|
||||
const char *env_exist = NULL;
|
||||
int ret = 0;
|
||||
|
||||
#ifdef REPLACE_STEAM
|
||||
lsi_exec_bin = STEAM_BINARY;
|
||||
#else
|
||||
lsi_exec_bin = "/usr/bin/steam";
|
||||
#endif
|
||||
/* Initialise config */
|
||||
if (!lsi_config_load(&config)) {
|
||||
lsi_config_load_defaults(&config);
|
||||
env_exist = getenv(var_name);
|
||||
|
||||
ret = snprintf(copy_buffer,
|
||||
sizeof(copy_buffer),
|
||||
"%s%s%s%s",
|
||||
prefix ? prefix : "",
|
||||
value,
|
||||
env_exist ? ":" : "",
|
||||
env_exist ? env_exist : "");
|
||||
if (ret < 0) {
|
||||
lsi_log_error("failed to update variable '%s'", var_name);
|
||||
return;
|
||||
}
|
||||
|
||||
is_x86_64 = lsi_system_is_64bit();
|
||||
lsi_log_debug("%s = %s", var_name, copy_buffer);
|
||||
|
||||
if (!lsi_file_exists(lsi_exec_bin)) {
|
||||
lsi_report_failure("Steam isn't currently installed at %s", lsi_exec_bin);
|
||||
return EXIT_FAILURE;
|
||||
setenv(var_name, copy_buffer, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up the LD_AUDIT environment - respecting $SNAP if set
|
||||
*/
|
||||
static void shim_set_audit_path(const char *prefix)
|
||||
{
|
||||
shim_export_merge_vars("LD_AUDIT", prefix, AUDIT_PATH);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up LD_PRELOAD, respecting an existing LD_PRELOAD and forcing ourselves
|
||||
* to be first in the list.
|
||||
*/
|
||||
static void shim_set_ld_preload(const char *prefix)
|
||||
{
|
||||
shim_export_merge_vars("LD_PRELOAD", prefix, REDIRECT_PATH);
|
||||
}
|
||||
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
/**
|
||||
* This function is only used during our initial bootstrap phase to ensure
|
||||
* we're able to set up the environment and directories correctly under the
|
||||
* snapd system.
|
||||
*/
|
||||
static void shim_init_user(const char *userdir)
|
||||
{
|
||||
static const char *paths[] = {
|
||||
".local/share",
|
||||
".config",
|
||||
".cache",
|
||||
};
|
||||
static const char *vars[] = {
|
||||
"XDG_DATA_HOME",
|
||||
"XDG_CONFIG_HOME",
|
||||
"XDG_CACHE_HOME",
|
||||
};
|
||||
static char tgt[PATH_MAX] = { 0 };
|
||||
|
||||
for (size_t i = 0; i < ARRAY_SIZE(paths); i++) {
|
||||
if (snprintf(tgt, sizeof(tgt), "%s/%s", userdir, paths[i]) < 0) {
|
||||
lsi_log_error("memory failure");
|
||||
return;
|
||||
}
|
||||
if (!lsi_file_exists(tgt)) {
|
||||
if (!nc_mkdir_p(tgt, 00755)) {
|
||||
lsi_log_error("failed to construct %s: %s", tgt, strerror(errno));
|
||||
goto write_var;
|
||||
}
|
||||
lsi_log_debug("Constructing %s: %s", vars[i], tgt);
|
||||
}
|
||||
write_var:
|
||||
setenv(vars[i], tgt, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to set up Vulkan in the environment by looking for the ICD files
|
||||
* passed from the hostfs
|
||||
*/
|
||||
static bool shim_init_vulkan(const char *glob_path)
|
||||
{
|
||||
glob_t glo = { 0 };
|
||||
|
||||
glob(glob_path, GLOB_DOOFFS, NULL, &glo);
|
||||
|
||||
if (glo.gl_pathc < 1) {
|
||||
globfree(&glo);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Preserve glob order and insert environment in reverse */
|
||||
for (int i = glo.gl_pathc - 1; i >= 0; i--) {
|
||||
shim_export_merge_vars("VK_ICD_FILENAMES", NULL, glo.gl_pathv[i]);
|
||||
}
|
||||
|
||||
globfree(&glo);
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
|
||||
/**
|
||||
* Attempt to push a path into the variable name if it actually exists
|
||||
*/
|
||||
static void shim_export_ld_dir(const char *var_name, const char *dir)
|
||||
{
|
||||
if (!lsi_file_exists(dir)) {
|
||||
return;
|
||||
}
|
||||
shim_export_merge_vars(var_name, NULL, dir);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up any extra environment pieces that might need fixing
|
||||
*
|
||||
* Currently this only sets up the snapd environmental variables, so that
|
||||
* we don't rely on separate bootstrap scripts out of tree.
|
||||
*/
|
||||
static void shim_export_extra(const char *prefix)
|
||||
{
|
||||
static const char *snap_user = NULL;
|
||||
static const char *xdg_home = NULL;
|
||||
|
||||
/* Add all of these guys to LD_LIBRARY_PATH if they exist.
|
||||
* This allows us to handle the special-case multiarch mounts.
|
||||
*/
|
||||
static const char *ld_library_dirs[] = {
|
||||
"/var/lib/snapd/lib/gl/vdpau", /**<64-bit vdpau */
|
||||
"/var/lib/snapd/lib/gl32/vdpau", /**<32bit vdpau */
|
||||
"/var/lib/snapd/lib/gl", /**<Potential host NVIDIA libraries */
|
||||
"/var/lib/snapd/lib/gl32", /**<Potential host NVIDIA 32-bit libraries (new location) */
|
||||
};
|
||||
|
||||
/* Add any necessary DRI drivers to the path, though in reality this
|
||||
* shouldn't REALLY be needed, but let's just play it safe.
|
||||
*/
|
||||
static const char *dri_drivers_extra[] = {
|
||||
"/usr/lib32/dri",
|
||||
"/usr/lib/dri",
|
||||
};
|
||||
|
||||
unsetenv("LIBGL_DRIVERS_PATH");
|
||||
unsetenv("LD_LIBRARY_PATH");
|
||||
|
||||
/* Include all GLI driver paths */
|
||||
for (size_t i = 0; i < ARRAY_SIZE(dri_drivers_extra); i++) {
|
||||
shim_export_ld_dir("LIBGL_DRIVERS_PATH", dri_drivers_extra[i]);
|
||||
shim_export_ld_dir("LD_LIBRARY_PATH", dri_drivers_extra[i]);
|
||||
}
|
||||
|
||||
/* Now set the library path accordingly */
|
||||
for (size_t i = 0; i < ARRAY_SIZE(ld_library_dirs); i++) {
|
||||
shim_export_ld_dir("LD_LIBRARY_PATH", ld_library_dirs[i]);
|
||||
}
|
||||
|
||||
/* the vdpau directory only exists on multiarch */
|
||||
if (lsi_file_exists("/var/lib/snapd/lib/gl/vdpau")) {
|
||||
shim_export_ld_dir("VDPAU_DRIVER_PATH", "/var/lib/snapd/lib/gl/vdpau");
|
||||
} else {
|
||||
shim_export_ld_dir("VDPAU_DRIVER_PATH", "/var/lib/snapd/lib/gl");
|
||||
}
|
||||
|
||||
/* Path */
|
||||
shim_export_merge_vars("PATH", prefix, "/usr/bin");
|
||||
shim_export_merge_vars("PATH", prefix, "/bin");
|
||||
|
||||
/* We require our PulseAudio fake script to be seen first. */
|
||||
shim_export_merge_vars("PATH", prefix, FAKE_SCRIPTS_DIR "/pulseaudio");
|
||||
|
||||
/* Try both known Vulkan ICD paths */
|
||||
if (!shim_init_vulkan(VK_GLOB_2)) {
|
||||
shim_init_vulkan(VK_GLOB);
|
||||
}
|
||||
|
||||
/* XDG */
|
||||
shim_export_merge_vars("XDG_CONFIG_DIRS", NULL, "/etc/xdg");
|
||||
shim_export_merge_vars("XDG_CONFIG_DIRS", NULL, "/usr/share/xdg");
|
||||
shim_export_merge_vars("XDG_CONFIG_DIRS", prefix, "/etc/xdg");
|
||||
shim_export_merge_vars("XDG_CONFIG_DIRS", prefix, "/usr/xdg");
|
||||
|
||||
shim_export_merge_vars("XDG_DATA_DIRS", prefix, "/usr/share");
|
||||
|
||||
snap_user = getenv("SNAP_USER_COMMON");
|
||||
shim_export_merge_vars("XDG_DATA_DIRS", NULL, "/usr/share");
|
||||
shim_export_merge_vars("XDG_DATA_DIRS", prefix, "/usr/share");
|
||||
if (snap_user) {
|
||||
shim_export_merge_vars("XDG_DATA_DIRS", NULL, snap_user);
|
||||
shim_init_user(snap_user);
|
||||
}
|
||||
|
||||
/* Ensure XDG_RUNTIME_DIR really exists */
|
||||
xdg_home = getenv("XDG_RUNTIME_DIR");
|
||||
if (!xdg_home) {
|
||||
return;
|
||||
}
|
||||
if (lsi_file_exists(xdg_home)) {
|
||||
return;
|
||||
}
|
||||
if (!nc_mkdir_p(xdg_home, 00755)) {
|
||||
lsi_log_error("Failed to setup XDG_RUNTIME_DIR %s: %s", xdg_home, strerror(errno));
|
||||
return;
|
||||
}
|
||||
lsi_log_debug("Constructed XDG_RUNTIME_DIR: %s", xdg_home);
|
||||
}
|
||||
#else
|
||||
static void shim_export_extra(__lsi_unused__ const char *prefix)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static LsiConfig lsi_config = { 0 };
|
||||
|
||||
/* Public API */
|
||||
|
||||
bool shim_bootstrap()
|
||||
{
|
||||
const char *operation_prefix = NULL;
|
||||
|
||||
#ifdef HAVE_SNAPD_SUPPORT
|
||||
/* Snapd specific prefix */
|
||||
operation_prefix = getenv("SNAP");
|
||||
#endif
|
||||
|
||||
/* We might have additional variables we need to export and we
|
||||
* might also end up changing XDG_CONFIG_HOME - ensure we actually
|
||||
* read our settings from the right place. */
|
||||
shim_export_extra(operation_prefix);
|
||||
|
||||
/* Ensure we now have some kind of config */
|
||||
if (!lsi_config_load(&lsi_config)) {
|
||||
lsi_config_load_defaults(&lsi_config);
|
||||
}
|
||||
|
||||
/* Force STEAM_RUNTIME into the environment */
|
||||
if (config.use_native_runtime) {
|
||||
if (lsi_config.use_native_runtime) {
|
||||
/* Explicitly disable the runtime */
|
||||
setenv("STEAM_RUNTIME", "0", 1);
|
||||
#ifdef HAVE_LIBINTERCEPT
|
||||
/* Only use libintercept in combination with native runtime! */
|
||||
if (lsi_config.use_libintercept) {
|
||||
shim_set_audit_path(operation_prefix);
|
||||
}
|
||||
#endif
|
||||
#ifdef HAVE_LIBREDIRECT
|
||||
/* Only use libredirect in combination with native runtime! */
|
||||
if (lsi_config.use_libredirect) {
|
||||
shim_set_ld_preload(operation_prefix);
|
||||
}
|
||||
/* And unity hack is dependent on libredirect.. */
|
||||
if (lsi_config.use_unity_hack) {
|
||||
setenv("LSI_USE_UNITY_HACK", "1", 1);
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
/* Only preload when needed. */
|
||||
if (lsi_system_requires_preload()) {
|
||||
setenv("LD_PRELOAD", lsi_preload_list(), 1);
|
||||
shim_export_merge_vars("LD_PRELOAD", operation_prefix, lsi_preload_list());
|
||||
}
|
||||
setenv("STEAM_RUNTIME", "1", 1);
|
||||
}
|
||||
@@ -71,37 +321,73 @@ int main(int argc, char **argv)
|
||||
* usage of dbus by Steam. Help them out */
|
||||
setenv("DBUS_FATAL_WARNINGS", "0", 1);
|
||||
|
||||
memset(&n_argv, 0, sizeof(char *) * (argc + 2));
|
||||
/* Requires Solus patch to actually work */
|
||||
setenv("DBUS_SILENCE_WARNINGS", "1", 1);
|
||||
|
||||
/* If we're 64-bit and 32-bit is forced, proxy via linux32 */
|
||||
if (config.force_32 && is_x86_64) {
|
||||
exec_command = EMUL32BIN;
|
||||
n_argv[0] = EMUL32BIN;
|
||||
n_argv[1] = lsi_exec_bin;
|
||||
off = 1;
|
||||
/* Use linux32 in the path */
|
||||
/* A recent regression is to interpret XMODIFIERS and then fail to
|
||||
* make it beyond `SDL_InitSubSystem` due to `InitIME` failing to
|
||||
* properly use D-BUS ...
|
||||
*/
|
||||
unsetenv("XMODIFIERS");
|
||||
unsetenv("GTK_MODULES");
|
||||
|
||||
/* All done now. */
|
||||
return true;
|
||||
}
|
||||
|
||||
static int shim_execute_internal(const char *command, int argc, char **argv, bool use_path)
|
||||
{
|
||||
bool is_x86_64;
|
||||
const char *n_argv[argc + 5];
|
||||
const char *exec_command = NULL;
|
||||
int i = 1;
|
||||
int8_t off = 1;
|
||||
int (*vfunc)(const char *, char *const argv[]) = NULL;
|
||||
|
||||
is_x86_64 = lsi_system_is_64bit();
|
||||
memset(&n_argv, 0, sizeof(char *) * (argc + 5));
|
||||
|
||||
/* If we're 64-bit and 32-bit is forced, proxy via setarch linux32 */
|
||||
if (lsi_config.force_32 && is_x86_64) {
|
||||
exec_command = "setarch";
|
||||
n_argv[0] = "setarch";
|
||||
n_argv[1] = "linux32";
|
||||
n_argv[2] = "--";
|
||||
n_argv[3] = command;
|
||||
off = 4;
|
||||
/* Use setarch in the path */
|
||||
vfunc = execvp;
|
||||
} else {
|
||||
/* Directly call lsi_exec_bin */
|
||||
exec_command = lsi_exec_bin;
|
||||
n_argv[0] = lsi_exec_bin;
|
||||
/* Full path here due to shadow nature */
|
||||
vfunc = execv;
|
||||
exec_command = command;
|
||||
n_argv[0] = command;
|
||||
/* Full path here due to shadow nature unless asked not to */
|
||||
vfunc = use_path ? execvp : execv;
|
||||
}
|
||||
|
||||
/* Point arguments to arguments passed to us */
|
||||
for (i = 1; i < argc; i++) {
|
||||
for (i = 0; i < argc; i++) {
|
||||
n_argv[i + off] = argv[i];
|
||||
}
|
||||
n_argv[i + 1 + off] = NULL;
|
||||
|
||||
/* Go execute steam. */
|
||||
if (vfunc(exec_command, (char **)n_argv) < 0) {
|
||||
lsi_report_failure("Failed to launch Steam: %s [%s]",
|
||||
strerror(errno),
|
||||
STEAM_BINARY);
|
||||
lsi_report_failure("Failed to launch command: %s\n\n%s", command, strerror(errno));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
/* Can't happen */
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
int shim_execute(const char *command, int argc, char **argv)
|
||||
{
|
||||
return shim_execute_internal(command, argc, argv, false);
|
||||
}
|
||||
|
||||
int shim_execute_path(const char *command, int argc, char **argv)
|
||||
{
|
||||
return shim_execute_internal(command, argc, argv, true);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user