Showing preview only (2,665K chars total). Download the full file or copy to clipboard to get everything.
Repository: Ryochan7/sc-controller
Branch: python3
Commit: 4899f6999580
Files: 275
Total size: 2.5 MB
Directory structure:
gitextract_w078v14n/
├── .github/
│ └── workflows/
│ ├── appimage.yml
│ └── scc-linux.yml
├── ADDITIONAL-LICENSES
├── AppImageBuilder.yml
├── Dockerfile
├── LICENSE
├── README.md
├── TODO.md
├── appimage-build.sh
├── daemon.sh
├── default_menus/
│ ├── Default.menu
│ └── Profiles.menu
├── default_profiles/
│ ├── Desktop.sccprofile
│ ├── XBox Controller with High Precision Camera.sccprofile
│ └── XBox Controller.sccprofile
├── docs/
│ ├── actions.md
│ ├── menu-file.md
│ ├── profile-file.md
│ └── protocol.md
├── gamecontrollerdb.txt
├── generate-icons.py
├── generate_svg.py
├── glade/
│ ├── about.glade
│ ├── action_editor.glade
│ ├── ae/
│ │ ├── axis.glade
│ │ ├── axis_action.glade
│ │ ├── buttons.glade
│ │ ├── custom.glade
│ │ ├── dpad.glade
│ │ ├── first_page.glade
│ │ ├── gesture.glade
│ │ ├── gyro.glade
│ │ ├── gyro_action.glade
│ │ ├── menu_only.glade
│ │ ├── osk_action.glade
│ │ ├── per_axis.glade
│ │ ├── recent_list.glade
│ │ ├── special_action.glade
│ │ ├── tilt.glade
│ │ └── trigger.glade
│ ├── app.glade
│ ├── controller_settings.glade
│ ├── creg.glade
│ ├── global_settings.glade
│ ├── icon_chooser.glade
│ ├── import_export.glade
│ ├── key_grabber.glade
│ ├── macro_editor.glade
│ ├── menu_editor.glade
│ ├── modeshift_editor.glade
│ ├── osk_binding_editor.glade
│ ├── ring_editor.glade
│ └── simple_chooser.glade
├── images/
│ ├── button-images/
│ │ └── groups.json
│ ├── deck.config.json
│ ├── ds4-config.json
│ ├── ds5-config.json
│ ├── keyboard.svg.json
│ ├── menu-icons/
│ │ ├── buttons/
│ │ │ └── LICENCES
│ │ ├── driving/
│ │ │ └── LICENCES
│ │ ├── items/
│ │ │ └── LICENCES
│ │ ├── media/
│ │ │ └── LICENCES
│ │ ├── system/
│ │ │ ├── LICENCES
│ │ │ └── profiles.bw.xcf
│ │ └── weapons/
│ │ └── LICENCES
│ ├── radial-menu.svg.json
│ ├── remotepad.json
│ ├── sc-config.json
│ └── x360-config.json
├── osd-styles/
│ ├── Blue.colors.json
│ ├── Classic.gtkstyle.css
│ ├── Cyan.colors.json
│ ├── Green.colors.json
│ ├── Red.colors.json
│ ├── Reloaded.gtkstyle.css
│ └── Yellow.colors.json
├── profile_examples/
│ ├── DeSmuME.sccprofile
│ ├── DiRT Rally.sccprofile
│ ├── GZDoom.sccprofile
│ ├── Kodi.sccprofile
│ ├── No Man Sky.sccprofile
│ ├── Portal 2 coop.sccprofile
│ ├── Portal 2.sccprofile
│ ├── README.md
│ ├── Stardew Valley.sccprofile
│ ├── Tomb Raider 2013.sccprofile
│ ├── Undertale.sccprofile
│ ├── Vanguard Princess.sccprofile
│ └── firefox.sccprofile
├── run.sh
├── scc/
│ ├── __init__.py
│ ├── actions.py
│ ├── aliases.py
│ ├── c_branch.h
│ ├── cemuhook_server.c
│ ├── cemuhook_server.py
│ ├── cheader.py
│ ├── config.py
│ ├── constants.py
│ ├── controller.py
│ ├── custom.py
│ ├── device_monitor.py
│ ├── drivers/
│ │ ├── __init__.py
│ │ ├── ds4drv.py
│ │ ├── ds5drv.py
│ │ ├── evdevdrv.py
│ │ ├── fake.py
│ │ ├── hiddrv.c
│ │ ├── hiddrv.py
│ │ ├── remotepad.h
│ │ ├── remotepad.py
│ │ ├── remotepad_controller.c
│ │ ├── sc_by_bt.c
│ │ ├── sc_by_bt.py
│ │ ├── sc_by_cable.py
│ │ ├── sc_dongle.py
│ │ ├── scc_future.h
│ │ ├── steamdeck.py
│ │ └── usb.py
│ ├── foreign/
│ │ ├── __init__.py
│ │ ├── vdf.py
│ │ └── vdffz.py
│ ├── gestures.py
│ ├── gui/
│ │ ├── __init__.py
│ │ ├── aboutdialog.py
│ │ ├── action_editor.py
│ │ ├── ae/
│ │ │ ├── __init__.py
│ │ │ ├── axis.py
│ │ │ ├── axis_action.py
│ │ │ ├── buttons.py
│ │ │ ├── custom.py
│ │ │ ├── dpad.py
│ │ │ ├── first_page.py
│ │ │ ├── gesture.py
│ │ │ ├── gyro.py
│ │ │ ├── gyro_action.py
│ │ │ ├── menu_action.py
│ │ │ ├── menu_only.py
│ │ │ ├── osk_action.py
│ │ │ ├── osk_buttons.py
│ │ │ ├── per_axis.py
│ │ │ ├── recent_list.py
│ │ │ ├── special_action.py
│ │ │ ├── tilt.py
│ │ │ └── trigger.py
│ │ ├── app.py
│ │ ├── area_to_action.py
│ │ ├── binding_editor.py
│ │ ├── chooser.py
│ │ ├── controller_image.py
│ │ ├── controller_settings.py
│ │ ├── controller_widget.py
│ │ ├── creg/
│ │ │ ├── __init__.py
│ │ │ ├── constants.py
│ │ │ ├── data.py
│ │ │ ├── dialog.py
│ │ │ ├── grabs.py
│ │ │ └── tester.py
│ │ ├── daemon_manager.py
│ │ ├── dwsnc.py
│ │ ├── editor.py
│ │ ├── gdk_to_key.py
│ │ ├── gestures.py
│ │ ├── global_settings.py
│ │ ├── icon_chooser.py
│ │ ├── importexport/
│ │ │ ├── __init__.py
│ │ │ ├── dialog.py
│ │ │ ├── export.py
│ │ │ ├── import_sccprofile.py
│ │ │ └── import_vdf.py
│ │ ├── key_grabber.py
│ │ ├── keycode_to_key.py
│ │ ├── macro_editor.py
│ │ ├── menu_editor.py
│ │ ├── modeshift_editor.py
│ │ ├── osd_mode.py
│ │ ├── osk_binding_editor.py
│ │ ├── parser.py
│ │ ├── profile_switcher.py
│ │ ├── ribar.py
│ │ ├── ring_editor.py
│ │ ├── simple_chooser.py
│ │ ├── statusicon.py
│ │ ├── svg_widget.py
│ │ └── userdata_manager.py
│ ├── lib/
│ │ ├── __init__.py
│ │ ├── daemon.py
│ │ ├── enum.py
│ │ ├── eudevmonitor.py
│ │ ├── hidparse.py
│ │ ├── hidparse_data.py
│ │ ├── hidraw.py
│ │ ├── ioctl_opt.py
│ │ ├── jsonencoder.py
│ │ ├── libusb1.py
│ │ ├── usb1.py
│ │ ├── vdf.py
│ │ ├── xinput.py
│ │ └── xwrappers.py
│ ├── macros.py
│ ├── mapper.py
│ ├── menu_data.py
│ ├── modifiers.py
│ ├── osd/
│ │ ├── __init__.py
│ │ ├── area.py
│ │ ├── binding_display.py
│ │ ├── dialog.py
│ │ ├── gesture_display.py
│ │ ├── grid_menu.py
│ │ ├── hmenu.py
│ │ ├── inputdisplay.py
│ │ ├── keyboard.py
│ │ ├── launcher.py
│ │ ├── menu.py
│ │ ├── menu_generators.py
│ │ ├── message.py
│ │ ├── osk_actions.py
│ │ ├── quick_menu.py
│ │ ├── radial_menu.py
│ │ ├── slave_mapper.py
│ │ └── timermanager.py
│ ├── parser.py
│ ├── paths.py
│ ├── poller.py
│ ├── profile.py
│ ├── sccdaemon.py
│ ├── scheduler.py
│ ├── scripts.py
│ ├── special_actions.py
│ ├── tools.py
│ ├── uinput.c
│ ├── uinput.py
│ └── x11/
│ ├── __init__.py
│ ├── autoswitcher.py
│ ├── scc-autoswitch-daemon.py
│ ├── scc-osd-daemon.py
│ └── scc_autoswitch_daemon.py
├── scc-mime-types.xml
├── scripts/
│ ├── 69-sc-controller.rules
│ ├── appimage-AppRun.sh
│ ├── sc-controller
│ ├── sc-controller.appdata.xml
│ ├── sc-controller.desktop
│ ├── scc
│ ├── scc-daemon
│ ├── scc-osd-dialog
│ ├── scc-osd-keyboard
│ ├── scc-osd-launcher
│ ├── scc-osd-menu
│ ├── scc-osd-message
│ ├── scc-osd-radial-menu
│ └── scc-osd-show-bindings
├── setup.py
├── tests/
│ ├── README.md
│ ├── test_boolean.py
│ ├── test_compress.py
│ ├── test_docs.py
│ ├── test_glade.py
│ ├── test_inputs.py
│ ├── test_parser/
│ │ ├── __init__.py
│ │ ├── test_actions.py
│ │ ├── test_macros.py
│ │ ├── test_modifiers.py
│ │ └── test_special_actions.py
│ ├── test_profile/
│ │ ├── __init__.py
│ │ ├── test_actions.py
│ │ ├── test_modeshift.py
│ │ ├── test_modifiers.py
│ │ └── test_special_actions.py
│ ├── test_setup.py
│ ├── test_strings/
│ │ ├── __init__.py
│ │ ├── test_keys.py
│ │ └── test_modifiers.py
│ └── test_vdf.py
└── update-wiki.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/appimage.yml
================================================
name: Build and publish AppImages
on:
push:
tags:
- "v*"
env:
BASE_OS: ubuntu
APT_PUBKEY: 871920D1991BC93C
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
platform:
- linux/amd64
- linux/arm64
codename:
- jammy
- lunar
- mantic
steps:
- uses: actions/checkout@v4
- uses: rlespinasse/github-slug-action@v4
- name: Setup qemu for docker
uses: docker/setup-qemu-action@v2
if: matrix.platform != 'linux/amd64'
- name: Setup buildx for docker
uses: docker/setup-buildx-action@v2
- name: Compile in docker
uses: docker/build-push-action@v4
with:
platforms: ${{ matrix.platform }}
outputs: build
build-args: |
BASE_OS
BASE_CODENAME=${{ matrix.codename }}
- name: Prepare environment to build AppImage
env:
TARGET_PLATFORM: ${{ matrix.platform }}
shell: bash
run: |
set -eua
if [ -r build/.build-metadata.env ]; then
. build/.build-metadata.env
rm build/.build-metadata.env
fi
APPIMAGE_SOURCE=build
APPIMAGE_VERSION="${GITHUB_REF_SLUG}-${{ matrix.codename }}"
APPIMAGE_APT_ARCH="${TARGETARCH}"
APPIMAGE_APT_DISTRO="${{ matrix.codename }}"
APPIMAGE_APT_PUBKEY="${APT_PUBKEY}"
APPIMAGE_ARCH="${TARGETMACHINE}"
printenv | grep ^APPIMAGE_ >>"${GITHUB_ENV}"
- name: Build AppImage
uses: AppImageCrafters/build-appimage@v1.3
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: appimages
path: |
./*.AppImage
./*.AppImage.zsync
if-no-files-found: error
release:
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
needs:
- build
permissions:
contents: write
steps:
- name: Download artifacts
uses: actions/download-artifact@v3
with:
name: appimages
path: assets
- name: Create checksum for release assets
shell: bash
run: |
algo="${SHA_ALGORITHM:-256}"
find assets -type f | while read -r asset; do
shasum --binary --algorithm "${algo}" "${asset}" >"${asset}.sha${algo}"
done
- name: Upload artifacts to GitHub release
uses: softprops/action-gh-release@v1
with:
files: assets/*
================================================
FILE: .github/workflows/scc-linux.yml
================================================
name: SCC Linux CI
on:
push:
branches:
- main
- master
- python3
pull_request:
branches:
- main
- master
- python3
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.11'
# Install dependencies
- run: pip install pytest vdf
# Build
- run: python setup.py build
# Test
- run: python -m pytest tests
================================================
FILE: ADDITIONAL-LICENSES
================================================
All images in images/ directory, profile files in default_profiles/
and profile_examples/ and menu files in default_menus/ directories
are licensed under CC0 license - https://creativecommons.org/publicdomain/zero/1.0/
Images in images/menu-icons subdirectories are licensed as described
in 'LICENSES' files in their respective subdirectories.
lib/enum.py is licensed under BSD license, as described in that file.
lib/usb1.py and lib/libusb1.py are licensed under LGPL 2.1, as described in those files.
lib/jsonencoder.py is licensed under PSFL, https://www.python.org/download/releases/2.7/license/
scripts/gamecontrollerdb.txt is taken from Simple DirectMedia Layer library and licensed under zlib license.
lib/xwrappers.py and lib/vdf.py are part of SC-Controller, licensed under GPL2 as rest of the project.
Everything else is licensed under GPL2, as described in 'LICENCE' file.
================================================
FILE: AppImageBuilder.yml
================================================
version: 1
script:
- |
if [ "{{APPIMAGE_SOURCE}}" != "${TARGET_APPDIR}" ]; then
mv "{{APPIMAGE_SOURCE}}" "${TARGET_APPDIR}"
fi
# Manual installation of squashfs-tools is required
# until https://github.com/AppImageCrafters/build-appimage/issues/5 is fixed
if ! command -v mksquashfs >/dev/null; then
apt-get update && apt-get install -y --no-install-recommends squashfs-tools
fi
AppDir:
app_info:
id: org.ryochan7.sc-controller
name: sc-controller
version: "{{APPIMAGE_VERSION}}"
icon: sc-controller
exec: usr/bin/python3
exec_args: -c "import os, sys; os.execvp('$APPDIR/usr/bin/scc', ['$APPDIR/usr/bin/scc'] + (sys.argv[1:] if len(sys.argv) > 1 else ['gui']))" $@
after_bundle: |
set -eu
# appimage-builder expects .desktop file to start with appinfo-id
desktop="$(find "${TARGET_APPDIR}/usr" -name sc-controller.desktop)"
sed -i "s:Exec=.*:Exec=./usr/bin/scc gui:g" "${desktop}"
ln -sr "${desktop}" "${TARGET_APPDIR}/usr/share/applications/org.ryochan7.sc-controller.desktop"
# appimage-builder expects utf-8 encoding when patching shebangs,
# but pygettext3 has iso-8859-1 encoding
find "${TARGET_APPDIR}/usr/bin" -name 'pygettext*' | while read -r file; do
encoding="ISO-8859-1"
if file -bi "${file}" | grep -iq "${encoding}"; then
<"${file}" iconv -f "${encoding}" -t utf-8 -o "${file}"
sed -i -E '1,2 s|^(\s*#.*coding[=:]\s*)([[:alnum:].-]+)|\1utf-8|g' "${file}"
fi
done
apt:
arch:
- "{{APPIMAGE_APT_ARCH}}"
sources:
- sourceline: deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ {{APPIMAGE_APT_DISTRO}} main universe
key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x{{APPIMAGE_APT_PUBKEY}}
- sourceline: deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ {{APPIMAGE_APT_DISTRO}}-updates main universe
- sourceline: deb [arch=amd64] http://security.ubuntu.com/ubuntu/ {{APPIMAGE_APT_DISTRO}}-security main universe
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ {{APPIMAGE_APT_DISTRO}} main universe
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ {{APPIMAGE_APT_DISTRO}}-updates main universe
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ {{APPIMAGE_APT_DISTRO}}-security main universe
include:
- gir1.2-rsvg-2.0
- libbluetooth3
- librsvg2-common
- python3-evdev
- python3-gi-cairo
- python3-pylibacl
- python3-vdf
- binutils # required for detection of bluetooth library
- coreutils # provides /usr/bin/env
- shared-mime-info # required for gui if host provides no MIME info, e.g. when XDG_DATA_DIRS is missing
exclude:
- gcc* # development
- libgcc* # development
- libstdc* # development
- libtirpc* # development
- libuuid* # development
- libattr* # filesystem
- libblkid* # filesystem
- libmount* # filesystem
- libbz* # codec
- libjpeg* # codec
- liblzma* # codec
- libtiff* # codec
- libxml* # codec
- libwebp* # codec
- media-types # codec
- libpixman* # X
- libxext* # X
- libxrender* # X
- libfontconfig* # fonts
- libfreetype* # fonts
- libfribidi* # i18n
- libicu* # i18n
- libgmp* # arithmetics
- libmpdec* # arithmetics
- libncurses* # terminal
- libreadline* # terminal
- readline* # terminal
- libssl* # security
- "*crypt*" # security
- "*krb*" # security
- libdb* # database
- "*sqlite*" # database
- libnsl* # network
files:
exclude:
- usr/bin/*gold* # alternative for ld
- usr/bin/*gp-display-html* # since Ubuntu Lunatic, requires perl
- usr/lib/*/gconv # unicode
- usr/lib/*/gdk-pixbuf-2.0/*/loaders/libpixbufloader-[!s]*.so # only svg is required
- usr/lib/*/glib-2.0
- usr/lib/python*/cgi.py
- usr/lib/python*/email
- usr/lib/python*/test
- usr/lib/python*/unittest
- usr/share/doc
- usr/share/glib-2.0
- usr/share/gtk-doc
- usr/share/icu
- usr/share/locale
- usr/share/man
- usr/share/python3/runtime.d
- usr/share/thumbnailers
runtime:
env:
# `usr/lib/python3.*/site-packages` is required in $PYTHONPATH,
# but the python version and hence the actual location is unknown here.
# Fortunately the site-packages directory is on the $PATH, so we add $PATH instead.
# It must precede an existing $PYTHONPATH to work.
PYTHONPATH: "${APPDIR}/usr/lib/python3/dist-packages:${PATH}:${PYTHONPATH}"
SCC_SHARED: "${APPDIR}/usr/share/scc"
AppImage:
arch: "{{APPIMAGE_ARCH}}"
update-information: "gh-releases-zsync|Ryochan7|sc-controller|latest|sc-controller-*-{{APPIMAGE_APT_DISTRO}}-{{APPIMAGE_ARCH}}.AppImage.zsync"
================================================
FILE: Dockerfile
================================================
ARG BASE_OS=ubuntu
ARG BASE_CODENAME=jammy
FROM $BASE_OS:$BASE_CODENAME AS build-stage
# Download build dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc librsvg2-bin linux-headers-generic python3-dev python3-setuptools
# Prepare working directory and target
COPY . /work
WORKDIR /work
ARG TARGET=/build/usr
# Build and install
RUN python3 setup.py build --executable "/usr/bin/env python3" && \
python3 setup.py install --single-version-externally-managed --home "${TARGET}" --record /dev/null
# Provide input-event-codes.h as fallback for runtime systems without linux headers
RUN cp -a \
"$(find /usr -type f -name input-event-codes.h -print -quit)" \
"$(find "${TARGET}" -type f -name uinput.py -printf '%h\n' -quit)"
# Create short name symlinks for static libraries
RUN suffix=".cpython-*-$(uname -m)-linux-gnu.so" && \
find "${TARGET}" -type f -path "*/site-packages/*${suffix}" \
| while read -r path; do ln -sfr "${path}" "${path%${suffix}}.so"; done
# Put AppStream metadata to required location according to https://wiki.debian.org/AppStream/Guidelines
RUN metainfo=/build/usr/share/metainfo && \
mkdir -p "${metainfo}" && \
cp -a scripts/sc-controller.appdata.xml "${metainfo}"
# Convert icon to png format (required for icons in .desktop file)
RUN iconpath="${TARGET}/share/icons/hicolor/512x512/apps" && \
mkdir -p "${iconpath}" && \
rsvg-convert --background-color none -o "${iconpath}/sc-controller.png" images/sc-controller.svg
# Store build metadata
ARG TARGETOS TARGETARCH TARGETVARIANT
RUN export "TARGETMACHINE=$(uname -m)" && printenv | grep ^TARGET >>/build/.build-metadata.env
# Keep only files required for runtime
FROM scratch AS export-stage
COPY --from=build-stage /build /
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
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.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
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.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
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.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
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".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
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 give any other recipients of the Program a copy of this License
along with the Program.
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 Program or any portion
of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
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.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
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.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
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
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
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
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
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
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
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,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, 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 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.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program 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.
5. 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 Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
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.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program 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 to
this License.
7. 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 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.
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
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
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
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
================================================
FILE: README.md
================================================
# SC Controller [](https://travis-ci.org/kozec/sc-controller)
User-mode driver, mapper and GTK3 based GUI for Steam Controller, DS4 and similar controllers.
[](docs/screenshot1.png?raw=true)
[](docs/screenshot2.png?raw=true)
[](docs/screenshot3.png?raw=true)
[](docs/screenshot4.png?raw=true)
## Features
- Allows to setup, configure and use Steam Controller(s) without ever launching Steam
- Supports profiles switchable in GUI or with controller button
- Stick, Pads and Gyroscope input
- Haptic Feedback and in-game Rumble support
- OSD, Menus, On-Screen Keyboard for desktop *and* in games.
- Automatic profile switching based on active window.
- Macros, button cycling, rapid fire, modeshift, mouse regions...
- Emulates Xbox360 controller, mouse, trackball and keyboard.
Based on [Standalone Steam Controller Driver](https://github.com/ynsta/steamcontroller) by [Ynsta](https://github.com/ynsta).
## Like what I'm doing?
[](https://liberapay.com/kozec) <sup>or</sup> [](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=77DQD3L9K8RPU&lc=SK&item_name=kozec&item_number=scc¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted)
## Packages
- **Ubuntu (deb-based distros):** Found in [openSUSE Build Service](https://software.opensuse.org/download.html?project=home%3Akozec&package=sc-controller).
- **Fedora, SUSE (rpm-based distros):** Found in [openSUSE Build Service](https://software.opensuse.org/download.html?project=home%3Akozec&package=sc-controller).
- **Arch, Manjaro (arch-based distros):** Found in [AUR](https://aur.archlinux.org/packages/sc-controller-git/)
- **Solus:** Search for `sc-controller` in Software Center or run `sudo eopkg it sc-controller` from a terminal.
- **Exherbo:** Found in [hardware](https://git.exherbo.org/summer/packages/input/sc-controller)
- **Void Linux:** Run `xbps-install -S sc-controller` in a terminal.
## Building the package by yourself
### Dependencies
- python 3, GTK 3.22 or newer and [PyGObject](https://live.gnome.org/PyGObject)
- [python-gi-cairo](https://packages.debian.org/sid/python-gi-cairo) and [gir1.2-rsvg-2.0](https://packages.debian.org/sid/gir1.2-rsvg-2.0) on debian based distros (included in PyGObject elsewhere)
- [setuptools](https://pypi.python.org/pypi/setuptools)
- [python-pylibacl](http://pylibacl.k1024.org/) is recommended
- [python-evdev](https://python-evdev.readthedocs.io/en/latest/) is strongly recommended
- [python-vdf](https://pypi.org/project/vdf/)
- [gtk-layer-shell](https://github.com/wmww/gtk-layer-shell) (Wayland only)
### Installing
- Download and extract [latest release](https://github.com/kozec/sc-controller/releases/latest)
- `python3 setup.py build`
- `python3 setup.py install`
## Running with non distro-specific package
- Download and extract [latest release](https://github.com/kozec/sc-controller/releases/latest)
- Navigate to extracted directory and execute `./run.sh`
================================================
FILE: TODO.md
================================================
List of (possibly) planned features in no particular order:
- Multiple on-screen menus (and possibly keyboards) when using multiple controllers
- Injecting emulated xbox controller into wine
Hard stuff:
- Injecting emulated xbox controller into PlayOnLinux
Very hard stuff:
- Visual feedback in binding editor ( [what this guy says](https://www.reddit.com/r/linux_gaming/comments/5pcdmr/sc_controller_use_steam_controller_without_steam/dcqpvf4/) )
**Done** stuff:
- Multicontroller support
- Configurable gamepad type (e.g. 4 axes and 16 buttons)
- Steam Profile import
- Radial Menu for the Joystick/Trackpad
- Copy & paste
- Cycling Buttons
- Process monitor (or active window monitor) with switch
- Mouse regions
- Touch-Menu
- Menu in OSD
- OSD
- double click
- on-screen keyboard
- Spining mouse wheel rotation
- Haptic feedback support
- Gyroscope input
- Gamepad button as modifier (modeshift)
- Macros
- Turbo
- Trigger settings
- DPAD that acts only when clicked
- 8-way DPAD
- Selector for media keys
================================================
FILE: appimage-build.sh
================================================
#!/bin/bash
APP="sc-controller"
EXEC="scc"
LIB="lib"
EVDEV_VERSION=0.7.0
[ x"$BUILD_APPDIR" == "x" ] && BUILD_APPDIR=$(pwd)/appimage
PYTHON_VERSION=$(python3 -c 'import sys; version=sys.version_info[:3]; print("{0}.{1}".format(*version))')
SITE_PACKAGES_PATH=$(python3 -c "import os,sys; print([p for p in sys.path if p.endswith('site-packages') and sys.prefix in p][0])")
if [ -z ${SITE_PACKAGES_PATH} ]; then
echo "Could not determine global site-packages path. Exiting";
exit 1;
fi
function download_dep() {
NAME=$1
URL=$2
if [ -e ../../${NAME}.obstargz ] ; then
# Special case for OBS
cp ../../${NAME}.obstargz /tmp/${NAME}.tar.gz
elif [ -e ${NAME}.tar.gz ] ; then
cp ${NAME}.tar.gz /tmp/${NAME}.tar.gz
elif [ -e /tmp/${NAME}.tar.gz ] ; then
echo "/tmp/${NAME}.tar.gz already downloaded"
else
wget -c "${URL}" -O /tmp/${NAME}.tar.gz
fi
}
function build_dep() {
NAME="$1"
mkdir -p /tmp/${NAME}
pushd /tmp/${NAME}
tar --extract --strip-components=1 -f /tmp/${NAME}.tar.gz
PYTHONPATH=${BUILD_APPDIR}/usr/lib/python${PYTHON_VERSION}/site-packages python3 \
setup.py install --optimize=1 \
--prefix="/usr/" --root="${BUILD_APPDIR}"
mkdir -p "${BUILD_APPDIR}/usr/lib/python${PYTHON_VERSION}/site-packages/"
python3 setup.py install --prefix="/usr/" --root="${BUILD_APPDIR}"
popd
}
function unpack_dep() {
NAME="$1"
pushd ${BUILD_APPDIR}
tar --extract --exclude="usr/include**" --exclude="usr/lib/pkgconfig**" \
--exclude="usr/lib/python2.7**" -f /tmp/${NAME}.tar.gz
popd
}
set -ex # display commands, terminate after 1st failure
# Download deps
download_dep "python-evdev-0.7.0" "https://github.com/gvalkov/python-evdev/archive/v0.7.0.tar.gz"
download_dep "pylibacl-0.6.0" "https://github.com/iustin/pylibacl/releases/download/v0.6.0/pylibacl-0.6.0.tar.gz"
download_dep "python-gobject-3.36.1" "https://archive.archlinux.org/packages/p/python-gobject/python-gobject-3.36.1-1-x86_64.pkg.tar.zst"
download_dep "python-vdf-3.4" "https://github.com/ValvePython/vdf/archive/v3.4.tar.gz"
download_dep "libpng-1.6.34" "https://archive.archlinux.org/packages/l/libpng/libpng-1.6.34-2-x86_64.pkg.tar.xz"
download_dep "gdk-pixbuf-2.36.9" "https://archive.archlinux.org/packages/g/gdk-pixbuf2/gdk-pixbuf2-2.36.9-1-x86_64.pkg.tar.xz"
download_dep "libcroco-0.6.13" "https://archive.archlinux.org/packages/l/libcroco/libcroco-0.6.13-1-x86_64.pkg.tar.xz"
download_dep "libxml2-2.9.10" "https://archive.archlinux.org/packages/l/libxml2/libxml2-2.9.10-2-x86_64.pkg.tar.zst"
download_dep "librsvg-2.48.7" "https://archive.archlinux.org/packages/l/librsvg/librsvg-2%3A2.48.7-1-x86_64.pkg.tar.zst"
download_dep "icu-67.1" "https://archive.archlinux.org/packages/i/icu/icu-67.1-1-x86_64.pkg.tar.zst"
download_dep "zlib-1:1.2.12" "https://archive.archlinux.org/packages/z/zlib/zlib-1%3A1.2.12-2-x86_64.pkg.tar.zst"
download_dep "libffi-3.4.3" "https://archive.archlinux.org/packages/l/libffi/libffi-3.4.3-1-x86_64.pkg.tar.zst"
# Prepare & build deps
export PYTHONPATH=${BUILD_APPDIR}/usr/lib/python${PYTHON_VERSION}/site-packages/
mkdir -p "$PYTHONPATH"
if [[ $(grep ID_LIKE /etc/os-release) == *"suse"* ]] ; then
# Special handling for OBS
ln -s lib64 ${BUILD_APPDIR}/usr/lib
export PYTHONPATH="$PYTHONPATH":${BUILD_APPDIR}/usr/lib64/python${PYTHON_VERSION}/site-packages/
LIB=lib64
fi
build_dep "python-evdev-0.7.0"
build_dep "pylibacl-0.6.0"
build_dep "python-vdf-3.4"
unpack_dep "python-gobject-3.36.1"
unpack_dep "libpng-1.6.34"
unpack_dep "gdk-pixbuf-2.36.9"
unpack_dep "libcroco-0.6.13"
unpack_dep "libxml2-2.9.10"
unpack_dep "librsvg-2.48.7"
unpack_dep "icu-67.1"
unpack_dep "zlib-1:1.2.12"
unpack_dep "libffi-3.4.3"
# Remove uneeded files
rm -f "${BUILD_APPDIR}/usr/${LIB}/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-ani.so"
rm -f "${BUILD_APPDIR}/usr/${LIB}/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-bmp.so"
rm -f "${BUILD_APPDIR}/usr/${LIB}/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gif.so"
rm -f "${BUILD_APPDIR}/usr/${LIB}/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-icns.so"
rm -f "${BUILD_APPDIR}/usr/${LIB}/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-ico.so"
rm -f "${BUILD_APPDIR}/usr/${LIB}/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-jasper.so"
rm -f "${BUILD_APPDIR}/usr/${LIB}/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-jpeg.so"
rm -f "${BUILD_APPDIR}/usr/${LIB}/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-qtif.so"
rm -f "${BUILD_APPDIR}/usr/${LIB}/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-tga.so"
rm -f "${BUILD_APPDIR}/usr/${LIB}/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-tiff.so"
rm -R "${BUILD_APPDIR}/usr/lib/cmake"
rm -R "${BUILD_APPDIR}/usr/share/doc"
rm -R "${BUILD_APPDIR}/usr/share/gtk-doc"
rm -R "${BUILD_APPDIR}/usr/share/locale"
rm -R "${BUILD_APPDIR}/usr/share/man"
rm -R "${BUILD_APPDIR}/usr/share/thumbnailers"
rm -R "${BUILD_APPDIR}/usr/share/vala"
rm -R "${BUILD_APPDIR}/usr/share/icu"
# Build important part. Need executable flag to place custom interpreter line.
# Setuptools overrrides original #! line in scripts with /usr/bin/python.
# Ubuntu 22.04 LTS does not provide an executable at /usr/bin/python
# by default.
python3 setup.py build --executable "/usr/bin/env python3"
# Need to use single-version-externally-managed due to setuptools behavior
python3 setup.py install --single-version-externally-managed --prefix ${BUILD_APPDIR}/usr --record /dev/null
# Move udev stuff
mv ${BUILD_APPDIR}/usr/lib/udev/rules.d/69-${APP}.rules ${BUILD_APPDIR}/
rmdir ${BUILD_APPDIR}/usr/lib/udev/rules.d/
rmdir ${BUILD_APPDIR}/usr/lib/udev/
mkdir -p ${BUILD_APPDIR}/usr/${LIB}/python${PYTHON_VERSION}/site-packages/scc/
cp "/usr/include/linux/input-event-codes.h" ${BUILD_APPDIR}/usr/${LIB}/python${PYTHON_VERSION}/site-packages/scc/
# Move & patch desktop file
mv ${BUILD_APPDIR}/usr/share/applications/${APP}.desktop ${BUILD_APPDIR}/
sed -i "s/Icon=.*/Icon=${APP}/g" ${BUILD_APPDIR}/${APP}.desktop
sed -i "s/Exec=.*/Exec=.\/usr\/bin\/scc gui/g" ${BUILD_APPDIR}/${APP}.desktop
# Convert icon
convert -background none ${BUILD_APPDIR}/usr/share/pixmaps/${APP}.svg ${BUILD_APPDIR}/${APP}.png
# Copy appdata.xml
mkdir -p ${BUILD_APPDIR}/usr/share/metainfo/
cp scripts/${APP}.appdata.xml ${BUILD_APPDIR}/usr/share/metainfo/${APP}.appdata.xml
# Make symlinks
ln -sfr ${BUILD_APPDIR}${SITE_PACKAGES_PATH}/libcemuhook.cpython-310-x86_64-linux-gnu.so ${BUILD_APPDIR}${SITE_PACKAGES_PATH}/libcemuhook.so
ln -sfr ${BUILD_APPDIR}${SITE_PACKAGES_PATH}/libhiddrv.cpython-310-x86_64-linux-gnu.so ${BUILD_APPDIR}${SITE_PACKAGES_PATH}//libhiddrv.so
ln -sfr ${BUILD_APPDIR}${SITE_PACKAGES_PATH}/libremotepad.cpython-310-x86_64-linux-gnu.so ${BUILD_APPDIR}${SITE_PACKAGES_PATH}/libremotepad.so
ln -sfr ${BUILD_APPDIR}${SITE_PACKAGES_PATH}/libsc_by_bt.cpython-310-x86_64-linux-gnu.so ${BUILD_APPDIR}${SITE_PACKAGES_PATH}/libsc_by_bt.so
ln -sfr ${BUILD_APPDIR}${SITE_PACKAGES_PATH}/libuinput.cpython-310-x86_64-linux-gnu.so ${BUILD_APPDIR}${SITE_PACKAGES_PATH}/libuinput.so
ln -sfr ${BUILD_APPDIR}${SITE_PACKAGES_PATH}/posix1e.cpython-310-x86_64-linux-gnu.so ${BUILD_APPDIR}${SITE_PACKAGES_PATH}/posix1e.so
# Copy AppRun script
cp scripts/appimage-AppRun.sh ${BUILD_APPDIR}/AppRun
chmod +x ${BUILD_APPDIR}/AppRun
echo "Run appimagetool -n ${BUILD_APPDIR} to finish prepared appimage"
================================================
FILE: daemon.sh
================================================
#!/bin/bash
# Ensure correct cwd
cd "$(dirname "$0")"
# Set PATH
SCRIPTS="$(pwd)/scripts"
export PATH="$SCRIPTS":"$PATH"
export PYTHONPATH=".":"$PYTHONPATH"
export SCC_SHARED="$(pwd)"
if [ x"$1" == x"lldb" ] ; then
shift
lldb python3 -- 'scripts/scc-daemon' debug $@
else
python3 'scripts/scc-daemon' $@
fi
================================================
FILE: default_menus/Default.menu
================================================
[{
"separator": true,
"name": "Recent profiles"
}, {
"generator": "recent",
"rows": 3
}, {
"submenu": "Profiles.menu",
"icon": "system/profiles",
"name": "All Profiles"
}, {
"separator": true,
"name": "Options"
}, {
"submenu": ".autoswitch.menu",
"icon": "system/autoswitch",
"name": "Autoswitch Options"
}, {
"action": "turnoff()",
"id": "item4",
"icon": "system/turn-off",
"name": "Turn Controller OFF",
"osd": true
}, {
"action": "keyboard()",
"id": "item5",
"icon": "system/keyboard",
"name": "Display Keyboard"
}]
================================================
FILE: default_menus/Profiles.menu
================================================
[{
"separator": true,
"name": "All profiles"
}, {
"generator" : "profiles"
}]
================================================
FILE: default_profiles/Desktop.sccprofile
================================================
{
"_": "",
"buttons": {
"A": {
"action": "button(Keys.KEY_ENTER)"
},
"B": {
"action": "button(Keys.KEY_ESC)"
},
"BACK": {
"action": "button(Keys.KEY_BACKSPACE)"
},
"C": {
"action": "hold(menu('Default.menu'), menu('Default.menu'))"
},
"CPADPRESS": {
"action": "button(Keys.BTN_LEFT)"
},
"LB": {
"action": "button(Keys.KEY_LEFTCTRL)"
},
"RB": {
"action": "button(Keys.KEY_LEFTALT)"
},
"RPAD": {
"action": "button(Keys.BTN_LEFT)"
},
"START": {
"action": "button(Keys.KEY_LEFTSHIFT)"
},
"X": {
"action": "button(Keys.KEY_SPACE)"
},
"Y": {
"action": "button(Keys.KEY_TAB)"
}
},
"cpad": {
"action": "mouse()"
},
"gyro": {},
"is_template": false,
"menus": {},
"pad_left": {
"action": "feedback(LEFT, 4096, 16, ball(XY(mouse(Rels.REL_HWHEEL, 1.0), mouse(Rels.REL_WHEEL, 1.0))))"
},
"pad_right": {
"action": "smooth(8, 0.78, 2.0, feedback(RIGHT, 256, ball(mouse())))"
},
"stick": {
"action": "dpad(button(Keys.KEY_UP), button(Keys.KEY_DOWN), button(Keys.KEY_LEFT), button(Keys.KEY_RIGHT))"
},
"trigger_left": {
"action": "button(Keys.BTN_RIGHT)"
},
"trigger_right": {
"action": "button(Keys.BTN_LEFT)"
},
"version": 1.4
}
================================================
FILE: default_profiles/XBox Controller with High Precision Camera.sccprofile
================================================
{
"_": "",
"buttons": {
"A": {
"action": "button(Keys.BTN_GAMEPAD)"
},
"B": {
"action": "button(Keys.BTN_EAST)"
},
"BACK": {
"action": "button(Keys.BTN_SELECT)"
},
"C": {
"action": "hold(menu('Default.menu'), menu('Default.menu'))"
},
"LB": {
"action": "button(Keys.BTN_TL)"
},
"LGRIP": {
"action": "button(Keys.BTN_GAMEPAD)"
},
"RB": {
"action": "button(Keys.BTN_TR)"
},
"RGRIP": {
"action": "button(Keys.BTN_NORTH)"
},
"RPAD": {
"action": "button(Keys.BTN_THUMBR)"
},
"START": {
"action": "button(Keys.BTN_START)"
},
"STICKPRESS": {
"action": "button(Keys.BTN_THUMBL)"
},
"X": {
"action": "button(Keys.BTN_NORTH)"
},
"Y": {
"action": "button(Keys.BTN_WEST)"
}
},
"cpad": {},
"gyro": {},
"is_template": false,
"menus": {},
"pad_left": {
"action": "click(dpad(hatup(Axes.ABS_HAT0Y), hatdown(Axes.ABS_HAT0Y), hatleft(Axes.ABS_HAT0X), hatright(Axes.ABS_HAT0X)))"
},
"pad_right": {
"action": "smooth(8, 0.78, feedback(RIGHT, 256, ball(mouse())))"
},
"stick": {
"action": "sens(1.2, 1.2, XY(axis(Axes.ABS_X), raxis(Axes.ABS_Y)))"
},
"trigger_left": {
"action": "axis(Axes.ABS_Z)"
},
"trigger_right": {
"action": "axis(Axes.ABS_RZ)"
},
"version": 1.4
}
================================================
FILE: default_profiles/XBox Controller.sccprofile
================================================
{
"_": "",
"buttons": {
"A": {
"action": "button(Keys.BTN_GAMEPAD)"
},
"B": {
"action": "button(Keys.BTN_EAST)"
},
"BACK": {
"action": "button(Keys.BTN_SELECT)"
},
"C": {
"action": "hold(menu('Default.menu'), menu('Default.menu'))"
},
"LB": {
"action": "button(Keys.BTN_TL)"
},
"LGRIP": {
"action": "button(Keys.BTN_GAMEPAD)"
},
"RB": {
"action": "button(Keys.BTN_TR)"
},
"RGRIP": {
"action": "button(Keys.BTN_NORTH)"
},
"RPAD": {
"action": "button(Keys.BTN_THUMBR)"
},
"START": {
"action": "button(Keys.BTN_START)"
},
"STICKPRESS": {
"action": "button(Keys.BTN_THUMBL)"
},
"X": {
"action": "button(Keys.BTN_NORTH)"
},
"Y": {
"action": "button(Keys.BTN_WEST)"
}
},
"cpad": {},
"gyro": {
"action": "cemuhook"
},
"is_template": false,
"menus": {},
"pad_left": {
"action": "click(dpad(hatup(Axes.ABS_HAT0Y), hatdown(Axes.ABS_HAT0Y), hatleft(Axes.ABS_HAT0X), hatright(Axes.ABS_HAT0X)))"
},
"pad_right": {
"action": "feedback(RIGHT, 256, XY(axis(Axes.ABS_RX), raxis(Axes.ABS_RY)))"
},
"stick": {
"action": "sens(1.2, 1.2, XY(axis(Axes.ABS_X), raxis(Axes.ABS_Y)))"
},
"trigger_left": {
"action": "axis(Axes.ABS_Z)"
},
"trigger_right": {
"action": "axis(Axes.ABS_RZ)"
},
"version": 1.4
}
================================================
FILE: docs/actions.md
================================================
### In this document
- [Custom Action page](#examples1)
- [List of all known actions](#actions)
- [Macros and operators](#macros)
- [Profile file examples](#examples2)
# <a name="examples1"></a>Custom Action page examples
- To do two or more things at once, type `action() and action()`
- To do two or more things in sequence, type `action() ; action()`
- Typing second action on new line is same thing as using `and`
#### Press button repeadedly, rapid fire mode
`repeat(button(BTN_A))` (see [repeat](#repeat), [button](#button))
#### Press Alt+F4
`button(KEY_LEFTALT) and button(KEY_F4)`
#### Press multiple buttons in sequence
`button(BTN_A) ; button(BTN_X); button(BTN_B)`
#### Press button and hold it for set delay
`press(BTN_A) ; sleep(0.5); release(BTN_B)` (see [press](#press), [sleep](#sleep), [release](#release))
# <a name="actions"></a>Actions
#### <a name="button"></a> button(button1 [, button2 = None ])
- For button, simply maps real button to emulated
- For stick or pad, 'button1' is pressed when stick or finger on pad is moved
to up or left and 'button2' when to down or right.
Using [dpad](#dpad) may be better for such situations.
- For trigger, when trigger is pressed, but until it clicks, 'button2' is
pressed. When trigger clicks 'button2' is released and replaced by 'button1'.
If only 'button1' is set, trigger acts as big button.
Note that 'button2' is always optional.
#### <a name="mouse"></a> mouse(axis)
- For stick, lets cursor or mouse wheel to be controlled by stick tilt.
- For pad, acts as trackpad - sliding finger over pad moves the mouse.
If set to *REL_WHEEL* or *REL_HWHEEL*, emulates finger scroll.
You can use `ball(mouse)` to emulate trackball.
- For gyroscope, controls mouse with changes in controller pitch and roll/yaw.
Axis parameter should be either YAW or ROLL (constants) and decides which
gyroscope axis controls X mouse axis.
- For button, pressing button maps to single movement over mouse axis or
single step on scroll wheel.
#### <a name="mouseabs"></a> mouseabs(axis)
- For stick, lets cursor or mouse wheel to be controlled by stick tilt.
- For pad, distance from center of pad controls speed of mouse movement
- For gyroscope, please, use gyroabs action.
#### <a name="trackpad"></a> trackpad(axis)
Merged with [mouse](#mouse), does same thing.
#### <a name="axis"></a> axis(id [, min = -32767, max = 32767 ])
- For button, pressing button maps to moving axis full way to 'max'.
eleasing button returns emulated axis back to 'min'.
- For stick or pad, simply maps real axis to emulated
- For trigger, maps trigger position to to emulated axis. Note that default
trigger position is not in middle, but in minimal possible value.
#### <a name="dpad"></a> dpad([diagonal_range,] up, down, left, right)
Emulates dpad. Touchpad is divided into 8 triangular parts. When the user
touches the touchpad, action is executed depending on finger position.
'diagonal_range' is specified in degrees (1 to 89). If not set, all parts are
sized equally, otherwise, diagonal parts are taking specified portion of pad
and rest is assigned to up/left/right/down portions.
Available only for pads and sticks.
#### <a name="dpad8"></a> dpad8([diagonal_range,] up, down, left, right, upleft, upright, downleft, downright)
Same as dpad, with more directions.
#### <a name="ring"></a> ring([radius=0.5], inner, outer)
Defines outer and inner ring bindings. When distance of finger from center of
pad is smaller than 'radius', 'inner' action is activated, otherwise, 'outer'
takes place.
Unlike [dpad](#dpad), which executes actions as if they were bound to buttons,
ring works more like defining two actions on same pad with non-overlapping
deadzones.
#### <a name="area"></a> area(x1, y1, x2, y2), <a name="winarea"></a> winarea(x1, y1, x2, y2)
Creates 1:1 mapping between finger position on pad and mouse position in
specified screen area. Coordinates are in pixels with (0,0) on top,left corner.
Negative number can be used to count from other side of screen.
`winarea` does same thing but with position relative to current window instead of entire screen.
#### <a name="relarea"></a> relarea(x1, y1, x2, y2), <a name="relwinarea"></a> relwinarea(x1, y1, x2, y2)
Creates 1:1 mapping between finger position on pad and mouse position in
specified screen area. Coordinates are fractions of screen width and height,
(0,0) is top,left and (1,1) bottom,right corner of screen.
`relwinarea` does same thing but with position relative to current window instead of entire screen.
#### <a name="trigger"></a> trigger(press_level, [release_level, ] action)
Maps action to be executed as by button press when trigger is pressed through
'press_level'. Level goes from 0 to 255, where 255 is level after physical
trigger clicks.
Then, optionally, if trigger is pressed through 'release_level', action is
"released". If release_level is not set, action will be released only after
trigger value moves back beyond press_level.
It's possible to map multiple actions on different trigger levels using [and](#and).
Examples:
Hold right mouse button while trigger is being pressed, press left button when
trigger clicks. Right button is released only when trigger is fully released.
```
trigger(64, 255, button(BTN_RIGHT)) and trigger(255, button(BTN_LEFT))
```
Control left virtual trigger while trigger is being pressed and press left button
just before trigger clicks. If trigger clicks, press enter key and play feedback.
```
trigger(64, 255, axis(ABS_Z))
and
trigger(240, 254, button(BTN_LEFT))
and
trigger(255, feedback(LEFT, button(KEY_ENTER)))
```
#### <a name="hipfire"></a> hipfire([partialpress_level, ][fullpress_level, ] partialpress_action, fullpress_action [, mode][, delay])
Maps two different actions to be executed when trigger is inside a defined range and meet predefined conditions.
Basically, the "partialpress_action" will be activated if the trigger is pressed passed the "partialpress_level" and it stays inside the range between this level and the "fullpress_level" until the "delay" ends, otherwise, the "fullpress_action" will be activated ALONE if the "fullpress_level" is reached before the "delay" ends.
The partial and full levels goes from 0 to 255, and the values 50 and 254 are used for "partialpress_level" and "fullpress_level", respectively, if none is passed.
The "mode" can be defined as described below and the "NORMAL" one is used if none is passed.
Modes available:
- NORMAL - if trigger is pressed beyond the "partialpress_level" and the timeout is reached, the "partialpress_action" is executed. If the "partialpress_action" was pressed it will only be released after the trigger return back beyond the "partialpress_level". The "fullpress_action" will be executed every time the "fullpress_level" is reached, but if this level is reached before the timeout the "partialpres_action" will not be triggered until releasing the trigger.
- EXCLUSIVE - Acts similar to the previous mode, but the "fullpress_action" is only triggered if the "partialpres_action" was not triggered. Meaning it will only activate if the "fullpress_level" is reached before the timeout ends.
- SENSIBLE - Acts similar to NORMAL, but after the "partialpress_action" is activated, releasing the trigger a little, will deactivate the action allowing it to be activated again more faster without needing to release the trigger back beyond the "partialpress_level".
The "delay" is time window used to determine if the "partialpress_action" should or not be activated.
Examples:
Hold right mouse button while trigger is being softly pressed and press left mouse button when trigger click, but will bypass the right mouse button and only press the left mouse button if the trigger is pressed very fast to the click.
```
hipfire(50, 254, button(BTN_RIGHT),button(BTN_LEFT), NORMAL, 0.20)
```
Press A if the trigger is pressed slowly and not reaches the click or press B if the trigger is pressed fast and reached the click, and will execute only one of this two actions.
```
hipfire(50, 254, button(KEY_A),button(KEY_B), EXCLUSIVE, 0.15)
```
#### <a name="gyro"></a> gyro(axis1 [, axis2 [, axis3]])
Maps *changes* in gyroscope pitch, yaw and roll movement into movements of gamepad stick.
Can be used to map gyroscope to camera when camera can be controlled only with analog stick.
#### <a name="gyroabs"></a> gyroabs(axis1 [, axis2 [, axis3]])
Maps absolute gyroscope pitch, yaw and roll movement into movements of mouse
or gamepad stick.
Can be used to map gyroscope to movement stick or to use controller as racing wheel.
#### <a name="resetgyro"></a> resetgyro()
Resets gyroscope offsets so current orientation is treated as neutral.
#### <a name="cemuhook"></a> cemuhook()
When set to gyro, outputs gyroscope data in way compatibile with Cemu, Citra and
other applications using CemuHookUDP motion provider protocol.
#### <a name="tilt"></a> gyro(front_down, front_up, tilt_left, tilt_right)
Maps tilting of gamepad into actions. When gamepad is tilt to one of for supported
sides, assigned action is executed as if by button press and then "released" after
gamepad is balanced again.
#### <a name="trackball"></a> trackball()
Split to [ball](#ball) modifier and [mouse](#mouse) action.
Typing `trackball` works as alias for `ball(mouse())`
#### <a name="XY"></a> XY(xaction, yaction)
Provides way to assign two different actions to two stick or pad axes.
This is automatically handled by GUI, so user usually doesn't need
to write it directly.
#### <a name="relXY"></a> relXY(xaction, yaction)
Works same as [XY](#XY), but treats position where pad is touched as "center"
of pad.
#### <a name="press"></a> press(button)
Presses button and leaves it pressed.
#### <a name="release"></a> release(button)
Releases pressed button.
#### <a name="tap"></a> tap(button, number=1)
Presses button for a short while, 'number' times.
If 'number' is greater than 1 (when double-tap is performed), tapped button
is kept press as long as physical button that started tap is pressed. For single
tap, virtual button is released right away.
If virtual button is already pressed before tapping, it is released first and
restored after tap, resulting in sequence of "release - press - release - press"
#### <a name="profile"></a> profile(name)
Loads another profile
#### <a name="shell"></a> shell(command)
Executes command on background
#### <a name="turnoff"></a> turnoff()
Turns controller off
#### <a name="restart"></a> restart()
Restarts scc-daemon. Don't use unless you have good reason to.
#### <a name="led"></a> led(brightness)
Sets brightness of controller led. 'Brightness' is percent in 0 to 100 range.
#### <a name="osd"></a> osd([timeout=5, [size=3]], text)
Displays message in OSD.
'timeout' sets for how many seconds should message stay visible. Value of 0 has
special meaning and leaves message displayed indefinitely, until profile is
changed or [clearosd](#clearosd) action is used.
'size' sets size of font on message. Only three options are supported right now,
3 for "default size", 2 for "smalller" and 1 for "small".
#### <a name="clearosd"></a> clearosd()
Clears all windows from OSD layer. Cancels all menus, clears all messages,
hides on screen keyboard.
Does _not_ clear OSD windows created using command line tools.
#### <a name="menu"></a> menu(menu [, confirm_button=A [, cancel_button=B [, show_with_release=False]]]])
Displays OSD menu.
'confirm_button' and 'cancel_button' sets which gamepad button should be used to
confirm/cancel menu. Additionaly, 'confirm_button' can be set to SAME (constant),
in which case menu will be closed and selected item choosen when button used to
display menu is released.
If 'show_with_release' is set to true, menu is displayed only after button
is released.
'menu' can be either id of menu defined in same profile file or filename
relative to `~/.config/scc/menus` or `/usr/share/scc/default_menus/`, whichever
exists, in that order.
#### <a name="hmenu"></a> hmenu(menu [, confirm_button=A [, cancel_button=B [, show_with_release=False]]]])
Same as `menu`, but packed in one row.
#### <a name="gridmenu"></a> gridmenu(menu [, confirm_button=A [, cancel_button=B [, show_with_release=False]]]])
Same as `menu`, but displays items in grid.
#### <a name="radialmenu"></a> radialmenu(menu [, confirm_button=A [, cancel_button=B [, show_with_release=False]]]])
Same as `menu`, but displays items in radial menu.
#### <a name="quickmenu"></a> quickmenu(menu)
Special kind of menu controled by buttons instead of stick. Every item has
assigned button and user selects it by pressing that button.
Fast to use, but is limited to 6 items at most.
#### <a name="dialog"></a> dialog([ confirm_button=A [, cancel_button=B ], ] text, action1, [action2... actionN])
Displays OSD dialog. Dialog works similary to horizontal menu and displays
text message above list of options.
#### <a name="keyboard"></a> keyboard()
Displays on-screen keyboard
# Modifiers:
#### <a name="click"></a> click(action)
Creates action action that occurs only if pad or stick is pressed.
For example, `click(dpad(...))` set to pad will create dpad that activates
buttons only when pressed.
#### <a name="pressed"></a> pressed(action)
Creates action that occurs for brief moment when button is pressed.
For example, `pressed(button(A))` will press and instantly release virtual
A button whenever physical button is pressed.
#### <a name="released"></a> released(action)
Creates action that occurs for brief moment when button is released.
#### <a name="touched"></a> pressed(action)
Creates action that occurs for brief moment when finger touches pad.
#### <a name="untouched"></a> released(action)
Creates action that occurs for brief moment when pad is released.
#### <a name="mode"></a> mode(button1, action1, [button2, action2... buttonN, actionN] [, default] )
Defines mode shifting. If physical buttonX is pressed, actionX is executed.
Optional default action is executed if none from specified buttons is pressed.
#### <a name="gestures"></a> gestures([precision=0,] gesture1, action1, [gesture2, action2... gestureN, actionN] )
If set to left or right pad, enables gesture recognition. If GestureX
is drawn, actionX is executed.
If 'precision' is set to 1.0, gesture has to be exact. Otherwise,
gestures resembling input with given precision are compared and
one that matches it most is used. At precision of 0.0, all gestures are considered.
<a name="gesture_format"></a>Gestures are encoded in string and it's
recommended to use GUI to record them. Nevertheless, format is simple:
- Each stroke in one of four directions is stored as single character.
- Characters are uppercase `U`, `D`, `L`, `R` for up, down, left, right
- Default stroke length is 1/3 of pad size.
- For stroke with twice of that length, characters is repeated twice
- Three times for stroke through entire pad, or even more for longer.
- If string starts with lowercase `i`, stroke length is ignored.
#### <a name="doubleclick"></a> doubleclick(doubleclick_action [, normal_action [, timeout ]])
Executes action if user double-clicks button.
Optional normal_action parameter specifies action that is executed when user
click button only once. Optional time arguments modifies maximum delay in
doubleclick and in effect sets delay before normal action is executed.
#### <a name="hold"></a> hold(hold_action [, normal_action [, timeout ]])
Executes action if user holds button for longer time.
Optional normal_action parameter specifies action that is executed when user
click button shortly. Optional time arguments modifies how long "longer time" is.
Hold and doubleclick can be combined together by writing
`hold([time,] hold_action, doubleclick(doubleclick_action, normal_action))`
#### <a name="sens"></a> sens(x_axis [, y_axis [, z_axis]], action)
Modifies sensitivity of physical stick or pad.
#### <a name="rotate"></a> rotate(angle, action)
Rotates input pad or stick input by given angle.
#### <a name="feedback"></a> feedback(side, [amplitude=256 [, frequency=4 [, period=100 [, count=1 ]]]], action)
Enables haptic feedback for specified action, if action supports it.
Side has to be one of LEFT, RIGHT or BOTH. All remaining numbers can be anything
from 1 to 32767, but note that setting count to large number will start long
running feedback that you may not be able to stop.
'frequency' is used only when emulating touchpad and describes how many pixels
should mouse travel between two feedback ticks.
#### <a name="ball"></a> ball([friction=10.0, [mass=80.0, ]] action)
Enables trackball mode. Moving finger over pad will keep repeating same action
with decreasing speed, based on set mass and friction, until virtual
'spinning ball' stops moving.
#### <a name="circular"></a> circular(action)
Designed to controls scroll wheel by scrolling finger around pad.
Can be used with any axis. For example,
`circular(axis(Axes.ABS_X))`
turns touchpad into small raing wheel.
#### <a name="circularabs"></a> circular(action)
Works as to `circular`, but instead of counting with finger movements,
translates exact position on dpad to axis value.
#### <a name="deadzone"></a> deadzone([mode,] lower, [upper, ] action)
Enables deadzone on trigger, pad or stick.
Mode defaults to 'CUT' and can be one of:
- CUT - if value is out of deadzone range, output value is zero
- ROUND - for values bellow deadzone range, output value is zero. For values
above range, output value is maximum allowed.
- LINEAR - input value is scaled, so entire output range is covered by
range of deadzone.
- MINIMUM - any non-zero input value is scaled so entire input range is mapped
to range of deadzone. Zero on input is mapped to zero on output, so there is
area over which output "jumps" when stick is tilted.
#### <a name="smooth"></a> smooth([buffer=8, [multiplier=0.7, [filter=2, ]]] action)
Enables input smoothing. Position is computed as weighed average of last X
input positions with highest weight given to most recent position. If 'filter'
is above zero, movements bellow that value are ignored.
#### <a name="osd"></a> osd([timeout=5], action)
Enables on screen display for action. In most cases just displays action
description in OSD and executes it normally.
Works only if executed by pressing physical button or with `dpad`. Otherwise
just executes child action.
#### <a name="position"></a> position(x, y, action)
Specifies menu position on screen. X is position from left, Y from top. To
specify position from right or bottom, use negative values.
#### <a name="name"></a> name(name, action)
Allow inline setting of action name
# Shortcuts:
#### <a name="raxis"></a> raxis(id)
Shortcut for `axis(id, 32767, -32767)`, that is call to axis with min/max values
reversed. Effectively inverted axis mapping.
#### <a name="hatup"></a> hatup(id)
Shortcut for `axis(id, 0, 32767)`, emulates moving hat up or pressing 'up'
button on dpad.
#### <a name="hatdown"></a> hatdown(id)
Shortcut for `axis(id, 0, -32767)`, emulates moving hat down or pressing 'down'
button on dpad.
#### <a name="hatleft"></a> hatleft(id), <a name="hatright"></a> hatright(id)
Same thing as hatup/hatdown, as vertical hat movement and left/right dpad
buttons are same events on another axis
# <a name="macros"></a>Macros and operators
#### <a name="and"></a> and - executing actions at once
It is possible to join two (or more) actions with `and` keyword (or newline) to have them executed together.
- `button(KEY_LEFTALT) and button(KEY_F4)` presses Alt+F4
#### <a name="semicolon"></a> semicolon - sequence (macro)
When `;` is placed between actions, they are executed as sequence.
- `hatup(ABS_Y); hatup(ABS_Y); button(BTN_B); button(BTN_A)` presses 'UP UP B A' on gamepad, as fast as possible
- `button(KEY_A); button(KEY_B); button(KEY_C)` types 'abc'.
#### <a name="type"></a> type('text')
Special type of macro where keys to press are specified as string.
Basically, writing `type("iddqd")` is same thing as `button(KEY_I) ; button(KEY_D) ;
button(KEY_D); button(KEY_Q); button(KEY_D)`, just much shorter.
#### <a name="sleep"></a> sleep(x)
To insert pause between macro actions, use sleep() action.
- `button(KEY_A); button(KEY_B); sleep(1.0); button(KEY_C)` types 'ab', waits 1s and types 'c'
#### <a name="repeat"></a> repeat(action)
Turbo / rapid fire mode. Repeats macro (or even single action) until physical button is released. Macro is always played to end, even if button is released before macro is finished.
- `repeat(button(BTN_X))` deals with "mash X to not die" events in some games.
#### <a name="cycle"></a> cycle(action1, action2...)
Executes different action every time when button is pressed (action1 upon first press, action2 with second, etc.)
Works only on buttons.
# <a name="examples2"></a>Examples for profile file
Emulate key presses based on stick position
```
"stick" : {
"X" : { "action" : "pad(KEY_A, KEY_D)" },
"Y" : { "action" : "key(KEY_W, KEY_S)" },
```
Emulate left/right stick movement with X and B buttons
```
"buttons" : {
"B" : { "action" : "axis(ABS_X, 0, 32767)" },
"X" : { "action" : "axis(ABS_X, 0, -32767)" },
```
Emulate dpad on left touchpad, but act only when dpad is pressed
```
"left_pad" : {
"action" : "click( dpad('hatup(ABS_HAT0Y)', 'hatdown(ABS_HAT0Y)', 'hatleft(ABS_HAT0X)', 'hatright(ABS_HAT0X)' ) )"
}
```
Emulate button A when left trigger is half-pressed and button B when
it is pressed fully
```
"triggers" : {
"LEFT" : { "action" : "pad(BTN_A, BTN_B)" },
```
================================================
FILE: docs/menu-file.md
================================================
SC-Controller menu file specification
----------------------------------------
Menu file contains json-encoded list with menu items (actions), submenus,
separators and menu generators.
### Menu Items
Every menu item is defined by action, in same way as action would be defined
[in profile file](profile-file.md#Action_definition) with one additional
`id` key. `id` specifies action ID and can be anything, but each menu item
should have unique ID.
`name` key is still optional, but highly recommended as used as menu item title
displayed on screen. If `name` is not specified, title is auto-generated.
Example:
[{
"id": "item1",
"action": "profile('Desktop')",
"name": "Switch to Desktop profile",
}, {
"id": "item2",
"action": "turnoff()",
"name": "Turn controller OFF",
}]
specifies menu with two items.
### Submenus
Submenu is reference to another menu file (submenu cannot be defined in same
file or profile file). When selected, another menu is loaded and drawn over
original menu.
Submenu is dict with `submenu` key, value of key is filename relative to
`~/.config/scc/menus` or `/usr/share/scc/default_menus/`, whichever exists, in
that order.
`name` key may be defined.
Example:
[{
"submenu": "profiles.menu",
"name": "All Profiles"
}]
specifies menu with sumbmenu called "All Profiles" defined in *profiles.menu*
### Separators
Separator is empty space that splits menu into two or more logical blocks.
Name, if set, is displayed in different way from menu items. Separator is
defined by dict with `separator` key set to True.
### Menu Generators
Generator is something that generates menu items automatically. It is defined
by dict with `generator` key, where value is type of generator to use.
Example:
[{
"generator": "profiles"
}, {
"id": "item2",
"action": "turnoff()",
"name": "Turn controller OFF",
}]
specifies menu with list of all profiles, followed by one normal menu item.
### Available generators
#### `profiles`
Generates menu item for each available profile. Selecting item will switch to
represented profile.
#### `recent`
Generates menu item for *X* recently selected profiles. *X* is 5 by default and
can be set with additional `rows` key.
================================================
FILE: docs/profile-file.md
================================================
SC-Controller profile file specification
----------------------------------------
Profile file contains json-encoded dictonary with specific keys. Missing keys are substituted with defaults, unknown keys are ignored. See [Desktop.sccprofile](../default_profiles/Desktop.sccprofile) for example.
Root dictonary has to contain following keys:
- `buttons` - contains subkey for controller buttons. See [buttons](#buttons).
- `pad_left` - sets action executed when finger is moved on left touchpad.
- `pad_right` - ... when finger is moved on right touchpad.
- `stick` - ... when stick angle is changed.
- `trigger_left` - ... when left trigger value is changed.
- `trigger_right` - ... when right trigger value is changed.
- `gyro` - ... when gyroscope reading changes. Gyroscope in is activated only if this key is set to something else than `NoAction`
- `menus` - stores menus saved in profile. See [menus](#menus).
- `version` - profile file version. Current version is _1_. See If not pressent, _0_ is assumed. If profile file version is lower than expected, automatic conversion may happen. This conversion is in-memory only, but changing and saving such profile in GUI will save converted data.
See [actions.md](actions.md) file for list of possible actions.
## <A name="Action_definition"></a>Action definition
Action definition is dictionary containing `action` key and optional `name` key. Value assigned to `action` describes action to be executed.
`action` key can describe entire action, but for better readability, it is also possible to specify additional properties using [additional keys](#Additional_keys).
For example,
{
"trigger_left": {
"action": "axis(Axes.ABS_Z)",
"name": "Aim",
}}
assigns `axis` action with *Axes.ABS_Z* parameter to left trigger.
## <a name="Additional_keys"></a>Additional keys in action definition
#### `X` and `Y`
Turns action into `XYAction`, allowing to specify different action for each pad
or stick axis. If either of keys is specified, `action` key is ignored.
Example:
"stick" : {
"X": { "action": "axis(Axes.ABS_RX)" },
"Y": { "action": "raxis(Axes.ABS_RY)" }
},
is same as
`"stick" : { "action" : "XY(axis(Axes.ABS_RX), raxis(Axes.ABS_RY))" }`
#### `levels`
Turns action into `TriggerAction`, allowing to specify lower and upper trigger
levels among which is action executed.
Example:
"trigger_left": {
"action": "button(BTN_LEFT)",
"levels": [127, 255]
},
Sets action that presses left mouse button, but only if trigger
is roughly half-pressed.
#### `dpad`
Turns action into `DPadAction`, allowing to assign different action for each
side of pad or stick alignment.
Example:
"dpad" : [
{ "action": "button(Keys.KEY_UP)" },
{ "action": "button(Keys.KEY_DOWN)" },
{ "action": "button(Keys.KEY_LEFT)" },
{ "action": "button(Keys.KEY_RIGHT)" }
],
#### `ring`
Defines outer and inner ring bindings. Expects keys with 'inner' and 'outer'
actions and 'radius' as float value, but all keys are optional.
Example:
"pad_left": {
"ring": {
"inner": { "action": "XY(axis(Axes.ABS_X), raxis(Axes.ABS_Y))" },
"outer": { "action": "XY(axis(Axes.ABS_RX), raxis(Axes.ABS_RY))" },
"radius": 0.4
}
},
defines inner ring binding controlling left stick and outer ring right stick
of emulated gamepad.
#### `tilt`
Turns action into `TiltAction`, allowing to assign different action for tilting
dpad. Works pretty-much as `dpad` on gyro.
Example:
"tilt" : [
{ "action": "button(Keys.KEY_UP)" },
{ "action": "button(Keys.KEY_DOWN)" },
{ "action": "button(Keys.KEY_LEFT)" },
{ "action": "button(Keys.KEY_RIGHT)" }
],
#### `deadzone`
Specifies deadzone. Allows for `lower` and `upper` subkeys defaulting to
*0* and *32767* and `mode` subkey defaulting to 'CUT'.
See see [deadzone modifier](actions.md#deadzone) for list of modes.
Example:
"trigger_left": {
"mode" : "linear",
"action": "axis(Axes.ABS_Z)",
"deadzone": {
"lower": 100,
"upper": 200
}},
#### `sensitivity`
Specifies input sensitivity. Value is list with one or two values for sensitivity
over X and Y axis (or one value for sensitivity of trigger.)
Default sensitivity is 1.0
Example:
"stick" : {
"action": "trackball()",
"sensitivity": [2.0, 0.5]
},
doubles sensitivity over X and halves over Y axis.
#### `rotate`
Rotates input pad or stick input by given angle.
Example:
"stick" : {
"action": "trackball()",
"rotate": 15
},
#### `feedback`
Enables haptic feedback for action. Value is list with one to three values
specifying feedback position (*'LEFT'*, *'RIGHT'* or *'BOTH'*),
amplitude and frequency.
Example:
"pad_left": {
"action": "trackball()",
"feedback": ["LEFT", 512.0, 5.0]
},
specifies feedback with amplitude of 512 (default vlaue)
and frequency of 5 generated by left motor.
#### `smooth`
Enables input smoothing (see [smooth modifier](actions.md#smooth))
Example:
"pad_left": {
"action": "trackball()",
"smooth": [ 8, 0.7, 2.0 ]
},
enables smoothing with buffer of 8 and modifier set to 0.7.
#### `osd`
If set to True, enables OSD for action.
Example:
"X": {
"action": "button(Keys.BTN_EAST)",
"osd": true
},
enables OSD feedback for X button.
#### `click`
If set to True, enables 'click' modifier, making action executed only when
pad or stick is pressed.
Example:
"pad_left": {
"action": "mouse()",
"click": True
},
#### `ball`
If set to value, enables trackball mode. Value is list with zero to two values
specifying friction and mass of virtual 'spinning ball'.
See [ball modifier](actions.md#ball) for more info.
Example:
"pad_left": {
"action": "mouse()",
"ball": [ 10.0 ]
},
#### `circular`
Designed to controls scroll wheel by scrolling finger around pad, but can
be used with any axis.
Example:
"pad_left": {
"action": "mouse(Rels.REL_WHEEL)",
"circular": true
},
#### `circularabs`
Works as to `circular`, but instead of counting with finger movements,
translates exact position on dpad to axis value.
Example:
"pad_left": {
"action": "circularabs(Rels.REL_WHEEL)",
"circular": true
},
#### `modes`
Defines mode shifting (see [mode modifier](actions.md#mode)).
Value is dict with physical key names (A, B, X, Y...) as keys and actions
for each mode as values. Action on same level as `mode` is used as default
action.
Example:
"modes": {
"A": { "action": "mouse()" },
"B": { "action": "XY( axis(Axes.ABS_X), raxis(Axes.ABS_Y) )" }
},
defines pad or stick that controls mouse while button A is pressed
and left virtual stick while button B is pressed.
#### `gestures`
Enables gesture cognition on pad (see [gestures modifier](actions.md#gestures)).
Value is dict with encoded gestures (see [description in actions.md](actions.md#gesture_format)) and actions
for each gesture as values.
Example:
"gestures": {
"UD": { "action": "button(Key.R)" }
},
enables gesture recognition with single gesture activated when user does short stroke up followed by short stroke down.
#### `doubleclick`
Defines action that is executed when user double-clicks with button.
Optional `time` key can be used on same level as `doubleclick` to modify
double-click time.
Example:
"buttons": {
"A": {
"action": "button(KEY_X)",
"doubleclick": { "action": "button(KEY_Z)" },
"time": 5
}
}
defines button that emulates pressing X key when pressed normally and
pressing Z key when doubleclicked.
#### `hold`
Defines action that is executed when user holds button for short time.
Optional `time` key can be used on same level as `hold` to modify
double-click time.
Example:
"buttons": {
"A": {
"action": "button(KEY_X)",
"hold": { "action": "button(KEY_Z)" },
"time": 5
}
}
defines button that emulates pressing X key when pressed normally and
pressing Z key when held for 5 seconds.
## <a name="buttons"></a>Buttons
`buttons` is dictionary with keys for each gamepad button.
Possible keys are:
- `X`, `Y`, `A` and `B` for colored buttons
- `C` for Steam button in center
- `SELECT` and `START` for small "( < )" and "( > )" buttons
- `LB` and `RB` for left and right bumper
- `LPAD`, `RPAD` and `STICK` for presing pads or stick.
All keys are optional. Value for each key is [action definition](#Action_definition)
Example:
"buttons": {
"A": { "action": "button(Keys.BTN_WEST)", },
"B": { "action": "osd('Hello world!')" },
"BACK": { "action": "button(Keys.KEY_LEFTCTRL) and button(Keys.KEY_A)" },
}
## <a name="menus"></a>Menus
`menus` is dictionary with menus stored along with profile. Keys are IDs of
menus; Menu ID can contain any characters but dots (".") and slashes ("/").
Value for each key is same as root list in [menu file](menu-file.md)
================================================
FILE: docs/protocol.md
================================================
SCCDaemon Protocol specification
--------------------------------
To control running daemon instance, unix socket in user directory is used.
Controlling protocol uses case-sensitive messages terminated by newline. Message type and message arguments are delimited by `:`.
When new connection is accepted, daemon sends some info:
```
SCCDaemon
Version: 0.2.6
PID: 123456
Current profile: filename.sccprofile
Ready.
```
Connection is then held until client side closes it.
### Messages sent by daemon:
#### `Controller Count: n`
Informs about total number of connected controllers.
Always sent after `Controller:` messages
#### `Controller: controller_id type flags config_file`
Provides info about controller 'n'.
- `controller_id` is unique string identifier of controller (should stay same at
least until daemon exits) and doesn't contains spaces.
- `type` is string identifier (without spaces) of driver.
- `flags` describes controller features, such as having central touchpad.
See ControllerFlags definition in scc/constants.py for more info.
- `config_file` is None or file name of json-encoded file that can GUI use
to get additional data about controller (background image, button images, etc)
File name may be absolute path or just name of file in /usr/share/scc
This message is repeated for every connected controller and followed by
`Controller Count:` message. It is automatically sent to every client when
number of connected controllers changes. It is also sent automatically to
every new client.
#### `Controller profile: controller_id filename.sccprofile`
Sent to every client when profile file for any controller is loaded and used.
Also sent automatically to every new client.
#### `Current profile: filename.sccprofile`
Similar to `Controller profile:`, sent to every client when profile file for
first controller is loaded and used. Also sent automatically to every new client.
Unlike `Controller profile:`, this message is sent even if there is no
controller connected.
#### `Event: source values`
Sent to client that requested locking of source (that is button, pad or axis).
List of possible events:
- `Event: B 1` - Sent when button is pressed. *B* is button, is one of *SCButtons.\** constants.
- `Event: B 0` - Sent when button is released. *B* is button one of *SCButtons.\** constants.
- `Event: STICK x y` - Sent when stick position is changed. *x* and *y* are new values.
- `Event: LEFT x y` - Sent when finger on left pad is moved. *x* and *y* is new position.
- `Event: RIGHT x y` - Sent when finger on right pad is moved. *x* and *y* is new position.
#### `Error: message`
Sent to every client when error is detected. May be sent repeatedly to indicate
multiple errors.
After all error conditions are cleared, `Ready.` is sent to indicate that emulation works again.
#### `Fail: text`
Indicates error as response to client's request.
#### `Gesture: side gesturestring`
Sent to client that requested gesture to be detected.
#### `OK.`
Indicates sucess as response to client's request.
### `OSD: tool param1 param2...`
Send to scc-osd-daemon when osd-related action is requested.
*tool* can be *'message'*, *'menu'*, *'hmenu'*, *'gridmenu'*,*'radialmenu'* or *'gesture'*
*params* are same as command-line arguments for scc-osd-* script with that name.
#### `PID: xyz`
Reports PID of *scc-daemon* instance. Automatically sent when connection is accepted.
#### `Ready.`
Automatically sent when connection is accepted to indicate that there is no error and daemon is working as expected.
#### `Reconfigured.`
Sent to all clients when daemon receives `Reconfigure.` message.
#### `SCCDaemon`
Just identification message, automatically sent when connection is accepted.
Can be either ignored or used to check if remote side really is *scc-daemon*.
#### `State: ....`
Sent to client as response to `State.` message. String after colon describes
current state of controller (such as pressed buttons and stick position...)
and is device-specific.
#### `Version: x.y.z`
Identifies daemon version. Automatically sent when connection is accepted.
## Commands sent from client
#### `Controller: controller_id`
By default, all messages sent from client are related to first connected
controller. This message changes which controller are following messages meant
for.
If controller with specified controller_id is known, daemon responds with `OK.`
Otherwise, `Fail: no such controller` error message is sent.
#### `Controller.`
Restores default state after controller is chosen.
Daemon responds with `OK.`
#### `Gesture: side up_angle`
Requests gesture to be detected on one of pads. 'side' can be LEFT or RIGHT.
'up_angle' is angle in radians and sets how much should be gesture input
rotated.
Daemon always responds with `OK.` unless request cannot be parsed.
Then, when gesture detection is completed, daemon sends
`Gesture: side detectedgesture` message. If gesture detection fails for any
reason, sent gesture is empty.
#### `Led: brightness`
Sets brightness of controller led. 'Brightness' is percent in 0 to 100 range.
Daemon responds with `OK.`, unless 'brightness' cannot be parsed, in which case
`Fail: ...` with error message is sent.
#### `Lock: button1 button2...`
Locks physical button, axis or pad. Events from locked sources are not processed normally, but sent to client that initiated lock.
Only one client can have one source locked at one time. Second attempt to lock already locked source will fail and `Fail: cannot lock <button>` will be sent as response. Locking is done only if all requested sources are free and in such case, daemon responds with `OK.`
While source is locked, daemon keeps sending `Event: ...` messages every time when button is pressed, released, axis moved, etc...
Unlocking is done automatically when client is disconnected, or using `Unlock.` message.
#### `Observe: button1 button2...`
Enables observing on physical button, axis or pad. Works like Lock, but events from observed sources are processed normally and to client at same time.
Any number of clients can observe same source, so upon this requests, daemon always responds with `OK.`, as long as observing is enabled in configuration.
While source is observed, daemon keeps sending `Event: ...` messages every time when button is pressed, released, axis moved, etc...
Unlocking is done automatically when client is disconnected, or using `Unlock.` message.
#### `Replace: button actionstring`
Temporally replaces action set on physical button, axis or pad. This works in
same way as lock, so action is restored when client requesting change disconnects
or call `Unlock.`
If requested button (axis, pad) is already locked, daemon will respond with
`Fail: cannot lock <button>`. If action string (which can contain spaces)
cannot be parsed, daemon responds with `Fail: failed to parse: <more info>`.
If everything went well, daemon respnds with `OK.`
#### `Feedback: position amplitude`
Asks daemon to generate feedback effect. Position can be one of 'LEFT', 'RIGHT' or 'BOTH' and
amplitude is integer in range 0 to 32767 and controls power of generated effect.
Daemon responds with `OK.`
#### `OSD: text to display`
Asks daemon to display OSD message. No escaping or quoting is needed, everything after colon is displayed
as text.
If OSD cannot be used (for example because daemon runs without X server), daemon responds with `Fail: ....` message.
Otherwise daemon responds with `OK.`. Note that doesn't necessary mean that OSD is visible to user, only
that scc-daemon managed to send request to scc-osd-daemon.
#### `Profile: filename.sccprofile`
Asks daemon to load another profile. No escaping or quoting is needed, everything after colon is used as filename. Additional spaces and tabs are stripped.
If profile is sucessfully loaded, daemon responds with `OK.` to client that initiated loading and sends `Current profile: ...` message to all clients.
If loading fails, daemon responds with `Fail: ....` message where error with entire backtrace is sent. Backtrace is escaped to fit it on single line.
#### `Reconfigure.`
Asks daemon to reload configuration file (`~/.config/scc/config.json`).
Daemon reloads and reapplies all controller configs and sends `Reconfigured.`
message to all connected clients, what causes them to reload configuration
file as well.
Daemon responds with `OK.`
#### `Register: value`
Send by scc-osd-daemon and scc-autoswitch-daemon to register their client connections.
When sent with same value with two or more clients, daemon will automatically close former connection
before registering new one.
scc-osd-daemon sends `Register: osd`
scc-autoswitch-daemon `Register: autoswitch`
Daemon responds with `OK.`
#### `Rescan.`
Asks daemon to rescan for new devices. Drivers may re-read its configuration if needed.
Daemon responds with `OK.`
#### `Restart.`
Restarts daemon. This has same effect as calling "scc-daemon restart", as that's exactly what
gets called. All clients are disconnected immediately, so there is no response.
#### `Selected: menu_id item_id`
Send by scc-osd-daemon when user chooses item from displayed menu.
If menu_id or item_id contains spaces or quotes, it should be escaped.
Daemon responds with `OK.`
#### `State.`
Asks daemon to sent current state of controller. Format of response is device-specific,
but should be useful enough for single-purpose script or debugging.
If observing is not enabled in configuration, daemon responds with `Fail: Sniffing disabled.`
If there is no active controller, daemon responds with `Fail: no controller connected`.
Otherwise, daemon responds with `State: ...` message.
#### `Gestured: gesture_string`
Send by scc-osd-daemon, when user draws gesture. Sent only after requested
by `OSD: gesture`. If user gesture cannot be recognized or user cancels it,
'3|' (valid gesture string with no meaning) is reported.
Daemon responds with `OK.`
#### `Turnoff.`
Turns off all controllers.
Daemon responds with `OK.`
#### `Unlock.`
Unlocks everything locked with `Lock...` and `Observe...` messages sent by same client.
It is not possible to unlock only one input or only one type of lock.
This operation cannot fail (and does nothing if there is nothing to unlock), so daemon always responds with `OK.`
================================================
FILE: gamecontrollerdb.txt
================================================
# Game Controller DB for SDL in 2.0.9 format
# Source: https://github.com/gabomdq/SDL_GameControllerDB
# Linux
03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00001038000000010000,8Bitdo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux,
03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,
05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,
03000000022000000090000011010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00002038000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000190000011010000,8Bitdo NES30 Pro 8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00000061000000010000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
030000003512000012ab000010010000,8Bitdo SFC30 GamePad,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux,
05000000102800000900000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00003028000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000260000011010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000202800000900000000010000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
030000005e0400008e02000020010000,8BitDo Wireless Adapter (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000c82d00000031000011010000,8BitDo Wireless Adapter (DInput),a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
050000005e040000e002000030110000,8BitDo Zero 2 (XInput),a:b0,b:b1,back:b6,leftshoulder:b4,rightshoulder:b5,dpup:-a1,dpdown:+a1,dpleft:-a0,dpright:+a0,start:b7,x:b2,y:b3,platform:Linux,
05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000a00500003232000001000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
05000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
03000000c01100000355000011010000,ACRUX USB GAME PAD,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,platform:Linux,
030000006f0e00001302000000010000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e00003901000020060000,Afterglow Controller for Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e00003901000013020000,Afterglow Prismatic Wired Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000100000008200000011010000,Akishop Customs PS360+ v1.66,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000007c1800000006000010010000,Alienware Dual Compatible Game Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Linux,
05000000491900000204000021000000,Amazon Fire Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000790000003018000011010000,Arcade Fightstick F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
05000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux,
05000000050b00000045000040000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux,
03000000120c00000500000010010000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux,
03000000c62400001b89000011010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000c21100000791000011010000,Be1 GC101 Controller 1.03 mode,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000c31100000791000011010000,Be1 GC101 GAMEPAD 1.03 mode,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
030000005e0400008e02000003030000,Be1 GC101 Xbox 360 Controller mode,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000666600006706000000010000,boom PSX to PC Converter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux,
03000000ffff0000ffff000000010000,Chinese-made Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
030000000b0400003365000000010000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Linux,
03000000260900008888000000010000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Linux,
03000000a306000022f6000011010000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
03000000b40400000a01000000010000,CYPRESS USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux,
03000000790000001100000010010000,Data Frog SNES controller,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux,
03000000790000000600000010010000,DragonRise Inc. Generic USB Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux,
030000004f04000004b3000010010000,Dual Power 2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,
030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux,
03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000008f0e00000800000010010000,Gasia Co. Ltd PS(R) Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,x:b2,y:b3,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux,
030000006f0e00001304000000010000,Generic X-Box pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000007d0400000540000000010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
03000000280400000140000000010000,Gravis GamePad Pro USB ,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000008f0e00000610000000010000,GreenAsia Electronics 4Axes 12Keys GamePad ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux,
030000008f0e00001200000010010000,GreenAsia Inc. USB Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
0500000047532067616d657061640000,GS gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
03000000f0250000c383000010010000,GT VX2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
06000000adde0000efbe000002010000,Hidromancer Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,a:b1,b:b2,back:b8,guide:b9,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux,
03000000c9110000f055000011010000,HJC Game GAMEPAD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
03000000632500002605000010010000,HJD-X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
030000000d0f00000d00000000010000,hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftx:b4,lefty:b5,rightshoulder:b7,start:b9,x:b1,y:b2,platform:Linux,
030000000d0f00001000000011010000,HORI CO. LTD. FIGHTING STICK 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f0000c100000011010000,HORI CO. LTD. HORIPAD S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00006a00000011010000,HORI CO. LTD. Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00006b00000011010000,HORI CO. LTD. Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00002200000011010000,HORI CO. LTD. REAL ARCADE Pro.V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00008500000010010000,HORI Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00008600000002010000,Hori Fighting Commander,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000000d0f00005f00000011010000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00005e00000011010000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f0000aa00000011010000,HORI Real Arcade Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
030000000d0f0000d800000072056800,HORI Real Arcade Pro S,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,
030000000d0f00001600000000010000,Hori Real Arcade Pro.EX-SE (Xbox 360),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux,
030000000d0f00006e00000011010000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00006600000011010000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f0000ee00000011010000,HORIPAD mini4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00006700000001010000,HORIPAD ONE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000008f0e00001330000010010000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Linux,
03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000830500006020000010010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,
050000006964726f69643a636f6e0000,idroid:con,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000b50700001503000010010000,impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,
03000000d80400008200000003000000,IMS PCU#0 Gamepad Interface,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux,
03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),a:b3,b:b4,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b7,x:b0,y:b1,platform:Linux,
0500000049190000020400001b010000,Ipega PG-9069 - Bluetooth Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b161,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000632500007505000011010000,Ipega PG-9099 - Bluetooth Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux,
03000000300f00001001000010010000,Jess Tech Dual Analog Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,
03000000300f00000b01000010010000,Jess Tech GGE909 PC Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux,
050000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux,
030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux,
050000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux,
03000000242f00002d00000011010000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000242f00008a00000011010000,JYS Wireless Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux,
030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006d040000d1ca000000000000,Logitech ChillStream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006d0400001ec2000019200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006d0400000ac2000010010000,Logitech Inc. WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Linux,
030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux,
050000004d4f435554452d3035305800,M54-PC,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,platform:Linux,
05000000380700006652000025010000,Mad Catz C.T.R.L.R ,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000380700005032000011010000,Mad Catz FightPad PRO (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000380700005082000011010000,Mad Catz FightPad PRO (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux,
03000000380700008034000011010000,Mad Catz fightstick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000380700008084000011010000,Mad Catz fightstick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000380700008433000011010000,Mad Catz FightStick TE S+ (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000380700008483000011010000,Mad Catz FightStick TE S+ (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000380700003847000090040000,Mad Catz Wired Xbox 360 Controller (SFIV),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000380700001888000010010000,MadCatz PC USB Wired Stick 8818,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000380700003888000010010000,MadCatz PC USB Wired Stick 8838,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000120c00000500000000010000,Manta Dualshock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux,
03000000790000004318000010010000,Mayflash GameCube Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux,
03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux,
0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
0300000025090000e803000001010000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,
03000000780000000600000010010000,Microntek USB Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
030000005e0400000e00000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux,
030000005e0400008e02000004010000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e0400008e02000062230000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
050000005e040000050b000003090000,Microsoft X-Box One Elite 2 pad,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
030000005e040000e302000003020000,Microsoft X-Box One Elite pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e040000d102000001010000,Microsoft X-Box One pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e040000dd02000003020000,Microsoft X-Box One pad (Firmware 2015),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e040000d102000003020000,Microsoft X-Box One pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e0400008502000000010000,Microsoft X-Box pad (Japan),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
030000005e040000000b000008040000,Microsoft Xbox One Elite 2 pad - Wired,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e040000ea02000008040000,Microsoft Xbox One S pad - Wired,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000c62400001a53000000010000,Mini PE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,
05000000d6200000e589000001000000,Moga 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,
05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,
05000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,
03000000c62400002b89000011010000,MOGA XP5-A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
05000000c62400002a89000000010000,MOGA XP5-A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b22,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
05000000c62400001a89000000010000,MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000250900006688000000010000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,
030000006b140000010c000010010000,NACON GC-400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000000d0f00000900000010010000,Natec Genesis P44,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,platform:Linux,
060000007e0500000820000000000000,Nintendo Combined Joy-Cons (joycond),a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux,
03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b0,y:b3,platform:Linux,
050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
050000007e0500000920000001800000,Nintendo Switch Pro Controller (joycond),a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
030000007e0500000920000011810000,Nintendo Switch Pro Controller Wired (joycond),a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
050000007e0500003003000001000000,Nintendo Wii Remote Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,
05000000010000000100000003000000,Nintendo Wiimote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000000d0500000308000010010000,Nostromo n45 Dual Analog Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux,
03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
19000000010000000100000001010000,odroidgo2_joypad,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux,
19000000010000000200000011000000,odroidgo2_joypad_v11,a:b1,b:b0,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b12,leftshoulder:b4,leftstick:b14,lefttrigger:b13,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b16,start:b17,x:b2,y:b3,platform:Linux,
030000005e0400000202000000010000,Old Xbox pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux,
05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux,
03000000830500005020000010010000,Padix Co. Ltd. Rockfire PSX/USB Bridge,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Linux,
03000000790000001c18000011010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
030000006f0e0000b802000001010000,PDP AFTERGLOW Wired Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e0000b802000013020000,PDP AFTERGLOW Wired Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e00008001000011010000,PDP CO. LTD. Faceoff Wired Pro Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000006f0e00003101000000010000,PDP EA Sports Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e00008701000011010000,PDP Rock Candy Wired Controller for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
030000006f0e00000901000011010000,PDP Versus Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000006f0e0000a802000023020000,PDP Wired Controller for Xbox One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000006f0e00008501000011010000,PDP Wired Fight Pad Pro for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
05000000491900000204000000000000,PG-9118,x:b76,a:b73,b:b74,y:b77,back:b83,start:b84,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b79,lefttrigger:b81,rightshoulder:b80,righttrigger:b82,leftstick:b86,rightstick:b87,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Linux,
0500000049190000030400001b010000,PG-9099,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
030000004c050000da0c000011010000,Playstation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000c62400001a58000001010000,PowerA Xbox One Cabled,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,
030000004c0500006802000010810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,
030000004c0500006802000011810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
030000006f0e00001402000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000008f0e00000300000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
050000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,
050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,
060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,
030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000004c050000a00b000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000004c050000c405000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
050000004c050000c405000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000300f00001211000011010000,QanBa Arcade JoyStick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux,
030000009b2800003200000001010000,Raphnet Technologies GC/N64 to USB v3.4,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
030000009b2800006000000001010000,Raphnet Technologies GC/N64 to USB v3.6,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
030000009b2800000300000001010000,raphnet.net 4nes4snes v1.5,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux,
030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000008916000000fd000024010000,Razer Onza Tournament Edition,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000321500000204000011010000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000321500000104000011010000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000321500000810000011010000,Razer Panthera Evo Arcade Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000321500000010000011010000,Razer RAIJU,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000321500000011000011010000,Razer Raion Fightpad for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux,
0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux,
030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
03000000a30600001005000000010000,Saitek P150,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b2,righttrigger:b5,x:b3,y:b4,platform:Linux,
03000000a30600000701000000010000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Linux,
03000000a30600000cff000010010000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b0,y:b1,platform:Linux,
03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux,
03000000300f00001201000010010000,Saitek P380,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,
03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux,
03000000a30600000b04000000010000,Saitek P990 Dual Analog Pad,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux,
03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
03000000a306000020f6000011010000,Saitek PS2700 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
03000000d81d00000e00000010010000,Savior,a:b0,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b9,x:b4,y:b5,platform:Linux,
03000000c01600008704000011010000,Serial/Keyboard/Mouse/Joystick,a:b12,b:b10,back:b4,dpdown:b2,dpleft:b3,dpright:b1,dpup:b0,leftshoulder:b9,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b8,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b5,x:b13,y:b11,platform:Linux,
03000000f025000021c1000010010000,ShanWan Gioteck PS3 Wired Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000632500007505000010010000,SHANWAN PS3/PC Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000bc2000000055000010010000,ShanWan PS3/PC Wired GamePad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
030000005f140000c501000010010000,SHANWAN Trust Gamepad,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,platform:Linux,
03000000632500002305000010010000,ShanWan USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000341a00000908000010010000,SL-6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
050000004c050000e60c000000810000,Sony DualSense Wireless,a:b0,b:b1,x:b3,y:b2,back:b8,guide:b10,start:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,
030000005e0400008e02000073050000,Speedlink TORID Wireless Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000d11800000094000011010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000de2800004211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux,
03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,
05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,
05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000381000003014000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000381000003114000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000ad1b000038f0000090040000,Street Fighter IV FightStick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000003b07000004a1000000010000,Suncom SFX Plus for USB,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Linux,
03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,
0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux,
03000000457500002211000010010000,SZMY-POWER CO. LTD. GAMEPAD,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
030000008f0e00000d31000010010000,SZMY-POWER CO. LTD. GAMEPAD 3 TURBO,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000008f0e00001431000010010000,SZMY-POWER CO. LTD. PS3 gamepad,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux,
030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,
030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,
030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000004f0400000ed0000011010000,ThrustMaster eSwap PRO Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000b50700000399000000010000,Thrustmaster Firestorm Digital 2,a:b2,b:b4,back:b11,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b0,righttrigger:b9,start:b1,x:b3,y:b5,platform:Linux,
030000004f04000003b3000010010000,Thrustmaster Firestorm Dual Analog 2,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b9,rightx:a2,righty:a3,x:b1,y:b3,platform:Linux,
030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Linux,
030000004f04000026b3000002040000,Thrustmaster Gamepad GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000c6240000025b000002020000,Thrustmaster GPX Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000004f04000007d0000000010000,Thrustmaster T Mini Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000004f04000012b3000010010000,Thrustmaster vibrating gamepad,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,
03000000bd12000015d0000010010000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux,
03000000d814000007cd000011010000,Toodles 2008 Chimp PC/PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux,
030000005e0400008e02000070050000,Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000c01100000591000011010000,Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux,
03000000790000001100000000010000,USB Gamepad1,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux,
030000006f0e00000302000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000006f0e00000702000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
05000000ac0500003232000001000000,VR-BOX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
03000000791d00000103000010010000,Wii Classic Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
050000000d0f0000f600000001000000,Wireless HORIPAD Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e040000a102000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e040000a102000007010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
0000000058626f782033363020576900,Xbox 360 Wireless Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux,
030000005e040000a102000014010000,Xbox 360 Wireless Receiver (XBOX),a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
030000005e040000d102000002010000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
050000005e040000fd02000030110000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
030000005e040000ea02000000000000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
050000005e040000e002000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
050000005e040000fd02000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
030000005e040000ea02000001030000,Xbox One Wireless Controller (Model 1708),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e040000120b000001050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
050000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
050000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
030000005e0400008e02000000010000,xbox360 Wireless EasySMX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000450c00002043000010010000,XEOX Gamepad SL-6556-BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
03000000ac0500005b05000010010000,Xiaoji Gamesir-G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
05000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux,
03000000c0160000e105000001010000,Xin-Mo Xin-Mo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux,
xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000120c0000100e000011010000,ZEROPLUS P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000120c0000101e000011010000,ZEROPLUS P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000c0160000dc27000001010000,OnyxSoft Dual JoyDivision,platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b6,leftshoulder:b4,rightshoulder:b5,dpup:-a1,dpdown:+a1,dpleft:-a0,dpright:+a0,
================================================
FILE: generate-icons.py
================================================
#!/usr/bin/env python2
# Used to generate some icons
# Requires inkscape and imagemagick pacages
import os, subprocess, colorsys
from xml.etree import ElementTree as ET
ICODIR = "./images/" # Directory with icons
CICONS = "./images/controller-icons/" # Directory controller-icons
RECOLORS = { # Defines set of hue shifts for controller-icons
# "0" : 0.0, # Green - original
"1" : 0.3, # Blue
"2" : 0.7, # Red
"3" : 0.9, # Yellow
"4" : 0.2, # Cyan
"5" : 0.8, # Orange
"6" : 0.5, # Purple
}
# Generate svg state icons
for size in (24, 256):
for state in ('alive', 'dead', 'error', 'unknown'):
print("scc-statusicon-%s.png" % (state,))
subprocess.call([
"inkscape",
"%s/scc-statusicon-%s.svg" % (ICODIR, state),
"--export-area-page",
"--export-png=%s/%sx%s/status/scc-%s.png" % (ICODIR, size, size, state),
"--export-width=%s" % (size,),
"--export-height=%s" % (size,) ])
def html_to_rgb(html):
""" Converts #rrggbbaa or #rrggbb to r, g, b,a in (0,1) ranges """
html = html.strip("#")
if len(html) == 6:
html = html + "ff"
elif html == "none":
return 0, 0, 0, 0
elif len(html) != 8:
raise ValueError("Needs RRGGBB(AA) format, got '%s'" % (html, ))
return tuple(( float(int(html[i:i+2],16)) / 255.0 for i in xrange(0, len(html), 2) ))
def rgb_to_html(r,g,b):
""" Convets rgb back to html color code """
return "#" + "".join(( "%02x" % int(x * 255) for x in (r,g,b) ))
def recolor(tree, add):
""" Recursive part of recolor_strokes and recolor_background """
if 'id' in tree.attrib and "overlay" in tree.attrib['id']:
return
for child in tree:
if 'style' in child.attrib:
styles = { a : b
for (a, b) in (
x.split(":", 1)
for x in child.attrib['style'].split(';')
if ":" in x
)}
if "fill" in styles or "stroke" in styles:
for key in ("fill", "stroke"):
if key in styles:
# Convert color to HSV
r,g,b,a = html_to_rgb(styles[key])
h,s,v = colorsys.rgb_to_hsv(r,g,b)
# Shift hue
h += add
while h > 1.0 : h -= 1.0
# Convert it back
r,g,b = colorsys.hsv_to_rgb(h,s,v)
# Store
styles[key] = rgb_to_html(r,g,b)
child.attrib["style"] = ";".join(( ":".join((x,styles[x])) for x in styles ))
recolor(child, add)
# Generate different colors for controller icons
ET.register_namespace("","http://www.w3.org/2000/svg")
for tp in ("sc", "scbt", "fake", "ds4", "hid", "rpad"):
# Read svg and parse it
data = file("%s/%s-0.svg" % (CICONS, tp), "r").read()
# Create recolored images
for key in RECOLORS:
tree = ET.fromstring(data)
# Walk recursively and recolor everything that has color
recolor(tree, RECOLORS[key])
out = "%s/%s-%s.svg" % (CICONS, tp, key)
file(out, "w").write(ET.tostring(tree))
print(out)
================================================
FILE: generate_svg.py
================================================
#!/usr/bin/env python2
from scc.tools import _
from scc.actions import Action, DPadAction, XYAction, MouseAction
from scc.modifiers import ModeModifier, DoubleclickModifier
from scc.special_actions import MenuAction
from scc.parser import TalkingActionParser
from scc.constants import SCButtons
from scc.profile import Profile
from scc.tools import nameof
from scc.uinput import Rels
from scc.gui.svg_widget import SVGEditor
from scc.lib import IntEnum
import os
class Align(IntEnum):
TOP = 1 << 0
BOTTOM = 1 << 1
LEFT = 1 << 2
RIGHT = 1 << 3
def find_image(name):
# TODO: This
filename = "images/" + name + ".svg"
if os.path.exists(filename):
return filename
return None
class Line(object):
def __init__(self, icon, text):
self.icons = [ icon ]
self.text = text
def get_size(self, gen):
# TODO: This
return gen.char_width * len(self.text), gen.line_height
def add_icon(self, icon):
self.icons.append(icon)
return self
def to_string(self):
return "%-10s: %s" % (",".join([ x for x in self.icons if x ]), self.text)
class LineCollection(object):
""" Allows calling add_icon on multiple lines at once """
def __init__(self, *lines):
self.lines = lines
def add_icon(self, icon):
for line in self.lines:
line.add_icon(icon)
return self
class Box(object):
PADDING = 5
SPACING = 2
MIN_WIDTH = 100
MIN_HEIGHT = 50
def __init__(self, anchor_x, anchor_y, align, name,
min_width = MIN_WIDTH, min_height = MIN_HEIGHT):
self.name = name
self.lines = []
self.anchor = anchor_x, anchor_y
self.align = align
self.min_height = min_height
self.x, self.y = 0, 0
self.min_width = min_width
self.min_height = min_height
def to_string(self):
return "--- %s ---\n%s\n" % (
self.name,
"\n".join([ x.to_string() for x in self.lines ])
)
def add(self, icon, context, action):
if not action: return LineCollection()
if isinstance(action, ModeModifier):
lines = [ self.add(icon, context, action.default) ]
for x in action.mods:
lines.append( self.add(nameof(x), context, action.mods[x])
.add_icon(icon) )
return LineCollection(*lines)
elif isinstance(action, DoubleclickModifier):
lines = []
if action.normalaction:
lines.append( self.add(icon, context, action.normalaction) )
if action.action:
lines.append( self.add("DOUBLECLICK", context, action.action)
.add_icon(icon) )
if action.holdaction:
lines.append( self.add("HOLD", context, action.holdaction)
.add_icon(icon) )
return LineCollection(*lines)
action = action.strip()
if isinstance(action, MenuAction):
if self.name == "bcs" and action.menu_id == "Default.menu":
# Special case, this action is expected in every profile,
# so there is no need to draw it here
return LineCollection()
elif isinstance(action, DPadAction):
return LineCollection(
self.add("DPAD_UP", Action.AC_BUTTON, action.actions[0]),
self.add("DPAD_DOWN", Action.AC_BUTTON, action.actions[1]),
self.add("DPAD_LEFT", Action.AC_BUTTON, action.actions[2]),
self.add("DPAD_RIGHT", Action.AC_BUTTON, action.actions[3])
)
elif isinstance(action, XYAction):
if isinstance(action.x, MouseAction) and isinstance(action.y, MouseAction):
if action.x.get_axis() in (Rels.REL_HWHEEL, Rels.REL_WHEEL):
# Special case, pad bound to wheel
line = Line(icon, _("Mouse Wheel"))
self.lines.append(line)
return line
return LineCollection(
self.add("AXISX", Action.AC_BUTTON, action.x),
self.add("AXISY", Action.AC_BUTTON, action.y)
)
line = Line(icon, action.describe(context))
self.lines.append(line)
return line
def calculate(self, gen):
self.width, self.height = self.min_width, 2 * self.PADDING
self.icount = 0
for line in self.lines:
lw, lh = line.get_size(gen)
self.width, self.height = max(self.width, lw), self.height + lh + self.SPACING
self.icount = max(self.icount, len(line.icons))
self.width += 2 * self.PADDING + self.icount * (gen.line_height + self.SPACING)
self.height = max(self.height, self.min_height)
anchor_x, anchor_y = self.anchor
if (self.align & Align.TOP) != 0:
self.y = anchor_y
elif (self.align & Align.BOTTOM) != 0:
self.y = gen.full_height - self.height - anchor_y
else:
self.y = (gen.full_height - self.height) / 2
if (self.align & Align.LEFT) != 0:
self.x = anchor_x
elif (self.align & Align.RIGHT) != 0:
self.x = gen.full_width - self.width - anchor_x
else:
self.x = (gen.full_width - self.width) / 2
def place(self, gen, root):
e = SVGEditor.add_element(root, "rect",
style = "opacity:1;fill-opacity:0.0;stroke-width:2.0;",
fill="#000000",
stroke="#06a400",
id = "box_%s" % (self.name,),
width = self.width, height = self.height,
x = self.x, y = self.y,
)
y = self.y + self.PADDING
for line in self.lines:
h = gen.line_height
x = self.x + self.PADDING
for icon in line.icons:
image = find_image(icon)
if image:
SVGEditor.add_element(root, "image", x = x, y = y,
style = "filter:url(#filterInvert)",
width = h, height = h, href = image)
x += h + self.SPACING
x = self.x + self.PADDING + self.icount * (h + self.SPACING)
y += h
txt = SVGEditor.add_element(root, "text", x = x, y = y,
style = gen.label_template.attrib['style']
)
SVGEditor.set_text(txt, line.text)
y += self.SPACING
def place_marker(self, gen, root):
x1, y1 = self.x, self.y
x2, y2 = x1 + self.width, y1 + self.height
if self.align & (Align.LEFT | Align.RIGHT) == 0:
edges = [ [ x2, y2 ], [ x1, y2 ] ]
elif self.align & Align.BOTTOM == Align.BOTTOM:
if self.align & Align.LEFT != 0:
edges = [ [ x2, y2 ], [ x1, y1 ] ]
elif self.align & Align.RIGHT != 0:
edges = [ [ x2, y1 ], [ x1, y2 ] ]
elif self.align & Align.TOP == Align.TOP:
if self.align & Align.LEFT != 0:
edges = [ [ x2, y1 ], [ x2, y2 ] ]
elif self.align & Align.RIGHT != 0:
edges = [ [ x1, y1 ], [ x1, y2 ] ]
else:
if self.align & Align.LEFT != 0:
edges = [ [ x2, y1 ], [ x2, y2 ] ]
elif self.align & Align.RIGHT != 0:
edges = [ [ x1, y1 ], [ x2, y2 ] ]
targets = SVGEditor.get_element(root, "markers_%s" % (self.name,))
if targets is None:
return
i = 0
for t
gitextract_w078v14n/ ├── .github/ │ └── workflows/ │ ├── appimage.yml │ └── scc-linux.yml ├── ADDITIONAL-LICENSES ├── AppImageBuilder.yml ├── Dockerfile ├── LICENSE ├── README.md ├── TODO.md ├── appimage-build.sh ├── daemon.sh ├── default_menus/ │ ├── Default.menu │ └── Profiles.menu ├── default_profiles/ │ ├── Desktop.sccprofile │ ├── XBox Controller with High Precision Camera.sccprofile │ └── XBox Controller.sccprofile ├── docs/ │ ├── actions.md │ ├── menu-file.md │ ├── profile-file.md │ └── protocol.md ├── gamecontrollerdb.txt ├── generate-icons.py ├── generate_svg.py ├── glade/ │ ├── about.glade │ ├── action_editor.glade │ ├── ae/ │ │ ├── axis.glade │ │ ├── axis_action.glade │ │ ├── buttons.glade │ │ ├── custom.glade │ │ ├── dpad.glade │ │ ├── first_page.glade │ │ ├── gesture.glade │ │ ├── gyro.glade │ │ ├── gyro_action.glade │ │ ├── menu_only.glade │ │ ├── osk_action.glade │ │ ├── per_axis.glade │ │ ├── recent_list.glade │ │ ├── special_action.glade │ │ ├── tilt.glade │ │ └── trigger.glade │ ├── app.glade │ ├── controller_settings.glade │ ├── creg.glade │ ├── global_settings.glade │ ├── icon_chooser.glade │ ├── import_export.glade │ ├── key_grabber.glade │ ├── macro_editor.glade │ ├── menu_editor.glade │ ├── modeshift_editor.glade │ ├── osk_binding_editor.glade │ ├── ring_editor.glade │ └── simple_chooser.glade ├── images/ │ ├── button-images/ │ │ └── groups.json │ ├── deck.config.json │ ├── ds4-config.json │ ├── ds5-config.json │ ├── keyboard.svg.json │ ├── menu-icons/ │ │ ├── buttons/ │ │ │ └── LICENCES │ │ ├── driving/ │ │ │ └── LICENCES │ │ ├── items/ │ │ │ └── LICENCES │ │ ├── media/ │ │ │ └── LICENCES │ │ ├── system/ │ │ │ ├── LICENCES │ │ │ └── profiles.bw.xcf │ │ └── weapons/ │ │ └── LICENCES │ ├── radial-menu.svg.json │ ├── remotepad.json │ ├── sc-config.json │ └── x360-config.json ├── osd-styles/ │ ├── Blue.colors.json │ ├── Classic.gtkstyle.css │ ├── Cyan.colors.json │ ├── Green.colors.json │ ├── Red.colors.json │ ├── Reloaded.gtkstyle.css │ └── Yellow.colors.json ├── profile_examples/ │ ├── DeSmuME.sccprofile │ ├── DiRT Rally.sccprofile │ ├── GZDoom.sccprofile │ ├── Kodi.sccprofile │ ├── No Man Sky.sccprofile │ ├── Portal 2 coop.sccprofile │ ├── Portal 2.sccprofile │ ├── README.md │ ├── Stardew Valley.sccprofile │ ├── Tomb Raider 2013.sccprofile │ ├── Undertale.sccprofile │ ├── Vanguard Princess.sccprofile │ └── firefox.sccprofile ├── run.sh ├── scc/ │ ├── __init__.py │ ├── actions.py │ ├── aliases.py │ ├── c_branch.h │ ├── cemuhook_server.c │ ├── cemuhook_server.py │ ├── cheader.py │ ├── config.py │ ├── constants.py │ ├── controller.py │ ├── custom.py │ ├── device_monitor.py │ ├── drivers/ │ │ ├── __init__.py │ │ ├── ds4drv.py │ │ ├── ds5drv.py │ │ ├── evdevdrv.py │ │ ├── fake.py │ │ ├── hiddrv.c │ │ ├── hiddrv.py │ │ ├── remotepad.h │ │ ├── remotepad.py │ │ ├── remotepad_controller.c │ │ ├── sc_by_bt.c │ │ ├── sc_by_bt.py │ │ ├── sc_by_cable.py │ │ ├── sc_dongle.py │ │ ├── scc_future.h │ │ ├── steamdeck.py │ │ └── usb.py │ ├── foreign/ │ │ ├── __init__.py │ │ ├── vdf.py │ │ └── vdffz.py │ ├── gestures.py │ ├── gui/ │ │ ├── __init__.py │ │ ├── aboutdialog.py │ │ ├── action_editor.py │ │ ├── ae/ │ │ │ ├── __init__.py │ │ │ ├── axis.py │ │ │ ├── axis_action.py │ │ │ ├── buttons.py │ │ │ ├── custom.py │ │ │ ├── dpad.py │ │ │ ├── first_page.py │ │ │ ├── gesture.py │ │ │ ├── gyro.py │ │ │ ├── gyro_action.py │ │ │ ├── menu_action.py │ │ │ ├── menu_only.py │ │ │ ├── osk_action.py │ │ │ ├── osk_buttons.py │ │ │ ├── per_axis.py │ │ │ ├── recent_list.py │ │ │ ├── special_action.py │ │ │ ├── tilt.py │ │ │ └── trigger.py │ │ ├── app.py │ │ ├── area_to_action.py │ │ ├── binding_editor.py │ │ ├── chooser.py │ │ ├── controller_image.py │ │ ├── controller_settings.py │ │ ├── controller_widget.py │ │ ├── creg/ │ │ │ ├── __init__.py │ │ │ ├── constants.py │ │ │ ├── data.py │ │ │ ├── dialog.py │ │ │ ├── grabs.py │ │ │ └── tester.py │ │ ├── daemon_manager.py │ │ ├── dwsnc.py │ │ ├── editor.py │ │ ├── gdk_to_key.py │ │ ├── gestures.py │ │ ├── global_settings.py │ │ ├── icon_chooser.py │ │ ├── importexport/ │ │ │ ├── __init__.py │ │ │ ├── dialog.py │ │ │ ├── export.py │ │ │ ├── import_sccprofile.py │ │ │ └── import_vdf.py │ │ ├── key_grabber.py │ │ ├── keycode_to_key.py │ │ ├── macro_editor.py │ │ ├── menu_editor.py │ │ ├── modeshift_editor.py │ │ ├── osd_mode.py │ │ ├── osk_binding_editor.py │ │ ├── parser.py │ │ ├── profile_switcher.py │ │ ├── ribar.py │ │ ├── ring_editor.py │ │ ├── simple_chooser.py │ │ ├── statusicon.py │ │ ├── svg_widget.py │ │ └── userdata_manager.py │ ├── lib/ │ │ ├── __init__.py │ │ ├── daemon.py │ │ ├── enum.py │ │ ├── eudevmonitor.py │ │ ├── hidparse.py │ │ ├── hidparse_data.py │ │ ├── hidraw.py │ │ ├── ioctl_opt.py │ │ ├── jsonencoder.py │ │ ├── libusb1.py │ │ ├── usb1.py │ │ ├── vdf.py │ │ ├── xinput.py │ │ └── xwrappers.py │ ├── macros.py │ ├── mapper.py │ ├── menu_data.py │ ├── modifiers.py │ ├── osd/ │ │ ├── __init__.py │ │ ├── area.py │ │ ├── binding_display.py │ │ ├── dialog.py │ │ ├── gesture_display.py │ │ ├── grid_menu.py │ │ ├── hmenu.py │ │ ├── inputdisplay.py │ │ ├── keyboard.py │ │ ├── launcher.py │ │ ├── menu.py │ │ ├── menu_generators.py │ │ ├── message.py │ │ ├── osk_actions.py │ │ ├── quick_menu.py │ │ ├── radial_menu.py │ │ ├── slave_mapper.py │ │ └── timermanager.py │ ├── parser.py │ ├── paths.py │ ├── poller.py │ ├── profile.py │ ├── sccdaemon.py │ ├── scheduler.py │ ├── scripts.py │ ├── special_actions.py │ ├── tools.py │ ├── uinput.c │ ├── uinput.py │ └── x11/ │ ├── __init__.py │ ├── autoswitcher.py │ ├── scc-autoswitch-daemon.py │ ├── scc-osd-daemon.py │ └── scc_autoswitch_daemon.py ├── scc-mime-types.xml ├── scripts/ │ ├── 69-sc-controller.rules │ ├── appimage-AppRun.sh │ ├── sc-controller │ ├── sc-controller.appdata.xml │ ├── sc-controller.desktop │ ├── scc │ ├── scc-daemon │ ├── scc-osd-dialog │ ├── scc-osd-keyboard │ ├── scc-osd-launcher │ ├── scc-osd-menu │ ├── scc-osd-message │ ├── scc-osd-radial-menu │ └── scc-osd-show-bindings ├── setup.py ├── tests/ │ ├── README.md │ ├── test_boolean.py │ ├── test_compress.py │ ├── test_docs.py │ ├── test_glade.py │ ├── test_inputs.py │ ├── test_parser/ │ │ ├── __init__.py │ │ ├── test_actions.py │ │ ├── test_macros.py │ │ ├── test_modifiers.py │ │ └── test_special_actions.py │ ├── test_profile/ │ │ ├── __init__.py │ │ ├── test_actions.py │ │ ├── test_modeshift.py │ │ ├── test_modifiers.py │ │ └── test_special_actions.py │ ├── test_setup.py │ ├── test_strings/ │ │ ├── __init__.py │ │ ├── test_keys.py │ │ └── test_modifiers.py │ └── test_vdf.py └── update-wiki.py
Showing preview only (250K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3525 symbols across 156 files)
FILE: generate-icons.py
function html_to_rgb (line 34) | def html_to_rgb(html):
function rgb_to_html (line 46) | def rgb_to_html(r,g,b):
function recolor (line 51) | def recolor(tree, add):
FILE: generate_svg.py
class Align (line 17) | class Align(IntEnum):
function find_image (line 24) | def find_image(name):
class Line (line 32) | class Line(object):
method __init__ (line 34) | def __init__(self, icon, text):
method get_size (line 39) | def get_size(self, gen):
method add_icon (line 44) | def add_icon(self, icon):
method to_string (line 49) | def to_string(self):
class LineCollection (line 53) | class LineCollection(object):
method __init__ (line 56) | def __init__(self, *lines):
method add_icon (line 60) | def add_icon(self, icon):
class Box (line 66) | class Box(object):
method __init__ (line 72) | def __init__(self, anchor_x, anchor_y, align, name,
method to_string (line 84) | def to_string(self):
method add (line 91) | def add(self, icon, context, action):
method calculate (line 140) | def calculate(self, gen):
method place (line 166) | def place(self, gen, root):
method place_marker (line 196) | def place_marker(self, gen, root):
class Generator (line 239) | class Generator(object):
method __init__ (line 242) | def __init__(self):
method equal_width (line 321) | def equal_width(self, *boxes):
method equal_height (line 331) | def equal_height(self, *boxes):
FILE: scc/actions.py
class Action (line 37) | class Action(object):
method __init__ (line 96) | def __init__(self, *parameters):
method register (line 108) | def register(action_cls, prefix=None):
method unregister_prefix (line 133) | def unregister_prefix(prefix):
method register_all (line 146) | def register_all(module, prefix=None):
method encode (line 154) | def encode(self):
method get_child_actions (line 161) | def get_child_actions(self):
method get_all_actions (line 172) | def get_all_actions(self):
method get_compatible_modifiers (line 183) | def get_compatible_modifiers(self):
method get_previewable (line 192) | def get_previewable(self):
method __str__ (line 201) | def __str__(self):
method describe (line 207) | def describe(self, context):
method to_string (line 216) | def to_string(self, multiline=False, pad=0):
method set_name (line 224) | def set_name(self, name):
method strip (line 230) | def strip(self):
method compress (line 241) | def compress(self):
method button_press (line 254) | def button_press(self, mapper):
method button_release (line 262) | def button_release(self, mapper):
method axis (line 270) | def axis(self, mapper, position, what):
method pad (line 282) | def pad(self, mapper, position, what):
method gyro (line 295) | def gyro(self, mapper, pitch, yaw, roll, q1, q2, q3, q4):
method whole (line 304) | def whole(self, mapper, x, y, what):
method whole_blocked (line 316) | def whole_blocked(self, mapper, x, y, what):
method add (line 324) | def add(self, mapper, dx, dy):
method change (line 333) | def change(self, mapper, dx, dy, what):
method cancel (line 343) | def cancel(self, mapper):
method strip_defaults (line 351) | def strip_defaults(self):
method encode_parameters (line 372) | def encode_parameters(parameters):
method _encode_parameter (line 383) | def _encode_parameter(parameter):
method trigger (line 392) | def trigger(self, mapper, position, old_position):
class RangeOP (line 403) | class RangeOP(object):
method __init__ (line 410) | def __init__(self, what, op, value):
method cmp_or (line 454) | def cmp_or(self, mapper):
method cmp_gt (line 457) | def cmp_gt(self, mapper):
method cmp_lt (line 463) | def cmp_lt(self, mapper):
method cmp_ge (line 469) | def cmp_ge(self, mapper):
method cmp_le (line 475) | def cmp_le(self, mapper):
method cmp_labs (line 481) | def cmp_labs(self, mapper):
method cmp_gabs (line 487) | def cmp_gabs(self, mapper):
method __call__ (line 493) | def __call__(self, mapper):
method __str__ (line 497) | def __str__(self):
class HapticEnabledAction (line 501) | class HapticEnabledAction(object):
method __init__ (line 503) | def __init__(self):
method get_compatible_modifiers (line 507) | def get_compatible_modifiers(self):
method set_haptic (line 511) | def set_haptic(self, hd):
method get_haptic (line 515) | def get_haptic(self):
class OSDEnabledAction (line 519) | class OSDEnabledAction(object):
method __init__ (line 521) | def __init__(self):
method get_compatible_modifiers (line 525) | def get_compatible_modifiers(self):
method enable_osd (line 529) | def enable_osd(self, timeout):
class SpecialAction (line 534) | class SpecialAction(object):
method execute_named (line 541) | def execute_named(self, name, mapper, *a):
method execute (line 551) | def execute(self, mapper, *a):
method button_press (line 555) | def button_press(self, mapper): pass
method button_release (line 556) | def button_release(self, mapper): pass
class AxisAction (line 559) | class AxisAction(Action):
method __init__ (line 592) | def __init__(self, id, min = None, max = None):
method set_speed (line 606) | def set_speed(self, x, y, z):
method get_speed (line 610) | def get_speed(self):
method get_previewable (line 614) | def get_previewable(self):
method get_compatible_modifiers (line 618) | def get_compatible_modifiers(self):
method get_axis_description (line 623) | def get_axis_description(id, xy=False):
method get_axis (line 643) | def get_axis(self):
method describe (line 647) | def describe(self, context):
method button_press (line 666) | def button_press(self, mapper):
method button_release (line 671) | def button_release(self, mapper):
method clamp_axis (line 677) | def clamp_axis(id, value):
method axis (line 689) | def axis(self, mapper, position, what):
method change (line 698) | def change(self, mapper, dx, dy, what):
method add (line 706) | def add(self, mapper, dx, dy):
method trigger (line 711) | def trigger(self, mapper, position, old_position):
class RAxisAction (line 720) | class RAxisAction(AxisAction):
method __init__ (line 724) | def __init__(self, id, min = None, max = None):
method describe (line 729) | def describe(self, context):
class HatAction (line 738) | class HatAction(AxisAction):
method describe (line 744) | def describe(self, context):
method to_string (line 753) | def to_string(self, multiline=False, pad=0):
class HatUpAction (line 757) | class HatUpAction(HatAction):
method __init__ (line 759) | def __init__(self, id, *a):
class HatDownAction (line 762) | class HatDownAction(HatAction):
method __init__ (line 764) | def __init__(self, id, *a):
class HatLeftAction (line 767) | class HatLeftAction(HatAction):
method __init__ (line 769) | def __init__(self, id, *a):
class HatRightAction (line 772) | class HatRightAction(HatAction):
method __init__ (line 774) | def __init__(self, id, *a):
class WholeHapticAction (line 778) | class WholeHapticAction(HapticEnabledAction):
method __init__ (line 784) | def __init__(self):
method change (line 789) | def change(self, mapper, dx, dy, what):
method add (line 799) | def add(self, mapper, dx, dy):
method reset_wholehaptic (line 803) | def reset_wholehaptic(self):
class MouseAction (line 807) | class MouseAction(WholeHapticAction, Action):
method __init__ (line 816) | def __init__(self, axis=None, speed=None):
method get_compatible_modifiers (line 827) | def get_compatible_modifiers(self):
method get_previewable (line 833) | def get_previewable(self):
method get_axis (line 837) | def get_axis(self):
method set_speed (line 841) | def set_speed(self, x, y, z):
method get_speed (line 845) | def get_speed(self):
method describe (line 849) | def describe(self, context):
method button_press (line 861) | def button_press(self, mapper):
method button_release (line 869) | def button_release(self, mapper):
method axis (line 874) | def axis(self, mapper, position, what):
method pad (line 879) | def pad(self, mapper, position, what):
method change (line 894) | def change(self, mapper, dx, dy, what):
method add (line 898) | def add(self, mapper, dx, dy):
method whole (line 916) | def whole(self, mapper, x, y, what):
method gyro (line 940) | def gyro(self, mapper, pitch, yaw, roll, *a):
method trigger (line 946) | def trigger(self, mapper, position, old_position):
class MouseAbsAction (line 950) | class MouseAbsAction(Action):
method __init__ (line 961) | def __init__(self, axis = None):
method get_compatible_modifiers (line 968) | def get_compatible_modifiers(self):
method get_previewable (line 972) | def get_previewable(self):
method get_axis (line 976) | def get_axis(self):
method set_speed (line 980) | def set_speed(self, x, y, *a):
method get_speed (line 984) | def get_speed(self):
method describe (line 988) | def describe(self, context):
method axis (line 1000) | def axis(self, mapper, position, what):
method whole (line 1015) | def whole(self, mapper, x, y, what):
class AreaAction (line 1021) | class AreaAction(Action, SpecialAction, OSDEnabledAction):
method __init__ (line 1027) | def __init__(self, x1, y1, x2, y2):
method describe (line 1040) | def describe(self, context):
method get_compatible_modifiers (line 1045) | def get_compatible_modifiers(self):
method transform_coords (line 1049) | def transform_coords(self, mapper):
method transform_osd_coords (line 1067) | def transform_osd_coords(self, mapper):
method set_mouse (line 1077) | def set_mouse(self, mapper, x, y):
method update_osd_area (line 1085) | def update_osd_area(self, area, mapper):
method whole (line 1094) | def whole(self, mapper, x, y, what):
class RelAreaAction (line 1128) | class RelAreaAction(AreaAction):
method transform_coords (line 1131) | def transform_coords(self, mapper):
class WinAreaAction (line 1141) | class WinAreaAction(AreaAction):
method transform_coords (line 1144) | def transform_coords(self, mapper):
method transform_osd_coords (line 1156) | def transform_osd_coords(self, mapper):
method set_mouse (line 1166) | def set_mouse(self, mapper, x, y):
class RelWinAreaAction (line 1170) | class RelWinAreaAction(WinAreaAction):
method transform_coords (line 1173) | def transform_coords(self, mapper):
method transform_osd_coords (line 1183) | def transform_osd_coords(self, mapper):
class GyroAction (line 1193) | class GyroAction(Action):
method __init__ (line 1197) | def __init__(self, axis1, axis2=None, axis3=None):
method get_compatible_modifiers (line 1203) | def get_compatible_modifiers(self):
method set_speed (line 1207) | def set_speed(self, x, y, z):
method get_speed (line 1211) | def get_speed(self):
method gyro (line 1215) | def gyro(self, mapper, *pyr):
method describe (line 1224) | def describe(self, context):
class GyroAbsAction (line 1238) | class GyroAbsAction(HapticEnabledAction, GyroAction):
method __init__ (line 1243) | def __init__(self, *blah):
method reset (line 1251) | def reset(self):
method get_compatible_modifiers (line 1255) | def get_compatible_modifiers(self):
method get_previewable (line 1261) | def get_previewable(self):
method gyro (line 1265) | def gyro(self, mapper, pitch, yaw, roll, q1, q2, q3, q4):
class ResetGyroAction (line 1307) | class ResetGyroAction(Action):
method button_press (line 1314) | def button_press(self, mapper):
method describe (line 1318) | def describe(self, context):
class MultichildAction (line 1323) | class MultichildAction(Action):
method compress (line 1326) | def compress(self):
method get_child_actions (line 1331) | def get_child_actions(self):
method cancel (line 1335) | def cancel(self, mapper):
method to_string (line 1340) | def to_string(self, multiline=False, pad=0, prefixparams=""):
class TiltAction (line 1357) | class TiltAction(MultichildAction):
method __init__ (line 1365) | def __init__(self, *actions):
method set_speed (line 1381) | def set_speed(self, x, y, z):
method get_speed (line 1385) | def get_speed(self):
method get_compatible_modifiers (line 1389) | def get_compatible_modifiers(self):
method gyro (line 1393) | def gyro(self, mapper, *pyr):
method decode (line 1422) | def decode(data, a, parser, *b):
method describe (line 1428) | def describe(self, context):
class TrackballAction (line 1433) | class TrackballAction(Action):
method __new__ (line 1440) | def __new__(cls, speed=None):
class ButtonAction (line 1445) | class ButtonAction(HapticEnabledAction, Action):
method __init__ (line 1490) | def __init__(self, button1, button2 = None, minustrigger = None, plust...
method describe (line 1503) | def describe(self, context):
method describe_button (line 1520) | def describe_button(button, context=Action.AC_BUTTON):
method describe_short (line 1539) | def describe_short(self):
method get_compatible_modifiers (line 1550) | def get_compatible_modifiers(self):
method _button_press (line 1556) | def _button_press(mapper, button, immediate=False, haptic=None):
method _button_release (line 1582) | def _button_release(mapper, button, immediate=False):
method button_press (line 1606) | def button_press(self, mapper):
method button_release (line 1612) | def button_release(self, mapper):
method whole (line 1616) | def whole(self, mapper, x, y, what):
method axis (line 1642) | def axis(self, mapper, position, what):
method trigger (line 1662) | def trigger(self, mapper, p, old_p):
method change (line 1697) | def change(self, mapper, dx, dy, what):
class MultiAction (line 1712) | class MultiAction(MultichildAction):
method __init__ (line 1721) | def __init__(self, *actions):
method decode (line 1728) | def decode(data, a, parser, *b):
method make (line 1736) | def make(*a):
method _add_all (line 1753) | def _add_all(self, actions):
method _add (line 1761) | def _add(self, action):
method deduplicate (line 1769) | def deduplicate(self):
method compress (line 1794) | def compress(self):
method set_haptic (line 1800) | def set_haptic(self, hapticdata):
method get_haptic (line 1808) | def get_haptic(self):
method set_speed (line 1815) | def set_speed(self, x, y, z):
method get_speed (line 1821) | def get_speed(self):
method is_key_combination (line 1828) | def is_key_combination(self):
method describe (line 1838) | def describe(self, context):
method execute (line 1852) | def execute(self, event):
method button_press (line 1859) | def button_press(self, *p):
method button_release (line 1862) | def button_release(self, *p):
method axis (line 1865) | def axis(self, *p):
method pad (line 1868) | def pad(self, *p):
method add (line 1871) | def add(self, *p):
method change (line 1874) | def change(self, *p):
method gyro (line 1877) | def gyro(self, *p):
method whole (line 1880) | def whole(self, *p):
method trigger (line 1883) | def trigger(self, *p):
method to_string (line 1887) | def to_string(self, multiline=False, pad=0):
method __str__ (line 1891) | def __str__(self):
class DPadAction (line 1897) | class DPadAction(MultichildAction, HapticEnabledAction):
method __init__ (line 1921) | def __init__(self, *actions):
method _ensure_size (line 1941) | def _ensure_size(self, actions):
method decode (line 1946) | def decode(data, a, parser, *b):
method to_string (line 1956) | def to_string(self, multiline=False, pad=0, prefixparams=""):
method get_compatible_modifiers (line 1963) | def get_compatible_modifiers(self):
method describe (line 1968) | def describe(self, context):
method compute_side (line 1980) | def compute_side(self, x, y):
method whole (line 1998) | def whole(self, mapper, x, y, what):
method whole_blocked (line 2016) | def whole_blocked(self, mapper, x, y, what):
method change (line 2026) | def change(self, mapper, dx, dy, what):
class DPad8Action (line 2030) | class DPad8Action(DPadAction):
method _ensure_size (line 2050) | def _ensure_size(self, actions):
method describe (line 2054) | def describe(self, context):
method whole (line 2059) | def whole(self, mapper, x, y, what):
class RingAction (line 2072) | class RingAction(MultichildAction):
method __init__ (line 2085) | def __init__(self, *params):
method compress (line 2099) | def compress(self):
method decode (line 2106) | def decode(data, a, parser, *b):
method get_compatible_modifiers (line 2115) | def get_compatible_modifiers(self):
method describe (line 2119) | def describe(self, context):
method to_string (line 2128) | def to_string(self, multiline=False, pad=0):
method whole (line 2135) | def whole(self, mapper, x, y, what):
class XYAction (line 2180) | class XYAction(WholeHapticAction, Action):
method __init__ (line 2190) | def __init__(self, x=None, y=None):
method get_compatible_modifiers (line 2202) | def get_compatible_modifiers(self):
method get_child_actions (line 2214) | def get_child_actions(self):
method decode (line 2219) | def decode(data, action, parser, *a):
method compress (line 2226) | def compress(self):
method set_haptic (line 2232) | def set_haptic(self, hapticdata):
method get_haptic (line 2246) | def get_haptic(self):
method set_speed (line 2254) | def set_speed(self, x, y, z):
method get_speed (line 2261) | def get_speed(self):
method get_previewable (line 2268) | def get_previewable(self):
method _add (line 2272) | def _add(self, mapper, x, y):
method whole (line 2284) | def whole(self, mapper, x, y, what):
method describe (line 2313) | def describe(self, context):
method to_string (line 2328) | def to_string(self, multiline=False, pad=0):
method __str__ (line 2342) | def __str__(self):
class RelXYAction (line 2348) | class RelXYAction(XYAction):
method __init__ (line 2355) | def __init__(self, *a, **b):
method describe (line 2360) | def describe(self, context):
method whole (line 2365) | def whole(self, mapper, x, y, what):
method get_compatible_modifiers (line 2377) | def get_compatible_modifiers(self):
class TriggerAction (line 2381) | class TriggerAction(Action, HapticEnabledAction):
method __init__ (line 2389) | def __init__(self, press_level, *params):
method decode (line 2409) | def decode(data, a, parser, *b):
method get_compatible_modifiers (line 2415) | def get_compatible_modifiers(self):
method compress (line 2419) | def compress(self):
method _press (line 2424) | def _press(self, mapper):
method _release (line 2433) | def _release(self, mapper, old_position):
method trigger (line 2442) | def trigger(self, mapper, position, old_position):
method describe (line 2471) | def describe(self, context):
method __str__ (line 2476) | def __str__(self):
class HipfireAction (line 2481) | class HipfireAction(Action, HapticEnabledAction):
method __init__ (line 2496) | def __init__(self, *params):
method decode (line 2533) | def decode(data, a, parser, *b):
method get_compatible_modifiers (line 2541) | def get_compatible_modifiers(self):
method compress (line 2545) | def compress(self):
method on_timeout (line 2550) | def on_timeout(self, mapper, *a):
method _partial_press (line 2559) | def _partial_press(self, mapper):
method _partial_release (line 2566) | def _partial_release(self, mapper):
method _full_press (line 2572) | def _full_press(self, mapper):
method _full_release (line 2577) | def _full_release(self, mapper):
method trigger (line 2583) | def trigger(self, mapper, position, old_position):
method describe (line 2661) | def describe(self, context):
method __str__ (line 2670) | def __str__(self):
class NoAction (line 2676) | class NoAction(Action):
method __new__ (line 2685) | def __new__(cls):
method __bool__ (line 2691) | def __bool__(self):
method encode (line 2697) | def encode(self):
method button_press (line 2701) | def button_press(self, *a):
method button_release (line 2704) | def button_release(self, *a):
method axis (line 2707) | def axis(self, *a):
method whole (line 2710) | def whole(self, *a):
method trigger (line 2713) | def trigger(self, *a):
method describe (line 2717) | def describe(self, context):
method to_string (line 2721) | def to_string(self, multiline=False, pad=0):
method __str__ (line 2725) | def __str__(self):
function strip_none (line 2731) | def strip_none(*lst):
FILE: scc/c_branch.h
type monotime_t (line 14) | typedef uint64_t monotime_t;
function mono_time_ms (line 17) | inline static uint64_t mono_time_ms() {
FILE: scc/cemuhook_server.c
type CEHClient (line 47) | typedef struct CEHClient {
type MessageType (line 62) | typedef enum {
type PortInfo (line 71) | struct __attribute__((packed)) PortInfo {
type Message (line 81) | struct __attribute__((packed)) Message {
function send_msg (line 131) | static void send_msg(int fd, struct sockaddr_in* target, struct Message*...
function fill_port_info (line 147) | static void fill_port_info(struct PortInfo* pi, uint16_t id, uint8_t act...
function send_gyro_data (line 159) | static void send_gyro_data(int fd, CEHClient* target, uint16_t id, float...
type sockaddr_in (line 170) | struct sockaddr_in
type Message (line 171) | struct Message
type Message (line 171) | struct Message
type Message (line 172) | struct Message
type sockaddr_in (line 251) | struct sockaddr_in
function cemuhook_module_version (line 301) | const int cemuhook_module_version(void) {
function cemuhook_data_recieved (line 305) | void cemuhook_data_recieved(int fd, int port, const char* buffer, size_t...
function cemuhook_socket_enable (line 314) | bool cemuhook_socket_enable() {
function on_data_recieved (line 324) | static void on_data_recieved(Daemon* d, int fd, void* userdata) {
function sccd_cemuhook_socket_enable (line 339) | bool sccd_cemuhook_socket_enable() {
function check_stuff (line 394) | __attribute__((constructor)) void check_stuff() {
FILE: scc/cemuhook_server.py
class MessageType (line 23) | class MessageType(IntEnum):
class CemuhookServer (line 32) | class CemuhookServer:
method __init__ (line 36) | def __init__(self, daemon):
method _keepalive (line 62) | def _keepalive(self):
method on_data_recieved (line 69) | def on_data_recieved(self, fd, event_type):
method feed (line 76) | def feed(self, data):
FILE: scc/cheader.py
function eval_expr (line 57) | def eval_expr(expr):
function defines (line 77) | def defines(base, include):
FILE: scc/config.py
class Config (line 17) | class Config(object):
method __init__ (line 131) | def __init__(self):
method reload (line 136) | def reload(self):
method _check_dict (line 148) | def _check_dict(self, values, defaults):
method check_values (line 165) | def check_values(self):
method get_controller_config (line 183) | def get_controller_config(self, controller_id):
method load (line 207) | def load(self):
method create (line 211) | def create(self):
method save (line 218) | def save(self):
method __iter__ (line 230) | def __iter__(self):
method get (line 234) | def get(self, key, default=None):
method set (line 237) | def set(self, key, value):
method __contains__ (line 243) | def __contains__(self, key):
FILE: scc/constants.py
class SCButtons (line 78) | class SCButtons(IntEnum):
class HapticPos (line 111) | class HapticPos(IntEnum):
class ControllerFlags (line 118) | class ControllerFlags(IntEnum):
FILE: scc/controller.py
class Controller (line 10) | class Controller(object):
method __init__ (line 19) | def __init__(self):
method get_type (line 28) | def get_type(self):
method get_id (line 41) | def get_id(self):
method get_gui_config_file (line 49) | def get_gui_config_file(self):
method set_mapper (line 62) | def set_mapper(self, mapper):
method get_mapper (line 67) | def get_mapper(self):
method apply_config (line 72) | def apply_config(self, config):
method set_led_level (line 82) | def set_led_level(self, level):
method set_gyro_enabled (line 90) | def set_gyro_enabled(self, enabled):
method get_gyro_enabled (line 95) | def get_gyro_enabled(self):
method feedback (line 100) | def feedback(self, data):
method turnoff (line 108) | def turnoff(self):
method disconnected (line 113) | def disconnected(self):
class HapticData (line 118) | class HapticData(object):
method __init__ (line 121) | def __init__(self, position, amplitude=512, frequency=4, period=1024, ...
method with_position (line 140) | def with_position(self, position):
method get_position (line 146) | def get_position(self):
method get_amplitude (line 149) | def get_amplitude(self):
method get_frequency (line 152) | def get_frequency(self):
method get_period (line 155) | def get_period(self):
method get_count (line 158) | def get_count(self):
method __mul__ (line 161) | def __mul__(self, by):
FILE: scc/custom.py
function load_custom_module (line 15) | def load_custom_module(log, who_calls="daemon"):
FILE: scc/device_monitor.py
class DeviceMonitor (line 26) | class DeviceMonitor(Monitor):
method __init__ (line 28) | def __init__(self, *a):
method add_callback (line 37) | def add_callback(self, subsystem, vendor_id, product_id, added_cb, rem...
method add_remove_callback (line 52) | def add_remove_callback(self, syspath, cb):
method start (line 62) | def start(self):
method _on_new_syspath (line 71) | def _on_new_syspath(self, subsystem, syspath):
method _get_hci_addresses (line 93) | def _get_hci_addresses(self):
method _dev_for_hci (line 114) | def _dev_for_hci(self, syspath):
method on_data_ready (line 141) | def on_data_ready(self, *a):
method rescan (line 159) | def rescan(self):
method get_vendor_product (line 182) | def get_vendor_product(self, syspath, subsystem=None):
method get_hidraw (line 215) | def get_hidraw(self, syspath):
method _find_bt_address (line 231) | def _find_bt_address(syspath):
method get_usb_address (line 249) | def get_usb_address(syspath):
method get_subsystem (line 261) | def get_subsystem(syspath):
class hci_conn_info (line 270) | class hci_conn_info(ctypes.Structure):
class hci_conn_list_req (line 281) | class hci_conn_list_req(ctypes.Structure):
function create_device_monitor (line 289) | def create_device_monitor(daemon):
FILE: scc/drivers/ds4drv.py
class DS4Controller (line 27) | class DS4Controller(HIDController):
method _load_hid_descriptor (line 55) | def _load_hid_descriptor(self, config, max_size, vid, pid, test_mode):
method input (line 130) | def input(self, endpoint, data):
method get_gyro_enabled (line 143) | def get_gyro_enabled(self):
method get_type (line 149) | def get_type(self):
method get_gui_config_file (line 153) | def get_gui_config_file(self):
method __repr__ (line 157) | def __repr__(self):
method _generate_id (line 161) | def _generate_id(self):
class DS4EvdevController (line 174) | class DS4EvdevController(EvdevController):
method __init__ (line 241) | def __init__(self, daemon, controllerdevice, gyro, touchpad):
method _gyro_input (line 263) | def _gyro_input(self, *a):
method _touchpad_input (line 282) | def _touchpad_input(self, *a):
method close (line 322) | def close(self):
method get_gyro_enabled (line 331) | def get_gyro_enabled(self):
method get_type (line 337) | def get_type(self):
method get_gui_config_file (line 341) | def get_gui_config_file(self):
method __repr__ (line 345) | def __repr__(self):
method _generate_id (line 349) | def _generate_id(self):
function init (line 362) | def init(daemon, config):
FILE: scc/drivers/ds5drv.py
class OperatingMode (line 58) | class OperatingMode(IntEnum):
class PhysicalEffectControl (line 64) | class PhysicalEffectControl(IntEnum):
class LightEffectControl (line 70) | class LightEffectControl(IntEnum):
class DualSenseHIDOutput (line 78) | class DualSenseHIDOutput(ctypes.Structure):
class DualSenseHIDOutputBT (line 105) | class DualSenseHIDOutputBT(ctypes.Structure):
class DualSenseHIDInputBT (line 141) | class DualSenseHIDInputBT(ctypes.Structure):
class DualSenseBTControllerInput (line 149) | class DualSenseBTControllerInput(ctypes.Structure):
class DS5Controller (line 186) | class DS5Controller(HIDController):
method __init__ (line 213) | def __init__(self, device, daemon, handle, config_file, config, test_m...
method _load_hid_descriptor (line 224) | def _load_hid_descriptor(self, config, max_size, vid, pid, test_mode):
method input (line 341) | def input(self, endpoint, data):
method feedback (line 355) | def feedback(self, data):
method apply_config (line 385) | def apply_config(self, config):
method configure (line 390) | def configure(self, icon=None, led_level=100):
method get_gyro_enabled (line 420) | def get_gyro_enabled(self):
method get_type (line 425) | def get_type(self):
method get_gui_config_file (line 428) | def get_gui_config_file(self):
method __repr__ (line 431) | def __repr__(self):
method _generate_id (line 434) | def _generate_id(self):
method schedule_output (line 446) | def schedule_output(self, output_id, output):
method flush (line 449) | def flush(self):
class DS5HidRawDriver (line 458) | class DS5HidRawDriver:
method __init__ (line 459) | def __init__(self, daemon, config):
method retry (line 464) | def retry(self, syspath):
method make_bt_hidraw_callback (line 467) | def make_bt_hidraw_callback(self, syspath, *whatever):
class DS5HidRawController (line 481) | class DS5HidRawController(Controller):
class _DPadOutputValues (line 482) | class _DPadOutputValues:
method __init__ (line 483) | def __init__(self, x, y):
method __init__ (line 533) | def __init__(self, driver, syspath, hidrawdev):
method get_device_name (line 571) | def get_device_name(self):
method get_type (line 574) | def get_type(self):
method apply_config (line 577) | def apply_config(self, config):
method configure (line 582) | def configure(self, icon=None, led_level=100):
method _set_operational (line 630) | def _set_operational(self):
method _prepare_buffer_crc (line 664) | def _prepare_buffer_crc(self, buf):
method feedback (line 672) | def feedback(self, data):
method _input (line 708) | def _input(self, *a):
method _convert_input_data (line 741) | def _convert_input_data(self, data):
method _stick_axis_scale (line 816) | def _stick_axis_scale(self, value, invert=False, test=False):
method _calculate_quaternion (line 832) | def _calculate_quaternion(self, state):
method close (line 877) | def close(self):
method read_serial (line 885) | def read_serial(self):
method schedule_output (line 889) | def schedule_output(self, output_id, output):
method flush (line 892) | def flush(self):
method flushni (line 906) | def flushni(self):
method get_type (line 973) | def get_type(self):
method get_gui_config_file (line 976) | def get_gui_config_file(self):
method _generate_id (line 979) | def _generate_id(self):
method get_gyro_enabled (line 991) | def get_gyro_enabled(self):
class DS5EvdevController (line 997) | class DS5EvdevController(EvdevController):
method __init__ (line 1068) | def __init__(self, daemon, controllerdevice, gyro, touchpad):
method _gyro_input (line 1089) | def _gyro_input(self, *a):
method _touchpad_input (line 1108) | def _touchpad_input(self, *a):
method close (line 1149) | def close(self):
method get_gyro_enabled (line 1158) | def get_gyro_enabled(self):
method get_type (line 1163) | def get_type(self):
method get_gui_config_file (line 1167) | def get_gui_config_file(self):
method __repr__ (line 1170) | def __repr__(self):
method _generate_id (line 1173) | def _generate_id(self):
function init (line 1186) | def init(daemon, config):
FILE: scc/drivers/evdevdrv.py
class FakeECodes (line 23) | class FakeECodes:
method __getattr__ (line 24) | def __getattr__(self, key):
class EvdevController (line 46) | class EvdevController(Controller):
method __init__ (line 59) | def __init__(self, daemon, device, config_file, config):
method _parse_config (line 80) | def _parse_config(self, config):
method close (line 108) | def close(self):
method get_type (line 116) | def get_type(self):
method get_id (line 120) | def get_id(self):
method get_device_filename (line 124) | def get_device_filename(self):
method get_device_name (line 128) | def get_device_name(self):
method _generate_id (line 132) | def _generate_id(self):
method get_gui_config_file (line 147) | def get_gui_config_file(self):
method __repr__ (line 151) | def __repr__(self):
method input (line 155) | def input(self, *a):
method test_input (line 235) | def test_input(self, event):
method cancel_padpress_emulation (line 248) | def cancel_padpress_emulation(self, mapper):
method apply_config (line 288) | def apply_config(self, config):
method disconnected (line 293) | def disconnected(self):
method set_led_level (line 301) | def set_led_level(self, level):
method set_gyro_enabled (line 306) | def set_gyro_enabled(self, enabled):
method turnoff (line 311) | def turnoff(self):
method get_gyro_enabled (line 319) | def get_gyro_enabled(self):
method feedback (line 324) | def feedback(self, data):
function parse_axis (line 329) | def parse_axis(axis):
class EvdevDriver (line 355) | class EvdevDriver(object):
method __init__ (line 358) | def __init__(self):
method start (line 365) | def start(self):
method set_daemon (line 370) | def set_daemon(self, daemon):
method get_event_node (line 375) | def get_event_node(syspath):
method handle_new_device (line 382) | def handle_new_device(self, syspath, *bunchofnones):
method handle_removed_device (line 423) | def handle_removed_device(self, syspath, *bunchofnones):
method device_removed (line 428) | def device_removed(self, eventnode):
method handle_callback (line 436) | def handle_callback(self, callback, devices):
method make_new_device (line 449) | def make_new_device(self, factory, evdevdevice, *userdata):
function start (line 471) | def start(daemon):
function init (line 475) | def init(daemon, config):
function make_new_device (line 484) | def make_new_device(factory, evdevdevice, *userdata):
function get_evdev_devices_from_syspath (line 496) | def get_evdev_devices_from_syspath(syspath):
function get_axes (line 520) | def get_axes(dev):
function evdevdrv_test (line 527) | def evdevdrv_test(args):
FILE: scc/drivers/fake.py
function init (line 21) | def init(daemon, config):
function start (line 25) | def start(daemon):
class FakeController (line 32) | class FakeController(Controller):
method __init__ (line 33) | def __init__(self, number):
method get_type (line 39) | def get_type(self):
method set_led_level (line 43) | def set_led_level(self, level):
method __repr__ (line 47) | def __repr__(self):
FILE: scc/drivers/hiddrv.c
type HIDControllerInput (line 14) | struct HIDControllerInput {
type AxisType (line 20) | enum AxisType {
type AxisMode (line 45) | enum AxisMode {
type AxisModeData (line 58) | struct AxisModeData {
type DPadModeData (line 68) | struct DPadModeData {
type HatswitchModeData (line 77) | struct HatswitchModeData {
type AxisModeData (line 85) | struct AxisModeData
type DPadModeData (line 86) | struct DPadModeData
type HatswitchModeData (line 87) | struct HatswitchModeData
type AxisData (line 91) | struct AxisData {
type ButtonData (line 101) | struct ButtonData {
type HIDDecoder (line 111) | struct HIDDecoder {
function grab_value (line 130) | static union Value grab_value(const char* data, const size_t byte_offset...
function grab_with_size (line 137) | static int grab_with_size(const uint8_t size, const char* data, const si...
function decode (line 150) | bool decode(struct HIDDecoder* dec, const char* data) {
function hiddrv_module_version (line 275) | const int hiddrv_module_version(void) {
FILE: scc/drivers/hiddrv.py
class HIDDrvError (line 41) | class HIDDrvError(Exception): pass
class NotHIDDevice (line 42) | class NotHIDDevice(HIDDrvError): pass
class UnparsableDescriptor (line 43) | class UnparsableDescriptor(HIDDrvError): pass
class HIDControllerInput (line 45) | class HIDControllerInput(ctypes.Structure):
class AxisType (line 72) | class AxisType(IntEnum):
class AxisMode (line 95) | class AxisMode(IntEnum):
class AxisModeData (line 106) | class AxisModeData(ctypes.Structure):
class DPadModeData (line 117) | class DPadModeData(ctypes.Structure):
class HatswitchModeData (line 127) | class HatswitchModeData(ctypes.Structure):
class AxisDataUnion (line 135) | class AxisDataUnion(ctypes.Union):
class AxisData (line 143) | class AxisData(ctypes.Structure):
class ButtonData (line 154) | class ButtonData(ctypes.Structure):
class HIDDecoder (line 165) | class HIDDecoder(ctypes.Structure):
class HIDController (line 184) | class HIDController(USBDevice, Controller):
method __init__ (line 190) | def __init__(self, device, daemon, handle, config_file, config, test_m...
method _load_hid_descriptor (line 238) | def _load_hid_descriptor(self, config, max_size, vid, pid, test_mode):
method _build_button_map (line 248) | def _build_button_map(self, config):
method button_to_bit (line 275) | def button_to_bit(sc):
method _build_axis_maping (line 285) | def _build_axis_maping(self, axis, config, mode = AxisMode.AXIS):
method _build_hid_decoder (line 330) | def _build_hid_decoder(self, data, config, max_size):
method find_sys_devices_descriptor (line 422) | def find_sys_devices_descriptor(vid, pid):
method close (line 466) | def close(self):
method get_type (line 474) | def get_type(self):
method _generate_id (line 478) | def _generate_id(self):
method get_id (line 494) | def get_id(self):
method get_gui_config_file (line 498) | def get_gui_config_file(self):
method __repr__ (line 502) | def __repr__(self):
method test_input (line 507) | def test_input(self, endpoint, data):
method input (line 532) | def input(self, endpoint, data):
method apply_config (line 539) | def apply_config(self, config):
method disconnected (line 544) | def disconnected(self):
method set_led_level (line 552) | def set_led_level(self, level):
method set_gyro_enabled (line 557) | def set_gyro_enabled(self, enabled):
class HIDDrv (line 562) | class HIDDrv(object):
method __init__ (line 564) | def __init__(self, daemon):
method hotplug_cb (line 572) | def hotplug_cb(self, device, handle):
method scan_files (line 581) | def scan_files(self):
function hiddrv_test (line 622) | def hiddrv_test(cls, args):
function init (line 689) | def init(daemon, config):
FILE: scc/drivers/remotepad.h
type remote_joypad_message (line 14) | struct remote_joypad_message {
type RemotePad (line 22) | typedef struct RemotePad {
type remote_joypad_message (line 28) | struct remote_joypad_message
FILE: scc/drivers/remotepad.py
class ControllerInput (line 17) | class ControllerInput(ctypes.Structure):
class Mapper (line 43) | class Mapper(ctypes.Structure):
class RemotePad (line 49) | class RemotePad(ctypes.Structure):
class RemoteJoypadMessage (line 56) | class RemoteJoypadMessage(ctypes.Structure):
class RemotePadController (line 66) | class RemotePadController(Controller):
method __init__ (line 70) | def __init__(self, driver, address):
method get_type (line 83) | def get_type(self):
method _remove (line 86) | def _remove(self, *a):
method turnoff (line 89) | def turnoff(self):
method _input (line 95) | def _input(self, trash, data):
method get_gui_config_file (line 100) | def get_gui_config_file(self):
class Driver (line 104) | class Driver:
method __init__ (line 107) | def __init__(self, daemon, config):
method _remove (line 123) | def _remove(self, address):
method on_data_ready (line 127) | def on_data_ready(self, *a):
function init (line 142) | def init(daemon, config):
FILE: scc/drivers/remotepad_controller.c
function SCButton (line 18) | inline static SCButton libretro_button_to_sc_button(int id) {
function remotepad_input (line 38) | void remotepad_input(RemotePad* pad, struct remote_joypad_message* msg) {
function remotepad_module_version (line 116) | const int remotepad_module_version(void) {
FILE: scc/drivers/sc_by_bt.c
type BtInPacketType (line 9) | enum BtInPacketType {
type SCButtons (line 23) | enum SCButtons {
type SCByBtControllerInput (line 47) | struct SCByBtControllerInput {
type SCByBtC (line 70) | struct SCByBtC {
type SCByBtC (line 78) | struct SCByBtC
function debug_packet (line 109) | static inline void debug_packet(char* buffer, size_t size) {
function read_input (line 119) | int read_input(SCByBtCPtr ptr) {
function sc_by_bt_module_version (line 253) | const int sc_by_bt_module_version(void) {
FILE: scc/drivers/sc_by_bt.py
class SCByBtControllerInput (line 25) | class SCByBtControllerInput(ctypes.Structure):
class SCByBtC (line 50) | class SCByBtC(ctypes.Structure):
class Driver (line 63) | class Driver:
method __init__ (line 67) | def __init__(self, daemon, config):
method retry (line 79) | def retry(self, syspath):
method _retry_cancel (line 95) | def _retry_cancel(self, syspath, vendor, product):
method new_device_callback (line 104) | def new_device_callback(self, syspath, *whatever):
class SCByBt (line 116) | class SCByBt(SCController):
method __init__ (line 119) | def __init__(self, driver, syspath, hidrawdev):
method get_device_name (line 145) | def get_device_name(self):
method get_type (line 151) | def get_type(self):
method __repr__ (line 155) | def __repr__(self):
method configure (line 159) | def configure(self, idle_timeout=None, enable_gyros=None, led_level=No...
method read_serial (line 209) | def read_serial(self):
method send_control (line 214) | def send_control(self, index, data):
method overwrite_control (line 221) | def overwrite_control(self, index, data):
method make_request (line 235) | def make_request(self, index, callback, data, size=PACKET_SIZE):
method flush (line 243) | def flush(self):
method input (line 253) | def input(self, idata):
method turnoff (line 256) | def turnoff(self):
method close (line 263) | def close(self, *a):
method disconnected (line 270) | def disconnected(self):
method _input (line 274) | def _input(self, *a):
function hidraw_test (line 310) | def hidraw_test(filename):
function init (line 341) | def init(daemon, config):
FILE: scc/drivers/sc_by_cable.py
function init (line 24) | def init(daemon, config):
class SCByCable (line 33) | class SCByCable(USBDevice, SCController):
method __init__ (line 36) | def __init__(self, device, handle, daemon):
method generate_serial (line 48) | def generate_serial(self):
method disconnected (line 52) | def disconnected(self):
method __repr__ (line 57) | def __repr__(self):
method on_serial_got (line 61) | def on_serial_got(self):
method _wait_input (line 67) | def _wait_input(self, endpoint, data):
method _timer (line 77) | def _timer(self):
method close (line 94) | def close(self):
method turnoff (line 102) | def turnoff(self):
FILE: scc/drivers/sc_dongle.py
function init (line 60) | def init(daemon, config):
class Dongle (line 69) | class Dongle(USBDevice):
method __init__ (line 73) | def __init__(self, device, handle, daemon):
method close (line 85) | def close(self):
method _add_controller (line 93) | def _add_controller(self, endpoint):
method _on_input (line 105) | def _on_input(self, endpoint, data):
class SCStatus (line 130) | class SCStatus(IntEnum):
class SCPacketType (line 136) | class SCPacketType(IntEnum):
class SCPacketLength (line 151) | class SCPacketLength(IntEnum):
class SCConfigType (line 160) | class SCConfigType(IntEnum):
class SCController (line 166) | class SCController(Controller):
method __init__ (line 167) | def __init__(self, driver, ccidx, endpoint):
method get_type (line 183) | def get_type(self):
method __repr__ (line 187) | def __repr__(self):
method input (line 191) | def input(self, idata):
method _generate_id (line 237) | def _generate_id(self):
method read_serial (line 254) | def read_serial(self):
method generate_serial (line 278) | def generate_serial(self):
method on_serial_got (line 287) | def on_serial_got(self):
method apply_config (line 297) | def apply_config(self, config):
method disconnected (line 304) | def disconnected(self):
method configure (line 314) | def configure(self, idle_timeout=None, enable_gyros=None, led_level=No...
method set_led_level (line 370) | def set_led_level(self, level):
method set_gyro_enabled (line 382) | def set_gyro_enabled(self, enabled):
method turnoff (line 386) | def turnoff(self):
method get_gyro_enabled (line 394) | def get_gyro_enabled(self):
method feedback (line 399) | def feedback(self, data):
method _feedback (line 403) | def _feedback(self, position, amplitude=128, period=0, count=1):
FILE: scc/drivers/scc_future.h
type ControllerInput (line 4) | typedef struct ControllerInput ControllerInput;
type Axis (line 6) | typedef uint16_t Axis;
type Keycode (line 7) | typedef uint16_t Keycode;
type TriggerValue (line 9) | typedef uint8_t TriggerValue;
type AxisValue (line 10) | typedef int16_t AxisValue;
type GyroValue (line 11) | typedef int16_t GyroValue;
type SCButton (line 13) | typedef enum SCButton {
type GyroInput (line 43) | struct GyroInput {
type ControllerInput (line 53) | struct ControllerInput {
type Mapper (line 82) | typedef struct Mapper Mapper;
type Mapper (line 83) | struct Mapper {
FILE: scc/drivers/steamdeck.py
class DeckInput (line 34) | class DeckInput(ctypes.Structure):
class DeckButton (line 70) | class DeckButton(IntEnum):
function map_button (line 112) | def map_button(i, from_, to):
function map_dpad (line 116) | def map_dpad(i, low, hi):
function apply_deadzone (line 125) | def apply_deadzone(value, deadzone):
class Deck (line 131) | class Deck(USBDevice, SCController):
method __init__ (line 139) | def __init__(self, device, handle, daemon):
method generate_serial (line 150) | def generate_serial(self):
method disconnected (line 153) | def disconnected(self):
method set_gyro_enabled (line 157) | def set_gyro_enabled(self, enabled):
method get_gyro_enabled (line 161) | def get_gyro_enabled(self):
method get_type (line 165) | def get_type(self):
method __repr__ (line 168) | def __repr__(self):
method get_gui_config_file (line 171) | def get_gui_config_file(self):
method configure (line 174) | def configure(self, idle_timeout=None, enable_gyros=None, led_level=No...
method clear_mappings (line 180) | def clear_mappings(self):
method on_serial_got (line 186) | def on_serial_got(self):
method _on_input (line 191) | def _on_input(self, endpoint, data):
method close (line 233) | def close(self):
method turnoff (line 239) | def turnoff(self):
function init (line 243) | def init(daemon, config):
FILE: scc/drivers/usb.py
class USBDevice (line 17) | class USBDevice(object):
method __init__ (line 19) | def __init__(self, device, handle):
method set_input_interrupt (line 28) | def set_input_interrupt(self, endpoint, size, callback):
method send_control (line 59) | def send_control(self, index, data):
method overwrite_control (line 73) | def overwrite_control(self, index, data):
method make_request (line 87) | def make_request(self, index, callback, data, size=64):
method flush (line 102) | def flush(self):
method force_restart (line 120) | def force_restart(self):
method claim (line 130) | def claim(self, number):
method claim_by (line 140) | def claim_by(self, klass, subclass, protocol):
method unclaim (line 158) | def unclaim(self):
method close (line 170) | def close(self):
class USBDriver (line 181) | class USBDriver(object):
method __init__ (line 182) | def __init__(self):
method set_daemon (line 195) | def set_daemon(self, daemon):
method on_exit (line 199) | def on_exit(self, *a):
method start (line 208) | def start(self):
method handle_new_device (line 226) | def handle_new_device(self, syspath, vendor, product):
method handle_removed_device (line 282) | def handle_removed_device(self, syspath, vendor, product):
method register_hotplug_device (line 296) | def register_hotplug_device(self, callback, vendor_id, product_id, on_...
method unregister_hotplug_device (line 306) | def unregister_hotplug_device(self, callback, vendor_id, product_id):
method mainloop (line 314) | def mainloop(self):
function init (line 337) | def init(daemon, config):
function start (line 343) | def start(daemon):
function register_hotplug_device (line 347) | def register_hotplug_device(callback, vendor_id, product_id, on_failure=...
function unregister_hotplug_device (line 351) | def unregister_hotplug_device(callback, vendor_id, product_id):
FILE: scc/foreign/vdf.py
class VDFProfile (line 23) | class VDFProfile(Profile):
method __init__ (line 79) | def __init__(self, name = "Unnamed"):
method parse_action (line 88) | def parse_action(self, lst_or_str, button=None):
method parse_modifiers (line 165) | def parse_modifiers(group, action, side):
method convert_key_name (line 197) | def convert_key_name(name):
method convert_button_name (line 221) | def convert_button_name(name):
method parse_button (line 233) | def parse_button(self, bdef, button=None):
method get_inputs (line 270) | def get_inputs(group):
method find_group (line 283) | def find_group(data, id):
method parse_group (line 291) | def parse_group(self, group, side):
method parse_switches (line 445) | def parse_switches(self, group):
method parse_input_binding (line 468) | def parse_input_binding(self, data, group_id, binding):
method set_by_binding (line 487) | def set_by_binding(self, binding, action):
method add_by_binding (line 512) | def add_by_binding(self, binding, action):
method get_by_binding (line 524) | def get_by_binding(self, binding):
method _load_preset (line 549) | def _load_preset(data, profile, preset):
method _get_preset_name (line 581) | def _get_preset_name(data, preset):
method action_set_by_id (line 589) | def action_set_by_id(self, id):
method load (line 597) | def load(self, filename):
method load_data (line 606) | def load_data(self, data):
FILE: scc/foreign/vdffz.py
class VDFFZProfile (line 13) | class VDFFZProfile(VDFProfile):
method load (line 14) | def load(self, filename):
FILE: scc/gestures.py
class GestureDetector (line 20) | class GestureDetector(Action):
method __init__ (line 34) | def __init__(self, up_direction, on_finished):
method enable (line 46) | def enable(self):
method get_string (line 52) | def get_string(self):
method get_positions (line 57) | def get_positions(self):
method get_resolution (line 62) | def get_resolution(self):
method whole (line 67) | def whole(self, mapper, x, y, what):
FILE: scc/gui/aboutdialog.py
class AboutDialog (line 12) | class AboutDialog(Editor):
method __init__ (line 16) | def __init__(self, app):
method setup_widgets (line 21) | def setup_widgets(self):
method show (line 38) | def show(self, modal_for):
method on_dialog_response (line 45) | def on_dialog_response(self, *a):
FILE: scc/gui/action_editor.py
class ActionEditor (line 62) | class ActionEditor(Editor):
method __init__ (line 83) | def __init__(self, app, callback):
method setup_widgets (line 119) | def setup_widgets(self):
method load_components (line 160) | def load_components(self):
method load_component (line 168) | def load_component(self, class_name):
method on_Dialog_destroy (line 186) | def on_Dialog_destroy(self, *a):
method on_Dialog_key_press_event (line 194) | def on_Dialog_key_press_event(self, window, event):
method set_osd_enabled (line 199) | def set_osd_enabled(self, value):
method show (line 209) | def show(self, transient_for):
method close (line 213) | def close(self):
method get_id (line 218) | def get_id(self):
method on_link (line 223) | def on_link(self, link):
method on_action_type_changed (line 256) | def on_action_type_changed(self, clicked_button):
method force_page (line 291) | def force_page(self, component, remove_rest=False):
method get_name (line 324) | def get_name(self):
method get_current_page (line 330) | def get_current_page(self):
method _set_title (line 335) | def _set_title(self):
method blink_widget (line 348) | def blink_widget(self, name, time=500):
method hide_modifiers (line 366) | def hide_modifiers(self):
method hide_advanced_settings (line 372) | def hide_advanced_settings(self):
method hide_modeshift (line 380) | def hide_modeshift(self):
method hide_macro (line 388) | def hide_macro(self):
method hide_ring (line 396) | def hide_ring(self):
method hide_action_buttons (line 404) | def hide_action_buttons(self):
method hide_action_str (line 413) | def hide_action_str(self):
method hide_editor (line 419) | def hide_editor(self):
method hide_name (line 428) | def hide_name(self):
method hide_clear (line 438) | def hide_clear(self):
method on_btClearRotation_clicked (line 443) | def on_btClearRotation_clicked(self, *a):
method on_btClearSens_clicked (line 447) | def on_btClearSens_clicked(self, source, *a):
method on_btClearFeedback_clicked (line 455) | def on_btClearFeedback_clicked(self, source, *a):
method on_btClearSmoothing_clicked (line 461) | def on_btClearSmoothing_clicked(self, source, *a):
method on_btClearDeadzone_clicked (line 467) | def on_btClearDeadzone_clicked(self, source, *a):
method on_btClear_clicked (line 473) | def on_btClear_clicked(self, *a):
method on_btOK_clicked (line 481) | def on_btOK_clicked(self, *a):
method on_btModeshift_clicked (line 496) | def on_btModeshift_clicked(self, *a):
method on_btMacro_clicked (line 506) | def on_btMacro_clicked(self, *a):
method on_btInnerRing_clicked (line 516) | def on_btInnerRing_clicked(self, *a):
method on_exMore_activate (line 526) | def on_exMore_activate(self, ex, *a):
method update_modifiers (line 531) | def update_modifiers(self, *a):
method generate_modifiers (line 636) | def generate_modifiers(self, action, from_custom=False):
method is_editable_modifier (line 711) | def is_editable_modifier(action):
method strip_modifiers (line 729) | def strip_modifiers(action):
method load_modifiers (line 741) | def load_modifiers(self, action, index=-1):
method allow_first_page (line 850) | def allow_first_page(self):
method reset_active_component (line 857) | def reset_active_component(self):
method set_action (line 865) | def set_action(self, action, from_custom=False):
method apply_preview (line 930) | def apply_preview(self, action):
method on_cbPreview_toggled (line 937) | def on_cbPreview_toggled(self, cb):
method enable_preview (line 948) | def enable_preview(self, action):
method enable_modifiers (line 959) | def enable_modifiers(self, action):
method set_sensitivity (line 1008) | def set_sensitivity(self, x, y=1.0, z=1.0):
method get_sensitivity (line 1021) | def get_sensitivity(self):
method set_default_sensitivity (line 1026) | def set_default_sensitivity(self, x, y=1.0, z=1.0):
method get_mode (line 1045) | def get_mode(self):
method _set_mode (line 1049) | def _set_mode(self, action, mode):
method on_sclFFrequency_format_value (line 1078) | def on_sclFFrequency_format_value(self, scale, value):
method on_sclFriction_format_value (line 1085) | def on_sclFriction_format_value(self, scale, value):
method on_btClearFriction_clicked (line 1094) | def on_btClearFriction_clicked(self, *a):
method set_input (line 1099) | def set_input(self, id, action, mode=None):
method set_menu_item (line 1163) | def set_menu_item(self, item, title_for_name_label=None):
method set_modifiers_enabled (line 1185) | def set_modifiers_enabled(self, enabled):
FILE: scc/gui/ae/__init__.py
class AEComponent (line 14) | class AEComponent(ComboSetter):
method __init__ (line 22) | def __init__(self, app, editor):
method get_button_title (line 28) | def get_button_title(self):
method shown (line 33) | def shown(self):
method hidden (line 39) | def hidden(self):
method on_ok (line 44) | def on_ok(self, action):
method load (line 51) | def load(self):
method is_loaded (line 68) | def is_loaded(self):
method handles (line 72) | def handles(self, mode, action):
method set_action (line 81) | def set_action(self, mode, action):
method modifier_updated (line 88) | def modifier_updated(self):
method get_widget (line 95) | def get_widget(self):
function describe_action (line 100) | def describe_action(mode, cls, v):
FILE: scc/gui/ae/axis.py
class AxisComponent (line 24) | class AxisComponent(AEComponent, Chooser):
method __init__ (line 30) | def __init__(self, app, editor):
method load (line 36) | def load(self):
method area_action_selected (line 42) | def area_action_selected(self, area, action):
method set_action (line 50) | def set_action(self, mode, action):
method get_button_title (line 64) | def get_button_title(self):
method handles (line 68) | def handles(self, mode, action):
FILE: scc/gui/ae/axis_action.py
class AxisActionComponent (line 33) | class AxisActionComponent(AEComponent, TimerManager):
method __init__ (line 39) | def __init__(self, app, editor):
method load (line 52) | def load(self):
method hidden (line 79) | def hidden(self):
method set_action (line 83) | def set_action(self, mode, action):
method update_osd_area (line 121) | def update_osd_area(self, action):
method load_circular_action (line 138) | def load_circular_action(self, action):
method load_button_action (line 167) | def load_button_action(self, action):
method load_mouse_action (line 175) | def load_mouse_action(self, action):
method load_area_action (line 197) | def load_area_action(self, action):
method on_btCircularAxis_clicked (line 238) | def on_btCircularAxis_clicked(self, *a):
method on_btCircularButton_clicked (line 251) | def on_btCircularButton_clicked(self, button, *a):
method on_btClearCircularAxis_clicked (line 265) | def on_btClearCircularAxis_clicked(self, *a):
method on_btClearCircularButtons_clicked (line 272) | def on_btClearCircularButtons_clicked(self, *a):
method on_btSingleButton_clicked (line 281) | def on_btSingleButton_clicked(self, *a):
method on_cbAreaOSDEnabled_toggled (line 294) | def on_cbAreaOSDEnabled_toggled(self, *a):
method pressing_pad_clicks (line 299) | def pressing_pad_clicks(self):
method on_ok (line 312) | def on_ok(self, action):
method on_mouse_options_changed (line 330) | def on_mouse_options_changed(self, *a):
method make_mouse_action (line 336) | def make_mouse_action(self):
method make_circular_action (line 345) | def make_circular_action(self):
method make_area_action (line 358) | def make_area_action(self):
method get_button_title (line 402) | def get_button_title(self):
method handles (line 406) | def handles(self, mode, action):
method on_area_options_changed (line 434) | def on_area_options_changed(self, *a):
method on_sbArea_output (line 448) | def on_sbArea_output(self, button, *a):
method on_sbArea_focus_out_event (line 455) | def on_sbArea_focus_out_event(self, button, *a):
method on_sbArea_changed (line 459) | def on_sbArea_changed(self, button, *a):
method on_lblSetupTrackball_activate_link (line 464) | def on_lblSetupTrackball_activate_link(self, trash, link):
method on_cbAxisOutput_changed (line 468) | def on_cbAxisOutput_changed(self, *a):
class FakeMapper (line 498) | class FakeMapper(object):
method __init__ (line 505) | def __init__(self, editor):
method get_xdisplay (line 509) | def get_xdisplay(self):
method get_current_window (line 512) | def get_current_window(self):
FILE: scc/gui/ae/buttons.py
class ButtonsComponent (line 27) | class ButtonsComponent(AEComponent, Chooser):
method __init__ (line 38) | def __init__(self, app, editor):
method load (line 45) | def load(self):
method area_action_selected (line 54) | def area_action_selected(self, area, action):
method set_action (line 59) | def set_action(self, mode, action):
method get_button_title (line 88) | def get_button_title(self):
method handles (line 92) | def handles(self, mode, action):
method on_key_grabbed (line 114) | def on_key_grabbed(self, keys):
method on_additional_key_grabbed (line 120) | def on_additional_key_grabbed(self, keys):
method modifiers_first (line 126) | def modifiers_first(key):
method apply_keys (line 132) | def apply_keys(self, *a):
method on_btnGrabKey_clicked (line 149) | def on_btnGrabKey_clicked(self, *a):
method on_btnGrabAnother_clicked (line 158) | def on_btnGrabAnother_clicked(self, *a):
method on_cbToggle_toggled (line 167) | def on_cbToggle_toggled(self, cbToggle):
method on_cbRepeat_toggled (line 174) | def on_cbRepeat_toggled(self, cbRepeat):
method hide_toggle (line 181) | def hide_toggle(self):
method hide_axes (line 195) | def hide_axes(self):
function is_button_togle (line 200) | def is_button_togle(action):
function is_button_repeat (line 213) | def is_button_repeat(action):
FILE: scc/gui/ae/custom.py
class CustomActionComponent (line 20) | class CustomActionComponent(AEComponent):
method __init__ (line 26) | def __init__(self, app, editor):
method handles (line 31) | def handles(self, mode, action):
method get_button_title (line 36) | def get_button_title(self):
method load (line 40) | def load(self):
method set_action (line 49) | def set_action(self, mode, action):
method on_tbCustomAction_changed (line 55) | def on_tbCustomAction_changed(self, tbCustomAction, *a):
method shown (line 67) | def shown(self):
method hidden (line 71) | def hidden(self):
FILE: scc/gui/ae/dpad.py
class DPADComponent (line 30) | class DPADComponent(AEComponent, MenuActionCofC, BindingEditor):
method __init__ (line 38) | def __init__(self, app, editor):
method load (line 47) | def load(self):
method shown (line 56) | def shown(self):
method set_action (line 62) | def set_action(self, mode, action):
method update_button_desc (line 80) | def update_button_desc(self, action):
method set_button_desc (line 87) | def set_button_desc(self, i):
method get_button_title (line 95) | def get_button_title(self):
method handles (line 99) | def handles(self, mode, action):
method update (line 105) | def update(self):
method on_cbActionType_changed (line 145) | def on_cbActionType_changed(self, *a):
method on_action_chosen (line 159) | def on_action_chosen(self, i, action, mark_changed=True):
method on_sclDiagonalRange_format_value (line 173) | def on_sclDiagonalRange_format_value(self, scale, value):
method on_btClearDiagonalRange_clicked (line 177) | def on_btClearDiagonalRange_clicked(self, *a):
method on_sclDiagonalRange_value_changed (line 182) | def on_sclDiagonalRange_value_changed(self, *a):
method on_btDPAD_clicked (line 186) | def on_btDPAD_clicked(self, b):
method get_default_confirm (line 200) | def get_default_confirm(self):
method get_default_cancel (line 209) | def get_default_cancel(self):
method get_control_with (line 218) | def get_control_with(self):
method on_exMenuControl_activate (line 225) | def on_exMenuControl_activate(self, ex, *a):
method on_exMenuPosition_activate (line 230) | def on_exMenuPosition_activate(self, ex, *a):
FILE: scc/gui/ae/first_page.py
class FirstPage (line 77) | class FirstPage(AEComponent):
method __init__ (line 83) | def __init__(self, app, editor):
method load (line 86) | def load(self):
method on_lblMarkup_activate_link (line 119) | def on_lblMarkup_activate_link(self, trash, link):
FILE: scc/gui/ae/gesture.py
class GestureComponent (line 29) | class GestureComponent(AEComponent):
method __init__ (line 35) | def __init__(self, app, editor):
method load (line 42) | def load(self):
method set_action (line 55) | def set_action(self, mode, action):
method _add_gesture (line 63) | def _add_gesture(self, gstr, action, select=False):
method nice_gstr (line 82) | def nice_gstr(gstr):
method get_button_title (line 93) | def get_button_title(self):
method handles (line 97) | def handles(self, mode, action):
method on_tvGestures_cursor_changed (line 101) | def on_tvGestures_cursor_changed(self, *a):
method on_btEditAction_clicked (line 114) | def on_btEditAction_clicked(self, *a):
method on_btChangeGesture_clicked (line 136) | def on_btChangeGesture_clicked(self, *a):
method on_cbIgnoreStroke_toggled (line 144) | def on_cbIgnoreStroke_toggled(self, cb):
method on_btRemove_clicked (line 154) | def on_btRemove_clicked(self, *a):
method on_btAdd_clicked (line 161) | def on_btAdd_clicked(self, *a):
method on_sclPrecision_format_value (line 172) | def on_sclPrecision_format_value(self, scl, value):
method on_sclPrecision_value_changed (line 176) | def on_sclPrecision_value_changed(self, *a):
method on_btClearTolerance_clicked (line 180) | def on_btClearTolerance_clicked(self, *a):
method on_action_chosen (line 184) | def on_action_chosen(self, id, action, mark_changed=True):
method update (line 195) | def update(self):
class GestureGrabber (line 209) | class GestureGrabber(object):
method __init__ (line 210) | def __init__(self, editor, builder):
method fail (line 230) | def fail(self, *a):
method disconnect_signals (line 238) | def disconnect_signals(self):
method lock_buttons (line 249) | def lock_buttons(self):
method on_event (line 264) | def on_event(self, c, button, data):
method grab (line 272) | def grab(self, callback):
method use (line 280) | def use(self, *a):
method close (line 285) | def close(self, *a):
method start_over (line 293) | def start_over(self, *a):
method _create_gd (line 307) | def _create_gd(self):
method on_gesture_updated (line 325) | def on_gesture_updated(self, gd, gstr):
method on_gesture_recognized (line 331) | def on_gesture_recognized(self, gd):
FILE: scc/gui/ae/gyro.py
class GyroComponent (line 24) | class GyroComponent(AEComponent):
method __init__ (line 30) | def __init__(self, app, editor):
method load (line 36) | def load(self):
method set_action (line 49) | def set_action(self, mode, action):
method get_button_title (line 77) | def get_button_title(self):
method handles (line 81) | def handles(self, mode, action):
method on_select_axis (line 94) | def on_select_axis(self, source, *a):
method on_abs_changed (line 107) | def on_abs_changed(self, source, *a):
method select_gyro_button (line 112) | def select_gyro_button(self, item):
method on_cbInvertGyro_toggled (line 139) | def on_cbInvertGyro_toggled(self, cb, *a):
method on_sclSoftLevel_format_value (line 149) | def on_sclSoftLevel_format_value(self, scale, value):
method update (line 153) | def update(self, *a):
method send (line 158) | def send(self, *a):
FILE: scc/gui/ae/gyro_action.py
class GyroActionComponent (line 26) | class GyroActionComponent(AEComponent):
method __init__ (line 62) | def __init__(self, app, editor):
method load (line 68) | def load(self):
method set_action (line 77) | def set_action(self, mode, action):
method modifier_updated (line 131) | def modifier_updated(self):
method cbInvertY_toggled_cb (line 143) | def cbInvertY_toggled_cb(self, cb, *a):
method get_button_title (line 155) | def get_button_title(self):
method handles (line 159) | def handles(self, mode, action):
method select_gyro_output (line 181) | def select_gyro_output(self, key):
method select_yaw_roll (line 194) | def select_yaw_roll(self, yawroll):
method select_gyro_button (line 207) | def select_gyro_button(self, item):
method on_cbInvertGyro_toggled (line 229) | def on_cbInvertGyro_toggled(self, cb, *a):
method on_sclSoftLevel_format_value (line 239) | def on_sclSoftLevel_format_value(self, scale, value):
method update (line 243) | def update(self, *a):
method hidden (line 252) | def hidden(self):
method send (line 256) | def send(self, *a):
function is_gyro_enable (line 301) | def is_gyro_enable(modemod):
function fill_buttons (line 330) | def fill_buttons(cb):
FILE: scc/gui/ae/menu_action.py
class MenuActionCofC (line 27) | class MenuActionCofC(UserDataManager):
method __init__ (line 29) | def __init__(self):
method allow_menus (line 37) | def allow_menus(self, allow_globals, allow_in_profile):
method set_selected_menu (line 49) | def set_selected_menu(self, menu):
method menu_class_to_key (line 59) | def menu_class_to_key(action):
method load_menu_data (line 75) | def load_menu_data(self, action):
method get_default_confirm (line 133) | def get_default_confirm(self):
method get_default_cancel (line 141) | def get_default_cancel(self):
method on_menu_changed (line 149) | def on_menu_changed(self, new_id):
method on_btEditMenu_clicked (line 155) | def on_btEditMenu_clicked(self, *a):
method on_cbMenus_button_press_event (line 167) | def on_cbMenus_button_press_event(self, trash, event):
method on_mnuMenuNew_activate (line 174) | def on_mnuMenuNew_activate(self, *a):
method on_mnuMenuCopy_activate (line 178) | def on_mnuMenuCopy_activate(self, *a):
method on_mnuMenuRename_activate (line 182) | def on_mnuMenuRename_activate(self, *a):
method on_mnuMenuDelete_activate (line 186) | def on_mnuMenuDelete_activate(self, *a):
method on_menus_loaded (line 217) | def on_menus_loaded(self, menus):
method handles (line 256) | def handles(self, mode, action):
method get_selected_menu (line 262) | def get_selected_menu(self):
method prevent_confirm_cancel_nonsense (line 272) | def prevent_confirm_cancel_nonsense(self, widget, *a):
method on_cbMenus_changed (line 295) | def on_cbMenus_changed(self, *a):
method on_new_menu_selected (line 433) | def on_new_menu_selected(self, make_copy=False):
method update_size_display (line 448) | def update_size_display(self, action):
method get_control_with (line 474) | def get_control_with(self):
method on_spMenuSize_format_value (line 482) | def on_spMenuSize_format_value(self, spinner):
method on_sclMenuSize_format_value (line 491) | def on_sclMenuSize_format_value(self, scale, val):
FILE: scc/gui/ae/menu_only.py
class MenuOnlyComponent (line 22) | class MenuOnlyComponent(AEComponent, MenuActionCofC):
method __init__ (line 28) | def __init__(self, app, editor):
method shown (line 35) | def shown(self):
method set_action (line 41) | def set_action(self, mode, action):
method get_button_title (line 48) | def get_button_title(self):
method handles (line 52) | def handles(self, mode, action):
FILE: scc/gui/ae/osk_action.py
class OSKActionComponent (line 25) | class OSKActionComponent(AEComponent):
method __init__ (line 31) | def __init__(self, app, editor):
method set_action (line 36) | def set_action(self, mode, action):
method get_button_title (line 59) | def get_button_title(self):
method handles (line 63) | def handles(self, mode, action):
method on_cbActionType_changed (line 69) | def on_cbActionType_changed(self, *a):
FILE: scc/gui/ae/osk_buttons.py
class OSKButtonsComponent (line 27) | class OSKButtonsComponent(ButtonsComponent):
method get_button_title (line 33) | def get_button_title(self):
method load (line 37) | def load(self):
FILE: scc/gui/ae/per_axis.py
class PerAxisComponent (line 23) | class PerAxisComponent(AEComponent):
method __init__ (line 29) | def __init__(self, app, editor):
method set_action (line 34) | def set_action(self, mode, action):
method get_button_title (line 41) | def get_button_title(self):
method handles (line 45) | def handles(self, mode, action):
method update (line 49) | def update(self):
method send (line 54) | def send(self):
method on_btAxisX_clicked (line 58) | def on_btAxisX_clicked(self, *a):
method on_btAxisY_clicked (line 67) | def on_btAxisY_clicked(self, *a):
method grab_action (line 76) | def grab_action(self, action, cb):
FILE: scc/gui/ae/recent_list.py
class RecentListGenComponent (line 18) | class RecentListGenComponent(AEComponent):
method __init__ (line 24) | def __init__(self, app, editor):
method set_action (line 28) | def set_action(self, mode, action):
method get_button_title (line 32) | def get_button_title(self):
method handles (line 36) | def handles(self, mode, action):
method set_row_count (line 41) | def set_row_count(self, count):
method get_row_count (line 45) | def get_row_count(self):
FILE: scc/gui/ae/special_action.py
class SpecialActionComponent (line 23) | class SpecialActionComponent(AEComponent, MenuActionCofC):
method __init__ (line 29) | def __init__(self, app, editor):
method load (line 37) | def load(self):
method shown (line 46) | def shown(self):
method confirm_with_same_active (line 53) | def confirm_with_same_active(self):
method set_action (line 58) | def set_action(self, mode, action):
method on_profiles_loaded (line 93) | def on_profiles_loaded(self, profiles):
method get_button_title (line 116) | def get_button_title(self):
method handles (line 120) | def handles(self, mode, action):
method on_cbActionType_changed (line 129) | def on_cbActionType_changed(self, *a):
method on_cbProfile_changed (line 168) | def on_cbProfile_changed(self, *a):
method on_enCommand_changed (line 184) | def on_enCommand_changed(self, *a):
method on_osd_settings_changed (line 190) | def on_osd_settings_changed(self, *a):
method on_exMenuControl_activate (line 204) | def on_exMenuControl_activate(self, ex, *a):
method on_exMenuPosition_activate (line 209) | def on_exMenuPosition_activate(self, ex, *a):
method on_sclOSDTimeout_format_value (line 214) | def on_sclOSDTimeout_format_value(self, scale, value):
FILE: scc/gui/ae/tilt.py
class TiltComponent (line 27) | class TiltComponent(AEComponent, BindingEditor):
method __init__ (line 33) | def __init__(self, app, editor):
method set_action (line 40) | def set_action(self, mode, action):
method update_button_desc (line 48) | def update_button_desc(self, action):
method set_button_desc (line 55) | def set_button_desc(self, i):
method get_button_title (line 63) | def get_button_title(self):
method handles (line 67) | def handles(self, mode, action):
method update (line 71) | def update(self):
method on_action_chosen (line 75) | def on_action_chosen(self, i, action, mark_changed=True):
method on_btTilt_clicked (line 81) | def on_btTilt_clicked(self, b):
FILE: scc/gui/ae/trigger.py
class TriggerComponent (line 28) | class TriggerComponent(AEComponent, BindingEditor):
method __init__ (line 33) | def __init__(self, app, editor):
method handles (line 42) | def handles(self, mode, action):
method _split (line 50) | def _split(action):
method _strip_trigger (line 113) | def _strip_trigger(action):
method _strip_hipfire (line 123) | def _strip_hipfire(action):
method get_button_title (line 132) | def get_button_title(self):
method set_action (line 136) | def set_action(self, mode, action):
method update (line 168) | def update(self):
method send (line 174) | def send(self):
method on_btFullPressedClear_clicked (line 208) | def on_btFullPressedClear_clicked(self, *a):
method on_btAnalogClear_clicked (line 214) | def on_btAnalogClear_clicked(self, *a):
method on_ui_value_changed (line 220) | def on_ui_value_changed(self, *a):
method on_cbActionType_changed (line 224) | def on_cbActionType_changed(self, *a):
method on_btPartPressed_clicked (line 229) | def on_btPartPressed_clicked(self, *a):
method on_btFullPress_clicked (line 238) | def on_btFullPress_clicked(self, *a):
method on_btAnalog_clicked (line 247) | def on_btAnalog_clicked(self, *a):
method on_action_chosen (line 255) | def on_action_chosen(self, i, action, mark_changed=True):
method on_btFullyPresedClear_clicked (line 266) | def on_btFullyPresedClear_clicked(self, *a):
method on_btPartPresedClear_clicked (line 270) | def on_btPartPresedClear_clicked(self, *a):
method on_btARangeStartClear_clicked (line 274) | def on_btARangeStartClear_clicked(self, *a):
method on_btARangeEndClear_clicked (line 278) | def on_btARangeEndClear_clicked(self, *a):
method on_btTimeOutClear_clicked (line 281) | def on_btTimeOutClear_clicked(self, *a):
FILE: scc/gui/app.py
class App (line 36) | class App(Gtk.Application, UserDataManager, BindingEditor):
method __init__ (line 47) | def __init__(self, gladepath="/usr/share/scc",
method setup_widgets (line 95) | def setup_widgets(self):
method load_gui_config_for_controller (line 151) | def load_gui_config_for_controller(self, controller, first):
method apply_gui_config_buttons (line 187) | def apply_gui_config_buttons(self, config):
method apply_ui_layout (line 248) | def apply_ui_layout(self, layout):
method setup_statusicon (line 277) | def setup_statusicon(self):
method destroy_statusicon (line 286) | def destroy_statusicon(self):
method check (line 291) | def check(self):
method apply_temporary_fix (line 350) | def apply_temporary_fix(self, trash, shell_command, message):
method hilight (line 391) | def hilight(self, button):
method _update_background (line 400) | def _update_background(self):
method hint (line 408) | def hint(self, button):
method show_editor (line 423) | def show_editor(self, id):
method show_context_menu (line 431) | def show_context_menu(self, for_id):
method save_config (line 451) | def save_config(self):
method on_statusicon_clicked (line 457) | def on_statusicon_clicked(self, *a):
method on_window_delete_event (line 462) | def on_window_delete_event(self, *a):
method on_mnuClear_activate (line 472) | def on_mnuClear_activate(self, *a):
method on_mnuCopy_activate (line 480) | def on_mnuCopy_activate(self, *a):
method on_mnuPaste_activate (line 494) | def on_mnuPaste_activate(self, *a):
method on_mnuEditPress_activate (line 508) | def on_mnuEditPress_activate(self, *a):
method on_mnuGlobalSettings_activate (line 518) | def on_mnuGlobalSettings_activate(self, *a):
method on_mnuImport_activate (line 524) | def on_mnuImport_activate(self, *a):
method on_btUndo_clicked (line 534) | def on_btUndo_clicked(self, *a):
method on_btRedo_clicked (line 545) | def on_btRedo_clicked(self, *a):
method on_profiles_loaded (line 556) | def on_profiles_loaded(self, profiles):
method undeletable_dialog (line 561) | def undeletable_dialog(self, dlg, *a):
method on_btNewProfile_clicked (line 566) | def on_btNewProfile_clicked(self, *a):
method on_rbNewProfile_group_changed (line 581) | def on_rbNewProfile_group_changed(self, *a):
method on_profile_modified (line 601) | def on_profile_modified(self, update_ui=True):
method on_profile_loaded (line 615) | def on_profile_loaded(self, profile, giofile):
method on_profile_selected (line 628) | def on_profile_selected(self, ps, name, giofile):
method on_unknown_profile (line 635) | def on_unknown_profile(self, ps, name):
method on_save_clicked (line 641) | def on_save_clicked(self, *a):
method on_switch_to_clicked (line 674) | def on_switch_to_clicked(self, ps, *a):
method on_profile_saved (line 689) | def on_profile_saved(self, giofile, send=True):
method generate_new_name (line 723) | def generate_new_name(self):
method generate_copy_name (line 738) | def generate_copy_name(self, name):
method on_txNewProfile_changed (line 753) | def on_txNewProfile_changed(self, tx):
method on_new_clicked (line 759) | def on_new_clicked(self, ps, name):
method on_action_chosen (line 773) | def on_action_chosen(self, id, action, mark_changed=True):
method on_background_area_hover (line 786) | def on_background_area_hover(self, trash, area):
method on_background_button_press (line 790) | def on_background_button_press(self, trash, event):
method on_mnu_change_background_image (line 797) | def on_mnu_change_background_image(self, mnu, *a):
method on_background_area_click (line 809) | def on_background_area_click(self, trash, area):
method on_c_size_allocate (line 818) | def on_c_size_allocate(self, *a):
method on_ebImage_motion_notify_event (line 842) | def on_ebImage_motion_notify_event(self, box, event):
method on_exiting_n_daemon_killed (line 846) | def on_exiting_n_daemon_killed(self, *a):
method on_mnuExit_activate (line 850) | def on_mnuExit_activate(self, *a):
method on_mnuAbout_activate (line 870) | def on_mnuAbout_activate(self, *a):
method on_daemon_alive (line 875) | def on_daemon_alive(self, *a):
method on_daemon_ccunt_changed (line 888) | def on_daemon_ccunt_changed(self, daemon, count):
method new_profile (line 923) | def new_profile(self, profile, name):
method add_switcher (line 935) | def add_switcher(self, margin_left=24, margin_right=24):
method remove_switcher (line 974) | def remove_switcher(self, s):
method enable_test_mode (line 986) | def enable_test_mode(self):
method enable_osd_mode (line 1008) | def enable_osd_mode(self):
method on_observe_failed (line 1051) | def on_observe_failed(self, error):
method on_daemon_version (line 1055) | def on_daemon_version(self, daemon, version):
method on_daemon_error (line 1076) | def on_daemon_error(self, daemon, error):
method on_daemon_event_observer (line 1108) | def on_daemon_event_observer(self, daemon, c, what, data):
method on_profile_right_clicked (line 1153) | def on_profile_right_clicked(self, ps):
method on_mnuConfigureController_activate (line 1183) | def on_mnuConfigureController_activate(self, *a):
method on_mnuProfileNew_activate (line 1190) | def on_mnuProfileNew_activate(self, *a):
method on_mnuProfileCopy_activate (line 1195) | def on_mnuProfileCopy_activate(self, *a):
method on_mnuProfileDetails_activate (line 1202) | def on_mnuProfileDetails_activate(self, *a):
method on_mnuProfileRename_activate (line 1206) | def on_mnuProfileRename_activate(self, *a):
method on_txRename_changed (line 1217) | def on_txRename_changed(self, tx):
method on_btRenameProfile_clicked (line 1223) | def on_btRenameProfile_clicked(self, *a):
method on_mnuProfileDelete_activate (line 1251) | def on_mnuProfileDelete_activate(self, *a):
method mnuTurnoffController_activate (line 1285) | def mnuTurnoffController_activate(self, *a):
method on_window_key_press_event (line 1291) | def on_window_key_press_event(self, window, event):
method show_error (line 1299) | def show_error(self, message, ribar=None):
method hide_error (line 1314) | def hide_error(self, *a):
method on_daemon_reconfigured (line 1321) | def on_daemon_reconfigured(self, *a):
method on_daemon_dead (line 1328) | def on_daemon_dead(self, *a):
method on_mnuEmulationEnabled_toggled (line 1344) | def on_mnuEmulationEnabled_toggled(self, cb):
method do_startup (line 1359) | def do_startup(self, *a):
method do_local_options (line 1368) | def do_local_options(self, trash, lo):
method do_command_line (line 1374) | def do_command_line(self, cl):
method do_activate (line 1394) | def do_activate(self, *a):
method remove_dot_profile (line 1403) | def remove_dot_profile(self):
method get_current_profile (line 1425) | def get_current_profile(self):
method set_daemon_status (line 1429) | def set_daemon_status(self, status, daemon_runs):
method on_btCloseDetails_clicked (line 1458) | def on_btCloseDetails_clicked(self, *a):
method on_buffProfileDescription_changed (line 1462) | def on_buffProfileDescription_changed(self, buffer, *a):
method on_cbProfileIsTemplate_toggled (line 1468) | def on_cbProfileIsTemplate_toggled(self, widget, *a):
method setup_commandline (line 1474) | def setup_commandline(self):
method save_profile_selection (line 1495) | def save_profile_selection(self, path):
method load_profile_selection (line 1507) | def load_profile_selection(self):
method get_release (line 1516) | def get_release(n=3):
method release_notes_visible (line 1526) | def release_notes_visible(self):
method check_release_notes (line 1533) | def check_release_notes(self):
method on_got_release_notes (line 1570) | def on_got_release_notes(self, data):
method on_new_release_dismissed (line 1602) | def on_new_release_dismissed(self, *a):
method on_cbNewRelease_toggled (line 1607) | def on_cbNewRelease_toggled(self, cb):
method on_drag_data_received (line 1612) | def on_drag_data_received(self, widget, context, x, y, data, info, time):
method convert_old_profiles (line 1666) | def convert_old_profiles(self):
class UndoRedo (line 1701) | class UndoRedo(object):
method __init__ (line 1703) | def __init__(self, id, before, after):
FILE: scc/gui/area_to_action.py
function action_to_area (line 104) | def action_to_area(action):
FILE: scc/gui/binding_editor.py
class BindingEditor (line 27) | class BindingEditor(object):
method __init__ (line 29) | def __init__(self, app):
method create_binding_buttons (line 34) | def create_binding_buttons(self, use_icons=True, enable_press=True):
method on_action_chosen (line 65) | def on_action_chosen(self, id, action, mark_changed=True):
method set_action (line 73) | def set_action(self, profile, id, action):
method get_action (line 118) | def get_action(self, profile, id):
method choose_editor (line 152) | def choose_editor(self, action, title, id=None):
method hilight (line 180) | def hilight(self, button):
method show_editor (line 185) | def show_editor(self, id):
FILE: scc/gui/chooser.py
class Chooser (line 23) | class Chooser(Editor):
method __init__ (line 29) | def __init__(self, app):
method setup_image (line 37) | def setup_image(self, grid_columns=0):
method set_active_area (line 55) | def set_active_area(self, a):
method on_background_area_hover (line 64) | def on_background_area_hover(self, background, area):
method on_background_area_click (line 77) | def on_background_area_click(self, trash, area):
method area_action_selected (line 92) | def area_action_selected(self, area, action):
method hide_axes (line 96) | def hide_axes(self):
method hide_mouse (line 101) | def hide_mouse(self):
FILE: scc/gui/controller_image.py
class ControllerImage (line 19) | class ControllerImage(SVGWidget):
method __init__ (line 43) | def __init__(self, app, config=None):
method _make_controller_image_path (line 53) | def _make_controller_image_path(self, img):
method get_config (line 58) | def get_config(self):
method _ensure_config (line 65) | def _ensure_config(self, data, controller):
method get_names (line 78) | def get_names(dict_or_tuple):
method use_config (line 91) | def use_config(self, config, backup=None, controller=None):
method override_background (line 106) | def override_background(self, filename):
method override_buttons (line 119) | def override_buttons(self, filename):
method undo_override (line 133) | def undo_override(self):
method get_button_groups (line 139) | def get_button_groups(self):
method _get_default_images (line 148) | def _get_default_images(self):
method _fill_button_images (line 152) | def _fill_button_images(self, buttons):
FILE: scc/gui/controller_settings.py
class ControllerSettings (line 18) | class ControllerSettings(Editor, UserDataManager, ComboSetter):
method __init__ (line 21) | def __init__(self, app, controller, profile_switcher=None):
method load_icons (line 34) | def load_icons(self):
method on_icons_loaded (line 39) | def on_icons_loaded(self, icons):
method on_Dialog_destroy (line 63) | def on_Dialog_destroy(self, *a):
method on_btClearControlWith_clicked (line 69) | def on_btClearControlWith_clicked(self, *a):
method on_btClearConfirmWith_clicked (line 73) | def on_btClearConfirmWith_clicked(self, *a):
method on_btClearCancelWith_clicked (line 77) | def on_btClearCancelWith_clicked(self, *a):
method on_exTouchpadRotation_activate (line 81) | def on_exTouchpadRotation_activate(self, ex, *a):
method on_exMenuButtons_activate (line 86) | def on_exMenuButtons_activate(self, ex, *a):
method on_btClearLeftRotation_clicked (line 91) | def on_btClearLeftRotation_clicked(self, *a):
method on_btClearRightRotation_clicked (line 96) | def on_btClearRightRotation_clicked(self, *a):
method on_rotation_value_changed (line 101) | def on_rotation_value_changed(self, *a):
method load_settings (line 106) | def load_settings(self):
method save_config (line 134) | def save_config(self, *a):
method schedule_save_config (line 174) | def schedule_save_config(self, *a):
method on_sclIdleTimeout_format_value (line 188) | def on_sclIdleTimeout_format_value(self, scale, value):
method on_sclLED_value_changed (line 196) | def on_sclLED_value_changed(self, scale, *a):
method on_sclIdleTimeout_value_changed (line 208) | def on_sclIdleTimeout_value_changed(self, scale, *a):
FILE: scc/gui/controller_widget.py
class ControllerWidget (line 36) | class ControllerWidget:
method __init__ (line 39) | def __init__(self, app, id, use_icon, widget):
method get_image (line 56) | def get_image(self):
method update (line 60) | def update(self):
method on_click (line 64) | def on_click(self, *a):
method on_button_release (line 67) | def on_button_release(self, bt, event):
method on_cursor_enter (line 73) | def on_cursor_enter(self, *a):
method on_cursor_leave (line 77) | def on_cursor_leave(self, *a):
class ControllerButton (line 81) | class ControllerButton(ControllerWidget):
method __init__ (line 84) | def __init__(self, app, name, use_icon, widget):
method update (line 103) | def update(self):
class ControllerStick (line 117) | class ControllerStick(ControllerWidget):
method __init__ (line 120) | def __init__(self, app, id, use_icon, enable_press, widget):
method on_cursor_enter (line 150) | def on_cursor_enter(self, *a):
method on_click (line 154) | def on_click(self, *a):
method on_cursor_motion (line 161) | def on_cursor_motion(self, trash, event):
method _set_label (line 183) | def _set_label(self, action):
method update (line 187) | def update(self):
method _update_pressed (line 199) | def _update_pressed(self, action):
class ControllerTrigger (line 215) | class ControllerTrigger(ControllerButton):
method update (line 218) | def update(self):
class ControllerPad (line 227) | class ControllerPad(ControllerStick):
method __init__ (line 231) | def __init__(self, app, name, use_icon, enable_press, widget):
method update (line 239) | def update(self):
class ControllerGyro (line 255) | class ControllerGyro(ControllerWidget):
method __init__ (line 258) | def __init__(self, app, name, use_icon, widget):
method on_click (line 277) | def on_click(self, *a):
method _set_label (line 281) | def _set_label(self, action):
method update (line 294) | def update(self):
FILE: scc/gui/creg/data.py
class AxisData (line 16) | class AxisData(object):
method __init__ (line 22) | def __init__(self, name, xy, min=STICK_PAD_MAX, max=STICK_PAD_MIN):
method reset (line 35) | def reset(self):
method __repr__ (line 43) | def __repr__(self):
method set_position (line 47) | def set_position(self, value):
class DPadEmuData (line 72) | class DPadEmuData(object):
method __init__ (line 81) | def __init__(self, axis_data, positive):
FILE: scc/gui/creg/dialog.py
class ControllerRegistration (line 32) | class ControllerRegistration(Editor):
method __init__ (line 44) | def __init__(self, app):
method setup_widgets (line 65) | def setup_widgets(self):
method does_he_looks_like_a_gamepad (line 81) | def does_he_looks_like_a_gamepad(dev):
method load_sdl_mappings (line 109) | def load_sdl_mappings(self):
method generate_mappings (line 197) | def generate_mappings(self):
method generate_unassigned (line 214) | def generate_unassigned(self):
method generate_raw_data (line 251) | def generate_raw_data(self):
method load_buttons (line 307) | def load_buttons(self):
method save_registration (line 322) | def save_registration(self):
method on_buffRawData_changed (line 347) | def on_buffRawData_changed(self, buffRawData, *a):
method on_ibHIDWarning_response (line 360) | def on_ibHIDWarning_response(self, *a):
method on_btNext_clicked (line 365) | def on_btNext_clicked(self, *a):
method on_btBack_clicked (line 411) | def on_btBack_clicked(self, *a):
method on_cbDS4_toggled (line 434) | def on_cbDS4_toggled(self, button):
method prepare_registration (line 440) | def prepare_registration(self, dev):
method on_registration_ready (line 479) | def on_registration_ready(self, tester):
method on_device_open_failed (line 511) | def on_device_open_failed(self, *a):
method kill_tester (line 530) | def kill_tester(self, *a):
method set_hid_enabled (line 538) | def set_hid_enabled(self, enabled):
method on_cbAccessMode_changed (line 547) | def on_cbAccessMode_changed(self, cb):
method cbInvert_toggled_cb (line 570) | def cbInvert_toggled_cb(self, cb, *a):
method on_tester_button (line 575) | def on_tester_button(self, tester, keycode, pressed):
method on_tester_axis (line 602) | def on_tester_axis(self, tester, number, value):
method hilight_axis (line 612) | def hilight_axis(self, axis, value):
method hilight (line 666) | def hilight(self, what, color=None):
method unhilight (line 671) | def unhilight(self, what):
method on_exAdditionalOptions_activate (line 679) | def on_exAdditionalOptions_activate(self, ex):
method on_exRawData_activate (line 684) | def on_exRawData_activate(self, ex):
method on_area_hover (line 692) | def on_area_hover(self, trash, what):
method on_area_leave (line 698) | def on_area_leave(self, *a):
method on_area_click (line 704) | def on_area_click(self, trash, what):
method on_mnuStickPress_activate (line 721) | def on_mnuStickPress_activate(self, *a):
method on_mnuStickmove_activate (line 727) | def on_mnuStickmove_activate(self, *a):
method on_btCancelInput_clicked (line 732) | def on_btCancelInput_clicked(self, *a):
method refresh_devices (line 737) | def refresh_devices(self, *a):
method refresh_controller_image (line 756) | def refresh_controller_image(self, *a):
FILE: scc/gui/creg/grabs.py
class InputGrabber (line 20) | class InputGrabber(object):
method __init__ (line 26) | def __init__(self, parent, what, text=_("Press a button...")):
method set_message (line 34) | def set_message(self, text):
method cancel (line 38) | def cancel(self):
method on_button (line 43) | def on_button(self, keycode, pressed):
method set_mapping (line 48) | def set_mapping(self, keycode, what):
method on_axis (line 68) | def on_axis(self, number, value):
class TriggerGrabber (line 72) | class TriggerGrabber(InputGrabber):
method __init__ (line 77) | def __init__(self, parent, what, text=_("Pull a trigger...")):
method on_button (line 83) | def on_button(self, keycode, pressed):
method on_axis (line 90) | def on_axis(self, number, value):
method axis_change (line 112) | def axis_change(self, number, value, change):
class StickGrabber (line 121) | class StickGrabber(TriggerGrabber):
method __init__ (line 127) | def __init__(self, parent, what):
method on_button (line 134) | def on_button(self, keycode, pressed):
method on_axis (line 167) | def on_axis(self, number, value):
FILE: scc/gui/creg/tester.py
class Tester (line 14) | class Tester(GObject.GObject):
method __init__ (line 37) | def __init__(self, driver, device_id):
method __del__ (line 48) | def __del__(self):
method start (line 53) | def start(self):
method stop (line 62) | def stop(self):
method _on_finished (line 67) | def _on_finished(self, subprocess, result):
method _on_read (line 78) | def _on_read(self, stream, result):
method _on_line (line 100) | def _on_line(self, line):
FILE: scc/gui/daemon_manager.py
class DaemonManager (line 23) | class DaemonManager(GObject.GObject):
method __init__ (line 77) | def __init__(self):
method get_controllers (line 89) | def get_controllers(self):
method get_controller (line 97) | def get_controller(self, controller_id, type=None):
method has_controller (line 113) | def has_controller(self):
method _connect (line 120) | def _connect(self):
method _on_daemon_died (line 128) | def _on_daemon_died(self, *a):
method _on_connected (line 146) | def _on_connected(self, sc, results):
method _on_read_data (line 161) | def _on_read_data(self, sc, results):
method is_alive (line 250) | def is_alive(self):
method request (line 255) | def request(self, message, success_cb, error_cb):
method nocallback (line 270) | def nocallback(*a):
method set_profile (line 275) | def set_profile(self, filename):
method reconfigure (line 281) | def reconfigure(self):
method rescan (line 287) | def rescan(self):
method stop (line 293) | def stop(self):
method start (line 299) | def start(self, mode="start"):
method restart (line 312) | def restart(self):
method _check_connected (line 319) | def _check_connected(self):
class ControllerManager (line 326) | class ControllerManager(GObject.GObject):
method __init__ (line 354) | def __init__(self, daemon_manager, controller_id, controller_type):
method __repr__ (line 366) | def __repr__(self):
method _send_id (line 370) | def _send_id(self):
method is_connected (line 379) | def is_connected(self):
method get_type (line 387) | def get_type(self):
method set_type (line 395) | def set_type(self, type):
method get_flags (line 402) | def get_flags(self):
method get_id (line 411) | def get_id(self):
method get_gui_config_file (line 416) | def get_gui_config_file(self):
method load_gui_config (line 429) | def load_gui_config(self, default_path):
method get_button_icon (line 446) | def get_button_icon(config, button, prefer_bw=False):
method get_button_name (line 459) | def get_button_name(config, button):
method get_profile (line 477) | def get_profile(self):
method lock (line 482) | def lock(self, success_cb, error_cb, *what_to_lock):
method set_led_level (line 495) | def set_led_level(self, value):
method set_profile (line 504) | def set_profile(self, filename):
method turnoff (line 511) | def turnoff(self):
method feedback (line 518) | def feedback(self, position, amplitude):
method observe (line 525) | def observe(self, success_cb, error_cb, *what_to_lock):
method replace (line 538) | def replace(self, success_cb, error_cb, what, action):
method unlock_all (line 550) | def unlock_all(self):
FILE: scc/gui/dwsnc.py
function fix_label_missing_set_XYalign_methods (line 12) | def fix_label_missing_set_XYalign_methods():
function child_get_property (line 21) | def child_get_property(parent, child, propname):
function headerbar (line 32) | def headerbar(bar):
function _headerbar (line 57) | def _headerbar(bar):
FILE: scc/gui/editor.py
class ComboSetter (line 23) | class ComboSetter(object):
method set_cb (line 25) | def set_cb(self, cb, key, keyindex=0):
class Editor (line 43) | class Editor(ComboSetter):
method __init__ (line 48) | def __init__(self):
method on_window_key_press_event (line 52) | def on_window_key_press_event(self, trash, event):
method setup_widgets (line 58) | def setup_widgets(self):
method install_error_css (line 66) | def install_error_css():
method hide_dont_destroy (line 76) | def hide_dont_destroy(self, w, *a):
method set_title (line 85) | def set_title(self, title):
method close (line 90) | def close(self, *a):
method get_transient_for (line 94) | def get_transient_for(self):
method show (line 101) | def show(self, transient_for):
method add_widget (line 109) | def add_widget(self, label, widget):
method remove_added_widget (line 130) | def remove_added_widget(self):
method send_added_widget (line 141) | def send_added_widget(self, target):
FILE: scc/gui/gdk_to_key.py
function keyevent_to_key (line 230) | def keyevent_to_key(event):
FILE: scc/gui/gestures.py
class GestureDraw (line 17) | class GestureDraw(Gtk.DrawingArea):
method __init__ (line 21) | def __init__(self, size, detector):
method set_colors (line 31) | def set_colors(self, background="000000FF", line="FF00FFFF",
method add (line 42) | def add(self, x, y):
method draw (line 50) | def draw(self, another_self, cr):
FILE: scc/gui/global_settings.py
class GlobalSettings (line 36) | class GlobalSettings(Editor, UserDataManager, ComboSetter):
method __init__ (line 60) | def __init__(self, app):
method _get_gamepad_icon (line 80) | def _get_gamepad_icon(self, drv):
method on_daemon_reconfigured (line 93) | def on_daemon_reconfigured(self, *a):
method on_Dialog_destroy (line 100) | def on_Dialog_destroy(self, *a):
method load_settings (line 107) | def load_settings(self):
method load_drivers (line 147) | def load_drivers(self):
method _load_color (line 154) | def _load_color(self, w, dct, key):
method load_colors (line 163) | def load_colors(self):
method load_autoswitch (line 177) | def load_autoswitch(self):
method load_osk (line 196) | def load_osk(self):
method add_custom (line 223) | def add_custom(self, cb, key):
method _load_osk_profile (line 233) | def _load_osk_profile(self):
method _save_osk_profile (line 243) | def _save_osk_profile(self, profile):
method on_cbStickAction_changed (line 253) | def on_cbStickAction_changed(self, cb):
method on_cbTriggersAction_changed (line 261) | def on_cbTriggersAction_changed(self, cb):
method on_osd_color_set (line 271) | def on_osd_color_set(self, *a):
method schedule_save_config (line 294) | def schedule_save_config(self):
method save_config (line 308) | def save_config(self):
method on_cbShowOSD_toggled (line 345) | def on_cbShowOSD_toggled(self, cb):
method on_btRestartEmulation_clicked (line 350) | def on_btRestartEmulation_clicked(self, *a):
method on_restarting_checkbox_toggled (line 357) | def on_restarting_checkbox_toggled(self, *a):
method _needs_restart (line 363) | def _needs_restart(self):
method on_cbEnableDriver_toggled (line 373) | def on_cbEnableDriver_toggled(self, cb):
method on_random_checkbox_toggled (line 407) | def on_random_checkbox_toggled(self, *a):
method on_butEditKeyboardBindings_clicked (line 412) | def on_butEditKeyboardBindings_clicked(self, *a):
method btEdit_clicked_cb (line 417) | def btEdit_clicked_cb(self, *a):
method on_btSave_clicked (line 475) | def on_btSave_clicked(self, *a):
method on_btAdd_clicked (line 523) | def on_btAdd_clicked(self, *a):
method on_btRemove_clicked (line 536) | def on_btRemove_clicked(self, *a):
method on_tvItems_cursor_changed (line 546) | def on_tvItems_cursor_changed(self, *a):
method on_profiles_loaded (line 560) | def on_profiles_loaded(self, profiles):
method on_ConditionEditor_key_press_event (line 580) | def on_ConditionEditor_key_press_event(self, w, event):
method on_cbExactTitle_toggled (line 586) | def on_cbExactTitle_toggled(self, tg):
method on_cbRegExp_toggled (line 596) | def on_cbRegExp_toggled(self, tg):
method on_btClearSensX_clicked (line 606) | def on_btClearSensX_clicked(self, *a):
method on_btClearSensY_clicked (line 610) | def on_btClearSensY_clicked(self, *a):
method on_sens_value_changed (line 614) | def on_sens_value_changed(self, *a):
method on_entTitle_changed (line 629) | def on_entTitle_changed(self, ent):
method on_cbOSDColorPreset_changed (line 648) | def on_cbOSDColorPreset_changed(self, cb):
method on_cbOSDStyle_changed (line 666) | def on_cbOSDStyle_changed(self, cb):
method _make_mi_instance (line 687) | def _make_mi_instance(index):
method on_cbMI_toggled (line 702) | def on_cbMI_toggled(self, widget):
method load_cbMIs (line 766) | def load_cbMIs(self):
method on_btAddController_clicked (line 798) | def on_btAddController_clicked(self, *a):
method on_btRemoveController_clicked (line 805) | def on_btRemoveController_clicked(self, *a):
method load_controllers (line 827) | def load_controllers(self, *a):
FILE: scc/gui/icon_chooser.py
class IconChooser (line 19) | class IconChooser(Editor, UserDataManager):
method __init__ (line 22) | def __init__(self, app, callback):
method setup_widgets (line 29) | def setup_widgets(self):
method on_btUserFolder_activate_link (line 47) | def on_btUserFolder_activate_link(self, *a):
method on_btOk_clicked (line 56) | def on_btOk_clicked(self, *a):
method get_selected (line 63) | def get_selected(self):
method on_entName_changed (line 81) | def on_entName_changed(self, *a): pass
method on_tvItems_cursor_changed (line 84) | def on_tvItems_cursor_changed(self, view):
method on_tvCategories_cursor_changed (line 109) | def on_tvCategories_cursor_changed(self, view):
method color_icon_exists (line 116) | def color_icon_exists(model, search_name):
method on_menuicons_loaded (line 123) | def on_menuicons_loaded(self, icons):
method find_license (line 171) | def find_license(path, name):
class CellRendererMenuIcon (line 183) | class CellRendererMenuIcon(Gtk.CellRenderer):
method __init__ (line 187) | def __init__(self, size):
method do_get_size (line 191) | def do_get_size(self, *a):
method do_render (line 195) | def do_render(self, cr, treeview, background_area, cell_area, flags):
FILE: scc/gui/importexport/dialog.py
class Dialog (line 17) | class Dialog(Editor, ComboSetter, Export, ImportVdf, ImportSccprofile):
method __init__ (line 20) | def __init__(self, app):
method determine_type (line 32) | def determine_type(filename):
method check_name (line 82) | def check_name(name):
method import_file (line 94) | def import_file(self, filename, filetype = None):
method next_page (line 110) | def next_page(self, page):
method _page_selected (line 119) | def _page_selected(self, page):
method enable_next (line 128) | def enable_next(self, enabled=True, callback=None):
method on_btNext_clicked (line 146) | def on_btNext_clicked(self, *a):
method on_btBack_clicked (line 152) | def on_btBack_clicked(self, *a):
method on_btExport_clicked (line 165) | def on_btExport_clicked(self, *a):
method on_btImportVdf_clicked (line 170) | def on_btImportVdf_clicked(self, *a):
FILE: scc/gui/importexport/export.py
class Export (line 17) | class Export(UserDataManager):
method __init__ (line 22) | def __init__(self):
method on_grSelectProfile_activated (line 26) | def on_grSelectProfile_activated(self, *a):
method on_profile_selected (line 34) | def on_profile_selected(self, *a):
method on_profiles_loaded (line 41) | def on_profiles_loaded(self, lst):
method _add_refereced_profile (line 62) | def _add_refereced_profile(self, model, giofile, used):
method _add_refereced_menu (line 90) | def _add_refereced_menu(self, model, menu_id, used):
method _parse_action (line 121) | def _parse_action(self, model, action, used):
method on_tvProfiles_cursor_changed (line 142) | def on_tvProfiles_cursor_changed(self, *a):
method _needs_package (line 173) | def _needs_package(self):
method on_btSelectAll_clicked (line 183) | def on_btSelectAll_clicked(self, *a):
method on_crPackageCheckbox_toggled (line 191) | def on_crPackageCheckbox_toggled(self, cr, path):
method on_btSaveAs_clicked (line 197) | def on_btSaveAs_clicked(self, *a):
method _export (line 233) | def _export(self, giofile, target_filename):
method _export_package (line 251) | def _export_package(self, giofile, target_filename):
FILE: scc/gui/importexport/import_sccprofile.py
class ImportSccprofile (line 17) | class ImportSccprofile(object):
method on_btImportSccprofile_clicked (line 19) | def on_btImportSccprofile_clicked(self, *a):
method error (line 37) | def error(self, text):
method import_scc (line 48) | def import_scc(self, filename):
method import_scc_tar (line 75) | def import_scc_tar(self, filename):
method check_shell_commands (line 114) | def check_shell_commands(self):
method on_crShellCommandChecked_toggled (line 145) | def on_crShellCommandChecked_toggled(self, cr, path):
method shell_import_confirmed (line 157) | def shell_import_confirmed(self):
method on_txName2_changed (line 172) | def on_txName2_changed(self, *a):
method on_cbImportPackageAdvanced_toggled (line 206) | def on_cbImportPackageAdvanced_toggled(self, *a):
method on_crIPKGEnabled_toggled (line 212) | def on_crIPKGEnabled_toggled(self, renderer, path):
method on_crIPKGImportAs_edited (line 222) | def on_crIPKGImportAs_edited(self, renderer, path, new_name):
method on_scc_import_confirmed (line 233) | def on_scc_import_confirmed(self, *a):
FILE: scc/gui/importexport/import_vdf.py
class ImportVdf (line 22) | class ImportVdf(object):
method __init__ (line 26) | def __init__(self):
method on_grVdfImport_activated (line 37) | def on_grVdfImport_activated(self, *a):
method _load_profiles (line 46) | def _load_profiles(self):
method _parse_profile_list (line 68) | def _parse_profile_list(self, i, filename, userid):
method _check_for_app_manifest (line 106) | def _check_for_app_manifest(self, gameid):
method _load_game_names (line 118) | def _load_game_names(self):
method _find_legacy_bin (line 156) | def _find_legacy_bin(path):
method _load_profile_names (line 170) | def _load_profile_names(self):
method _load_finished (line 212) | def _load_finished(self):
method _find_steamapps (line 224) | def _find_steamapps(self):
method _set_game_name (line 238) | def _set_game_name(self, index, name):
method _set_profile_name (line 242) | def _set_profile_name(self, index, name, filename):
method fill_list (line 247) | def fill_list(self, items):
method on_tvVdfProfiles_cursor_changed (line 260) | def on_tvVdfProfiles_cursor_changed(self, *a):
method gen_aset_name (line 275) | def gen_aset_name(base_name, set_name):
method on_txName_changed (line 282) | def on_txName_changed(self, *a):
method on_preload_finished (line 309) | def on_preload_finished(self, callback, *data):
method set_vdf_file (line 316) | def set_vdf_file(self, filename):
method on_btDump_clicked (line 325) | def on_btDump_clicked(self, *a):
method import_vdf (line 345) | def import_vdf(self, filename=None):
method vdf_import_confirmed (line 422) | def vdf_import_confirmed(self, *a):
FILE: scc/gui/key_grabber.py
function merge_modifiers (line 30) | def merge_modifiers(mods):
class KeyGrabber (line 35) | class KeyGrabber(object):
method __new__ (line 39) | def __new__(cls, *a):
method __init__ (line 45) | def __init__(self, app):
method grab (line 51) | def grab(self, modal_for, action, callback):
method setup_widgets (line 66) | def setup_widgets(self):
method on_KeyGrab_destroy (line 73) | def on_KeyGrab_destroy(self, *a):
method on_keyGrab_key_press_event (line 78) | def on_keyGrab_key_press_event(self, trash, event):
method on_keyGrab_key_release_event (line 104) | def on_keyGrab_key_release_event(self, trash, event):
method on_tgkey_toggled (line 132) | def on_tgkey_toggled(self, obj, *a):
FILE: scc/gui/macro_editor.py
class MacroEditor (line 24) | class MacroEditor(Editor):
method __init__ (line 27) | def __init__(self, app, callback):
method update_action_field (line 38) | def update_action_field(self):
method _make_action (line 63) | def _make_action(self):
method _add_action (line 90) | def _add_action(self, action):
method on_moveb_clicked (line 194) | def on_moveb_clicked(self, trash, direction, action_data):
method on_clearb_clicked (line 211) | def on_clearb_clicked(self, trash, action_data):
method on_cbMacroType_changed (line 220) | def on_cbMacroType_changed(self, *a):
method on_buttonaction_type_change (line 224) | def on_buttonaction_type_change(self, cb, i, action_data):
method _clear_grid (line 238) | def _clear_grid(self):
method _refill_grid (line 245) | def _refill_grid(self, new_actions):
method on_change_delay (line 253) | def on_change_delay(self, scale, trash, value, action_data):
method on_actionb_clicked (line 267) | def on_actionb_clicked(self, button, i, action_data):
method on_btAddAction_clicked (line 285) | def on_btAddAction_clicked(self, *a):
method on_btAddDelay_clicked (line 290) | def on_btAddDelay_clicked(self, *a):
method on_btClear_clicked (line 295) | def on_btClear_clicked(self, *a):
method on_btCustomActionEditor_clicked (line 303) | def on_btCustomActionEditor_clicked(self, *a):
method on_btOK_clicked (line 317) | def on_btOK_clicked(self, *a):
method add_widget (line 325) | def add_widget(self, label, widget):
method on_Dialog_destroy (line 340) | def on_Dialog_destroy(self, *a):
method allow_first_page (line 346) | def allow_first_page(self):
method set_input (line 351) | def set_input(self, id, action, mode=Action.AC_BUTTON):
method hide_name (line 371) | def hide_name(self):
FILE: scc/gui/menu_editor.py
class MenuEditor (line 29) | class MenuEditor(Editor):
method __init__ (line 38) | def __init__(self, app, callback):
method setup_widgets (line 49) | def setup_widgets(self):
method allow_menus (line 63) | def allow_menus(self, allow_globals, allow_in_profile):
method on_action_chosen (line 81) | def on_action_chosen(self, id, a, mark_changed=True):
method on_btSave_clicked (line 106) | def on_btSave_clicked(self, *a):
method on_tvItems_cursor_changed (line 116) | def on_tvItems_cursor_changed(self, *a):
method btEdit_clicked_cb (line 138) | def btEdit_clicked_cb(self, *a):
method _add_menuitem (line 183) | def _add_menuitem(self, item):
method on_btAddItem_clicked (line 197) | def on_btAddItem_clicked(self, *a):
method on_mnuAddSeparator_clicked (line 204) | def on_mnuAddSeparator_clicked(self, *a):
method on_mnuAddSubmenu_clicked (line 209) | def on_mnuAddSubmenu_clicked(self, *a):
method on_mnuAddProfList_clicked (line 214) | def on_mnuAddProfList_clicked(self, *a):
method on_mnuAddRecentList_clicked (line 219) | def on_mnuAddRecentList_clicked(self, *a):
method on_mnuAddGamesList_activate (line 223) | def on_mnuAddGamesList_activate(self, *a):
method on_btRemoveItem_clicked (line 228) | def on_btRemoveItem_clicked(self, *a):
method on_entName_changed (line 237) | def on_entName_changed(self, *a):
method _good_id (line 261) | def _good_id(self, *a):
method _bad_id_no_id (line 265) | def _bad_id_no_id(self, *a):
method _bad_id_duplicate (line 268) | def _bad_id_duplicate(self, *a):
method _bad_id_chars (line 273) | def _bad_id_chars(self, *a):
method set_new_menu (line 279) | def set_new_menu(self):
method menu_is_global (line 294) | def menu_is_global(id):
method set_menu (line 298) | def set_menu(self, id):
method on_Dialog_delete_event (line 330) | def on_Dialog_delete_event(self, *a):
method close (line 340) | def close(self, *a):
method _load_items_from_file (line 345) | def _load_items_from_file(self, id):
method _load_items_from_profile (line 354) | def _load_items_from_profile(self, id):
method _remove_original (line 362) | def _remove_original(self):
method _generate_menudata (line 378) | def _generate_menudata(self):
method _save_to_profile (line 391) | def _save_to_profile(self, id):
method _save_to_file (line 403) | def _save_to_file(self, id):
method setup_menu_icon (line 417) | def setup_menu_icon(self, editor):
method update_menu_icon (line 422) | def update_menu_icon(self):
method on_icon_choosen (line 439) | def on_icon_choosen(self, name):
method on_btChangeItemIcon_clicked (line 444) | def on_btChangeItemIcon_clicked(self, *a):
method on_btClearItemIcon_clicked (line 449) | def on_btClearItemIcon_clicked(self, *a):
FILE: scc/gui/modeshift_editor.py
class ModeshiftEditor (line 27) | class ModeshiftEditor(Editor):
method __init__ (line 56) | def __init__(self, app, callback):
method setup_widgets (line 69) | def setup_widgets(self):
method on_Dialog_destroy (line 89) | def on_Dialog_destroy(self, *a):
method _fill_button_chooser (line 93) | def _fill_button_chooser(self, *a):
method _add_action (line 117) | def _add_action(self, index, what, action):
method on_clearb_clicked (line 173) | def on_clearb_clicked(self, trash, index, button):
method _choose_editor (line 215) | def _choose_editor(self, action, cb):
method on_actionb_clicked (line 231) | def on_actionb_clicked(self, trash, index, clicked_button):
method on_ntbMore_switch_page (line 245) | def on_ntbMore_switch_page(self, ntb, box, index):
method on_nomodbt_clicked (line 252) | def on_nomodbt_clicked(self, button, *a):
method on_nomodclear_clicked (line 264) | def on_nomodclear_clicked(self, button, *a):
method on_btAddAction_clicked (line 270) | def on_btAddAction_clicked(self, *a):
method on_sclSoftLevel_format_value (line 282) | def on_sclSoftLevel_format_value(self, scale, value):
method on_btClear_clicked (line 286) | def on_btClear_clicked(self, *a):
method on_btCustomActionEditor_clicked (line 294) | def on_btCustomActionEditor_clicked(self, *a):
method on_cbHoldFeedback_toggled (line 308) | def on_cbHoldFeedback_toggled(self, cb, *a):
method on_btOK_clicked (line 313) | def on_btOK_clicked(self, *a):
method _make_action (line 320) | def _make_action(self):
method _save_modemod (line 343) | def _save_modemod(self, index):
method _load_modemod (line 364) | def _load_modemod(self, index, action):
method _set_nomod_button (line 369) | def _set_nomod_button(self, index, action):
method allow_first_page (line 379) | def allow_first_page(self):
method set_input (line 384) | def set_input(self, id, action, mode=None):
FILE: scc/gui/osd_mode.py
class OSDModeMapper (line 24) | class OSDModeMapper(SlaveMapper):
method __init__ (line 25) | def __init__(self, app, profile):
method on_sa_restart (line 31) | def on_sa_restart(self, *a):
method set_target_window (line 36) | def set_target_window(self, w):
method create_keyboard (line 40) | def create_keyboard(self, name):
method create_mouse (line 44) | def create_mouse(self, name):
class OSDModeKeyboard (line 48) | class OSDModeKeyboard(object):
method __init__ (line 51) | def __init__(self, mapper):
method pressEvent (line 60) | def pressEvent(self, keys):
method releaseEvent (line 71) | def releaseEvent(self, keys=[]):
class OSDModeMouse (line 82) | class OSDModeMouse(object):
method __init__ (line 85) | def __init__(self, mapper):
method synEvent (line 95) | def synEvent(self, *a):
method keyEvent (line 99) | def keyEvent(self, key, val):
class OSDModeMappings (line 130) | class OSDModeMappings(object):
method __init__ (line 143) | def __init__(self, app, mapper, window):
method set_controller (line 155) | def set_controller(self, c):
method on_main_window_focus_in_event (line 163) | def on_main_window_focus_in_event(self, *a):
method on_main_window_focus_out_event (line 170) | def on_main_window_focus_out_event(self, *a):
method get_target_position (line 177) | def get_target_position(self):
method show (line 186) | def show(self):
method move_around (line 191) | def move_around(self, *a):
function direction (line 204) | def direction(x):
FILE: scc/gui/osk_binding_editor.py
class OSKBindingEditor (line 26) | class OSKBindingEditor(Editor, BindingEditor):
method __init__ (line 29) | def __init__(self, app):
method setup_widgets (line 39) | def setup_widgets(self):
method show_editor (line 44) | def show_editor(self, id):
method on_action_chosen (line 62) | def on_action_chosen(self, id, action, mark_changed=True):
method save_profile (line 67) | def save_profile(self, *a):
FILE: scc/gui/parser.py
class InvalidAction (line 9) | class InvalidAction(Action):
method __init__ (line 10) | def __init__(self, string, error):
method __str__ (line 16) | def __str__(self):
method to_string (line 22) | def to_string(self, *a):
method describe (line 26) | def describe(self, *a):
class GuiActionParser (line 30) | class GuiActionParser(ActionParser):
method restart (line 36) | def restart(self, string):
method parse (line 41) | def parse(self):
FILE: scc/gui/profile_switcher.py
class ProfileSwitcher (line 22) | class ProfileSwitcher(Gtk.EventBox, UserDataManager):
method __init__ (line 53) | def __init__(self, imagepath, config):
method setup_widgets (line 69) | def setup_widgets(self):
method set_profile (line 100) | def set_profile(self, name, create=False):
method set_allow_new (line 137) | def set_allow_new(self, allow):
method set_allow_switch (line 145) | def set_allow_switch(self, allow):
method set_profile_list (line 153) | def set_profile_list(self, lst):
method get_profile_list (line 182) | def get_profile_list(self):
method get_profile_name (line 187) | def get_profile_name(self):
method refresh_profile_path (line 192) | def refresh_profile_path(self, name):
method on_combo_changed (line 228) | def on_combo_changed(self, cb):
method on_button_press (line 256) | def on_button_press(self, trash, event):
method on_savebutton_clicked (line 261) | def on_savebutton_clicked(self, *a):
method on_switch_to_clicked (line 265) | def on_switch_to_clicked(self, *a):
method on_daemon_dead (line 269) | def on_daemon_dead(self, *a):
method on_profile_changed (line 274) | def on_profile_changed(self, c, profile):
method set_profile_modified (line 286) | def set_profile_modified(self, has_changes, is_template=False):
method set_switch_to_enabled (line 320) | def set_switch_to_enabled(self, enabled):
method get_file (line 339) | def get_file(self):
method set_controller (line 344) | def set_controller(self, c):
method get_controller (line 358) | def get_controller(self):
method update_icon (line 363) | def update_icon(self):
class ButtonInRevealer (line 409) | class ButtonInRevealer(Gtk.Revealer):
method __init__ (line 411) | def __init__(self, button_name, tooltip, callback):
FILE: scc/gui/ribar.py
class RIBar (line 12) | class RIBar(Gtk.Revealer):
method __init__ (line 29) | def __init__(self, label, message_type=Gtk.MessageType.INFO,
method _cb_close (line 79) | def _cb_close(self, ib):
method _cb_response (line 82) | def _cb_response(self, ib, response_id):
method disable_close_button (line 85) | def disable_close_button(self):
method add_widget (line 89) | def add_widget(self, widget, expand=False, fill=True):
method add_button (line 93) | def add_button(self, button, response_id):
method get_label (line 97) | def get_label(self):
method close_on_close (line 101) | def close_on_close(self):
method close (line 109) | def close(self, *a):
method _cb_destroy (line 117) | def _cb_destroy(self, *a):
method set_value (line 123) | def set_value(self, key, value):
method get_value (line 127) | def get_value(self, key):
method __getitem__ (line 131) | def __getitem__(self, key):
method __setitem__ (line 135) | def __setitem__(self, key, value):
method build_button (line 140) | def build_button(label, icon_name=None, icon_widget=None, use_stock=Fa...
FILE: scc/gui/ring_editor.py
class RingEditor (line 23) | class RingEditor(Editor, ComboSetter):
method __init__ (line 26) | def __init__(self, app, callback):
method setup_widgets (line 37) | def setup_widgets(self):
method is_ring_action (line 49) | def is_ring_action(obj):
method on_adjRadius_value_changed (line 63) | def on_adjRadius_value_changed(self, scale, *a):
method on_sclRadius_format_value (line 67) | def on_sclRadius_format_value(self, scale, value):
method on_Dialog_destroy (line 71) | def on_Dialog_destroy(self, *a):
method on_btClearRadius_clicked (line 75) | def on_btClearRadius_clicked(self, *a):
method on_cbMode_changed (line 80) | def on_cbMode_changed(self, cb):
method _choose_editor (line 99) | def _choose_editor(self, action, cb):
method on_actionb_clicked (line 113) | def on_actionb_clicked(self, clicked_button):
method on_clearb_clicked (line 127) | def on_clearb_clicked(self, clicked_button):
method on_btClear_clicked (line 136) | def on_btClear_clicked(self, *a):
method on_btCustomActionEditor_clicked (line 144) | def on_btCustomActionEditor_clicked(self, *a):
method on_btOK_clicked (line 158) | def on_btOK_clicked(self, *a):
method _make_action (line 165) | def _make_action(self):
method _update (line 183) | def _update(self):
method allow_first_page (line 190) | def allow_first_page(self):
method set_input (line 195) | def set_input(self, id, action, mode=None):
FILE: scc/gui/simple_chooser.py
class SimpleChooser (line 17) | class SimpleChooser(Editor):
method __init__ (line 20) | def __init__(self, app, component_name, callback):
method setup_widgets (line 29) | def setup_widgets(self):
method load_component (line 34) | def load_component(self, component_name):
method display_action (line 50) | def display_action(self, mode, action):
method set_action (line 55) | def set_action(self, action):
method hide_axes (line 61) | def hide_axes(self):
method hide_mouse (line 66) | def hide_mouse(self):
FILE: scc/gui/statusicon.py
class StatusIcon (line 38) | class StatusIcon(GObject.GObject):
method __init__ (line 58) | def __init__(self, icon_path, popupmenu, force=False):
method get_active (line 69) | def get_active(self):
method set (line 82) | def set(self, icon=None, text=None):
method hide (line 103) | def hide(self):
method show (line 113) | def show(self):
method is_clickable (line 123) | def is_clickable(self):
method _is_forced (line 127) | def _is_forced(self):
method _on_click (line 130) | def _on_click(self, *a):
method _get_icon (line 133) | def _get_icon(self, icon=None):
method _get_text (line 143) | def _get_text(self, text=None):
method _get_popupmenu (line 153) | def _get_popupmenu(self):
method _set_visible (line 159) | def _set_visible(self, visible):
method do_get_property (line 165) | def do_get_property(self, property):
method do_set_property (line 171) | def do_set_property(self, property, value):
class StatusIconDummy (line 178) | class StatusIconDummy(StatusIcon):
method __init__ (line 182) | def __init__(self, *args, **kwargs):
method set (line 188) | def set(self, icon=None, text=None):
class StatusIconGTK3 (line 195) | class StatusIconGTK3(StatusIcon):
method __init__ (line 199) | def __init__(self, *args, **kwargs):
method destroy (line 224) | def destroy(self):
method set (line 228) | def set(self, icon=None, text=None):
method _on_embedded_change (line 234) | def _on_embedded_change(self, *args):
method _on_rclick (line 245) | def _on_rclick(self, si, button, time):
method _set_visible (line 248) | def _set_visible(self, active):
class StatusIconDBus (line 254) | class StatusIconDBus(StatusIcon):
class StatusIconAppIndicator (line 258) | class StatusIconAppIndicator(StatusIconDBus):
method __init__ (line 262) | def __init__(self, *args, **kwargs):
method _set_visible (line 280) | def _set_visible(self, active):
method is_clickable (line 285) | def is_clickable(self):
method destroy (line 288) | def destroy(self):
method set (line 292) | def set(self, icon=None, text=None):
class StatusIconProxy (line 298) | class StatusIconProxy(StatusIcon):
method __init__ (line 300) | def __init__(self, *args, **kwargs):
method _on_click (line 324) | def _on_click(self, *args):
method _on_notify_active_gtk (line 327) | def _on_notify_active_gtk(self, *args):
method _on_notify_active_fb (line 338) | def _on_notify_active_fb(self, *args):
method _load_fallback (line 346) | def _load_fallback(self):
method is_clickable (line 368) | def is_clickable(self):
method set (line 375) | def set(self, icon=None, text=None):
method hide (line 384) | def hide(self):
method destroy (line 390) | def destroy(self):
method show (line 396) | def show(self):
function get_status_icon (line 402) | def get_status_icon(*args, **kwargs):
FILE: scc/gui/svg_widget.py
class SVGWidget (line 26) | class SVGWidget(Gtk.EventBox):
method __init__ (line 40) | def __init__(self, filename, init_hilighted=True):
method set_image (line 60) | def set_image(self, filename):
method parse_image (line 67) | def parse_image(self):
method resize (line 80) | def resize(self, width, height):
method on_mouse_click (line 90) | def on_mouse_click(self, trash, event):
method on_mouse_moved (line 96) | def on_mouse_moved(self, trash, event):
method get_area (line 111) | def get_area(self, id):
method get_all_by_prefix (line 118) | def get_all_by_prefix(self, prefix):
method get_area_position (line 133) | def get_area_position(self, area_id):
method find_areas (line 146) | def find_areas(xml, parent_transform, areas, get_colors=False, prefix=...
method get_rect_area (line 168) | def get_rect_area(self, element):
method color_to_float (line 186) | def color_to_float(colorstr):
method hilight (line 197) | def hilight(self, buttons):
method get_pixbuf (line 233) | def get_pixbuf(self):
method edit (line 238) | def edit(self):
class Area (line 243) | class Area:
method __init__ (line 248) | def __init__(self, element, transform):
method contains (line 257) | def contains(self, x, y):
method __str__ (line 262) | def __str__(self):
class SVGEditor (line 266) | class SVGEditor(object):
method __init__ (line 277) | def __init__(self, svgw):
method commit (line 292) | def commit(self):
method to_string (line 305) | def to_string(self):
method _deep_copy (line 311) | def _deep_copy(element):
method clone_element (line 322) | def clone_element(self, id):
method remove_element (line 341) | def remove_element(self, e):
method keep (line 356) | def keep(self, *ids):
method update_parents (line 381) | def update_parents(tree):
method get_element (line 397) | def get_element(tree, id):
method find_by_id (line 410) | def find_by_id(tree, id):
method find_by_tag (line 427) | def find_by_tag(tree, tag):
method recolor (line 443) | def recolor(element, color):
method _recolor (line 472) | def _recolor(tree, s_from, s_to):
method recolor_background (line 481) | def recolor_background(self, change_from, change_to):
method recolor_strokes (line 494) | def recolor_strokes(self, change_from, change_to):
method matrixmul (line 508) | def matrixmul(X, Y, *a):
method scale (line 515) | def scale(xml, sx, sy=None):
method rotate (line 528) | def rotate(xml, a, x, y):
method translate (line 543) | def translate(xml, x, y):
method set_transform (line 555) | def set_transform(xml, matrix):
method get_translation (line 566) | def get_translation(elm_or_matrix, absolute=False):
method get_size (line 581) | def get_size(elm):
method parse_transform (line 591) | def parse_transform(xml):
method set_text (line 643) | def set_text(xml, text):
method set_labels (line 653) | def set_labels(self, labels):
method add_element (line 674) | def add_element(parent, e, **attributes):
method load_from_file (line 689) | def load_from_file(filename):
FILE: scc/gui/userdata_manager.py
class UserDataManager (line 23) | class UserDataManager(object):
method __init__ (line 25) | def __init__(self):
method load_profile (line 36) | def load_profile(self, giofile):
method save_profile (line 47) | def save_profile(self, giofile, profile):
method _save_profile_local (line 64) | def _save_profile_local(self, giofile, profile):
method load_profile_list (line 71) | def load_profile_list(self, category=None):
method load_menu_list (line 76) | def load_menu_list(self, category=None):
method load_menu_icons (line 81) | def load_menu_icons(self, category=None):
method load_user_data (line 86) | def load_user_data(self, paths, pattern, category, callback):
method _on_user_data_loaded (line 107) | def _on_user_data_loaded(self, pdir, res, data, i, callback):
method _sync_load (line 141) | def _sync_load(self, pdirs):
method on_menus_loaded (line 153) | def on_menus_loaded(self, menus): # Overriden by subclass
method on_profiles_loaded (line 157) | def on_profiles_loaded(self, profiles): # Overriden by subclass
method on_menuicons_loaded (line 161) | def on_menuicons_loaded(self, icons): # Overriden by subclass
method on_profile_saved (line 165) | def on_profile_saved(self, giofile): # Overriden in App
method on_profile_loaded (line 169) | def on_profile_loaded(self, profile, giofile): # Overriden in App
FILE: scc/lib/daemon.py
class Daemon (line 15) | class Daemon(object):
method __init__ (line 20) | def __init__(self, pidfile):
method daemonize (line 23) | def daemonize(self):
method write_pid (line 65) | def write_pid(self):
method delpid (line 73) | def delpid(self):
method start (line 77) | def start(self):
method on_start (line 116) | def on_start(self):
method stop (line 119) | def stop(self, once=False):
method restart (line 155) | def restart(self):
method run (line 161) | def run(self):
FILE: scc/lib/enum.py
function any (line 49) | def any(iterable):
class _RouteClassAttributeToGetattr (line 73) | class _RouteClassAttributeToGetattr(object):
method __init__ (line 82) | def __init__(self, fget=None):
method __get__ (line 85) | def __get__(self, instance, ownerclass=None):
method __set__ (line 90) | def __set__(self, instance, value):
method __delete__ (line 93) | def __delete__(self, instance):
function _is_descriptor (line 97) | def _is_descriptor(obj):
function _is_dunder (line 105) | def _is_dunder(name):
function _is_sunder (line 113) | def _is_sunder(name):
function _make_class_unpicklable (line 121) | def _make_class_unpicklable(cls):
class _EnumDict (line 129) | class _EnumDict(dict):
method __init__ (line 136) | def __init__(self):
method __setitem__ (line 140) | def __setitem__(self, key, value):
class EnumMeta (line 179) | class EnumMeta(type):
method __prepare__ (line 182) | def __prepare__(metacls, cls, bases):
method __new__ (line 185) | def __new__(metacls, cls, bases, classdict):
method __bool__ (line 356) | def __bool__(cls):
method __call__ (line 362) | def __call__(cls, value, names=None, module=None, type=None, start=1):
method __contains__ (line 383) | def __contains__(cls, member):
method __delattr__ (line 386) | def __delattr__(cls, attr):
method __dir__ (line 394) | def __dir__(self):
method __members__ (line 399) | def __members__(cls):
method __getattr__ (line 408) | def __getattr__(cls, name):
method __getitem__ (line 424) | def __getitem__(cls, name):
method __iter__ (line 427) | def __iter__(cls):
method __reversed__ (line 430) | def __reversed__(cls):
method __len__ (line 433) | def __len__(cls):
method __repr__ (line 438) | def __repr__(cls):
method __setattr__ (line 441) | def __setattr__(cls, name, value):
method _create_ (line 454) | def _create_(cls, class_name, names=None, module=None, type=None, star...
method _get_mixins_ (line 516) | def _get_mixins_(bases):
method _find_new_ (line 563) | def _find_new_(classdict, member_type, first_enum):
method _find_new_ (line 621) | def _find_new_(classdict, member_type, first_enum):
function __new__ (line 676) | def __new__(cls, value):
function __repr__ (line 698) | def __repr__(self):
function __str__ (line 704) | def __str__(self):
function __dir__ (line 710) | def __dir__(self):
function __format__ (line 721) | def __format__(self, format_spec):
function __cmp__ (line 744) | def __cmp__(self, other):
function __le__ (line 756) | def __le__(self, other):
function __lt__ (line 761) | def __lt__(self, other):
function __ge__ (line 766) | def __ge__(self, other):
function __gt__ (line 771) | def __gt__(self, other):
function __eq__ (line 777) | def __eq__(self, other):
function __ne__ (line 784) | def __ne__(self, other):
function __hash__ (line 791) | def __hash__(self):
function __reduce_ex__ (line 796) | def __reduce_ex__(self, proto):
function name (line 809) | def name(self):
function value (line 815) | def value(self):
function _convert (line 821) | def _convert(cls, name, module, filter, source=None):
class IntEnum (line 850) | class IntEnum(int, Enum):
function _reduce_ex_by_name (line 853) | def _reduce_ex_by_name(self, proto):
function unique (line 856) | def unique(enumeration):
FILE: scc/lib/eudevmonitor.py
class Eudev (line 26) | class Eudev:
method __init__ (line 29) | def __init__(self):
method _setup_lib (line 43) | def _setup_lib(l):
method __del__ (line 110) | def __del__(self):
method enumerate (line 116) | def enumerate(self, subclass=None):
method monitor (line 129) | def monitor(self, subclass=None):
function twoargs (line 142) | def twoargs(fn):
class Enumerator (line 147) | class Enumerator:
method __init__ (line 154) | def __init__(self, eudev, enumerator):
method __del__ (line 162) | def __del__(self):
method _add_match (line 168) | def _add_match(self, whichone, *pars):
method match_sysattr (line 181) | def match_sysattr(self, sysattr, value): return self._add_match("match...
method nomatch_sysattr (line 183) | def nomatch_sysattr(self, sysattr, value): return self._add_match("nom...
method match_property (line 185) | def match_property(self, property, value): return self._add_match("mat...
method match_subsystem (line 186) | def match_subsystem(self, subsystem): return self._add_match("match_su...
method nomatch_subsystem (line 187) | def nomatch_subsystem(self, subsystem): return self._add_match("nomatc...
method match_sysname (line 188) | def match_sysname(self, sysname): return self._add_match("match_sysnam...
method match_tag (line 189) | def match_tag(self, tag): return self._add_match("match_tag", tag)
method match_is_initialized (line 190) | def match_is_initialized(self): return self._add_match("match_is_initi...
method __iter__ (line 194) | def __iter__(self):
method next (line 205) | def next(self):
method __next__ (line 209) | def __next__(self):
class Monitor (line 222) | class Monitor:
method __init__ (line 233) | def __init__(self, eudev, monitor):
method __del__ (line 241) | def __del__(self):
method _add_match (line 247) | def _add_match(self, whichone, *pars):
method match_subsystem_devtype (line 266) | def match_subsystem_devtype(self, subsystem, devtype=None):
method match_subsystem (line 268) | def match_subsystem(self, subsystem):
method match_tag (line 270) | def match_tag(self, tag):
method is_started (line 273) | def is_started(self):
method get_fd (line 277) | def get_fd(self):
method enable_receiving (line 284) | def enable_receiving(self):
method set_receive_buffer_size (line 295) | def set_receive_buffer_size(self, size):
method receive_device (line 307) | def receive_device(self):
FILE: scc/lib/hidparse.py
class _hidraw_report_descriptor (line 37) | class _hidraw_report_descriptor(ctypes.Structure):
class _hidraw_devinfo (line 44) | class _hidraw_devinfo(ctypes.Structure):
class BusType (line 52) | class BusType(IntEnum):
class ReservedItem (line 59) | class ReservedItem(object):
method __init__ (line 62) | def __init__(self, value):
method __repr__ (line 66) | def __repr__(self):
method __new__ (line 71) | def __new__(cls, value):
function enum_or_reserved (line 77) | def enum_or_reserved(enum, value):
function _ioctl (line 92) | def _ioctl(devfile, func, arg, mutate_flag=False):
function get_device_info (line 98) | def get_device_info(devfile):
function get_raw_report_descriptor (line 108) | def get_raw_report_descriptor(devfile):
function _it2u (line 121) | def _it2u(it):
function _it2s (line 134) | def _it2s(it):
function parse_item (line 152) | def parse_item(it, page):
function _split_hid_items (line 263) | def _split_hid_items(data):
function parse_report_descriptor (line 277) | def parse_report_descriptor(data, flat_list=False):
function get_report_descriptor (line 309) | def get_report_descriptor(devfile, flat_list=False):
class Parser (line 320) | class Parser(object):
method __init__ (line 322) | def __init__(self, code, offset, count, size):
method decode (line 347) | def decode(self, data):
class HIDButtonParser (line 355) | class HIDButtonParser(Parser):
method __repr__ (line 358) | def __repr__(self):
class HIDAxisParser (line 362) | class HIDAxisParser(Parser):
method __repr__ (line 365) | def __repr__(self):
function make_parsers (line 369) | def make_parsers(data):
FILE: scc/lib/hidparse_data.py
class MainItem (line 10) | class MainItem(IntEnum):
class GlobalItem (line 18) | class GlobalItem(IntEnum):
class LocalItem (line 33) | class LocalItem(IntEnum):
class Collection (line 46) | class Collection(IntEnum):
class GenericDesktopPage (line 56) | class GenericDesktopPage(IntEnum):
class SimulationControlsPage (line 130) | class SimulationControlsPage(IntEnum):
class VRControlsPage (line 185) | class VRControlsPage(IntEnum):
class SportControlsPage (line 201) | class SportControlsPage(IntEnum):
class GameControlsPage (line 239) | class GameControlsPage(IntEnum):
class GenericDeviceControlsPage (line 271) | class GenericDeviceControlsPage(IntEnum):
class KeyboardKeypadPage (line 282) | class KeyboardKeypadPage(IntEnum):
class LedPage (line 504) | class LedPage(IntEnum):
class ButtonPage (line 585) | class ButtonPage(IntEnum):
class OrdinalPage (line 593) | class OrdinalPage(IntEnum):
class TelephonyDevicePage (line 600) | class TelephonyDevicePage(IntEnum):
class ConsumerPage (line 669) | class ConsumerPage(IntEnum):
class DigitizersPage (line 811) | class DigitizersPage(IntEnum):
class AlphanumericDisplayPage (line 854) | class AlphanumericDisplayPage(IntEnum):
class SensorPage (line 926) | class SensorPage(IntEnum):
class MedicalInstrumentPage (line 963) | class MedicalInstrumentPage(IntEnum):
class VendorPage (line 996) | class VendorPage(IntEnum):
class UsagePage (line 1011) | class UsagePage(IntEnum):
class SensorEvent (line 1052) | class SensorEvent(IntEnum):
class HidSensorProperty (line 1058) | class HidSensorProperty(IntEnum):
class MotionSensor (line 1079) | class MotionSensor(IntEnum):
class OrientationSensor (line 1092) | class OrientationSensor(IntEnum):
class LightSensor (line 1116) | class LightSensor(IntEnum):
class SensorDataField (line 1124) | class SensorDataField(IntEnum):
class SensorSelector (line 1169) | class SensorSelector(IntEnum):
class UnitType (line 1242) | class UnitType(IntEnum):
class Unit (line 1250) | class Unit(IntEnum):
class ModifierI2a (line 1259) | class ModifierI2a(IntEnum):
class ItemType (line 1277) | class ItemType(IntEnum):
class ItemLength (line 1282) | class ItemLength(IntEnum):
class ItemBase (line 1287) | class ItemBase(IntEnum):
FILE: scc/lib/hidraw.py
class _hidraw_report_descriptor (line 16) | class _hidraw_report_descriptor(ctypes.Structure):
class _hidraw_devinfo (line 22) | class _hidraw_devinfo(ctypes.Structure):
class HIDRaw (line 47) | class HIDRaw(object):
method __init__ (line 51) | def __init__(self, device):
method _ioctl (line 58) | def _ioctl(self, func, arg, mutate_flag=False):
method read (line 63) | def read(self, size):
method write (line 66) | def write(self, buf):
method getRawReportDescriptor (line 69) | def getRawReportDescriptor(self):
method getInfo (line 83) | def getInfo(self):
method getName (line 94) | def getName(self, length=512):
method getPhysicalAddress (line 102) | def getPhysicalAddress(self, length=512):
method sendFeatureReport (line 112) | def sendFeatureReport(self, report, report_num=0):
method getFeatureReport (line 126) | def getFeatureReport(self, report_num=0, length=63):
FILE: scc/lib/ioctl_opt.py
function IOC (line 31) | def IOC(dir, type, nr, size):
function IOC_TYPECHECK (line 38) | def IOC_TYPECHECK(t):
function IO (line 43) | def IO(type, nr):
function IOR (line 46) | def IOR(type, nr, size):
function IOW (line 49) | def IOW(type, nr, size):
function IORW (line 52) | def IORW(type, nr, size):
function IOC_DIR (line 55) | def IOC_DIR(nr):
function IOC_TYPE (line 58) | def IOC_TYPE(nr):
function IOC_NR (line 61) | def IOC_NR(nr):
function IOC_SIZE (line 64) | def IOC_SIZE(nr):
FILE: scc/lib/jsonencoder.py
function encode_basestring (line 37) | def encode_basestring(s):
function py_encode_basestring_ascii (line 46) | def py_encode_basestring_ascii(s):
class JSONEncoder (line 74) | class JSONEncoder(object):
method __init__ (line 105) | def __init__(self, skipkeys=False, ensure_ascii=True,
method default (line 169) | def default(self, o):
method encode (line 190) | def encode(self, o):
method iterencode (line 217) | def iterencode(self, o, _one_shot=False):
function _make_iterencode (line 277) | def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
FILE: scc/lib/libusb1.py
class Enum (line 51) | class Enum(object):
method __init__ (line 52) | def __init__(self, member_dict, scope_dict=None):
method __call__ (line 75) | def __call__(self, value):
method get (line 78) | def get(self, value, default=None):
function newStruct (line 91) | def newStruct(field_name_list):
function newDescriptor (line 116) | def newDescriptor(field_name_list):
class USBError (line 125) | class USBError(Exception):
method __init__ (line 128) | def __init__(self, value=None):
method __str__ (line 133) | def __str__(self):
class timeval (line 149) | class timeval(Structure):
function _loadLibrary (line 154) | def _loadLibrary():
function bswap16 (line 196) | def bswap16(x):
function libusb_cpu_to_le16 (line 200) | def libusb_cpu_to_le16(x):
function libusb_le16_to_cpu (line 202) | def libusb_le16_to_cpu(x):
class libusb_device_descriptor (line 405) | class libusb_device_descriptor(Structure):
class libusb_endpoint_descriptor (line 442) | class libusb_endpoint_descriptor(Structure):
class libusb_interface_descriptor (line 456) | class libusb_interface_descriptor(Structure):
class libusb_interface (line 472) | class libusb_interface(Structure):
class libusb_config_descriptor (line 477) | class libusb_config_descriptor(Structure):
class libusb_control_setup (line 493) | class libusb_control_setup(Structure):
class libusb_context (line 519) | class libusb_context(Structure):
class libusb_device (line 537) | class libusb_device(Structure):
class libusb_device_handle (line 549) | class libusb_device_handle(Structure):
class libusb_version (line 554) | class libusb_version(Structure):
class libusb_iso_packet_descriptor (line 658) | class libusb_iso_packet_descriptor(Structure):
class libusb_transfer (line 664) | class libusb_transfer(Structure):
function libusb_get_version (line 736) | def libusb_get_version():
function libusb_has_capability (line 745) | def libusb_has_capability(_):
function libusb_error_name (line 757) | def libusb_error_name(errcode):
function libusb_strerror (line 772) | def libusb_strerror(errcode):
function libusb_get_device_speed (line 862) | def libusb_get_device_speed(_):
function libusb_get_max_iso_packet_size (line 879) | def libusb_get_max_iso_packet_size(_, __):
function libusb_control_transfer_get_data (line 958) | def libusb_control_transfer_get_data(transfer_p):
function libusb_control_transfer_get_setup (line 963) | def libusb_control_transfer_get_setup(transfer_p):
function libusb_fill_control_setup (line 966) | def libusb_fill_control_setup(
function libusb_fill_control_transfer (line 991) | def libusb_fill_control_transfer(
function libusb_fill_bulk_transfer (line 1012) | def libusb_fill_bulk_transfer(
function libusb_fill_interrupt_transfer (line 1029) | def libusb_fill_interrupt_transfer(
function libusb_fill_iso_transfer (line 1046) | def libusb_fill_iso_transfer(
function _get_iso_packet_list (line 1063) | def _get_iso_packet_list(transfer):
function get_iso_packet_list (line 1067) | def get_iso_packet_list(transfer_p):
function _get_iso_packet_buffer (line 1074) | def _get_iso_packet_buffer(transfer, offset, length):
function get_iso_packet_buffer_list (line 1077) | def get_iso_packet_buffer_list(transfer_p):
function get_extra (line 1091) | def get_extra(descriptor):
function libusb_set_iso_packet_lengths (line 1114) | def libusb_set_iso_packet_lengths(transfer_p, length):
function libusb_get_iso_packet_buffer (line 1119) | def libusb_get_iso_packet_buffer(transfer_p, packet):
function libusb_get_iso_packet_buffer_simple (line 1130) | def libusb_get_iso_packet_buffer_simple(transfer_p, packet):
function libusb_get_descriptor (line 1162) | def libusb_get_descriptor(dev, desc_type, desc_index, data, length):
function libusb_get_string_descriptor (line 1170) | def libusb_get_string_descriptor(dev, desc_index, langid, data, length):
class libusb_pollfd (line 1245) | class libusb_pollfd(Structure):
FILE: scc/lib/usb1.py
function get_errno (line 69) | def get_errno():
function __bindConstants (line 84) | def __bindConstants():
function raiseUSBError (line 116) | def raiseUSBError(value):
function mayRaiseUSBError (line 119) | def mayRaiseUSBError(value):
class WeakSet (line 157) | class WeakSet(object):
method __init__ (line 158) | def __init__(self):
method add (line 161) | def add(self, item):
method pop (line 164) | def pop(self):
function create_binary_buffer (line 189) | def create_binary_buffer(init_or_size):
class DoomedTransferError (line 204) | class DoomedTransferError(Exception):
class USBTransfer (line 208) | class USBTransfer(object):
method __init__ (line 238) | def __init__(self, handle, iso_packets, before_submit, after_completion):
method close (line 261) | def close(self):
method doom (line 288) | def doom(self):
method __del__ (line 294) | def __del__(self):
method __callbackWrapper (line 312) | def __callbackWrapper(self, transfer_p):
method setCallback (line 326) | def setCallback(self, callback):
method getCallback (line 332) | def getCallback(self):
method setControl (line 338) | def setControl(
method setBulk (line 382) | def setBulk(
method setInterrupt (line 416) | def setInterrupt(
method setIsochronous (line 450) | def setIsochronous(
method getType (line 534) | def getType(self):
method getEndpoint (line 546) | def getEndpoint(self):
method getStatus (line 552) | def getStatus(self):
method getActualLength (line 559) | def getActualLength(self):
method getBuffer (line 566) | def getBuffer(self):
method getUserData (line 581) | def getUserData(self):
method setUserData (line 587) | def setUserData(self, user_data):
method getISOBufferList (line 593) | def getISOBufferList(self):
method getISOSetupList (line 613) | def getISOSetupList(self):
method iterISO (line 643) | def iterISO(self):
method setBuffer (line 667) | def setBuffer(self, buffer_or_len):
method isSubmitted (line 697) | def isSubmitted(self):
method submit (line 703) | def submit(self):
method cancel (line 723) | def cancel(self):
class USBTransferHelper (line 738) | class USBTransferHelper(object):
method __init__ (line 758) | def __init__(self, transfer=None):
method submit (line 776) | def submit(self):
method cancel (line 784) | def cancel(self):
method setEventCallback (line 792) | def setEventCallback(self, event, callback):
method setDefaultCallback (line 808) | def setDefaultCallback(self, callback):
method getEventCallback (line 816) | def getEventCallback(self, event, default=None):
method __call__ (line 822) | def __call__(self, transfer):
method isSubmited (line 833) | def isSubmited(self):
class USBPollerThread (line 841) | class USBPollerThread(threading.Thread):
method __init__ (line 853) | def __init__(self, context, poller, exc_callback=None):
method __del__ (line 878) | def __del__(self):
method exceptionHandler (line 883) | def exceptionHandler(exc):
method run (line 887) | def run(self):
method _registerFD (line 920) | def _registerFD(self, fd, events, _):
method _unregisterFD (line 924) | def _unregisterFD(self, fd, _):
class USBPoller (line 928) | class USBPoller(object):
method __init__ (line 938) | def __init__(self, context, poller):
method __del__ (line 964) | def __del__(self):
method poll (line 967) | def poll(self, timeout=None):
method register (line 991) | def register(self, fd, events):
method unregister (line 1002) | def unregister(self, fd):
method _registerFD (line 1014) | def _registerFD(self, fd, events, user_data=None):
method _unregisterFD (line 1020) | def _unregisterFD(self, fd, user_data=None):
class _ReleaseInterface (line 1025) | class _ReleaseInterface(object):
method __init__ (line 1026) | def __init__(self, handle, interface):
method __enter__ (line 1030) | def __enter__(self):
method __exit__ (line 1034) | def __exit__(self, exc_type, exc_val, exc_tb):
class USBDeviceHandle (line 1037) | class USBDeviceHandle(object):
method __init__ (line 1053) | def __init__(self, context, handle, device):
method __del__ (line 1076) | def __del__(self):
method close (line 1079) | def close(self):
method getDevice (line 1125) | def getDevice(self):
method getConfiguration (line 1132) | def getConfiguration(self):
method setConfiguration (line 1142) | def setConfiguration(self, configuration):
method claimInterface (line 1150) | def claimInterface(self, interface):
method releaseInterface (line 1165) | def releaseInterface(self, interface):
method setInterfaceAltSetting (line 1173) | def setInterfaceAltSetting(self, interface, alt_setting):
method clearHalt (line 1181) | def clearHalt(self, endpoint):
method resetDevice (line 1187) | def resetDevice(self):
method kernelDriverActive (line 1197) | def kernelDriverActive(self, interface):
method detachKernelDriver (line 1208) | def detachKernelDriver(self, interface):
method attachKernelDriver (line 1216) | def attachKernelDriver(self, interface):
method setAutoDetachKernelDriver (line 1224) | def setAutoDetachKernelDriver(self, enable):
method getSupportedLanguageList (line 1234) | def getSupportedLanguageList(self):
method getStringDescriptor (line 1263) | def getStringDescriptor(self, descriptor, lang_id):
method getRawDescriptor (line 1282) | def getRawDescriptor(self, descriptor, desc_index, length):
method getASCIIStringDescriptor (line 1300) | def getASCIIStringDescriptor(self, descriptor):
method _controlTransfer (line 1321) | def _controlTransfer(
method controlWrite (line 1330) | def controlWrite(
method controlRead (line 1350) | def controlRead(
method _bulkTransfer (line 1369) | def _bulkTransfer(self, endpoint, data, length, timeout):
method bulkWrite (line 1376) | def bulkWrite(self, endpoint, data, timeout=0):
method bulkRead (line 1392) | def bulkRead(self, endpoint, length, timeout=0):
method _interruptTransfer (line 1410) | def _interruptTransfer(self, endpoint, data, length, timeout):
method interruptWrite (line 1417) | def interruptWrite(self, endpoint, data, timeout=0):
method interruptRead (line 1433) | def interruptRead(self, endpoint, length, timeout=0):
method getTransfer (line 1451) | def getTransfer(self, iso_packets=0):
class USBConfiguration (line 1464) | class USBConfiguration(object):
method __init__ (line 1465) | def __init__(self, context, config):
method getNumInterfaces (line 1475) | def getNumInterfaces(self):
method getConfigurationValue (line 1480) | def getConfigurationValue(self):
method getDescriptor (line 1483) | def getDescriptor(self):
method getAttributes (line 1486) | def getAttributes(self):
method getMaxPower (line 1489) | def getMaxPower(self):
method getExtra (line 1497) | def getExtra(self):
method __iter__ (line 1503) | def __iter__(self):
method __getitem__ (line 1516) | def __getitem__(self, interface):
class USBInterface (line 1526) | class USBInterface(object):
method __init__ (line 1527) | def __init__(self, context, interface):
method getNumSettings (line 1537) | def getNumSettings(self):
method __iter__ (line 1542) | def __iter__(self):
method __getitem__ (line 1556) | def __getitem__(self, alt_setting):
class USBInterfaceSetting (line 1567) | class USBInterfaceSetting(object):
method __init__ (line 1568) | def __init__(self, context, alt_setting):
method getNumber (line 1578) | def getNumber(self):
method getAlternateSetting (line 1581) | def getAlternateSetting(self):
method getNumEndpoints (line 1584) | def getNumEndpoints(self):
method getClass (line 1589) | def getClass(self):
method getSubClass (line 1592) | def getSubClass(self):
method getClassTuple (line 1595) | def getClassTuple(self):
method getProtocol (line 1606) | def getProtocol(self):
method getDescriptor (line 1609) | def getDescriptor(self):
method getExtra (line 1612) | def getExtra(self):
method __iter__ (line 1615) | def __iter__(self):
method __getitem__ (line 1628) | def __getitem__(self, endpoint):
class USBEndpoint (line 1639) | class USBEndpoint(object):
method __init__ (line 1640) | def __init__(self, context, endpoint):
method getAddress (line 1646) | def getAddress(self):
method getAttributes (line 1649) | def getAttributes(self):
method getMaxPacketSize (line 1652) | def getMaxPacketSize(self):
method getInterval (line 1655) | def getInterval(self):
method getRefresh (line 1658) | def getRefresh(self):
method getSyncAddress (line 1661) | def getSyncAddress(self):
method getExtra (line 1664) | def getExtra(self):
class USBDevice (line 1667) | class USBDevice(object):
method __init__ (line 1678) | def __init__(self, context, device_p, can_load_configuration=True):
method __del__ (line 1712) | def __del__(self):
method close (line 1715) | def close(self):
method __str__ (line 1736) | def __str__(self):
method __len__ (line 1744) | def __len__(self):
method __getitem__ (line 1747) | def __getitem__(self, index):
method __key (line 1751) | def __key(self):
method __hash__ (line 1758) | def __hash__(self):
method __eq__ (line 1761) | def __eq__(self, other):
method iterConfigurations (line 1771) | def iterConfigurations(self):
method iterSettings (line 1779) | def iterSettings(self):
method getBusNumber (line 1785) | def getBusNumber(self):
method getPortNumber (line 1791) | def getPortNumber(self):
method getPortNumberList (line 1797) | def getPortNumberList(self):
method getDeviceAddress (line 1810) | def getDeviceAddress(self):
method getbcdUSB (line 1816) | def getbcdUSB(self):
method getDeviceClass (line 1822) | def getDeviceClass(self):
method getDeviceSubClass (line 1828) | def getDeviceSubClass(self):
method getDeviceProtocol (line 1834) | def getDeviceProtocol(self):
method getMaxPacketSize0 (line 1840) | def getMaxPacketSize0(self):
method getMaxPacketSize (line 1846) | def getMaxPacketSize(self, endpoint):
method getMaxISOPacketSize (line 1858) | def getMaxISOPacketSize(self, endpoint):
method getVendorID (line 1871) | def getVendorID(self):
method getProductID (line 1877) | def getProductID(self):
method getbcdDevice (line 1883) | def getbcdDevice(self):
method getSupportedLanguageList (line 1889) | def getSupportedLanguageList(self):
method _getStringDescriptor (line 1895) | def _getStringDescriptor(self, descriptor, lang_id):
method _getASCIIStringDescriptor (line 1899) | def _getASCIIStringDescriptor(self, descriptor):
method getManufacturer (line 1903) | def getManufacturer(self):
method getProduct (line 1911) | def getProduct(self):
method getSerialNumber (line 1918) | def getSerialNumber(self):
method getNumConfigurations (line 1926) | def getNumConfigurations(self):
method getDeviceSpeed (line 1932) | def getDeviceSpeed(self):
method open (line 1945) | def open(self):
class USBContext (line 1959) | class USBContext(object):
method _validContext (line 1977) | def _validContext(func):
method __init__ (line 2017) | def __init__(self):
method __del__ (line 2029) | def __del__(self):
method __enter__ (line 2036) | def __enter__(self):
method __exit__ (line 2039) | def __exit__(self, exc_type, exc_val, exc_tb):
method open (line 2042) | def open(self):
method close (line 2058) | def close(self):
method _exit (line 2078) | def _exit(self):
method getDeviceIterator (line 2099) | def getDeviceIterator(self, skip_on_error=False):
method getDeviceList (line 2130) | def getDeviceList(self, skip_on_access_error=False, skip_on_error=False):
method getByVendorIDAndProductID (line 2147) | def getByVendorIDAndProductID(
method openByVendorIDAndProductID (line 2165) | def openByVendorIDAndProductID(
method getPollFDList (line 2185) | def getPollFDList(self):
method handleEvents (line 2215) | def handleEvents(self):
method handleEventsTimeout (line 2228) | def handleEventsTimeout(self, tv=0):
method setPollFDNotifiers (line 2249) | def setPollFDNotifiers(
method getNextTimeout (line 2274) | def getNextTimeout(self):
method setDebug (line 2291) | def setDebug(self, level):
method tryLockEvents (line 2300) | def tryLockEvents(self):
method lockEvents (line 2307) | def lockEvents(self):
method lockEventWaiters (line 2314) | def lockEventWaiters(self):
method waitForEvent (line 2321) | def waitForEvent(self, tv=0):
method unlockEventWaiters (line 2332) | def unlockEventWaiters(self):
method eventHandlingOK (line 2339) | def eventHandlingOK(self):
method unlockEvents (line 2346) | def unlockEvents(self):
method handleEventsLocked (line 2353) | def handleEventsLocked(self):
method eventHandlerActive (line 2363) | def eventHandlerActive(self):
method hasCapability (line 2370) | def hasCapability(capability):
method hotplugRegisterCallback (line 2377) | def hotplugRegisterCallback(
method hotplugDeregisterCallback (line 2437) | def hotplugDeregisterCallback(self, handle):
function getVersion (line 2448) | def getVersion():
function hasCapability (line 2470) | def hasCapability(capability):
class LibUSBContext (line 2482) | class LibUSBContext(USBContext):
method __init__ (line 2486) | def __init__(self):
FILE: scc/lib/vdf.py
function parse_vdf (line 22) | def parse_vdf(file):
function ensure_list (line 26) | def ensure_list(value):
FILE: scc/lib/xinput.py
function get_devices (line 31) | def get_devices():
class XIDevice (line 56) | class XIDevice(object):
method __init__ (line 57) | def __init__(self, id, name, type):
method float (line 63) | def float(self):
method get_name (line 69) | def get_name(self):
method is_pointer (line 73) | def is_pointer(self):
method is_slave (line 78) | def is_slave(self):
method __str__ (line 83) | def __str__(self):
FILE: scc/lib/xwrappers.py
function _load_lib (line 26) | def _load_lib(*names):
class XRectangle (line 53) | class XRectangle(Structure):
class XClassHint (line 61) | class XClassHint(Structure):
class XkbStateRec (line 67) | class XkbStateRec(Structure):
class XWindowAttributes (line 85) | class XWindowAttributes(Structure):
function get_xkb_state (line 263) | def get_xkb_state(dpy):
function get_window_size (line 269) | def get_window_size(dpy, window):
function is_window_visible (line 275) | def is_window_visible(dpy, window):
function get_window_geometry (line 282) | def get_window_geometry(dpy, win):
function get_screen_size (line 296) | def get_screen_size(dpy):
function get_mouse_pos (line 300) | def get_mouse_pos(dpy, relative_to=None):
function set_mouse_pos (line 318) | def set_mouse_pos(dpy, x, y, relative_to=None):
function get_window_prop (line 329) | def get_window_prop(dpy, window, prop_name, max_size=2):
function get_current_window (line 350) | def get_current_window(dpy):
function get_window_type (line 370) | def get_window_type(dpy, window):
function get_window_title (line 383) | def get_window_title(dpy, window):
function get_window_class (line 399) | def get_window_class(dpy, window):
function get_wm_state (line 414) | def get_wm_state(dpy, window):
FILE: scc/macros.py
class Macro (line 20) | class Macro(Action):
method __init__ (line 29) | def __init__(self, *parameters):
method button_press (line 48) | def button_press(self, mapper):
method timer (line 61) | def timer(self, mapper):
method cancel (line 85) | def cancel(self, mapper):
method set_haptic (line 90) | def set_haptic(self, hapticdata):
method get_haptic (line 96) | def get_haptic(self):
method set_speed (line 103) | def set_speed(self, x, y, z):
method get_speed (line 109) | def get_speed(self):
method button_release (line 116) | def button_release(self, mapper):
method describe (line 120) | def describe(self, context):
method to_string (line 127) | def to_string(self, multiline=False, pad=0):
method __str__ (line 134) | def __str__(self):
class Type (line 142) | class Type(Macro):
method __init__ (line 154) | def __init__(self, string):
method to_string (line 180) | def to_string(self, multiline=False, pad=0):
class Cycle (line 184) | class Cycle(Macro):
method __init__ (line 193) | def __init__(self, *parameters):
method button_press (line 199) | def button_press(self, mapper):
method button_release (line 204) | def button_release(self, mapper):
method describe (line 212) | def describe(self, context):
method to_string (line 217) | def to_string(self, multiline=False, pad=0):
method __str__ (line 222) | def __str__(self):
class Repeat (line 228) | class Repeat(Macro):
method __new__ (line 234) | def __new__(cls, action):
class SleepAction (line 241) | class SleepAction(Action):
method __init__ (line 247) | def __init__(self, delay):
method describe (line 252) | def describe(self, context):
method to_string (line 261) | def to_string(self, multiline=False, pad=0):
method button_press (line 265) | def button_press(self, mapper): pass
method button_release (line 266) | def button_release(self, mapper): pass
class PressAction (line 269) | class PressAction(Action):
method __init__ (line 277) | def __init__(self, action):
method describe_short (line 282) | def describe_short(self):
method describe (line 291) | def describe(self, context):
method button_press (line 296) | def button_press(self, mapper):
method button_release (line 300) | def button_release(self, mapper):
class ReleaseAction (line 305) | class ReleaseAction(PressAction):
method button_press (line 313) | def button_press(self, mapper):
class TapAction (line 317) | class TapAction(PressAction):
method __init__ (line 328) | def __init__(self, button, count=1):
method button_press (line 336) | def button_press(self, mapper):
method _bailout (line 372) | def _bailout(self):
method _rel_tap_press (line 377) | def _rel_tap_press(self, mapper):
method button_release (line 400) | def button_release(self, mapper):
method describe_short (line 410) | def describe_short(self):
method describe (line 419) | def describe(self, context):
method to_string (line 424) | def to_string(self, multiline=False, pad=0):
FILE: scc/mapper.py
class Mapper (line 20) | class Mapper(object):
method __init__ (line 23) | def __init__(self, profile, scheduler, keyboard=b"SCController Keyboard",
method create_gamepad (line 64) | def create_gamepad(self, enabled, poller):
method create_keyboard (line 98) | def create_keyboard(self, name):
method create_mouse (line 102) | def create_mouse(self, name):
method _rumble_ready (line 106) | def _rumble_ready(self, fd, event):
method get_gamepad_name (line 138) | def get_gamepad_name(self):
method sync (line 148) | def sync(self):
method set_controller (line 156) | def set_controller(self, c):
method get_controller (line 161) | def get_controller(self):
method set_special_actions_handler (line 166) | def set_special_actions_handler(self, sa):
method get_special_actions_handler (line 170) | def get_special_actions_handler(self):
method set_xdisplay (line 174) | def set_xdisplay(self, x):
method get_xdisplay (line 178) | def get_xdisplay(self):
method get_current_window (line 182) | def get_current_window(self):
method schedule (line 191) | def schedule(self, delay, cb):
method cancel_task (line 200) | def cancel_task(self, task):
method mouse_move (line 205) | def mouse_move(self, dx, dy):
method mouse_wheel (line 214) | def mouse_wheel(self, wx, wy):
method mouse_move_stick (line 223) | def mouse_move_stick(self, dx, dy):
method send_feedback (line 232) | def send_feedback(self, hapticdata):
method controller_flags (line 246) | def controller_flags(self):
method is_touched (line 254) | def is_touched(self, what):
method was_touched (line 271) | def was_touched(self, what):
method is_pressed (line 290) | def is_pressed(self, button):
method was_pressed (line 301) | def was_pressed(self, button):
method get_pressed_button (line 312) | def get_pressed_button(self):
method set_button (line 323) | def set_button(self, button, state):
method set_was_pressed (line 341) | def set_was_pressed(self, button, state):
method release_virtual_buttons (line 359) | def release_virtual_buttons(self):
method cancel_all (line 370) | def cancel_all(self):
method reset_gyros (line 379) | def reset_gyros(self):
method input (line 385) | def input(self, controller, old_state, state):
method generate_events (line 500) | def generate_events(self):
method generate_feedback (line 526) | def generate_feedback(self):
FILE: scc/menu_data.py
class MenuData (line 13) | class MenuData(object):
method __init__ (line 15) | def __init__(self, *items):
method generate (line 19) | def generate(self, menuhandler):
method compress (line 35) | def compress(self):
method __len__ (line 41) | def __len__(self):
method __getitem__ (line 45) | def __getitem__(self, index):
method __iter__ (line 49) | def __iter__(self):
method get_all_actions (line 53) | def get_all_actions(self):
method get_by_id (line 64) | def get_by_id(self, id):
method index (line 75) | def index(self, a):
method encode (line 79) | def encode(self):
method from_args (line 88) | def from_args(data):
method from_json_data (line 112) | def from_json_data(data, action_parser=None):
method from_fileobj (line 156) | def from_fileobj(fileobj, action_parser=None):
method from_file (line 166) | def from_file(filename, action_parser=None):
method from_profile (line 175) | def from_profile(filename, menuname, action_parser=None):
class MenuItem (line 193) | class MenuItem(object):
method __init__ (line 195) | def __init__(self, id, label, action=None, callback=None, icon=None):
method describe (line 204) | def describe(self):
method encode (line 211) | def encode(self):
class Separator (line 225) | class Separator(MenuItem):
method __init__ (line 227) | def __init__(self, label=None):
method describe (line 231) | def describe(self):
method encode (line 238) | def encode(self):
class Submenu (line 244) | class Submenu(MenuItem):
method __init__ (line 246) | def __init__(self, filename, label=None, icon=None):
method describe (line 253) | def describe(self):
method encode (line 257) | def encode(self):
class MenuGenerator (line 264) | class MenuGenerator(object):
method __init__ (line 268) | def __init__(self, **b):
method describe (line 277) | def describe(self):
method encode (line 284) | def encode(self):
method generate (line 288) | def generate(self, menuhandler):
FILE: scc/modifiers.py
class Modifier (line 30) | class Modifier(Action):
method __init__ (line 31) | def __init__(self, *params):
method get_compatible_modifiers (line 44) | def get_compatible_modifiers(self):
method cancel (line 48) | def cancel(self, mapper):
method get_child_actions (line 52) | def get_child_actions(self):
method _mod_init (line 56) | def _mod_init(self):
method _mod_to_string (line 64) | def _mod_to_string(self, params, multiline, pad):
method strip_defaults (line 93) | def strip_defaults(self):
method strip (line 107) | def strip(self):
method compress (line 111) | def compress(self):
method __str__ (line 117) | def __str__(self):
class NameModifier (line 123) | class NameModifier(Modifier):
method _mod_init (line 130) | def _mod_init(self, name):
method decode (line 137) | def decode(data, a, *b):
method strip (line 141) | def strip(self):
method unstrip (line 148) | def unstrip(action):
method compress (line 158) | def compress(self):
method describe (line 162) | def describe(self, context):
method to_string (line 166) | def to_string(self, multiline=False, pad=0):
class ClickModifier (line 174) | class ClickModifier(Modifier):
method decode (line 179) | def decode(data, a, *b):
method describe (line 183) | def describe(self, context):
method to_string (line 190) | def to_string(self, multiline=False, pad=0):
method strip (line 206) | def strip(self):
method compress (line 210) | def compress(self):
method button_press (line 216) | def button_press(self, mapper):
method button_release (line 219) | def button_release(self, mapper):
method trigger (line 222) | def trigger(self, mapper, position, old_position):
method axis (line 226) | def axis(self, mapper, position, what):
method pad (line 246) | def pad(self, mapper, position, what):
method whole (line 266) | def whole(self, mapper, x, y, what):
class TouchedModifier (line 289) | class TouchedModifier(Modifier):
method describe (line 293) | def describe(self, context):
method strip (line 300) | def strip(self):
method compress (line 304) | def compress(self):
method _release (line 309) | def _release(self, mapper):
method whole (line 313) | def whole(self, mapper, x, y, what):
class UntouchedModifier (line 319) | class UntouchedModifier(TouchedModifier):
method whole (line 323) | def whole(self, mapper, x, y, what):
class PressedModifier (line 329) | class PressedModifier(Modifier):
method describe (line 333) | def describe(self, context):
method strip (line 340) | def strip(self):
method compress (line 344) | def compress(self):
method button_press (line 349) | def button_press(self, mapper):
method _release (line 354) | def _release(self, mapper):
method button_release (line 358) | def button_release(self, mapper):
class ReleasedModifier (line 362) | class ReleasedModifier(PressedModifier):
method describe (line 365) | def describe(self, context):
method button_press (line 372) | def button_press(self, mapper):
method button_release (line 376) | def button_release(self, mapper):
class BallModifier (line 381) | class BallModifier(Modifier, WholeHapticAction):
method __init__ (line 399) | def __init__(self, *params):
method _mod_init (line 404) | def _mod_init(self, friction=DEFAULT_FRICTION, mass=80.0,
method set_speed (line 424) | def set_speed(self, x, y, *a):
method get_speed (line 435) | def get_speed(self):
method get_compatible_modifiers (line 439) | def get_compatible_modifiers(self):
method _stop (line 445) | def _stop(self):
method _add (line 454) | def _add(self, dx, dy):
method _roll (line 467) | def _roll(self, mapper):
method decode (line 507) | def decode(data, a, *b):
method describe (line 517) | def describe(self, context):
method to_string (line 537) | def to_string(self, multiline=False, pad=0):
method cancel (line 541) | def cancel(self, mapper):
method pad (line 546) | def pad(self, mapper, position, what):
method change (line 550) | def change(self, mapper, dx, dy, what):
method whole (line 569) | def whole(self, mapper, x, y, what):
method set_haptic (line 596) | def set_haptic(self, hd):
method get_haptic (line 603) | def get_haptic(self):
method compress (line 610) | def compress(self):
class DeadzoneModifier (line 620) | class DeadzoneModifier(Modifier):
method _mod_init (line 624) | def _mod_init(self, *params):
method mode_CUT (line 643) | def mode_CUT(self, x, y, range):
method mode_ROUND (line 656) | def mode_ROUND(self, x, y, range):
method mode_LINEAR (line 676) | def mode_LINEAR(self, x, y, range):
method mode_MINIMUM (line 697) | def mode_MINIMUM(self, x, y, range):
method _convert_trigger_stick_range (line 718) | def _convert_trigger_stick_range(self, position, trigger_range):
method _convert_stick_trigger_range (line 725) | def _convert_stick_trigger_range(self, position):
method decode (line 733) | def decode(data, a, *b):
method compress (line 742) | def compress(self):
method strip (line 758) | def strip(self):
method __str__ (line 762) | def __str__(self):
method describe (line 768) | def describe(self, context):
method to_string (line 776) | def to_string(self, multiline=False, pad=0):
method trigger (line 788) | def trigger(self, mapper, position, old_position):
method axis (line 803) | def axis(self, mapper, position, what):
method pad (line 808) | def pad(self, mapper, position, what):
method whole (line 813) | def whole(self, mapper, x, y, what):
method gyro (line 818) | def gyro(self, mapper, pitch, yaw, roll, q1, q2, q3, q4):
class ModeModifier (line 822) | class ModeModifier(Modifier):
method __init__ (line 829) | def __init__(self, *stuff):
method make_checks (line 871) | def make_checks(self):
method get_child_actions (line 885) | def get_child_actions(self):
method decode (line 893) | def decode(data, a, parser, *b):
method get_compatible_modifiers (line 906) | def get_compatible_modifiers(self):
method strip (line 915) | def strip(self):
method compress (line 925) | def compress(self):
method __str__ (line 934) | def __str__(self):
method describe (line 945) | def describe(self, context):
method to_string (line 954) | def to_string(self, multiline=False, pad=0):
method cancel (line 983) | def cancel(self, mapper):
method select (line 989) | def select(self, mapper):
method select_w_check (line 999) | def select_w_check(self, mapper):
method make_button_check (line 1010) | def make_button_check(button):
method make_shell_check (line 1019) | def make_shell_check(c):
method button_press (line 1031) | def button_press(self, mapper):
method check_shell_commands (line 1049) | def check_shell_commands(self, mapper):
method kill_shell_commands (line 1068) | def kill_shell_commands(self):
method button_release (line 1076) | def button_release(self, mapper):
method trigger (line 1083) | def trigger(self, mapper, position, old_position):
method axis (line 1095) | def axis(self, mapper, position, what):
method gyro (line 1099) | def gyro(self, mapper, pitch, yaw, roll, *q):
method pad (line 1108) | def pad(self, mapper, position, what):
method whole (line 1112) | def whole(self, mapper, x, y, what):
class DoubleclickModifier (line 1142) | class DoubleclickModifier(Modifier, HapticEnabledAction):
method __init__ (line 1148) | def __init__(self, doubleclickaction, normalaction=None, time=None):
method get_child_actions (line 1161) | def get_child_actions(self):
method decode (line 1166) | def decode(data, a, parser, *b):
method strip (line 1174) | def strip(self):
method compress (line 1180) | def compress(self):
method __str__ (line 1196) | def __str__(self):
method describe (line 1206) | def describe(self, context):
method to_string (line 1217) | def to_string(self, multiline=False, pad=0):
method button_press (line 1255) | def button_press(self, mapper):
method button_release (line 1268) | def button_release(self, mapper):
method on_timeout (line 1283) | def on_timeout(self, mapper, *a):
class HoldModifier (line 1298) | class HoldModifier(DoubleclickModifier):
method __init__ (line 1305) | def __init__(self, holdaction, normalaction=None, time=None):
method decode (line 1311) | def decode(data, a, parser, *b):
method compress (line 1331) | def compress(self):
class SensitivityModifier (line 1347) | class SensitivityModifier(Modifier):
method _mod_init (line 1359) | def _mod_init(self, *speeds):
method decode (line 1379) | def decode(data, a, *b):
method strip (line 1388) | def strip(self):
method compress (line 1392) | def compress(self):
method describe (line 1396) | def describe(self, context):
method to_string (line 1401) | def to_string(self, multiline=False, pad=0):
method __str__ (line 1408) | def __str__(self):
class FeedbackModifier (line 1412) | class FeedbackModifier(Modifier):
method _mod_init (line 1423) | def _mod_init(self, position, amplitude=512, frequency=4, period=1024,...
method decode (line 1438) | def decode(data, a, *b):
method describe (line 1446) | def describe(self, context):
method to_string (line 1451) | def to_string(self, multiline=False, pad=0):
method __str__ (line 1455) | def __str__(self):
method strip (line 1459) | def strip(self):
method compress (line 1463) | def compress(self):
class RotateInputModifier (line 1467) | class RotateInputModifier(Modifier):
method _mod_init (line 1471) | def _mod_init(self, angle):
method decode (line 1476) | def decode(data, a, *b):
method describe (line 1480) | def describe(self, context):
method to_string (line 1485) | def to_string(self, multiline=False, pad=0):
method strip (line 1489) | def strip(self):
method compress (line 1493) | def compress(self):
method whole (line 1502) | def whole(self, mapper, x, y, what):
class SmoothModifier (line 1509) | class SmoothModifier(Modifier):
method _mod_init (line 1516) | def _mod_init(self, level=8, multiplier=0.75, filter=2.0):
method __str__ (line 1529) | def __str__(self):
method describe (line 1533) | def describe(self, context):
method decode (line 1539) | def decode(data, a, *b):
method _get_pos (line 1544) | def _get_pos(self):
method whole (line 1551) | def whole(self, mapper, x, y, what):
class CircularModifier (line 1579) | class CircularModifier(Modifier, HapticEnabledAction):
method __init__ (line 1587) | def __init__(self, *params):
method _mod_init (line 1596) | def _mod_init(self):
method set_haptic (line 1601) | def set_haptic(self, hd):
method get_haptic (line 1608) | def get_haptic(self):
method decode (line 1616) | def decode(data, a, *b):
method describe (line 1620) | def describe(self, context):
method set_speed (line 1625) | def set_speed(self, x, *a):
method get_speed (line 1629) | def get_speed(self):
method get_compatible_modifiers (line 1633) | def get_compatible_modifiers(self):
method whole (line 1638) | def whole(self, mapper, x, y, what):
class CircularAbsModifier (line 1681) | class CircularAbsModifier(Modifier, WholeHapticAction):
method __init__ (line 1689) | def __init__(self, *params):
method _mod_init (line 1694) | def _mod_init(self):
method decode (line 1700) | def decode(data, a, *b):
method describe (line 1704) | def describe(self, context):
method set_speed (line 1709) | def set_speed(self, x, *a):
method get_speed (line 1713) | def get_speed(self):
method get_compatible_modifiers (line 1717) | def get_compatible_modifiers(self):
method whole (line 1722) | def whole(self, mapper, x, y, what):
FILE: scc/osd/__init__.py
class OSDWindow (line 22) | class OSDWindow(Gtk.Window):
method __init__ (line 40) | def __init__(self, wmclass, layer = None):
method _apply_css (line 78) | def _apply_css(config):
method _add_arguments (line 115) | def _add_arguments(self):
method choose_controller (line 129) | def choose_controller(self, daemonmanager):
method get_controller (line 141) | def get_controller(self):
method parse_argumets (line 146) | def parse_argumets(self, argv):
method make_window_clicktrough (line 162) | def make_window_clicktrough(self):
method get_active_screen_geometry (line 174) | def get_active_screen_geometry(self):
method compute_position (line 188) | def compute_position(self):
method get_window_size (line 206) | def get_window_size(self):
method show (line 210) | def show(self):
method on_controller_lost (line 240) | def on_controller_lost(self, *a):
method on_daemon_died (line 245) | def on_daemon_died(self, *a):
method on_failed_to_lock (line 250) | def on_failed_to_lock(self, error):
method get_exit_code (line 255) | def get_exit_code(self):
method run (line 259) | def run(self):
method quit (line 265) | def quit(self, code=-1):
class OSDCssMagic (line 273) | class OSDCssMagic(dict):
method __init__ (line 285) | def __init__(self, dict_to_wrap):
method __getitem__ (line 289) | def __getitem__(self, a):
class StickController (line 315) | class StickController(GObject.GObject, TimerManager):
method __init__ (line 337) | def __init__(self):
method _move (line 343) | def _move(self, *a):
method set_stick (line 351) | def set_stick(self, *data):
function parse_rgba (line 369) | def parse_rgba(col):
FILE: scc/osd/area.py
class Area (line 24) | class Area(OSDWindow, TimerManager):
method __init__ (line 27) | def __init__(self):
method _add_arguments (line 34) | def _add_arguments(self):
method parse_argumets (line 42) | def parse_argumets(self, argv):
method compute_position (line 52) | def compute_position(self):
method show (line 58) | def show(self):
method update (line 65) | def update(self, x, y, width, height):
method make_hole (line 74) | def make_hole(self, border_width):
FILE: scc/osd/binding_display.py
class BindingDisplay (line 34) | class BindingDisplay(OSDWindow):
method __init__ (line 36) | def __init__(self, config=None):
method on_profile_changed (line 56) | def on_profile_changed(self, daemon, filename):
method use_daemon (line 61) | def use_daemon(self, d):
method _add_arguments (line 70) | def _add_arguments(self):
method compute_position (line 79) | def compute_position(self):
method parse_argumets (line 99) | def parse_argumets(self, argv):
method _cononect_handlers (line 106) | def _cononect_handlers(self):
method run (line 115) | def run(self):
method on_daemon_connected (line 121) | def on_daemon_connected(self, *a):
method quit (line 142) | def quit(self, code=-1):
method show (line 151) | def show(self, *a):
method on_event (line 162) | def on_event(self, daemon, what, data):
class Align (line 172) | class Align(IntEnum):
function find_image (line 179) | def find_image(name):
class Line (line 187) | class Line(object):
method __init__ (line 189) | def __init__(self, icon, text):
method get_size (line 194) | def get_size(self, gen):
method add_icon (line 199) | def add_icon(self, icon):
method to_string (line 204) | def to_string(self):
class LineCollection (line 208) | class LineCollection(object):
method __init__ (line 211) | def __init__(self, *lines):
method add_icon (line 215) | def add_icon(self, icon):
class Box (line 221) | class Box(object):
method __init__ (line 227) | def __init__(self, anchor_x, anchor_y, align, name,
method to_string (line 240) | def to_string(self):
method add (line 247) | def add(self, icon, context, action):
method calculate (line 307) | def calculate(self, gen):
method place (line 334) | def place(self, gen, root):
method place_marker (line 376) | def place_marker(self, gen, root):
class Generator (line 418) | class Generator(object):
method __init__ (line 421) | def __init__(self, editor, profile):
method equal_width (line 503) | def equal_width(self, *boxes):
method equal_height (line 513) | def equal_height(self, *boxes):
function main (line 522) | def main():
FILE: scc/osd/dialog.py
class Dialog (line 22) | class Dialog(OSDWindow):
method __init__ (line 31) | def __init__(self, cls="osd-menu"):
method create_parent (line 53) | def create_parent(self):
method pack_items (line 66) | def pack_items(self, parent, items):
method use_daemon (line 73) | def use_daemon(self, d):
method use_config (line 83) | def use_config(self, c):
method get_menuid (line 91) | def get_menuid(self):
method get_selected_item_id (line 96) | def get_selected_item_id(self):
method _add_arguments (line 105) | def _add_arguments(self):
method parse_argumets (line 121) | def parse_argumets(self, argv):
method generate_widget (line 155) | def generate_widget(self, item):
method select (line 168) | def select(self, index):
method _connect_handlers (line 183) | def _connect_handlers(self):
method run (line 191) | def run(self):
method show (line 197) | def show(self, *a):
method on_daemon_died (line 203) | def on_daemon_died(self, *a):
method on_failed_to_lock (line 208) | def on_failed_to_lock(self, error):
method on_daemon_connected (line 213) | def on_daemon_connected(self, *a):
method quit (line 235) | def quit(self, code=-2):
method next_item (line 244) | def next_item(self, direction):
method on_stick_direction (line 267) | def on_stick_direction(self, trash, x, y):
method on_event (line 272) | def on_event(self, daemon, what, data):
FILE: scc/osd/gesture_display.py
class GestureDisplay (line 24) | class GestureDisplay(OSDWindow):
method __init__ (line 46) | def __init__(self, config=None):
method setup_widgets (line 59) | def setup_widgets(self):
method use_daemon (line 75) | def use_daemon(self, d):
method use_config (line 84) | def use_config(self, c):
method _add_arguments (line 95) | def _add_arguments(self):
method parse_argumets (line 102) | def parse_argumets(self, argv):
method _connect_handlers (line 114) | def _connect_handlers(self):
method run (line 122) | def run(self):
method show (line 128) | def show(self, *a):
method on_daemon_connected (line 132) | def on_daemon_connected(self, *a):
method quit (line 154) | def quit(self, code=-2):
method on_event (line 163) | def on_event(self, daemon, what, data):
method get_gesture (line 172) | def get_gesture(self):
method _on_gesture_finished (line 180) | def _on_gesture_finished(self, detector, gesture):
function main (line 186) | def main():
function sigint (line 209) | def sigint(*a):
FILE: scc/osd/grid_menu.py
class GridMenu (line 21) | class GridMenu(Menu):
method __init__ (line 24) | def __init__(self, cls="osd-menu"):
method create_parent (line 29) | def create_parent(self):
method pack_items (line 35) | def pack_items(self, parent, items):
method on_stick_direction (line 51) | def on_stick_direction(self, trash, x, y):
method generate_widget (line 59) | def generate_widget(self, item):
FILE: scc/osd/hmenu.py
class HorizontalMenu (line 23) | class HorizontalMenu(GridMenu):
method __init__ (line 24) | def __init__(self, cls="osd-menu"):
method create_parent (line 28) | def create_parent(self):
method generate_widget (line 34) | def generate_widget(self, item):
method pack_items (line 49) | def pack_items(self, parent, items):
method on_stick_direction (line 56) | def on_stick_direction(self, trash, x, y):
method on_event (line 61) | def on_event(self, daemon, what, data):
FILE: scc/osd/inputdisplay.py
class InputDisplay (line 18) | class InputDisplay(OSDWindow):
method __init__ (line 23) | def __init__(self, imagepath="/usr/share/scc/images"):
method show (line 33) | def show(self):
method run (line 58) | def run(self):
method use_daemon (line 64) | def use_daemon(self, d):
method _connect_handlers (line 74) | def _connect_handlers(self):
method on_daemon_connected (line 82) | def on_daemon_connected(self, *a):
method on_observe_failed (line 93) | def on_observe_failed(self, error):
method on_daemon_event_observer (line 103) | def on_daemon_event_observer(self, daemon, what, data):
method _update_background (line 151) | def _update_background(self):
function sigint (line 160) | def sigint(*a):
FILE: scc/osd/keyboard.py
class KeyboardImage (line 50) | class KeyboardImage(Gtk.DrawingArea):
method __init__ (line 56) | def __init__(self, image):
method hilight (line 99) | def hilight(self, hilight, pressed):
method set_help (line 105) | def set_help(self, left, right):
method set_labels (line 110) | def set_labels(self, labels):
method get_limit (line 121) | def get_limit(self, id):
method increase_contrast (line 133) | def increase_contrast(buf):
method get_button_image (line 162) | def get_button_image(self, x, size):
method on_draw (line 179) | def on_draw(self, self2, ctx):
method on_size_allocate (line 267) | def on_size_allocate(self, *a):
class Button (line 271) | class Button:
method __init__ (line 273) | def __init__(self, tree, area):
method __iter__ (line 282) | def __iter__(self):
class Keyboard (line 286) | class Keyboard(OSDWindow, TimerManager):
method __init__ (line 304) | def __init__(self, config=None):
method _create_background (line 346) | def _create_background(self):
method _pack (line 357) | def _pack(self):
method recolor (line 366) | def recolor(self):
method use_daemon (line 378) | def use_daemon(self, d):
method on_keymap_state_changed (line 387) | def on_keymap_state_changed(self, x11keymap):
method set_help (line 392) | def set_help(self):
method update_labels (line 447) | def update_labels(self):
method _add_arguments (line 470) | def _add_arguments(self):
method parse_argumets (line 476) | def parse_argumets(self, argv):
method _cononect_handlers (line 482) | def _cononect_handlers(self):
method run (line 491) | def run(self):
method load_profile (line 497) | def load_profile(self):
method on_reconfigured (line 502) | def on_reconfigured(self, *a):
method on_daemon_connected (line 507) | def on_daemon_connected(self, *a):
method quit (line 553) | def quit(self, code=-1):
method show (line 563) | def show(self, *a):
method on_event (line 577) | def on_event(self, daemon, what, data):
method on_sa_close (line 589) | def on_sa_close(self, *a):
method on_sa_cursor (line 594) | def on_sa_cursor(self, mapper, action, x, y):
method on_sa_move (line 601) | def on_sa_move(self, mapper, action, x, y):
method on_sa_press (line 607) | def on_sa_press(self, mapper, action, pressed):
method set_cursor_position (line 611) | def set_cursor_position(self, x, y, cursor, limit):
method update_background (line 651) | def update_background(self, *whatever):
method _move_window (line 661) | def _move_window(self, *a):
method key_from_cursor (line 674) | def key_from_cursor(self, cursor, pressed):
function main (line 700) | def main():
function sigint (line 718) | def sigint(*a):
FILE: scc/osd/launcher.py
class Launcher (line 26) | class Launcher(OSDWindow):
method __init__ (line 49) | def __init__(self, cls="osd-menu"):
method name_to_keys (line 95) | def name_to_keys(appinfo):
method string_to_keys_and_spaces (line 105) | def string_to_keys_and_spaces(string):
method create_parent (line 113) | def create_parent(self):
method create_app_list (line 121) | def create_app_list(self):
method create_buttons (line 132) | def create_buttons(self):
method pack_items (line 157) | def pack_items(self, parent, items):
method use_daemon (line 164) | def use_daemon(self, d):
method use_config (line 174) | def use_config(self, c):
method get_menuid (line 182) | def get_menuid(self):
method get_selected_item_id (line 189) | def get_selected_item_id(self):
method _launch (line 196) | def _launch(self):
method _add_arguments (line 200) | def _add_arguments(self):
method parse_argumets (line 212) | def parse_argumets(self, argv):
method _set_launchers (line 226) | def _set_launchers(self, launchers):
method _format_label_markup (line 242) | def _format_label_markup(self, label):
method _update_items (line 279) | def _update_items(self):
Condensed preview — 275 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,855K chars).
[
{
"path": ".github/workflows/appimage.yml",
"chars": 2588,
"preview": "name: Build and publish AppImages\n\non:\n push:\n tags:\n - \"v*\"\n\nenv:\n BASE_OS: ubuntu\n APT_PUBKEY: 871920D1991B"
},
{
"path": ".github/workflows/scc-linux.yml",
"chars": 470,
"preview": "name: SCC Linux CI\n\non:\n push:\n branches:\n - main\n - master\n - python3\n pull_request:\n branches:\n - "
},
{
"path": "ADDITIONAL-LICENSES",
"chars": 887,
"preview": "All images in images/ directory, profile files in default_profiles/\nand profile_examples/ and menu files in default_menu"
},
{
"path": "AppImageBuilder.yml",
"chars": 5184,
"preview": "version: 1\n\nscript:\n- |\n if [ \"{{APPIMAGE_SOURCE}}\" != \"${TARGET_APPDIR}\" ]; then\n mv \"{{APPIMAGE_SOURCE}}\" \"${TARGE"
},
{
"path": "Dockerfile",
"chars": 1791,
"preview": "ARG BASE_OS=ubuntu\nARG BASE_CODENAME=jammy\nFROM $BASE_OS:$BASE_CODENAME AS build-stage\n\n# Download build dependencies\nRU"
},
{
"path": "LICENSE",
"chars": 15218,
"preview": "GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundati"
},
{
"path": "README.md",
"chars": 3464,
"preview": "# SC Controller [](https://travis-ci.org/koz"
},
{
"path": "TODO.md",
"chars": 1014,
"preview": "List of (possibly) planned features in no particular order:\n\n- Multiple on-screen menus (and possibly keyboards) when us"
},
{
"path": "appimage-build.sh",
"chars": 7270,
"preview": "#!/bin/bash\nAPP=\"sc-controller\"\nEXEC=\"scc\"\nLIB=\"lib\"\n\nEVDEV_VERSION=0.7.0\n[ x\"$BUILD_APPDIR\" == \"x\" ] && BUILD_APPDIR=$("
},
{
"path": "daemon.sh",
"chars": 313,
"preview": "#!/bin/bash\n\n# Ensure correct cwd\ncd \"$(dirname \"$0\")\"\n\n# Set PATH\nSCRIPTS=\"$(pwd)/scripts\"\nexport PATH=\"$SCRIPTS\":\"$PAT"
},
{
"path": "default_menus/Default.menu",
"chars": 608,
"preview": "[{\n \"separator\": true,\n \"name\": \"Recent profiles\"\n}, {\n \"generator\": \"recent\",\n \"rows\": 3\n}, {\n \"submenu\""
},
{
"path": "default_menus/Profiles.menu",
"chars": 90,
"preview": "[{\n \"separator\": true,\n \"name\": \"All profiles\"\n}, {\n \"generator\" : \"profiles\"\n}]\n"
},
{
"path": "default_profiles/Desktop.sccprofile",
"chars": 1566,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"button(Keys.KEY_ENTER)\"\n }, \n \"B\": "
},
{
"path": "default_profiles/XBox Controller with High Precision Camera.sccprofile",
"chars": 1646,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"button(Keys.BTN_GAMEPAD)\"\n }, \n \"B\""
},
{
"path": "default_profiles/XBox Controller.sccprofile",
"chars": 1689,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"button(Keys.BTN_GAMEPAD)\"\n }, \n \"B\""
},
{
"path": "docs/actions.md",
"chars": 21670,
"preview": "### In this document\n- [Custom Action page](#examples1)\n- [List of all known actions](#actions)\n- [Macros and operators]"
},
{
"path": "docs/menu-file.md",
"chars": 2324,
"preview": "SC-Controller menu file specification\r\n----------------------------------------\r\n\r\nMenu file contains json-encoded list "
},
{
"path": "docs/profile-file.md",
"chars": 8820,
"preview": "SC-Controller profile file specification\n----------------------------------------\n\nProfile file contains json-encoded di"
},
{
"path": "docs/protocol.md",
"chars": 10269,
"preview": "SCCDaemon Protocol specification\n--------------------------------\n\nTo control running daemon instance, unix socket in us"
},
{
"path": "gamecontrollerdb.txt",
"chars": 101178,
"preview": "# Game Controller DB for SDL in 2.0.9 format\n# Source: https://github.com/gabomdq/SDL_GameControllerDB\n\n# Linux\n03000000"
},
{
"path": "generate-icons.py",
"chars": 2786,
"preview": "#!/usr/bin/env python2\n# Used to generate some icons\n# Requires inkscape and imagemagick pacages\n\nimport os, subprocess,"
},
{
"path": "generate_svg.py",
"chars": 10544,
"preview": "#!/usr/bin/env python2\nfrom scc.tools import _\n\nfrom scc.actions import Action, DPadAction, XYAction, MouseAction\nfrom s"
},
{
"path": "glade/about.glade",
"chars": 7720,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.4 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/action_editor.glade",
"chars": 81309,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.4 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/axis.glade",
"chars": 1063,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/axis_action.glade",
"chars": 35702,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.4 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/buttons.glade",
"chars": 7530,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.4 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/custom.glade",
"chars": 2153,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/dpad.glade",
"chars": 53073,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.4 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/first_page.glade",
"chars": 1034,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/gesture.glade",
"chars": 17339,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.4 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/gyro.glade",
"chars": 16135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/gyro_action.glade",
"chars": 11740,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.4 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/menu_only.glade",
"chars": 5125,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.4 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/osk_action.glade",
"chars": 3398,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/per_axis.glade",
"chars": 5267,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/recent_list.glade",
"chars": 1954,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/special_action.glade",
"chars": 42502,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.4 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/tilt.glade",
"chars": 10041,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.22.1 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ae/trigger.glade",
"chars": 24384,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.36.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/app.glade",
"chars": 76823,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.4 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/controller_settings.glade",
"chars": 30888,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.4 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/creg.glade",
"chars": 51395,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/global_settings.glade",
"chars": 136041,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.38.2 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/icon_chooser.glade",
"chars": 9632,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/import_export.glade",
"chars": 63242,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/key_grabber.glade",
"chars": 9743,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/macro_editor.glade",
"chars": 13481,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/menu_editor.glade",
"chars": 24707,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.2 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/modeshift_editor.glade",
"chars": 36290,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/osk_binding_editor.glade",
"chars": 15530,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/ring_editor.glade",
"chars": 16808,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "glade/simple_chooser.glade",
"chars": 917,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.20.0 -->\n<interface>\n <requires lib=\"gtk+\" version=\""
},
{
"path": "images/button-images/groups.json",
"chars": 617,
"preview": "[\n{\n\t\"key\" : \"sc\",\n\t\"type\" : \"buttons\",\n\t\"buttons\" : [ \"A\", \"B\", \"X\", \"Y\", \"BACK\", \"C\", \"START\",\n\t\t\t\"LB\", \"RB\", \"LT\", \"R"
},
{
"path": "images/deck.config.json",
"chars": 590,
"preview": "{\n\t\"gui\": {\n\t\t\"background\": \"deck\",\n\t\t\"buttons\": [\n\t\t\t\"A\", \"B\", \"X\", \"Y\", \"VIEW\", \"ELIPSE\", \"MENU\", \"LB\", \"RB\", \"LT\", \"R"
},
{
"path": "images/ds4-config.json",
"chars": 531,
"preview": "{\n\t\"gui\": {\n\t\t\"background\": \"ds4\",\n\t\t\"buttons\": [\n\t\t\t\"CROSS\", \"CIRCLE\", \"SQUARE\", \"TRIANGLE\", \"ds4SHARE\",\n\t\t\t\"C\", \"ds4SH"
},
{
"path": "images/ds5-config.json",
"chars": 532,
"preview": "{\n\t\"gui\": {\n\t\t\"background\": \"ds5\",\n\t\t\"buttons\": [\n\t\t\t\"CROSS\", \"CIRCLE\", \"SQUARE\", \"TRIANGLE\", \"ds5SELECT\",\n\t\t\t\"C\", \"ds5S"
},
{
"path": "images/keyboard.svg.json",
"chars": 177,
"preview": "{\n\t\"colors\" : {\n\t\t\"button1\" : \"162082\",\n\t\t\"button1_border\" : \"262b5e\",\n\t\t\"button2\" : \"162d44\",\n\t\t\"button2_border\" : \"273"
},
{
"path": "images/menu-icons/buttons/LICENCES",
"chars": 113,
"preview": "All images in this specific directory are licensed under CC0, https://creativecommons.org/publicdomain/zero/1.0/\n"
},
{
"path": "images/menu-icons/driving/LICENCES",
"chars": 726,
"preview": "Icons provided on http://opengameart.org and http://game-icons.net/ under\nthe Creative Commons 3.0 BY\n\nList of icons and"
},
{
"path": "images/menu-icons/items/LICENCES",
"chars": 586,
"preview": "Icons provided on http://opengameart.org and http://game-icons.net/ under\nthe Creative Commons 3.0 BY\n\nList of icons and"
},
{
"path": "images/menu-icons/media/LICENCES",
"chars": 370,
"preview": "Icons under the CC0, https://creativecommons.org/publicdomain/zero/1.0/\n\nList of icons and contributors:\n\nmute.bw.png\t\t\t"
},
{
"path": "images/menu-icons/system/LICENCES",
"chars": 718,
"preview": "Icons provided on http://game-icons.net under the Creative Commons 3.0 BY\n\nList of icons and contributors:\n\nkeyboard.bw."
},
{
"path": "images/menu-icons/weapons/LICENCES",
"chars": 1003,
"preview": "Icons provided on http://game-icons.net under the Creative Commons 3.0 BY\n\nList of icons and contributors:\n\nbow-arrow.bw"
},
{
"path": "images/radial-menu.svg.json",
"chars": 159,
"preview": "{\n\t\"colors\" : {\n\t\t\"text\": \"00ff00\",\n\t\t\"border\" : \"00ff00\",\n\t\t\"background\" : \"000093\",\n\t\t\"menuitem_border\": \"00005a\",\n\t\t\""
},
{
"path": "images/remotepad.json",
"chars": 530,
"preview": "{\n\t\"gui\": {\n\t\t\"background\": \"remotepad\",\n\t\t\"no_buttons_in_gui\": true,\n\t\t\"buttons\": [\n\t\t\t\"A\", \"B\", \"X\", \"Y\", \"RECTANGLE\","
},
{
"path": "images/sc-config.json",
"chars": 436,
"preview": "{\n\t\"_ \" : \"Currently, this file is used only when changing controller image\",\n\t\"__\" : \"manually from context menu\",\n\n\t\"g"
},
{
"path": "images/x360-config.json",
"chars": 439,
"preview": "{\n\t\"_ \" : \"Currently, this file is used only when changing controller image\",\n\t\"__\" : \"manually from context menu\",\n\n\t\"g"
},
{
"path": "osd-styles/Blue.colors.json",
"chars": 536,
"preview": "{\n\t\"###\" : \"Colors used by OSD\",\n\t\"osd_colors\": {\n\t\t\"background\": \"101010\",\n\t\t\"border\": \"0000DF\",\n\t\t\"text\": \"4060FF\",\n\t\t"
},
{
"path": "osd-styles/Classic.gtkstyle.css",
"chars": 2790,
"preview": "/* Used colors: all */\n\n#osd-message, #osd-message-1, #osd-menu, #osd-menu-inactive, #osd-gesture, #osd-keyboard {\n\tback"
},
{
"path": "osd-styles/Cyan.colors.json",
"chars": 536,
"preview": "{\n\t\"###\" : \"Colors used by OSD\",\n\t\"osd_colors\": {\n\t\t\"background\": \"101010\",\n\t\t\"border\": \"00DFDF\",\n\t\t\"text\": \"40F0FF\",\n\t\t"
},
{
"path": "osd-styles/Green.colors.json",
"chars": 580,
"preview": "{\n\t\"####\" : \"This is default color scheme\",\n\t\n\t\"###\" : \"Colors used by OSD\",\n\t\"osd_colors\": {\n\t\t\"background\": \"101010\",\n"
},
{
"path": "osd-styles/Red.colors.json",
"chars": 536,
"preview": "{\n\t\"###\" : \"Colors used by OSD\",\n\t\"osd_colors\": {\n\t\t\"background\": \"101010\",\n\t\t\"border\": \"DF0000\",\n\t\t\"text\": \"FF2020\",\n\t\t"
},
{
"path": "osd-styles/Reloaded.gtkstyle.css",
"chars": 2902,
"preview": "/* Used colors: background text menuseparator osk_text osk_button1 osk_button1_border osk_hilight osk_pressed */\n\n#osd-m"
},
{
"path": "osd-styles/Yellow.colors.json",
"chars": 536,
"preview": "{\n\t\"###\" : \"Colors used by OSD\",\n\t\"osd_colors\": {\n\t\t\"background\": \"101010\",\n\t\t\"border\": \"FFFF00\",\n\t\t\"text\": \"BFBF24\",\n\t\t"
},
{
"path": "profile_examples/DeSmuME.sccprofile",
"chars": 2806,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"button(Keys.BTN_EAST)\", \n \"name\": \"A\"\n"
},
{
"path": "profile_examples/DiRT Rally.sccprofile",
"chars": 2313,
"preview": "{\n \"_\": [\"For best results Steering Linearity, Steering Deadzone, Throttle Deadzone and\", \"Brake Deadzone should be s"
},
{
"path": "profile_examples/GZDoom.sccprofile",
"chars": 3710,
"preview": "{\n \"_\": [\"Please, note that GZDoom doesn't have keys for Jump and Crouch bound\", \"by default, so you may need to do s"
},
{
"path": "profile_examples/Kodi.sccprofile",
"chars": 2072,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"button(Keys.KEY_ENTER)\"\n }, \n \"B\": "
},
{
"path": "profile_examples/No Man Sky.sccprofile",
"chars": 2280,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"button(Keys.KEY_SPACE)\", \n \"name\": \"Ju"
},
{
"path": "profile_examples/Portal 2 coop.sccprofile",
"chars": 1997,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"mode(RT, button(Keys.KEY_KPMINUS), button(Keys.KE"
},
{
"path": "profile_examples/Portal 2.sccprofile",
"chars": 2424,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"button(Keys.KEY_SPACE)\", \n \"name\": \"Ju"
},
{
"path": "profile_examples/README.md",
"chars": 52,
"preview": "Drag and drop link on main window to import profile."
},
{
"path": "profile_examples/Stardew Valley.sccprofile",
"chars": 2808,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"button(Keys.BTN_GAMEPAD)\", \n \"name\": \""
},
{
"path": "profile_examples/Tomb Raider 2013.sccprofile",
"chars": 2449,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"mode(LGRIP, name('Mash left/right', repeat(button"
},
{
"path": "profile_examples/Undertale.sccprofile",
"chars": 1085,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"button(Keys.KEY_ENTER)\", \n \"name\": \"Co"
},
{
"path": "profile_examples/Vanguard Princess.sccprofile",
"chars": 2377,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"button(Keys.BTN_GAMEPAD)\", \n \"name\": \""
},
{
"path": "profile_examples/firefox.sccprofile",
"chars": 2282,
"preview": "{\n \"_\": \"\", \n \"buttons\": {\n \"A\": {\n \"action\": \"button(Keys.KEY_ENTER)\"\n }, \n \"B\": "
},
{
"path": "run.sh",
"chars": 1668,
"preview": "#!/bin/bash\nC_MODULES=(uinput hiddrv sc_by_bt remotepad cemuhook)\nC_VERSION_uinput=9\nC_VERSION_hiddrv=5\nC_VERSION_sc_by_"
},
{
"path": "scc/__init__.py",
"chars": 694,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller\nCopyright (C) 2018 Kozec\n\nThis program is free software; you can redistribute i"
},
{
"path": "scc/actions.py",
"chars": 80527,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC Controller - Actions\n\nAction describes what should be done when event from physical contro"
},
{
"path": "scc/aliases.py",
"chars": 1120,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Aliases\n\nThis module generates Keys.BTN_x and Axes.AXIS_x aliases when import"
},
{
"path": "scc/c_branch.h",
"chars": 942,
"preview": "/**\n * Glue between code from future and current stuff in python\n */\n#pragma once\n#include \"Python.h\"\n#include <stdbool."
},
{
"path": "scc/cemuhook_server.c",
"chars": 10378,
"preview": "/**\n * SC-Controller - Daemon - CemuHookUDP motion provider\n *\n * Accepts all connections from clients and sends data ca"
},
{
"path": "scc/cemuhook_server.py",
"chars": 2587,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Daemon - CemuHookUDP motion provider\n\nAccepts all connections from clients an"
},
{
"path": "scc/cheader.py",
"chars": 4701,
"preview": "#!/usr/bin/env python\n\n# The MIT License (MIT)\n#\n# Copyright (c) 2015 Stany MARCEL <stanypub@gmail.com>\n#\n# Permission i"
},
{
"path": "scc/config.py",
"chars": 6991,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Config\n\nHandles loading, storing and querying config file\n\"\"\"\nfrom __future__"
},
{
"path": "scc/constants.py",
"chars": 5298,
"preview": "#!/usr/bin/env python\n\n# The MIT License (MIT)\n#\n# Copyright (c) 2015 Stany MARCEL <stanypub@gmail.com>\n#\n# Permission i"
},
{
"path": "scc/controller.py",
"chars": 4147,
"preview": "#!/usr/bin/env python2\nfrom scc.constants import HapticPos\nimport time\nimport logging\n\nlog = logging.getLogger(\"SCContro"
},
{
"path": "scc/custom.py",
"chars": 1067,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Custom module loader\n\nLoads ~/.config/scc/custom.py, if present. This allows "
},
{
"path": "scc/device_monitor.py",
"chars": 8724,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Device Monitor\n\nExtends eudevmonitor with options to register callbacks and\nm"
},
{
"path": "scc/drivers/__init__.py",
"chars": 715,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller goes through all modules in scc.drivers package and calls\ninit(daemon) methods "
},
{
"path": "scc/drivers/ds4drv.py",
"chars": 13932,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC Controller - Dualshock 4 Driver\n\nExtends HID driver with DS4-specific options.\n\"\"\"\n\nfrom s"
},
{
"path": "scc/drivers/ds5drv.py",
"chars": 47201,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC Controller - DualSense driver\n\nExtends HID driver with DS5-specific options.\n\"\"\"\n\nimport c"
},
{
"path": "scc/drivers/evdevdrv.py",
"chars": 16010,
"preview": "\"\"\"\nUniversal driver for gamepads managed by evdev.\n\nHandles no devices by default. Instead of trying to guess which evd"
},
{
"path": "scc/drivers/fake.py",
"chars": 1064,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC Controller - Fake controller driver\n\nThis driver does nothing by default, unless SCC_FAKES"
},
{
"path": "scc/drivers/hiddrv.c",
"chars": 6978,
"preview": "#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#include <inttypes.h>\n#include <stdbool.h>\n#include <limits.h>\n#define CLAM"
},
{
"path": "scc/drivers/hiddrv.py",
"chars": 19956,
"preview": "#!/usr/bin/env python3\n\"\"\"\nSC Controller - Universal HID driver. For all three universal HID devices.\n\nBorrows bit of co"
},
{
"path": "scc/drivers/remotepad.h",
"chars": 1703,
"preview": "/**\n * SC Controller - remotepad driver\n *\n * This is implementation or protocol used by Retroarch's Remote RetroPad cor"
},
{
"path": "scc/drivers/remotepad.py",
"chars": 4135,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC Controller - remotepad driver\n\nThis is implementation or protocol used by Retroarch's Remo"
},
{
"path": "scc/drivers/remotepad_controller.c",
"chars": 3288,
"preview": "/**\n * SC Controller - remotepad driver\n *\n * This is implementation or protocol used by Retroarch's Remote RetroPad cor"
},
{
"path": "scc/drivers/sc_by_bt.c",
"chars": 6645,
"preview": "#define PY_SSIZE_T_CLEAN\n#include <Python.h>\n#include <inttypes.h>\n#include <stdbool.h>\n#include <limits.h>\n\n#define SC_"
},
{
"path": "scc/drivers/sc_by_bt.py",
"chars": 9834,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC Controller - Steam Controller Driver\n\nDriver for Steam Controller over bluetooth (evdev)\n\n"
},
{
"path": "scc/drivers/sc_by_cable.py",
"chars": 2496,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC Controller - Steam Controller Driver\n\nCalled and used when single Steam Controller is conn"
},
{
"path": "scc/drivers/sc_dongle.py",
"chars": 11858,
"preview": "#!/usr/bin/env python3\n\"\"\"\nSC Controller - Steam Controller Wireless Receiver (aka Dongle) Driver\n\nCalled and used when "
},
{
"path": "scc/drivers/scc_future.h",
"chars": 2793,
"preview": "#pragma once\n#include <stdint.h>\n\ntypedef struct ControllerInput ControllerInput;\n\ntypedef uint16_t Axis;\ntypedef uint16"
},
{
"path": "scc/drivers/steamdeck.py",
"chars": 8208,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSCC - Steam Deck Driver\n\nBased on sc_by_cable and steamdeck.c\n\nDeck uses slightly different p"
},
{
"path": "scc/drivers/usb.py",
"chars": 9421,
"preview": "\"\"\"\nCommon code for all (one) USB-based drivers.\n\nDriver that uses USB has to call\nregister_hotplug_device(callback, ven"
},
{
"path": "scc/foreign/__init__.py",
"chars": 28,
"preview": "#!/usr/bin/env python2\n\npass"
},
{
"path": "scc/foreign/vdf.py",
"chars": 20246,
"preview": "#!/usr/bin/env python2\n\"\"\"\nImports VDF profile and converts it to Profile object.\n\"\"\"\nfrom scc.uinput import Keys, Axes,"
},
{
"path": "scc/foreign/vdffz.py",
"chars": 647,
"preview": "#!/usr/bin/env python2\n\"\"\"\nImports VDFFZ profile and converts it to Profile object.\nVDFFZ is just VDF encapsulated in js"
},
{
"path": "scc/gestures.py",
"chars": 3193,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Gestures\n\nEverything related to non-GUI part of gesture detection lies here.\n"
},
{
"path": "scc/gui/__init__.py",
"chars": 325,
"preview": "#!/usr/bin/env python2\nfrom scc.constants import SCButtons\n\nBUTTON_ORDER = (\n\tSCButtons.A, SCButtons.B, SCButtons.X, SCB"
},
{
"path": "scc/gui/aboutdialog.py",
"chars": 1071,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - About dialog\n\"\"\"\nfrom __future__ import unicode_literals\nfrom scc.tools impor"
},
{
"path": "scc/gui/action_editor.py",
"chars": 38559,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor\n\nAlso doubles as Menu Item Editor in some cases\n\"\"\"\nfrom __futu"
},
{
"path": "scc/gui/ae/__init__.py",
"chars": 2582,
"preview": "#!/usr/bin/env python2\n\"\"\" ae - Action Editor components \"\"\"\nfrom __future__ import unicode_literals\nfrom scc.tools impo"
},
{
"path": "scc/gui/ae/axis.py",
"chars": 2069,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Axis Component\n\nHandles specific XYActions\n\"\"\"\nfrom __future_"
},
{
"path": "scc/gui/ae/axis_action.py",
"chars": 18838,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Axis Component\n\nAssigns emulated axis to trigger\n\"\"\"\nfrom __f"
},
{
"path": "scc/gui/ae/buttons.py",
"chars": 6323,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Button Component\n\nAssigns emulated button to physical button\n"
},
{
"path": "scc/gui/ae/custom.py",
"chars": 1885,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Custom action\n\nCustom Action page in Action Editor window\n\"\"\""
},
{
"path": "scc/gui/ae/dpad.py",
"chars": 7178,
"preview": "#!/usr/bin/env python2\n# -*- coding: utf-8 -*-\n\"\"\"\nSC-Controller - Action Editor - \"DPAD or Menu\"\n\nSetups DPAD emulation"
},
{
"path": "scc/gui/ae/first_page.py",
"chars": 4481,
"preview": "#!/usr/bin/env python2\n# -*- coding: utf-8 -*-\n\"\"\"\nSC-Controller - Action Editor - First Page\n\nProvides links for quick "
},
{
"path": "scc/gui/ae/gesture.py",
"chars": 10851,
"preview": "#!/usr/bin/env python2\n# coding=utf-8\n\"\"\"\nSC-Controller - Action Editor - Gesture Component\n\nHandles gesture recognition"
},
{
"path": "scc/gui/ae/gyro.py",
"chars": 5811,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Gyro -> Per Axis component\n\"\"\"\nfrom __future__ import unicode"
},
{
"path": "scc/gui/ae/gyro_action.py",
"chars": 10475,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Gyro -> Joystick or Mouse component\n\"\"\"\nfrom __future__ impor"
},
{
"path": "scc/gui/ae/menu_action.py",
"chars": 15816,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - common part of \"DPAD or menu\" and \"Special Action\",\ntwo compo"
},
{
"path": "scc/gui/ae/menu_only.py",
"chars": 1276,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Menu Only Component\n\nDisplays page that can edito only MenuAc"
},
{
"path": "scc/gui/ae/osk_action.py",
"chars": 2339,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - On Screen Keyboard Action Component\n\nAssigns actions from scc"
},
{
"path": "scc/gui/ae/osk_buttons.py",
"chars": 1040,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - OSK Button Component\n\nBinds controller buttons on on on on on"
},
{
"path": "scc/gui/ae/per_axis.py",
"chars": 1930,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Per-Axis Component\n\nHandles all XYActions\n\"\"\"\nfrom __future__"
},
{
"path": "scc/gui/ae/recent_list.py",
"chars": 938,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Recent List Component\n\nDisplays page that can edit settings f"
},
{
"path": "scc/gui/ae/special_action.py",
"chars": 7118,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Axis Component\n\nAssigns emulated axis to trigger\n\"\"\"\nfrom __f"
},
{
"path": "scc/gui/ae/tilt.py",
"chars": 2253,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Tilt\n\nSetups DPAD emulation or menu display\n\"\"\"\nfrom __future"
},
{
"path": "scc/gui/ae/trigger.py",
"chars": 9348,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor - Trigger-as-button Component\n\nAssigns one or two emulated butt"
},
{
"path": "scc/gui/app.py",
"chars": 56346,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - App\n\nMain application window\n\"\"\"\nfrom __future__ import unicode_literals\nfrom"
},
{
"path": "scc/gui/area_to_action.py",
"chars": 4179,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - AREA_TO_ACTION\n\nMaps areas on SVG images into actions.\nUsed by ActionEditor.\n"
},
{
"path": "scc/gui/binding_editor.py",
"chars": 6468,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - BindingEditor\n\nBase class for main application window and OSD Keyboard bindin"
},
{
"path": "scc/gui/chooser.py",
"chars": 2924,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor\n\nAllows to edit button or trigger action.\n\"\"\"\nfrom __future__ i"
},
{
"path": "scc/gui/controller_image.py",
"chars": 5987,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Controller Image\n\nBig, SVGWidget based widget with interchangeable controller"
},
{
"path": "scc/gui/controller_settings.py",
"chars": 7059,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Global Settings\n\nCurrently setups only one thing...\n\"\"\"\nfrom __future__ impor"
},
{
"path": "scc/gui/controller_widget.py",
"chars": 8922,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Controller Widget\n\nButton that user can click to choose emulated action for p"
},
{
"path": "scc/gui/creg/__init__.py",
"chars": 23,
"preview": "#!/usr/bin/env python2\n"
},
{
"path": "scc/gui/creg/constants.py",
"chars": 1509,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Controller Registration Constants\n\nJust huge chunk of constants put aside to "
},
{
"path": "scc/gui/creg/data.py",
"chars": 1995,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Controller Registration data\n\nDummy container classes\n\"\"\"\nfrom __future__ imp"
},
{
"path": "scc/gui/creg/dialog.py",
"chars": 25665,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Controller Registration\n\nDialog that asks a lot of question to create configu"
},
{
"path": "scc/gui/creg/grabs.py",
"chars": 5038,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Controller Registration - Grabs\n\nHelper classes for grabbing buttons and axes"
},
{
"path": "scc/gui/creg/tester.py",
"chars": 3363,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Controller Registration - Tester\n\nClass that interacts with `scc hid_test` an"
},
{
"path": "scc/gui/daemon_manager.py",
"chars": 16478,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - DaemonManager\n\nStarts, kills and controls sccdaemon instance.\n\nI'd call it Da"
},
{
"path": "scc/gui/dwsnc.py",
"chars": 2165,
"preview": "\"\"\"\nDWSNC - Doing Weird Things in Name of Compatibility\n\nThis module, when imported, applies various fixes and monkey-pa"
},
{
"path": "scc/gui/editor.py",
"chars": 4114,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor\n\nAllows to edit button or trigger action.\n\"\"\"\nfrom __future__ i"
},
{
"path": "scc/gui/gdk_to_key.py",
"chars": 5389,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - GDK_TO_KEY\n\nMaps Gdk.KEY_* constants into Keys.KEY_* constants.\nUsed by Actio"
},
{
"path": "scc/gui/gestures.py",
"chars": 2667,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Gesture-related GUI stuff.\n\"\"\"\nfrom __future__ import unicode_literals\nfrom s"
},
{
"path": "scc/gui/global_settings.py",
"chars": 29036,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Global Settings\n\nCurrently setups only one thing...\n\"\"\"\nfrom __future__ impor"
},
{
"path": "scc/gui/icon_chooser.py",
"chars": 6379,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Icon Chooser\n\"\"\"\nfrom __future__ import unicode_literals\nfrom scc.tools impor"
},
{
"path": "scc/gui/importexport/__init__.py",
"chars": 23,
"preview": "#!/usr/bin/env python2\n"
},
{
"path": "scc/gui/importexport/dialog.py",
"chars": 4851,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Import / Export Dialog\n\"\"\"\nfrom __future__ import unicode_literals\nfrom scc.t"
},
{
"path": "scc/gui/importexport/export.py",
"chars": 9526,
"preview": "#!/usr/bin/env python2\nfrom __future__ import unicode_literals\nfrom scc.tools import _\n\nfrom gi.repository import Gtk, G"
},
{
"path": "scc/gui/importexport/import_sccprofile.py",
"chars": 9357,
"preview": "#!/usr/bin/env python2\nfrom __future__ import unicode_literals\nfrom scc.tools import _\n\nfrom gi.repository import Gtk, G"
},
{
"path": "scc/gui/importexport/import_vdf.py",
"chars": 13931,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Global Settings\n\nCurrently setups only one thing...\n\"\"\"\nfrom __future__ impor"
},
{
"path": "scc/gui/key_grabber.py",
"chars": 4218,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor\n\nAllows to edit button or trigger action.\n\"\"\"\nfrom __future__ i"
},
{
"path": "scc/gui/keycode_to_key.py",
"chars": 326,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - KEYCODE_TO_KEY\n\nSimilar to GDK_TO_KEY, maps X11 keycodes to Keys.KEY_* consta"
},
{
"path": "scc/gui/macro_editor.py",
"chars": 11773,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor\n\nAllows to edit button or trigger action.\n\"\"\"\nfrom __future__ i"
},
{
"path": "scc/gui/menu_editor.py",
"chars": 13330,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Menu Editor\n\nEdits .menu files and menus stored in profile.\n\"\"\"\nfrom __future"
},
{
"path": "scc/gui/modeshift_editor.py",
"chars": 14328,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor\n\nAllows to edit button or trigger action.\n\"\"\"\nfrom __future__ i"
},
{
"path": "scc/gui/osd_mode.py",
"chars": 5972,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - OSD Mode Mapper\n\nVery special case of mapper used when main application is la"
},
{
"path": "scc/gui/osk_binding_editor.py",
"chars": 2301,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - On Screen Keyboard Binding Editor\n\nEdits '.scc-osd.keyboard.sccprofile', prof"
},
{
"path": "scc/gui/parser.py",
"chars": 1070,
"preview": "from __future__ import unicode_literals\nfrom scc.parser import ActionParser, ParseError\nfrom scc.actions import Action\nf"
},
{
"path": "scc/gui/profile_switcher.py",
"chars": 12864,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - ProfileSwitcher\n\nSet of widgets designed to allow user to select profile, pla"
},
{
"path": "scc/gui/ribar.py",
"chars": 4335,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - RIBar\n\nInfobar wrapped in Revealer, looks better than sounds.\n\"\"\"\nfrom __futu"
},
{
"path": "scc/gui/ring_editor.py",
"chars": 6168,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Action Editor\n\nAllows to edit button or trigger action.\n\"\"\"\nfrom __future__ i"
},
{
"path": "scc/gui/simple_chooser.py",
"chars": 1757,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Simple Chooser\n\nUsed by Action Editor to display window with just one Compone"
},
{
"path": "scc/gui/statusicon.py",
"chars": 11764,
"preview": "#!/usr/bin/env python2\n# -*- coding: utf-8 -*-\n\"\"\"\nSyncthing-GTK - StatusIcon\n\n\"\"\"\nfrom __future__ import unicode_litera"
},
{
"path": "scc/gui/svg_widget.py",
"chars": 19243,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Background\n\nChanges SVG on the fly and uptates that magnificent image on back"
},
{
"path": "scc/gui/userdata_manager.py",
"chars": 5236,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC-Controller - Profile Manager\n\nSimple class that manages stuff related to creating, loading"
},
{
"path": "scc/lib/__init__.py",
"chars": 64,
"preview": "#!/usr/bin/env python2\n\nfrom .enum import Enum, IntEnum, unique\n"
},
{
"path": "scc/lib/daemon.py",
"chars": 3888,
"preview": "#!/usr/bin/env python2\n\n\"\"\"Generic linux daemon base class\"\"\"\n\n# Adapted from http://www.jejik.com/files/examples/daemon"
},
{
"path": "scc/lib/enum.py",
"chars": 32498,
"preview": "\"\"\"Python Enumerations\"\"\"\n\n\"\"\"\nCopyright (c) 2013, Ethan Furman.\nAll rights reserved.\n\nRedistribution and use in source "
},
{
"path": "scc/lib/eudevmonitor.py",
"chars": 12260,
"preview": "#!/usr/bin/env python2\n# -*- coding: utf-8 -*-\n\"\"\"\nudevmonitor.py - enumerates and monitors devices using (e)udev\n\nCopyr"
},
{
"path": "scc/lib/hidparse.py",
"chars": 11196,
"preview": "\"\"\"\nhidparse - just enough code to parse HID report from hidraw descriptor.\n\nBased on\n - Pythonic binding for linux's h"
},
{
"path": "scc/lib/hidparse_data.py",
"chars": 26346,
"preview": "\"\"\"\nhidparse_data - long enums moved from hidparse.py\n\nLicensed under GPL 2.0\n\"\"\"\n\nfrom scc.lib import IntEnum\n\n\nclass M"
},
{
"path": "scc/lib/hidraw.py",
"chars": 4283,
"preview": "import ctypes\nimport collections\nimport fcntl\nfrom scc.lib import ioctl_opt\n\n# input.h\nBUS_USB = 0x03\nBUS_HIL = 0x04\nBUS"
},
{
"path": "scc/lib/ioctl_opt.py",
"chars": 1833,
"preview": "\"\"\"\nPythonified linux asm-generic/ioctl.h .\n\n\"type\" parameters expect ctypes-based types (ctypes.Structure subclasses, ."
},
{
"path": "scc/lib/jsonencoder.py",
"chars": 13899,
"preview": "\"\"\"\r\nCopied directly from python because I can't find way how to override\r\n_iterencode_list, function burried in 7th lev"
},
{
"path": "scc/lib/libusb1.py",
"chars": 50326,
"preview": "# Copyright (C) 2010-2016 Vincent Pelletier <plr.vincent@gmail.com>\n#\n# This library is free software; you can redistri"
},
{
"path": "scc/lib/usb1.py",
"chars": 87797,
"preview": "# Copyright (C) 2010-2016 Vincent Pelletier <plr.vincent@gmail.com>\n#\n# This library is free software; you can redistri"
},
{
"path": "scc/lib/vdf.py",
"chars": 1048,
"preview": "#!/usr/bin/env python3\n\"\"\"\nVDF file reader\nCopyright (C) 2017 Kozec\n\nThis program is free software; you can redistribute"
},
{
"path": "scc/lib/xinput.py",
"chars": 2277,
"preview": "#!/usr/bin/env python2\n# -*- coding: utf-8 -*-\n\"\"\"\nXInput tools\n\nInterfaces with XInput by calling `xinput` command.\nCur"
},
{
"path": "scc/lib/xwrappers.py",
"chars": 12702,
"preview": "#!/usr/bin/env python2\n\"\"\"\nPython wrapper for some X-related stuff.\n\nCopyright (C) 2017 Kozec\n\nThis program is free soft"
},
{
"path": "scc/macros.py",
"chars": 11354,
"preview": "#!/usr/bin/env python2\n\"\"\"\nSC Controller - Macros\n\nFrontier is my favorite.\n\"\"\"\nfrom __future__ import unicode_literals\n"
},
{
"path": "scc/mapper.py",
"chars": 16485,
"preview": "#!/usr/bin/env python2\nfrom __future__ import unicode_literals\n\nfrom collections import deque\nfrom scc.lib import xwrapp"
}
]
// ... and 75 more files (download for full content)
About this extraction
This page contains the full source code of the Ryochan7/sc-controller GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 275 files (2.5 MB), approximately 666.8k tokens, and a symbol index with 3525 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.