Merge next branch

This commit is contained in:
Mathieu Comandon 2016-02-25 05:26:44 -08:00
commit 69215d8e3f
28 changed files with 223 additions and 226 deletions

1
.gitignore vendored
View file

@ -12,6 +12,7 @@ build
tags
.ropeproject
*.pyc
*.pyo
PYSMELLTAGS
lutris.e4p
.coverage

View file

@ -1,4 +1,4 @@
Copyright (C) 2010-2015 Mathieu Comandon <strider@strycore.com>
Copyright (C) 2010-2016 Mathieu Comandon <strider@strycore.com>
Contributors:

View file

@ -1,4 +1,4 @@
VERSION="0.3.7.2"
VERSION="0.3.7.3"
cover:
rm tests/fixtures/pga.db -f

View file

@ -13,8 +13,6 @@
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
"""Program entry point"""
import dbus
import dbus.service
import os
@ -26,9 +24,15 @@ import time
import json
# pylint: disable=E0611
from gi.repository import Gdk, Gtk, GObject, GLib
import gi
gi.require_version('Gdk', '3.0')
gi.require_version('Gtk', '3.0')
from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)
from gi.repository import Gdk, Gtk, GObject, GLib
from os.path import realpath, dirname, normpath
LAUNCH_PATH = dirname(realpath(__file__))
@ -39,35 +43,13 @@ if LAUNCH_PATH != "/usr/bin":
from lutris.gui import dialogs
from lutris.migrations import migrate
try:
import yaml as _yaml # noqa
except ImportError:
q = dialogs.QuestionDialog({'title': "Dependency not available",
'question': "PythonYAML is not installed,\n"
"do you want to install it now?"})
if q.result == Gtk.ResponseType.YES:
os.system('software-center python-yaml')
else:
sys.exit()
from lutris import pga, runtime
from lutris.config import check_config # , register_handler
from lutris.util.log import logger
from lutris.game import Game
from lutris.gui.installgamedialog import InstallerDialog
from lutris.gui.lutriswindow import LutrisWindow
from lutris.settings import VERSION
DBUS_INTERFACE = 'org.lutris.main'
# Set the logging level to show debug messages.
console = logging.StreamHandler()
fmt = '%(levelname)-8s %(asctime)s [%(module)s]:%(message)s'
formatter = logging.Formatter(fmt)
console.setFormatter(formatter)
logger.addHandler(console)
logger.setLevel(logging.ERROR)
from lutris.util import service
# Support for command line options.
parser = optparse.OptionParser(version="%prog " + VERSION)
@ -133,49 +115,10 @@ game = None
signal.signal(signal.SIGINT, signal.SIG_DFL)
class LutrisService(dbus.service.Object):
"""Main D-Bus Lutris service."""
def __init__(self, bus, path, name):
dbus.service.Object.__init__(self, bus, path, name)
self.running = False
self.lutris_window = None
@dbus.service.method(DBUS_INTERFACE, out_signature='b')
def is_running(self):
return self.running
@dbus.service.method(DBUS_INTERFACE, in_signature='i')
def run(self, timestamp):
if self.is_running():
self.lutris_window.window.present_with_time(timestamp)
else:
logger.info("Welcome to Lutris")
self.running = True
self.lutris_window = LutrisWindow()
GObject.threads_init()
Gtk.main()
self.running = False
@dbus.service.method(DBUS_INTERFACE, in_signature='s')
def install_game(self, game_ref):
self.lutris_window.on_install_clicked(game_ref=game_ref)
@dbus.service.method(DBUS_INTERFACE, in_signature='i')
def run_game(self, game_id):
self.lutris_window.on_game_run(game_id=game_id)
# D-Bus init
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
# Get lutris service
request = bus.request_name(DBUS_INTERFACE, dbus.bus.NAME_FLAG_DO_NOT_QUEUE)
if request != dbus.bus.REQUEST_NAME_REPLY_EXISTS:
lutris = LutrisService(bus, '/', DBUS_INTERFACE)
else:
proxy = bus.get_object(DBUS_INTERFACE, "/")
lutris = dbus.Interface(proxy, DBUS_INTERFACE)
bus = dbus.SessionBus()
lutris = service.get_service(bus)
# Make sure the existing process is not frozen
if type(lutris) is dbus.Interface:
@ -204,7 +147,7 @@ if type(lutris) is dbus.Interface:
exit() # Give up :(
else:
time.sleep(1) # Wait for bus name to be available again
lutris = LutrisService(bus, '/', DBUS_INTERFACE)
lutris = service.LutrisService(bus, '/', service.DBUS_INTERFACE)
migrate()
@ -236,7 +179,10 @@ if game_slug or installer:
lutris_game = Game(db_game['id'])
lutris_game.exit_main_loop = True
lutris_game.play()
GLib.MainLoop().run()
try:
GLib.MainLoop().run()
except KeyboardInterrupt:
lutris_game.stop()
else:
logger.info("Installing %s", game_slug)
if lutris.is_running():

10
debian/changelog vendored
View file

@ -1,3 +1,13 @@
lutris (0.3.7.3) xenial; urgency=medium
* Add PCSX2 runner
* Add PPSSPP runner
* Extended kickstart support for Amiga CD32
* UI improvements
* Regedit fixes
-- Mathieu Comandon <strycore@gmail.com> Sun, 21 Feb 2016 21:13:39 -0800
lutris (0.3.7.2) wily; urgency=medium
* Add button to eject CD-ROMs during installation of Wine games

2
debian/compat vendored
View file

@ -1 +1 @@
6
9

12
debian/control vendored
View file

@ -1,14 +1,13 @@
Source: lutris
Section: games
Priority: optional
Build-Depends: cdbs,
debhelper,
Build-Depends: debhelper,
python,
dh-python,
gir1.2-gtk-3.0,
gir1.2-glib-2.0,
python-gi,
libgirepository1.0-dev,
libgirepository1.0-dev
Maintainer: Mathieu Comandon <strider@strycore.com>
Standards-Version: 3.9.5
Vcs-Git: https://github.com/lutris/lutris
@ -19,7 +18,12 @@ Package: lutris
Architecture: any
Depends: ${misc:Depends},
${python:Depends},
python-yaml, python-dbus, gir1.2-gtk-3.0, xdg-user-dirs, libc6-i386 [amd64],
python-yaml,
python-dbus,
gir1.2-gtk-3.0,
xdg-user-dirs,
python-xdg,
libc6-i386 [amd64],
lib32gcc1 [amd64]
Description: Install and play any video game easily
Lutris is a gaming platform for GNU/Linux. Its goal is to make

2
debian/copyright vendored
View file

@ -4,7 +4,7 @@ Upstream-Maintainer: Mathieu Comandon <strycore@gmail.com>
Upstream-Source: https://github.com/lutris
Files: *
Copyright: (C) 2009, 2015 Mathieu Comandon <strycore@gmail.com>
Copyright: (C) 2009, 2016 Mathieu Comandon <strycore@gmail.com>
License: GPL-3
The full text of the GPL is distributed in
/usr/share/common-licenses/GPL-3 on Debian systems.

9
debian/rules vendored
View file

@ -1,6 +1,7 @@
#!/usr/bin/make -f
DEB_PYTHON2_MODULE_PACKAGES=lutris
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/python-distutils.mk
# This file was automatically generated by stdeb 0.8.2 at
# Fri, 29 Jan 2016 08:11:44 -0500
export PYBUILD_NAME=lutris
%:
dh $@ --with python2 --buildsystem=pybuild

1
debian/source/format vendored Normal file
View file

@ -0,0 +1 @@
3.0 (quilt)

View file

@ -1,7 +1,7 @@
%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
Name: lutris
Version: 0.3.7.2
Version: 0.3.7.3
Release: 2%{?dist}
Summary: Install and play any video game easily
@ -18,7 +18,7 @@ BuildRequires: python-devel
%if 0%{?fedora_version}
BuildRequires: pygobject3, python3-gobject
Requires: pygobject3, PyYAML, python-xdg
Requires: pygobject3, PyYAML, pyxdg
%endif
%if 0%{?rhel_version} || 0%{?centos_version}
BuildRequires: pygobject3

View file

@ -303,7 +303,8 @@ class Game(object):
self.state = self.STATE_STOPPED
if self.runner.system_config.get('xboxdrv'):
self.xboxdrv_thread.stop()
jobs.AsyncCall(self.game_thread.stop, None, killall=True)
if self.game_thread:
jobs.AsyncCall(self.game_thread.stop, None, killall=True)
def on_game_quit(self):
"""Restore some settings and cleanup after game quit."""

View file

@ -38,7 +38,7 @@ def load_view(view, store):
class LutrisWindow(object):
"""Handler class for main window signals."""
def __init__(self):
def __init__(self, service=None):
ui_filename = os.path.join(
datapath.get(), 'ui', 'LutrisWindow.ui'
@ -46,6 +46,7 @@ class LutrisWindow(object):
if not os.path.exists(ui_filename):
raise IOError('File %s not found' % ui_filename)
self.service = service
self.running_game = None
self.threads_stoppers = []
@ -270,12 +271,15 @@ class LutrisWindow(object):
def sync_library(self):
"""Synchronize games with local stuff and server."""
def update_gui(result, error):
added, updated, installed, uninstalled = result
self.switch_splash_screen()
self.game_store.fill_store(added)
if result:
added, updated, installed, uninstalled = result
self.switch_splash_screen()
self.game_store.fill_store(added)
GLib.idle_add(self.update_existing_games,
added, updated, installed, uninstalled, True)
GLib.idle_add(self.update_existing_games,
added, updated, installed, uninstalled, True)
else:
logger.error("No results returned when syncing the library")
self.set_status("Syncing library")
AsyncCall(Sync().sync_all, update_gui)
@ -393,7 +397,10 @@ class LutrisWindow(object):
or self.running_game.state == Game.STATE_STOPPED):
def update_gui(result, error):
self.update_existing_games(set(), set(), *result)
if result:
self.update_existing_games(set(), set(), *result)
else:
logger.error('No results while syncing local Steam database')
AsyncCall(Sync().sync_local, update_gui)
return True
@ -406,6 +413,12 @@ class LutrisWindow(object):
for stopper in self.threads_stoppers:
stopper()
if self.running_game:
self.running_game.stop()
if self.service:
self.service.stop()
# Save settings
width, height = self.window_size
settings.write_setting('width', width)

View file

@ -21,16 +21,26 @@ class RunnerInstallDialog(Dialog):
super(RunnerInstallDialog, self).__init__(
title, parent, 0, ('_OK', Gtk.ResponseType.OK)
)
width, height = (340, 380)
self.dialog_size = (width, height)
self.set_default_size(width, height)
self.runner = runner
self.runner_info = api.get_runners(self.runner)
label = Gtk.Label("%s version management" % self.runner_info['name'])
self.vbox.add(label)
self.runner_store = self.get_store()
scrolled_window = Gtk.ScrolledWindow()
self.treeview = self.get_treeview(self.runner_store)
self.installing = {}
self.connect('response', self.on_response)
self.vbox.add(self.treeview)
scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC,
Gtk.PolicyType.AUTOMATIC)
scrolled_window.set_shadow_type(Gtk.ShadowType.ETCHED_OUT)
scrolled_window.add_with_viewport(self.treeview)
self.vbox.pack_start(scrolled_window, True, True, 14)
self.show_all()
def get_treeview(self, model):

View file

@ -16,9 +16,12 @@ from lutris.runners import wine, import_task, import_runner, InvalidRunner
from lutris.thread import LutrisThread
class Commands(object):
class CommandsMixin(object):
"""The directives for the `installer:` part of the install script."""
def __init__(self):
raise RuntimeError("Don't instanciate this class, it's a mixin!!!!!!!!!!!!!!!!")
def _get_wine_version(self):
if self.script.get('wine'):
return wine.support_legacy_version(self.script['wine'].get('version'))
@ -269,7 +272,8 @@ class Commands(object):
passed to the runner task.
"""
self._check_required_params('name', data, 'task')
GLib.idle_add(self.parent.cancel_button.set_sensitive, False)
if self.parent:
GLib.idle_add(self.parent.cancel_button.set_sensitive, False)
task_name = data.pop('name')
if '.' in task_name:
# Run a task from a different runner
@ -282,7 +286,6 @@ class Commands(object):
except InvalidRunner:
GLib.idle_add(self.parent.cancel_button.set_sensitive, True)
raise ScriptingError('Invalid runner provided %s', runner_name)
runner = runner_class()
# Check/install Wine runner at version specified in the script

View file

@ -10,7 +10,7 @@ import platform
from gi.repository import GLib
from .errors import ScriptingError
from .commands import Commands
from .commands import CommandsMixin
from lutris import pga, settings
from lutris.util import system
@ -37,7 +37,7 @@ def fetch_script(game_ref):
return yaml.safe_load(script_contents)
class ScriptInterpreter(Commands):
class ScriptInterpreter(CommandsMixin):
"""Convert raw installer script data into actions."""
def __init__(self, script, parent):
self.error = None
@ -354,6 +354,7 @@ class ScriptInterpreter(Commands):
status_text = None
if status_text:
self.parent.set_status(status_text)
logger.debug('Installer command: %s', command)
AsyncCall(method, self._iter_commands, params)
else:
self._finish_install()

View file

@ -58,6 +58,12 @@ class fsuae(Runner):
"replacement ROM which is less compatible with Amiga "
"software.")
},
{
'option': 'kickstart_ext_file',
'label': 'Extended Kickstart location',
'type': 'file',
'help': 'Location of extended Kickstart used for CD32'
},
{
"option": "gfx_fullscreen_amiga",
"label": "Fullscreen (F12 + s to switch)",
@ -105,6 +111,9 @@ class fsuae(Runner):
kickstart_file = self.runner_config.get('kickstart_file')
if kickstart_file:
params.append("--kickstart_file=%s" % kickstart_file)
kickstart_ext_file = self.runner_config.get('kickstart_ext_file')
if kickstart_ext_file:
params.append('--kickstart_ext_file=%s' % kickstart_ext_file)
if model:
params.append('--amiga_model=%s' % model)
if self.runner_config.get('gfx_fullscreen_amiga'):

View file

@ -1,4 +1,5 @@
import os
import time
import shlex
import subprocess
@ -45,12 +46,12 @@ def set_regedit(path, key, value='', type='REG_SZ', wine_path=None,
def set_regedit_file(filename, wine_path=None, prefix=None, arch='win32'):
"""Apply a regedit file to the Windows registry."""
wineexec('regedit', args=filename, wine_path=wine_path, prefix=prefix, arch=arch,
blocking=True)
wineexec('regedit', args="/S " + filename, wine_path=wine_path, prefix=prefix,
arch=arch, blocking=True)
def delete_registry_key(key, wine_path=None, prefix=None, arch='win32'):
wineexec('regedit', args='/D "%s"' % key, wine_path=wine_path,
wineexec('regedit', args='/S /D "%s"' % key, wine_path=wine_path,
prefix=prefix, arch=arch, blocking=True)
@ -61,13 +62,15 @@ def create_prefix(prefix, wine_dir=None, arch='win32'):
wine_dir = os.path.dirname(wine().get_executable())
wineboot_path = os.path.join(wine_dir, 'wineboot')
env = ['WINEARCH=%s' % arch]
if prefix:
env.append('WINEPREFIX="%s" ' % prefix)
env = {
'WINEARCH': arch,
'WINEPREFIX': prefix
}
system.execute([wineboot_path], env=env)
if not os.path.exists(os.path.join(prefix, 'system.reg')):
logger.error('No system.reg found after prefix creation. Prefix might not be valid')
logger.info('%s Prefix created in %s', arch, prefix)
command = " ".join(env) + wineboot_path
subprocess.Popen(command, cwd=None, shell=True,
stdout=subprocess.PIPE).communicate()
if prefix:
disable_desktop_integration(prefix)
@ -106,7 +109,10 @@ def wineexec(executable, args="", wine_path=None, prefix=None, arch=None,
if settings.RUNNER_DIR in wine_path:
env['LD_LIBRARY_PATH'] = ':'.join(runtime.get_paths())
command = [wine_path, executable] + args.split()
command = [wine_path]
if executable:
command.append(executable)
command += args.split()
if blocking:
return system.execute(command, env=env, cwd=working_dir)
else:
@ -236,6 +242,9 @@ def is_version_installed(version):
def get_default_version():
installed_versions = get_wine_versions()
wine32_versions = [version for version in installed_versions if '64' not in version]
if wine32_versions:
return wine32_versions[0]
if installed_versions:
return installed_versions[0]

View file

@ -224,9 +224,9 @@ class winesteam(wine.wine):
if path:
return path
def install(self, installer_path=None):
def install(self, installer_path=None, version=None):
if not self.is_wine_installed():
super(winesteam, self).install()
wine.wine().install(version=version)
prefix = self.get_or_create_default_prefix()
if not self.get_steam_path():
if not installer_path:

View file

@ -5,8 +5,8 @@ from gi.repository import GLib
from lutris.util.settings import SettingsIO
PROJECT = "Lutris"
VERSION = "0.3.7.2"
COPYRIGHT = "(c) 2010-2015 Lutris Gaming Platform"
VERSION = "0.3.7.3"
COPYRIGHT = "(c) 2010-2016 Lutris Gaming Platform"
AUTHORS = ["Mathieu Comandon <strycore@gmail.com>",
"Pascal Reinhard (Xodetaetl) <dev@xod.me"]
ARTISTS = ["Ludovic Soulié <contact@ludal.net>"]

View file

@ -49,6 +49,7 @@ class LutrisThread(threading.Thread):
self.cwd = runner.working_dir
else:
self.cwd = '/tmp'
self.cwd = os.path.expanduser(self.cwd)
self.env_string = ''
for (k, v) in self.env.items():
@ -165,7 +166,7 @@ class LutrisThread(threading.Thread):
'bash', 'control', 'lutris', 'PnkBstrA.exe', 'python', 'regedit',
'sh', 'steam', 'Steam.exe', 'steamer', 'steamerrorrepor',
'SteamService.ex', 'steamwebhelper', 'steamwebhelper.', 'tee',
'tr', 'winecfg.exe', 'winetricks', 'zenity',
'tr', 'winecfg.exe', 'zenity',
)
if child.name in excluded:
continue

View file

@ -23,3 +23,11 @@ loghandler.setFormatter(logformatter)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(loghandler)
# Set the logging level to show debug messages.
console = logging.StreamHandler()
fmt = '%(levelname)-8s %(asctime)s [%(module)s]:%(message)s'
formatter = logging.Formatter(fmt)
console.setFormatter(formatter)
logger.addHandler(console)
logger.setLevel(logging.ERROR)

56
lutris/util/service.py Normal file
View file

@ -0,0 +1,56 @@
import dbus
from gi.repository import Gtk, GObject
from lutris.gui.lutriswindow import LutrisWindow
from lutris.util.log import logger
DBUS_INTERFACE = 'net.lutris.main'
class LutrisService(dbus.service.Object):
"""Main D-Bus Lutris service."""
def __init__(self, bus_name, object_path, name):
dbus.service.Object.__init__(self, bus_name, object_path, name)
self.running = False
self.lutris_window = None
def stop(self):
""" stop the dbus controller and remove from the bus """
self.remove_from_connection()
@dbus.service.method(DBUS_INTERFACE, out_signature='b')
def is_running(self):
return self.running
@dbus.service.method(DBUS_INTERFACE, in_signature='i')
def run(self, timestamp):
if self.is_running():
self.lutris_window.window.present_with_time(timestamp)
else:
logger.info("Welcome to Lutris")
self.running = True
self.lutris_window = LutrisWindow(service=self)
GObject.threads_init()
Gtk.main()
self.running = False
@dbus.service.method(DBUS_INTERFACE, in_signature='s')
def install_game(self, game_ref):
self.lutris_window.on_install_clicked(game_ref=game_ref)
@dbus.service.method(DBUS_INTERFACE, in_signature='i')
def run_game(self, game_id):
self.lutris_window.on_game_run(game_id=game_id)
def get_bus():
return dbus.SessionBus()
def get_service(bus):
request = bus.request_name(DBUS_INTERFACE, dbus.bus.NAME_FLAG_DO_NOT_QUEUE)
if request != dbus.bus.REQUEST_NAME_REPLY_EXISTS:
service = LutrisService(bus, '/', DBUS_INTERFACE)
else:
proxy = bus.get_object(DBUS_INTERFACE, "/")
service = dbus.Interface(proxy, DBUS_INTERFACE)
return service

View file

@ -5,6 +5,7 @@ import shutil
import string
import subprocess
import sys
import traceback
from lutris.util.log import logger
@ -12,19 +13,31 @@ from lutris.util.log import logger
is_64bit = sys.maxsize > 2**32
def execute(command, shell=False, env=None, cwd=None):
def execute(command, env=None, cwd=None, log_errors=False):
"""Execute a system command and return its results."""
# logger.debug("Executing %s", ' '.join(command))
# logger.debug("ENV: %s", env)
existing_env = os.environ.copy()
if env:
existing_env.update(env)
logger.debug(' '.join('{}={}'.format(k, v) for k, v in env.iteritems()))
logger.debug("Executing %s", ' '.join(command))
# Piping stderr can cause slowness in the programs, use carefully
# (especially when using regedit with wine)
if log_errors:
stderr_config = subprocess.PIPE
else:
stderr_config = None
try:
stdout, stderr = subprocess.Popen(command,
shell=shell,
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=env, cwd=cwd).communicate()
stderr=stderr_config,
env=existing_env, cwd=cwd).communicate()
except OSError as ex:
logger.error('Could not run command %s: %s', command, ex)
return
if stderr and log_errors:
logger.error(stderr)
return stdout.strip()
@ -232,3 +245,7 @@ def path_exists(path):
if not path:
return False
return os.path.exists(path)
def stacktrace():
traceback.print_stack()

View file

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/python3
import os
from distutils.core import setup
from lutris.settings import VERSION

View file

@ -1,101 +0,0 @@
# Windows - DINPUT
8f0e1200000000000000504944564944,Acme,platform:Windows,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
341a3608000000000000504944564944,Afterglow 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:Windows,
ffff0000000000000000504944564944,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,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:Windows,
6d0416c2000000000000504944564944,Generic DirectInput 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:Windows,
6d0419c2000000000000504944564944,Logitech F710 Gamepad,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:Windows,
88880803000000000000504944564944,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,
4c056802000000000000504944564944,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:Windows,
25090500000000000000504944564944,PS3 DualShock,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows,
4c05c405000000000000504944564944,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:Windows,
6d0418c2000000000000504944564944,Logitech RumblePad 2 USB,platform:Windows,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
36280100000000000000504944564944,OUYA Controller,platform:Windows,a:b0,b:b3,y:b2,x:b1,start:b14,guide:b15,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b8,dpleft:b10,dpdown:b9,dpright:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b12,righttrigger:b13,
4f0400b3000000000000504944564944,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Windows,
00f00300000000000000504944564944,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows,
00f0f100000000000000504944564944,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows,
28040140000000000000504944564944,GamePad Pro USB,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,lefttrigger:b6,righttrigger:b7,
ff113133000000000000504944564944,SVEN X-PAD,platform:Windows,a:b2,b:b3,y:b1,x:b0,start:b5,back:b4,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b8,righttrigger:b9,
8f0e0300000000000000504944564944,Piranha xtreme,platform:Windows,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
8f0e0d31000000000000504944564944,Multilaser JS071 USB,platform:Windows,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
10080300000000000000504944564944,PS2 USB,platform:Windows,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a4,righty:a2,lefttrigger:b4,righttrigger:b5,
79000600000000000000504944564944,G-Shark GS-GP702,a:b2,b:b1,x:b3,y:b0,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:a4,lefttrigger:b6,righttrigger:b7,platform:Windows,
4b12014d000000000000504944564944,NYKO AIRFLO,a:b0,b:b1,x:b2,y:b3,back:b8,guide:b10,start:b9,leftstick:a0,rightstick:a2,leftshoulder:a3,rightshoulder:b5,dpup:h0.1,dpdown:h0.0,dpleft:h0.8,dpright:h0.2,leftx:h0.6,lefty:h0.12,rightx:h0.9,righty:h0.4,lefttrigger:b6,righttrigger:b7,platform:Windows,
d6206dca000000000000504944564944,PowerA Pro Ex,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.0,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
a3060cff000000000000504944564944,Saitek P2500,a:b2,b:b3,y:b1,x:b0,start:b4,guide:b10,back:b5,leftstick:b8,rightstick:b9,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Windows,
8f0e0300000000000000504944564944,Trust GTX 28,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
4f0415b3000000000000504944564944,Thrustmaster Dual Analog 3.2,platform:Windows,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
6f0e1e01000000000000504944564944,Rock Candy Gamepad for PS3,platform:Windows,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,
83056020000000000000504944564944,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,y:b2,x:b3,start:b7,back:b6,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Windows,
# OS X
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,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:Mac OS X,
6d0400000000000016c2000000000000,Logitech F310 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:Mac OS X,
6d0400000000000018c2000000000000,Logitech F510 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:Mac OS X,
6d040000000000001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
6d0400000000000019c2000000000000,Logitech Wireless 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:Mac OS X,
4c050000000000006802000000000000,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:Mac OS X,
4c05000000000000c405000000000000,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:Mac OS X,
5e040000000000008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
891600000000000000fd000000000000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b8,guide:b10,back:b9,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b11,dpleft:b13,dpdown:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Mac OS X,
4f0400000000000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Mac OS X,
8f0e0000000000000300000000000000,Piranha xtreme,platform:Mac OS X,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
0d0f0000000000004d00000000000000,HORI Gem Pad 3,platform:Mac OS X,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
79000000000000000600000000000000,G-Shark GP-702,a:b2,b:b1,x:b3,y:b0,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:a3,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Mac OS X,
4f0400000000000015b3000000000000,Thrustmaster Dual Analog 3.2,platform:Mac OS X,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
AD1B00000000000001F9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,y:b9,x:b10,start:b6,guide:b8,back:b7,dpup:b2,dpleft:b0,dpdown:b3,dpright:b1,leftx:a0,lefty:a1,lefttrigger:b12,righttrigger:,leftshoulder:b11,platform:Mac OS X,
# Linux
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,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,
03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,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,guide:,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,
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,
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,
030000004c050000c405000011010000,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,platform:Linux,
030000006f0e00003001000001010000,EA Sports PS3 Controller,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
03000000de280000ff11000001000000,Valve Streaming 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,
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,
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,
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,
03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,y:b0,x:b3,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux,
03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Linux,
030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,y:b3,x:b1,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux,
030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a5,
030000008f0e00000300000010010000,GreenAsia Inc. USB Joystick ,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
030000008f0e00001200000010010000,GreenAsia Inc. USB Joystick ,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
030000006d04000016c2000010010000,Logitech Logitech Dual Action,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
03000000260900008888000000010000,GameCube {WiseGroup USB box},a:b0,b:b2,y:b3,x:b1,start:b7,leftshoulder:,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,rightstick:,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,platform:Linux,
030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,y:b4,x:b3,start:b8,guide:b5,back:b2,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b9,righttrigger:b10,platform:Linux,
030000006d04000018c2000010010000,Logitech Logitech RumblePad 2 USB,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
05000000d6200000ad0d000001000000,Moga Pro,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,
030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,
0300000000f000000300000000010000,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux,
0300000000f00000f100000000010000,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux,
030000006f0e00001f01000000010000,Generic X-Box pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
03000000280400000140000000010000,Gravis GamePad Pro USB ,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftx:a0,lefty:a1,
030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b6,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:a2,rightshoulder:b2,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4,
030000006f0e00001e01000011010000,Rock Candy Gamepad for PS3,platform:Linux,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,
03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,platform:Linux,a:b2,b:b1,y:b0,x:b3,start:b8,back:b9,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5,
030000008916000000fd000024010000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux,
03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
050000004c050000c405000000010000,PS4 Controller (Bluetooth),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,
060000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux,
03000000790000000600000010010000,DragonRise Inc. Generic USB Joystick ,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,
03000000666600000488000000010000,Super Joy Box 5 Pro,platform:Linux,a:b2,b:b1,x:b3,y:b0,back:b9,start:b8,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5,dpup:b12,dpleft:b15,dpdown:b14,dpright:b13,
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,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,
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,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,
030000008916000001fd000024010000,Razer Onza Classic Edition,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:b11,dpdown:b14,dpright:b12,dpup:b13,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
030000005e040000d102000001010000,Microsoft X-Box One pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
03000000790000001100000010010000,RetroLink Saturn Classic Controller,platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,
050000007e0500003003000001000000,Nintendo Wii U Pro Controller,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b8,start:b9,guide:b10,leftshoulder:b4,rightshoulder:b5,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16,
030000005e0400008e02000004010000,Microsoft X-Box 360 pad,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,guide:b8,leftshoulder:b4,rightshoulder:b5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
030000000d0f00002200000011010000,HORI CO.,LTD. REAL ARCADE Pro.V3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,
030000000d0f00001000000011010000,HORI CO.,LTD. FIGHTING STICK 3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7
03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b7,back:b6,guide:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,lefttrigger:a5,righttrigger:a4,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a2,righty:a3,

Binary file not shown.

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.10"/>
<!-- interface-local-resource-path ../media -->
@ -699,11 +699,18 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkViewport" id="sidebar_viewport">
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<child>
<placeholder/>
<object class="GtkViewport" id="sidebar_viewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
<packing>
@ -793,11 +800,11 @@
<object class="GtkLabel" id="status_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="xpad">5</property>
<property name="ypad">5</property>
<property name="label" translatable="yes">Lutris</property>
<property name="lines">1</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">True</property>
@ -809,8 +816,8 @@
<object class="GtkLabel" id="connection_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">label</property>
<property name="xalign">1</property>
</object>
<packing>
<property name="expand">True</property>