mirror of
https://github.com/SteamDeckHomebrew/decky-frontend-lib.git
synced 2026-05-23 11:28:48 +02:00
Compare commits
1 Commits
globals-wo
...
v0.0.5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a52b73e152 |
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": ["@commitlint/config-conventional"]
|
|
||||||
}
|
|
||||||
55
.github/workflows/docs.yaml
vendored
55
.github/workflows/docs.yaml
vendored
@@ -1,55 +0,0 @@
|
|||||||
name: Generate docs
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
# push:
|
|
||||||
# branches:
|
|
||||||
# - main
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
name: Generate Docs
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
steps:
|
|
||||||
- name: Setup | Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
path: lib
|
|
||||||
- name: Setup | Checkout wiki
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
repository: SteamDeckHomebrew/wiki
|
|
||||||
path: wiki
|
|
||||||
ssh-key: ${{ secrets.SSH_DEPLOY_KEY }}
|
|
||||||
persist-credentials: true
|
|
||||||
- name: Setup | Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
- name: Setup | Dependencies
|
|
||||||
run: |
|
|
||||||
cd lib
|
|
||||||
npm i -g pnpm
|
|
||||||
pnpm i --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Build Docs
|
|
||||||
run: |
|
|
||||||
cd lib
|
|
||||||
pnpm run docs --out ../wiki/api-docs/decky-frontend-lib
|
|
||||||
|
|
||||||
- name: Commit files
|
|
||||||
run: |
|
|
||||||
cd wiki
|
|
||||||
git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
||||||
git config --local user.name "github-actions[bot]"
|
|
||||||
git add -A ./api-docs/decky-frontend-lib
|
|
||||||
git commit -m "Update decky-frontend-lib API docs"
|
|
||||||
|
|
||||||
- name: Push changes
|
|
||||||
uses: ad-m/github-push-action@master
|
|
||||||
with:
|
|
||||||
ssh: true
|
|
||||||
directory: ./wiki
|
|
||||||
repository: SteamDeckHomebrew/wiki
|
|
||||||
branch: main
|
|
||||||
33
.github/workflows/release.yaml
vendored
33
.github/workflows/release.yaml
vendored
@@ -1,33 +0,0 @@
|
|||||||
name: Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
name: Release
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
steps:
|
|
||||||
- name: Setup | Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- name: Setup | Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 20
|
|
||||||
- name: Setup | Dependencies
|
|
||||||
run: npm i -g pnpm && pnpm i --frozen-lockfile
|
|
||||||
- name: Build
|
|
||||||
run: pnpm run build
|
|
||||||
- name: Test
|
|
||||||
run: pnpm run test
|
|
||||||
- name: Release
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN_DECKY_ORG }}
|
|
||||||
run: pnpm exec semantic-release
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -36,4 +36,5 @@ dist/
|
|||||||
|
|
||||||
research/
|
research/
|
||||||
|
|
||||||
docs/
|
# PNPM lockfile
|
||||||
|
pnpm-lock.yaml
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
. "$(dirname -- "$0")/_/husky.sh"
|
|
||||||
|
|
||||||
npx --no -- commitlint --edit "${1}"
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
{
|
|
||||||
"branches": ["main", "v4-dev"],
|
|
||||||
"plugins": [
|
|
||||||
[
|
|
||||||
"@semantic-release/commit-analyzer",
|
|
||||||
{
|
|
||||||
"preset": "angular",
|
|
||||||
"releaseRules": [
|
|
||||||
{ "type": "chore", "scope": "classes", "release": "patch" },
|
|
||||||
{ "type": "docs", "scope": "steamclient", "release": "patch" },
|
|
||||||
{ "type": "*", "scope": "docs", "release": false }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"@semantic-release/release-notes-generator",
|
|
||||||
"@semantic-release/changelog",
|
|
||||||
"@semantic-release/npm",
|
|
||||||
"@semantic-release/github",
|
|
||||||
[
|
|
||||||
"@semantic-release/git",
|
|
||||||
{
|
|
||||||
"assets": ["CHANGELOG.md", "package.json", "package-lock.json"],
|
|
||||||
"message": "chore(release): ${nextRelease.version} [CI SKIP]"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
13
.vscode/tasks.json
vendored
13
.vscode/tasks.json
vendored
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "2.0.0",
|
|
||||||
"tasks": [
|
|
||||||
{
|
|
||||||
"type": "npm",
|
|
||||||
"script": "dev",
|
|
||||||
"problemMatcher": ["$tsc-watch"],
|
|
||||||
"label": "npm: dev",
|
|
||||||
"detail": "tsc -b -w",
|
|
||||||
"isBackground": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
1375
CHANGELOG.md
1375
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
686
LICENSE
686
LICENSE
@@ -1,398 +1,223 @@
|
|||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2.1, February 1999
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
[This is the first released version of the Lesser GPL. It also counts
|
Preamble
|
||||||
as the successor of the GNU Library Public License, version 2, hence
|
|
||||||
the version number 2.1.]
|
|
||||||
|
|
||||||
Preamble
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
When we speak of free software, we are referring to freedom, not
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
Licenses are intended to guarantee your freedom to share and change
|
have the freedom to distribute copies of free software (and charge for
|
||||||
free software--to make sure the software is free for all its users.
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
This license, the Lesser General Public License, applies to some
|
To protect your rights, we need to make restrictions that forbid
|
||||||
specially designated software packages--typically libraries--of the
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
Free Software Foundation and other authors who decide to use it. You
|
These restrictions translate to certain responsibilities for you if you
|
||||||
can use it too, but we suggest you first think carefully about whether
|
distribute copies of the software, or if you modify it.
|
||||||
this license or the ordinary General Public License is the better
|
|
||||||
strategy to use in any particular case, based on the explanations below.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom of use,
|
For example, if you distribute copies of such a program, whether
|
||||||
not price. Our General Public Licenses are designed to make sure that
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
you have the freedom to distribute copies of free software (and charge
|
you have. You must make sure that they, too, receive or can get the
|
||||||
for this service if you wish); that you receive source code or can get
|
source code. And you must show them these terms so they know their
|
||||||
it if you want it; that you can change the software and use pieces of
|
rights.
|
||||||
it in new free programs; and that you are informed that you can do
|
|
||||||
these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
distributors to deny you these rights or to ask you to surrender these
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
rights. These restrictions translate to certain responsibilities for
|
distribute and/or modify the software.
|
||||||
you if you distribute copies of the library or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of the library, whether gratis
|
Also, for each author's protection and ours, we want to make certain
|
||||||
or for a fee, you must give the recipients all the rights that we gave
|
that everyone understands that there is no warranty for this free
|
||||||
you. You must make sure that they, too, receive or can get the source
|
software. If the software is modified by someone else and passed on, we
|
||||||
code. If you link other code with the library, you must provide
|
want its recipients to know that what they have is not the original, so
|
||||||
complete object files to the recipients, so that they can relink them
|
that any problems introduced by others will not reflect on the original
|
||||||
with the library after making changes to the library and recompiling
|
authors' reputations.
|
||||||
it. And you must show them these terms so they know their rights.
|
|
||||||
|
|
||||||
We protect your rights with a two-step method: (1) we copyright the
|
Finally, any free program is threatened constantly by software
|
||||||
library, and (2) we offer you this license, which gives you legal
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
permission to copy, distribute and/or modify the library.
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
To protect each distributor, we want to make it very clear that
|
The precise terms and conditions for copying, distribution and
|
||||||
there is no warranty for the free library. Also, if the library is
|
modification follow.
|
||||||
modified by someone else and passed on, the recipients should know
|
|
||||||
that what they have is not the original version, so that the original
|
|
||||||
author's reputation will not be affected by problems that might be
|
|
||||||
introduced by others.
|
|
||||||
|
|
||||||
Finally, software patents pose a constant threat to the existence of
|
GNU GENERAL PUBLIC LICENSE
|
||||||
any free program. We wish to make sure that a company cannot
|
|
||||||
effectively restrict the users of a free program by obtaining a
|
|
||||||
restrictive license from a patent holder. Therefore, we insist that
|
|
||||||
any patent license obtained for a version of the library must be
|
|
||||||
consistent with the full freedom of use specified in this license.
|
|
||||||
|
|
||||||
Most GNU software, including some libraries, is covered by the
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
ordinary GNU General Public License. This license, the GNU Lesser
|
|
||||||
General Public License, applies to certain designated libraries, and
|
|
||||||
is quite different from the ordinary General Public License. We use
|
|
||||||
this license for certain libraries in order to permit linking those
|
|
||||||
libraries into non-free programs.
|
|
||||||
|
|
||||||
When a program is linked with a library, whether statically or using
|
0. This License applies to any program or other work which contains
|
||||||
a shared library, the combination of the two is legally speaking a
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
combined work, a derivative of the original library. The ordinary
|
under the terms of this General Public License. The "Program", below,
|
||||||
General Public License therefore permits such linking only if the
|
refers to any such program or work, and a "work based on the Program"
|
||||||
entire combination fits its criteria of freedom. The Lesser General
|
means either the Program or any derivative work under copyright law:
|
||||||
Public License permits more lax criteria for linking other code with
|
that is to say, a work containing the Program or a portion of it,
|
||||||
the library.
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
We call this license the "Lesser" General Public License because it
|
Activities other than copying, distribution and modification are not
|
||||||
does Less to protect the user's freedom than the ordinary General
|
covered by this License; they are outside its scope. The act of
|
||||||
Public License. It also provides other free software developers Less
|
running the Program is not restricted, and the output from the Program
|
||||||
of an advantage over competing non-free programs. These disadvantages
|
is covered only if its contents constitute a work based on the
|
||||||
are the reason we use the ordinary General Public License for many
|
Program (independent of having been made by running the Program).
|
||||||
libraries. However, the Lesser license provides advantages in certain
|
Whether that is true depends on what the Program does.
|
||||||
special circumstances.
|
|
||||||
|
|
||||||
For example, on rare occasions, there may be a special need to
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
encourage the widest possible use of a certain library, so that it becomes
|
source code as you receive it, in any medium, provided that you
|
||||||
a de-facto standard. To achieve this, non-free programs must be
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
allowed to use the library. A more frequent case is that a free
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
library does the same job as widely used non-free libraries. In this
|
notices that refer to this License and to the absence of any warranty;
|
||||||
case, there is little to gain by limiting the free library to free
|
and give any other recipients of the Program a copy of this License
|
||||||
software only, so we use the Lesser General Public License.
|
along with the Program.
|
||||||
|
|
||||||
In other cases, permission to use a particular library in non-free
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
programs enables a greater number of people to use a large body of
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
free software. For example, permission to use the GNU C Library in
|
|
||||||
non-free programs enables many more people to use the whole GNU
|
|
||||||
operating system, as well as its variant, the GNU/Linux operating
|
|
||||||
system.
|
|
||||||
|
|
||||||
Although the Lesser General Public License is Less protective of the
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
users' freedom, it does ensure that the user of a program that is
|
of it, thus forming a work based on the Program, and copy and
|
||||||
linked with the Library has the freedom and the wherewithal to run
|
distribute such modifications or work under the terms of Section 1
|
||||||
that program using a modified version of the Library.
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
a) You must cause the modified files to carry prominent notices
|
||||||
modification follow. Pay close attention to the difference between a
|
stating that you changed the files and the date of any change.
|
||||||
"work based on the library" and a "work that uses the library". The
|
|
||||||
former contains code derived from the library, whereas the latter must
|
|
||||||
be combined with the library in order to run.
|
|
||||||
|
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
b) You must cause any work that you distribute or publish, that in
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
0. This License Agreement applies to any software library or other
|
c) If the modified program normally reads commands interactively
|
||||||
program which contains a notice placed by the copyright holder or
|
when run, you must cause it, when started running for such
|
||||||
other authorized party saying it may be distributed under the terms of
|
interactive use in the most ordinary way, to print or display an
|
||||||
this Lesser General Public License (also called "this License").
|
announcement including an appropriate copyright notice and a
|
||||||
Each licensee is addressed as "you".
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
A "library" means a collection of software functions and/or data
|
These requirements apply to the modified work as a whole. If
|
||||||
prepared so as to be conveniently linked with application programs
|
identifiable sections of that work are not derived from the Program,
|
||||||
(which use some of those functions and data) to form executables.
|
|
||||||
|
|
||||||
The "Library", below, refers to any such software library or work
|
|
||||||
which has been distributed under these terms. A "work based on the
|
|
||||||
Library" means either the Library or any derivative work under
|
|
||||||
copyright law: that is to say, a work containing the Library or a
|
|
||||||
portion of it, either verbatim or with modifications and/or translated
|
|
||||||
straightforwardly into another language. (Hereinafter, translation is
|
|
||||||
included without limitation in the term "modification".)
|
|
||||||
|
|
||||||
"Source code" for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For a library, complete source code means
|
|
||||||
all the source code for all modules it contains, plus any associated
|
|
||||||
interface definition files, plus the scripts used to control compilation
|
|
||||||
and installation of the library.
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running a program using the Library is not restricted, and output from
|
|
||||||
such a program is covered only if its contents constitute a work based
|
|
||||||
on the Library (independent of the use of the Library in a tool for
|
|
||||||
writing it). Whether that is true depends on what the Library does
|
|
||||||
and what the program that uses the Library does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Library's
|
|
||||||
complete source code as you receive it, in any medium, provided that
|
|
||||||
you conspicuously and appropriately publish on each copy an
|
|
||||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
|
||||||
all the notices that refer to this License and to the absence of any
|
|
||||||
warranty; and distribute a copy of this License along with the
|
|
||||||
Library.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy,
|
|
||||||
and you may at your option offer warranty protection in exchange for a
|
|
||||||
fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Library or any portion
|
|
||||||
of it, thus forming a work based on the Library, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The modified work must itself be a software library.
|
|
||||||
|
|
||||||
b) You must cause the files modified to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
c) You must cause the whole of the work to be licensed at no
|
|
||||||
charge to all third parties under the terms of this License.
|
|
||||||
|
|
||||||
d) If a facility in the modified Library refers to a function or a
|
|
||||||
table of data to be supplied by an application program that uses
|
|
||||||
the facility, other than as an argument passed when the facility
|
|
||||||
is invoked, then you must make a good faith effort to ensure that,
|
|
||||||
in the event an application does not supply such function or
|
|
||||||
table, the facility still operates, and performs whatever part of
|
|
||||||
its purpose remains meaningful.
|
|
||||||
|
|
||||||
(For example, a function in a library to compute square roots has
|
|
||||||
a purpose that is entirely well-defined independent of the
|
|
||||||
application. Therefore, Subsection 2d requires that any
|
|
||||||
application-supplied function or table used by this function must
|
|
||||||
be optional: if the application does not supply it, the square
|
|
||||||
root function must still compute square roots.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Library,
|
|
||||||
and can be reasonably considered independent and separate works in
|
and can be reasonably considered independent and separate works in
|
||||||
themselves, then this License, and its terms, do not apply to those
|
themselves, then this License, and its terms, do not apply to those
|
||||||
sections when you distribute them as separate works. But when you
|
sections when you distribute them as separate works. But when you
|
||||||
distribute the same sections as part of a whole which is a work based
|
distribute the same sections as part of a whole which is a work based
|
||||||
on the Library, the distribution of the whole must be on the terms of
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
this License, whose permissions for other licensees extend to the
|
this License, whose permissions for other licensees extend to the
|
||||||
entire whole, and thus to each and every part regardless of who wrote
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
exercise the right to control the distribution of derivative or
|
exercise the right to control the distribution of derivative or
|
||||||
collective works based on the Library.
|
collective works based on the Program.
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Library
|
In addition, mere aggregation of another work not based on the Program
|
||||||
with the Library (or with a work based on the Library) on a volume of
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
a storage or distribution medium does not bring the other work under
|
a storage or distribution medium does not bring the other work under
|
||||||
the scope of this License.
|
the scope of this License.
|
||||||
|
|
||||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
License instead of this License to a given copy of the Library. To do
|
under Section 2) in object code or executable form under the terms of
|
||||||
this, you must alter all the notices that refer to this License, so
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
that they refer to the ordinary GNU General Public License, version 2,
|
|
||||||
instead of to this License. (If a newer version than version 2 of the
|
|
||||||
ordinary GNU General Public License has appeared, then you can specify
|
|
||||||
that version instead if you wish.) Do not make any other change in
|
|
||||||
these notices.
|
|
||||||
|
|
||||||
Once this change is made in a given copy, it is irreversible for
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
that copy, so the ordinary GNU General Public License applies to all
|
source code, which must be distributed under the terms of Sections
|
||||||
subsequent copies and derivative works made from that copy.
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
This option is useful when you wish to copy part of the code of
|
b) Accompany it with a written offer, valid for at least three
|
||||||
the Library into a program that is not a library.
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
4. You may copy and distribute the Library (or a portion or
|
c) Accompany it with the information you received as to the offer
|
||||||
derivative of it, under Section 2) in object code or executable form
|
to distribute corresponding source code. (This alternative is
|
||||||
under the terms of Sections 1 and 2 above provided that you accompany
|
allowed only for noncommercial distribution and only if you
|
||||||
it with the complete corresponding machine-readable source code, which
|
received the program in object code or executable form with such
|
||||||
must be distributed under the terms of Sections 1 and 2 above on a
|
an offer, in accord with Subsection b above.)
|
||||||
medium customarily used for software interchange.
|
|
||||||
|
|
||||||
If distribution of object code is made by offering access to copy
|
The source code for a work means the preferred form of the work for
|
||||||
from a designated place, then offering equivalent access to copy the
|
making modifications to it. For an executable work, complete source
|
||||||
source code from the same place satisfies the requirement to
|
code means all the source code for all modules it contains, plus any
|
||||||
distribute the source code, even though third parties are not
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
5. A program that contains no derivative of any portion of the
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
Library, but is designed to work with the Library by being compiled or
|
except as expressly provided under this License. Any attempt
|
||||||
linked with it, is called a "work that uses the Library". Such a
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
work, in isolation, is not a derivative work of the Library, and
|
void, and will automatically terminate your rights under this License.
|
||||||
therefore falls outside the scope of this License.
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
However, linking a "work that uses the Library" with the Library
|
5. You are not required to accept this License, since you have not
|
||||||
creates an executable that is a derivative of the Library (because it
|
signed it. However, nothing else grants you permission to modify or
|
||||||
contains portions of the Library), rather than a "work that uses the
|
distribute the Program or its derivative works. These actions are
|
||||||
library". The executable is therefore covered by this License.
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
Section 6 states terms for distribution of such executables.
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
When a "work that uses the Library" uses material from a header file
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
that is part of the Library, the object code for the work may be a
|
Program), the recipient automatically receives a license from the
|
||||||
derivative work of the Library even though the source code is not.
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
Whether this is true is especially significant if the work can be
|
these terms and conditions. You may not impose any further
|
||||||
linked without the Library, or if the work is itself a library. The
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
threshold for this to be true is not precisely defined by law.
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
If such an object file uses only numerical parameters, data
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
structure layouts and accessors, and small macros and small inline
|
infringement or for any other reason (not limited to patent issues),
|
||||||
functions (ten lines or less in length), then the use of the object
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
file is unrestricted, regardless of whether it is legally a derivative
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
work. (Executables containing this object code plus portions of the
|
excuse you from the conditions of this License. If you cannot
|
||||||
Library will still fall under Section 6.)
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
Otherwise, if the work is a derivative of the Library, you may
|
If any portion of this section is held invalid or unenforceable under
|
||||||
distribute the object code for the work under the terms of Section 6.
|
any particular circumstance, the balance of the section is intended to
|
||||||
Any executables containing that work also fall under Section 6,
|
apply and the section as a whole is intended to apply in other
|
||||||
whether or not they are linked directly with the Library itself.
|
circumstances.
|
||||||
|
|
||||||
6. As an exception to the Sections above, you may also combine or
|
|
||||||
link a "work that uses the Library" with the Library to produce a
|
|
||||||
work containing portions of the Library, and distribute that work
|
|
||||||
under terms of your choice, provided that the terms permit
|
|
||||||
modification of the work for the customer's own use and reverse
|
|
||||||
engineering for debugging such modifications.
|
|
||||||
|
|
||||||
You must give prominent notice with each copy of the work that the
|
|
||||||
Library is used in it and that the Library and its use are covered by
|
|
||||||
this License. You must supply a copy of this License. If the work
|
|
||||||
during execution displays copyright notices, you must include the
|
|
||||||
copyright notice for the Library among them, as well as a reference
|
|
||||||
directing the user to the copy of this License. Also, you must do one
|
|
||||||
of these things:
|
|
||||||
|
|
||||||
a) Accompany the work with the complete corresponding
|
|
||||||
machine-readable source code for the Library including whatever
|
|
||||||
changes were used in the work (which must be distributed under
|
|
||||||
Sections 1 and 2 above); and, if the work is an executable linked
|
|
||||||
with the Library, with the complete machine-readable "work that
|
|
||||||
uses the Library", as object code and/or source code, so that the
|
|
||||||
user can modify the Library and then relink to produce a modified
|
|
||||||
executable containing the modified Library. (It is understood
|
|
||||||
that the user who changes the contents of definitions files in the
|
|
||||||
Library will not necessarily be able to recompile the application
|
|
||||||
to use the modified definitions.)
|
|
||||||
|
|
||||||
b) Use a suitable shared library mechanism for linking with the
|
|
||||||
Library. A suitable mechanism is one that (1) uses at run time a
|
|
||||||
copy of the library already present on the user's computer system,
|
|
||||||
rather than copying library functions into the executable, and (2)
|
|
||||||
will operate properly with a modified version of the library, if
|
|
||||||
the user installs one, as long as the modified version is
|
|
||||||
interface-compatible with the version that the work was made with.
|
|
||||||
|
|
||||||
c) Accompany the work with a written offer, valid for at
|
|
||||||
least three years, to give the same user the materials
|
|
||||||
specified in Subsection 6a, above, for a charge no more
|
|
||||||
than the cost of performing this distribution.
|
|
||||||
|
|
||||||
d) If distribution of the work is made by offering access to copy
|
|
||||||
from a designated place, offer equivalent access to copy the above
|
|
||||||
specified materials from the same place.
|
|
||||||
|
|
||||||
e) Verify that the user has already received a copy of these
|
|
||||||
materials or that you have already sent this user a copy.
|
|
||||||
|
|
||||||
For an executable, the required form of the "work that uses the
|
|
||||||
Library" must include any data and utility programs needed for
|
|
||||||
reproducing the executable from it. However, as a special exception,
|
|
||||||
the materials to be distributed need not include anything that is
|
|
||||||
normally distributed (in either source or binary form) with the major
|
|
||||||
components (compiler, kernel, and so on) of the operating system on
|
|
||||||
which the executable runs, unless that component itself accompanies
|
|
||||||
the executable.
|
|
||||||
|
|
||||||
It may happen that this requirement contradicts the license
|
|
||||||
restrictions of other proprietary libraries that do not normally
|
|
||||||
accompany the operating system. Such a contradiction means you cannot
|
|
||||||
use both them and the Library together in an executable that you
|
|
||||||
distribute.
|
|
||||||
|
|
||||||
7. You may place library facilities that are a work based on the
|
|
||||||
Library side-by-side in a single library together with other library
|
|
||||||
facilities not covered by this License, and distribute such a combined
|
|
||||||
library, provided that the separate distribution of the work based on
|
|
||||||
the Library and of the other library facilities is otherwise
|
|
||||||
permitted, and provided that you do these two things:
|
|
||||||
|
|
||||||
a) Accompany the combined library with a copy of the same work
|
|
||||||
based on the Library, uncombined with any other library
|
|
||||||
facilities. This must be distributed under the terms of the
|
|
||||||
Sections above.
|
|
||||||
|
|
||||||
b) Give prominent notice with the combined library of the fact
|
|
||||||
that part of it is a work based on the Library, and explaining
|
|
||||||
where to find the accompanying uncombined form of the same work.
|
|
||||||
|
|
||||||
8. You may not copy, modify, sublicense, link with, or distribute
|
|
||||||
the Library except as expressly provided under this License. Any
|
|
||||||
attempt otherwise to copy, modify, sublicense, link with, or
|
|
||||||
distribute the Library is void, and will automatically terminate your
|
|
||||||
rights under this License. However, parties who have received copies,
|
|
||||||
or rights, from you under this License will not have their licenses
|
|
||||||
terminated so long as such parties remain in full compliance.
|
|
||||||
|
|
||||||
9. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Library or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Library (or any work based on the
|
|
||||||
Library), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Library or works based on it.
|
|
||||||
|
|
||||||
10. Each time you redistribute the Library (or any work based on the
|
|
||||||
Library), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute, link with or modify the Library
|
|
||||||
subject to these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties with
|
|
||||||
this License.
|
|
||||||
|
|
||||||
11. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Library at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Library by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Library.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under any
|
|
||||||
particular circumstance, the balance of the section is intended to apply,
|
|
||||||
and the section as a whole is intended to apply in other circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
It is not the purpose of this section to induce you to infringe any
|
||||||
patents or other property right claims or to contest validity of any
|
patents or other property right claims or to contest validity of any
|
||||||
such claims; this section has the sole purpose of protecting the
|
such claims; this section has the sole purpose of protecting the
|
||||||
integrity of the free software distribution system which is
|
integrity of the free software distribution system, which is
|
||||||
implemented by public license practices. Many people have made
|
implemented by public license practices. Many people have made
|
||||||
generous contributions to the wide range of software distributed
|
generous contributions to the wide range of software distributed
|
||||||
through that system in reliance on consistent application of that
|
through that system in reliance on consistent application of that
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
@@ -402,103 +227,114 @@ impose that choice.
|
|||||||
This section is intended to make thoroughly clear what is believed to
|
This section is intended to make thoroughly clear what is believed to
|
||||||
be a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
12. If the distribution and/or use of the Library is restricted in
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
original copyright holder who places the Library under this License may add
|
original copyright holder who places the Program under this License
|
||||||
an explicit geographical distribution limitation excluding those countries,
|
may add an explicit geographical distribution limitation excluding
|
||||||
so that distribution is permitted only in or among countries not thus
|
those countries, so that distribution is permitted only in or among
|
||||||
excluded. In such case, this License incorporates the limitation as if
|
countries not thus excluded. In such case, this License incorporates
|
||||||
written in the body of this License.
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
13. The Free Software Foundation may publish revised and/or new
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
versions of the Lesser General Public License from time to time.
|
of the General Public License from time to time. Such new versions will
|
||||||
Such new versions will be similar in spirit to the present version,
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
but may differ in detail to address new problems or concerns.
|
address new problems or concerns.
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Library
|
Each version is given a distinguishing version number. If the Program
|
||||||
specifies a version number of this License which applies to it and
|
specifies a version number of this License which applies to it and "any
|
||||||
"any later version", you have the option of following the terms and
|
later version", you have the option of following the terms and conditions
|
||||||
conditions either of that version or of any later version published by
|
either of that version or of any later version published by the Free
|
||||||
the Free Software Foundation. If the Library does not specify a
|
Software Foundation. If the Program does not specify a version number of
|
||||||
license version number, you may choose any version ever published by
|
this License, you may choose any version ever published by the Free Software
|
||||||
the Free Software Foundation.
|
Foundation.
|
||||||
|
|
||||||
14. If you wish to incorporate parts of the Library into other free
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
programs whose distribution conditions are incompatible with these,
|
programs whose distribution conditions are different, write to the author
|
||||||
write to the author to ask for permission. For software which is
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
copyrighted by the Free Software Foundation, write to the Free
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
Software Foundation; we sometimes make exceptions for this. Our
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
decision will be guided by the two goals of preserving the free status
|
of preserving the free status of all derivatives of our free software and
|
||||||
of all derivatives of our free software and of promoting the sharing
|
of promoting the sharing and reuse of software generally.
|
||||||
and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
NO WARRANTY
|
||||||
|
|
||||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Libraries
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new library, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
possible use to the public, we recommend making it free software that
|
possible use to the public, the best way to achieve this is to make it
|
||||||
everyone can redistribute and change. You can do so by permitting
|
free software which everyone can redistribute and change under these terms.
|
||||||
redistribution under these terms (or, alternatively, under the terms of the
|
|
||||||
ordinary General Public License).
|
|
||||||
|
|
||||||
To apply these terms, attach the following notices to the library. It is
|
To do so, attach the following notices to the program. It is safest
|
||||||
safest to attach them to the start of each source file to most effectively
|
to attach them to the start of each source file to most effectively
|
||||||
convey the exclusion of warranty; and each file should have at least the
|
convey the exclusion of warranty; and each file should have at least
|
||||||
"copyright" line and a pointer to where the full notice is found.
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
<one line to give the library's name and a brief idea of what it does.>
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
Copyright (C) <year> <name of author>
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or modify
|
||||||
modify it under the terms of the GNU Lesser General Public
|
it under the terms of the GNU General Public License as published by
|
||||||
License as published by the Free Software Foundation; either
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
Lesser General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
You should have received a copy of the GNU General Public License along
|
||||||
License along with this library; if not, write to the Free Software
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
USA
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
You should also get your employer (if you work as a programmer) or your
|
||||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
necessary. Here is a sample; alter the names:
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
library `Frob' (a library for tweaking knobs) written by James Random
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1990
|
<signature of Ty Coon>, 1 April 1989
|
||||||
Ty Coon, President of Vice
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
That's all there is to it!
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License.
|
||||||
|
|||||||
29
README.md
29
README.md
@@ -1,30 +1 @@
|
|||||||
# Decky Frontend Library
|
# Decky Frontend Library
|
||||||
|
|
||||||
Library used to develop plugins used for use with [decky-loader](https://github.com/SteamDeckHomebrew/decky-loader).
|
|
||||||
|
|
||||||
## Decky Loader Discord [](https://deckbrew.xyz/discord)
|
|
||||||
|
|
||||||
Please [contact the developers here](https://deckbrew.xyz/discord) for questions and support that cannot be addressed via a Github issue.
|
|
||||||
|
|
||||||
## Developers and Contributors
|
|
||||||
|
|
||||||
This library is focused on usage by developers to provide custom React components based on those found in the Steam Deck's React UI.
|
|
||||||
This method allows developers to add UI elements and code without clobbering the existing UI of the deck in order to do so.
|
|
||||||
This library can also theoretically be used to extend existing UI elements of the Steam Deck UI but this has not been tested extensively.
|
|
||||||
|
|
||||||
### Getting Started (Contributors)
|
|
||||||
|
|
||||||
1. Clone the repository to your preferred location
|
|
||||||
2. If you wish to add features such as new UI components, please create a feature branch to PR to the original repo.
|
|
||||||
3. Bug/hotfixes are acceptable on the main branch,
|
|
||||||
|
|
||||||
### Getting Started (Developers)
|
|
||||||
|
|
||||||
If you would like a feature added to decky-frontend-lib, please request it via a Github issue.
|
|
||||||
|
|
||||||
If you want to start making a plugin with decky-frontend-lib, please direct your attention to the [decky-plugin-template](https://github.com/SteamDeckHomebrew/decky-plugin-template) repository.
|
|
||||||
|
|
||||||
This library can be found on [npm](https://www.npmjs.com/package/decky-frontend-lib) and as such you can pull it without a local copy for your project as needed.
|
|
||||||
|
|
||||||
Tips for fixing failing module finds after Steam updates:
|
|
||||||
- `Object.entries(DFL)` can point out any undefined exports
|
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
presets: [['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript'],
|
presets: [['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript',],
|
||||||
};
|
};
|
||||||
|
|||||||
5
global.d.ts
vendored
5
global.d.ts
vendored
@@ -1,5 +0,0 @@
|
|||||||
declare global {
|
|
||||||
interface Window {
|
|
||||||
SP_REACT: typeof React;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
5
globals.d.ts
vendored
Normal file
5
globals.d.ts
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
declare global {
|
||||||
|
interface Window {
|
||||||
|
SP_REACT: typeof React;
|
||||||
|
}
|
||||||
|
}
|
||||||
10530
package-lock.json
generated
Normal file
10530
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
67
package.json
67
package.json
@@ -1,18 +1,15 @@
|
|||||||
{
|
{
|
||||||
"name": "@decky/ui",
|
"name": "decky-frontend-lib",
|
||||||
"version": "4.10.2",
|
"version": "0.0.5",
|
||||||
"description": "A library for interacting with the Steam frontend in Decky plugins and elsewhere.",
|
"description": "A library for building decky plugins",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"types": "dist/index.d.ts",
|
"types": "dist/index.d.ts",
|
||||||
"module": "dist/index.js",
|
"module": "dist/index.js",
|
||||||
"sideEffects": false,
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "shx rm -rf dist && tsc -b",
|
"build": "shx rm -rf dist && tsc -b",
|
||||||
"dev": "tsc -b -w",
|
"dev": "tsc -b -w",
|
||||||
"docs": "typedoc --theme wiki-js --tsconfig ./tsconfig.json src/**/*",
|
"prepack": "npm run build",
|
||||||
"test": "echo 'No tests for now!'",
|
"test": "jest"
|
||||||
"prepare": "husky install",
|
|
||||||
"commit": "git-cz"
|
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"/lib",
|
"/lib",
|
||||||
@@ -29,65 +26,27 @@
|
|||||||
"steam",
|
"steam",
|
||||||
"components"
|
"components"
|
||||||
],
|
],
|
||||||
"author": "SteamDeckHomebrew Team",
|
"author": "Jonas Dellinger <jonas@dellinger.dev>",
|
||||||
"license": "LGPL-2.1",
|
"license": "GPL-2.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/SteamDeckHomebrew/decky-frontend-lib/issues"
|
"url": "https://github.com/SteamDeckHomebrew/decky-frontend-lib/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/SteamDeckHomebrew/decky-frontend-lib#readme",
|
"homepage": "https://github.com/SteamDeckHomebrew/decky-frontend-lib#readme",
|
||||||
"config": {
|
|
||||||
"commitizen": {
|
|
||||||
"path": "@commitlint/cz-commitlint"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^19.3.0",
|
"@types/jest": "^27.4.1",
|
||||||
"@commitlint/config-conventional": "^19.2.2",
|
"@types/react": "16.14.0",
|
||||||
"@commitlint/cz-commitlint": "^19.2.0",
|
"@types/react-router": "5.1.18",
|
||||||
"@semantic-release/changelog": "^6.0.3",
|
|
||||||
"@semantic-release/git": "^10.0.1",
|
|
||||||
"@types/jest": "^29.5.12",
|
|
||||||
"@types/react": "18.3.3",
|
|
||||||
"@types/react-dom": "18.3.0",
|
|
||||||
"@types/react-router": "5.1.20",
|
|
||||||
"commitizen": "^4.3.0",
|
|
||||||
"husky": "^9.0.11",
|
|
||||||
"import-sort-style-module": "^6.0.0",
|
"import-sort-style-module": "^6.0.0",
|
||||||
"jest": "^29.7.0",
|
"jest": "^27.5.1",
|
||||||
"minimist": "^1.2.8",
|
|
||||||
"prettier": "^3.3.2",
|
|
||||||
"prettier-plugin-import-sort": "^0.0.7",
|
"prettier-plugin-import-sort": "^0.0.7",
|
||||||
"semantic-release": "^24.0.0",
|
|
||||||
"shx": "^0.3.4",
|
"shx": "^0.3.4",
|
||||||
"ts-jest": "^29.1.4",
|
"ts-jest": "^27.1.4",
|
||||||
"typedoc": "^0.25.13",
|
"typescript": "^4.6.3"
|
||||||
"typedoc-plugin-mdn-links": "^3.1.29",
|
|
||||||
"typedoc-plugin-missing-exports": "^2.3.0",
|
|
||||||
"typedoc-wikijs-theme": "^1.0.5",
|
|
||||||
"typescript": "^5.4.5"
|
|
||||||
},
|
|
||||||
"pnpm": {
|
|
||||||
"peerDependencyRules": {
|
|
||||||
"ignoreMissing": [
|
|
||||||
"react",
|
|
||||||
"react-dom"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"updateConfig": {
|
|
||||||
"ignoreDependencies": [
|
|
||||||
"react",
|
|
||||||
"react-dom"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"importSort": {
|
"importSort": {
|
||||||
".js, .jsx, .ts, .tsx": {
|
".js, .jsx, .ts, .tsx": {
|
||||||
"style": "module",
|
"style": "module",
|
||||||
"parser": "typescript"
|
"parser": "typescript"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"publishConfig": {
|
|
||||||
"registry": "https://registry.npmjs.org/",
|
|
||||||
"tag": "latest"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
6470
pnpm-lock.yaml
generated
6470
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,40 +0,0 @@
|
|||||||
import { Module, ModuleID, createModuleMapping } from './webpack';
|
|
||||||
|
|
||||||
export interface ClassModule {
|
|
||||||
[name: string]: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const classModuleMap: Map<ModuleID, ClassModule> = createModuleMapping((m: Module) => {
|
|
||||||
if (typeof m == 'object' && !m.__esModule) {
|
|
||||||
const keys = Object.keys(m);
|
|
||||||
// special case some libraries
|
|
||||||
if (keys.length == 1 && m.version) return false;
|
|
||||||
// special case localization
|
|
||||||
if (keys.length > 1000 && m.AboutSettings) return false;
|
|
||||||
|
|
||||||
return keys.length > 0 && keys.every((k) => !Object.getOwnPropertyDescriptor(m, k)?.get && typeof m[k] == 'string');
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
export const classMap = [...classModuleMap.values()];
|
|
||||||
|
|
||||||
export function findClass(id: string, name: string): string | void {
|
|
||||||
return classModuleMap.get(id)?.[name];
|
|
||||||
}
|
|
||||||
|
|
||||||
export function findClassByName(name: string): string | void {
|
|
||||||
return classMap.find((m) => m[name])?.[name];
|
|
||||||
}
|
|
||||||
|
|
||||||
export function findClassModule(filter: (module: any) => boolean): ClassModule | void {
|
|
||||||
return classMap.find((m) => filter(m));
|
|
||||||
}
|
|
||||||
|
|
||||||
export function unminifyClass(minifiedClass: string): string | void {
|
|
||||||
for (let m of classModuleMap.values()) {
|
|
||||||
for (let className of Object.keys(m)) {
|
|
||||||
if (m[className] == minifiedClass) return className;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
import { FC } from 'react';
|
|
||||||
|
|
||||||
import { DialogButton, DialogButtonProps } from './Dialog';
|
|
||||||
|
|
||||||
export interface ButtonProps extends DialogButtonProps {}
|
|
||||||
|
|
||||||
// Button isn't exported, so call DialogButton to grab it
|
|
||||||
export const Button = (DialogButton as any)?.render({}).type as FC<ButtonProps>;
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
import { FC } from 'react';
|
|
||||||
|
|
||||||
import { CommonUIModule } from '../webpack';
|
|
||||||
import { ItemProps } from './Item';
|
|
||||||
import { createPropListRegex } from '../utils';
|
|
||||||
|
|
||||||
export interface ButtonItemProps extends ItemProps {
|
|
||||||
onClick?(e: MouseEvent): void;
|
|
||||||
disabled?: boolean;
|
|
||||||
}
|
|
||||||
const buttonItemRegex = createPropListRegex(["highlightOnFocus", "childrenContainerWidth"], false);
|
|
||||||
export const ButtonItem = Object.values(CommonUIModule).find(
|
|
||||||
(mod: any) =>
|
|
||||||
(mod?.render?.toString && buttonItemRegex.test(mod.render.toString())) ||
|
|
||||||
mod?.render?.toString?.().includes('childrenContainerWidth:"min"'),
|
|
||||||
) as FC<ButtonItemProps>;
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import { HTMLAttributes, ReactNode, RefAttributes, FC } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleExport } from '../webpack';
|
|
||||||
|
|
||||||
export interface CarouselProps extends HTMLAttributes<HTMLDivElement> {
|
|
||||||
autoFocus?: boolean;
|
|
||||||
enableBumperPaging?: boolean;
|
|
||||||
fnDoesItemTakeFocus?: (...unknown: any[]) => boolean;
|
|
||||||
fnGetColumnWidth?: (...unknown: any[]) => number;
|
|
||||||
fnGetId?: (id: number) => number;
|
|
||||||
fnItemRenderer?: (id: number, ...unknown: any[]) => ReactNode;
|
|
||||||
fnUpdateArrows?: (...unknown: any[]) => any;
|
|
||||||
initialColumn?: number;
|
|
||||||
nHeight?: number;
|
|
||||||
nIndexLeftmost?: number;
|
|
||||||
nItemHeight?: number;
|
|
||||||
nItemMarginX?: number;
|
|
||||||
nNumItems?: number;
|
|
||||||
name?: string;
|
|
||||||
scrollToAlignment?: 'center';
|
|
||||||
}
|
|
||||||
|
|
||||||
export const Carousel = findModuleExport((e: Export) => e.render?.toString().includes('setFocusedColumn:')) as FC<
|
|
||||||
CarouselProps & RefAttributes<HTMLDivElement>
|
|
||||||
>;
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import { FC, ReactNode } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleExport } from '../webpack';
|
|
||||||
|
|
||||||
export interface ControlsListProps {
|
|
||||||
alignItems?: 'left' | 'right' | 'center';
|
|
||||||
spacing?: 'standard' | 'extra';
|
|
||||||
children?: ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const ControlsList: FC<ControlsListProps> = findModuleExport(
|
|
||||||
(e: Export) =>
|
|
||||||
e?.toString && e.toString().includes('().ControlsListChild') && e.toString().includes('().ControlsListOuterPanel'),
|
|
||||||
);
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
import { CSSProperties, FC, ReactNode, RefAttributes } from 'react';
|
|
||||||
|
|
||||||
import { CommonUIModule } from '../webpack';
|
|
||||||
import { FooterLegendProps } from './FooterLegend';
|
|
||||||
|
|
||||||
export interface DialogCommonProps extends RefAttributes<HTMLDivElement> {
|
|
||||||
style?: CSSProperties;
|
|
||||||
className?: string;
|
|
||||||
children?: ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface DialogButtonProps extends DialogCommonProps, FooterLegendProps {
|
|
||||||
/**
|
|
||||||
* Enables/disables the focus around the button.
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* Default value depends on context, so setting it to `false` will enable it.
|
|
||||||
*/
|
|
||||||
noFocusRing?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disables the button - assigned `on*` methods will not be invoked if clicked.
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* Depending on where it is, it might still get focus. In such case it can be
|
|
||||||
* partially disabled separately.
|
|
||||||
*
|
|
||||||
* @see focusable.
|
|
||||||
*/
|
|
||||||
disabled?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enables/disables the navigation based focus on button - you won't be able to navigate to
|
|
||||||
* it via the gamepad or keyboard.
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* If set to `false`, it still can be clicked and **WILL** become focused until navigated away.
|
|
||||||
* Depending on the context of where the button is, even a disabled button can focused.
|
|
||||||
*/
|
|
||||||
focusable?: boolean;
|
|
||||||
|
|
||||||
onClick?(e: MouseEvent): void;
|
|
||||||
onPointerDown?(e: PointerEvent): void;
|
|
||||||
onPointerUp?(e: PointerEvent): void;
|
|
||||||
onPointerCancel?(e: PointerEvent): void;
|
|
||||||
onMouseDown?(e: MouseEvent): void;
|
|
||||||
onMouseUp?(e: MouseEvent): void;
|
|
||||||
onTouchStart?(e: TouchEvent): void;
|
|
||||||
onTouchEnd?(e: TouchEvent): void;
|
|
||||||
onTouchCancel?(e: TouchEvent): void;
|
|
||||||
onSubmit?(e: SubmitEvent): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
const CommonDialogDivs = Object.values(CommonUIModule).filter(
|
|
||||||
(m: any) => typeof m === 'object' && m?.render?.toString().includes('createElement("div",{...') ||
|
|
||||||
m?.render?.toString().includes('createElement("div",Object.assign({},'),
|
|
||||||
);
|
|
||||||
const MappedDialogDivs = new Map(
|
|
||||||
Object.values(CommonDialogDivs).map((m: any) => {
|
|
||||||
try {
|
|
||||||
const renderedDiv = m.render({});
|
|
||||||
// Take only the first class name segment as it identifies the element we want
|
|
||||||
return [renderedDiv.props.className.split(' ')[0], m];
|
|
||||||
} catch (e) {
|
|
||||||
console.error("[DFL:Dialog]: failed to render common dialog component", e);
|
|
||||||
return [null, null];
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
export const DialogHeader = MappedDialogDivs.get('DialogHeader') as FC<DialogCommonProps>;
|
|
||||||
export const DialogSubHeader = MappedDialogDivs.get('DialogSubHeader') as FC<DialogCommonProps>;
|
|
||||||
export const DialogFooter = MappedDialogDivs.get('DialogFooter') as FC<DialogCommonProps>;
|
|
||||||
export const DialogLabel = MappedDialogDivs.get('DialogLabel') as FC<DialogCommonProps>;
|
|
||||||
export const DialogBodyText = MappedDialogDivs.get('DialogBodyText') as FC<DialogCommonProps>;
|
|
||||||
export const DialogBody = MappedDialogDivs.get('DialogBody') as FC<DialogCommonProps>;
|
|
||||||
export const DialogControlsSection = MappedDialogDivs.get('DialogControlsSection') as FC<DialogCommonProps>;
|
|
||||||
export const DialogControlsSectionHeader = MappedDialogDivs.get('DialogControlsSectionHeader') as FC<DialogCommonProps>;
|
|
||||||
|
|
||||||
export const DialogButtonPrimary = Object.values(CommonUIModule).find(
|
|
||||||
(mod: any) => mod?.render?.toString?.()?.includes('"DialogButton","_DialogLayout","Primary"'),
|
|
||||||
) as FC<DialogButtonProps>;
|
|
||||||
|
|
||||||
export const DialogButtonSecondary = Object.values(CommonUIModule).find(
|
|
||||||
(mod: any) => mod?.render?.toString?.()?.includes('"DialogButton","_DialogLayout","Secondary"')
|
|
||||||
) as FC<DialogButtonProps>;
|
|
||||||
|
|
||||||
// This is the "main" button. The Primary can act as a submit button,
|
|
||||||
// therefore secondary is chosen (also for backwards comp. reasons)
|
|
||||||
export const DialogButton = DialogButtonSecondary;
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
import { FC, ReactNode } from 'react';
|
|
||||||
|
|
||||||
import { findModuleExport } from '../webpack';
|
|
||||||
import { DialogCommonProps } from './Dialog';
|
|
||||||
import { FooterLegendProps } from './FooterLegend';
|
|
||||||
|
|
||||||
export interface DialogCheckboxProps extends DialogCommonProps, FooterLegendProps {
|
|
||||||
onChange?(checked: boolean): void;
|
|
||||||
label?: ReactNode;
|
|
||||||
description?: ReactNode;
|
|
||||||
disabled?: boolean;
|
|
||||||
tooltip?: string;
|
|
||||||
color?: string;
|
|
||||||
highlightColor?: string;
|
|
||||||
bottomSeparator?: 'standard' | 'thick' | 'none';
|
|
||||||
controlled?: boolean;
|
|
||||||
checked?: boolean;
|
|
||||||
onClick?(evt: Event): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do not access KeyDown, SetChecked, Toggle here as they are getters and accessing them outside of a render breaks them globally
|
|
||||||
export const DialogCheckbox = findModuleExport(e =>
|
|
||||||
e?.prototype &&
|
|
||||||
typeof e?.prototype == "object" &&
|
|
||||||
"GetPanelElementProps" in e?.prototype &&
|
|
||||||
"SetChecked" in e?.prototype &&
|
|
||||||
"Toggle" in e?.prototype &&
|
|
||||||
// beta || stable as of oct 2 2024
|
|
||||||
(e?.prototype?.render?.toString?.().includes('="DialogCheckbox"') || (
|
|
||||||
e.contextType &&
|
|
||||||
e.prototype?.render?.toString?.().includes('fallback:')
|
|
||||||
))
|
|
||||||
) as FC<DialogCheckboxProps>;
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
import { ReactNode, FC } from 'react';
|
|
||||||
|
|
||||||
import { CommonUIModule } from '../webpack';
|
|
||||||
import { ItemProps } from './Item';
|
|
||||||
import { createPropListRegex } from '../utils';
|
|
||||||
import type { ContextMenuPositionOptions } from './Menu';
|
|
||||||
|
|
||||||
export interface SingleDropdownOption {
|
|
||||||
data: any;
|
|
||||||
label: ReactNode;
|
|
||||||
|
|
||||||
options?: never;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface MultiDropdownOption {
|
|
||||||
label: ReactNode;
|
|
||||||
options: DropdownOption[];
|
|
||||||
|
|
||||||
data?: never;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type DropdownOption = SingleDropdownOption | MultiDropdownOption;
|
|
||||||
|
|
||||||
export interface DropdownProps {
|
|
||||||
rgOptions: DropdownOption[];
|
|
||||||
selectedOption: any;
|
|
||||||
disabled?: boolean;
|
|
||||||
onMenuWillOpen?(showMenu: () => void): void;
|
|
||||||
onMenuOpened?(): void;
|
|
||||||
onChange?(data: SingleDropdownOption): void;
|
|
||||||
contextMenuPositionOptions?: ContextMenuPositionOptions;
|
|
||||||
menuLabel?: string;
|
|
||||||
strDefaultLabel?: string;
|
|
||||||
renderButtonValue?(element: ReactNode): ReactNode;
|
|
||||||
focusable?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const Dropdown = Object.values(CommonUIModule).find(
|
|
||||||
(mod: any) => mod?.prototype?.SetSelectedOption && mod?.prototype?.BuildMenu,
|
|
||||||
) as FC<DropdownProps>;
|
|
||||||
|
|
||||||
export interface DropdownItemProps extends DropdownProps, ItemProps {}
|
|
||||||
|
|
||||||
const dropdownItemRegex = createPropListRegex(["dropDownControlRef", "description"], false);
|
|
||||||
export const DropdownItem = Object.values(CommonUIModule).find((mod: any) =>
|
|
||||||
mod?.toString && dropdownItemRegex.test(mod.toString()),
|
|
||||||
) as FC<DropdownItemProps>;
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
import { FC, PropsWithChildren } from "react";
|
|
||||||
import { findModuleExport } from "../webpack";
|
|
||||||
|
|
||||||
export const ErrorBoundary = findModuleExport(
|
|
||||||
(e) => e.InstallErrorReportingStore && e?.prototype?.Reset && e?.prototype?.componentDidCatch,
|
|
||||||
) as FC<PropsWithChildren>; // Actually a class but @types/react is broken lol
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import { FC, ReactNode, RefAttributes } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleExport } from '../webpack';
|
|
||||||
import { FooterLegendProps } from './FooterLegend';
|
|
||||||
|
|
||||||
export interface FieldProps extends FooterLegendProps {
|
|
||||||
children?: ReactNode;
|
|
||||||
label?: ReactNode;
|
|
||||||
bottomSeparator?: 'standard' | 'thick' | 'none';
|
|
||||||
description?: ReactNode;
|
|
||||||
disabled?: boolean;
|
|
||||||
icon?: ReactNode;
|
|
||||||
inlineWrap?: 'keep-inline' | 'shift-children-below'; // If label is too long it will move shildren below before starting to wrap label
|
|
||||||
childrenLayout?: 'below' | 'inline';
|
|
||||||
childrenContainerWidth?: 'min' | 'max' | 'fixed'; // Does not work with childrenLayout==='below'
|
|
||||||
spacingBetweenLabelAndChild?: 'none'; // This applies only when childrenLayout==='below'
|
|
||||||
padding?: 'none' | 'standard' | 'compact';
|
|
||||||
className?: string;
|
|
||||||
highlightOnFocus?: boolean;
|
|
||||||
indentLevel?: number;
|
|
||||||
verticalAlignment?: 'center' | 'none'; // Alligns inline label with children
|
|
||||||
focusable?: boolean; // Allows to get focus without any focusable children or on* callbacks
|
|
||||||
onActivate?: (e: CustomEvent | MouseEvent) => void;
|
|
||||||
onClick?: (e: CustomEvent | MouseEvent) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const Field = findModuleExport((e: Export) => e?.render?.toString().includes('"shift-children-below"')) as FC<
|
|
||||||
FieldProps & RefAttributes<HTMLDivElement>
|
|
||||||
>;
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import { ElementType, FC, ReactNode } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleExport } from '../webpack';
|
|
||||||
|
|
||||||
export interface FocusRingProps {
|
|
||||||
className?: string;
|
|
||||||
rootClassName?: string;
|
|
||||||
render?: ElementType;
|
|
||||||
children?: ReactNode;
|
|
||||||
NavigationManager?: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const FocusRing = findModuleExport((e: Export) =>
|
|
||||||
e?.toString?.()?.includes('.GetShowDebugFocusRing())'),
|
|
||||||
) as FC<FocusRingProps>;
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
import { HTMLAttributes, ReactNode, RefAttributes, FC } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleExport } from '../webpack';
|
|
||||||
import { FooterLegendProps } from './FooterLegend';
|
|
||||||
import { createPropListRegex } from '../utils';
|
|
||||||
|
|
||||||
export interface FocusableProps extends HTMLAttributes<HTMLDivElement>, FooterLegendProps {
|
|
||||||
children: ReactNode;
|
|
||||||
'flow-children'?: string;
|
|
||||||
focusClassName?: string;
|
|
||||||
focusWithinClassName?: string;
|
|
||||||
noFocusRing?: boolean;
|
|
||||||
onActivate?: (e: CustomEvent) => void;
|
|
||||||
onCancel?: (e: CustomEvent) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
const focusableRegex = createPropListRegex(["flow-children", "onActivate", "onCancel", "focusClassName", "focusWithinClassName"]);
|
|
||||||
|
|
||||||
export const Focusable = findModuleExport((e: Export) =>
|
|
||||||
e?.render?.toString && focusableRegex.test(e.render.toString())
|
|
||||||
) as FC<FocusableProps & RefAttributes<HTMLDivElement>>;
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
import { ReactNode } from 'react';
|
|
||||||
|
|
||||||
export enum GamepadButton {
|
|
||||||
INVALID,
|
|
||||||
OK,
|
|
||||||
CANCEL,
|
|
||||||
SECONDARY,
|
|
||||||
OPTIONS,
|
|
||||||
BUMPER_LEFT,
|
|
||||||
BUMPER_RIGHT,
|
|
||||||
TRIGGER_LEFT,
|
|
||||||
TRIGGER_RIGHT,
|
|
||||||
DIR_UP,
|
|
||||||
DIR_DOWN,
|
|
||||||
DIR_LEFT,
|
|
||||||
DIR_RIGHT,
|
|
||||||
SELECT,
|
|
||||||
START,
|
|
||||||
LSTICK_CLICK,
|
|
||||||
RSTICK_CLICK,
|
|
||||||
LSTICK_TOUCH,
|
|
||||||
RSTICK_TOUCH,
|
|
||||||
LPAD_TOUCH,
|
|
||||||
LPAD_CLICK,
|
|
||||||
RPAD_TOUCH,
|
|
||||||
RPAD_CLICK,
|
|
||||||
REAR_LEFT_UPPER,
|
|
||||||
REAR_LEFT_LOWER,
|
|
||||||
REAR_RIGHT_UPPER,
|
|
||||||
REAR_RIGHT_LOWER,
|
|
||||||
STEAM_GUIDE,
|
|
||||||
STEAM_QUICK_MENU,
|
|
||||||
}
|
|
||||||
export enum NavEntryPositionPreferences {
|
|
||||||
/**
|
|
||||||
* Always give focus to the first child element.
|
|
||||||
*/
|
|
||||||
FIRST,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Always give focus to the last child element.
|
|
||||||
*/
|
|
||||||
LAST,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Give focus to the child element that would maintain the flow in the X axis.
|
|
||||||
*
|
|
||||||
* Imagine you have a calculator window with 9 standard buttons.
|
|
||||||
* You have 3 rows of buttons, with 3 buttons per row.
|
|
||||||
* If you select button with number 8 and navigate down, the buttons
|
|
||||||
* will be navigated in the following order 8->5->3.
|
|
||||||
* The flow is maintained for the X axis while you're navigating the Y axis.
|
|
||||||
*/
|
|
||||||
MAINTAIN_X,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Give focus to the child element that would maintain the flow in the Y axis.
|
|
||||||
*
|
|
||||||
* Imagine you have a calculator window with 9 standard buttons.
|
|
||||||
* You have 3 columns of buttons, with 3 buttons per column.
|
|
||||||
* If you select button with number 4 and navigate right, the buttons
|
|
||||||
* will be navigated in the following order 4->5->6.
|
|
||||||
* The flow is maintained for the Y axis while you're navigating the X axis.
|
|
||||||
*/
|
|
||||||
MAINTAIN_Y,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Give focus to the first child element with `preferredFocus == true` prop.
|
|
||||||
*/
|
|
||||||
PREFERRED_CHILD,
|
|
||||||
}
|
|
||||||
export interface GamepadEventDetail {
|
|
||||||
button: number;
|
|
||||||
is_repeat?: boolean;
|
|
||||||
source: number;
|
|
||||||
}
|
|
||||||
export declare type ActionDescriptionMap = {
|
|
||||||
[key in GamepadButton]?: ReactNode;
|
|
||||||
};
|
|
||||||
export declare type GamepadEvent = CustomEvent<GamepadEventDetail>;
|
|
||||||
export interface FooterLegendProps {
|
|
||||||
/**
|
|
||||||
* Navigation entry strategy to be used when gaining focus during navigation.
|
|
||||||
*
|
|
||||||
* This is meant to be used on a parent container that has children. Once the
|
|
||||||
* container (e.g. Focusable) is navigated to and has children in it, the children
|
|
||||||
* is then navigated to (focused) using the provided strategy.
|
|
||||||
*
|
|
||||||
* If no strategy is provided, it seems that the `NavEntryPositionPreferences.FIRST`
|
|
||||||
* is used initialy, but for the next time the parent remembers previously focused
|
|
||||||
* child and focused back on it instead.
|
|
||||||
*/
|
|
||||||
navEntryPreferPosition?: NavEntryPositionPreferences;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mark the element as the preferred child (to be focused) whenever the parent uses the
|
|
||||||
* `NavEntryPositionPreferences.PREFERRED_CHILD` navigation strategy.
|
|
||||||
*/
|
|
||||||
preferredFocus?: boolean;
|
|
||||||
|
|
||||||
actionDescriptionMap?: ActionDescriptionMap;
|
|
||||||
onOKActionDescription?: ReactNode;
|
|
||||||
onCancelActionDescription?: ReactNode;
|
|
||||||
onSecondaryActionDescription?: ReactNode;
|
|
||||||
onOptionsActionDescription?: ReactNode;
|
|
||||||
onMenuActionDescription?: ReactNode;
|
|
||||||
onButtonDown?: (evt: GamepadEvent) => void;
|
|
||||||
onButtonUp?: (evt: GamepadEvent) => void;
|
|
||||||
onOKButton?: (evt: GamepadEvent) => void;
|
|
||||||
onCancelButton?: (evt: GamepadEvent) => void;
|
|
||||||
onSecondaryButton?: (evt: GamepadEvent) => void;
|
|
||||||
onOptionsButton?: (evt: GamepadEvent) => void;
|
|
||||||
onGamepadDirection?: (evt: GamepadEvent) => void;
|
|
||||||
onGamepadFocus?: (evt: GamepadEvent) => void;
|
|
||||||
onGamepadBlur?: (evt: GamepadEvent) => void;
|
|
||||||
onMenuButton?: (evt: GamepadEvent) => void;
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
import { ReactNode } from 'react';
|
|
||||||
|
|
||||||
export interface ItemProps {
|
|
||||||
label?: ReactNode;
|
|
||||||
description?: ReactNode;
|
|
||||||
children?: ReactNode;
|
|
||||||
layout?: 'below' | 'inline';
|
|
||||||
icon?: ReactNode;
|
|
||||||
bottomSeparator?: 'standard' | 'thick' | 'none';
|
|
||||||
indentLevel?: number;
|
|
||||||
tooltip?: string;
|
|
||||||
highlightOnFocus?: boolean;
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
import { CSSProperties, FC } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleExport } from '../webpack';
|
|
||||||
|
|
||||||
export interface MarqueeProps {
|
|
||||||
play?: boolean;
|
|
||||||
direction?: 'left' | 'right';
|
|
||||||
speed?: number;
|
|
||||||
delay?: number;
|
|
||||||
fadeLength?: number;
|
|
||||||
center?: boolean;
|
|
||||||
resetOnPause?: boolean;
|
|
||||||
style?: CSSProperties;
|
|
||||||
className?: string;
|
|
||||||
children: React.ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const Marquee: FC<MarqueeProps> = findModuleExport(
|
|
||||||
(e: Export) => e?.toString && e.toString().includes('.Marquee') && e.toString().includes('--fade-length'),
|
|
||||||
);
|
|
||||||
@@ -1,175 +0,0 @@
|
|||||||
import { FC, ReactNode } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleByExport, findModuleDetailsByExport, findModuleExport } from '../webpack';
|
|
||||||
import { FooterLegendProps } from './FooterLegend';
|
|
||||||
|
|
||||||
interface PopupCreationOptions {
|
|
||||||
/**
|
|
||||||
* Initially hidden, make it appear with {@link ContextMenuInstance.Show}.
|
|
||||||
*/
|
|
||||||
bCreateHidden?: boolean;
|
|
||||||
|
|
||||||
bModal?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Document title.
|
|
||||||
*/
|
|
||||||
title?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Separate interface, since one of webpack module exports uses this exact object,
|
|
||||||
// so maybe it could be reused elsewhere.
|
|
||||||
interface MonitorOptions {
|
|
||||||
targetMonitor: {
|
|
||||||
flMonitorScale: number;
|
|
||||||
nScreenLeft: number;
|
|
||||||
nScreenTop: number;
|
|
||||||
nScreenWidth: number;
|
|
||||||
nScreenHeight: number;
|
|
||||||
};
|
|
||||||
flGamepadScale: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ContextMenuPositionOptions extends PopupCreationOptions, Partial<MonitorOptions> {
|
|
||||||
/**
|
|
||||||
* When {@link bForcePopup} is true, makes the window appear above everything else.
|
|
||||||
*/
|
|
||||||
bAlwaysOnTop?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disables the mouse overlay, granting the ability to click anywhere while
|
|
||||||
* the menu's active.
|
|
||||||
*/
|
|
||||||
bDisableMouseOverlay?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disables the {@link bPreferPopTop} behavior.
|
|
||||||
*/
|
|
||||||
bDisablePopTop?: boolean;
|
|
||||||
|
|
||||||
bFitToWindow?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Forces the menu to open in a separate window instead of inside the parent.
|
|
||||||
*/
|
|
||||||
bForcePopup?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Like {@link bMatchWidth}, but don't shrink below the menu's minimum width.
|
|
||||||
*/
|
|
||||||
bGrowToElementWidth?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Match the parent's exact height.
|
|
||||||
*/
|
|
||||||
bMatchHeight?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Match the parent's exact width.
|
|
||||||
*/
|
|
||||||
bMatchWidth?: boolean;
|
|
||||||
|
|
||||||
bNoFocusWhenShown?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes the menu **invisible**, instead of getting removed from the DOM.
|
|
||||||
*/
|
|
||||||
bRetainOnHide?: boolean;
|
|
||||||
|
|
||||||
bScreenCoordinates?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set to `true` to not account for the parent's width.
|
|
||||||
*/
|
|
||||||
bOverlapHorizontal?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set to `true` to not account for the parent's height.
|
|
||||||
*/
|
|
||||||
bOverlapVertical?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set to `true` to make the entire menu try to appear on the left side from
|
|
||||||
* the parent.
|
|
||||||
*/
|
|
||||||
bPreferPopLeft?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set to `true` to make the entire menu try to appear above the parent.
|
|
||||||
*/
|
|
||||||
bPreferPopTop?: boolean;
|
|
||||||
|
|
||||||
bShiftToFitWindow?: boolean;
|
|
||||||
|
|
||||||
// different window creation flags (StandaloneContextMenu vs PopupContextMenu)
|
|
||||||
bStandalone?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class name **replacement** for the container element, i.e. it replaces the
|
|
||||||
* default class.
|
|
||||||
*/
|
|
||||||
strClassName?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ContextMenuInstance {
|
|
||||||
Hide(): void;
|
|
||||||
Show(): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const showContextMenu: (
|
|
||||||
children: ReactNode,
|
|
||||||
parent?: EventTarget,
|
|
||||||
options?: ContextMenuPositionOptions,
|
|
||||||
) => ContextMenuInstance = findModuleExport(
|
|
||||||
(e: Export) =>
|
|
||||||
typeof e === 'function' &&
|
|
||||||
e.toString().includes('GetContextMenuManagerFromWindow(') &&
|
|
||||||
e.toString().includes('.CreateContextMenuInstance('),
|
|
||||||
);
|
|
||||||
|
|
||||||
export interface MenuProps extends FooterLegendProps {
|
|
||||||
label: string;
|
|
||||||
onCancel?(): void;
|
|
||||||
cancelText?: string;
|
|
||||||
children?: ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
const MenuModule = findModuleDetailsByExport((e: Export) => e?.render?.toString()?.includes('bPlayAudio:') || (e?.prototype?.OnOKButton && e?.prototype?.OnMouseEnter));
|
|
||||||
|
|
||||||
export const Menu: FC<MenuProps> =
|
|
||||||
findModuleExport((e: Export) => e?.prototype?.HideIfSubmenu && e?.prototype?.HideMenu) || // Legacy Menu
|
|
||||||
(Object.values(MenuModule?.[0] ?? {}).find((e) => e?.toString()?.includes?.(`useId`) && e?.toString()?.includes?.(`labelId`)) as FC<MenuProps>); // New Menu 6/15/2025
|
|
||||||
|
|
||||||
export interface MenuGroupProps {
|
|
||||||
label: string;
|
|
||||||
disabled?: boolean;
|
|
||||||
children?: ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
const MenuGoupModule = findModuleByExport(e => e?.prototype?.Focus && e?.prototype?.OnOKButton && e?.prototype?.render?.toString().includes?.(`"emphasis"==this.props.tone`));
|
|
||||||
export const MenuGroup: FC<MenuGroupProps> = MenuGoupModule && Object.values(MenuGoupModule).find((e: Export) => typeof e == "function" && e?.toString?.()?.includes("bInGamepadUI:"));
|
|
||||||
export interface MenuItemProps extends FooterLegendProps {
|
|
||||||
bInteractableItem?: boolean;
|
|
||||||
onClick?(evt: Event): void;
|
|
||||||
onSelected?(evt: Event): void;
|
|
||||||
onMouseEnter?(evt: MouseEvent): void;
|
|
||||||
onMoveRight?(): void;
|
|
||||||
selected?: boolean;
|
|
||||||
disabled?: boolean;
|
|
||||||
bPlayAudio?: boolean;
|
|
||||||
tone?: 'positive' | 'emphasis' | 'destructive';
|
|
||||||
children?: ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const MenuItem: FC<MenuItemProps> = MenuModule?.[1];
|
|
||||||
|
|
||||||
export const MenuSeparator: FC = findModuleExport(
|
|
||||||
(e: Export) => typeof e === 'function' && /className:.+?\.ContextMenuSeparator/.test(e.toString()),
|
|
||||||
);
|
|
||||||
|
|
||||||
/*
|
|
||||||
all().map(m => {
|
|
||||||
if (typeof m !== "object") return undefined;
|
|
||||||
for (let prop in m) { if (m[prop]?.prototype?.OK && m[prop]?.prototype?.Cancel && m[prop]?.prototype?.render) return m[prop]}
|
|
||||||
}).find(x => x)
|
|
||||||
*/
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
import { FC, ReactNode } from 'react';
|
|
||||||
|
|
||||||
import { findSP } from '../utils';
|
|
||||||
import { Export, findModule, findModuleDetailsByExport, findModuleExport } from '../webpack';
|
|
||||||
|
|
||||||
// All of the popout options + strTitle are related. Proper usage is not yet known...
|
|
||||||
export interface ShowModalProps {
|
|
||||||
browserContext?: unknown;
|
|
||||||
bForcePopOut?: boolean;
|
|
||||||
bHideActionIcons?: boolean;
|
|
||||||
bHideMainWindowForPopouts?: boolean;
|
|
||||||
bNeverPopOut?: boolean;
|
|
||||||
fnOnClose?: () => void; // Seems to be the same as "closeModal" callback, but only when the modal is a popout. Will no longer work after "Update" invocation!
|
|
||||||
popupHeight?: number;
|
|
||||||
popupWidth?: number;
|
|
||||||
promiseRenderComplete?: Promise<void>; // Invoked once the render is complete. Currently, it seems to be used as image loading success/error callback...
|
|
||||||
strTitle?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ShowModalResult {
|
|
||||||
// This method will not invoke any of the variations of "closeModal" callbacks!
|
|
||||||
Close: () => void;
|
|
||||||
|
|
||||||
// This method will replace the modal element completely and will not update the callback chains,
|
|
||||||
// meaning that "closeModal" and etc. will not automatically close the modal anymore (also "fnOnClose"
|
|
||||||
// will not be even called upon close anymore)! You have to manually call the "Close" method when, for example,
|
|
||||||
// the "closeModal" is invoked in the newly updated modal:
|
|
||||||
// <ModalRoot closeModal={() => { console.log("ABOUT TO CLOSE"); showModalRes.Close(); }} />
|
|
||||||
Update: (modal: ReactNode) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
const showModalRaw: (
|
|
||||||
modal: ReactNode,
|
|
||||||
parent?: EventTarget,
|
|
||||||
title?: string,
|
|
||||||
props?: ShowModalProps,
|
|
||||||
unknown1?: unknown,
|
|
||||||
hideActions?: { bHideActions?: boolean },
|
|
||||||
modalManager?: unknown,
|
|
||||||
) => ShowModalResult = findModuleExport(
|
|
||||||
(e: Export) =>
|
|
||||||
typeof e === 'function' && e.toString().includes('props.bDisableBackgroundDismiss') && !e?.prototype?.Cancel,
|
|
||||||
);
|
|
||||||
|
|
||||||
export const showModal = (
|
|
||||||
modal: ReactNode,
|
|
||||||
parent?: EventTarget,
|
|
||||||
props: ShowModalProps = {
|
|
||||||
strTitle: 'Decky Dialog',
|
|
||||||
bHideMainWindowForPopouts: false,
|
|
||||||
},
|
|
||||||
): ShowModalResult => {
|
|
||||||
return showModalRaw(modal, parent || findSP() || window, props.strTitle, props, undefined, {
|
|
||||||
bHideActions: props.bHideActionIcons,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export interface ModalRootProps {
|
|
||||||
children?: ReactNode;
|
|
||||||
onCancel?(): void;
|
|
||||||
closeModal?(): void;
|
|
||||||
onOK?(): void;
|
|
||||||
onEscKeypress?(): void;
|
|
||||||
className?: string;
|
|
||||||
modalClassName?: string;
|
|
||||||
bAllowFullSize?: boolean;
|
|
||||||
bDestructiveWarning?: boolean;
|
|
||||||
bDisableBackgroundDismiss?: boolean;
|
|
||||||
bHideCloseIcon?: boolean;
|
|
||||||
bOKDisabled?: boolean;
|
|
||||||
bCancelDisabled?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ConfirmModalProps extends ModalRootProps {
|
|
||||||
onMiddleButton?(): void; // setting this prop will enable the middle button
|
|
||||||
strTitle?: ReactNode;
|
|
||||||
strDescription?: ReactNode;
|
|
||||||
strOKButtonText?: ReactNode;
|
|
||||||
strCancelButtonText?: ReactNode;
|
|
||||||
strMiddleButtonText?: ReactNode;
|
|
||||||
bAlertDialog?: boolean; // This will open a modal with only OK button enabled
|
|
||||||
bMiddleDisabled?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const ConfirmModal = findModuleExport(
|
|
||||||
(e: Export) => !e?.prototype?.OK && e?.prototype?.Cancel && e?.prototype?.render,
|
|
||||||
) as FC<ConfirmModalProps>;
|
|
||||||
|
|
||||||
export const ModalRoot = Object.values(
|
|
||||||
findModule((m: any) => {
|
|
||||||
if (typeof m !== 'object') return false;
|
|
||||||
|
|
||||||
for (let prop in m) {
|
|
||||||
if (m[prop]?.m_mapModalManager && Object.values(m)?.find((x: any) => x?.type)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}) || {},
|
|
||||||
)?.find((x: any) => x?.type?.toString?.()?.includes('((function(){')) as FC<ModalRootProps>;
|
|
||||||
|
|
||||||
interface SimpleModalProps {
|
|
||||||
active?: boolean;
|
|
||||||
children: ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
const [ModalModule, _ModalPosition] = findModuleDetailsByExport((e: Export) => e?.toString().includes('.ModalPosition'), 5)
|
|
||||||
|
|
||||||
const ModalModuleProps = ModalModule ? Object.values(ModalModule) : [];
|
|
||||||
|
|
||||||
export const SimpleModal = ModalModuleProps.find((prop) => {
|
|
||||||
const string = prop?.toString();
|
|
||||||
return string?.includes('.ShowPortalModal()') && string?.includes('.OnElementReadyCallbacks.Register(');
|
|
||||||
}) as FC<SimpleModalProps>;
|
|
||||||
|
|
||||||
export const ModalPosition = _ModalPosition as FC<SimpleModalProps>;
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
import { FC, ReactNode } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleDetailsByExport } from '../webpack';
|
|
||||||
|
|
||||||
// TODO where did this go?
|
|
||||||
// export const Panel: FC<{ children?: ReactNode; }> = findModuleExport((e: Export) => {
|
|
||||||
// if (typeof mod !== 'object' || !mod.__esModule) return undefined;
|
|
||||||
// return mod.Panel;
|
|
||||||
// });
|
|
||||||
|
|
||||||
export interface PanelSectionProps {
|
|
||||||
title?: string;
|
|
||||||
spinner?: boolean;
|
|
||||||
children?: ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
const [mod, panelSection] = findModuleDetailsByExport((e: Export) => e.toString()?.includes('.PanelSection'));
|
|
||||||
|
|
||||||
export const PanelSection = panelSection as FC<PanelSectionProps>;
|
|
||||||
|
|
||||||
export interface PanelSectionRowProps {
|
|
||||||
children?: ReactNode;
|
|
||||||
}
|
|
||||||
export const PanelSectionRow = Object.values(mod).filter(
|
|
||||||
(exp: any) => !exp?.toString?.()?.includes('.PanelSection'),
|
|
||||||
)[0] as FC<PanelSectionRowProps>;
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
import { ReactNode, FC } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleExport } from '../webpack';
|
|
||||||
import { ItemProps } from './Item';
|
|
||||||
import { createPropListRegex } from '../utils';
|
|
||||||
|
|
||||||
export interface ProgressBarItemProps extends ItemProps {
|
|
||||||
indeterminate?: boolean;
|
|
||||||
nTransitionSec?: number;
|
|
||||||
nProgress?: number;
|
|
||||||
focusable?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ProgressBarProps {
|
|
||||||
indeterminate?: boolean;
|
|
||||||
nTransitionSec?: number;
|
|
||||||
nProgress?: number;
|
|
||||||
focusable?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ProgressBarWithInfoProps extends ProgressBarItemProps {
|
|
||||||
sTimeRemaining?: ReactNode;
|
|
||||||
sOperationText?: ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const ProgressBar = findModuleExport((e: Export) =>
|
|
||||||
e?.toString?.()?.includes('.ProgressBar,"standard"=='),
|
|
||||||
) as FC<ProgressBarProps>;
|
|
||||||
|
|
||||||
export const ProgressBarWithInfo = findModuleExport((e: Export) =>
|
|
||||||
e?.toString?.()?.includes('.ProgressBarFieldStatus},'),
|
|
||||||
) as FC<ProgressBarWithInfoProps>;
|
|
||||||
|
|
||||||
const progressBarItemRegex = createPropListRegex(["indeterminate", "nTransitionSec", "nProgress"]);
|
|
||||||
export const ProgressBarItem = findModuleExport((e: Export) =>
|
|
||||||
e?.toString && progressBarItemRegex.test(e.toString()),
|
|
||||||
) as FC<ProgressBarItemProps>;
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import { FC, ReactNode } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleByExport, findModuleExport } from '../webpack';
|
|
||||||
|
|
||||||
const ScrollingModule = findModuleByExport((e: Export) => e?.render?.toString?.().includes('{case"x":'));
|
|
||||||
|
|
||||||
const ScrollingModuleProps = ScrollingModule ? Object.values(ScrollingModule) : [];
|
|
||||||
|
|
||||||
export const ScrollPanel = ScrollingModuleProps.find((prop: any) =>
|
|
||||||
prop?.render?.toString?.().includes('{case"x":'),
|
|
||||||
) as FC<{ children?: ReactNode }>;
|
|
||||||
|
|
||||||
export const ScrollPanelGroup: FC<{ children?: ReactNode }> = findModuleExport((e: Export) =>
|
|
||||||
e?.render?.toString().includes('.FocusVisibleChild()),[])'),
|
|
||||||
);
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import { ReactNode, FC } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleExport } from '../webpack';
|
|
||||||
import { createPropListRegex } from '../utils';
|
|
||||||
|
|
||||||
export interface SidebarNavigationPage {
|
|
||||||
title: ReactNode;
|
|
||||||
content: ReactNode;
|
|
||||||
icon?: ReactNode;
|
|
||||||
visible?: boolean;
|
|
||||||
hideTitle?: boolean;
|
|
||||||
identifier?: string;
|
|
||||||
route?: string;
|
|
||||||
link?: string;
|
|
||||||
padding?: 'none' | 'compact';
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SidebarNavigationProps {
|
|
||||||
title?: ReactNode;
|
|
||||||
pages: (SidebarNavigationPage | 'separator')[];
|
|
||||||
showTitle?: boolean;
|
|
||||||
disableRouteReporting?: boolean;
|
|
||||||
page?: string;
|
|
||||||
onPageRequested?: (page: string) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
const sidebarNavigationRegex = createPropListRegex(["pages", "fnSetNavigateToPage", "disableRouteReporting"]);
|
|
||||||
export const SidebarNavigation = findModuleExport((e: Export) =>
|
|
||||||
e?.toString && sidebarNavigationRegex.test(e.toString()),
|
|
||||||
) as FC<SidebarNavigationProps>;
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
import { FC } from 'react';
|
|
||||||
|
|
||||||
import { CommonUIModule } from '../webpack';
|
|
||||||
import { ItemProps } from './Item';
|
|
||||||
|
|
||||||
export interface NotchLabel {
|
|
||||||
notchIndex: number;
|
|
||||||
label: string;
|
|
||||||
value?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SliderFieldProps extends ItemProps {
|
|
||||||
value: number;
|
|
||||||
min?: number;
|
|
||||||
max?: number;
|
|
||||||
step?: number;
|
|
||||||
notchCount?: number;
|
|
||||||
notchLabels?: NotchLabel[];
|
|
||||||
notchTicksVisible?: boolean;
|
|
||||||
showValue?: boolean;
|
|
||||||
resetValue?: number;
|
|
||||||
disabled?: boolean;
|
|
||||||
editableValue?: boolean;
|
|
||||||
validValues?: 'steps' | 'range' | ((value: number) => boolean);
|
|
||||||
valueSuffix?: string;
|
|
||||||
minimumDpadGranularity?: number;
|
|
||||||
onChange?(value: number): void;
|
|
||||||
className?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const SliderField = Object.values(CommonUIModule).find((mod: any) =>
|
|
||||||
// stable || beta as of oct 2 2024
|
|
||||||
mod?.toString?.()?.includes('SliderField,fallback') || mod?.toString?.()?.includes("SliderField\",")
|
|
||||||
) as FC<SliderFieldProps>;
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
import { FC, SVGAttributes } from 'react';
|
|
||||||
|
|
||||||
import { IconsModule } from '../webpack';
|
|
||||||
|
|
||||||
// TODO type this and other icons?
|
|
||||||
export const Spinner = Object.values(IconsModule)?.find(
|
|
||||||
(mod: any) => mod?.toString && /Spinner\)}\)?,.\.createElement\(\"path\",{d:\"M18 /.test(mod.toString()),
|
|
||||||
) as FC<SVGAttributes<SVGElement>>;
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
import { FC, ReactNode, SVGAttributes } from 'react';
|
|
||||||
|
|
||||||
import { Export, findModuleExport } from '../webpack';
|
|
||||||
|
|
||||||
interface SteamSpinnerProps {
|
|
||||||
children?: ReactNode;
|
|
||||||
background?: "transparent"; // defaults to black seemingly, but only "transparent" is checked against
|
|
||||||
}
|
|
||||||
|
|
||||||
export const SteamSpinner = findModuleExport(
|
|
||||||
(e: Export) => e?.toString?.()?.includes('Steam Spinner') && e?.toString?.()?.includes('src'),
|
|
||||||
) as FC<SVGAttributes<SVGElement> & SteamSpinnerProps>;
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
import { FC, ReactNode } from 'react';
|
|
||||||
import { findModuleByExport } from '../webpack';
|
|
||||||
import { FooterLegendProps } from './FooterLegend';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Individual tab objects for the Tabs component
|
|
||||||
*
|
|
||||||
* `id` ID of this tab, can be used with activeTab to auto-focus a given tab
|
|
||||||
* `title` Title shown in the header bar
|
|
||||||
* `renderTabAddon` Return a {@link ReactNode} to render it next to the tab title, i.e. the counts for each tab on the Media page
|
|
||||||
* `content` Content of the tab
|
|
||||||
* `footer` Sets up button handlers and labels
|
|
||||||
*/
|
|
||||||
export interface Tab {
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
renderTabAddon?: () => ReactNode;
|
|
||||||
content: ReactNode;
|
|
||||||
footer?: FooterLegendProps;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Props for the {@link Tabs}
|
|
||||||
*
|
|
||||||
* `tabs` array of {@link Tab}
|
|
||||||
* `activeTab` tab currently active, needs to be one of the tabs {@link Tab.id}, must be set using a `useState` in the `onShowTab` handler
|
|
||||||
* `onShowTab` Called when the active tab should change, needs to set `activeTab`. See example.
|
|
||||||
* `autoFocusContents` Whether to automatically focus the tab contents or not.
|
|
||||||
* `footer` Sets up button handlers and labels
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* const Component: FC = () => {
|
|
||||||
* const [currentTab, setCurrentTab] = useState<string>("Tab1");
|
|
||||||
*
|
|
||||||
* return (
|
|
||||||
* <Tabs
|
|
||||||
* title="Theme Manager"
|
|
||||||
* activeTab={currentTabRoute}
|
|
||||||
* onShowTab={(tabID: string) => {
|
|
||||||
* setCurrentTabRoute(tabID);
|
|
||||||
* }}
|
|
||||||
* tabs={[
|
|
||||||
* {
|
|
||||||
* title: "Tab 1",
|
|
||||||
* content: <Tab1Component />,
|
|
||||||
* id: "Tab1",
|
|
||||||
* },
|
|
||||||
* {
|
|
||||||
* title: "Tab 2",
|
|
||||||
* content: <Tab2Component />,
|
|
||||||
* id: "Tab2",
|
|
||||||
* },
|
|
||||||
* ]}
|
|
||||||
* />
|
|
||||||
* );
|
|
||||||
* };
|
|
||||||
*/
|
|
||||||
export interface TabsProps {
|
|
||||||
tabs: Tab[];
|
|
||||||
activeTab: string;
|
|
||||||
onShowTab: (tab: string) => void;
|
|
||||||
autoFocusContents?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
const tabsModule = findModuleByExport(e => e?.toString?.()?.includes(".TabRowTabs") && e?.toString?.()?.includes("activeTab:"));
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tabs component as used in the library and media tabs. See {@link TabsProps}.
|
|
||||||
*/
|
|
||||||
export const Tabs = tabsModule && Object.values(tabsModule).find((e: any) => e?.type?.toString?.()?.includes("((function()")) as FC<TabsProps>;
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import { ChangeEventHandler, HTMLAttributes, ReactNode, FC } from 'react';
|
|
||||||
|
|
||||||
import { CommonUIModule, Module } from '../webpack';
|
|
||||||
|
|
||||||
export interface TextFieldProps extends HTMLAttributes<HTMLInputElement> {
|
|
||||||
label?: ReactNode;
|
|
||||||
requiredLabel?: ReactNode;
|
|
||||||
description?: ReactNode;
|
|
||||||
disabled?: boolean;
|
|
||||||
bShowCopyAction?: boolean;
|
|
||||||
bShowClearAction?: boolean;
|
|
||||||
bAlwaysShowClearAction?: boolean;
|
|
||||||
bIsPassword?: boolean;
|
|
||||||
rangeMin?: number;
|
|
||||||
rangeMax?: number;
|
|
||||||
mustBeNumeric?: boolean;
|
|
||||||
mustBeURL?: boolean;
|
|
||||||
mustBeEmail?: boolean;
|
|
||||||
focusOnMount?: boolean;
|
|
||||||
tooltip?: string;
|
|
||||||
inlineControls?: ReactNode;
|
|
||||||
onChange?: ChangeEventHandler<HTMLInputElement>;
|
|
||||||
value?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const TextField = Object.values(CommonUIModule).find(
|
|
||||||
(mod: Module) => mod?.validateUrl && mod?.validateEmail,
|
|
||||||
) as FC<TextFieldProps>;
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
import { FC } from 'react';
|
|
||||||
|
|
||||||
import { CommonUIModule } from '../webpack';
|
|
||||||
import { ItemProps } from './Item';
|
|
||||||
|
|
||||||
export interface ToggleFieldProps extends ItemProps {
|
|
||||||
highlightOnFocus?: boolean;
|
|
||||||
checked: boolean;
|
|
||||||
disabled?: boolean;
|
|
||||||
onChange?(checked: boolean): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const ToggleField = Object.values(CommonUIModule).find((mod: any) =>
|
|
||||||
// stable || beta as of oct 2 2024
|
|
||||||
mod?.render?.toString?.()?.includes('ToggleField,fallback') || mod?.render?.toString?.()?.includes("ToggleField\",")
|
|
||||||
) as FC<ToggleFieldProps>;
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
export * from './Button';
|
|
||||||
export * from './ButtonItem';
|
|
||||||
export * from './Carousel';
|
|
||||||
export * from './ControlsList';
|
|
||||||
export * from './Dialog';
|
|
||||||
export * from './DialogCheckbox';
|
|
||||||
export * from './Dropdown';
|
|
||||||
export * from './ErrorBoundary';
|
|
||||||
export * from './Field';
|
|
||||||
export * from './Focusable';
|
|
||||||
export * from './FocusRing';
|
|
||||||
export * from './FooterLegend';
|
|
||||||
export * from './Marquee';
|
|
||||||
export * from './Menu';
|
|
||||||
export * from './Modal';
|
|
||||||
export * from './Panel';
|
|
||||||
export * from './ProgressBar';
|
|
||||||
export * from './SidebarNavigation';
|
|
||||||
export * from './SliderField';
|
|
||||||
export * from './Spinner';
|
|
||||||
export * from './SteamSpinner';
|
|
||||||
export * from './Tabs';
|
|
||||||
export * from './TextField';
|
|
||||||
export * from './Toggle';
|
|
||||||
export * from './ToggleField';
|
|
||||||
export * from './Scroll';
|
|
||||||
@@ -1,132 +0,0 @@
|
|||||||
import { CSSProperties, FC, useState } from 'react';
|
|
||||||
|
|
||||||
import { ConfirmModal, SliderField } from '../components';
|
|
||||||
import { gamepadSliderClasses } from '../utils/static-classes';
|
|
||||||
|
|
||||||
interface ColorPickerModalProps {
|
|
||||||
closeModal: () => void;
|
|
||||||
onConfirm?(HSLString: string): any;
|
|
||||||
title?: string;
|
|
||||||
defaultH?: number;
|
|
||||||
defaultS?: number;
|
|
||||||
defaultL?: number;
|
|
||||||
defaultA?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const ColorPickerModal: FC<ColorPickerModalProps> = ({
|
|
||||||
closeModal,
|
|
||||||
onConfirm = () => {},
|
|
||||||
title = 'Color Picker',
|
|
||||||
defaultH = 0,
|
|
||||||
defaultS = 100,
|
|
||||||
defaultL = 50,
|
|
||||||
defaultA = 1,
|
|
||||||
}) => {
|
|
||||||
const [H, setH] = useState<number>(defaultH);
|
|
||||||
const [S, setS] = useState<number>(defaultS);
|
|
||||||
const [L, setL] = useState<number>(defaultL);
|
|
||||||
const [A, setA] = useState<number>(defaultA);
|
|
||||||
|
|
||||||
const colorPickerCSSVars = {
|
|
||||||
'--decky-color-picker-hvalue': `${H}`,
|
|
||||||
'--decky-color-picker-svalue': `${S}%`,
|
|
||||||
'--decky-color-picker-lvalue': `${L}%`,
|
|
||||||
'--decky-color-picker-avalue': `${A}`,
|
|
||||||
} as CSSProperties;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ConfirmModal
|
|
||||||
bAllowFullSize
|
|
||||||
onCancel={closeModal}
|
|
||||||
onOK={() => {
|
|
||||||
onConfirm(`hsla(${H}, ${S}%, ${L}%, ${A})`);
|
|
||||||
closeModal();
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<style>
|
|
||||||
{`
|
|
||||||
/* This removes the cyan track color that is behind the slider head */
|
|
||||||
.ColorPicker_Container .${gamepadSliderClasses.SliderTrack} {
|
|
||||||
--left-track-color: #0000;
|
|
||||||
/* This is for compatibility with the "Colored Toggles" CSSLoader Theme*/
|
|
||||||
--colored-toggles-main-color: #0000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ColorPicker_HSlider .${gamepadSliderClasses.SliderTrack} {
|
|
||||||
background: linear-gradient(
|
|
||||||
270deg,
|
|
||||||
hsla(360, var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue)),
|
|
||||||
hsla(270, var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue)),
|
|
||||||
hsla(180, var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue)),
|
|
||||||
hsla(90, var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue)),
|
|
||||||
hsla(0, var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
.ColorPicker_SSlider .${gamepadSliderClasses.SliderTrack} {
|
|
||||||
background: linear-gradient(
|
|
||||||
90deg,
|
|
||||||
hsla(var(--decky-color-picker-hvalue), 0%, var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue)),
|
|
||||||
hsla(var(--decky-color-picker-hvalue), 100%, var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
.ColorPicker_LSlider .${gamepadSliderClasses.SliderTrack} {
|
|
||||||
background: linear-gradient(
|
|
||||||
90deg,
|
|
||||||
hsla(var(--decky-color-picker-hvalue), var(--decky-color-picker-svalue), 0%, var(--decky-color-picker-avalue)),
|
|
||||||
hsla(var(--decky-color-picker-hvalue), var(--decky-color-picker-svalue), 50%, var(--decky-color-picker-avalue)),
|
|
||||||
hsla(var(--decky-color-picker-hvalue), var(--decky-color-picker-svalue), 100%, var(--decky-color-picker-avalue))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
.ColorPicker_ASlider .${gamepadSliderClasses.SliderTrack} {
|
|
||||||
background: linear-gradient(
|
|
||||||
90deg,
|
|
||||||
hsla(var(--decky-color-picker-hvalue), var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), 0),
|
|
||||||
hsla(var(--decky-color-picker-hvalue), var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), 1)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
`}
|
|
||||||
</style>
|
|
||||||
<div
|
|
||||||
className="ColorPicker_ColorDisplayContainer"
|
|
||||||
style={{
|
|
||||||
display: 'flex',
|
|
||||||
justifyContent: 'space-between',
|
|
||||||
alignItems: 'center',
|
|
||||||
marginBottom: '1em',
|
|
||||||
// theres a large header by default on the modal, so this just pushes it up into that unused space
|
|
||||||
marginTop: '-2.5em',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<span style={{ fontSize: '1.5em' }}>
|
|
||||||
<b>{title}</b>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
backgroundColor: `hsla(${H}, ${S}%, ${L}%, ${A})`,
|
|
||||||
width: '40px',
|
|
||||||
height: '40px',
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
<div className="ColorPicker_Container" style={colorPickerCSSVars}>
|
|
||||||
<div className="ColorPicker_HSlider">
|
|
||||||
<SliderField showValue editableValue label="Hue" value={H} min={0} max={360} onChange={setH} />
|
|
||||||
</div>
|
|
||||||
<div className="ColorPicker_SSlider">
|
|
||||||
<SliderField showValue editableValue label="Saturation" value={S} min={0} max={100} onChange={setS} />
|
|
||||||
</div>
|
|
||||||
<div className="ColorPicker_LSlider">
|
|
||||||
<SliderField showValue editableValue label="Lightness" value={L} min={0} max={100} onChange={setL} />
|
|
||||||
</div>
|
|
||||||
<div className="ColorPicker_ASlider">
|
|
||||||
<SliderField showValue editableValue label="Alpha" value={A} step={0.1} min={0} max={1} onChange={setA} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</ConfirmModal>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
import { Fragment, JSXElementConstructor, ReactElement, ReactNode, useEffect, useState } from 'react';
|
|
||||||
|
|
||||||
import { Field, FieldProps, Focusable, GamepadButton } from '../components';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A ReorderableList entry of type <T>.
|
|
||||||
* @param label The name of this entry in the list.
|
|
||||||
* @param data Optional data to connect to this entry.
|
|
||||||
* @param position The position of this entry in the list.
|
|
||||||
*/
|
|
||||||
export type ReorderableEntry<T> = {
|
|
||||||
label: ReactNode;
|
|
||||||
data?: T;
|
|
||||||
position: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Properties for a ReorderableList component of type <T>.
|
|
||||||
*
|
|
||||||
* @param animate If the list should animate. @default true
|
|
||||||
*/
|
|
||||||
export type ReorderableListProps<T> = {
|
|
||||||
entries: ReorderableEntry<T>[];
|
|
||||||
onSave: (entries: ReorderableEntry<T>[]) => void;
|
|
||||||
interactables?: JSXElementConstructor<{ entry: ReorderableEntry<T> }>;
|
|
||||||
fieldProps?: FieldProps;
|
|
||||||
animate?: boolean;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A component for creating reorderable lists.
|
|
||||||
*
|
|
||||||
* See an example implementation {@linkplain https://github.com/Tormak9970/Component-Testing-Plugin/blob/main/src/testing-window/ReorderableListTest.tsx here}.
|
|
||||||
*/
|
|
||||||
export function ReorderableList<T>(props: ReorderableListProps<T>) {
|
|
||||||
if (props.animate === undefined) props.animate = true;
|
|
||||||
const [entryList, setEntryList] = useState<ReorderableEntry<T>[]>(
|
|
||||||
[...props.entries].sort((a: ReorderableEntry<T>, b: ReorderableEntry<T>) => a.position - b.position),
|
|
||||||
);
|
|
||||||
const [reorderEnabled, setReorderEnabled] = useState<boolean>(false);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setEntryList([...props.entries].sort((a: ReorderableEntry<T>, b: ReorderableEntry<T>) => a.position - b.position));
|
|
||||||
}, [props.entries]);
|
|
||||||
|
|
||||||
function toggleReorderEnabled(): void {
|
|
||||||
let newReorderValue = !reorderEnabled;
|
|
||||||
setReorderEnabled(newReorderValue);
|
|
||||||
|
|
||||||
if (!newReorderValue) {
|
|
||||||
props.onSave(entryList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveOnBackout(e: Event) {
|
|
||||||
const event = e as CustomEvent;
|
|
||||||
if (event.detail.button == GamepadButton.CANCEL && reorderEnabled) {
|
|
||||||
setReorderEnabled(!reorderEnabled);
|
|
||||||
props.onSave(entryList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Fragment>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
width: 'inherit',
|
|
||||||
height: 'inherit',
|
|
||||||
flex: '1 1 1px',
|
|
||||||
scrollPadding: '48px 0px',
|
|
||||||
display: 'flex',
|
|
||||||
flexDirection: 'column',
|
|
||||||
justifyContent: 'flex-start',
|
|
||||||
alignContent: 'stretch',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Focusable
|
|
||||||
onSecondaryButton={toggleReorderEnabled}
|
|
||||||
onSecondaryActionDescription={reorderEnabled ? 'Save Order' : 'Reorder'}
|
|
||||||
onClick={toggleReorderEnabled}
|
|
||||||
onButtonDown={saveOnBackout}
|
|
||||||
>
|
|
||||||
{entryList.map((entry: ReorderableEntry<T>) => (
|
|
||||||
<ReorderableItem
|
|
||||||
animate={props.animate!}
|
|
||||||
listData={entryList}
|
|
||||||
entryData={entry}
|
|
||||||
reorderEntryFunc={setEntryList}
|
|
||||||
reorderEnabled={reorderEnabled}
|
|
||||||
fieldProps={props.fieldProps}
|
|
||||||
>
|
|
||||||
{props.interactables ? <props.interactables entry={entry} /> : null}
|
|
||||||
</ReorderableItem>
|
|
||||||
))}
|
|
||||||
</Focusable>
|
|
||||||
</div>
|
|
||||||
</Fragment>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Properties for a ReorderableItem component of type <T>
|
|
||||||
*/
|
|
||||||
export type ReorderableListEntryProps<T> = {
|
|
||||||
fieldProps?: FieldProps;
|
|
||||||
listData: ReorderableEntry<T>[];
|
|
||||||
entryData: ReorderableEntry<T>;
|
|
||||||
reorderEntryFunc: CallableFunction;
|
|
||||||
reorderEnabled: boolean;
|
|
||||||
animate: boolean;
|
|
||||||
children: ReactElement | null;
|
|
||||||
};
|
|
||||||
|
|
||||||
function ReorderableItem<T>(props: ReorderableListEntryProps<T>) {
|
|
||||||
const [isSelected, _setIsSelected] = useState<boolean>(false);
|
|
||||||
const [isSelectedLastFrame, setIsSelectedLastFrame] = useState<boolean>(false);
|
|
||||||
const listEntries = props.listData;
|
|
||||||
|
|
||||||
function onReorder(e: Event): void {
|
|
||||||
if (!props.reorderEnabled) return;
|
|
||||||
|
|
||||||
const event = e as CustomEvent;
|
|
||||||
const currentIdx = listEntries.findIndex((entryData: ReorderableEntry<T>) => entryData === props.entryData);
|
|
||||||
const currentIdxValue = listEntries[currentIdx];
|
|
||||||
if (currentIdx < 0) return;
|
|
||||||
|
|
||||||
let targetPosition: number = -1;
|
|
||||||
if (event.detail.button == GamepadButton.DIR_DOWN) {
|
|
||||||
targetPosition = currentIdxValue.position + 1;
|
|
||||||
} else if (event.detail.button == GamepadButton.DIR_UP) {
|
|
||||||
targetPosition = currentIdxValue.position - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (targetPosition >= listEntries.length || targetPosition < 0) return;
|
|
||||||
|
|
||||||
let otherToUpdate = listEntries.find((entryData: ReorderableEntry<T>) => entryData.position === targetPosition);
|
|
||||||
if (!otherToUpdate) return;
|
|
||||||
|
|
||||||
let currentPosition = currentIdxValue.position;
|
|
||||||
|
|
||||||
currentIdxValue.position = otherToUpdate.position;
|
|
||||||
otherToUpdate.position = currentPosition;
|
|
||||||
|
|
||||||
props.reorderEntryFunc(
|
|
||||||
[...listEntries].sort((a: ReorderableEntry<T>, b: ReorderableEntry<T>) => a.position - b.position),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function setIsSelected(val: boolean) {
|
|
||||||
_setIsSelected(val);
|
|
||||||
// Wait 3 frames, then set. I have no idea why, but if you dont wait long enough it doesn't work.
|
|
||||||
for (let i = 0; i < 3; i++) await new Promise((res) => requestAnimationFrame(res));
|
|
||||||
setIsSelectedLastFrame(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
style={
|
|
||||||
props.animate
|
|
||||||
? {
|
|
||||||
transition:
|
|
||||||
isSelected || isSelectedLastFrame
|
|
||||||
? ''
|
|
||||||
: 'transform 0.3s cubic-bezier(0.25, 1, 0.5, 1), opacity 0.3s cubic-bezier(0.25, 1, 0.5, 1)', // easeOutQuart https://easings.net/#easeOutQuart
|
|
||||||
transform: !props.reorderEnabled || isSelected ? 'scale(1)' : 'scale(0.9)',
|
|
||||||
opacity: !props.reorderEnabled || isSelected ? 1 : 0.7,
|
|
||||||
}
|
|
||||||
: {}
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<Field
|
|
||||||
label={props.entryData.label}
|
|
||||||
{...props.fieldProps}
|
|
||||||
focusable={!props.children}
|
|
||||||
onButtonDown={onReorder}
|
|
||||||
onGamepadBlur={() => setIsSelected(false)}
|
|
||||||
onGamepadFocus={() => setIsSelected(true)}
|
|
||||||
>
|
|
||||||
<Focusable style={{ display: 'flex', width: '100%', position: 'relative' }}>{props.children}</Focusable>
|
|
||||||
</Field>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
import { useEffect } from 'react';
|
|
||||||
import { FC, ImgHTMLAttributes, useState } from 'react';
|
|
||||||
|
|
||||||
import { Spinner } from '../components';
|
|
||||||
|
|
||||||
interface SuspensefulImageProps extends ImgHTMLAttributes<HTMLImageElement> {
|
|
||||||
suspenseWidth?: string | number;
|
|
||||||
suspenseHeight?: string | number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const SuspensefulImage: FC<SuspensefulImageProps> = (props) => {
|
|
||||||
const [loading, setLoading] = useState(true);
|
|
||||||
const [error, setError] = useState(false);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setLoading(true);
|
|
||||||
setError(false);
|
|
||||||
const img = new Image();
|
|
||||||
img.src = props.src || '';
|
|
||||||
img.addEventListener('load', () => {
|
|
||||||
setLoading(false);
|
|
||||||
});
|
|
||||||
img.addEventListener('error', () => {
|
|
||||||
setError(true);
|
|
||||||
});
|
|
||||||
}, [props.src]);
|
|
||||||
|
|
||||||
return loading ? (
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
width: props.suspenseWidth || props.style?.width,
|
|
||||||
height: props.suspenseHeight || props.style?.height,
|
|
||||||
background: 'rgba(255, 255, 255, 0.2)',
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'center',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{error ? 'Missing image' : <Spinner style={{ height: '48px' }} />}
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<img {...props} />
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
export * from './SuspensefulImage';
|
|
||||||
export * from './ColorPickerModal';
|
|
||||||
export * from './ReorderableList';
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export * from './useQuickAccessVisible';
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
import { useEffect, useState } from 'react';
|
|
||||||
|
|
||||||
import { getGamepadNavigationTrees } from '../utils';
|
|
||||||
|
|
||||||
function getQuickAccessWindow(): Window | null {
|
|
||||||
const navTrees = getGamepadNavigationTrees();
|
|
||||||
return (
|
|
||||||
navTrees.find((tree: any) => tree?.id === 'QuickAccess-NA')?.m_Root?.m_element?.ownerDocument.defaultView ?? null
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns state indicating the visibility of quick access menu.
|
|
||||||
*
|
|
||||||
* @deprecated moved to @decky/api
|
|
||||||
*
|
|
||||||
* @returns `true` if quick access menu is visible and `false` otherwise.
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* import { FC, useEffect } from "react";
|
|
||||||
* import { useQuickAccessVisible } from "@decky/ui";
|
|
||||||
*
|
|
||||||
* export const PluginPanelView: FC<{}> = ({ }) => {
|
|
||||||
* const isVisible = useQuickAccessVisible();
|
|
||||||
*
|
|
||||||
* useEffect(() => {
|
|
||||||
* if (!isVisible) {
|
|
||||||
* return;
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* const interval = setInterval(() => console.log("Hello world!"), 1000);
|
|
||||||
* return () => {
|
|
||||||
* clearInterval(interval);
|
|
||||||
* }
|
|
||||||
* }, [isVisible])
|
|
||||||
*
|
|
||||||
* return (
|
|
||||||
* <div>
|
|
||||||
* {isVisible ? "VISIBLE" : "INVISIBLE"}
|
|
||||||
* </div>
|
|
||||||
* );
|
|
||||||
* };
|
|
||||||
*/
|
|
||||||
export function useQuickAccessVisible(): boolean {
|
|
||||||
// By default we say that document is not hidden, unless we know otherwise.
|
|
||||||
// This would cover the cases when Valve breaks something and the quick access window
|
|
||||||
// cannot be accessed anymore - the plugins that use this would continue working somewhat.
|
|
||||||
const [isHidden, setIsHidden] = useState(getQuickAccessWindow()?.document.hidden ?? false);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const quickAccessWindow = getQuickAccessWindow();
|
|
||||||
if (quickAccessWindow === null) {
|
|
||||||
console.error('Could not get window of QuickAccess menu!');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const onVisibilityChange = () => setIsHidden(quickAccessWindow.document.hidden);
|
|
||||||
quickAccessWindow.addEventListener('visibilitychange', onVisibilityChange);
|
|
||||||
return () => {
|
|
||||||
quickAccessWindow.removeEventListener('visibilitychange', onVisibilityChange);
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return !isHidden;
|
|
||||||
}
|
|
||||||
29
src/deck-components/Button.tsx
Normal file
29
src/deck-components/Button.tsx
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { FC } from 'react';
|
||||||
|
|
||||||
|
import { CommonUIModule } from '../webpack';
|
||||||
|
|
||||||
|
interface ButtonProps {
|
||||||
|
className?: string;
|
||||||
|
noFocusRing?: boolean;
|
||||||
|
disabled?: boolean;
|
||||||
|
onClick?(e: MouseEvent): void;
|
||||||
|
onPointerDown?(e: PointerEvent): void;
|
||||||
|
onPointerUp?(e: PointerEvent): void;
|
||||||
|
onPointerCancel?(e: PointerEvent): void;
|
||||||
|
onMouseDown?(e: PointerEvent): void;
|
||||||
|
onMouseUp?(e: MouseEvent): void;
|
||||||
|
onTouchStart?(e: TouchEvent): void;
|
||||||
|
onTouchEnd?(e: TouchEvent): void;
|
||||||
|
onTouchCancel?(e: TouchEvent): void;
|
||||||
|
onSubmit?(e: SubmitEvent): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const DialogButton = Object.values(CommonUIModule).find(
|
||||||
|
(mod: any) =>
|
||||||
|
mod?.render?.toString()?.includes('Object.assign({type:"button"') &&
|
||||||
|
mod?.render?.toString()?.includes('DialogButton'),
|
||||||
|
) as any;
|
||||||
|
|
||||||
|
// Button isn't exported, so call DialogButton to grab it
|
||||||
|
|
||||||
|
export const Button = DialogButton!.render({}).type as FC<ButtonProps>; // its actually a forwarded ref but that doesn't really matter in usage
|
||||||
17
src/deck-components/ButtonItem.tsx
Normal file
17
src/deck-components/ButtonItem.tsx
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { FC } from 'react';
|
||||||
|
|
||||||
|
import { CommonUIModule } from '../webpack';
|
||||||
|
|
||||||
|
interface ButtonItemProps {
|
||||||
|
label?: string;
|
||||||
|
description?: string;
|
||||||
|
layout?: 'below';
|
||||||
|
icon?: JSX.Element;
|
||||||
|
onClick?(e: MouseEvent): void;
|
||||||
|
disabled?: boolean;
|
||||||
|
bottomSeparator?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ButtonItem = Object.values(CommonUIModule).find((mod: any) =>
|
||||||
|
mod?.render?.toString()?.includes('childrenContainerWidth:"min"'),
|
||||||
|
) as FC<ButtonItemProps>;
|
||||||
40
src/deck-components/Menu.tsx
Normal file
40
src/deck-components/Menu.tsx
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import { FC } from 'react';
|
||||||
|
|
||||||
|
import { findModuleChild } from '../webpack';
|
||||||
|
|
||||||
|
interface MenuProps {
|
||||||
|
label: string;
|
||||||
|
onCancel?(): void;
|
||||||
|
cancelText?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Menu: FC<MenuProps> = findModuleChild((m) => {
|
||||||
|
if (typeof m !== 'object') return undefined;
|
||||||
|
|
||||||
|
for (let prop in m) {
|
||||||
|
if (m[prop]?.prototype?.HideIfSubmenu && m[prop]?.prototype?.HideMenu) {
|
||||||
|
return m[prop];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
interface MenuItemProps {
|
||||||
|
onSelected?(): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const MenuItem: FC<MenuItemProps> = findModuleChild((m) => {
|
||||||
|
if (typeof m !== 'object') return undefined;
|
||||||
|
|
||||||
|
for (let prop in m) {
|
||||||
|
if (m[prop]?.prototype?.OnOKButton && m[prop]?.prototype?.OnMouseEnter) {
|
||||||
|
return m[prop];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
all().map(m => {
|
||||||
|
if (typeof m !== "object") return undefined;
|
||||||
|
for (let prop in m) { if (m[prop]?.prototype?.OK && m[prop]?.prototype?.Cancel && m[prop]?.prototype?.render) return m[prop]}
|
||||||
|
}).find(x => x)
|
||||||
|
*/
|
||||||
12
src/deck-components/Modal.tsx
Normal file
12
src/deck-components/Modal.tsx
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { ReactNode } from 'react';
|
||||||
|
|
||||||
|
import { findModuleChild } from '../webpack';
|
||||||
|
|
||||||
|
export const showModal: (children: ReactNode, parent: EventTarget) => void = findModuleChild((m) => {
|
||||||
|
if (typeof m !== 'object') return undefined;
|
||||||
|
for (let prop in m) {
|
||||||
|
if (typeof m[prop] === 'function' && m[prop].toString().includes('stopPropagation))')) {
|
||||||
|
return m[prop];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
23
src/deck-components/Panel.tsx
Normal file
23
src/deck-components/Panel.tsx
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import { FC } from 'react';
|
||||||
|
|
||||||
|
import { findModuleChild } from '../webpack';
|
||||||
|
|
||||||
|
interface PanelSectionProps {
|
||||||
|
title?: string;
|
||||||
|
spinner?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const [panelSection, mod] = findModuleChild((mod: any) => {
|
||||||
|
for (let prop in mod) {
|
||||||
|
if (mod[prop]?.toString()?.includes('.PanelSection')) {
|
||||||
|
return [mod[prop], mod];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
|
export const PanelSection = panelSection as FC<PanelSectionProps>;
|
||||||
|
|
||||||
|
export const PanelSectionRow = Object.values(mod).filter(
|
||||||
|
(exp: any) => !exp?.toString()?.includes('.PanelSection'),
|
||||||
|
)[0] as FC;
|
||||||
26
src/deck-components/Slider.tsx
Normal file
26
src/deck-components/Slider.tsx
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import { FC } from 'react';
|
||||||
|
|
||||||
|
import { CommonUIModule } from '../webpack';
|
||||||
|
|
||||||
|
interface NotchLabel {
|
||||||
|
notchIndex: number;
|
||||||
|
label: string;
|
||||||
|
value: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SliderProps {
|
||||||
|
label?: string;
|
||||||
|
value: number;
|
||||||
|
layout?: 'below';
|
||||||
|
icon?: JSX.Element;
|
||||||
|
min?: number;
|
||||||
|
max?: number;
|
||||||
|
step?: number;
|
||||||
|
notchCount?: number;
|
||||||
|
notchLabels?: NotchLabel[];
|
||||||
|
onChange?(value: number): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Slider = Object.values(CommonUIModule).find((mod: any) =>
|
||||||
|
mod?.render?.toString()?.includes('SliderField,fallback'),
|
||||||
|
) as FC<SliderProps>;
|
||||||
16
src/deck-components/Spinner.tsx
Normal file
16
src/deck-components/Spinner.tsx
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { FC } from 'react';
|
||||||
|
|
||||||
|
import { IconsModule } from '../webpack';
|
||||||
|
|
||||||
|
// interface ButtonProps {
|
||||||
|
// label?: string;
|
||||||
|
// description?: string;
|
||||||
|
// layout?: 'below';
|
||||||
|
// onClick?(e: MouseEvent): void;
|
||||||
|
// disabled?: boolean;
|
||||||
|
// bottomSeparator?: boolean;
|
||||||
|
// }
|
||||||
|
|
||||||
|
export const Spinner = Object.values(IconsModule).find((mod: any) =>
|
||||||
|
mod?.toString && /Spinner\)}\),.\.createElement\(\"path\",{d:\"M18 /.test(mod.toString())
|
||||||
|
) as FC<{}>;
|
||||||
@@ -2,13 +2,15 @@ import { FC } from 'react';
|
|||||||
|
|
||||||
import { CommonUIModule } from '../webpack';
|
import { CommonUIModule } from '../webpack';
|
||||||
|
|
||||||
export interface ToggleProps {
|
interface ToggleProps {
|
||||||
value: boolean;
|
label?: string;
|
||||||
|
description?: string;
|
||||||
|
checked: boolean;
|
||||||
|
icon?: JSX.Element;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
onChange?(checked: boolean): void;
|
onChange?(checked: boolean): void;
|
||||||
navRef?: any; // TODO figure out what this is
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Toggle = Object.values(CommonUIModule).find((mod: any) =>
|
export const Toggle = Object.values(CommonUIModule).find((mod: any) =>
|
||||||
mod?.render?.toString?.()?.includes('.ToggleOff)'),
|
mod?.render?.toString()?.includes('ToggleField,fallback'),
|
||||||
) as FC<ToggleProps>;
|
) as FC<ToggleProps>;
|
||||||
9
src/deck-components/index.ts
Normal file
9
src/deck-components/index.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
export * from './Button';
|
||||||
|
export * from './ButtonItem';
|
||||||
|
export * from './Menu';
|
||||||
|
export * from './Modal';
|
||||||
|
export * from './Panel';
|
||||||
|
export * from './Slider';
|
||||||
|
export * from './Spinner';
|
||||||
|
export * from './static-classes';
|
||||||
|
export * from './Toggle';
|
||||||
72
src/deck-components/static-classes.ts
Normal file
72
src/deck-components/static-classes.ts
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
import { findModuleChild } from '../webpack';
|
||||||
|
|
||||||
|
type StaticClasses = Record<
|
||||||
|
| 'ActiveTab'
|
||||||
|
| 'AllTabContents'
|
||||||
|
| 'BatteryDetailsLabels'
|
||||||
|
| 'BatteryIcon'
|
||||||
|
| 'BatteryPercentageLabel'
|
||||||
|
| 'BatteryProjectedLabel'
|
||||||
|
| 'BatteryProjectedValue'
|
||||||
|
| 'BatterySectionContainer'
|
||||||
|
| 'Blocked'
|
||||||
|
| 'ComingSoon'
|
||||||
|
| 'Container'
|
||||||
|
| 'ContentTransition'
|
||||||
|
| 'Down'
|
||||||
|
| 'EmptyNotifications'
|
||||||
|
| 'Enter'
|
||||||
|
| 'EnterActive'
|
||||||
|
| 'Exit'
|
||||||
|
| 'ExitActive'
|
||||||
|
| 'FooterBoxShadow'
|
||||||
|
| 'FriendsListTabPanel'
|
||||||
|
| 'FriendsTitle'
|
||||||
|
| 'FullHeight'
|
||||||
|
| 'HeaderAndFooterVisible'
|
||||||
|
| 'HeaderContainer'
|
||||||
|
| 'ItemFocusAnim-darkGrey'
|
||||||
|
| 'ItemFocusAnim-darkerGrey'
|
||||||
|
| 'ItemFocusAnim-darkerGrey-nocolor'
|
||||||
|
| 'ItemFocusAnim-green'
|
||||||
|
| 'ItemFocusAnim-grey'
|
||||||
|
| 'ItemFocusAnimBorder-darkGrey'
|
||||||
|
| 'KeyboardButton'
|
||||||
|
| 'Label'
|
||||||
|
| 'LowBattery'
|
||||||
|
| 'LowBatteryGauge'
|
||||||
|
| 'Menu'
|
||||||
|
| 'Open'
|
||||||
|
| 'PanelExitAnchor'
|
||||||
|
| 'PanelOuterNav'
|
||||||
|
| 'PanelSection'
|
||||||
|
| 'PanelSectionRow'
|
||||||
|
| 'PanelSectionTitle'
|
||||||
|
| 'QuickAccessMenu'
|
||||||
|
| 'ReallyLow'
|
||||||
|
| 'Remaining'
|
||||||
|
| 'Selected'
|
||||||
|
| 'Tab'
|
||||||
|
| 'TabContentColumn'
|
||||||
|
| 'TabGroupPanel'
|
||||||
|
| 'TabPanelHidden'
|
||||||
|
| 'Tabs'
|
||||||
|
| 'Text'
|
||||||
|
| 'Title'
|
||||||
|
| 'TransitionMenuDelay'
|
||||||
|
| 'Up'
|
||||||
|
| 'ViewPlaceholder'
|
||||||
|
| 'VoiceTab'
|
||||||
|
| 'duration-app-launch'
|
||||||
|
| 'focusAnimation'
|
||||||
|
| 'hoverAnimation',
|
||||||
|
string
|
||||||
|
>;
|
||||||
|
|
||||||
|
export const staticClasses: StaticClasses = findModuleChild((mod) => {
|
||||||
|
if (typeof mod !== 'object') return false;
|
||||||
|
|
||||||
|
if (mod.TransitionMenuDelay) {
|
||||||
|
return mod;
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -1 +0,0 @@
|
|||||||
export * from './useParams';
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import { ReactRouter } from '../webpack';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the current params from ReactRouter
|
|
||||||
*
|
|
||||||
* @returns an object with the current ReactRouter params
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* import { useParams } from "decky-frontend-lib";
|
|
||||||
*
|
|
||||||
* const { appid } = useParams<{ appid: string }>()
|
|
||||||
*/
|
|
||||||
export const useParams = Object.values(ReactRouter).find((val) => /return (\w)\?\1\.params:{}/.test(`${val}`)) as <
|
|
||||||
T,
|
|
||||||
>() => T;
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
import {SteamClient} from "./steam-client";
|
|
||||||
export * from "./steam-client/shared";
|
|
||||||
|
|
||||||
declare global {
|
|
||||||
var SteamClient: SteamClient;
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
export * from './SteamClient';
|
|
||||||
export * from './stores';
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,105 +0,0 @@
|
|||||||
import { EResult, JsPbMessage, OperationResponse } from "./shared";
|
|
||||||
import {EOSType} from "./system";
|
|
||||||
|
|
||||||
export interface Auth {
|
|
||||||
/**
|
|
||||||
* @returns a boolean indicating if the operation succeeded.
|
|
||||||
*/
|
|
||||||
ClearCachedSignInPin(): Promise<boolean>;
|
|
||||||
|
|
||||||
CurrentUserHasCachedSignInPin(): Promise<boolean>;
|
|
||||||
|
|
||||||
GetLocalHostname(): Promise<string>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns a ProtoBuf message. If deserialized, returns {@link CAuthentication_DeviceDetails}.
|
|
||||||
*/
|
|
||||||
GetMachineID(): Promise<ArrayBuffer>;
|
|
||||||
|
|
||||||
GetRefreshInfo(): Promise<AuthRefreshInfo>;
|
|
||||||
|
|
||||||
GetSteamGuardData(param0: string): Promise<SteamGuardData>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* "Secured" refers to unshared.
|
|
||||||
*/
|
|
||||||
IsSecureComputer(): Promise<boolean>;
|
|
||||||
|
|
||||||
SetCachedSignInPin(pin: string): Promise<boolean>;
|
|
||||||
|
|
||||||
SetLoginToken(refreshToken: string, accountName: string): Promise<OperationResponse>;
|
|
||||||
|
|
||||||
SetSteamGuardData(accountName: string, newGuardData: string): void;
|
|
||||||
|
|
||||||
StartSignInFromCache(accountName: string, offlineMode: boolean): Promise<OperationResponse | void>;
|
|
||||||
|
|
||||||
UserHasCachedSignInPin(accountName: string): Promise<boolean>;
|
|
||||||
|
|
||||||
ValidateCachedSignInPin(accountName: string, pin: string): Promise<boolean>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface AuthRefreshInfo {
|
|
||||||
reason: number;
|
|
||||||
account_name: string;
|
|
||||||
login_id_token: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SteamGuardData {
|
|
||||||
data: string;
|
|
||||||
eresult: EResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* `deserializeBinary` argument:
|
|
||||||
* ```
|
|
||||||
* [
|
|
||||||
* await SteamClient.System.GetOSType(),
|
|
||||||
* await SteamClient.Auth.GetLocalHostname(),
|
|
||||||
* await SteamClient.Auth.GetMachineID(),
|
|
||||||
* ];
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
export interface CAuthentication_DeviceDetails extends JsPbMessage {
|
|
||||||
client_count(): number | undefined;
|
|
||||||
|
|
||||||
device_friendly_name(): string | undefined;
|
|
||||||
|
|
||||||
gaming_device_type(): EGamingDeviceType | undefined;
|
|
||||||
|
|
||||||
machine_id(): Uint8Array | string;
|
|
||||||
|
|
||||||
os_type(): EOSType | undefined;
|
|
||||||
|
|
||||||
platform_type(): EAuthTokenPlatformType | undefined;
|
|
||||||
|
|
||||||
set_client_count(): any;
|
|
||||||
|
|
||||||
set_device_friendly_name(): any;
|
|
||||||
|
|
||||||
set_gaming_device_type(): any;
|
|
||||||
|
|
||||||
set_machine_id(): any;
|
|
||||||
|
|
||||||
set_os_type(): any;
|
|
||||||
|
|
||||||
set_platform_type(): any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EAuthTokenPlatformType {
|
|
||||||
Unknown,
|
|
||||||
SteamClient,
|
|
||||||
WebBrowser,
|
|
||||||
MobileApp,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EGamingDeviceType {
|
|
||||||
Unknown,
|
|
||||||
StandardPC,
|
|
||||||
Console = 256,
|
|
||||||
PS3 = 272,
|
|
||||||
Steambox = 288,
|
|
||||||
Tesla = 320,
|
|
||||||
Handheld = 512,
|
|
||||||
Phone = 528,
|
|
||||||
SteamDeck = 544,
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
import { EResult, Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
export interface Broadcast {
|
|
||||||
/**
|
|
||||||
* Approves a viewer request for the broadcast.
|
|
||||||
* @param steamId64 The SteamID64 of the user whose request is to be approved.
|
|
||||||
*/
|
|
||||||
ApproveViewerRequest(steamId64: string, param1: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invites a user identified by their SteamID64 to watch the broadcast.
|
|
||||||
* @param steamId64 The SteamID64 of the user to invite.
|
|
||||||
*/
|
|
||||||
InviteToWatch(steamId64: string): Promise<EResult>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback to be called when the broadcast status changes.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForBroadcastStatus(callback: (status: BroadcastStatus) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback to be called when viewer requests are received.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForViewerRequests(
|
|
||||||
callback: (viewerFriendCode: number, param1: number, param2: number) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rejects a viewer request for the broadcast.
|
|
||||||
* @param steamId64 The SteamID64 of the user whose request is to be rejected.
|
|
||||||
*/
|
|
||||||
RejectViewerRequest(steamId64: string, param1: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops the broadcast.
|
|
||||||
*/
|
|
||||||
StopBroadcasting(): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface BroadcastStatus {
|
|
||||||
broadcastid: string;
|
|
||||||
nViewers: number;
|
|
||||||
nRequests: number;
|
|
||||||
bIsBroadcasting: boolean;
|
|
||||||
bIsRecordingDesktop: boolean;
|
|
||||||
eBroadcastReady: EResult;
|
|
||||||
bBroadcastCapable: boolean;
|
|
||||||
bMicrophoneEnabled: boolean;
|
|
||||||
bMicrophoneActive: boolean;
|
|
||||||
nCurrentFPS: number;
|
|
||||||
nUploadKbps: number;
|
|
||||||
}
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
export interface Browser {
|
|
||||||
AddWordToDictionary(word: string): void;
|
|
||||||
|
|
||||||
ClearAllBrowsingData(): void;
|
|
||||||
|
|
||||||
ClearHistory(): void;
|
|
||||||
|
|
||||||
CloseDevTools(): void;
|
|
||||||
|
|
||||||
GetBrowserID(): Promise<number>;
|
|
||||||
|
|
||||||
GetSpellingSuggestions(word: string): string[];
|
|
||||||
|
|
||||||
GetSteamBrowserID(): Promise<number>; // 16-bit unsigned integer?
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hides the mouse cursor until input.
|
|
||||||
*/
|
|
||||||
HideCursorUntilMouseEvent(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* yup that's right, clientY and clientX are reversed
|
|
||||||
*/
|
|
||||||
InspectElement(clientY: number, clientX: number): void;
|
|
||||||
|
|
||||||
NotifyUserActivation(): void;
|
|
||||||
|
|
||||||
OpenDevTools(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pastes the clipboard contents.
|
|
||||||
*/
|
|
||||||
Paste(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @note Not available on a created BrowserView.
|
|
||||||
* @todo unconfirmed
|
|
||||||
*/
|
|
||||||
RegisterForGestureEvents(callback: (gesture: TouchGesture) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @note Not available on a created BrowserView.
|
|
||||||
*/
|
|
||||||
RegisterForOpenNewTab: Unregisterable;
|
|
||||||
|
|
||||||
ReplaceMisspelling(param0: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Restarts the Steam JS context.
|
|
||||||
*/
|
|
||||||
RestartJSContext(): void;
|
|
||||||
|
|
||||||
SetBackgroundThrottlingDisabled(value: boolean): void;
|
|
||||||
|
|
||||||
SetPendingFilePath(path: string): Promise<boolean>;
|
|
||||||
|
|
||||||
SetShouldExitSteamOnBrowserClosed(value: boolean): Promise<void>;
|
|
||||||
|
|
||||||
SetTouchGesturesToCancel(gestures: ETouchGesture[]): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prompts and downloads a file.
|
|
||||||
* @param url The URL of the file to download.
|
|
||||||
*/
|
|
||||||
StartDownload(url: string): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TouchGesture {
|
|
||||||
eTouchGesture: ETouchGesture;
|
|
||||||
x: number;
|
|
||||||
y: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum ETouchGesture {
|
|
||||||
None,
|
|
||||||
Touch,
|
|
||||||
Tap,
|
|
||||||
DoubleTap,
|
|
||||||
ShortPress,
|
|
||||||
LongPress,
|
|
||||||
LongTap,
|
|
||||||
TwoFingerTap,
|
|
||||||
TapCancelled,
|
|
||||||
PinchBegin,
|
|
||||||
PinchUpdate,
|
|
||||||
PinchEnd,
|
|
||||||
FlingStart,
|
|
||||||
FlingCancelled,
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import { BrowserContext } from "./shared";
|
|
||||||
|
|
||||||
export interface ClientNotifications {
|
|
||||||
/**
|
|
||||||
* Displays a Steam notification.
|
|
||||||
* @param notification Notification type.
|
|
||||||
* @param options Stringified object of {@link SteamNotificationOptions}.
|
|
||||||
* @param callback
|
|
||||||
*/
|
|
||||||
DisplayClientNotification(
|
|
||||||
notification: EClientUINotificationType,
|
|
||||||
options: string,
|
|
||||||
callback: (context: BrowserContext) => void,
|
|
||||||
): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param notificationId The ID of the notification to handle.
|
|
||||||
* @param handleAction `true` to execute the callback function associated with the notification.
|
|
||||||
*/
|
|
||||||
OnRespondToClientNotification(notificationId: number, handleAction: boolean): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SteamNotificationOptions {
|
|
||||||
body: string;
|
|
||||||
chatroomgroupid?: number;
|
|
||||||
chatroomid?: number;
|
|
||||||
icon?: string;
|
|
||||||
state: string;
|
|
||||||
/** A Steam64 ID. */
|
|
||||||
steamid: string;
|
|
||||||
tag?: string;
|
|
||||||
title?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EClientUINotificationType {
|
|
||||||
GroupChatMessage = 1,
|
|
||||||
FriendChatMessage,
|
|
||||||
FriendPersonaState,
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
export interface Cloud {
|
|
||||||
/**
|
|
||||||
* Resolves a synchronization conflict for an app in the cloud.
|
|
||||||
* @param appId The ID of the app with the sync conflict.
|
|
||||||
* @param keepLocal Whether to keep the local version during conflict resolution.
|
|
||||||
*/
|
|
||||||
ResolveAppSyncConflict(appId: number, keepLocal: boolean): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retries syncing an app with the cloud.
|
|
||||||
* @param appId The ID of the app to retry syncing.
|
|
||||||
*/
|
|
||||||
RetryAppSync(appId: number): void;
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
export interface CommunityItems {
|
|
||||||
/*
|
|
||||||
DownloadMovie(e) {
|
|
||||||
return (0, o.mG)(this, void 0, void 0, (function* () {
|
|
||||||
if (0 != e.movie_webm_local_path.length) return !0;
|
|
||||||
let t = yield SteamClient.CommunityItems.DownloadItemAsset(e.communityitemid, w, e.movie_webm),
|
|
||||||
n = 1 == t.result;
|
|
||||||
if (n) {
|
|
||||||
e.movie_webm_local_path = t.path;
|
|
||||||
let n = [];
|
|
||||||
this.m_startupMovies.forEach((t => {
|
|
||||||
t.movie_webm == e.movie_webm ? n.push(e) : n.push(t)
|
|
||||||
})), this.m_startupMovies = n
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
DownloadItemAsset(communityItemId: string, param1: any, param2: string): any;
|
|
||||||
|
|
||||||
GetItemAssetPath(communityItemId: string, param1: any, param2: string): any;
|
|
||||||
|
|
||||||
RemoveDownloadedItemAsset(communityItemId: string, param1: any, param2: string): any;
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the console functionality for executing commands and handling spew output.
|
|
||||||
*/
|
|
||||||
export interface Console {
|
|
||||||
/**
|
|
||||||
* Executes a console command.
|
|
||||||
* @param command The command to execute in the console.
|
|
||||||
*/
|
|
||||||
ExecCommand(command: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves autocomplete suggestions for a given console command.
|
|
||||||
* @param command The console command to provide autocomplete suggestions for.
|
|
||||||
* @returns an array of autocomplete suggestions.
|
|
||||||
*/
|
|
||||||
GetAutocompleteSuggestions(command: string): Promise<string[]>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to receive spew output.
|
|
||||||
* @param callback The callback function that will receive spew output.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForSpewOutput(callback: (output: SpewOutput) => void): Unregisterable;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type SpewType_t = "assert" | "error" | "warning" | "info" | "input";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents spew output information.
|
|
||||||
*/
|
|
||||||
export interface SpewOutput {
|
|
||||||
/**
|
|
||||||
* The content of the spew output.
|
|
||||||
*/
|
|
||||||
spew: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The type or category of the spew output.
|
|
||||||
*/
|
|
||||||
spew_type: SpewType_t;
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
export interface Customization {
|
|
||||||
GenerateLocalStartupMoviesThumbnails(param0: number): Promise<number>;
|
|
||||||
|
|
||||||
//param0: "startupmovies"
|
|
||||||
GetDownloadedStartupMovies(param0: string): Promise<StartupMovie[]>;
|
|
||||||
|
|
||||||
GetLocalStartupMovies(): Promise<StartupMovie[]>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StartupMovie {
|
|
||||||
strMovieURL: string;
|
|
||||||
}
|
|
||||||
@@ -1,175 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
import {EAppUpdateError} from "./App";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents functions related to managing downloads in Steam.
|
|
||||||
*/
|
|
||||||
export interface Downloads {
|
|
||||||
/**
|
|
||||||
* Enables or disables all downloads in Steam.
|
|
||||||
* @param enable True to enable downloads, false to disable.
|
|
||||||
*/
|
|
||||||
EnableAllDownloads(enable: boolean): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Moves the update for a specific app down the download queue.
|
|
||||||
* @param appId The ID of the application to move.
|
|
||||||
*/
|
|
||||||
MoveAppUpdateDown(appId: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Moves the update for a specific app up the download queue.
|
|
||||||
* @param appId The ID of the application to move.
|
|
||||||
*/
|
|
||||||
MoveAppUpdateUp(appId: number): void;
|
|
||||||
|
|
||||||
PauseAppUpdate(appId: number): void; // Broken? It seems to be removing it from download list like RemoveFromDownloadList
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the update for a specific app to the download queue.
|
|
||||||
* @param appId The ID of the application to queue.
|
|
||||||
*/
|
|
||||||
QueueAppUpdate(appId: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when download items change.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForDownloadItems(
|
|
||||||
callback: (isDownloading: boolean, downloadItems: DownloadItem[]) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when download overview changes.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForDownloadOverview(callback: (overview: DownloadOverview) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the update for a specific app from the download list and places it in the unscheduled list.
|
|
||||||
* @param appId The ID of the application to remove.
|
|
||||||
*/
|
|
||||||
RemoveFromDownloadList(appId: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resumes the update for a specific app in the queue.
|
|
||||||
* @param appId The ID of the application to resume.
|
|
||||||
*/
|
|
||||||
ResumeAppUpdate(appId: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets an app to launch when its download is complete.
|
|
||||||
* @param appId The ID of the application to set.
|
|
||||||
*/
|
|
||||||
SetLaunchOnUpdateComplete(appId: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the queue index for an app in the download queue.
|
|
||||||
* @param appId The ID of the application to set the index for.
|
|
||||||
* @param index The index to set.
|
|
||||||
* @remarks Index of 0 is the current download in progress.
|
|
||||||
*/
|
|
||||||
SetQueueIndex(appId: number, index: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Suspends or resumes download throttling.
|
|
||||||
* @param suspend Whether to suspend or resume download throttling.
|
|
||||||
*/
|
|
||||||
SuspendDownloadThrottling(suspend: boolean): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Suspends or resumes local transfers.
|
|
||||||
* @param suspend Whether to suspend or resume local transfers.
|
|
||||||
*/
|
|
||||||
SuspendLanPeerContent(suspend: boolean): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface DownloadItem {
|
|
||||||
/** True if this app is currently downloading */
|
|
||||||
active: boolean;
|
|
||||||
/** Appid of app */
|
|
||||||
appid: number;
|
|
||||||
/** Current build ID for the installed app, zero if the app isn't installed yet */
|
|
||||||
buildid: number;
|
|
||||||
/** True if this update has been completed */
|
|
||||||
completed: boolean;
|
|
||||||
/** For completed downloads, time of completion, 0 if not completed */
|
|
||||||
completed_time: number;
|
|
||||||
deferred_time: number;
|
|
||||||
/** Bytes already downloaded, sum across all content types */
|
|
||||||
downloaded_bytes: number;
|
|
||||||
/** If true, game will launch when its download completes successfully */
|
|
||||||
launch_on_completion: boolean;
|
|
||||||
/** True if this app has been paused by the user or the system */
|
|
||||||
paused: boolean;
|
|
||||||
/** Queue index, -1 if the item is unqueued */
|
|
||||||
queue_index: number;
|
|
||||||
/** Build ID that this download is moving towards. This can be the same as buildid.*/
|
|
||||||
target_buildid: number;
|
|
||||||
/** Total bytes to download, sum across all content types */
|
|
||||||
total_bytes: number;
|
|
||||||
/**
|
|
||||||
* Update error description, when paused and there has been an error.
|
|
||||||
* Unlocalized and shouldn't be displayed to the user.
|
|
||||||
*/
|
|
||||||
update_error: string;
|
|
||||||
update_result: EAppUpdateError;
|
|
||||||
update_type_info: UpdateTypeInfo[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface DownloadOverview {
|
|
||||||
/** Set if we are downloading from LAN peer content server */
|
|
||||||
lan_peer_hostname: string;
|
|
||||||
/** True if all downloads are paused */
|
|
||||||
paused: boolean;
|
|
||||||
/** True if download throttling has been temporarily suspended for the current download */
|
|
||||||
throttling_suspended: boolean;
|
|
||||||
/** Appid of currently updating app */
|
|
||||||
update_appid: number;
|
|
||||||
/** Bytes already downloaded */
|
|
||||||
update_bytes_downloaded: number;
|
|
||||||
/** Bytes already processed in current phase - resets to zero when update stage changes */
|
|
||||||
update_bytes_processed: number;
|
|
||||||
/** Bytes already staged */
|
|
||||||
update_bytes_staged: number;
|
|
||||||
/** Total bytes to download */
|
|
||||||
update_bytes_to_download: number;
|
|
||||||
/** Total bytes to process in current phase - resets to zero when update stage changes */
|
|
||||||
update_bytes_to_process: number;
|
|
||||||
/** Total bytes to be staged */
|
|
||||||
update_bytes_to_stage: number;
|
|
||||||
/** Current disk throughput estimate */
|
|
||||||
update_disc_bytes_per_second: number;
|
|
||||||
/** True if the current update is an initial install */
|
|
||||||
update_is_install: boolean;
|
|
||||||
/** True if download and staging sizes are prefetch estimates */
|
|
||||||
update_is_prefetch_estimate: boolean;
|
|
||||||
/** True if the current update is for shader update */
|
|
||||||
update_is_shader: boolean;
|
|
||||||
/** True if the client is running in peer content server mode serving other peers */
|
|
||||||
update_is_upload: boolean;
|
|
||||||
/** True if the current update is for workshop content */
|
|
||||||
update_is_workshop: boolean;
|
|
||||||
/** Current bandwidth estimate for download */
|
|
||||||
update_network_bytes_per_second: number;
|
|
||||||
/** Peak bandwidth estimate for download */
|
|
||||||
update_peak_network_bytes_per_second: number;
|
|
||||||
/** Estimate of remaining time (in seconds) until download completes (not including staging) */
|
|
||||||
update_seconds_remaining: number;
|
|
||||||
/** Time current update started */
|
|
||||||
update_start_time: number;
|
|
||||||
update_state: 'None' | 'Starting' | 'Updating' | 'Stopping';
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface UpdateTypeInfo {
|
|
||||||
/** True if this content type had an update and it has completed */
|
|
||||||
completed_update: boolean;
|
|
||||||
/** Bytes already downloaded for this content type */
|
|
||||||
downloaded_bytes: number;
|
|
||||||
/** True if this content type has or had an update */
|
|
||||||
has_update: boolean;
|
|
||||||
/** Total bytes to download for this content type */
|
|
||||||
total_bytes: number;
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import { EResult, Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents functions related to Steam Family Sharing.
|
|
||||||
*/
|
|
||||||
export interface FamilySharing {
|
|
||||||
GetAvailableLenders(appId: number): Promise<Lender[]>;
|
|
||||||
|
|
||||||
RegisterForKickedBorrower: Unregisterable;
|
|
||||||
|
|
||||||
SetPreferredLender(appId: number, param1: number): Promise<EResult>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface LenderDLC {
|
|
||||||
rtStoreAssetModifyTime: number;
|
|
||||||
strHeaderFilename: string;
|
|
||||||
strName: string;
|
|
||||||
unAppID: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Lender {
|
|
||||||
/**
|
|
||||||
* A Steam64 ID.
|
|
||||||
*/
|
|
||||||
steamid: string;
|
|
||||||
appid: number;
|
|
||||||
numDlc: number;
|
|
||||||
bPreferred: boolean;
|
|
||||||
vecDLC: LenderDLC[];
|
|
||||||
}
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
import { VDFBoolean_t } from "./shared";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents friend settings and configuration.
|
|
||||||
*/
|
|
||||||
export interface FriendSettings {
|
|
||||||
/**
|
|
||||||
* Retrieves a list of enabled friend settings features.
|
|
||||||
* @returns an array of enabled friend settings features.
|
|
||||||
*/
|
|
||||||
GetEnabledFeatures(): Promise<FriendSettingsFeatureObject[]>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be notified of friend settings changes.
|
|
||||||
* @param callback The callback function to be called when friend settings change.
|
|
||||||
* @remarks The callback receives a JSON object string which may be parsed into {@link FriendSettingsChange}.
|
|
||||||
*/
|
|
||||||
RegisterForSettingsChanges(callback: (settings: string) => void): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param details Stringified {@link FriendSettingsChange}.
|
|
||||||
*/
|
|
||||||
SetFriendSettings(details: string): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EChatFlashMode {
|
|
||||||
Always,
|
|
||||||
Minimized,
|
|
||||||
Never,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface FriendSettingsFeatureObject {
|
|
||||||
feature: FriendSettingsFeature_t;
|
|
||||||
bEnabled: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type FriendSettingsFeature_t =
|
|
||||||
| "DoNotDisturb"
|
|
||||||
| "FriendsFilter"
|
|
||||||
| "LoaderWindowSynchronization"
|
|
||||||
| "NewVoiceHotKeyState"
|
|
||||||
| "NonFriendMessageHandling"
|
|
||||||
| "PersonaNotifications"
|
|
||||||
| "ServerVirtualizedMemberLists"
|
|
||||||
| "SteamworksChatAPI";
|
|
||||||
|
|
||||||
export type FriendSettingsEnabledFeatures<T> = {
|
|
||||||
[feature in FriendSettingsFeature_t]: T;
|
|
||||||
};
|
|
||||||
|
|
||||||
export interface FriendSettingsChange {
|
|
||||||
bNotifications_ShowIngame: VDFBoolean_t;
|
|
||||||
bNotifications_ShowOnline: VDFBoolean_t;
|
|
||||||
bNotifications_ShowMessage: VDFBoolean_t;
|
|
||||||
bNotifications_EventsAndAnnouncements: VDFBoolean_t;
|
|
||||||
bSounds_PlayIngame: VDFBoolean_t;
|
|
||||||
bSounds_PlayOnline: VDFBoolean_t;
|
|
||||||
bSounds_PlayMessage: VDFBoolean_t;
|
|
||||||
bSounds_EventsAndAnnouncements: VDFBoolean_t;
|
|
||||||
bAlwaysNewChatWindow: VDFBoolean_t;
|
|
||||||
bForceAlphabeticFriendSorting: VDFBoolean_t;
|
|
||||||
nChatFlashMode: EChatFlashMode;
|
|
||||||
bRememberOpenChats: VDFBoolean_t;
|
|
||||||
bCompactQuickAccess: VDFBoolean_t;
|
|
||||||
bCompactFriendsList: VDFBoolean_t;
|
|
||||||
bNotifications_ShowChatRoomNotification: VDFBoolean_t;
|
|
||||||
bSounds_PlayChatRoomNotification: VDFBoolean_t;
|
|
||||||
bHideOfflineFriendsInTagGroups: VDFBoolean_t;
|
|
||||||
bHideCategorizedFriends: VDFBoolean_t;
|
|
||||||
bCategorizeInGameFriendsByGame: VDFBoolean_t;
|
|
||||||
nChatFontSize: number;
|
|
||||||
b24HourClock: VDFBoolean_t;
|
|
||||||
bDoNotDisturbMode: VDFBoolean_t;
|
|
||||||
bDisableEmbedInlining: VDFBoolean_t;
|
|
||||||
bSignIntoFriends: VDFBoolean_t;
|
|
||||||
bDisableSpellcheck: VDFBoolean_t;
|
|
||||||
bDisableRoomEffects: VDFBoolean_t;
|
|
||||||
bAnimatedAvatars: VDFBoolean_t;
|
|
||||||
featuresEnabled: FriendSettingsEnabledFeatures<VDFBoolean_t>;
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents functions related to managing friends in Steam.
|
|
||||||
*/
|
|
||||||
export interface Friends {
|
|
||||||
/**
|
|
||||||
* Adds a user to the friend list.
|
|
||||||
* @param steamId The Steam ID of the user to add as a friend.
|
|
||||||
* @returns `true` if the friend was added successfully.
|
|
||||||
*/
|
|
||||||
AddFriend(steamId: string): Promise<boolean>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns a list of players you recently played with.
|
|
||||||
*/
|
|
||||||
GetCoplayData(): Promise<CoplayData>;
|
|
||||||
|
|
||||||
InviteUserToCurrentGame(steam64Id: string, steamIdTarget: string): Promise<boolean>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invites a user to a specific game.
|
|
||||||
* @param steamId The Steam ID of the user to invite.
|
|
||||||
* @param appId The ID of the game to invite the user to.
|
|
||||||
* @param connectString Additional parameters for the invitation.
|
|
||||||
* @returns `true` if the user was invited successfully.
|
|
||||||
*/
|
|
||||||
InviteUserToGame(steamId: string, appId: number, connectString: string): Promise<boolean>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invites a user to a specific lobby.
|
|
||||||
* @returns `true` if the user was invited successfully.
|
|
||||||
*/
|
|
||||||
InviteUserToLobby(steam64Id: string, steamIdTarget: string): Promise<boolean>;
|
|
||||||
|
|
||||||
InviteUserToRemotePlayTogetherCurrentGame(steam64Id: string): Promise<boolean>;
|
|
||||||
|
|
||||||
RegisterForMultiplayerSessionShareURLChanged(
|
|
||||||
appId: number,
|
|
||||||
callback: (param0: string, param1: string) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForVoiceChatStatus(callback: (status: VoiceChatStatus) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes a user from the friend list.
|
|
||||||
* @param steamId The Steam ID of the user to remove from the friend list.
|
|
||||||
* @returns `true` if the friend was removed successfully.
|
|
||||||
*/
|
|
||||||
RemoveFriend(steamId: string): Promise<boolean>;
|
|
||||||
|
|
||||||
ShowRemotePlayTogetherUI(): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CoplayData {
|
|
||||||
currentUsers: CoplayUser[];
|
|
||||||
recentUsers: CoplayUser[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CoplayUser {
|
|
||||||
accountid: number;
|
|
||||||
rtTimePlayed: number;
|
|
||||||
appid: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface VoiceChatStatus {
|
|
||||||
bVoiceChatActive: boolean;
|
|
||||||
bMicMuted: boolean;
|
|
||||||
bOutputMuted: boolean;
|
|
||||||
}
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
import { EResult, OperationResponse } from "./shared";
|
|
||||||
|
|
||||||
export interface GameNotes {
|
|
||||||
/**
|
|
||||||
* @returns a boolean indicating whether the operation was successful.
|
|
||||||
*/
|
|
||||||
DeleteImage(param0: string): Promise<boolean>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns a boolean indicating whether the operation was successful.
|
|
||||||
*/
|
|
||||||
DeleteNotes(param0: string): Promise<boolean>;
|
|
||||||
|
|
||||||
GetNotes(filenameForNotes: string, directoryForNoteImages: string): Promise<Notes>;
|
|
||||||
|
|
||||||
GetNotesMetadata(note: string): Promise<NoteMetadata>;
|
|
||||||
GetNumNotes(): Promise<number>;
|
|
||||||
GetQuota: Promise<NotesQuota>;
|
|
||||||
|
|
||||||
IterateNotes(appId: number, length: number): Promise<NoteMetadata[]>;
|
|
||||||
ResolveSyncConflicts(param0: boolean): Promise<EResult>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param notes Escaped JSON array of {@link Note}.
|
|
||||||
*/
|
|
||||||
SaveNotes(filenameForNotes: string, notes: string): Promise<EResult>;
|
|
||||||
SyncToClient(): Promise<EResult>;
|
|
||||||
|
|
||||||
SyncToServer(): Promise<EResult>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param mimeType Image MIME type.
|
|
||||||
* @param base64 Image contents in base64.
|
|
||||||
* @returns an image file name with its extension that's meant to be used as a part of some URL. (todo)
|
|
||||||
* @throws OperationResponse if invalid MIME type or unable to parse base64 BUT NOT if it failed.
|
|
||||||
*/
|
|
||||||
UploadImage(imageFileNamePrefix: string, mimeType: string, base64: string): Promise<EResult | OperationResponse>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Note {
|
|
||||||
appid: number;
|
|
||||||
id: string;
|
|
||||||
/**
|
|
||||||
* Note contents in BB code.
|
|
||||||
*/
|
|
||||||
content: string;
|
|
||||||
ordinal: number;
|
|
||||||
time_created: number;
|
|
||||||
time_modified: number;
|
|
||||||
title: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Notes {
|
|
||||||
result: EResult;
|
|
||||||
/**
|
|
||||||
* Escaped JSON array of {@link Note}. Not present if {@link result} is {@link EResult.FileNotFound}.
|
|
||||||
*/
|
|
||||||
notes?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface NoteMetadata {
|
|
||||||
filename: string;
|
|
||||||
filesize: number;
|
|
||||||
result: EResult;
|
|
||||||
timestamp: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface NotesQuota {
|
|
||||||
bytes: number;
|
|
||||||
bytesAvailable: number;
|
|
||||||
numFiles: number;
|
|
||||||
numFilesAvailable: number;
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import type { JsPbMessage, Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
export interface GameRecording {
|
|
||||||
/**
|
|
||||||
* If `data` is deserialized, returns {@link CGameRecording_AudioSessionsChanged_Notification}.
|
|
||||||
*/
|
|
||||||
RegisterForAudioSessionsChanged(callback: (data: ArrayBuffer) => void): Unregisterable;
|
|
||||||
SetAudioSessionCaptureState(id: string, name: string, state: boolean): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface AudioSession {
|
|
||||||
id(): string | undefined;
|
|
||||||
name(): string | undefined;
|
|
||||||
is_system(): boolean | undefined;
|
|
||||||
is_muted(): boolean | undefined;
|
|
||||||
is_active(): boolean | undefined;
|
|
||||||
is_captured(): boolean | undefined;
|
|
||||||
recent_peak(): number | undefined;
|
|
||||||
is_game(): boolean | undefined;
|
|
||||||
is_steam(): boolean | undefined;
|
|
||||||
is_saved(): boolean | undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @note Taken from https://github.com/SteamDatabase/SteamTracking/blob/master/Protobufs/steammessages_gamerecording_objects.proto
|
|
||||||
*/
|
|
||||||
export interface CGameRecording_AudioSessionsChanged_Notification extends JsPbMessage {
|
|
||||||
sessions(): AudioSession[];
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
import {AppAchievements} from "./App";
|
|
||||||
import { Screenshot } from "./Screenshots";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents functions related to Steam Game Sessions.
|
|
||||||
*/
|
|
||||||
export interface GameSessions {
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when an achievement notification is received.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForAchievementNotification(
|
|
||||||
callback: (notification: AchievementNotification) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when an app lifetime notification is received.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForAppLifetimeNotifications(
|
|
||||||
callback: (notification: AppLifetimeNotification) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when a screenshot notification is received.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForScreenshotNotification(
|
|
||||||
callback: (notification: ScreenshotNotification) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @prop unAppID is not properly set by Steam for non-steam game shortcuts, so it defaults to 0 for them
|
|
||||||
*/
|
|
||||||
interface GameSessionNotificationBase {
|
|
||||||
unAppID: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface AchievementNotification extends GameSessionNotificationBase {
|
|
||||||
achievement: AppAchievements;
|
|
||||||
nCurrentProgress: number;
|
|
||||||
nMaxProgress: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface AppLifetimeNotification extends GameSessionNotificationBase {
|
|
||||||
nInstanceID: number;
|
|
||||||
bRunning: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ScreenshotNotification extends GameSessionNotificationBase {
|
|
||||||
details: Screenshot;
|
|
||||||
hScreenshot: number;
|
|
||||||
strOperation: "deleted" | "written";
|
|
||||||
}
|
|
||||||
@@ -1,762 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents functions related to input and controllers in Steam.
|
|
||||||
*/
|
|
||||||
export interface Input {
|
|
||||||
CalibrateControllerIMU(controllerIndex: any): any;
|
|
||||||
|
|
||||||
CalibrateControllerJoystick(controllerIndex: any): any;
|
|
||||||
|
|
||||||
CalibrateControllerTrackpads(controllerIndex: any): any;
|
|
||||||
|
|
||||||
CancelGyroSWCalibration(): any;
|
|
||||||
|
|
||||||
ClearSelectedConfigForApp(appId: number, controllerIndex: number): any;
|
|
||||||
|
|
||||||
CloseDesktopConfigurator: any;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes text.
|
|
||||||
* @param textToWrite The text to write.
|
|
||||||
*/
|
|
||||||
ControllerKeyboardSendText(textToWrite: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets a specified key's pressed state.
|
|
||||||
* @param key The key index to set the state for.
|
|
||||||
* @param state `true` for pressed, `false` otherwise.
|
|
||||||
* @example
|
|
||||||
* Send paste command:
|
|
||||||
* ```
|
|
||||||
* SteamClient.Input.ControllerKeyboardSetKeyState(EHIDKeyboardKey.LControl, true);
|
|
||||||
* SteamClient.Input.ControllerKeyboardSetKeyState(EHIDKeyboardKey.V, true);
|
|
||||||
* SteamClient.Input.ControllerKeyboardSetKeyState(EHIDKeyboardKey.V, false);
|
|
||||||
* SteamClient.Input.ControllerKeyboardSetKeyState(EHIDKeyboardKey.LControl, false);
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
ControllerKeyboardSetKeyState(key: EHIDKeyboardKey, state: boolean): void;
|
|
||||||
|
|
||||||
DecrementCloudedControllerConfigsCounter(): any;
|
|
||||||
|
|
||||||
DeletePersonalControllerConfiguration(param0: any): any;
|
|
||||||
|
|
||||||
//f.Debug("sending to client"), this.SetEditingConfigurationValue(e, t, c.QU, (e => SteamClient.Input.DuplicateControllerConfigurationSourceMode(this.m_unControllerIndex, e))), this.SaveEditingConfiguration(e), this
|
|
||||||
DuplicateControllerConfigurationSourceMode(controllerIndex: number, param1: any): any;
|
|
||||||
|
|
||||||
EndControllerDeviceSupportFlow(): any;
|
|
||||||
|
|
||||||
ExportCurrentControllerConfiguration(controllerIndex: number, appId: number, param2: number, title: string, description: string, param5: string): Promise<any>;
|
|
||||||
|
|
||||||
ForceConfiguratorFocus(param0: boolean): any;
|
|
||||||
|
|
||||||
ForceSimpleHapticEvent(param0: number, param1: number, param2: number, param3: number, param4: number): any;
|
|
||||||
|
|
||||||
FreeControllerConfig(m_ChordSummaryConfiguration: any): any;
|
|
||||||
|
|
||||||
GetConfigForAppAndController(appId: number, unControllerIndex: number): any;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the controller mapping string for the specified controller index.
|
|
||||||
* @param unControllerIndex The controller index.
|
|
||||||
* @returns the controller mapping string.
|
|
||||||
*/
|
|
||||||
GetControllerMappingString(unControllerIndex: number): Promise<string>;
|
|
||||||
|
|
||||||
GetControllerPreviouslySeen(): Promise<number[]>;
|
|
||||||
|
|
||||||
GetSteamControllerDongleState(): Promise<boolean>;
|
|
||||||
|
|
||||||
GetTouchMenuIconsForApp(appId: number): Promise<any>;
|
|
||||||
|
|
||||||
GetXboxDriverInstallState(): Promise<any>; // "{"nResult":0}"
|
|
||||||
IdentifyController(controllerIndex: number): any;
|
|
||||||
|
|
||||||
InitControllerSounds(): any;
|
|
||||||
|
|
||||||
InitializeControllerPersonalizationSettings(controllerIndex: number): any;
|
|
||||||
|
|
||||||
ModalKeyboardDismissed(): void;
|
|
||||||
|
|
||||||
OpenDesktopConfigurator: any;
|
|
||||||
|
|
||||||
PreviewConfigForAppAndController(appId: number, controllerIndex: number, workshopUri: string): any;
|
|
||||||
|
|
||||||
PreviewControllerLEDColor(flHue: number, flSaturation: number, flBrightness: number): any;
|
|
||||||
|
|
||||||
QueryControllerConfigsForApp(appId: number, controllerIndex: number, param2: boolean): any;
|
|
||||||
|
|
||||||
RegisterForActiveControllerChanges: Unregisterable; // {"nActiveController":0}
|
|
||||||
//param0 - e possibly appid?
|
|
||||||
//param1 - some index?
|
|
||||||
RegisterForConfigSelectionChanges(callback: (param0: number, param1: number) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForControllerAccountChanges: Unregisterable;
|
|
||||||
|
|
||||||
RegisterForControllerAnalogInputMessages(
|
|
||||||
callback: (msgs: ControllerAnalogInputMessage[]) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForControllerBatteryChanges(callback: any): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForControllerCommandMessages(
|
|
||||||
callback: (msg: ControllerCommandMessage) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback for changes in controller configuration cloud state.
|
|
||||||
* @param callback The callback function for config cloud state changes.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForControllerConfigCloudStateChanges(
|
|
||||||
callback: (state: ControllerConfigCloudState) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback for receiving controller configuration info messages (controller layouts query, personal controller layout query).
|
|
||||||
* @param callback The callback function for controller config info messages.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
* @remarks Do Not Use, this will break the controller layout selection unless you know what you are doing.
|
|
||||||
*/
|
|
||||||
RegisterForControllerConfigInfoMessages(
|
|
||||||
callback: (
|
|
||||||
msgs: ControllerConfigInfoMessageList[] | ControllerConfigInfoMessageQuery[],
|
|
||||||
) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be invoked when controller input messages are received.
|
|
||||||
* @param callback The callback function to be invoked when controller input messages are received.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForControllerInputMessages(
|
|
||||||
callback: (msgs: ControllerInputMessage[]) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForControllerListChanges(callback: (controllerListChanges: ControllerInfo[]) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback for changes in the controller state (buttons presses, triggers presses, joystick changes etc...).
|
|
||||||
* @param callback The callback function for controller state changes.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForControllerStateChanges(
|
|
||||||
callback: (changes: ControllerStateChange[]) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForDualSenseUpdateNotification(callback: (m_strDualSenseUpdateProduct: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback for receiving game keyboard messages (text field popup for inputting text for games when in character creation or etc...).
|
|
||||||
* @param callback The callback function for game keyboard messages.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForGameKeyboardMessages(callback: (msg: GameKeyboardMessage) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForRemotePlayConfigChanges(callback: () => void): Unregisterable;
|
|
||||||
|
|
||||||
//data.appId, data.ulConfigId
|
|
||||||
RegisterForShowControllerLayoutPreviewMessages(callback: (data: any) => void): Unregisterable;
|
|
||||||
|
|
||||||
/*
|
|
||||||
onTouchMenuInput(e) {
|
|
||||||
for (let t = 0; t < e.length; t++) {
|
|
||||||
const n = this.TouchMenuGetKey(e[t]), o = this.m_mapActiveTouchMenus.get(n);
|
|
||||||
void 0 !== o && o.updateTouchMenuState(e[t])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
RegisterForTouchMenuInputMessages(callback: (inputs: number[]) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForTouchMenuMessages(callback: (msg: TouchMenuMessage) => void): Unregisterable;
|
|
||||||
|
|
||||||
//param0 - index?
|
|
||||||
RegisterForUIVisualization(param0: any, param1: any, param2: any): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForUnboundControllerListChanges(callback: (m_unboundControllerList: any) => void): Unregisterable; // param0 is an array
|
|
||||||
|
|
||||||
/*
|
|
||||||
OnDismissKeyboardMessage(e) {
|
|
||||||
this.m_WindowStore.SteamUIWindows.forEach((e => e.VirtualKeyboardManager.SetVirtualKeyboardHidden(e.BrowserWindow)))
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
RegisterForUserDismissKeyboardMessages(callback: (param0: any) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForUserKeyboardMessages: Unregisterable;
|
|
||||||
|
|
||||||
RequestGyroActive(controllerIndex: number, param1: boolean): any;
|
|
||||||
|
|
||||||
RequestRemotePlayControllerConfigs(param0: any): any;
|
|
||||||
|
|
||||||
ResetControllerBindings(param0: any): any;
|
|
||||||
|
|
||||||
ResolveCloudedControllerConfigConflict(param0: any): any;
|
|
||||||
|
|
||||||
RestoreControllerPersonalizationSettings(controllerIndex: number): any;
|
|
||||||
|
|
||||||
SaveControllerCalibration(controllerIndex: number): any;
|
|
||||||
|
|
||||||
SaveControllerPersonalizationSettings(param0: any): any;
|
|
||||||
|
|
||||||
SaveControllerSounds: any;
|
|
||||||
|
|
||||||
SaveEditingControllerConfiguration(controllerIndex: number, sharedConfig: boolean): any;
|
|
||||||
|
|
||||||
//this.SetEditingConfigurationValue(e, t, c.sL, (e => SteamClient.Input.SetControllerConfigurationModeShiftBinding(this.m_unControllerIndex, e)))
|
|
||||||
SetControllerConfigurationModeShiftBinding(controllerIndex: number, param1: any): any;
|
|
||||||
|
|
||||||
SetControllerHapticSetting(controllerIndex: number, eHapticSetting: any): any;
|
|
||||||
|
|
||||||
SetControllerMappingString(mapping: string): void;
|
|
||||||
|
|
||||||
SetControllerName(controllerIndex: number, controllerName: string): any;
|
|
||||||
|
|
||||||
SetControllerNintendoLayoutSetting: any;
|
|
||||||
SetControllerPersonalizationName: any;
|
|
||||||
|
|
||||||
//param0 - nLStickDeadzone, bSWAntiDrift, nRHapticStrength, flRPadPressureCurve
|
|
||||||
/*
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("nLStickDeadzone", e.nLStickDeadzone),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("nRStickDeadzone", e.nRStickDeadzone),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("bSWAntiDrift", e.bSWAntiDrift ? 1 : 0),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("nLHapticStrength", e.nLHapticStrength),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("nRHapticStrength", e.nRHapticStrength),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("flLPadPressureCurve", 100 * e.flLPadPressureCurve),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("flRPadPressureCurve", 100 * e.flRPadPressureCurve),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("ePlayerSlotLEDSetting", e),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.nGyroSampleAngleOffsetX", e.nGyroSampleAngleOffsetX),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.bMomentumEnabled", e.bMomentumEnabled ? 1 : 0),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.nMomentumFrictionX", e.nMomentumFrictionX),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.nMomentumFrictionY", e.nMomentumFrictionY),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.nAccerationLevel", e.nAccerationLevel),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.bInvertX", e.bInvertX ? 1 : 0),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.bInvertY", e.bInvertY ? 1 : 0),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.nRotationAngle", e.nRotationAngle),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.nTriggerClamping", e.nTriggerClamping),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.nTriggerClampingAmount", e.nTriggerClampingAmount),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.nGyroEnableButton", e.nGyroEnableButton),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSetting("GyroPreferenceData.nGyroEnableButtonBehavior", e.nGyroEnableButtonBehavior),
|
|
||||||
*/
|
|
||||||
SetControllerPersonalizationSetting(param0: string, param1: number): any;
|
|
||||||
|
|
||||||
//param0 - flGyroStationaryTolerance, flAccelerometerStationaryTolerance,
|
|
||||||
/*
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSettingFloat("GyroPreferenceData.flGyroNaturalSensitivity", e.flGyroNaturalSensitivity),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSettingFloat("GyroPreferenceData.flGyroXYRatio", e.flGyroXYRatio),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSettingFloat("GyroPreferenceData.flGyroSpeedDeadzone", e.flGyroSpeedDeadzone),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSettingFloat("GyroPreferenceData.flGyroPrecisionSpeed", e.flGyroPrecisionSpeed),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSettingFloat("flGyroStationaryTolerance", e.flGyroStationaryTolerance),
|
|
||||||
SteamClient.Input.SetControllerPersonalizationSettingFloat("flAccelerometerStationaryTolerance", e.flAccelerometerStationaryTolerance),
|
|
||||||
*/
|
|
||||||
SetControllerPersonalizationSettingFloat(param0: string, param1: number): any;
|
|
||||||
|
|
||||||
SetControllerRumbleSetting(controllerIndex: number, rumblePreference: EControllerRumbleSetting): any;
|
|
||||||
|
|
||||||
SetControllerUseUniversalFaceButtonGlyphs(controllerIndex: number, value: boolean): void;
|
|
||||||
|
|
||||||
SetCursorActionset(param0: boolean): any;
|
|
||||||
|
|
||||||
SetDualSenseUpdateNotification(param0: boolean): any
|
|
||||||
|
|
||||||
/*
|
|
||||||
SetEditingConfigurationValue(e, t, n, o) {
|
|
||||||
const a = new r.BinaryWriter;
|
|
||||||
n.serializeBinaryToWriter(n.fromObject(t), a);
|
|
||||||
const s = a.getResultBase64String();
|
|
||||||
f.Debug("SetEditingConfigurationValue serializeBinaryToWriter", (0, i.ZN)(t), s), this.EditingConfigurationWillUpdate(), this.m_updatingEditingConfigurationPromise = o(s).then((t => {
|
|
||||||
if (null == t) return f.Debug("SetEditingConfigurationValue returned nothing."), void (0, i.z)((() => this.UpdateEditingConfiguration(e, this.m_unControllerIndex, this.EditingConfiguration)));
|
|
||||||
const n = c.bE.deserializeBinary(t).toObject();
|
|
||||||
f.Debug("SetEditingConfigurationValue returned controller configuration.", n), this.UpdateEditingConfiguration(e, this.m_unControllerIndex, n), this.m_nEditNumber++, -1 == n.url.indexOf("autosave://") && this.SaveEditingConfiguration(e)
|
|
||||||
})).catch((e => {
|
|
||||||
f.Error("SetEditingConfigurationValue fail:", o, l.jt(e.result), e.message), this.m_bIsUpdatingActiveConfiguration = !1
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
SetControllerActionSet(e, t) {
|
|
||||||
this.SetEditingConfigurationValue(e, t, c.X3, (e => SteamClient.Input.SetEditingControllerConfigurationActionSet(this.m_unControllerIndex, e)))
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
SetEditingControllerConfigurationActionSet(controllerIndex: number, param1: any): any;
|
|
||||||
|
|
||||||
//this.SetEditingConfigurationValue(e, t, c.io, (e => SteamClient.Input.SetEditingControllerConfigurationInputActivator(this.m_unControllerIndex, e)))
|
|
||||||
SetEditingControllerConfigurationInputActivator(controllerIndex: number, param1: any): any;
|
|
||||||
|
|
||||||
//this.SetEditingConfigurationValue(e, t, c.tH, (e => SteamClient.Input.SetEditingControllerConfigurationInputActivatorEnabled(this.m_unControllerIndex, e)))
|
|
||||||
SetEditingControllerConfigurationInputActivatorEnabled(controllerIndex: number, param1: any): any;
|
|
||||||
|
|
||||||
//this.SetEditingConfigurationValue(e, t, c.J2, (e => SteamClient.Input.SetEditingControllerConfigurationInputBinding(this.m_unControllerIndex, e)))
|
|
||||||
SetEditingControllerConfigurationInputBinding(controllerIndex: number, param1: any): any;
|
|
||||||
|
|
||||||
//this.SetEditingConfigurationValue(e, t, c.Sz, (e => SteamClient.Input.SetEditingControllerConfigurationMiscSetting(this.m_unControllerIndex, e)))
|
|
||||||
SetEditingControllerConfigurationMiscSetting(controllerIndex: number, param1: any): any;
|
|
||||||
|
|
||||||
//f.Debug("sending to client"), this.SetEditingConfigurationValue(e, t, c.QU, (e => SteamClient.Input.SetEditingControllerConfigurationSourceMode(this.m_unControllerIndex, e)))
|
|
||||||
SetEditingControllerConfigurationSourceMode(controllerIndex: number, param1: any): any;
|
|
||||||
|
|
||||||
SetGamepadKeyboardText(param0: boolean, param1: string): any;
|
|
||||||
|
|
||||||
SetKeyboardActionset(param0: boolean, param1: boolean): any;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the mouse position.
|
|
||||||
* @param pid 0
|
|
||||||
* @param x Mouse X position.
|
|
||||||
* @param y Mouse Y position.
|
|
||||||
*/
|
|
||||||
SetMousePosition(pid: number, x: number, y: number): void;
|
|
||||||
|
|
||||||
SetSelectedConfigForApp(appId: number, controllerIndex: number, url: string, param3: boolean): any;
|
|
||||||
|
|
||||||
SetSteamControllerDonglePairingMode(bEnable: boolean, bSilent: boolean): any;
|
|
||||||
|
|
||||||
SetVirtualMenuKeySelected(unControllerIndex: number, unMenuIndex: number, m_controllerMenuActiveMenuItem: number): any; //
|
|
||||||
SetWebBrowserActionset(param0: boolean): any;
|
|
||||||
|
|
||||||
SetXboxDriverInstallState(param0: any): any; // state
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the Steam Input controller settings.
|
|
||||||
* This function displays the Steam Input controller settings for configuration.
|
|
||||||
*/
|
|
||||||
ShowControllerSettings(): void;
|
|
||||||
|
|
||||||
StandaloneKeyboardDismissed(): any;
|
|
||||||
|
|
||||||
StartControllerDeviceSupportFlow(param0: any, param1: any, callback: (param2: any) => void): any;
|
|
||||||
|
|
||||||
/*
|
|
||||||
this.m_updatingEditingConfigurationPromise = SteamClient.Input.StartEditingControllerConfigurationForAppIDAndControllerIndex(e, t).then((n=>{
|
|
||||||
const o = c.bE.deserializeBinary(n).toObject();
|
|
||||||
f.Debug("Loaded controller config for appid", e, n, o),
|
|
||||||
(0,
|
|
||||||
i.z)((()=>this.UpdateEditingConfiguration(e, t, o)))
|
|
||||||
}
|
|
||||||
)).catch((n=>{
|
|
||||||
f.Debug("Loading controller config for appid rejected", e, n),
|
|
||||||
(0,
|
|
||||||
i.z)((()=>this.UpdateEditingConfiguration(e, t, null)))
|
|
||||||
}
|
|
||||||
))
|
|
||||||
*/
|
|
||||||
StartEditingControllerConfigurationForAppIDAndControllerIndex(m_appId: number, m_unControllerIndex: number): Promise<any>;
|
|
||||||
|
|
||||||
StartGyroSWCalibration(callback: () => void): any;
|
|
||||||
|
|
||||||
StopEditingControllerConfiguration(controllerIndex: number): any;
|
|
||||||
|
|
||||||
SwapControllerConfigurationSourceModes: any;
|
|
||||||
|
|
||||||
//this.SetEditingConfigurationValue(e, t, c.Qb, (e => SteamClient.Input.SwapControllerModeInputBindings(this.m_unControllerIndex, e)))
|
|
||||||
SwapControllerModeInputBindings(controllerIndex: number, param1: any): any;
|
|
||||||
|
|
||||||
SwapControllerOrder(controllerIndex1: number, controllerIndex2: number): any;
|
|
||||||
|
|
||||||
SyncCloudedControllerConfigs(): any;
|
|
||||||
|
|
||||||
// type - enum
|
|
||||||
/*
|
|
||||||
Off - 0, Tick, Click
|
|
||||||
*/
|
|
||||||
TriggerHapticPulse(controllerIndex: number, eHapticType: number, param2: number): any;
|
|
||||||
|
|
||||||
TriggerSimpleHapticEvent(
|
|
||||||
controllerIndex: number,
|
|
||||||
eHapticType: number,
|
|
||||||
unIntensity: number,
|
|
||||||
ndBGain: number,
|
|
||||||
param4: number,
|
|
||||||
): any;
|
|
||||||
|
|
||||||
UnregisterForControllerStateChanges(): void;
|
|
||||||
|
|
||||||
UnregisterForUIVisualization(controllerIndex: number): any;
|
|
||||||
|
|
||||||
UploadChangesForCloudedControllerConfigs(): any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EHIDKeyboardKey {
|
|
||||||
Invalid,
|
|
||||||
BeforeFirst = 3,
|
|
||||||
A,
|
|
||||||
B,
|
|
||||||
C,
|
|
||||||
D,
|
|
||||||
E,
|
|
||||||
F,
|
|
||||||
G,
|
|
||||||
H,
|
|
||||||
I,
|
|
||||||
J,
|
|
||||||
K,
|
|
||||||
L,
|
|
||||||
M,
|
|
||||||
N,
|
|
||||||
O,
|
|
||||||
P,
|
|
||||||
Q,
|
|
||||||
R,
|
|
||||||
S,
|
|
||||||
T,
|
|
||||||
U,
|
|
||||||
V,
|
|
||||||
W,
|
|
||||||
X,
|
|
||||||
Y,
|
|
||||||
Z,
|
|
||||||
Key_1,
|
|
||||||
Key_2,
|
|
||||||
Key_3,
|
|
||||||
Key_4,
|
|
||||||
Key_5,
|
|
||||||
Key_6,
|
|
||||||
Key_7,
|
|
||||||
Key_8,
|
|
||||||
Key_9,
|
|
||||||
Key_0,
|
|
||||||
Return,
|
|
||||||
Escape,
|
|
||||||
Backspace,
|
|
||||||
Tab,
|
|
||||||
Space,
|
|
||||||
Dash,
|
|
||||||
Equals,
|
|
||||||
LeftBracket,
|
|
||||||
RightBracket,
|
|
||||||
Backslash,
|
|
||||||
Unused1,
|
|
||||||
Semicolon,
|
|
||||||
SingleQuote,
|
|
||||||
Backtick,
|
|
||||||
Comma,
|
|
||||||
Period,
|
|
||||||
ForwardSlash,
|
|
||||||
CapsLock,
|
|
||||||
F1,
|
|
||||||
F2,
|
|
||||||
F3,
|
|
||||||
F4,
|
|
||||||
F5,
|
|
||||||
F6,
|
|
||||||
F7,
|
|
||||||
F8,
|
|
||||||
F9,
|
|
||||||
F10,
|
|
||||||
F11,
|
|
||||||
F12,
|
|
||||||
PrintScreen,
|
|
||||||
ScrollLock,
|
|
||||||
Break,
|
|
||||||
Insert,
|
|
||||||
Home,
|
|
||||||
PageUp,
|
|
||||||
Delete,
|
|
||||||
End,
|
|
||||||
PageDown,
|
|
||||||
RightArrow,
|
|
||||||
LeftArrow,
|
|
||||||
DownArrow,
|
|
||||||
UpArrow,
|
|
||||||
NumLock,
|
|
||||||
KeypadForwardSlash,
|
|
||||||
KeypadAsterisk,
|
|
||||||
KeypadDash,
|
|
||||||
KeypadPlus,
|
|
||||||
KeypadEnter,
|
|
||||||
Keypad_1,
|
|
||||||
Keypad_2,
|
|
||||||
Keypad_3,
|
|
||||||
Keypad_4,
|
|
||||||
Keypad_5,
|
|
||||||
Keypad_6,
|
|
||||||
Keypad_7,
|
|
||||||
Keypad_8,
|
|
||||||
Keypad_9,
|
|
||||||
Keypad_0,
|
|
||||||
KeypadPeriod,
|
|
||||||
LAlt,
|
|
||||||
LShift,
|
|
||||||
LWin,
|
|
||||||
LControl,
|
|
||||||
RAlt,
|
|
||||||
RShift,
|
|
||||||
RWin,
|
|
||||||
RControl,
|
|
||||||
VolUp,
|
|
||||||
VolDown,
|
|
||||||
Mute,
|
|
||||||
Play,
|
|
||||||
Stop,
|
|
||||||
Next,
|
|
||||||
Prev,
|
|
||||||
AfterLast,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ControllerAnalogInputMessage {
|
|
||||||
nA: number;
|
|
||||||
x: number;
|
|
||||||
y: number;
|
|
||||||
nC: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ControllerCommandMessage {
|
|
||||||
/**
|
|
||||||
* @todo enum
|
|
||||||
*/
|
|
||||||
eAction: number;
|
|
||||||
nControllerIndex: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ControllerConfigCloudState {
|
|
||||||
bSyncDone: boolean;
|
|
||||||
bSyncConflict: boolean;
|
|
||||||
bSyncError: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ControllerConfigInfoMessage {
|
|
||||||
appID: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ControllerConfigInfoMessageQuery extends ControllerConfigInfoMessage {
|
|
||||||
bPersonalQueryDone: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ControllerConfigInfoMessageList extends ControllerConfigInfoMessage {
|
|
||||||
nControllerType: number;
|
|
||||||
publishedFileID: string;
|
|
||||||
accountID: number;
|
|
||||||
Title: string;
|
|
||||||
Description: string;
|
|
||||||
URL: string;
|
|
||||||
timeUpdated: string;
|
|
||||||
bOfficial: boolean;
|
|
||||||
bProgenitorOfficial: boolean;
|
|
||||||
bRecommended: boolean;
|
|
||||||
bProgenitorRecommended: boolean;
|
|
||||||
bUsesSIAPI: boolean;
|
|
||||||
bUsesMouse: boolean;
|
|
||||||
bUsesKeyboard: boolean;
|
|
||||||
bUsesGamepad: boolean;
|
|
||||||
/**
|
|
||||||
* @todo unconfirmed
|
|
||||||
*/
|
|
||||||
eExportType: EControllerConfigExportType;
|
|
||||||
playtime: string;
|
|
||||||
bSelected: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EControllerConfigExportType {
|
|
||||||
Unknown,
|
|
||||||
PersonalLocal,
|
|
||||||
PersonalCloud,
|
|
||||||
Community,
|
|
||||||
Template,
|
|
||||||
Official,
|
|
||||||
OfficialDefault,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EControllerRumbleSetting {
|
|
||||||
ControllerPreference,
|
|
||||||
Off,
|
|
||||||
On,
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Not the actual name, but the enum is only represented in a dropdown
|
|
||||||
// options vector, ty valve
|
|
||||||
export enum EThirdPartyControllerConfiguration {
|
|
||||||
Off,
|
|
||||||
DefaultSetting,
|
|
||||||
On,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ControllerInputMessage {
|
|
||||||
nA: number;
|
|
||||||
bS: boolean;
|
|
||||||
nC: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ActiveAccount {
|
|
||||||
strActiveAccountID: string;
|
|
||||||
strName: string;
|
|
||||||
strAvatarHash: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ControllerInfo {
|
|
||||||
strName: string;
|
|
||||||
eControllerType: EControllerType;
|
|
||||||
nXInputIndex: number;
|
|
||||||
nControllerIndex: number;
|
|
||||||
eRumblePreference: EControllerRumbleSetting;
|
|
||||||
bWireless: boolean;
|
|
||||||
unUniqueID: number;
|
|
||||||
unVendorID: number;
|
|
||||||
unProductID: number;
|
|
||||||
/** Bitmask */
|
|
||||||
unCapabilities: number;
|
|
||||||
strFirmwareBuildTime: string;
|
|
||||||
strSerialNumber: string;
|
|
||||||
strChipID: string;
|
|
||||||
nLEDColorR: number;
|
|
||||||
nLEDColorG: number;
|
|
||||||
nLEDColorB: number;
|
|
||||||
flLEDBrightness: number;
|
|
||||||
flLEDSaturation: number;
|
|
||||||
nTurnOnSound: number;
|
|
||||||
nTurnOffSound: number;
|
|
||||||
nLStickDeadzone: number;
|
|
||||||
nRStickDeadzone: number;
|
|
||||||
nLHapticStrength: number;
|
|
||||||
nRHapticStrength: number;
|
|
||||||
flLPadPressureCurve: number;
|
|
||||||
flRPadPressureCurve: number;
|
|
||||||
bHaptics: boolean;
|
|
||||||
bSWAntiDrift: boolean;
|
|
||||||
flGyroStationaryTolerance: number;
|
|
||||||
flAccelerometerStationaryTolerance: number;
|
|
||||||
bRemoteDevice: boolean;
|
|
||||||
bNintendoLayout: boolean;
|
|
||||||
bUseReversedLayout: boolean;
|
|
||||||
ActiveAccount: ActiveAccount | undefined;
|
|
||||||
vecAltAccounts: any[]; // The type for this property might need to be more specific based on the actual data structure
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EControllerType {
|
|
||||||
None = -1,
|
|
||||||
Unknown,
|
|
||||||
UnknownSteamController,
|
|
||||||
SteamController, // Codename Gordon
|
|
||||||
SteamControllerV2, // Codename Headcrab
|
|
||||||
SteamControllerNeptune, // Steam Deck
|
|
||||||
FrontPanelBoard = 20,
|
|
||||||
Generic = 30,
|
|
||||||
XBox360Controller,
|
|
||||||
XBoxOneController,
|
|
||||||
PS3Controller,
|
|
||||||
PS4Controller,
|
|
||||||
WiiController,
|
|
||||||
AppleController,
|
|
||||||
AndroidController,
|
|
||||||
SwitchProController,
|
|
||||||
SwitchJoyConLeft,
|
|
||||||
SwitchJoyConRight,
|
|
||||||
SwitchJoyConPair,
|
|
||||||
SwitchProGenericInputOnlyController,
|
|
||||||
MobileTouch,
|
|
||||||
SwitchProXInputSwitchController,
|
|
||||||
PS5Controller,
|
|
||||||
XboxEliteController,
|
|
||||||
LastController, // Unverified
|
|
||||||
PS5EdgeController,
|
|
||||||
GenericKeyboard = 400,
|
|
||||||
GenericMouse = 800,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ControllerStateChange {
|
|
||||||
unControllerIndex: number;
|
|
||||||
unPacketNum: number;
|
|
||||||
/**
|
|
||||||
* Bitmask representing pressed upper buttons.
|
|
||||||
* - Bit 0-8: Unknown (@todo Please provide more details if known)
|
|
||||||
* - Bit 9: L4
|
|
||||||
* - Bit 10: R4
|
|
||||||
* - Bit 11-13: Unknown (@todo Please provide more details if known)
|
|
||||||
* - Bit 14: Left Joystick Touch
|
|
||||||
* - Bit 15: Right Joystick Touch
|
|
||||||
* - Bit 16-17: Unknown (@todo Please provide more details if known)
|
|
||||||
* - Bit 18: Quick Access Menu
|
|
||||||
*/
|
|
||||||
ulUpperButtons: number;
|
|
||||||
/**
|
|
||||||
* Bitmask representing pressed buttons.
|
|
||||||
* - Bit 0: R2
|
|
||||||
* - Bit 1: L2
|
|
||||||
* - Bit 2: R1
|
|
||||||
* - Bit 3: L1
|
|
||||||
* - Bit 4: Y
|
|
||||||
* - Bit 5: B
|
|
||||||
* - Bit 6: X
|
|
||||||
* - Bit 7: A
|
|
||||||
* - Bit 8: D-Pad Up
|
|
||||||
* - Bit 9: D-Pad Right
|
|
||||||
* - Bit 10: D-Pad Left
|
|
||||||
* - Bit 11: D-Pad Down
|
|
||||||
* - Bit 12: Select
|
|
||||||
* - Bit 13: Steam/Home
|
|
||||||
* - Bit 14: Start
|
|
||||||
* - Bit 15: L5
|
|
||||||
* - Bit 16: R5
|
|
||||||
* - Bit 17: Left Touchpad Click
|
|
||||||
* - Bit 18: Right Touchpad Click
|
|
||||||
* - Bit 19: Left Touchpad Touch
|
|
||||||
* - Bit 20: Right Touchpad Touch
|
|
||||||
* - Bit 21: Unknown (@todo Please provide more details if known)
|
|
||||||
* - Bit 22: L3
|
|
||||||
* - Bit 23-25: Unknown (@todo Please provide more details if known)
|
|
||||||
* - Bit 26: R3
|
|
||||||
* - Bit 27-28: Unknown (@todo Please provide more details if known)
|
|
||||||
* - Bit 29: Mute (Dualsense)
|
|
||||||
* - Bit 30-31: Unknown (@todo Please provide more details if known)
|
|
||||||
*/
|
|
||||||
ulButtons: number;
|
|
||||||
sLeftPadX: number;
|
|
||||||
sLeftPadY: number;
|
|
||||||
sRightPadX: number;
|
|
||||||
sRightPadY: number;
|
|
||||||
sCenterPadX: number;
|
|
||||||
sCenterPadY: number;
|
|
||||||
sLeftStickX: number;
|
|
||||||
sLeftStickY: number;
|
|
||||||
sRightStickX: number;
|
|
||||||
sRightStickY: number;
|
|
||||||
sTriggerL: number;
|
|
||||||
sTriggerR: number;
|
|
||||||
flTrustedGravityVectorX: number;
|
|
||||||
flTrustedGravityVectorY: number;
|
|
||||||
flTrustedGravityVectorZ: number;
|
|
||||||
flSoftwareQuatW: number;
|
|
||||||
flSoftwareQuatX: number;
|
|
||||||
flSoftwareQuatY: number;
|
|
||||||
flSoftwareQuatZ: number;
|
|
||||||
flSoftwareGyroDegreesPerSecondPitch: number;
|
|
||||||
flSoftwareGyroDegreesPerSecondYaw: number;
|
|
||||||
flSoftwareGyroDegreesPerSecondRoll: number;
|
|
||||||
flHardwareQuatW: number;
|
|
||||||
flHardwareQuatX: number;
|
|
||||||
flHardwareQuatY: number;
|
|
||||||
flHardwareQuatZ: number;
|
|
||||||
flHardwareGyroDegreesPerSecondPitch: number;
|
|
||||||
flHardwareGyroDegreesPerSecondYaw: number;
|
|
||||||
flHardwareGyroDegreesPerSecondRoll: number;
|
|
||||||
flGyroNoiseLength: number;
|
|
||||||
flGyroCalibrationProgress: number;
|
|
||||||
flGravityVectorX: number;
|
|
||||||
flGravityVectorY: number;
|
|
||||||
flGravityVectorZ: number;
|
|
||||||
flAccelerometerNoiseLength: number;
|
|
||||||
sBatteryLevel: number;
|
|
||||||
sPressurePadLeft: number;
|
|
||||||
sPressurePadRight: number;
|
|
||||||
sPressureBumperLeft: number;
|
|
||||||
sPressureBumperRight: number;
|
|
||||||
unHardwareUpdateInMicrosec: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface GameKeyboardMessage {
|
|
||||||
m_bOpen: boolean;
|
|
||||||
nAppID: number;
|
|
||||||
m_dwPID: number;
|
|
||||||
m_dwOverlayPID: number;
|
|
||||||
m_hPipe: number;
|
|
||||||
/** @todo enum */
|
|
||||||
m_eInputMode: number;
|
|
||||||
/** @todo enum */
|
|
||||||
m_eLineInputMode: number;
|
|
||||||
m_pchDescription: string;
|
|
||||||
m_unCharMax: number;
|
|
||||||
m_pchExistingText: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TouchMenuMessage {
|
|
||||||
bHasVirtualMenus: boolean;
|
|
||||||
unControllerIndex: number;
|
|
||||||
appID: number;
|
|
||||||
}
|
|
||||||
@@ -1,167 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
import {EAppUpdateError} from "./App";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents functions related to Steam Install Folders.
|
|
||||||
*/
|
|
||||||
export interface InstallFolder {
|
|
||||||
/**
|
|
||||||
* Adds a Steam Library folder to the Steam client.
|
|
||||||
* @param path The path of the Steam Library folder to be added.
|
|
||||||
* @returns the index of the added folder.
|
|
||||||
*/
|
|
||||||
AddInstallFolder(path: string): Promise<number>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the file explorer to browse files in a specific Steam Library folder.
|
|
||||||
* @param folderIndex The index of the folder to be opened.
|
|
||||||
*/
|
|
||||||
BrowseFilesInFolder(folderIndex: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cancels the current move operation for moving game content.
|
|
||||||
*/
|
|
||||||
CancelMove(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves a list of installed Steam Library folders.
|
|
||||||
* @returns an array of SteamInstallFolder objects.
|
|
||||||
*/
|
|
||||||
GetInstallFolders(): Promise<SteamInstallFolder[]>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves a list of potential Steam Library folders that can be added.
|
|
||||||
* @returns an array of PotentialInstallFolder objects.
|
|
||||||
*/
|
|
||||||
GetPotentialFolders(): Promise<PotentialInstallFolder[]>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Moves the installation folder for a specific app to another Steam Library folder.
|
|
||||||
* @param appId The ID of the application to be moved.
|
|
||||||
* @param folderIndex The index of the target Steam Library folder.
|
|
||||||
*/
|
|
||||||
MoveInstallFolderForApp(appId: number, folderIndex: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Refreshes the list of installed Steam Library folders.
|
|
||||||
*/
|
|
||||||
RefreshFolders(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when changes occur in Steam Install Folders.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForInstallFolderChanges(callback: (change: FolderChange) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when moving game content progresses.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForMoveContentProgress(callback: (progress: MoveContentProgress) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when repairing an install folder is finished.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForRepairFolderFinished(callback: (change: FolderChange) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes a Steam Library folder from the Steam client.
|
|
||||||
* @param folderIndex The index of the folder to be removed.
|
|
||||||
*/
|
|
||||||
RemoveInstallFolder(folderIndex: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Repairs an installed Steam Library folder.
|
|
||||||
* @param folderIndex The index of the folder to be repaired.
|
|
||||||
*/
|
|
||||||
RepairInstallFolder(folderIndex: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets a specific Steam Library folder as the default install folder.
|
|
||||||
* @param folderIndex The index of the folder to be set as default.
|
|
||||||
*/
|
|
||||||
SetDefaultInstallFolder(folderIndex: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets a user-defined label for a specific Steam Library folder.
|
|
||||||
* @param folderIndex The index of the folder to be labeled.
|
|
||||||
* @param label The label to be assigned to the folder.
|
|
||||||
*/
|
|
||||||
SetFolderLabel(folderIndex: number, label: string): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents information about an installation folder.
|
|
||||||
*/
|
|
||||||
export interface SteamInstallFolder extends PotentialInstallFolder {
|
|
||||||
/** Index of the folder. */
|
|
||||||
nFolderIndex: number;
|
|
||||||
/** Used space in the folder. */
|
|
||||||
strUsedSize: string;
|
|
||||||
/** Size of DLC storage used in the folder. */
|
|
||||||
strDLCSize: string;
|
|
||||||
/** Size of workshop storage used in the folder. */
|
|
||||||
strWorkshopSize: string;
|
|
||||||
/** Size of staged storage used in the folder. */
|
|
||||||
strStagedSize: string;
|
|
||||||
/** Indicates if the folder is set as the default installation folder. */
|
|
||||||
bIsDefaultFolder: boolean;
|
|
||||||
/** Indicates if the folder is currently mounted. */
|
|
||||||
bIsMounted: boolean;
|
|
||||||
/** List of applications installed in the folder. */
|
|
||||||
vecApps: AppInfo[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface PotentialInstallFolder {
|
|
||||||
/** Path of the folder. */
|
|
||||||
strFolderPath: string;
|
|
||||||
/** User label for the folder. */
|
|
||||||
strUserLabel: string;
|
|
||||||
/** Name of the drive where the folder is located. */
|
|
||||||
strDriveName: string;
|
|
||||||
/** Total capacity of the folder. */
|
|
||||||
strCapacity: string;
|
|
||||||
/** Available free space in the folder. */
|
|
||||||
strFreeSpace: string;
|
|
||||||
/** Indicates if the folder is on a fixed drive. */
|
|
||||||
bIsFixed: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents information about an installed application.
|
|
||||||
*/
|
|
||||||
export interface AppInfo {
|
|
||||||
/** ID of the application. */
|
|
||||||
nAppID: number;
|
|
||||||
/** Name of the application. */
|
|
||||||
strAppName: string;
|
|
||||||
/** Sorting information for the application. */
|
|
||||||
strSortAs: string;
|
|
||||||
/** Last played time in Unix Epoch time format. */
|
|
||||||
rtLastPlayed: number;
|
|
||||||
/** Size of used storage by the application. */
|
|
||||||
strUsedSize: string;
|
|
||||||
/** Size of DLC storage used by the application. */
|
|
||||||
strDLCSize: string;
|
|
||||||
/** Size of workshop storage used by the application. */
|
|
||||||
strWorkshopSize: string;
|
|
||||||
/** Size of staged storage used by the application. */
|
|
||||||
strStagedSize: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface FolderChange {
|
|
||||||
folderIndex: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface MoveContentProgress {
|
|
||||||
appid: number;
|
|
||||||
eError: EAppUpdateError;
|
|
||||||
flProgress: number;
|
|
||||||
strBytesMoved: string;
|
|
||||||
strTotalBytesToMove: string;
|
|
||||||
nFilesMoved: number;
|
|
||||||
}
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
import {EAppUpdateError} from "./App";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents functions related to managing installs and installation wizards in Steam.
|
|
||||||
*/
|
|
||||||
export interface Installs {
|
|
||||||
/**
|
|
||||||
* Cancels the installation wizard if it is open.
|
|
||||||
*/
|
|
||||||
CancelInstall(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Continues and starts the installation if the wizard is still open.
|
|
||||||
*/
|
|
||||||
ContinueInstall(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves information from the last opened or currently opened installation wizard.
|
|
||||||
*/
|
|
||||||
GetInstallManagerInfo(): Promise<InstallMgrInfo>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the restore from backup installer wizard for a specific app.
|
|
||||||
* @param appBackupPath The backup path of the app.
|
|
||||||
*/
|
|
||||||
OpenInstallBackup(appBackupPath: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the installation wizard for specified app IDs.
|
|
||||||
* @param appIds An array of app IDs to install.
|
|
||||||
*/
|
|
||||||
OpenInstallWizard(appIds: number[]): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the uninstall wizard for specified app IDs.
|
|
||||||
* @param appIds An array of app IDs to uninstall.
|
|
||||||
* @param dontPrompt Whether to *not* prompt the user to uninstall.
|
|
||||||
*/
|
|
||||||
OpenUninstallWizard(appIds: number[], dontPrompt: boolean): void;
|
|
||||||
|
|
||||||
RegisterForShowConfirmUninstall: Unregisterable; // Broken? doesn't seem to work
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when the "Failed Uninstall" dialog is shown.
|
|
||||||
* @param callback The callback function to be called when the dialog is shown.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForShowFailedUninstall(callback: (appId: number, reason: EAppUpdateError) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when the installation wizard is shown.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForShowInstallWizard(callback: (data: InstallMgrInfo) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForShowRegisterCDKey: any;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets a list of app identifiers for downloads in the installation wizard.
|
|
||||||
* @param appIds An array of app IDs to set.
|
|
||||||
* @remarks The wizard will not reflect this change immediately, but changing another option will.
|
|
||||||
*/
|
|
||||||
SetAppList(appIds: number[]): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the options for creating shortcuts in the installation wizard.
|
|
||||||
* @param bDesktopShortcut Whether to create a desktop shortcut.
|
|
||||||
* @param bSystemMenuShortcut Whether to create a system menu shortcut.
|
|
||||||
* @remarks The wizard will not reflect this change immediately, but changing another option will.
|
|
||||||
*/
|
|
||||||
SetCreateShortcuts(bDesktopShortcut: boolean, bSystemMenuShortcut: boolean): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the install folder for the installation wizard using an install folder index.
|
|
||||||
* @param folderIndex The index of the install folder.
|
|
||||||
* @remarks The wizard will not reflect this change immediately, but changing another option will.
|
|
||||||
*/
|
|
||||||
SetInstallFolder(folderIndex: number): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface InstallMgrInfo {
|
|
||||||
rgAppIDs: InstallInfoApps[];
|
|
||||||
eInstallState: EInstallMgrState;
|
|
||||||
nDiskSpaceRequired: number;
|
|
||||||
nDiskSpaceAvailable: number;
|
|
||||||
nCurrentDisk: number;
|
|
||||||
nTotalDisks: number;
|
|
||||||
bCanChangeInstallFolder: boolean;
|
|
||||||
/**
|
|
||||||
* Index of the install folder. -1 if not installed.
|
|
||||||
*/
|
|
||||||
iInstallFolder: number;
|
|
||||||
iUnmountedFolder: number;
|
|
||||||
currentAppID: number;
|
|
||||||
eAppError: EAppUpdateError;
|
|
||||||
errorDetail: string;
|
|
||||||
bSystemMenuShortcut: boolean;
|
|
||||||
bDesktopShortcut: boolean;
|
|
||||||
bIsBackupInstall: boolean;
|
|
||||||
// device/hostname
|
|
||||||
strPeerContentServer: string;
|
|
||||||
bPeerContentServerOnline: boolean;
|
|
||||||
bPeerContentServerAvailable: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface InstallInfoApps {
|
|
||||||
nAppID: number;
|
|
||||||
lDiskSpaceRequiredBytes: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EInstallMgrState {
|
|
||||||
None,
|
|
||||||
Setup,
|
|
||||||
WaitLicense,
|
|
||||||
FreeLicense,
|
|
||||||
ShowCDKey,
|
|
||||||
WaitAppInfo,
|
|
||||||
ShowPassword,
|
|
||||||
ShowConfig,
|
|
||||||
ShowEULAs,
|
|
||||||
CreateApps,
|
|
||||||
ReadFromMedia,
|
|
||||||
ShowChangeMedia,
|
|
||||||
WaitLegacyCDKeys,
|
|
||||||
ShowSignup,
|
|
||||||
Complete,
|
|
||||||
Failed,
|
|
||||||
Canceled,
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
export interface Messaging {
|
|
||||||
// section - "ContentManagement", "JumpList", "PostToLibrary"
|
|
||||||
// seems multipurpose
|
|
||||||
RegisterForMessages<T extends string>(
|
|
||||||
message: T,
|
|
||||||
callback: (message: T, section: string, args: string) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/*
|
|
||||||
function m(e) {
|
|
||||||
SteamClient.Messaging.PostMessage("LibraryCommands", "ShowFriendChatDialog", JSON.stringify({
|
|
||||||
steamid: e.persona.m_steamid.ConvertTo64BitString()
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
SteamClient.Messaging.PostMessage("FriendsUI", "AcceptedRemotePlayInvite", JSON.stringify({id: this.appID})) : SteamClient.Messaging.PostMessage("FriendsUI", "AcceptedGameInvite", JSON.stringify({id: this.appID}))
|
|
||||||
*/
|
|
||||||
PostMessage(message: string, section: string, args: string): void;
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents functions related to controlling music playback in the Steam client.
|
|
||||||
*/
|
|
||||||
export interface Music {
|
|
||||||
/**
|
|
||||||
* Decreases the music volume by 10%.
|
|
||||||
*/
|
|
||||||
DecreaseVolume(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Increases the music volume by 10%.
|
|
||||||
*/
|
|
||||||
IncreaseVolume(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Plays the next track in the music playlist.
|
|
||||||
*/
|
|
||||||
PlayNext(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Plays the previous track in the music playlist.
|
|
||||||
*/
|
|
||||||
PlayPrevious(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when music playback changes.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForMusicPlaybackChanges(callback: (param0: boolean | MusicTrack) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when the music playback position changes.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForMusicPlaybackPosition(callback: (position: number) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the playback position of the music track.
|
|
||||||
* @param position The position to set in seconds.
|
|
||||||
*/
|
|
||||||
SetPlaybackPosition(position: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the repeat status for music playback.
|
|
||||||
* @param status The repeat status.
|
|
||||||
*/
|
|
||||||
SetPlayingRepeatStatus(status: EMusicPlayingRepeatStatus): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the shuffle status for music playback.
|
|
||||||
* @param value True to enable shuffle, false to disable shuffle.
|
|
||||||
*/
|
|
||||||
SetPlayingShuffled(value: boolean): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the volume for music playback.
|
|
||||||
* @param volume The volume level to set.
|
|
||||||
* @remarks Ranges from 0 to 100.
|
|
||||||
*/
|
|
||||||
SetVolume(volume: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Toggles the mute state of the music volume.
|
|
||||||
*/
|
|
||||||
ToggleMuteVolume(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Toggles between play and pause for music playback.
|
|
||||||
*/
|
|
||||||
TogglePlayPause(): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface MusicTrack {
|
|
||||||
uSoundtrackAppId: number;
|
|
||||||
ePlaybackStatus: EAudioPlayback;
|
|
||||||
eRepeatStatus: EMusicPlayingRepeatStatus;
|
|
||||||
bShuffle: boolean;
|
|
||||||
nVolume: number;
|
|
||||||
nActiveTrack: number;
|
|
||||||
nLengthInMsec: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EAudioPlayback {
|
|
||||||
Undefined,
|
|
||||||
Playing,
|
|
||||||
Paused,
|
|
||||||
Idle,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EMusicPlayingRepeatStatus {
|
|
||||||
None,
|
|
||||||
All,
|
|
||||||
Once,
|
|
||||||
Max,
|
|
||||||
}
|
|
||||||
@@ -1,333 +0,0 @@
|
|||||||
import { JsPbMessage, Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Everything is taken from here:
|
|
||||||
* https://github.com/SteamDatabase/SteamTracking/blob/master/Protobufs/steammessages_clientnotificationtypes.proto
|
|
||||||
*/
|
|
||||||
export interface Notifications {
|
|
||||||
/**
|
|
||||||
* If `data` is deserialized, returns one of the following here: {@link Notifications}
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForNotifications(
|
|
||||||
callback: (notificationIndex: number, type: EClientNotificationType, data: ArrayBuffer) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EClientNotificationType {
|
|
||||||
Invalid,
|
|
||||||
DownloadComplete,
|
|
||||||
FriendInvite,
|
|
||||||
FriendInGame,
|
|
||||||
FriendOnline,
|
|
||||||
Achievement,
|
|
||||||
LowBattery,
|
|
||||||
SystemUpdate,
|
|
||||||
FriendMessage,
|
|
||||||
GroupChatMessage,
|
|
||||||
FriendInviteRollup,
|
|
||||||
FamilySharingDeviceAuthorizationChanged,
|
|
||||||
FamilySharingStopPlaying,
|
|
||||||
FamilySharingLibraryAvailable,
|
|
||||||
Screenshot,
|
|
||||||
CloudSyncFailure,
|
|
||||||
CloudSyncConflict,
|
|
||||||
IncomingVoiceChat,
|
|
||||||
ClaimSteamDeckRewards,
|
|
||||||
GiftReceived,
|
|
||||||
ItemAnnouncement,
|
|
||||||
HardwareSurvey,
|
|
||||||
LowDiskSpace,
|
|
||||||
BatteryTemperature,
|
|
||||||
DockUnsupportedFirmware,
|
|
||||||
PeerContentUpload,
|
|
||||||
CannotReadControllerGuideButton,
|
|
||||||
Comment,
|
|
||||||
Wishlist,
|
|
||||||
TradeOffer,
|
|
||||||
AsyncGame,
|
|
||||||
General,
|
|
||||||
HelpRequest,
|
|
||||||
OverlaySplashScreen,
|
|
||||||
BroadcastAvailableToWatch,
|
|
||||||
TimedTrialRemaining,
|
|
||||||
LoginRefresh,
|
|
||||||
MajorSale,
|
|
||||||
TimerExpired,
|
|
||||||
ModeratorMsg,
|
|
||||||
SteamInputActionSetChanged,
|
|
||||||
RemoteClientConnection,
|
|
||||||
RemoteClientStartStream,
|
|
||||||
StreamingClientConnection,
|
|
||||||
FamilyInvite,
|
|
||||||
PlaytimeWarning,
|
|
||||||
FamilyPurchaseRequest,
|
|
||||||
FamilyPurchaseRequestResponse,
|
|
||||||
ParentalFeatureRequest,
|
|
||||||
ParentalPlaytimeRequest,
|
|
||||||
GameRecordingError,
|
|
||||||
ParentalFeatureResponse,
|
|
||||||
ParentalPlaytimeResponse,
|
|
||||||
RequestedGameAdded,
|
|
||||||
ClipDownloaded,
|
|
||||||
GameRecordingStart,
|
|
||||||
GameRecordingStop,
|
|
||||||
GameRecordingUserMarkerAdded,
|
|
||||||
GameRecordingInstantClip,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum ESystemUpdateNotificationType {
|
|
||||||
Invalid,
|
|
||||||
Available,
|
|
||||||
NeedsRestart,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EGameRecordingErrorType {
|
|
||||||
General = 1,
|
|
||||||
LowDiskSpace,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationGroupChatMessage extends JsPbMessage {
|
|
||||||
tag(): string;
|
|
||||||
|
|
||||||
/** A Steam64 ID. */
|
|
||||||
steamid_sender(): string;
|
|
||||||
|
|
||||||
chat_group_id(): string;
|
|
||||||
|
|
||||||
chat_id(): string;
|
|
||||||
|
|
||||||
title(): string;
|
|
||||||
|
|
||||||
body(): string;
|
|
||||||
|
|
||||||
rawbody(): string;
|
|
||||||
|
|
||||||
icon(): string;
|
|
||||||
|
|
||||||
notificationid(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationFriendMessage extends JsPbMessage {
|
|
||||||
body(): string;
|
|
||||||
|
|
||||||
icon(): string;
|
|
||||||
|
|
||||||
notificationid(): number;
|
|
||||||
|
|
||||||
response_steamurl(): string;
|
|
||||||
|
|
||||||
/** A Steam64 ID. */
|
|
||||||
steamid(): string;
|
|
||||||
|
|
||||||
tag(): string;
|
|
||||||
|
|
||||||
title(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationCloudSyncFailure extends JsPbMessage {
|
|
||||||
appid(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationCloudSyncConflict extends JsPbMessage {
|
|
||||||
appid(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationScreenshot extends JsPbMessage {
|
|
||||||
screenshot_handle(): string;
|
|
||||||
description(): string;
|
|
||||||
local_url(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationDownloadCompleted extends JsPbMessage {
|
|
||||||
appid(): number;
|
|
||||||
dlc_appid(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationFriendInvite extends JsPbMessage {
|
|
||||||
steamid(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationFriendInviteRollup extends JsPbMessage {
|
|
||||||
new_invite_count(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationFriendInGame extends JsPbMessage {
|
|
||||||
steamid(): number;
|
|
||||||
game_name(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationFriendOnline extends JsPbMessage {
|
|
||||||
steamid(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationAchievement extends JsPbMessage {
|
|
||||||
achievement_id(): string;
|
|
||||||
appid(): number;
|
|
||||||
name(): string;
|
|
||||||
description(): string;
|
|
||||||
image_url(): string;
|
|
||||||
achieved(): boolean;
|
|
||||||
rtime_unlocked(): number;
|
|
||||||
min_progress(): number;
|
|
||||||
current_progress(): number;
|
|
||||||
max_progress(): number;
|
|
||||||
global_achieved_pct(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationLowBattery extends JsPbMessage {
|
|
||||||
pct_remaining(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationSystemUpdate extends JsPbMessage {
|
|
||||||
type(): ESystemUpdateNotificationType;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationFriendMessage extends JsPbMessage {
|
|
||||||
tag(): string;
|
|
||||||
steamid(): string;
|
|
||||||
title(): string;
|
|
||||||
body(): string;
|
|
||||||
icon(): string;
|
|
||||||
notificationid(): number;
|
|
||||||
response_steamurl(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationGroupChatMessage extends JsPbMessage {
|
|
||||||
tag(): string;
|
|
||||||
steamid_sender(): string;
|
|
||||||
chat_group_id(): string;
|
|
||||||
chat_id(): string;
|
|
||||||
title(): string;
|
|
||||||
body(): string;
|
|
||||||
rawbody(): string;
|
|
||||||
icon(): string;
|
|
||||||
notificationid(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationFamilySharingDeviceAuthorizationChanged extends JsPbMessage {
|
|
||||||
accountid_owner(): number;
|
|
||||||
authorized(): boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationFamilySharingStopPlaying extends JsPbMessage {
|
|
||||||
accountid_owner(): number;
|
|
||||||
seconds_remaining(): number;
|
|
||||||
appid(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationFamilySharingLibraryAvailable extends JsPbMessage {
|
|
||||||
accountid_owner(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationIncomingVoiceChat extends JsPbMessage {
|
|
||||||
steamid(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationClaimSteamDeckRewards extends JsPbMessage {
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationGiftReceived extends JsPbMessage {
|
|
||||||
sender_name(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationItemAnnouncement extends JsPbMessage {
|
|
||||||
new_item_count(): number;
|
|
||||||
new_backpack_items(): boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationHardwareSurveyPending extends JsPbMessage {
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationLowDiskSpace extends JsPbMessage {
|
|
||||||
folder_index(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationBatteryTemperature extends JsPbMessage {
|
|
||||||
temperature(): number;
|
|
||||||
notification_type(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationDockUnsupportedFirmware extends JsPbMessage {
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationPeerContentUpload extends JsPbMessage {
|
|
||||||
appid(): number;
|
|
||||||
peer_name(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationCannotReadControllerGuideButton extends JsPbMessage {
|
|
||||||
controller_index(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationOverlaySplashScreen extends JsPbMessage {
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationBroadcastAvailableToWatch extends JsPbMessage {
|
|
||||||
broadcast_permission(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationTimedTrialRemaining extends JsPbMessage {
|
|
||||||
appid(): number;
|
|
||||||
icon(): string;
|
|
||||||
offline(): boolean;
|
|
||||||
allowed_seconds(): number;
|
|
||||||
played_seconds(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationLoginRefresh extends JsPbMessage {
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationTimerExpired extends JsPbMessage {
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationSteamInputActionSetChanged extends JsPbMessage {
|
|
||||||
controller_index(): number;
|
|
||||||
action_set_name(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationRemoteClientConnection extends JsPbMessage {
|
|
||||||
machine(): string;
|
|
||||||
connected(): boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationRemoteClientStartStream extends JsPbMessage {
|
|
||||||
machine(): string;
|
|
||||||
game_name(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationStreamingClientConnection extends JsPbMessage {
|
|
||||||
hostname(): string;
|
|
||||||
machine(): string;
|
|
||||||
connected(): boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationPlaytimeWarning extends JsPbMessage {
|
|
||||||
type(): string;
|
|
||||||
playtime_remaining(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationGameRecordingError extends JsPbMessage {
|
|
||||||
game_id(): number;
|
|
||||||
error_type(): EGameRecordingErrorType;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationGameRecordingStart extends JsPbMessage {
|
|
||||||
game_id(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationGameRecordingStop extends JsPbMessage {
|
|
||||||
game_id(): number;
|
|
||||||
clip_id(): string;
|
|
||||||
duration_secs(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ClientNotificationGameRecordingUserMarkerAdded extends JsPbMessage {
|
|
||||||
game_id(): number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CClientNotificationGameRecordingInstantClip extends JsPbMessage {
|
|
||||||
game_id(): number;
|
|
||||||
clip_id(): string;
|
|
||||||
duration_secs(): number;
|
|
||||||
}
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
|
|
||||||
export interface OpenVR {
|
|
||||||
Device: VRDevice;
|
|
||||||
DeviceProperties: DeviceProperties;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws OperationResponse if mutual capabilities haven't been loaded.
|
|
||||||
*/
|
|
||||||
GetMutualCapabilities(): Promise<any>;
|
|
||||||
|
|
||||||
GetWebSecret(): Promise<string>;
|
|
||||||
|
|
||||||
InstallVR(): any;
|
|
||||||
|
|
||||||
Keyboard: Keyboard;
|
|
||||||
PathProperties: PathProperties;
|
|
||||||
|
|
||||||
QuitAllVR(): any;
|
|
||||||
|
|
||||||
RegisterForButtonPress: Unregisterable;
|
|
||||||
|
|
||||||
RegisterForHMDActivityLevelChanged(callback: (m_eHMDActivityLevel: EHMDActivityLevel) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForInstallDialog: Unregisterable;
|
|
||||||
|
|
||||||
RegisterForStartupErrors(callback: (clientError: any, initError: any, initErrorString: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForVRHardwareDetected(callback: (m_bHMDPresent: any, m_bHMDHardwareDetected: any, m_strHMDName: any) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForVRModeChange(callback: (m_bIsVRRunning: boolean) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForVRSceneAppChange(callback: (param0: number) => void): Unregisterable;
|
|
||||||
|
|
||||||
SetOverlayInteractionAffordance: any;
|
|
||||||
|
|
||||||
StartVR: any;
|
|
||||||
TriggerOverlayHapticEffect: any;
|
|
||||||
VRNotifications: VRNotifications;
|
|
||||||
VROverlay: VROverlay;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface VRDevice {
|
|
||||||
BIsConnected: any;
|
|
||||||
RegisterForDeviceConnectivityChange: Unregisterable;
|
|
||||||
|
|
||||||
RegisterForVRDeviceSeenRecently(callback: (m_bVRDeviceSeenRecently: any) => void): Unregisterable;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface DeviceProperties {
|
|
||||||
GetBoolDeviceProperty: any;
|
|
||||||
GetDoubleDeviceProperty: any;
|
|
||||||
GetFloatDeviceProperty: any;
|
|
||||||
GetInt32DeviceProperty: any;
|
|
||||||
GetStringDeviceProperty: any;
|
|
||||||
RegisterForDevicePropertyChange: Unregisterable;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Keyboard {
|
|
||||||
Hide(): any;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@link EKeyboardFlags} could be useful here
|
|
||||||
*/
|
|
||||||
RegisterForStatus(callback: (m_bIsKeyboardOpen: boolean, m_eKeyboardFlags: number, m_sInitialKeyboardText: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
SendDone(): any;
|
|
||||||
|
|
||||||
SendText(key: string): any; //???
|
|
||||||
Show(): any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface PathProperties {
|
|
||||||
GetBoolPathProperty: any;
|
|
||||||
GetDoublePathProperty: any;
|
|
||||||
GetFloatPathProperty: any;
|
|
||||||
GetInt32PathProperty: any;
|
|
||||||
GetStringPathProperty: any;
|
|
||||||
RegisterForPathPropertyChange: any;
|
|
||||||
SetBoolPathProperty: any;
|
|
||||||
SetDoublePathProperty: any;
|
|
||||||
SetFloatPathProperty: any;
|
|
||||||
SetInt32PathProperty: any;
|
|
||||||
SetStringPathProperty: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface VRNotifications {
|
|
||||||
HideCustomNotification: any;
|
|
||||||
RegisterForNotificationEvent: Unregisterable;
|
|
||||||
ShowCustomNotification: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface VROverlay {
|
|
||||||
HideDashboard: any;
|
|
||||||
|
|
||||||
IsDashboardVisible(): Promise<boolean>;
|
|
||||||
|
|
||||||
RegisterForButtonPress: Unregisterable;
|
|
||||||
RegisterForCursorMovement: Unregisterable;
|
|
||||||
RegisterForThumbnailChanged: Unregisterable;
|
|
||||||
RegisterForVisibilityChanged: Unregisterable;
|
|
||||||
ShowDashboard: any;
|
|
||||||
|
|
||||||
SwitchToDashboardOverlay(param0: string): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EHMDActivityLevel {
|
|
||||||
Unknown = -1,
|
|
||||||
Idle,
|
|
||||||
UserInteraction,
|
|
||||||
UserInteraction_Timeout,
|
|
||||||
Standby,
|
|
||||||
Idle_Timeout,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EKeyboardFlags {
|
|
||||||
Minimal = 1 << 0,
|
|
||||||
Modal = 1 << 1,
|
|
||||||
ShowArrowKeys = 1 << 2,
|
|
||||||
HideDoneKey = 1 << 3,
|
|
||||||
}
|
|
||||||
@@ -1,172 +0,0 @@
|
|||||||
import type { EBrowserType, ESteamRealm, EUIComposition, EUIMode, Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
export interface Overlay {
|
|
||||||
/**
|
|
||||||
* Destroys the gamepad UI desktop configurator window if open.
|
|
||||||
*/
|
|
||||||
DestroyGamePadUIDesktopConfiguratorWindow(): void;
|
|
||||||
|
|
||||||
GetOverlayBrowserInfo(): Promise<OverlayBrowserInfo[]>;
|
|
||||||
|
|
||||||
// steam://gamewebcallback
|
|
||||||
HandleGameWebCallback(url: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param protocol Something like {@link OverlayBrowserProtocols.strScheme}
|
|
||||||
*/
|
|
||||||
HandleProtocolForOverlayBrowser(appId: number, protocol: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when an overlay is activated from an app.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForActivateOverlayRequests(callback: (request: ActivateOverlayRequest) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when a microtransaction authorization is requested.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForMicroTxnAuth(
|
|
||||||
callback: (appId: number, microTxnId: string, realm: ESteamRealm, microTxnUrl: string) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when a microtransaction authorization is dismissed by the user in Steam's authorization page.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForMicroTxnAuthDismiss(callback: (appId: number, microTxnId: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForNotificationPositionChanged(
|
|
||||||
callback: (appId: number, position: ENotificationPosition, horizontalInset: number, verticalInset: number) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when an overlay is activated or closed.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForOverlayActivated(
|
|
||||||
callback: (overlayProcessPid: number, appId: number, active: boolean, param3: boolean) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when the overlay browser protocols change.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForOverlayBrowserProtocols(
|
|
||||||
callback: (browseProtocols: OverlayBrowserProtocols) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers **the** callback function to be called when the overlay browser information changes.
|
|
||||||
* @param callback The callback function to be called when the overlay browser information changes.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
* @remarks Do Not Use, this will break the overlay unless you know what you are doing.
|
|
||||||
*/
|
|
||||||
RegisterOverlayBrowserInfoChanged(callback: () => void): Unregisterable;
|
|
||||||
|
|
||||||
SetOverlayState(appId: string, state: EUIComposition): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
type OverlayRequestDialog_t =
|
|
||||||
| 'achievements'
|
|
||||||
| 'asyncnotificationsrequested'
|
|
||||||
| 'chat'
|
|
||||||
| 'community'
|
|
||||||
| 'friendadd'
|
|
||||||
| 'friendremove'
|
|
||||||
| 'friendrequestaccept'
|
|
||||||
| 'friendrequestignore'
|
|
||||||
| 'friendremove'
|
|
||||||
| 'jointrade'
|
|
||||||
| 'leaderboards'
|
|
||||||
| 'lobbyinvite'
|
|
||||||
| 'lobbyinviteconnectstring'
|
|
||||||
| 'officialgamegroup'
|
|
||||||
| 'requestplaytime'
|
|
||||||
| 'remoteplaytogether'
|
|
||||||
| 'remoteplaytogetherinvite'
|
|
||||||
| 'settings'
|
|
||||||
| 'stats'
|
|
||||||
| 'steamid'
|
|
||||||
| 'store';
|
|
||||||
|
|
||||||
// EPosition
|
|
||||||
export enum ENotificationPosition {
|
|
||||||
TopLeft,
|
|
||||||
TopRight,
|
|
||||||
BottomLeft,
|
|
||||||
BottomRight,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ActivateOverlayRequest {
|
|
||||||
/**
|
|
||||||
* The app ID that just had an overlay request.
|
|
||||||
*/
|
|
||||||
appid: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* `true` if webpage, and so {@link strDialog} will start with `https://`.
|
|
||||||
*/
|
|
||||||
bWebPage: boolean;
|
|
||||||
|
|
||||||
eFlag: EOverlayToStoreFlag;
|
|
||||||
|
|
||||||
eWebPageMode: EActivateGameOverlayToWebPageMode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Steam64 ID.
|
|
||||||
*/
|
|
||||||
steamidTarget: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Game invites string for `Friends.InviteUserToGame`.
|
|
||||||
*/
|
|
||||||
strConnectString: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Web page URL if starts with `https://`, so cast the type to `string` if it is.
|
|
||||||
*/
|
|
||||||
strDialog: OverlayRequestDialog_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* App ID of the requesting game.
|
|
||||||
*/
|
|
||||||
unRequestingAppID: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface OverlayBrowserInfo {
|
|
||||||
appID: number;
|
|
||||||
eBrowserType: EBrowserType;
|
|
||||||
eUIMode: EUIMode;
|
|
||||||
flDisplayScale?: number;
|
|
||||||
gameID: string;
|
|
||||||
nBrowserID: number;
|
|
||||||
nScreenHeight: number;
|
|
||||||
nScreenWidth: number;
|
|
||||||
/**
|
|
||||||
* The PID of the overlay process.
|
|
||||||
*/
|
|
||||||
unPID: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface OverlayBrowserProtocols {
|
|
||||||
unAppID: number;
|
|
||||||
strScheme: string;
|
|
||||||
bAdded: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EActivateGameOverlayToWebPageMode {
|
|
||||||
Default,
|
|
||||||
Modal,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EOverlayToStoreFlag {
|
|
||||||
None,
|
|
||||||
AddToCart,
|
|
||||||
AddToCartAndShow,
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
import { EResult, Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface for managing parental control settings.
|
|
||||||
*/
|
|
||||||
export interface Parental {
|
|
||||||
/**
|
|
||||||
* Locks the parental control settings.
|
|
||||||
*/
|
|
||||||
LockParentalLock(): void;
|
|
||||||
|
|
||||||
RegisterForParentalPlaytimeWarnings(callback: (time: number) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be invoked when parental settings change.
|
|
||||||
* @param callback The callback function to be invoked when parental settings change.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForParentalSettingsChanges(callback: (settings: ParentalSettings) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unlocks the parental lock with the provided PIN.
|
|
||||||
* @param pin The 4-digit PIN to unlock the parental lock.
|
|
||||||
* @returns a number representing the result of the unlock operation.
|
|
||||||
*/
|
|
||||||
UnlockParentalLock(pin: string, param1: boolean): Promise<EResult>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ParentalSettings {
|
|
||||||
ever_enabled: boolean;
|
|
||||||
locked: boolean;
|
|
||||||
/**
|
|
||||||
* If deserialized, returns {@link ParentalSettingsProtoMsg}.
|
|
||||||
*/
|
|
||||||
settings: ArrayBuffer;
|
|
||||||
strPlaintextPassword: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the parental settings and restrictions.
|
|
||||||
* @todo This whole thing is unconfirmed as I do not have access to parental
|
|
||||||
* stuff and things
|
|
||||||
*/
|
|
||||||
export interface ParentalSettingsProtoMsg {
|
|
||||||
steamid?: number;
|
|
||||||
applist_base_id?: number;
|
|
||||||
applist_base_description?: string;
|
|
||||||
/**
|
|
||||||
* Base list.
|
|
||||||
*/
|
|
||||||
applist_base: ParentalApp[];
|
|
||||||
/**
|
|
||||||
* Custom list of allowed applications.
|
|
||||||
*/
|
|
||||||
applist_custom: ParentalApp[];
|
|
||||||
/**
|
|
||||||
* @todo enum ?
|
|
||||||
*/
|
|
||||||
passwordhashtype?: number;
|
|
||||||
salt?: number;
|
|
||||||
passwordhash?: number;
|
|
||||||
/**
|
|
||||||
* Indicates whether parental settings are enabled.
|
|
||||||
*/
|
|
||||||
is_enabled?: boolean;
|
|
||||||
/**
|
|
||||||
* Bitmask representing enabled features.
|
|
||||||
* - Bit 0: Unknown (@todo Please provide more details if known)
|
|
||||||
* - Bit 1: Online content & features - Steam Store
|
|
||||||
* - Bit 2: Online content & features - Community-generated content
|
|
||||||
* - Bit 3: Online content & features - My online profile, screenshots, and achievements
|
|
||||||
* - Bit 4: Online content & features - Friends, chat, and groups
|
|
||||||
* - Bit 5-11: Unknown (@todo Please provide more details if known)
|
|
||||||
* - Bit 12: Library content - 0: Only games I choose, 1: All games
|
|
||||||
* @todo {@link EParentalFeature} ?
|
|
||||||
*/
|
|
||||||
enabled_features?: number;
|
|
||||||
/**
|
|
||||||
* Email for recovery (if applicable).
|
|
||||||
*/
|
|
||||||
recovery_email?: string;
|
|
||||||
is_site_license_lock?: boolean;
|
|
||||||
temporary_enabled_features?: number;
|
|
||||||
rtime_temporary_feature_expiration?: number;
|
|
||||||
playtime_restrictions?: ParentalPlaytimeRestrictions;
|
|
||||||
temporary_playtime_restrictions?: ParentalTemporaryPlaytimeRestrictions;
|
|
||||||
excluded_store_content_descriptors: number[];
|
|
||||||
excluded_community_content_descriptors: number[];
|
|
||||||
utility_appids: number[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ParentalApp {
|
|
||||||
appid: number;
|
|
||||||
is_allowed: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ParentalPlaytimeDay {
|
|
||||||
allowed_time_windows?: number;
|
|
||||||
allowed_daily_minutes?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ParentalPlaytimeRestrictions {
|
|
||||||
apply_playtime_restrictions?: boolean;
|
|
||||||
playtime_days: ParentalPlaytimeDay[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ParentalTemporaryPlaytimeRestrictions {
|
|
||||||
restrictions?: ParentalPlaytimeDay;
|
|
||||||
rtime_expires?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EParentalFeature {
|
|
||||||
Invalid,
|
|
||||||
Store,
|
|
||||||
Community,
|
|
||||||
Profile,
|
|
||||||
Friends,
|
|
||||||
News,
|
|
||||||
Trading,
|
|
||||||
Settings,
|
|
||||||
Console,
|
|
||||||
Browser,
|
|
||||||
ParentalSetup,
|
|
||||||
Library,
|
|
||||||
Test,
|
|
||||||
SiteLicense,
|
|
||||||
KioskMode,
|
|
||||||
Max,
|
|
||||||
}
|
|
||||||
@@ -1,342 +0,0 @@
|
|||||||
import {EControllerType} from "./Input";
|
|
||||||
import { EParentalFeature } from "./Parental";
|
|
||||||
import { EResult, Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
export interface RemotePlay {
|
|
||||||
/**
|
|
||||||
* @param param1 TODO: Something about restrictions countries ? maybe it's games
|
|
||||||
*/
|
|
||||||
BCanAcceptInviteForGame(gameId: string, param1: string): Promise<boolean>;
|
|
||||||
BCanCreateInviteForGame(gameId: string, param1: boolean): Promise<boolean>;
|
|
||||||
|
|
||||||
BRemotePlayTogetherGuestOnPhoneOrTablet(steam64Id: string, guestId: number): Promise<boolean>;
|
|
||||||
|
|
||||||
BRemotePlayTogetherGuestSupported(): Promise<boolean>;
|
|
||||||
|
|
||||||
// TODO: both calls have 1 arg, but it requires 2
|
|
||||||
CancelInviteAndSession(steam64Id: string, param1: number): Promise<EResult>;
|
|
||||||
|
|
||||||
CancelInviteAndSessionWithGuestID(steam64Id: string, guestId: number): Promise<EResult>;
|
|
||||||
|
|
||||||
CancelRemoteClientPairing(): void;
|
|
||||||
|
|
||||||
CloseGroup(): Promise<number>;
|
|
||||||
|
|
||||||
CreateGroup(param0: string): Promise<EResult>;
|
|
||||||
|
|
||||||
CreateInviteAndSession(steam64Id: string, param1: string): Promise<EResult>;
|
|
||||||
|
|
||||||
CreateInviteAndSessionWithGuestID(steam64Id: string, guestId: number, param2: string): Promise<EResult>;
|
|
||||||
|
|
||||||
GetClientID(): Promise<string>;
|
|
||||||
|
|
||||||
// TODO: -1 no preference? no idea where the settings are anyway lol
|
|
||||||
GetClientStreamingBitrate(): Promise<number>;
|
|
||||||
GetClientStreamingQuality(): Promise<number>;
|
|
||||||
GetControllerType(controllerIndex: number): Promise<EControllerType>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns an integer from 0 to 100.
|
|
||||||
*/
|
|
||||||
GetGameSystemVolume(): Promise<number>;
|
|
||||||
|
|
||||||
GetPerUserInputSettings(steam64Id: string): Promise<RemotePlayInputSettings>;
|
|
||||||
|
|
||||||
GetPerUserInputSettingsWithGuestID(steam64Id: string, guestId: number): Promise<RemotePlayInputSettings>;
|
|
||||||
|
|
||||||
IdentifyController(nControllerIndex: number): void;
|
|
||||||
|
|
||||||
InstallAudioDriver(): void;
|
|
||||||
InstallInputDriver(): void;
|
|
||||||
MoveControllerToSlot(controllerIndex: number, slot: number): void;
|
|
||||||
RegisterForAdditionalParentalBlocks(callback: (blocks: EParentalFeature[]) => void): Unregisterable;
|
|
||||||
RegisterForAudioDriverPrompt(callback: () => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @todo no mentions of it in Steam code
|
|
||||||
*/
|
|
||||||
RegisterForBitrateOverride: Unregisterable;
|
|
||||||
RegisterForClearControllers(callback: () => void): Unregisterable;
|
|
||||||
RegisterForControllerIndexSet(
|
|
||||||
callback: (steamid: string, slot: number, guestid: number) => void
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForDevicesChanges(callback: (devices: RemotePlayDevice[]) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForGroupCreated(callback: (steamId: string, appId: string) => void): Unregisterable;
|
|
||||||
RegisterForGroupDisbanded(callback: () => void): Unregisterable;
|
|
||||||
RegisterForInputDriverPrompt(callback: () => void): Unregisterable;
|
|
||||||
RegisterForInputDriverRestartNotice(callback: () => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForInputUsed(
|
|
||||||
callback: (steam64Id: string, type: EClientUsedInputType, guestId: number) => void,
|
|
||||||
): Unregisterable; // only fires on host
|
|
||||||
|
|
||||||
RegisterForInviteResult(
|
|
||||||
callback: (
|
|
||||||
steamId: string,
|
|
||||||
param1: any,
|
|
||||||
result: ERemoteClientLaunch,
|
|
||||||
) => void
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForNetworkUtilizationUpdate(
|
|
||||||
callback: (steam64Id: string, guestId: number, networkUtilization: number, networkDuration: number) => void,
|
|
||||||
): Unregisterable; // only fires on host
|
|
||||||
|
|
||||||
RegisterForPlaceholderStateChanged(callback: (isShowingPlaceholder: boolean) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForPlayerInputSettingsChanged(
|
|
||||||
callback: (steamId: string, settings: RemotePlayInputSettings, guestId: number) => void
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForQualityOverride(callback: (hostStreamingQualityOverride: number) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForRemoteClientLaunchFailed(callback: (state: ERemoteClientLaunch) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForRemoteClientStarted(callback: (steam64Id: string, appId: string) => void): Unregisterable; // only fires on client
|
|
||||||
|
|
||||||
RegisterForRemoteClientStopped(callback: (steam64Id: string, appId: string) => void): Unregisterable; // only fires on client
|
|
||||||
|
|
||||||
RegisterForRemoteDeviceAuthorizationCancelled(callback: () => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForRemoteDeviceAuthorizationRequested(callback: (device: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForRemoteDevicePairingPINChanged(callback: (device: string, pin: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForRestrictedSessionChanges(callback: (restrictedSession: boolean) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForSessionStopped(callback: (steam64Id: string, guestId: number, avatarHash: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForSessionStarted(callback: (steam64Id: string, gameId: string, guestId: number) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForSessionStopped(callback: (steam64Id: string, guestId: number) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForSettingsChanges(callback: (remotePlaySettings: RemotePlaySettings) => void): Unregisterable;
|
|
||||||
|
|
||||||
SetClientStreamingBitrate(bitrate: number): void;
|
|
||||||
|
|
||||||
SetClientStreamingQuality(quality: number): void;
|
|
||||||
|
|
||||||
SetGameSystemVolume(volume: number): void;
|
|
||||||
|
|
||||||
SetPerUserControllerInputEnabled(steam64Id: string, enabled: boolean): void;
|
|
||||||
|
|
||||||
SetPerUserControllerInputEnabledWithGuestID(steam64Id: string, guestId: number, enabled: boolean): void;
|
|
||||||
|
|
||||||
SetPerUserKeyboardInputEnabled(steam64Id: string, enabled: boolean): void;
|
|
||||||
|
|
||||||
SetPerUserKeyboardInputEnabledWithGuestID(steam64Id: string, guestId: number, enabled: boolean): void;
|
|
||||||
|
|
||||||
SetPerUserMouseInputEnabled(steam64Id: string, enabled: boolean): void;
|
|
||||||
|
|
||||||
SetPerUserMouseInputEnabledWithGuestID(steam64Id: string, guestId: number, enabled: boolean): void;
|
|
||||||
|
|
||||||
SetRemoteDeviceAuthorized(param0: boolean, param1: string): void;
|
|
||||||
|
|
||||||
SetRemoteDevicePIN(pin: string): void;
|
|
||||||
|
|
||||||
SetRemotePlayEnabled(enabled: boolean): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param base64 Serialized base64 message from {@link StreamingClientConfig}.
|
|
||||||
*/
|
|
||||||
SetStreamingClientConfig(base64: string, sessionId: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enables advanced client options.
|
|
||||||
*/
|
|
||||||
SetStreamingClientConfigEnabled(value: boolean): void;
|
|
||||||
|
|
||||||
SetStreamingDesktopToRemotePlayTogetherEnabled(enabled: boolean): void;
|
|
||||||
|
|
||||||
SetStreamingP2PScope(scope: EStreamP2PScope): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param base64 Serialized base64 message from {@link StreamingServerConfig}.
|
|
||||||
*/
|
|
||||||
SetStreamingServerConfig(base64: string, sessionId: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enables advanced host options.
|
|
||||||
*/
|
|
||||||
SetStreamingServerConfigEnabled(value: boolean): void;
|
|
||||||
|
|
||||||
StopStreamingClient(): void;
|
|
||||||
|
|
||||||
StopStreamingSession(id: number): void;
|
|
||||||
StopStreamingSessionAndSuspendDevice(id: number): void;
|
|
||||||
|
|
||||||
UnlockH264(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unpairs all devices.
|
|
||||||
*/
|
|
||||||
UnpairRemoteDevices(): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EClientUsedInputType {
|
|
||||||
Keyboard,
|
|
||||||
Mouse,
|
|
||||||
Controller,
|
|
||||||
Max,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface RemotePlayDevice {
|
|
||||||
clientId: string;
|
|
||||||
clientName: string;
|
|
||||||
status: string; // "Connected", "Paired",
|
|
||||||
formFactor: number;
|
|
||||||
unStreamingSessionID: number;
|
|
||||||
bCanSteamVR: boolean;
|
|
||||||
bCanSuspend: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface RemotePlayInputSettings {
|
|
||||||
bKeyboardEnabled: true;
|
|
||||||
bMouseEnabled: true;
|
|
||||||
bControllerEnabled: true;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface RemotePlaySettings {
|
|
||||||
bAV1DecodeAvailable: boolean;
|
|
||||||
bHEVCDecodeAvailable: boolean;
|
|
||||||
bRemotePlayDisabledBySystemPolicy: boolean;
|
|
||||||
bRemotePlaySupported: boolean;
|
|
||||||
bRemotePlayEnabled: boolean;
|
|
||||||
eRemotePlayP2PScope: EStreamP2PScope;
|
|
||||||
bRemotePlayServerConfigAvailable: boolean;
|
|
||||||
bRemotePlayServerConfigEnabled: boolean;
|
|
||||||
bRemotePlayClientConfigEnabled: boolean;
|
|
||||||
unStreamingSessionID: number;
|
|
||||||
strStreamingClientName: string;
|
|
||||||
/**
|
|
||||||
* If deserialized, returns {@link StreamingClientConfig}.
|
|
||||||
*/
|
|
||||||
RemotePlayClientConfig: StreamingClientConfig;
|
|
||||||
/**
|
|
||||||
* If deserialized, returns {@link StreamingServerConfig}.
|
|
||||||
*/
|
|
||||||
RemotePlayServerConfig: ArrayBuffer;
|
|
||||||
nDefaultAudioChannels: number;
|
|
||||||
nAutomaticResolutionX: number;
|
|
||||||
nAutomaticResolutionY: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StreamingClientConfig {
|
|
||||||
quality?: EStreamQualityPreference;
|
|
||||||
desired_resolution_x?: number;
|
|
||||||
desired_resolution_y?: number;
|
|
||||||
desired_framerate_numerator?: number;
|
|
||||||
desired_framerate_denominator?: number;
|
|
||||||
desired_bitrate_kbps?: number;
|
|
||||||
enable_hardware_decoding?: boolean;
|
|
||||||
enable_performance_overlay?: boolean;
|
|
||||||
enable_video_streaming?: boolean;
|
|
||||||
enable_audio_streaming?: boolean;
|
|
||||||
enable_input_streaming?: boolean;
|
|
||||||
audio_channels?: number;
|
|
||||||
enable_video_hevc?: boolean;
|
|
||||||
enable_performance_icons?: boolean;
|
|
||||||
enable_microphone_streaming?: boolean;
|
|
||||||
controller_overlay_hotkey?: string;
|
|
||||||
enable_touch_controller_OBSOLETE?: boolean;
|
|
||||||
p2p_scope?: EStreamP2PScope;
|
|
||||||
enable_audio_uncompressed?: boolean;
|
|
||||||
display_limit?: StreamVideoLimit;
|
|
||||||
quality_limit?: StreamVideoLimit;
|
|
||||||
runtime_limit?: StreamVideoLimit;
|
|
||||||
decoder_limit: StreamVideoLimit[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StreamingServerConfig {
|
|
||||||
change_desktop_resolution?: boolean;
|
|
||||||
dynamically_adjust_resolution_OBSOLETE?: boolean;
|
|
||||||
enable_capture_nvfbc?: boolean;
|
|
||||||
enable_hardware_encoding_nvidia_OBSOLETE?: boolean;
|
|
||||||
enable_hardware_encoding_amd_OBSOLETE?: boolean;
|
|
||||||
enable_hardware_encoding_intel_OBSOLETE?: boolean;
|
|
||||||
software_encoding_threads?: number;
|
|
||||||
enable_traffic_priority?: boolean;
|
|
||||||
host_play_audio?: EStreamHostPlayAudioPreference;
|
|
||||||
enable_hardware_encoding?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StreamVideoLimit {
|
|
||||||
codec?: EStreamVideoCodec;
|
|
||||||
mode?: StreamVideoMode;
|
|
||||||
bitrate_kbps?: number;
|
|
||||||
burst_bitrate_kbps?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StreamVideoMode {
|
|
||||||
width?: number;
|
|
||||||
height?: number;
|
|
||||||
refresh_rate?: number;
|
|
||||||
refresh_rate_numerator?: number;
|
|
||||||
refresh_rate_denominator?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum ERemoteClientLaunch {
|
|
||||||
OK = 1,
|
|
||||||
Fail,
|
|
||||||
RequiresUI,
|
|
||||||
RequiresLaunchOption,
|
|
||||||
RequiresEULA,
|
|
||||||
Timeout,
|
|
||||||
StreamTimeout,
|
|
||||||
StreamClientFail,
|
|
||||||
OtherGameRunning,
|
|
||||||
DownloadStarted,
|
|
||||||
DownloadNoSpace,
|
|
||||||
DownloadFiltered,
|
|
||||||
DownloadRequiresUI,
|
|
||||||
AccessDenied,
|
|
||||||
NetworkError,
|
|
||||||
Progress,
|
|
||||||
ParentalUnlockFailed,
|
|
||||||
ScreenLocked,
|
|
||||||
Unsupported,
|
|
||||||
DisabledLocal,
|
|
||||||
DisabledRemote,
|
|
||||||
Broadcasting,
|
|
||||||
Busy,
|
|
||||||
DriversNotInstalled,
|
|
||||||
TransportUnavailable,
|
|
||||||
Canceled,
|
|
||||||
Invisible,
|
|
||||||
RestrictedCountry,
|
|
||||||
Unauthorized,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EStreamVideoCodec {
|
|
||||||
None,
|
|
||||||
Raw,
|
|
||||||
VP8,
|
|
||||||
VP9,
|
|
||||||
H264,
|
|
||||||
HEVC,
|
|
||||||
ORBX1,
|
|
||||||
ORBX2,
|
|
||||||
AV1,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EStreamHostPlayAudioPreference {
|
|
||||||
Default,
|
|
||||||
Always,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EStreamQualityPreference {
|
|
||||||
Automatic = -1,
|
|
||||||
Fast = 1,
|
|
||||||
Balanced,
|
|
||||||
Beautiful,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EStreamP2PScope {
|
|
||||||
Automatic,
|
|
||||||
Disabled,
|
|
||||||
OnlyMe,
|
|
||||||
Friends,
|
|
||||||
Everyone,
|
|
||||||
}
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
/**
|
|
||||||
* Interface for managing screenshots.
|
|
||||||
*/
|
|
||||||
export interface Screenshots {
|
|
||||||
/**
|
|
||||||
* Deletes a local screenshot.
|
|
||||||
* @param appId The ID of the application.
|
|
||||||
* @param screenshotIndex The index of the local screenshot.
|
|
||||||
* @returns a boolean value indicating whether the deletion was successful.
|
|
||||||
*/
|
|
||||||
DeleteLocalScreenshot(appId: string, screenshotIndex: number): Promise<boolean>;
|
|
||||||
|
|
||||||
DeleteLocalScreenshots(screenshots: ScreenshotToDelete[]): Promise<ScreenshotDeletionResponse>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves all local screenshots for all applications.
|
|
||||||
* @returns an array of Screenshot objects.
|
|
||||||
*/
|
|
||||||
GetAllAppsLocalScreenshots(): Promise<Screenshot[]>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the count of all local screenshots for all applications.
|
|
||||||
* @returns the count of local screenshots.
|
|
||||||
*/
|
|
||||||
GetAllAppsLocalScreenshotsCount(): Promise<number>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves a range of local screenshots for all applications.
|
|
||||||
* @param start The starting index of the screenshot range.
|
|
||||||
* @param end The ending index of the screenshot range.
|
|
||||||
* @returns an array of Screenshot objects within the specified range.
|
|
||||||
*/
|
|
||||||
GetAllAppsLocalScreenshotsRange(start: number, end: number): Promise<Screenshot[]>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves all local screenshots.
|
|
||||||
* @returns an array of Screenshot objects.
|
|
||||||
*/
|
|
||||||
GetAllLocalScreenshots(): Promise<Screenshot[]>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the game associated with a specific local screenshot index.
|
|
||||||
* @param screenshotIndex The index of the local screenshot.
|
|
||||||
* @returns the ID of the game associated with the screenshot.
|
|
||||||
*/
|
|
||||||
GetGameWithLocalScreenshots(screenshotIndex: number): Promise<number>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the last taken local screenshot.
|
|
||||||
* @returns the last taken local screenshot.
|
|
||||||
*/
|
|
||||||
GetLastScreenshotTaken(): Promise<Screenshot>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves a specific local screenshot for an application.
|
|
||||||
* @param appId The ID of the application.
|
|
||||||
* @param screenshotIndex The index of the local screenshot.
|
|
||||||
* @returns the requested local screenshot.
|
|
||||||
*/
|
|
||||||
GetLocalScreenshotByHandle(appId: string, screenshotIndex: number): Promise<Screenshot>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the count of local screenshots for a specific application.
|
|
||||||
* @param appId The ID of the application.
|
|
||||||
* @returns the count of local screenshots for the application.
|
|
||||||
*/
|
|
||||||
GetLocalScreenshotCount(appId: number): Promise<number>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the path of a screenshot.
|
|
||||||
* @param appId The ID of the application.
|
|
||||||
* @param hHandle The handle of the screenshot.
|
|
||||||
* @returns the screenshot path or the screenshot directory if no such handle.
|
|
||||||
*/
|
|
||||||
GetLocalScreenshotPath(appId: number, hHandle: number): Promise<string>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the number of games with local screenshots.
|
|
||||||
* @returns the number of games with local screenshots.
|
|
||||||
*/
|
|
||||||
GetNumGamesWithLocalScreenshots(): Promise<number>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets total screenshot usage in the specified library folder.
|
|
||||||
* @param path Library folder path.
|
|
||||||
* @returns the number of taken space in bytes.
|
|
||||||
*/
|
|
||||||
GetTotalDiskSpaceUsage(path: string): Promise<number>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens a local screenshot in the system image viewer.
|
|
||||||
* If the screenshot index is invalid, this function opens the screenshots directory for the specified application ID.
|
|
||||||
* @param appId The ID of the application.
|
|
||||||
* @param screenshotIndex The index of the local screenshot.
|
|
||||||
*/
|
|
||||||
ShowScreenshotInSystemViewer(appId: string, screenshotIndex: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the folder containing local screenshots for a specific application.
|
|
||||||
* @param appId The ID of the application.
|
|
||||||
*/
|
|
||||||
ShowScreenshotsOnDisk(appId: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Uploads a local screenshot.
|
|
||||||
* @param appId The ID of the application.
|
|
||||||
* @param localScreenshot_hHandle The handle of the local screenshot.
|
|
||||||
* @param filePrivacyState The privacy state of the screenshot file.
|
|
||||||
* @returns a boolean value indicating whether the upload was successful.
|
|
||||||
*/
|
|
||||||
UploadLocalScreenshot(
|
|
||||||
appId: string,
|
|
||||||
localScreenshot_hHandle: number,
|
|
||||||
filePrivacyState: EUCMFilePrivacyState,
|
|
||||||
): Promise<boolean>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Screenshot {
|
|
||||||
nAppID: number;
|
|
||||||
strGameID: string;
|
|
||||||
hHandle: number;
|
|
||||||
nWidth: number;
|
|
||||||
nHeight: number;
|
|
||||||
nCreated: number; // timestamp
|
|
||||||
ePrivacy: EUCMFilePrivacyState;
|
|
||||||
strCaption: string;
|
|
||||||
bSpoilers: boolean;
|
|
||||||
strUrl: string;
|
|
||||||
bUploaded: boolean;
|
|
||||||
ugcHandle: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ScreenshotToDelete {
|
|
||||||
gameID: string;
|
|
||||||
rgHandles: number[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ScreenshotDeletionResponse {
|
|
||||||
bSuccess: boolean;
|
|
||||||
rgFailedRequestIndices: number[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EUCMFilePrivacyState {
|
|
||||||
Invalid = -1,
|
|
||||||
Private = 1 << 1,
|
|
||||||
FriendsOnly = 1 << 2,
|
|
||||||
Public = 1 << 3,
|
|
||||||
Unlisted = 1 << 4,
|
|
||||||
}
|
|
||||||
@@ -1,372 +0,0 @@
|
|||||||
import { OperationResponse, Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents functionality for the server browser.
|
|
||||||
*/
|
|
||||||
export interface ServerBrowser {
|
|
||||||
/**
|
|
||||||
* Adds a favorite server.
|
|
||||||
* @param server The server to add.
|
|
||||||
* @returns an empty string if successful, `Invalid/missing IPv4?` if failed.
|
|
||||||
*/
|
|
||||||
AddFavoriteServer(server: GameServer): Promise<string>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds a favorite server by IP.
|
|
||||||
* @param ip The IP to add to favorite servers.
|
|
||||||
* @returns an empty string if successful, localization string if failed.
|
|
||||||
*/
|
|
||||||
AddFavoriteServersByIP(ip: string): Promise<string>;
|
|
||||||
|
|
||||||
CancelServerQuery(dialogId: number, queryServer: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Connects to a server from a given dialog.
|
|
||||||
* @param dialogId The dialog ID to use.
|
|
||||||
* @param password Server password, empty if none.
|
|
||||||
* @returns a connection status.
|
|
||||||
*/
|
|
||||||
ConnectToServer(dialogId: number, password: string): Promise<EJoinServerError>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a server info dialog for the server your friend is currently playing on.
|
|
||||||
* @param pid 0
|
|
||||||
* @param steamId A Steam64 ID of a friend.
|
|
||||||
*/
|
|
||||||
CreateFriendGameInfoDialog(pid: number, steamId: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a server info dialog.
|
|
||||||
* @param ip The server IP.
|
|
||||||
* @param port The server port.
|
|
||||||
* @param queryPort
|
|
||||||
* @returns the created dialog ID.
|
|
||||||
*/
|
|
||||||
CreateServerGameInfoDialog(ip: string, port: number, queryPort: number): Promise<number>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the server list.
|
|
||||||
* @param appId The game ID, 0 for every game.
|
|
||||||
* @param queryType The tab to use.
|
|
||||||
* @param filters Server filters.
|
|
||||||
* @param serverCallback What to do with the found server?
|
|
||||||
* @param requestCompletedCallback The callback function to be called when the request is completed.
|
|
||||||
* @returns the current server list request ID.
|
|
||||||
* @throws Throws if the query type is unknown.
|
|
||||||
* @throws Throws if the filter list isn't key/value pairs, i.e. of an even length.
|
|
||||||
* @remarks Stops at 10000 if there are more servers to be found.
|
|
||||||
* @example
|
|
||||||
* Filter examples, may be combined:
|
|
||||||
* ```
|
|
||||||
* [ 'gamedir', 'cstrike' ] // Doesn't work?
|
|
||||||
* [ 'hasplayers', '1' ] // Only works with "1"?
|
|
||||||
* [ 'notfull', '1' ] // Doesn't work?
|
|
||||||
* [ 'map', 'cs_office' ] // Has to be an exact match!
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
The enum in question:
|
|
||||||
|
|
||||||
(t =
|
|
||||||
'lan' == this.id
|
|
||||||
? this.all_servers.length > 0
|
|
||||||
? '#ServerBrowser_NoServersMatch'
|
|
||||||
: '#ServerBrowser_NoLanServers'
|
|
||||||
: 'internet' == this.id
|
|
||||||
? this.all_servers.length > 0
|
|
||||||
? '#ServerBrowser_NoInternetGamesMatch'
|
|
||||||
: e == l.zS.k_EServerFailedToRespond
|
|
||||||
? '#ServerBrowser_MasterServerNotResponsive'
|
|
||||||
: e == l.zS.k_ENoServersListedOnMasterServer
|
|
||||||
? '#ServerBrowser_MasterServerHasNoServersListed'
|
|
||||||
: '#ServerBrowser_NoInternetGamesResponded'
|
|
||||||
: 'favorites' == this.id
|
|
||||||
? this.all_servers.length > 0
|
|
||||||
? '#ServerBrowser_NoServersMatch'
|
|
||||||
: '#ServerBrowser_NoFavoriteServers'
|
|
||||||
: 'history' == this.id
|
|
||||||
? this.all_servers.length > 0
|
|
||||||
? '#ServerBrowser_NoHistoryServersMatch'
|
|
||||||
: '#ServerBrowser_NoServersPlayed'
|
|
||||||
: 'friends' == this.id
|
|
||||||
? this.all_servers.length > 0
|
|
||||||
? '#ServerBrowser_NoServersMatch'
|
|
||||||
: '#ServerBrowser_NoFriendsServers'
|
|
||||||
: 'BUGBUG'),
|
|
||||||
*/
|
|
||||||
CreateServerListRequest(
|
|
||||||
appId: number,
|
|
||||||
queryType: ServerBrowserTab_t,
|
|
||||||
filters: string[],
|
|
||||||
serverCallback: (server: GameServer) => void,
|
|
||||||
requestCompletedCallback: (response: number) => void,
|
|
||||||
): Promise<number | OperationResponse>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroys the game info dialog functions (but not the window).
|
|
||||||
* @param dialogId The dialog ID to use.
|
|
||||||
* @remarks ServerBrowser.CancelServerQuery may throw if it tries to ping the server.
|
|
||||||
*/
|
|
||||||
DestroyGameInfoDialog(dialogId: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops retrieving the server list.
|
|
||||||
* @param activeServerListRequestId The active server request ID to use.
|
|
||||||
*/
|
|
||||||
DestroyServerListRequest(activeServerListRequestId: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a list of games that support the server browser feature.
|
|
||||||
* @returns a list of games.
|
|
||||||
*/
|
|
||||||
GetMultiplayerGames(): Promise<ServerBrowserGame[]>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the server browser preferences.
|
|
||||||
* @returns server browser preferences.
|
|
||||||
*/
|
|
||||||
GetServerListPreferences(): Promise<ServerBrowserPreferences>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pings the server of a specified dialog ID.
|
|
||||||
* @param dialogId The dialog ID to use.
|
|
||||||
*/
|
|
||||||
PingServer(dialogId: number): Promise<number | OperationResponse>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when a server gets added to favorite servers.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForFavorites(callback: (list: ServerBrowserFavoritesAndHistory) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when idk
|
|
||||||
* @param dialogId The dialog ID to use.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForFriendGamePlayed(
|
|
||||||
dialogId: number,
|
|
||||||
callback: (server: ServerBrowserFriendServer) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when a server info dialog opens.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForGameInfoDialogs(callback: (dialogs: ServerBrowserDialog[]) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when player details get requested.
|
|
||||||
* @param dialogId The dialog ID to use.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForPlayerDetails(
|
|
||||||
dialogId: number,
|
|
||||||
callback: (player: PlayerDetails) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when a server gets pinged.
|
|
||||||
* @param dialogId The dialog ID to use.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForServerInfo(dialogId: number, callback: (server: GameServer) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes a server from favorite servers.
|
|
||||||
* @param server The server to remove.
|
|
||||||
*/
|
|
||||||
RemoveFavoriteServer(server: GameServer): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes a server from history of played servers.
|
|
||||||
* @param server The server to remove.
|
|
||||||
*/
|
|
||||||
RemoveHistoryServer(server: GameServer): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Requests player details for a specific dialog.
|
|
||||||
* @param dialogId The dialog ID to use.
|
|
||||||
*/
|
|
||||||
RequestPlayerDetails(dialogId: number): Promise<number | OperationResponse>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the server browser preferences.
|
|
||||||
* @param prefs Server list preferences.
|
|
||||||
*/
|
|
||||||
SetServerListPreferences(prefs: ServerBrowserPreferences): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export type ServerBrowserTab_t = 'internet' | 'favorites' | 'history' | 'lan' | 'friends';
|
|
||||||
|
|
||||||
export interface ServerBrowserGame {
|
|
||||||
/** The ID of the game. */
|
|
||||||
appid: number;
|
|
||||||
/** The ID of the game. */
|
|
||||||
gameid: string;
|
|
||||||
/** The game folder. */
|
|
||||||
gamedir: string;
|
|
||||||
/** The game's name. */
|
|
||||||
name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ServerBrowserPreferences {
|
|
||||||
GameList: string;
|
|
||||||
filters: ServerBrowserTabFilters;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type ServerBrowserTabFilters = {
|
|
||||||
[tab in ServerBrowserTab_t]: ServerBrowserGameFilter;
|
|
||||||
};
|
|
||||||
|
|
||||||
export interface ServerBrowserGameFilter {
|
|
||||||
/** Has users playing */
|
|
||||||
NoEmpty: boolean;
|
|
||||||
/** Server not full */
|
|
||||||
NoFull: boolean;
|
|
||||||
/** Is not password protected */
|
|
||||||
NoPassword: boolean;
|
|
||||||
/** Anti-cheat */
|
|
||||||
Secure: EServerBrowserGameFilterAntiCheat;
|
|
||||||
/** The ID of the game */
|
|
||||||
appid: number;
|
|
||||||
/** The game folder */
|
|
||||||
game: string;
|
|
||||||
/** Map filter */
|
|
||||||
map: string;
|
|
||||||
/** Latency */
|
|
||||||
ping: EServerBrowserGameFilterPing;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EServerBrowserGameFilterAntiCheat {
|
|
||||||
All,
|
|
||||||
Secure,
|
|
||||||
NotSecure,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EServerBrowserGameFilterPing {
|
|
||||||
All,
|
|
||||||
LessThan50 = 50,
|
|
||||||
LessThan100 = 100,
|
|
||||||
LessThan150 = 150,
|
|
||||||
LessThan250 = 250,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ServerBrowserFavoritesAndHistory {
|
|
||||||
favorites: GameServer[];
|
|
||||||
history: GameServer[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ServerBrowserFriendServer {
|
|
||||||
/** The ID of the game. */
|
|
||||||
appid: number;
|
|
||||||
/** Non-Steam server? */
|
|
||||||
bNonSteamServer: boolean;
|
|
||||||
gameText: string;
|
|
||||||
/** The ID of the game. */
|
|
||||||
gameid: string;
|
|
||||||
steamIDLobby: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ServerBrowserDialog {
|
|
||||||
dialogID: number;
|
|
||||||
ip: number;
|
|
||||||
port: number;
|
|
||||||
queryPort: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface GameServer {
|
|
||||||
/** The ID of the game. */
|
|
||||||
appid: number;
|
|
||||||
/** Do not refresh if had unsuccessful response? */
|
|
||||||
bDoNotRefresh?: boolean;
|
|
||||||
/** Found the server? */
|
|
||||||
bHadSuccessfulResponse: boolean;
|
|
||||||
/** Has password? */
|
|
||||||
bPassword: boolean;
|
|
||||||
/** Is VAC secured? */
|
|
||||||
bSecure: boolean;
|
|
||||||
/** How many bot players there currently are. */
|
|
||||||
botPlayers: number;
|
|
||||||
/** The server's game name/description. */
|
|
||||||
gameDesc: string;
|
|
||||||
/** The game folder. */
|
|
||||||
gameDir: string;
|
|
||||||
/** Server tags, separated by a comma. */
|
|
||||||
gameTags: string;
|
|
||||||
/** The server IP. */
|
|
||||||
ip: string;
|
|
||||||
/** Last time played as a UNIX timestamp. */
|
|
||||||
lastPlayed: number;
|
|
||||||
/** Current server map. */
|
|
||||||
map: string;
|
|
||||||
/** Max players on the server. */
|
|
||||||
maxPlayers: number;
|
|
||||||
/** The server name. */
|
|
||||||
name: string;
|
|
||||||
/** The latency to the server. */
|
|
||||||
ping: number;
|
|
||||||
/** How many players there currently are. */
|
|
||||||
players: number;
|
|
||||||
/** The server port. */
|
|
||||||
port: number;
|
|
||||||
queryPort: number;
|
|
||||||
/** The server's game version it is running on. */
|
|
||||||
serverVersion: number;
|
|
||||||
/** Game server account ID. */
|
|
||||||
steamID: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EJoinServerError {
|
|
||||||
PingFailed = -3,
|
|
||||||
Connecting,
|
|
||||||
Pinging,
|
|
||||||
None,
|
|
||||||
VACBanned,
|
|
||||||
ServerFull,
|
|
||||||
ModNotInstalled,
|
|
||||||
AppNotFound,
|
|
||||||
NotInitialized,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface PlayerDetails {
|
|
||||||
/**
|
|
||||||
* `true` is the server refresh is successful.
|
|
||||||
*/
|
|
||||||
bSuccess: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* `true` when the server refresh is done.
|
|
||||||
*/
|
|
||||||
bRefreshComplete: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Player name.
|
|
||||||
*
|
|
||||||
* @note Defined when {@link bRefreshComplete} is `true`.
|
|
||||||
*/
|
|
||||||
playerName?: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Player score.
|
|
||||||
*
|
|
||||||
* @note Defined when {@link bRefreshComplete} is `true`.
|
|
||||||
*/
|
|
||||||
score?: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Time played on the server in seconds
|
|
||||||
*
|
|
||||||
* @note Defined when {@link bRefreshComplete} is `true`.
|
|
||||||
*/
|
|
||||||
timePlayed?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,663 +0,0 @@
|
|||||||
import {CompatibilityTool as CompatibilityTool} from "./App";
|
|
||||||
import { JsPbMessage, OperationResponse, Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
export interface Settings {
|
|
||||||
AddClientBeta(name: string, password: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clears HTTP cache located in `<STEAMPATH>/appcache/httpcache`.
|
|
||||||
*/
|
|
||||||
ClearAllHTTPCaches(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clears download cache and logs you out.
|
|
||||||
*/
|
|
||||||
ClearDownloadCache(): void;
|
|
||||||
|
|
||||||
GetAccountSettings(): Promise<AccountSettings>;
|
|
||||||
|
|
||||||
GetAppUsesP2PVoice(appId: number): Promise<boolean>;
|
|
||||||
|
|
||||||
GetAvailableLanguages(): Promise<Language[]>;
|
|
||||||
|
|
||||||
GetAvailableTimeZones(): Promise<TimeZone[]>;
|
|
||||||
|
|
||||||
// Returns the current language "english"
|
|
||||||
GetCurrentLanguage(): Promise<string>;
|
|
||||||
|
|
||||||
GetGlobalCompatTools(): Promise<CompatibilityTool[]>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns a ProtoBuf message. If deserialized, returns {@link MsgMonitorInfo}.
|
|
||||||
*/
|
|
||||||
GetMonitorInfo(): Promise<ArrayBuffer>;
|
|
||||||
|
|
||||||
GetOOBETestMode(): Promise<boolean>;
|
|
||||||
|
|
||||||
GetRegisteredSteamDeck(): Promise<RegisteredSteamDeck>;
|
|
||||||
|
|
||||||
// Returns the current timezone
|
|
||||||
GetTimeZone(): Promise<string>;
|
|
||||||
|
|
||||||
GetWindowed(): Promise<boolean>;
|
|
||||||
|
|
||||||
IgnoreSteamDeckRewards(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the Windows microphones dialog.
|
|
||||||
*/
|
|
||||||
OpenWindowsMicSettings(): void;
|
|
||||||
|
|
||||||
RegisterForMicVolumeUpdates: Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If `data` is deserialized, returns {@link MsgClientSettings}.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForSettingsArrayChanges(callback: (data: ArrayBuffer) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForSettingsChanges(callback: (settings: SteamSettings) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForTimeZoneChange(callback: (timezoneId: string) => void): Unregisterable; // When timezone is changed from settings, callback will return new timezoneId
|
|
||||||
ReinitMicSettings(): void;
|
|
||||||
|
|
||||||
RenderHotkey(event: KeyCaptureEvent): Promise<string>;
|
|
||||||
|
|
||||||
RequestDeviceAuthInfo(): void;
|
|
||||||
|
|
||||||
SelectClientBeta(nBetaID: number): void;
|
|
||||||
|
|
||||||
// Get from available languages
|
|
||||||
SetCurrentLanguage(strShortName: string): void;
|
|
||||||
|
|
||||||
SetEnableSoftProcessKill(value: boolean): void; // Default value is false, this is Valve internal menu
|
|
||||||
|
|
||||||
SetHostname(hostname: string): void;
|
|
||||||
|
|
||||||
SetMicTestMode(value: boolean): void;
|
|
||||||
|
|
||||||
SetOOBETestMode(value: boolean): void;
|
|
||||||
|
|
||||||
SetPreferredMonitor(monitor: string): void;
|
|
||||||
|
|
||||||
SetRegisteredSteamDeck(steam64Id: string, serialNumber: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the "Don't save account credentials on this computer" option.
|
|
||||||
* @param value Whether to save account credentials.
|
|
||||||
*/
|
|
||||||
SetSaveAccountCredentials(value: boolean): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param base64 Serialized base64 message from `CMsgClientSettings`.
|
|
||||||
* @returns a boolean indicating whether the operation was successful.
|
|
||||||
*/
|
|
||||||
SetSetting(base64: string): Promise<boolean>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* You can get valid timezoneIds from {@link GetAvailableTimeZones}.
|
|
||||||
*/
|
|
||||||
SetTimeZone(timezoneId: string): void;
|
|
||||||
|
|
||||||
SetUseNintendoButtonLayout(controllerIndex: number, value: boolean): void;
|
|
||||||
|
|
||||||
SetUseUniversalFaceButtonGlyphs(nControllerIndex: number, value: boolean): void;
|
|
||||||
|
|
||||||
SetWindowed(value: boolean): void;
|
|
||||||
|
|
||||||
SpecifyGlobalCompatTool(strToolName: string): void;
|
|
||||||
|
|
||||||
ToggleSteamInstall(): Promise<OperationResponse>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface AccountSettings {
|
|
||||||
strEmail: string;
|
|
||||||
bEmailValidated: boolean;
|
|
||||||
bHasAnyVACBans: boolean;
|
|
||||||
bHasTwoFactor: boolean;
|
|
||||||
eSteamGuardState: ESteamGuardState;
|
|
||||||
rtSteamGuardEnableTime: number;
|
|
||||||
bSaveAccountCredentials: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @todo unconfirmed, taken from localization strings
|
|
||||||
*/
|
|
||||||
export enum ESteamGuardState {
|
|
||||||
EmailUnverified,
|
|
||||||
Protected,
|
|
||||||
Disabled,
|
|
||||||
Offline,
|
|
||||||
NotEnabled,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface KeyCaptureEvent {
|
|
||||||
alt_key: boolean;
|
|
||||||
ctrl_key: boolean;
|
|
||||||
display_name: string;
|
|
||||||
meta_key: boolean;
|
|
||||||
shift_key: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Language {
|
|
||||||
language: ELanguage;
|
|
||||||
strShortName: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum ELanguage {
|
|
||||||
None = -1,
|
|
||||||
English,
|
|
||||||
German,
|
|
||||||
French,
|
|
||||||
Italian,
|
|
||||||
Korean,
|
|
||||||
Spanish,
|
|
||||||
SimplifiedChinese,
|
|
||||||
TraditionalChinese,
|
|
||||||
Russian,
|
|
||||||
Thai,
|
|
||||||
Japanese,
|
|
||||||
Portuguese,
|
|
||||||
Polish,
|
|
||||||
Danish,
|
|
||||||
Dutch,
|
|
||||||
Finnish,
|
|
||||||
Norwegian,
|
|
||||||
Swedish,
|
|
||||||
Hungarian,
|
|
||||||
Czech,
|
|
||||||
Romanian,
|
|
||||||
Turkish,
|
|
||||||
Brazilian,
|
|
||||||
Bulgarian,
|
|
||||||
Greek,
|
|
||||||
Arabic,
|
|
||||||
Ukrainian,
|
|
||||||
LatamSpanish,
|
|
||||||
Vietnamese,
|
|
||||||
SteamChina_SChinese,
|
|
||||||
Max,
|
|
||||||
}
|
|
||||||
export interface RegisteredSteamDeck {
|
|
||||||
bRegistered: boolean;
|
|
||||||
bIgnoreRegistrationPrompt: boolean;
|
|
||||||
strSteamID: string;
|
|
||||||
strSerialNumber: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TimeZone {
|
|
||||||
utcOffset: number;
|
|
||||||
timezoneID: string;
|
|
||||||
timezoneLocalizationToken: string;
|
|
||||||
regionsLocalizationToken: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Region {
|
|
||||||
nRegionID: number;
|
|
||||||
strRegionName: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Hour {
|
|
||||||
nHour: number;
|
|
||||||
strDisplay: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface AvailableClientBeta {
|
|
||||||
nBetaID: number;
|
|
||||||
strName: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface SteamSettings {
|
|
||||||
bIsInClientBeta: boolean;
|
|
||||||
bIsSteamSideload: boolean;
|
|
||||||
eClientBetaState: EClientBetaState;
|
|
||||||
strSelectedBetaName: string;
|
|
||||||
nAvailableBetas: number;
|
|
||||||
bChangeBetaEnabled: boolean;
|
|
||||||
nSelectedBetaID: number;
|
|
||||||
vecAvailableClientBetas: AvailableClientBeta[];
|
|
||||||
bIsValveEmail: boolean;
|
|
||||||
bIsInDesktopUIBeta: boolean;
|
|
||||||
bEnableSoftProcessKill: boolean;
|
|
||||||
vecValidDownloadRegions: Region[];
|
|
||||||
vecValidAutoUpdateRestrictHours: Hour[];
|
|
||||||
bCompatEnabled: boolean;
|
|
||||||
bCompatEnabledForOtherTitles: boolean;
|
|
||||||
strCompatTool: string;
|
|
||||||
strDisplayName: string;
|
|
||||||
bDisplayIsExternal: boolean;
|
|
||||||
flAutoDisplayScaleFactor: number;
|
|
||||||
flCurrentDisplayScaleFactor: number;
|
|
||||||
bDisplayIsUsingAutoScale: boolean;
|
|
||||||
flMinDisplayScaleFactor: number;
|
|
||||||
flMaxDisplayScaleFactor: number;
|
|
||||||
flCurrentUnderscanLevel: number;
|
|
||||||
bUnderscanEnabled: boolean;
|
|
||||||
vecNightModeScheduledHours: Hour[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EClientBetaState {
|
|
||||||
None,
|
|
||||||
NoneChosen,
|
|
||||||
NoneChosenNonAdmin,
|
|
||||||
InBeta,
|
|
||||||
InBetaNonAdmin,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CMsgMonitorInfo
|
|
||||||
*/
|
|
||||||
export interface MsgMonitorInfo extends JsPbMessage {
|
|
||||||
monitors(): Monitor[];
|
|
||||||
|
|
||||||
selected_display_name(): string;
|
|
||||||
|
|
||||||
add_monitors(param0: any, param1: any): any;
|
|
||||||
|
|
||||||
set_monitors(param0: any): any;
|
|
||||||
|
|
||||||
set_selected_display_name(param0: any): any;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @todo Doesn't work on Linux ?
|
|
||||||
*/
|
|
||||||
export interface Monitor {
|
|
||||||
monitor_device_name: string;
|
|
||||||
monitor_display_name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CMsgClientSettings
|
|
||||||
*/
|
|
||||||
export interface MsgClientSettings extends JsPbMessage {
|
|
||||||
always_show_user_chooser(): boolean;
|
|
||||||
|
|
||||||
always_use_gamepadui_overlay(): boolean;
|
|
||||||
|
|
||||||
auto_scale_factor(): number;
|
|
||||||
|
|
||||||
bigpicture_windowed(): boolean;
|
|
||||||
|
|
||||||
broadcast_bitrate(): number;
|
|
||||||
|
|
||||||
broadcast_chat_corner(): number;
|
|
||||||
|
|
||||||
broadcast_encoding_option(): EBroadcastEncoderSetting;
|
|
||||||
|
|
||||||
broadcast_output_height(): number;
|
|
||||||
|
|
||||||
broadcast_output_width(): number;
|
|
||||||
|
|
||||||
broadcast_permissions(): EBroadcastPermission;
|
|
||||||
|
|
||||||
broadcast_record_all_audio(): boolean;
|
|
||||||
|
|
||||||
broadcast_record_all_video(): boolean;
|
|
||||||
|
|
||||||
broadcast_record_microphone(): boolean;
|
|
||||||
|
|
||||||
broadcast_show_live_reminder(): boolean;
|
|
||||||
|
|
||||||
broadcast_show_upload_stats(): boolean;
|
|
||||||
|
|
||||||
cef_remote_debugging_enabled(): boolean;
|
|
||||||
|
|
||||||
cloud_enabled(): boolean;
|
|
||||||
|
|
||||||
controller_combine_nintendo_joycons(): boolean;
|
|
||||||
controller_enable_chord(): boolean;
|
|
||||||
|
|
||||||
controller_generic_support(): boolean;
|
|
||||||
|
|
||||||
controller_guide_button_focus_steam(): boolean;
|
|
||||||
|
|
||||||
controller_poll_rate(): boolean;
|
|
||||||
controller_power_off_timeout(): number;
|
|
||||||
|
|
||||||
controller_ps_support(): number;
|
|
||||||
|
|
||||||
controller_switch_support(): boolean;
|
|
||||||
|
|
||||||
controller_xbox_driver(): boolean;
|
|
||||||
|
|
||||||
controller_xbox_support(): boolean;
|
|
||||||
|
|
||||||
default_ping_rate(): number;
|
|
||||||
|
|
||||||
disable_all_toasts(): boolean;
|
|
||||||
|
|
||||||
disable_toasts_in_game(): boolean;
|
|
||||||
|
|
||||||
display_name(): string;
|
|
||||||
|
|
||||||
download_peer_content(): number;
|
|
||||||
|
|
||||||
download_rate_bits_per_s(): boolean;
|
|
||||||
|
|
||||||
download_region(): number;
|
|
||||||
|
|
||||||
download_throttle_rate(): number;
|
|
||||||
|
|
||||||
download_throttle_while_streaming(): boolean;
|
|
||||||
|
|
||||||
download_while_app_running(): boolean;
|
|
||||||
|
|
||||||
enable_avif_screenshots(): boolean;
|
|
||||||
|
|
||||||
enable_dpi_scaling(): boolean;
|
|
||||||
|
|
||||||
enable_gpu_accelerated_webviews(): boolean;
|
|
||||||
|
|
||||||
enable_hardware_video_decoding(): boolean;
|
|
||||||
|
|
||||||
enable_marketing_messages(): boolean;
|
|
||||||
|
|
||||||
enable_overlay(): boolean;
|
|
||||||
|
|
||||||
enable_screenshot_notification(): boolean;
|
|
||||||
|
|
||||||
enable_screenshot_sound(): boolean;
|
|
||||||
|
|
||||||
enable_shader_background_processing(): boolean;
|
|
||||||
|
|
||||||
enable_shader_precache(): boolean;
|
|
||||||
|
|
||||||
enable_ui_sounds(): boolean;
|
|
||||||
|
|
||||||
force_deck_perf_tab(): boolean;
|
|
||||||
|
|
||||||
force_fake_mandatory_update(): boolean;
|
|
||||||
|
|
||||||
force_oobe(): boolean;
|
|
||||||
|
|
||||||
g_background_audio(): EGRAudio;
|
|
||||||
|
|
||||||
g_background_a_m(): number;
|
|
||||||
|
|
||||||
g_background_a_s(): boolean;
|
|
||||||
|
|
||||||
g_background_path(): string;
|
|
||||||
|
|
||||||
g_background_max_keep(): string;
|
|
||||||
|
|
||||||
g_background_mode(): EGRMode;
|
|
||||||
|
|
||||||
g_background_time_resolution(): number;
|
|
||||||
|
|
||||||
g_background_mk(): CMsgHotkey;
|
|
||||||
|
|
||||||
g_background_tg(): CMsgHotkey;
|
|
||||||
|
|
||||||
g_max_fps(): number;
|
|
||||||
|
|
||||||
gamerecording_automatic_gain_control(): boolean;
|
|
||||||
gamerecording_export_codec(): EExportCodec;
|
|
||||||
gamerecording_export_directory(): number;
|
|
||||||
gamerecording_export_limit_bitrate(): number;
|
|
||||||
gamerecording_export_limit_frame_rate(): number;
|
|
||||||
gamerecording_export_limit_height(): number;
|
|
||||||
gamerecording_export_limit_size_mb(): number;
|
|
||||||
gamerecording_export_limit_width(): number;
|
|
||||||
gamerecording_export_limit_type(): EGRExportLimitType;
|
|
||||||
gamerecording_force_mic_mono(): boolean;
|
|
||||||
gamerecording_hotkey_ic(): CMsgHotkey;
|
|
||||||
gamerecording_ic_seconds(): number;
|
|
||||||
gamerecording_video_bitrate(): string;
|
|
||||||
gamerecording_video_maxheight(): number;
|
|
||||||
|
|
||||||
game_notes_enable_spellcheck(): boolean;
|
|
||||||
|
|
||||||
gamescope_allow_tearing(): boolean;
|
|
||||||
|
|
||||||
gamescope_app_target_framerate(): number;
|
|
||||||
|
|
||||||
gamescope_composite_debug(): boolean;
|
|
||||||
|
|
||||||
gamescope_disable_framelimit(): boolean;
|
|
||||||
|
|
||||||
gamescope_disable_mura_correction(): boolean;
|
|
||||||
|
|
||||||
gamescope_display_refresh_rate(): number;
|
|
||||||
|
|
||||||
gamescope_enable_app_target_framerate(): boolean;
|
|
||||||
|
|
||||||
gamescope_force_composite(): boolean;
|
|
||||||
|
|
||||||
gamescope_hdr_visualization(): EHDRVisualization;
|
|
||||||
|
|
||||||
gamescope_include_steamui_in_screenshots(): boolean;
|
|
||||||
|
|
||||||
gamescope_use_game_refresh_rate_in_steam(): boolean;
|
|
||||||
|
|
||||||
gamestream_enable_video_h265(): boolean;
|
|
||||||
gamestream_hardware_video_encode(): boolean;
|
|
||||||
|
|
||||||
hdr_compat_testing(): boolean;
|
|
||||||
|
|
||||||
in_client_beta(): boolean;
|
|
||||||
|
|
||||||
is_external_display(): boolean;
|
|
||||||
|
|
||||||
is_steam_sideloaded(): boolean;
|
|
||||||
|
|
||||||
jumplist_flags(): number;
|
|
||||||
|
|
||||||
library_disable_community_content(): boolean;
|
|
||||||
|
|
||||||
library_display_icon_in_game_list(): boolean;
|
|
||||||
|
|
||||||
library_display_size(): number;
|
|
||||||
|
|
||||||
library_low_bandwidth_mode(): boolean;
|
|
||||||
|
|
||||||
library_low_perf_mode(): boolean;
|
|
||||||
|
|
||||||
library_whats_new_show_only_product_updates(): boolean;
|
|
||||||
|
|
||||||
max_scale_factor(): number;
|
|
||||||
|
|
||||||
min_scale_factor(): number;
|
|
||||||
|
|
||||||
music_download_high_quality(): boolean;
|
|
||||||
|
|
||||||
music_pause_on_app_start(): boolean;
|
|
||||||
|
|
||||||
music_pause_on_voice_chat(): boolean;
|
|
||||||
|
|
||||||
music_playlist_notification(): boolean;
|
|
||||||
|
|
||||||
music_volume(): number;
|
|
||||||
|
|
||||||
needs_steam_service_repair(): boolean;
|
|
||||||
|
|
||||||
no_save_personal_info(): boolean;
|
|
||||||
|
|
||||||
oobe_test_mode_enabled(): boolean;
|
|
||||||
|
|
||||||
os_version_unsupported(): boolean;
|
|
||||||
|
|
||||||
overlay_fps_counter_corner(): number;
|
|
||||||
|
|
||||||
overlay_fps_counter_high_contrast(): boolean;
|
|
||||||
|
|
||||||
overlay_key(): CMsgHotkey;
|
|
||||||
|
|
||||||
overlay_restore_browser_tabs(): boolean;
|
|
||||||
|
|
||||||
overlay_scale_interface(): boolean;
|
|
||||||
|
|
||||||
overlay_tabs(): string;
|
|
||||||
|
|
||||||
overlay_toolbar_list_view(): boolean;
|
|
||||||
|
|
||||||
override_browser_composer_mode(): number;
|
|
||||||
|
|
||||||
play_sound_on_toast(): boolean;
|
|
||||||
|
|
||||||
preferred_monitor(): string;
|
|
||||||
|
|
||||||
ready_to_play_includes_streaming(): boolean;
|
|
||||||
|
|
||||||
restrict_auto_updates(): boolean;
|
|
||||||
|
|
||||||
restrict_auto_updates_end(): number;
|
|
||||||
|
|
||||||
restrict_auto_updates_start(): number;
|
|
||||||
|
|
||||||
run_at_startup(): boolean;
|
|
||||||
|
|
||||||
save_uncompressed_screenshots(): boolean;
|
|
||||||
|
|
||||||
screenshot_items_per_row(): number;
|
|
||||||
|
|
||||||
screenshot_key(): CMsgHotkey;
|
|
||||||
|
|
||||||
screenshots_path(): string;
|
|
||||||
|
|
||||||
server_ping_rate(): number;
|
|
||||||
|
|
||||||
setting_validation_bool(): boolean;
|
|
||||||
|
|
||||||
setting_validation_enum(): EHDRVisualization;
|
|
||||||
|
|
||||||
setting_validation_int32(): number;
|
|
||||||
|
|
||||||
setting_validation_uint32(): number;
|
|
||||||
|
|
||||||
setting_validation_uint64(): number;
|
|
||||||
|
|
||||||
setting_validation_float(): number;
|
|
||||||
|
|
||||||
setting_validation_string(): string;
|
|
||||||
|
|
||||||
shader_precached_size(): string;
|
|
||||||
|
|
||||||
show_copy_count_in_library(): boolean;
|
|
||||||
|
|
||||||
show_family_sharing_notifications(): boolean;
|
|
||||||
|
|
||||||
show_screenshot_manager(): boolean;
|
|
||||||
|
|
||||||
show_steam_deck_info(): boolean;
|
|
||||||
|
|
||||||
show_store_content_on_home(): boolean;
|
|
||||||
|
|
||||||
show_timestamps_in_console(): boolean;
|
|
||||||
|
|
||||||
skip_steamvr_install_dialog(): boolean;
|
|
||||||
|
|
||||||
small_mode(): boolean;
|
|
||||||
|
|
||||||
smooth_scroll_webviews(): boolean;
|
|
||||||
|
|
||||||
start_in_big_picture_mode(): boolean;
|
|
||||||
|
|
||||||
start_page(): string;
|
|
||||||
|
|
||||||
startup_movie_id(): string;
|
|
||||||
|
|
||||||
startup_movie_local_path(): string;
|
|
||||||
|
|
||||||
startup_movie_shuffle(): boolean;
|
|
||||||
|
|
||||||
startup_movie_used_for_resume(): boolean;
|
|
||||||
|
|
||||||
steam_cef_gpu_blocklist_disabled(): boolean;
|
|
||||||
|
|
||||||
steam_input_configurator_error_msg_enable(): boolean;
|
|
||||||
|
|
||||||
steam_networking_share_ip(): number;
|
|
||||||
|
|
||||||
steam_os_underscan_enabled(): boolean;
|
|
||||||
|
|
||||||
steam_os_underscan_level(): number;
|
|
||||||
|
|
||||||
steamos_cec_enabled(): boolean;
|
|
||||||
|
|
||||||
steamos_cec_wake_on_resume(): boolean;
|
|
||||||
|
|
||||||
steamos_magnifier_scale(): number;
|
|
||||||
|
|
||||||
steamos_status_led_brightness(): number;
|
|
||||||
|
|
||||||
steamos_tdp_limit(): number;
|
|
||||||
|
|
||||||
steamos_tdp_limit_enabled(): boolean;
|
|
||||||
|
|
||||||
steamos_wifi_debug(): boolean;
|
|
||||||
|
|
||||||
steamos_wifi_force_wpa_supplicant(): boolean;
|
|
||||||
|
|
||||||
system_bluetooth_enabled(): boolean;
|
|
||||||
|
|
||||||
turn_off_controller_on_exit(): boolean;
|
|
||||||
|
|
||||||
voice_mic_device_name(): string;
|
|
||||||
|
|
||||||
voice_mic_input_gain(): number;
|
|
||||||
|
|
||||||
voice_push_to_talk_key(): CMsgHotkey;
|
|
||||||
|
|
||||||
voice_push_to_talk_setting(): number;
|
|
||||||
|
|
||||||
voice_speaker_output_gain(): number;
|
|
||||||
|
|
||||||
web_browser_home(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CMsgHotkey extends JsPbMessage {
|
|
||||||
key_code(): number;
|
|
||||||
alt_key(): boolean;
|
|
||||||
shift_key(): boolean;
|
|
||||||
ctrl_key(): boolean;
|
|
||||||
meta_key(): boolean;
|
|
||||||
display_name(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EBroadcastEncoderSetting {
|
|
||||||
BestQuality,
|
|
||||||
BestPerformance,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EBroadcastPermission {
|
|
||||||
Disabled,
|
|
||||||
FriendsApprove,
|
|
||||||
FriendsAllowed,
|
|
||||||
Public,
|
|
||||||
Subscribers,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EExportCodec {
|
|
||||||
Default,
|
|
||||||
H264,
|
|
||||||
H265,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EGRAudio {
|
|
||||||
Game,
|
|
||||||
System,
|
|
||||||
Select,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EGRExportLimitType {
|
|
||||||
Native,
|
|
||||||
FileSize,
|
|
||||||
Advanced,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EGRMode {
|
|
||||||
Never,
|
|
||||||
Always,
|
|
||||||
Manual,
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EHDRVisualization {
|
|
||||||
None,
|
|
||||||
Heatmap,
|
|
||||||
Analysis,
|
|
||||||
HeatmapExtended,
|
|
||||||
HeatmapClassic,
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
import { ESteamRealm, Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* `hSharedConnection` is the number from {@link AllocateSharedConnection}.
|
|
||||||
*/
|
|
||||||
export interface SharedConnection {
|
|
||||||
AllocateSharedConnection(): Promise<number>;
|
|
||||||
|
|
||||||
// if no such number, sends this warning:
|
|
||||||
// src\clientdll\clientsharedconnection.cpp (154) : m_mapSharedConnections.HasElement( hSharedConnection )
|
|
||||||
Close(hSharedConnection: number): void;
|
|
||||||
|
|
||||||
RegisterOnBinaryMessageReceived(hSharedConnection: number, callback: (data: ArrayBuffer) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterOnLogonInfoChanged(hSharedConnection: number, callback: (info: LogonInfo) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterOnMessageReceived(hSharedConnection: number, callback: (param0: any) => void): Unregisterable;
|
|
||||||
|
|
||||||
SendMsg: any;
|
|
||||||
SendMsgAndAwaitBinaryResponse: any;
|
|
||||||
|
|
||||||
SendMsgAndAwaitResponse(hSharedConnection: number, msg: string): Promise<any>;
|
|
||||||
|
|
||||||
SubscribeToClientServiceMethod(hSharedConnection: number, param1: any): any;
|
|
||||||
|
|
||||||
SubscribeToEMsg(hSharedConnection: number, param1: any): any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface LogonInfo {
|
|
||||||
/** `true` if logged on. */
|
|
||||||
bLoggedOn: boolean;
|
|
||||||
eUniverse: ESteamRealm;
|
|
||||||
/** Account username. Empty if not logged on. */
|
|
||||||
strAccountName: string;
|
|
||||||
/** URL for community content. */
|
|
||||||
strCommunityImagesURL: string;
|
|
||||||
/** Account nickname. Empty if not logged on. */
|
|
||||||
strPersonaName: string;
|
|
||||||
/** Steam64 ID. */
|
|
||||||
strSteamid: string;
|
|
||||||
/** Country code. */
|
|
||||||
strUserCountry: string;
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
export interface Stats {
|
|
||||||
// param0 - AppDetailsReviewSection, Showcases, LibraryReviewSpotlight
|
|
||||||
// param1 -
|
|
||||||
// AppDetailsReviewSection: PositiveClicked, NegativeClicked, NeutralClicked, PositiveReviewPosted, NegativeReviewPosted, EditClicked, ReviewCanceled
|
|
||||||
// LibraryReviewSpotlight: ReviseClicked, PositiveClicked, ReviseCloseClicked, NegativeClicked, PositiveRevisePosted, NegativeRevisePosted, ReviseCanceled, ReviewCanceled, CloseClicked
|
|
||||||
// Showcases: Delete, Save-Modify, Save-New
|
|
||||||
RecordActivationEvent(param0: string, param1: string): void;
|
|
||||||
|
|
||||||
RecordDisplayEvent(param0: boolean, param1: string, param2: string): void;
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
export interface SteamChina {
|
|
||||||
GetCustomLauncherAppID(): Promise<number>;
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
import { OperationResponse } from "./shared";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SteamClient.MachineStorage affects the "STEAMPATH/config/config.vdf" file.
|
|
||||||
* SteamClient.RoamingStorage affects the "STEAMPATH/userdata/STEAMID3/7/remote/sharedconfig.vdf" file.
|
|
||||||
* SteamClient.Storage affects the "STEAMPATH/userdata/STEAMID3/config/localconfig.vdf" file.
|
|
||||||
*/
|
|
||||||
export interface Storage {
|
|
||||||
DeleteKey(key: string): Promise<OperationResponse | undefined>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @remarks Use {@link SetObject} to set.
|
|
||||||
*/
|
|
||||||
GetJSON(key: string): Promise<OperationResponse | string>;
|
|
||||||
|
|
||||||
GetString(key: string): Promise<OperationResponse | string>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @remarks Use {@link SetObject} to get.
|
|
||||||
*/
|
|
||||||
SetObject(key: string, value: object): Promise<OperationResponse | undefined>;
|
|
||||||
|
|
||||||
SetString(key: string, value: string): Promise<OperationResponse | undefined>;
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
import { EResult, Unregisterable } from "./shared";
|
|
||||||
import {LaunchOption} from "./App";
|
|
||||||
|
|
||||||
export interface Streaming {
|
|
||||||
AcceptStreamingEULA(appId: number, id: string, version: number): void;
|
|
||||||
|
|
||||||
CancelStreamGame(): void; // existing stream
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when the streaming client finishes.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForStreamingClientFinished(callback: (code: EResult, result: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when there is progress in the launch of the streaming client.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForStreamingClientLaunchProgress(
|
|
||||||
callback: (actionType: string, taskDetails: string, done: number, total: number) => void,
|
|
||||||
): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when the streaming client is started (e.g., when clicking the stream button).
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForStreamingClientStarted(callback: (appId: number) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when the streaming launch is complete.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForStreamingLaunchComplete(callback: (code: EResult, result: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForStreamingShowEula(callback: (appId: number) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForStreamingShowIntro(callback: (appId: number, param: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when the streaming client receives launch options from the host.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForStreamingShowLaunchOptions(
|
|
||||||
callback: (appId: number, launchOptions: LaunchOption[]) => void,
|
|
||||||
): Unregisterable; // Callback when streaming client receives launch options from host
|
|
||||||
|
|
||||||
StreamingContinueStreamGame(): void; // existing game running on another streaming capable device
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Chooses the launch option for the streamed app by its index
|
|
||||||
* and restarts the stream.
|
|
||||||
*/
|
|
||||||
StreamingSetLaunchOption(index: number): void;
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
import { EUIMode, Unregisterable } from "./shared";
|
|
||||||
import {EOSType} from "./system";
|
|
||||||
|
|
||||||
export interface UI {
|
|
||||||
EnsureMainWindowCreated(): void;
|
|
||||||
|
|
||||||
ExitBigPictureMode(): void;
|
|
||||||
|
|
||||||
GetDesiredSteamUIWindows(): Promise<SteamWindow[]>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets information about whether your OS will be unsupported in the future or not.
|
|
||||||
*/
|
|
||||||
GetOSEndOfLifeInfo(): Promise<OSEndOfLifeInfo>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the current UI mode.
|
|
||||||
* @returns the current UI mode.
|
|
||||||
*/
|
|
||||||
GetUIMode(): Promise<EUIMode>;
|
|
||||||
|
|
||||||
NotifyAppInitialized(): void;
|
|
||||||
|
|
||||||
RegisterDesiredSteamUIWindowsChanged(callback: () => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback function to be called when a convar's value gets changed.
|
|
||||||
*
|
|
||||||
* Hard crashes if such a convar does not exist or if you can't set it.
|
|
||||||
*
|
|
||||||
* @param convar The ConVar to watch.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
*/
|
|
||||||
RegisterForClientConVar(convar: string, callback: (value: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @todo param{0,1} are enums
|
|
||||||
*/
|
|
||||||
RegisterForErrorCondition(callback: (param0: number, param1: number) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForKioskModeResetSignal(callback: () => void): Unregisterable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @todo This fires multiple times.
|
|
||||||
*/
|
|
||||||
RegisterForStartupFinished(callback: () => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForUIModeChanged(callback: (mode: EUIMode) => void): Unregisterable;
|
|
||||||
|
|
||||||
ResetErrorCondition(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the UI mode to the specified value.
|
|
||||||
* @param mode The UI mode to set.
|
|
||||||
*/
|
|
||||||
SetUIMode(mode: EUIMode): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum EWindowType {
|
|
||||||
MainGamepadUI,
|
|
||||||
OverlayGamepadUI,
|
|
||||||
Keyboard,
|
|
||||||
ControllerConfigurator,
|
|
||||||
VR,
|
|
||||||
MainDesktopUI,
|
|
||||||
DesktopLogin,
|
|
||||||
OverlayDesktopUI,
|
|
||||||
SteamChinaReviewLauncher,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface OSEndOfLifeInfo {
|
|
||||||
bOSWillBeUnsupported: boolean;
|
|
||||||
osType: EOSType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The following might have more correct information:
|
|
||||||
* https://github.com/SteamDatabase/SteamTracking/blob/master/Protobufs/webuimessages_sharedjscontext.proto
|
|
||||||
*/
|
|
||||||
export interface SteamWindow {
|
|
||||||
appid: number;
|
|
||||||
hwndParent: number;
|
|
||||||
nBrowserID: number;
|
|
||||||
strAppName: string;
|
|
||||||
unID: number;
|
|
||||||
unPID: number;
|
|
||||||
windowType: EWindowType;
|
|
||||||
x: number;
|
|
||||||
y: number;
|
|
||||||
}
|
|
||||||
@@ -1,174 +0,0 @@
|
|||||||
import { Unregisterable } from "./shared";
|
|
||||||
|
|
||||||
export interface URL {
|
|
||||||
/**
|
|
||||||
* Executes a steam:// URL.
|
|
||||||
* @param url The URL to execute.
|
|
||||||
*/
|
|
||||||
ExecuteSteamURL(url: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param urls Additional URLs to get. May be empty.
|
|
||||||
*/
|
|
||||||
GetSteamURLList(urls: SteamWebURL_t[]): Promise<SteamURLs>;
|
|
||||||
|
|
||||||
GetWebSessionID(): Promise<string>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a callback to be called when a steam:// URL gets executed.
|
|
||||||
* @param section `rungameid`, `open`, etc.
|
|
||||||
* @param callback The callback function to be called.
|
|
||||||
* @returns an object that can be used to unregister the callback.
|
|
||||||
*/
|
|
||||||
RegisterForRunSteamURL(section: string, callback: (param0: number, url: string) => void): Unregisterable;
|
|
||||||
|
|
||||||
RegisterForSteamURLChanges(callback: () => void): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type SteamWebURL_t =
|
|
||||||
| "AllNotifications"
|
|
||||||
| "AppHoverPublic"
|
|
||||||
| "AppHoverPublicFull"
|
|
||||||
| "AppNewsPage"
|
|
||||||
| "AsyncGames"
|
|
||||||
| "AvatarBaseURL"
|
|
||||||
| "BaseURLSharedCDN"
|
|
||||||
| "Chat"
|
|
||||||
| "ChatRoot"
|
|
||||||
| "ClaimEntitlements"
|
|
||||||
| "ClanAssetCDN"
|
|
||||||
| "CommentNotifications"
|
|
||||||
| "CommunityHome"
|
|
||||||
| "CommunityAddFriends"
|
|
||||||
| "CommunityCDN"
|
|
||||||
| "CommunityFilePage"
|
|
||||||
| "CommunityFriendsThatPlay"
|
|
||||||
| "CommunityFrontPage"
|
|
||||||
| "CommunityGroupSearch"
|
|
||||||
| "CommunityImages"
|
|
||||||
| "CommunityInventory"
|
|
||||||
| "CommunityMarket"
|
|
||||||
| "CommunityMarketApp"
|
|
||||||
| "CommunityRecommendations"
|
|
||||||
| "CommunityScreenshots"
|
|
||||||
| "CommunitySingleScreenshot"
|
|
||||||
| "CurrentlyPlayedWith"
|
|
||||||
| "EventAnnouncementPage"
|
|
||||||
| "FamilyManagement"
|
|
||||||
| "FamilySharing"
|
|
||||||
| "GameHub"
|
|
||||||
| "GameHubBroadcasts"
|
|
||||||
| "GameHubDiscussions"
|
|
||||||
| "GameHubGuides"
|
|
||||||
| "GameHubNews"
|
|
||||||
| "GameHubReviews"
|
|
||||||
| "GlobalAchievementStatsPage"
|
|
||||||
| "GlobalLeaderboardsPage"
|
|
||||||
| "GroupSteamIDPage"
|
|
||||||
| "HardwareSurvey"
|
|
||||||
| "HelpAppPage"
|
|
||||||
| "HelpChangeEmail"
|
|
||||||
| "HelpChangePassword"
|
|
||||||
| "HelpFAQ"
|
|
||||||
| "HelpFrontPage"
|
|
||||||
| "HelpWithLogin"
|
|
||||||
| "HelpWithLoginInfo"
|
|
||||||
| "HelpWithSteamGuardCode"
|
|
||||||
| "HelpVacBans"
|
|
||||||
| "ItemStorePage"
|
|
||||||
| "ItemStoreDetailPage"
|
|
||||||
| "JoinTrade"
|
|
||||||
| "LegalInformation"
|
|
||||||
| "LibraryAppDetails"
|
|
||||||
| "LibraryAppReview"
|
|
||||||
| "LibraryFeaturedBroadcasts"
|
|
||||||
| "ManageGiftsPage"
|
|
||||||
| "ManageSteamGuard"
|
|
||||||
| "ModeratorMessages"
|
|
||||||
| "Mobile"
|
|
||||||
| "MyHelpRequests"
|
|
||||||
| "OfficialGameGroupPage"
|
|
||||||
| "NewsHomePage"
|
|
||||||
| "ParentalBlocked"
|
|
||||||
| "ParentalSetup"
|
|
||||||
| "PendingFriends"
|
|
||||||
| "PendingGift"
|
|
||||||
| "PointsShop"
|
|
||||||
| "PrivacyPolicy"
|
|
||||||
| "RecommendGame"
|
|
||||||
| "RedeemWalletVoucher"
|
|
||||||
| "RegisterKey"
|
|
||||||
| "RegisterKeyNoParams"
|
|
||||||
| "SSA"
|
|
||||||
| "SteamAnnouncements"
|
|
||||||
| "SteamClientBetaBugReports"
|
|
||||||
| "SteamClientBetaNewsPage"
|
|
||||||
| "SteamClientBetaNewsPageFancy"
|
|
||||||
| "SteamClientNewsPage"
|
|
||||||
| "SteamClientPatchNotes"
|
|
||||||
| "SteamClientBetaPatchNotes"
|
|
||||||
| "SteamDiscussions"
|
|
||||||
| "SteamIDAchievementsPage"
|
|
||||||
| "SteamIDAppTradingCardsPage"
|
|
||||||
| "SteamIDBadgeInfo"
|
|
||||||
| "SteamIDBadgePage"
|
|
||||||
| "SteamIDBroadcastPage"
|
|
||||||
| "SteamIDEditPage"
|
|
||||||
| "SteamIDEditPrivacyPage"
|
|
||||||
| "SteamIDFriendsList"
|
|
||||||
| "SteamIDFriendsPage"
|
|
||||||
| "SteamIDGroupsPage"
|
|
||||||
| "SteamIDMyProfile"
|
|
||||||
| "SteamIDPage"
|
|
||||||
| "SteamLanguage"
|
|
||||||
| "SteamPreferences"
|
|
||||||
| "SteamVRHMDHelp"
|
|
||||||
| "SteamWorkshop"
|
|
||||||
| "SteamWorkshopPage"
|
|
||||||
| "SteamWorkshopSubscriptions"
|
|
||||||
| "SteamWorkshopUpdatedSubscriptions"
|
|
||||||
| "StoreAccount"
|
|
||||||
| "StoreAddFundsPage"
|
|
||||||
| "StoreAppHover"
|
|
||||||
| "StoreAppImages"
|
|
||||||
| "StoreAppPage"
|
|
||||||
| "StoreAppPageAddToCart"
|
|
||||||
| "StoreCart"
|
|
||||||
| "StoreCDN"
|
|
||||||
| "StoreDlcPage"
|
|
||||||
| "StoreExplore"
|
|
||||||
| "StoreExploreNew"
|
|
||||||
| "StoreFreeToPlay"
|
|
||||||
| "StoreFrontPage"
|
|
||||||
| "StoreGameSearchPage"
|
|
||||||
| "StoreGreatOnDeck"
|
|
||||||
| "StorePublisherPage"
|
|
||||||
| "StoreSpecials"
|
|
||||||
| "StoreStats"
|
|
||||||
| "StoreVR"
|
|
||||||
| "StoreWebMicroTxnPage"
|
|
||||||
| "SupportMessages"
|
|
||||||
| "TextFilterSettings"
|
|
||||||
| "TodayPage"
|
|
||||||
| "TradeOffers"
|
|
||||||
| "VideoCDN"
|
|
||||||
| "UserAchievementsPage"
|
|
||||||
| "UserLeaderboardsPage"
|
|
||||||
| "UserStatsPage"
|
|
||||||
| "UserWishlist"
|
|
||||||
| "WatchVideo"
|
|
||||||
| "WebAPI"
|
|
||||||
| "WorkshopEula"
|
|
||||||
| "YearInReview";
|
|
||||||
|
|
||||||
export interface SteamURL {
|
|
||||||
url: string;
|
|
||||||
/**
|
|
||||||
* @todo enum?
|
|
||||||
*/
|
|
||||||
feature: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type SteamURLs = {
|
|
||||||
[url in SteamWebURL_t]: SteamURL;
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user