From 6089add3561afcea6c3f4e5b86d8fcd6c889542a Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 11 Jul 2016 23:51:41 +0530 Subject: [PATCH 01/72] Add gamepad support --- configure.ac | 2 + data/gamepads/gamecontrollerdb.txt | 129 ++++++++++++++++ data/org.gnome.Games.gresource.xml | 1 + src/Makefile.am | 23 +++ src/gamepad/gamepad-monitor.vala | 100 +++++++++++++ src/gamepad/gamepad.vala | 116 +++++++++++++++ src/gamepad/helpers.vala | 23 +++ src/gamepad/input-type.vala | 11 ++ src/gamepad/linux/guid-helpers.vala | 31 ++++ src/gamepad/linux/libevdev.vapi | 39 +++++ src/gamepad/linux/raw-gamepad-monitor.vala | 54 +++++++ src/gamepad/linux/raw-gamepad.vala | 164 +++++++++++++++++++++ src/gamepad/mapping-error.vala | 5 + src/gamepad/mapping-helpers.vala | 82 +++++++++++ src/gamepad/mapping.vala | 122 +++++++++++++++ src/gamepad/mappings-manager.vala | 99 +++++++++++++ src/gamepad/raw-gamepad-monitor.vala | 35 +++++ src/gamepad/raw-gamepad.vala | 59 ++++++++ src/gamepad/standard-gamepad-axis.vala | 33 +++++ src/gamepad/standard-gamepad-button.vala | 95 ++++++++++++ src/retro/retro-gamepad.vala | 105 +++++++++++++ src/retro/retro-input-manager.vala | 75 ++++++++++ src/retro/retro-runner.vala | 15 +- 23 files changed, 1406 insertions(+), 12 deletions(-) create mode 100644 data/gamepads/gamecontrollerdb.txt create mode 100644 src/gamepad/gamepad-monitor.vala create mode 100644 src/gamepad/gamepad.vala create mode 100644 src/gamepad/helpers.vala create mode 100644 src/gamepad/input-type.vala create mode 100644 src/gamepad/linux/guid-helpers.vala create mode 100644 src/gamepad/linux/libevdev.vapi create mode 100644 src/gamepad/linux/raw-gamepad-monitor.vala create mode 100644 src/gamepad/linux/raw-gamepad.vala create mode 100644 src/gamepad/mapping-error.vala create mode 100644 src/gamepad/mapping-helpers.vala create mode 100644 src/gamepad/mapping.vala create mode 100644 src/gamepad/mappings-manager.vala create mode 100644 src/gamepad/raw-gamepad-monitor.vala create mode 100644 src/gamepad/raw-gamepad.vala create mode 100644 src/gamepad/standard-gamepad-axis.vala create mode 100644 src/gamepad/standard-gamepad-button.vala create mode 100644 src/retro/retro-gamepad.vala create mode 100644 src/retro/retro-input-manager.vala diff --git a/configure.ac b/configure.ac index 2c41f3b4..5bed214f 100644 --- a/configure.ac +++ b/configure.ac @@ -50,6 +50,8 @@ PKG_CHECK_MODULES(GNOME_GAMES, [ gio-2.0 glib-2.0 >= $GLIB_MIN_VERSION gtk+-3.0 + gudev-1.0 + libevdev retro-gobject-0.6 retro-gtk-0.6 tracker-sparql-1.0 diff --git a/data/gamepads/gamecontrollerdb.txt b/data/gamepads/gamecontrollerdb.txt new file mode 100644 index 00000000..c29ef162 --- /dev/null +++ b/data/gamepads/gamecontrollerdb.txt @@ -0,0 +1,129 @@ +# 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, +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, +10080100000000000000504944564944,PS1 USB,platform:Windows,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2, +49190204000000000000504944564944,Ipega PG-9023,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,platform:Windows, +4f0423b3000000000000504944564944,Dual Trigger 3-in-1,a:b1,b:b2,x:b0,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:a5,lefttrigger:b6,righttrigger:b7,platform:Windows, +0d0f4900000000000000504944564944,Hatsune Miku Sho Controller,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:Windows, +9000318000000000000504944564944,Mayflash Wiimote PC Adapter,platform:Windows,a:b2,b:h0.4,x:b0,y:b1,back:b4,start:b5,guide:b11,leftshoulder:b6,rightshoulder:b3,leftx:a0,lefty:a1, +79004318000000000000504944564944,Mayflash GameCube Controller Adapter,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b0,start:b9,guide:b0,leftshoulder:b4,rightshoulder:b7,leftstick:b0,rightstick:b0,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2, +79000018000000000000504944564944,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,x:b0,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:Windows, +2509e803000000000000504944564944,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,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, +83050000000000006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Mac OS X, +5e04000000000000dd02000000000000,Xbox One Wired Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b9,guide:b10,start:b8,dpleft:b13,dpdown:b12,dpright:b14,dpup:b11,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b6,rightstick:b7,leftx:a0,lefty:a1,rightx:a3,righty:a4, +050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,x:b18,y:b17,back:b7,guide:b8,start:b6,leftstick:b23,rightstick:b24,leftshoulder:b19,rightshoulder:b20,dpup:b11,dpdown:b12,dpleft:b13,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b21,righttrigger:b22,platform:Mac OS X, +79000000000000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,x:b0,y:b12,back:b32,start:b36,leftstick:b40,rightstick:b44,leftshoulder:b16,rightshoulder:b20,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a4,rightx:a8,righty:a12,lefttrigger:b24,righttrigger:b28,platform:Mac OS X, +2509000000000000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,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, +050000004c0500006802000000010000,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, +030000005e040000dd02000003020000,Microsoft X-Box One pad v2,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,platform:Linux, +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, +03000000ff1100003133000010010000,PC Game Controller,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:Linux, +030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad 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, +030000006f0e00001304000000010000,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.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:a0,rightstick:a3,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4, +03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,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:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4, +03000000830500006020000010010000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux, +03000000c9110000f055000011010000,HJC Game GAMEPAD,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b11,rightshoulder:b5,rightx:a2,start:b9,righty:a3,dpleft:h0.8,lefttrigger:b6,x:b2,dpup:h0.1,back:b8,leftstick:b10,leftshoulder:b4,y:b3,a:b0,dpright:h0.2,righttrigger:b7,b:b1,platform:Linux, +03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,y:b3,x:b0,start:b12,guide: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:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platorm:Linux, +03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,y:b3,x:b0,start:b9,guide:,back:,leftstick:,rightstick:,leftshoulder:,dpleft:b15,dpdown:b14,dpright:b13,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,rightshoulder:b7,dpup:b12,platform:Linux, +030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,platform:Linux,x:b0,a:b2,b:b3,y:b1,back:b10,guide:b12,start:b11,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3, +030000006f0e00004601000001010000,Rock Candy Wired Controller for Xbox One,platform:Linux,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,guide:b8,leftstick:b9,rightstick:b10,lefttrigger:a2,righttrigger:a5,leftx:a0,lefty:a1,rightx:a3,righty:a4, +03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,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, +030000006f0e00003901000020060000,Afterglow Wired Controller for Xbox One,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,platform:Linux, +030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,platform:Linux,a:b0,b:b2,x:b1,y:b3,start:b9,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, diff --git a/data/org.gnome.Games.gresource.xml b/data/org.gnome.Games.gresource.xml index b1dbf296..0a19433e 100644 --- a/data/org.gnome.Games.gresource.xml +++ b/data/org.gnome.Games.gresource.xml @@ -2,6 +2,7 @@ gtk-style.css + gamepads/gamecontrollerdb.txt gtk/menus.ui ui/application-window.ui ui/collection-icon-view.ui diff --git a/src/Makefile.am b/src/Makefile.am index 647bbe06..a1b09718 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -53,7 +53,25 @@ gnome_games_SOURCES = \ dummy/dummy-icon.vala \ dummy/dummy-runner.vala \ \ + gamepad/raw-gamepad-monitor.vala \ + gamepad/raw-gamepad.vala \ + gamepad/linux/guid-helpers.vala \ + gamepad/linux/raw-gamepad-monitor.vala \ + gamepad/linux/raw-gamepad.vala \ + gamepad/gamepad-monitor.vala \ + gamepad/gamepad.vala \ + gamepad/helpers.vala \ + gamepad/input-type.vala \ + gamepad/mapping-error.vala \ + gamepad/mapping-helpers.vala \ + gamepad/mapping.vala \ + gamepad/mappings-manager.vala \ + gamepad/standard-gamepad-axis.vala \ + gamepad/standard-gamepad-button.vala \ + \ retro/retro-error.vala \ + retro/retro-gamepad.vala \ + retro/retro-input-manager.vala \ retro/retro-log.vala \ retro/retro-runner.vala \ \ @@ -96,12 +114,17 @@ gnome_games_SOURCES = \ gnome_games_VALAFLAGS = \ --target-glib=@GLIB_MIN_VERSION@ \ + --vapidir=gamepad/linux/ \ --pkg gio-2.0 \ --pkg glib-2.0 \ --pkg gtk+-3.0 \ --pkg tracker-sparql-1.0 \ --pkg retro-gobject-0.6 \ --pkg retro-gtk-0.6 \ + --pkg gudev-1.0 \ + --pkg libevdev \ + --pkg linux \ + --pkg posix \ --gresources $(gresource_file) \ --vapi $(vapi_file) \ -H $(header_file) \ diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala new file mode 100644 index 00000000..81731a3f --- /dev/null +++ b/src/gamepad/gamepad-monitor.vala @@ -0,0 +1,100 @@ +// This file is part of GNOME Games. License: GPLv3 + +/** + * This class provides a way to the client to monitor gamepads + * + * The client interfaces with this class primarily + */ +public class LibGamepad.GamepadMonitor : Object { + /** + * Emitted when a gamepad is plugged in + * @param gamepad The gamepad + */ + public signal void gamepad_plugged (Gamepad gamepad); + + /** + * Emitted when a gamepad is unplugged + * @param identifier The identifier of the unplugged gamepad + * @param guid The guid of the unplugged gamepad + * @param name The name of the unplugged gamepad + */ + public signal void gamepad_unplugged (string identifier, string guid, string? name); + + public delegate void GamepadCallback (Gamepad gamepad); + + private static HashTable identifier_to_raw_gamepad; + private static HashTable guid_to_raw_name; + + /** + * The number of plugged in gamepads + */ + public uint gamepads_number { get; private set; default = 0; } + + private RawGamepadMonitor raw_gamepad_monitor; + + public GamepadMonitor () { + init_static_if_not (); + + raw_gamepad_monitor = new LinuxRawGamepadMonitor (); + + raw_gamepad_monitor.gamepad_plugged.connect (on_raw_gamepad_plugged); + raw_gamepad_monitor.gamepad_unplugged.connect (on_raw_gamepad_unplugged); + + raw_gamepad_monitor.foreach_gamepad ((raw_gamepad) => { + add_gamepad (raw_gamepad); + }); + + } + + /** + * This static function returns a raw gamepad given a guid. It can be used + * for creating interfaces for remappable-controls. + * @param identifier The identifier of the raw gamepad that you want + */ + public static RawGamepad? get_raw_gamepad (string identifier) { + init_static_if_not (); + + if (identifier == null) + return null; + else + return identifier_to_raw_gamepad.get (identifier); + } + + private static void init_static_if_not () { + if (identifier_to_raw_gamepad == null) + identifier_to_raw_gamepad = new HashTable (str_hash, str_equal); + if (guid_to_raw_name == null) + guid_to_raw_name = new HashTable (str_hash, str_equal); + } + + /** + * This function allows to iterate over all gamepads + * @param callback The callback + */ + public void foreach_gamepad (GamepadCallback callback) { + identifier_to_raw_gamepad.foreach ((identifier, raw_gamepad) => { + callback (new Gamepad (raw_gamepad)); + }); + } + + private void add_gamepad (RawGamepad raw_gamepad) { + gamepads_number++; + identifier_to_raw_gamepad.replace (raw_gamepad.identifier, raw_gamepad); + guid_to_raw_name.replace (raw_gamepad.guid.to_string (), raw_gamepad.name); + } + + private void on_raw_gamepad_plugged (RawGamepad raw_gamepad) { + add_gamepad (raw_gamepad); + gamepad_plugged (new Gamepad (raw_gamepad)); + } + + private void on_raw_gamepad_unplugged (string identifier) { + var raw_gamepad = identifier_to_raw_gamepad.get (identifier); + if (raw_gamepad == null) + return; + gamepads_number--; + guid_to_raw_name.remove (raw_gamepad.guid.to_string ()); + gamepad_unplugged (raw_gamepad.identifier, raw_gamepad.guid, + MappingsManager.get_name (raw_gamepad.guid) ?? raw_gamepad.name); + } +} diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala new file mode 100644 index 00000000..4e850697 --- /dev/null +++ b/src/gamepad/gamepad.vala @@ -0,0 +1,116 @@ +// This file is part of GNOME Games. License: GPLv3 + +/** + * This class represents a gamepad + * + * The client interfaces with this class primarily + */ +public class LibGamepad.Gamepad : Object { + + /** + * Emitted when a button is pressed/released + * @param button The button pressed + * @param value True if pressed, False if released + */ + public signal void button_event (StandardGamepadButton button, bool value); + + /** + * Emitted when an axis's value changes + * @param axis The axis number from 0 to axes_number + * @param value The value of the axis ranging from -1 to 1 + */ + public signal void axis_event (StandardGamepadAxis axis, double value); + + /** + * Emitted when the gamepad is unplugged + */ + public signal void unplugged (); + + + /** + * The raw name reported by the driver + */ + public string? raw_name { get; private set; } + + /** + * The guid + */ + public string? guid { get; private set; } + + /** + * The name present in our database + */ + public string? name { get; private set; } + + /** + * The raw gamepad behind this gamepad + */ + public RawGamepad raw_gamepad { get; private set; } + + /** + * Whether this gamepad is mapped + */ + public bool mapped { get; private set; } + + /** + * The mapping object + */ + public Mapping? mapping { get; private set; } + + public Gamepad (RawGamepad raw_gamepad) throws FileError { + this.raw_gamepad = raw_gamepad; + raw_name = raw_gamepad.name; + guid = raw_gamepad.guid; + name = MappingsManager.get_name (guid) ?? raw_name; + try { + mapping = new Mapping.from_sdl_string (MappingsManager.get_mapping (guid)); + mapped = true; + raw_gamepad.button_event.connect (on_raw_button_event); + raw_gamepad.axis_event.connect (on_raw_axis_event); + raw_gamepad.dpad_event.connect (on_raw_dpad_event); + } catch (MappingError err) { + debug ("%s - for %s/%s", err.message, guid, name); + mapping = null; + mapped = false; + } + raw_gamepad.unplugged.connect (() => unplugged ()); + } + + private void on_raw_button_event (int button, bool value) { + InputType type; + StandardGamepadAxis output_axis; + StandardGamepadButton output_button; + + mapping.get_button_mapping (button, out type, out output_axis, out output_button); + emit_event (type, output_axis, output_button, value ? 1 : 0); + } + + private void on_raw_axis_event (int axis, double value) { + InputType type; + StandardGamepadAxis output_axis; + StandardGamepadButton output_button; + + mapping.get_axis_mapping (axis, out type, out output_axis, out output_button); + emit_event (type, output_axis, output_button, value); + } + + private void on_raw_dpad_event (int dpad_index, int axis, int value) { + InputType type; + StandardGamepadAxis output_axis; + StandardGamepadButton output_button; + + mapping.get_dpad_mapping (dpad_index, axis, value, out type, out output_axis, out output_button); + emit_event (type, output_axis, output_button, value.abs ()); + } + + private void emit_event (InputType type, StandardGamepadAxis axis, StandardGamepadButton button, double value) { + switch (type) { + case InputType.AXIS: + axis_event (axis, value); + break; + case InputType.BUTTON: + button_event (button, (bool) value); + break; + } + } +} diff --git a/src/gamepad/helpers.vala b/src/gamepad/helpers.vala new file mode 100644 index 00000000..6079b186 --- /dev/null +++ b/src/gamepad/helpers.vala @@ -0,0 +1,23 @@ +// This file is part of GNOME Games. License: GPLv3 + +namespace LibGamepad { + private const int GUID_LENGTH = 8; + + private string uint16s_to_hex_string (uint16[] data) + requires (data.length == GUID_LENGTH) + { + const string k_rgchHexToASCII = "0123456789abcdef"; + + var builder = new StringBuilder (); + for (var i = 0; i < GUID_LENGTH; i++) { + uint8 c = (uint8) data[i]; + builder.append_unichar (k_rgchHexToASCII[c >> 4]); + builder.append_unichar (k_rgchHexToASCII[c & 0x0F]); + + c = (uint8) (data[i] >> 8); + builder.append_unichar (k_rgchHexToASCII[c >> 4]); + builder.append_unichar (k_rgchHexToASCII[c & 0x0F]); + } + return builder.str; + } +} diff --git a/src/gamepad/input-type.vala b/src/gamepad/input-type.vala new file mode 100644 index 00000000..d6de52c8 --- /dev/null +++ b/src/gamepad/input-type.vala @@ -0,0 +1,11 @@ +// This file is part of GNOME Games. License: GPLv3 + +public enum LibGamepad.InputType { + AXIS, + BUTTON, + INVALID; + + public static uint length () { + return InputType.INVALID + 1; + } +} diff --git a/src/gamepad/linux/guid-helpers.vala b/src/gamepad/linux/guid-helpers.vala new file mode 100644 index 00000000..2e4b04ae --- /dev/null +++ b/src/gamepad/linux/guid-helpers.vala @@ -0,0 +1,31 @@ +// This file is part of GNOME Games. License: GPLv3 + +private class LibGamepad.LinuxGuidHelpers : Object { + public static string from_dev (Libevdev.Evdev dev) { + uint16 guid[8]; + guid[0] = (uint16) dev.id_bustype.to_little_endian (); + guid[1] = 0; + guid[2] = (uint16) dev.id_vendor.to_little_endian (); + guid[3] = 0; + guid[4] = (uint16) dev.id_product.to_little_endian (); + guid[5] = 0; + guid[6] = (uint16) dev.id_version.to_little_endian (); + guid[7] = 0; + return uint16s_to_hex_string (guid); + } + + public static string from_file (string file_name) throws FileError { + var fd = Posix.open (file_name, Posix.O_RDONLY | Posix.O_NONBLOCK); + + if (fd < 0) + throw new FileError.FAILED (@"Unable to open file $file_name: $(Posix.strerror (Posix.errno))"); + + var dev = new Libevdev.Evdev (); + if (dev.set_fd (fd) < 0) + throw new FileError.FAILED (@"Evdev error on opening file $file_name: $(Posix.strerror (Posix.errno))"); + + var guid = from_dev (dev); + Posix.close (fd); + return guid; + } +} diff --git a/src/gamepad/linux/libevdev.vapi b/src/gamepad/linux/libevdev.vapi new file mode 100644 index 00000000..2419f8f8 --- /dev/null +++ b/src/gamepad/linux/libevdev.vapi @@ -0,0 +1,39 @@ +// This file is part of GNOME Games. License: GPLv3 + +[CCode (cheader_filename = "libevdev/libevdev.h")] +namespace Libevdev { + + [CCode (cname = "libevdev_read_flag", cprefix = "LIBEVDEV_READ_FLAG_", has_type_id = false)] + [Flags] + public enum ReadFlag { + SYNC, + NORMAL, + FORCE_SYNC, + BLOCKING + } + + [CCode (cname = "struct libevdev", cprefix = "libevdev_", free_function = "libevdev_free")] + [Compact] + public class Evdev { + [CCode (cname = "libevdev_new")] + public Evdev (); + + public int get_fd (); + public int set_fd (int fd); + + public string name { get; set; } + + public int id_bustype { get; set; } + public int id_vendor { get; set; } + public int id_product { get; set; } + public int id_version { get; set; } + + public unowned Linux.Input.AbsInfo? get_abs_info (uint code); + public bool has_event_code (uint type, uint code); + public int has_event_pending (); + public int next_event (uint flags, out Linux.Input.Event ev); + + public static unowned string event_code_get_name(uint type, uint code); + } + +} diff --git a/src/gamepad/linux/raw-gamepad-monitor.vala b/src/gamepad/linux/raw-gamepad-monitor.vala new file mode 100644 index 00000000..9d1d7e43 --- /dev/null +++ b/src/gamepad/linux/raw-gamepad-monitor.vala @@ -0,0 +1,54 @@ +// This file is part of GNOME Games. License: GPLv3 + +private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { + public delegate void RawGamepadCallback (RawGamepad raw_gamepad); + + private GUdev.Client client; + + public LinuxRawGamepadMonitor () { + client = new GUdev.Client ({"input"}); + client.uevent.connect (handle_udev_client_callback); + } + + public void foreach_gamepad (RawGamepadCallback callback) { + client.query_by_subsystem ("input").foreach ((dev) => { + if (dev.get_device_file () == null) + return; + var identifier = dev.get_device_file (); + if ((dev.has_property ("ID_INPUT_JOYSTICK") && dev.get_property ("ID_INPUT_JOYSTICK") == "1") || + (dev.has_property (".INPUT_CLASS") && dev.get_property (".INPUT_CLASS") == "joystick")) { + RawGamepad raw_gamepad; + try { + raw_gamepad = new LinuxRawGamepad (identifier); + } catch (FileError err) { + return; + } + callback (raw_gamepad); + } + }); + } + + private void handle_udev_client_callback (string action, GUdev.Device dev) { + if (dev.get_device_file () == null) + return; + + var identifier = dev.get_device_file (); + if ((dev.has_property ("ID_INPUT_JOYSTICK") && dev.get_property ("ID_INPUT_JOYSTICK") == "1") || + (dev.has_property (".INPUT_CLASS") && dev.get_property (".INPUT_CLASS") == "joystick")) { + switch (action) { + case "add": + RawGamepad raw_gamepad; + try { + raw_gamepad = new LinuxRawGamepad (identifier); + } catch (FileError err) { + return; + } + gamepad_plugged (raw_gamepad); + break; + case "remove": + gamepad_unplugged (identifier); + break; + } + } + } +} diff --git a/src/gamepad/linux/raw-gamepad.vala b/src/gamepad/linux/raw-gamepad.vala new file mode 100644 index 00000000..71fab6d8 --- /dev/null +++ b/src/gamepad/linux/raw-gamepad.vala @@ -0,0 +1,164 @@ +// This file is part of GNOME Games. License: GPLv3 + +private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { + private int fd; + private GUdev.Client gudev_client; + private uint? event_source_id; + private Libevdev.Evdev dev; + + private uint8 key_map[Linux.Input.KEY_MAX]; + private uint8 abs_map[Linux.Input.ABS_MAX]; + private Linux.Input.AbsInfo abs_info[Linux.Input.ABS_MAX]; + + private string _identifier; + public string identifier { get { return _identifier; } } + + private string _name; + public string name { get { return _name; } } + + private string _guid; + public string guid { get { return _guid; } } + + private uint8 _axes_number = 0; + public uint8 axes_number { get { return _axes_number; } } + + private uint8 _buttons_number = 0; + public uint8 buttons_number { get { return _buttons_number; } } + + private int _dpads_number = -1; + public uint8 dpads_number { + get { + if (_dpads_number != -1) + return (uint8) _dpads_number; + + _dpads_number = 0; + for (var i = Linux.Input.ABS_HAT0X; i <= Linux.Input.ABS_HAT3Y; i += 2) { + if (dev.has_event_code (Linux.Input.EV_ABS, i) || + dev.has_event_code (Linux.Input.EV_ABS, i + 1)) { + var absinfo = dev.get_abs_info (i); + if (absinfo == null) + continue; + + _dpads_number++; + } + } + + return (uint8) _dpads_number; + } + } + + public LinuxRawGamepad (string file_name) throws FileError { + _identifier = file_name; + fd = Posix.open (file_name, Posix.O_RDONLY | Posix.O_NONBLOCK); + + if (fd < 0) + throw new FileError.FAILED (@"Unable to open file $file_name: $(Posix.strerror (Posix.errno))"); + + dev = new Libevdev.Evdev (); + if (dev.set_fd (fd) < 0) + throw new FileError.FAILED (@"Evdev is unable to open $file_name: $(Posix.strerror (Posix.errno))"); + + // Monitor the file for deletion + gudev_client = new GUdev.Client ({"input"}); + gudev_client.uevent.connect (handle_gudev_event); + + _name = dev.name; + _guid = LinuxGuidHelpers.from_dev (dev); + + // Poll the events in the default main loop + var channel = new IOChannel.unix_new (fd); + event_source_id = channel.add_watch (IOCondition.IN, poll_events); + + // Initialize dpads, buttons and axes + for (var i = Linux.Input.BTN_JOYSTICK; i < Linux.Input.KEY_MAX; i++) { + if (dev.has_event_code (Linux.Input.EV_KEY, i)) { + key_map[i - Linux.Input.BTN_MISC] = _buttons_number; + _buttons_number++; + } + } + for (var i = Linux.Input.BTN_MISC; i < Linux.Input.BTN_JOYSTICK; i++) { + if (dev.has_event_code (Linux.Input.EV_KEY, i)) { + key_map[i - Linux.Input.BTN_MISC] = _buttons_number; + _buttons_number++; + } + } + + + // Get info about axes + for (var i = 0; i < Linux.Input.ABS_MAX; i++) { + /* Skip dpads */ + if (i == Linux.Input.ABS_HAT0X) { + i = Linux.Input.ABS_HAT3Y; + continue; + } + if (dev.has_event_code (Linux.Input.EV_ABS, i)) { + var absinfo = dev.get_abs_info (i); + abs_map[i] = _axes_number; + abs_info[_axes_number] = absinfo; + _axes_number++; + } + } + } + + ~LinuxRawGamepad () { + Posix.close (fd); + remove_event_source (); + } + + private bool poll_events () { + while (dev.has_event_pending () > 0) + handle_evdev_event (); + + return true; + } + + private void handle_evdev_event () { + int rc; + Linux.Input.Event ev; + rc = dev.next_event (Libevdev.ReadFlag.NORMAL, out ev); + if (rc == 0) { + int code = ev.code; + switch (ev.type) { + case Linux.Input.EV_KEY: + if (code >= Linux.Input.BTN_MISC) { + button_event (key_map[code - Linux.Input.BTN_MISC], (bool) ev.value); + } + break; + case Linux.Input.EV_ABS: + switch (code) { + case Linux.Input.ABS_HAT0X: + case Linux.Input.ABS_HAT0Y: + case Linux.Input.ABS_HAT1X: + case Linux.Input.ABS_HAT1Y: + case Linux.Input.ABS_HAT2X: + case Linux.Input.ABS_HAT2Y: + case Linux.Input.ABS_HAT3X: + case Linux.Input.ABS_HAT3Y: + code -= Linux.Input.ABS_HAT0X; + dpad_event (code / 2, code % 2, ev.value); + break; + default: + var axis = abs_map[code]; + axis_event (axis, (double) ev.value / abs_info[axis].maximum); + break; + } + break; + } + } + } + + private void handle_gudev_event (string action, GUdev.Device gudev_dev) { + if (action == "remove" && gudev_dev.get_device_file () == identifier) { + remove_event_source (); + unplugged (); + } + } + + private void remove_event_source () { + if (event_source_id == null) + return; + + Source.remove (event_source_id); + event_source_id = null; + } +} diff --git a/src/gamepad/mapping-error.vala b/src/gamepad/mapping-error.vala new file mode 100644 index 00000000..cf4ac218 --- /dev/null +++ b/src/gamepad/mapping-error.vala @@ -0,0 +1,5 @@ +// This file is part of GNOME Games. License: GPLv3 + +public errordomain LibGamepad.MappingError { + NOT_A_MAPPING +} diff --git a/src/gamepad/mapping-helpers.vala b/src/gamepad/mapping-helpers.vala new file mode 100644 index 00000000..33f8e232 --- /dev/null +++ b/src/gamepad/mapping-helpers.vala @@ -0,0 +1,82 @@ +// This file is part of GNOME Games. License: GPLv3 + +private class LibGamepad.MappingHelpers { + public static InputType map_type (string str) { + switch (str) { + case "leftx": + case "lefty": + case "rightx": + case "righty": + return InputType.AXIS; + case "a": + case "b": + case "back": + case "dpdown": + case "dpleft": + case "dpright": + case "dpup": + case "guide": + case "leftshoulder": + case "leftstick": + case "lefttrigger": + case "rightshoulder": + case "rightstick": + case "righttrigger": + case "start": + case "x": + case "y": + return InputType.BUTTON; + default: + return InputType.INVALID; + } + } + + public static int map_value (string str) { + switch (str) { + case "leftx": + return StandardGamepadAxis.LEFT_X; + case "lefty": + return StandardGamepadAxis.LEFT_Y; + case "rightx": + return StandardGamepadAxis.RIGHT_X; + case "righty": + return StandardGamepadAxis.RIGHT_Y; + case "a": + return StandardGamepadButton.A; + case "b": + return StandardGamepadButton.B; + case "back": + return StandardGamepadButton.SELECT; + case "dpdown": + return StandardGamepadButton.DPAD_DOWN; + case "dpleft": + return StandardGamepadButton.DPAD_LEFT; + case "dpright": + return StandardGamepadButton.DPAD_RIGHT; + case "dpup": + return StandardGamepadButton.DPAD_UP; + case "guide": + return StandardGamepadButton.HOME; + case "leftshoulder": + return StandardGamepadButton.SHOULDER_L; + case "leftstick": + return StandardGamepadButton.STICK_L; + case "lefttrigger": + return StandardGamepadButton.TRIGGER_L; + case "rightshoulder": + return StandardGamepadButton.SHOULDER_R; + case "rightstick": + return StandardGamepadButton.STICK_R; + case "righttrigger": + return StandardGamepadButton.TRIGGER_R; + case "start": + return StandardGamepadButton.START; + case "x": + return StandardGamepadButton.X; + case "y": + return StandardGamepadButton.Y; + default: + return StandardGamepadButton.UNKNOWN; + } + } +} diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala new file mode 100644 index 00000000..0b0b6702 --- /dev/null +++ b/src/gamepad/mapping.vala @@ -0,0 +1,122 @@ +// This file is part of GNOME Games. License: GPLv3 + +private class LibGamepad.Dpad : Object { + public InputType types[4]; + public int values[4]; + public int axisval[2]; + + public Dpad () { + axisval[0] = axisval[1] = 0; + types[0] = types[1] = types[2] = types[3] = InputType.INVALID; + } +} + +public class LibGamepad.Mapping : Object { + private InputType[] buttons_type; + private int[] buttons_value; + private InputType[] axes_type; + private int[] axes_value; + private Dpad[] dpads; + + public Mapping.from_sdl_string (string? mappingstring) throws MappingError { + if (mappingstring == null || mappingstring == "") + throw new MappingError.NOT_A_MAPPING ("mappingstring cannot be null or empty"); + + var mappings = mappingstring.split (","); + foreach (var mapping in mappings) { + if (mapping.split (":").length == 2) { + var str = mapping.split (":")[0]; + var real = mapping.split (":")[1]; + var type = MappingHelpers.map_type (str); + if (type == InputType.INVALID) { + if (str != "platform") debug ("Invalid token : %s", str); + continue; + } + var value = MappingHelpers.map_value (str); + switch (real[0]) { + case 'h': + var dpad_parse_array = real[1:real.length].split ("."); + var dpad_index = int.parse (dpad_parse_array[0]); + var dpad_position_2pow = int.parse (dpad_parse_array[1]); + int dpad_position = 0; + while (dpad_position_2pow > 1) { + dpad_position_2pow >>= 1; + dpad_position++; + } + while (dpads.length <= dpad_index) dpads += new Dpad (); + dpads[dpad_index].types[dpad_position] = type; + dpads[dpad_index].values[dpad_position] = value; + break; + case 'b': + var button = int.parse (real[1:real.length]); + while (buttons_type.length <= button) buttons_type += InputType.INVALID; + if (buttons_value.length <= button) buttons_value.resize (button + 1); + buttons_type[button] = type; + buttons_value[button] = value; + break; + case 'a': + var axis = int.parse (real[1:real.length]); + while (axes_type.length <= axis) axes_type += InputType.INVALID; + if (axes_value.length <= axis) axes_value.resize (axis + 1); + axes_type[axis] = type; + axes_value[axis] = value; + break; + } + } + } + } + + public void get_dpad_mapping (int dpad_index, + int dpad_axis, + int dpad_value, + out InputType type, + out StandardGamepadAxis output_axis, + out StandardGamepadButton output_button) { + int dpad_position; + var dpad = dpads[dpad_index]; + if (dpad_value == 0) + dpad_position = (dpad.axisval[dpad_axis] + dpad_axis + 4) % 4; + else + dpad_position = (dpad_value + dpad_axis + 4) % 4; + dpad.axisval[dpad_axis] = dpad_value; + type = dpad.types[dpad_position]; + switch (type) { + case InputType.AXIS: + output_axis = (StandardGamepadAxis) dpad.values[dpad_position]; + break; + case InputType.BUTTON: + output_button = (StandardGamepadButton) dpad.values[dpad_position]; + break; + } + } + + public void get_axis_mapping (int axis_number, + out InputType type, + out StandardGamepadAxis output_axis, + out StandardGamepadButton output_button) { + type = axes_type[axis_number]; + switch (type) { + case InputType.AXIS: + output_axis = (StandardGamepadAxis) axes_value[axis_number]; + break; + case InputType.BUTTON: + output_button = (StandardGamepadButton) axes_value[axis_number]; + break; + } + } + + public void get_button_mapping (int button_number, + out InputType type, + out StandardGamepadAxis output_axis, + out StandardGamepadButton output_button) { + type = buttons_type[button_number]; + switch (type) { + case InputType.AXIS: + output_axis = (StandardGamepadAxis) buttons_value[button_number]; + break; + case InputType.BUTTON: + output_button = (StandardGamepadButton) buttons_value[button_number]; + break; + } + } +} diff --git a/src/gamepad/mappings-manager.vala b/src/gamepad/mappings-manager.vala new file mode 100644 index 00000000..39ed5962 --- /dev/null +++ b/src/gamepad/mappings-manager.vala @@ -0,0 +1,99 @@ +// This file is part of GNOME Games. License: GPLv3 + +/** + * This class gives methods to set/update the mappings + * + * The client interfaces with this class primarily + */ +public class LibGamepad.MappingsManager { + private static HashTable names; + private static HashTable mappings; + + private static bool? inited; + + /** + * Adds mappings from a file + * @param file_name The file name + */ + public static void add_from_file (string file_name) throws IOError { + init_if_not (); + + var file = File.new_for_path (file_name); + add_from_input_stream (file.read ()); + } + + /** + * Adds mappings from a resource path + * @param path The path + */ + public static void add_from_resource (string path) throws IOError { + init_if_not (); + + add_from_input_stream (resources_open_stream (path, ResourceLookupFlags.NONE)); + } + + /** + * Adds mappings from an InputStream + * @param input_stream The input stream + */ + public static void add_from_input_stream (InputStream input_stream) { + init_if_not (); + + var data_stream = new DataInputStream (input_stream); + var mappingstr = data_stream.read_line (); + while (mappingstr != null) { + add_mapping (mappingstr); + mappingstr = data_stream.read_line (); + } + } + + + /** + * Adds a mapping from a string (only one gamepad) + */ + public static void add_mapping (string mappingstr) { + init_if_not (); + + if (mappingstr == "" || mappingstr[0] == '#') + return; + + if (mappingstr.index_of ("platform") == -1 || mappingstr.index_of ("platform:Linux") != -1) { + var split = mappingstr.split (",", 3); + names.replace (split[0], split[1]); + mappings.replace (split[0], split[2]); + } + } + + + /** + * Gets the name of a gamepad from the database + * @param guid The guid of the wanted gamepad + * @return The name if present in the database + */ + public static string? get_name (string guid) { + init_if_not (); + return names.get (guid); + } + + + /** + * Gets the current mapping from the databse + * @param guid The guid of the wanted gamepad + * @return The mapping if present in the database + */ + public static string? get_mapping (string guid) { + init_if_not (); + return mappings.get (guid); + } + + private static void init_if_not () { + if (inited == null || inited == false) { + inited = true; + if (names == null) + names = new HashTable (str_hash, str_equal); + if (mappings == null) + mappings = new HashTable (str_hash, str_equal); + MappingsManager.add_from_resource ("/org/gnome/Games/gamepads/gamecontrollerdb.txt"); + } + } +} diff --git a/src/gamepad/raw-gamepad-monitor.vala b/src/gamepad/raw-gamepad-monitor.vala new file mode 100644 index 00000000..bbf949cd --- /dev/null +++ b/src/gamepad/raw-gamepad-monitor.vala @@ -0,0 +1,35 @@ +// This file is part of GNOME Games. License: GPLv3 + +/** + * This is one of the interfaces that needs to be implemented by the driver. + * + * This interface deals with handling events related to plugging and unplugging + * of gamepads and also provides a method to iterate through all the plugged in + * gamepads. An identifier is a string that is easily understood by the driver + * and may depend on other factors, i.e. it may not be unique for the gamepad. + */ +public interface LibGamepad.RawGamepadMonitor : Object { + /** + * This signal should be emmited when a gamepad is plugged in. + * @param raw_gamepad The raw gamepad + */ + public abstract signal void gamepad_plugged (RawGamepad raw_gamepad); + + /** + * This signal should be emitted when a gamepad is unplugged + * + * If an identifier which is not passed with gamepad_plugged even once is passed, + * then it is ignored. Drivers may use this to their benefit + * + * @param identifier The identifier of the unplugged gamepad + */ + public abstract signal void gamepad_unplugged (string identifier); + + public delegate void RawGamepadCallback (RawGamepad raw_gamepad); + + /** + * This function allows to iterate over all gamepads + * @param callback The callback + */ + public abstract void foreach_gamepad (RawGamepadCallback callback); +} diff --git a/src/gamepad/raw-gamepad.vala b/src/gamepad/raw-gamepad.vala new file mode 100644 index 00000000..313bba7d --- /dev/null +++ b/src/gamepad/raw-gamepad.vala @@ -0,0 +1,59 @@ +// This file is part of GNOME Games. License: GPLv3 + +/** + * This is one of the interfaces that needs to be implemented by the driver. + * + * This interface represents a gamepad and deals with handling events that are + * emitted by a gamepad and also provide properties like name and guid along + * with number of buttons, axes and dpads. + * + * The constructor takes a identifier as a parameter. + * @see RawGamepadMonitor + */ +public interface LibGamepad.RawGamepad : Object { + /** + * Emitted when a button is pressed/released + * @param code The button code from 0 to buttons_number + * @param value True if pressed, False if released + */ + public abstract signal void button_event (int code, bool value); + + /** + * Emitted when an axis's value changes + * @param axis The axis number from 0 to axes_number + * @param value The value of the axis ranging from -1 to 1 + */ + public abstract signal void axis_event (int axis, double value); + + /** + * Emitted when a dpad's axis's value changes + * @param dpad The dpad number from 0 to + * @param axis The axis: 0 for X, 1 for Y + * @param value The value of the axis ranging from -1 to 1 + */ + public abstract signal void dpad_event (int dpad, int axis, int value); + + /** + * Emitted when the gamepad is unplugged + */ + public abstract signal void unplugged (); + + public abstract string identifier { get; } + public abstract string name { get; } + public abstract string guid { get; } + + /** + * Number of axes of the gamepad + */ + public abstract uint8 axes_number { get; } + + /** + * Number of buttons of the gamepad + */ + public abstract uint8 buttons_number { get; } + + /** + * Number of dpads of the gamepad` + */ + public abstract uint8 dpads_number { get; } +} diff --git a/src/gamepad/standard-gamepad-axis.vala b/src/gamepad/standard-gamepad-axis.vala new file mode 100644 index 00000000..4275ce9c --- /dev/null +++ b/src/gamepad/standard-gamepad-axis.vala @@ -0,0 +1,33 @@ +// This file is part of GNOME Games. License: GPLv3 + +// This file is part of GNOME Games. License: GPLv3 + +public enum LibGamepad.StandardGamepadAxis { + /** + * The horizontal axis of the left stick. + * + * Negative is left, positive is right. + */ + LEFT_X, + + /** + * The vertical axis of the left stick. + * + * Negative is up, positive is down. + */ + LEFT_Y, + + /** + * The horizontal axis of the right stick. + * + * Negative is left, positive is right. + */ + RIGHT_X, + + /** + * The vertical axis of the right stick. + * + * Negative is up, positive is down. + */ + RIGHT_Y, +} diff --git a/src/gamepad/standard-gamepad-button.vala b/src/gamepad/standard-gamepad-button.vala new file mode 100644 index 00000000..1cec6c85 --- /dev/null +++ b/src/gamepad/standard-gamepad-button.vala @@ -0,0 +1,95 @@ +// This file is part of GNOME Games. License: GPLv3 + +// This file is part of GNOME Games. License: GPLv3 + +public enum LibGamepad.StandardGamepadButton { + /** + * The button at the bottom of the action pad. + */ + A, + + /** + * The button at the right of the action pad. + */ + B, + + /** + * The button at the left of the action pad. + */ + X, + + /** + * The button at the top of the action pad. + */ + Y, + + /** + * The button at the left of the top of the gamepad. + */ + SHOULDER_L, + + /** + * The button at the right of the top of the gamepad. + */ + SHOULDER_R, + + /** + * The trigger at the left of the top of the gamepad. + */ + TRIGGER_L, + + /** + * The trigger at the right of the top of the gamepad. + */ + TRIGGER_R, + + /** + * The button at the left of the menu pad. + */ + SELECT, + + /** + * The button at the right of the menu pad. + */ + START, + + /** + * The button under the left stick. + */ + STICK_L, + + /** + * The button under the right stick. + */ + STICK_R, + + /** + * The button at the top of the directional pad. + */ + DPAD_UP, + + /** + * The button at the bottom of the directional pad. + */ + DPAD_DOWN, + + /** + * The button at the left of the directional pad. + */ + DPAD_LEFT, + + /** + * The button at the right of the directional pad. + */ + DPAD_RIGHT, + + /** + * The button at the center of the menu pad. + */ + HOME, + + /** + * An unknown button + */ + UNKNOWN, +} diff --git a/src/retro/retro-gamepad.vala b/src/retro/retro-gamepad.vala new file mode 100644 index 00000000..09c56a9c --- /dev/null +++ b/src/retro/retro-gamepad.vala @@ -0,0 +1,105 @@ +// This file is part of GNOME Games. License: GPLv3 + +private class Games.RetroGamepad: Object, Retro.InputDevice { + public LibGamepad.Gamepad gamepad { get; construct; } + + private bool[] buttons; + private int16[] axes; + + public RetroGamepad (LibGamepad.Gamepad gamepad) { + Object (gamepad: gamepad); + } + + construct { + buttons = new bool[LibGamepad.StandardGamepadButton.HOME + 1]; + axes = new int16[4]; + + gamepad.button_event.connect ((button, value) => buttons[button] = value); + gamepad.axis_event.connect ((axis, value) => axes[axis] = (int16) (value * int16.MAX)); + } + + public void poll () {} + + public int16 get_input_state (Retro.DeviceType device, uint index, uint id) { + switch (device) { + case Retro.DeviceType.JOYPAD: + return get_button_pressed ((Retro.JoypadId) id) ? int16.MAX : 0; + case Retro.DeviceType.ANALOG: + return get_analog_value ((Retro.AnalogIndex) index, (Retro.AnalogId) id); + default: + return 0; + } + } + + public Retro.DeviceType get_device_type () { + return Retro.DeviceType.ANALOG; + } + + public uint64 get_device_capabilities () { + return (1 << Retro.DeviceType.JOYPAD) | (1 << Retro.DeviceType.ANALOG); + } + + public bool get_button_pressed (Retro.JoypadId button) { + switch (button) { + case Retro.JoypadId.B: + return buttons[LibGamepad.StandardGamepadButton.A]; + case Retro.JoypadId.Y: + return buttons[LibGamepad.StandardGamepadButton.X]; + case Retro.JoypadId.SELECT: + return buttons[LibGamepad.StandardGamepadButton.SELECT]; + case Retro.JoypadId.START: + return buttons[LibGamepad.StandardGamepadButton.START]; + case Retro.JoypadId.UP: + return buttons[LibGamepad.StandardGamepadButton.DPAD_UP]; + case Retro.JoypadId.DOWN: + return buttons[LibGamepad.StandardGamepadButton.DPAD_DOWN]; + case Retro.JoypadId.LEFT: + return buttons[LibGamepad.StandardGamepadButton.DPAD_LEFT]; + case Retro.JoypadId.RIGHT: + return buttons[LibGamepad.StandardGamepadButton.DPAD_RIGHT]; + case Retro.JoypadId.A: + return buttons[LibGamepad.StandardGamepadButton.B]; + case Retro.JoypadId.X: + return buttons[LibGamepad.StandardGamepadButton.Y]; + case Retro.JoypadId.L: + return buttons[LibGamepad.StandardGamepadButton.SHOULDER_L]; + case Retro.JoypadId.R: + return buttons[LibGamepad.StandardGamepadButton.SHOULDER_R]; + case Retro.JoypadId.L2: + return buttons[LibGamepad.StandardGamepadButton.TRIGGER_L]; + case Retro.JoypadId.R2: + return buttons[LibGamepad.StandardGamepadButton.TRIGGER_R]; + case Retro.JoypadId.L3: + return buttons[LibGamepad.StandardGamepadButton.STICK_L]; + case Retro.JoypadId.R3: + return buttons[LibGamepad.StandardGamepadButton.STICK_R]; + default: + return false; + } + } + + public int16 get_analog_value (Retro.AnalogIndex index, Retro.AnalogId id) { + switch (index) { + case Retro.AnalogIndex.LEFT: + switch (id) { + case Retro.AnalogId.X: + return axes[LibGamepad.StandardGamepadAxis.LEFT_X]; + case Retro.AnalogId.Y: + return axes[LibGamepad.StandardGamepadAxis.LEFT_Y]; + default: + return 0; + } + case Retro.AnalogIndex.RIGHT: + switch (id) { + case Retro.AnalogId.X: + return axes[LibGamepad.StandardGamepadAxis.RIGHT_X]; + case Retro.AnalogId.Y: + return axes[LibGamepad.StandardGamepadAxis.RIGHT_Y]; + default: + return 0; + } + default: + return 0; + } + } +} diff --git a/src/retro/retro-input-manager.vala b/src/retro/retro-input-manager.vala new file mode 100644 index 00000000..dc66121d --- /dev/null +++ b/src/retro/retro-input-manager.vala @@ -0,0 +1,75 @@ +// This file is part of GNOME Games. License: GPLv3 + +private class Games.RetroInputManager : Object { + public RetroGtk.InputDeviceManager input { get; private set; } + + private RetroGtk.VirtualGamepad keyboard; + private LibGamepad.GamepadMonitor gamepad_monitor; + private bool[] is_port_plugged; + private int keyboard_port; + + public RetroInputManager (Gtk.EventBox widget) { + input = new RetroGtk.InputDeviceManager (); + keyboard = new RetroGtk.VirtualGamepad (widget); + gamepad_monitor = new LibGamepad.GamepadMonitor (); + + input.set_keyboard (new RetroGtk.Keyboard (widget)); + + gamepad_monitor.foreach_gamepad ((gamepad) => { + if (gamepad.mapped) { + var port = is_port_plugged.length; + is_port_plugged += true; + input.set_controller_device (port, new RetroGamepad (gamepad)); + gamepad.unplugged.connect (() => handle_gamepad_unplugged (port)); + } + }); + + keyboard_port = is_port_plugged.length; + is_port_plugged += true; + input.set_controller_device (keyboard_port, keyboard); + gamepad_monitor.gamepad_plugged.connect (handle_gamepad_plugged); + } + + private void handle_gamepad_plugged (LibGamepad.Gamepad gamepad) { + if (!gamepad.mapped) + return; + + // Plug this gamepad to the port where the keyboard was plugged as a last resort + var port = keyboard_port; + print (@"plugged $port\n"); + gamepad.unplugged.connect (() => handle_gamepad_unplugged (port)); + input.set_controller_device (keyboard_port, new RetroGamepad (gamepad)); + + // Assign keyboard to another unplugged port if exists and return + for (var i = keyboard_port; i < is_port_plugged.length; i++) { + if (!is_port_plugged[i]) { + // Found an unplugged port and so assigning keyboard to it + keyboard_port = i; + is_port_plugged[keyboard_port] = true; + input.set_controller_device (keyboard_port, keyboard); + + return; + } + } + + // Now it means that there is no unplugged port so append keyboard to ports + keyboard_port = is_port_plugged.length; + is_port_plugged += true; + input.set_controller_device (keyboard_port, keyboard); + } + + private void handle_gamepad_unplugged (int port) { + print (@"unplugged $port\n"); + if (keyboard_port > port) { + // Remove the controller and shift keyboard to "lesser" port + is_port_plugged[keyboard_port] = false; + input.remove_controller_device (keyboard_port); + keyboard_port = port; + input.set_controller_device (keyboard_port, keyboard); + } else { + // Just remove the controller as no need to shift keyboard + is_port_plugged[port] = false; + input.remove_controller_device (port); + } + } +} diff --git a/src/retro/retro-runner.vala b/src/retro/retro-runner.vala index 5e9d8dee..f760594d 100644 --- a/src/retro/retro-runner.vala +++ b/src/retro/retro-runner.vala @@ -27,9 +27,7 @@ public class Games.RetroRunner : Object, Runner { private Retro.Core core; private RetroGtk.CairoDisplay video; private RetroGtk.PaPlayer audio; - private RetroGtk.VirtualGamepad gamepad; - private RetroGtk.Keyboard keyboard; - private RetroGtk.InputDeviceManager input; + private RetroInputManager input_manager; private Retro.Options options; private RetroLog log; private Retro.Loop loop; @@ -138,9 +136,7 @@ public class Games.RetroRunner : Object, Runner { widget = new Gtk.EventBox (); widget.add (video); video.visible = true; - - gamepad = new RetroGtk.VirtualGamepad (widget); - keyboard = new RetroGtk.Keyboard (widget); + input_manager = new RetroInputManager (widget); prepare_core (module_basename, uri); core.shutdown.connect (on_shutdown); @@ -166,19 +162,15 @@ public class Games.RetroRunner : Object, Runner { core = new Retro.Core (module_path); audio = new RetroGtk.PaPlayer (); - input = new RetroGtk.InputDeviceManager (); options = new Retro.Options (); log = new RetroLog (); - input.set_controller_device (0, gamepad); - input.set_keyboard (keyboard); - core.variables_interface = options; core.log_interface = log; core.video_interface = video; core.audio_interface = audio; - core.input_interface = input; + core.input_interface = input_manager.input; core.init (); @@ -397,4 +389,3 @@ public class Games.RetroRunner : Object, Runner { } } } - From fa20fe09d54fae6ff70c48acba066b80d5a58e79 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Wed, 13 Jul 2016 15:54:18 +0530 Subject: [PATCH 02/72] Remove gamepads_number from GamepadMonitor --- src/gamepad/gamepad-monitor.vala | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index 81731a3f..4a4631c8 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -25,11 +25,6 @@ public class LibGamepad.GamepadMonitor : Object { private static HashTable identifier_to_raw_gamepad; private static HashTable guid_to_raw_name; - /** - * The number of plugged in gamepads - */ - public uint gamepads_number { get; private set; default = 0; } - private RawGamepadMonitor raw_gamepad_monitor; public GamepadMonitor () { @@ -78,7 +73,6 @@ public class LibGamepad.GamepadMonitor : Object { } private void add_gamepad (RawGamepad raw_gamepad) { - gamepads_number++; identifier_to_raw_gamepad.replace (raw_gamepad.identifier, raw_gamepad); guid_to_raw_name.replace (raw_gamepad.guid.to_string (), raw_gamepad.name); } @@ -92,7 +86,6 @@ public class LibGamepad.GamepadMonitor : Object { var raw_gamepad = identifier_to_raw_gamepad.get (identifier); if (raw_gamepad == null) return; - gamepads_number--; guid_to_raw_name.remove (raw_gamepad.guid.to_string ()); gamepad_unplugged (raw_gamepad.identifier, raw_gamepad.guid, MappingsManager.get_name (raw_gamepad.guid) ?? raw_gamepad.name); From 44ba663e6e37dc1f8b5f55e4087da8030c742f12 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Wed, 13 Jul 2016 15:56:14 +0530 Subject: [PATCH 03/72] Remove debug print statements from retro-input-manager --- src/retro/retro-input-manager.vala | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/retro/retro-input-manager.vala b/src/retro/retro-input-manager.vala index dc66121d..fa9919ad 100644 --- a/src/retro/retro-input-manager.vala +++ b/src/retro/retro-input-manager.vala @@ -36,7 +36,6 @@ private class Games.RetroInputManager : Object { // Plug this gamepad to the port where the keyboard was plugged as a last resort var port = keyboard_port; - print (@"plugged $port\n"); gamepad.unplugged.connect (() => handle_gamepad_unplugged (port)); input.set_controller_device (keyboard_port, new RetroGamepad (gamepad)); @@ -59,7 +58,6 @@ private class Games.RetroInputManager : Object { } private void handle_gamepad_unplugged (int port) { - print (@"unplugged $port\n"); if (keyboard_port > port) { // Remove the controller and shift keyboard to "lesser" port is_port_plugged[keyboard_port] = false; From b4e2c0460f3066e14811ccd7a1fd28cb5c1019dd Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Wed, 13 Jul 2016 16:00:17 +0530 Subject: [PATCH 04/72] Remove get_raw_gamepad from GamepadMonitor --- src/gamepad/gamepad-monitor.vala | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index 4a4631c8..e564f7ce 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -41,20 +41,6 @@ public class LibGamepad.GamepadMonitor : Object { } - /** - * This static function returns a raw gamepad given a guid. It can be used - * for creating interfaces for remappable-controls. - * @param identifier The identifier of the raw gamepad that you want - */ - public static RawGamepad? get_raw_gamepad (string identifier) { - init_static_if_not (); - - if (identifier == null) - return null; - else - return identifier_to_raw_gamepad.get (identifier); - } - private static void init_static_if_not () { if (identifier_to_raw_gamepad == null) identifier_to_raw_gamepad = new HashTable (str_hash, str_equal); From 9629ca474d4fd6527c62d79fcc58e77edeb06eb6 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Wed, 13 Jul 2016 16:14:37 +0530 Subject: [PATCH 05/72] Remove identifier from the frontend code and manage it only in the drivers --- src/gamepad/gamepad-monitor.vala | 13 ++++++------- src/gamepad/linux/raw-gamepad-monitor.vala | 10 +++++++++- src/gamepad/raw-gamepad-monitor.vala | 8 ++------ 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index e564f7ce..b4326ef3 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -14,11 +14,9 @@ public class LibGamepad.GamepadMonitor : Object { /** * Emitted when a gamepad is unplugged - * @param identifier The identifier of the unplugged gamepad - * @param guid The guid of the unplugged gamepad - * @param name The name of the unplugged gamepad + * @param gamepad The gamepad */ - public signal void gamepad_unplugged (string identifier, string guid, string? name); + public signal void gamepad_unplugged (Gamepad gamepad); public delegate void GamepadCallback (Gamepad gamepad); @@ -68,12 +66,13 @@ public class LibGamepad.GamepadMonitor : Object { gamepad_plugged (new Gamepad (raw_gamepad)); } - private void on_raw_gamepad_unplugged (string identifier) { - var raw_gamepad = identifier_to_raw_gamepad.get (identifier); + private void on_raw_gamepad_unplugged (RawGamepad raw_gamepad) { + gamepad_unplugged (new Gamepad (raw_gamepad)); + /*var raw_gamepad = identifier_to_raw_gamepad.get (identifier); if (raw_gamepad == null) return; guid_to_raw_name.remove (raw_gamepad.guid.to_string ()); gamepad_unplugged (raw_gamepad.identifier, raw_gamepad.guid, - MappingsManager.get_name (raw_gamepad.guid) ?? raw_gamepad.name); + MappingsManager.get_name (raw_gamepad.guid) ?? raw_gamepad.name);*/ } } diff --git a/src/gamepad/linux/raw-gamepad-monitor.vala b/src/gamepad/linux/raw-gamepad-monitor.vala index 9d1d7e43..60f4eaf0 100644 --- a/src/gamepad/linux/raw-gamepad-monitor.vala +++ b/src/gamepad/linux/raw-gamepad-monitor.vala @@ -4,6 +4,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { public delegate void RawGamepadCallback (RawGamepad raw_gamepad); private GUdev.Client client; + private HashTable raw_gamepads; public LinuxRawGamepadMonitor () { client = new GUdev.Client ({"input"}); @@ -43,10 +44,17 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { } catch (FileError err) { return; } + raw_gamepads.replace (identifier, raw_gamepad); gamepad_plugged (raw_gamepad); break; case "remove": - gamepad_unplugged (identifier); + if (!raw_gamepads.contains (identifier)) + break; + + var raw_gamepad = raw_gamepads.get (identifier); + raw_gamepads.remove (identifier); + + gamepad_unplugged (raw_gamepad); break; } } diff --git a/src/gamepad/raw-gamepad-monitor.vala b/src/gamepad/raw-gamepad-monitor.vala index bbf949cd..3df128f4 100644 --- a/src/gamepad/raw-gamepad-monitor.vala +++ b/src/gamepad/raw-gamepad-monitor.vala @@ -17,13 +17,9 @@ public interface LibGamepad.RawGamepadMonitor : Object { /** * This signal should be emitted when a gamepad is unplugged - * - * If an identifier which is not passed with gamepad_plugged even once is passed, - * then it is ignored. Drivers may use this to their benefit - * - * @param identifier The identifier of the unplugged gamepad + * @param raw_gamepad The raw gamepad */ - public abstract signal void gamepad_unplugged (string identifier); + public abstract signal void gamepad_unplugged (RawGamepad raw_gamepad); public delegate void RawGamepadCallback (RawGamepad raw_gamepad); From b9175cb3a68bb4c4625cda6fc3642cda0b277c0d Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 16:04:36 +0530 Subject: [PATCH 06/72] Revamp RawGamepad and RawGamepadMonitor --- src/gamepad/linux/raw-gamepad-monitor.vala | 11 ++++++++--- src/gamepad/linux/raw-gamepad.vala | 12 ------------ 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/gamepad/linux/raw-gamepad-monitor.vala b/src/gamepad/linux/raw-gamepad-monitor.vala index 60f4eaf0..1c94aa75 100644 --- a/src/gamepad/linux/raw-gamepad-monitor.vala +++ b/src/gamepad/linux/raw-gamepad-monitor.vala @@ -9,9 +9,8 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { public LinuxRawGamepadMonitor () { client = new GUdev.Client ({"input"}); client.uevent.connect (handle_udev_client_callback); - } - public void foreach_gamepad (RawGamepadCallback callback) { + // Initialize internally plugged in gamepads client.query_by_subsystem ("input").foreach ((dev) => { if (dev.get_device_file () == null) return; @@ -24,11 +23,15 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { } catch (FileError err) { return; } - callback (raw_gamepad); + raw_gamepads.replace (identifier, raw_gamepad); } }); } + public void foreach_gamepad (RawGamepadCallback callback) { + raw_gamepads.foreach((identifier, raw_gamepad) => callback (raw_gamepad)); + } + private void handle_udev_client_callback (string action, GUdev.Device dev) { if (dev.get_device_file () == null) return; @@ -54,6 +57,8 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { var raw_gamepad = raw_gamepads.get (identifier); raw_gamepads.remove (identifier); + // This signal is emitted from here to simplify the code + raw_gamepad.unplugged (); gamepad_unplugged (raw_gamepad); break; } diff --git a/src/gamepad/linux/raw-gamepad.vala b/src/gamepad/linux/raw-gamepad.vala index 71fab6d8..d6fa3f7f 100644 --- a/src/gamepad/linux/raw-gamepad.vala +++ b/src/gamepad/linux/raw-gamepad.vala @@ -2,7 +2,6 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { private int fd; - private GUdev.Client gudev_client; private uint? event_source_id; private Libevdev.Evdev dev; @@ -58,10 +57,6 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { if (dev.set_fd (fd) < 0) throw new FileError.FAILED (@"Evdev is unable to open $file_name: $(Posix.strerror (Posix.errno))"); - // Monitor the file for deletion - gudev_client = new GUdev.Client ({"input"}); - gudev_client.uevent.connect (handle_gudev_event); - _name = dev.name; _guid = LinuxGuidHelpers.from_dev (dev); @@ -147,13 +142,6 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { } } - private void handle_gudev_event (string action, GUdev.Device gudev_dev) { - if (action == "remove" && gudev_dev.get_device_file () == identifier) { - remove_event_source (); - unplugged (); - } - } - private void remove_event_source () { if (event_source_id == null) return; From 4d7c61a30f94374eb255a4a29615b50112285614 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 18:13:17 +0530 Subject: [PATCH 07/72] Revamp gamepad-monitor --- src/gamepad/gamepad-monitor.vala | 43 +++++++++++--------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index b4326ef3..aad42f73 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -20,8 +20,7 @@ public class LibGamepad.GamepadMonitor : Object { public delegate void GamepadCallback (Gamepad gamepad); - private static HashTable identifier_to_raw_gamepad; - private static HashTable guid_to_raw_name; + private static SList gamepads; private RawGamepadMonitor raw_gamepad_monitor; @@ -31,19 +30,13 @@ public class LibGamepad.GamepadMonitor : Object { raw_gamepad_monitor = new LinuxRawGamepadMonitor (); raw_gamepad_monitor.gamepad_plugged.connect (on_raw_gamepad_plugged); - raw_gamepad_monitor.gamepad_unplugged.connect (on_raw_gamepad_unplugged); - - raw_gamepad_monitor.foreach_gamepad ((raw_gamepad) => { - add_gamepad (raw_gamepad); - }); + raw_gamepad_monitor.foreach_gamepad ((raw_gamepad) => add_gamepad (raw_gamepad)); } private static void init_static_if_not () { - if (identifier_to_raw_gamepad == null) - identifier_to_raw_gamepad = new HashTable (str_hash, str_equal); - if (guid_to_raw_name == null) - guid_to_raw_name = new HashTable (str_hash, str_equal); + if (gamepads == null) + gamepads = new SList (); } /** @@ -51,28 +44,20 @@ public class LibGamepad.GamepadMonitor : Object { * @param callback The callback */ public void foreach_gamepad (GamepadCallback callback) { - identifier_to_raw_gamepad.foreach ((identifier, raw_gamepad) => { - callback (new Gamepad (raw_gamepad)); - }); + gamepads.foreach ((gamepad) => callback (gamepad)); } - private void add_gamepad (RawGamepad raw_gamepad) { - identifier_to_raw_gamepad.replace (raw_gamepad.identifier, raw_gamepad); - guid_to_raw_name.replace (raw_gamepad.guid.to_string (), raw_gamepad.name); + private Gamepad add_gamepad (RawGamepad raw_gamepad) { + var gamepad = new Gamepad (raw_gamepad); + gamepads.append (gamepad); + gamepad.unplugged.connect (() => { + gamepads.remove (gamepad); + gamepad_unplugged (gamepad); + }); + return gamepad; } private void on_raw_gamepad_plugged (RawGamepad raw_gamepad) { - add_gamepad (raw_gamepad); - gamepad_plugged (new Gamepad (raw_gamepad)); - } - - private void on_raw_gamepad_unplugged (RawGamepad raw_gamepad) { - gamepad_unplugged (new Gamepad (raw_gamepad)); - /*var raw_gamepad = identifier_to_raw_gamepad.get (identifier); - if (raw_gamepad == null) - return; - guid_to_raw_name.remove (raw_gamepad.guid.to_string ()); - gamepad_unplugged (raw_gamepad.identifier, raw_gamepad.guid, - MappingsManager.get_name (raw_gamepad.guid) ?? raw_gamepad.name);*/ + gamepad_plugged (add_gamepad (raw_gamepad)); } } From 404b29cae01ad9da50dfca5b35b70e7c3772df0b Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 18:18:31 +0530 Subject: [PATCH 08/72] Prefix linux in front of the linux driver files --- src/Makefile.am | 6 +- src/gamepad/linux/guid-helpers.c | 260 ++++++++ ...d-helpers.vala => linux-guid-helpers.vala} | 0 ...or.vala => linux-raw-gamepad-monitor.vala} | 0 ...aw-gamepad.vala => linux-raw-gamepad.vala} | 0 src/gamepad/linux/raw-gamepad-monitor.c | 594 ++++++++++++++++++ 6 files changed, 857 insertions(+), 3 deletions(-) create mode 100644 src/gamepad/linux/guid-helpers.c rename src/gamepad/linux/{guid-helpers.vala => linux-guid-helpers.vala} (100%) rename src/gamepad/linux/{raw-gamepad-monitor.vala => linux-raw-gamepad-monitor.vala} (100%) rename src/gamepad/linux/{raw-gamepad.vala => linux-raw-gamepad.vala} (100%) create mode 100644 src/gamepad/linux/raw-gamepad-monitor.c diff --git a/src/Makefile.am b/src/Makefile.am index a1b09718..50ac2071 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -55,9 +55,9 @@ gnome_games_SOURCES = \ \ gamepad/raw-gamepad-monitor.vala \ gamepad/raw-gamepad.vala \ - gamepad/linux/guid-helpers.vala \ - gamepad/linux/raw-gamepad-monitor.vala \ - gamepad/linux/raw-gamepad.vala \ + gamepad/linux/linux-guid-helpers.vala \ + gamepad/linux/linux-raw-gamepad-monitor.vala \ + gamepad/linux/linux-raw-gamepad.vala \ gamepad/gamepad-monitor.vala \ gamepad/gamepad.vala \ gamepad/helpers.vala \ diff --git a/src/gamepad/linux/guid-helpers.c b/src/gamepad/linux/guid-helpers.c new file mode 100644 index 00000000..b081805c --- /dev/null +++ b/src/gamepad/linux/guid-helpers.c @@ -0,0 +1,260 @@ +/* guid-helpers.c generated by valac 0.32.0.45-49b63, the Vala compiler + * generated from guid-helpers.vala, do not modify */ + +/* This file is part of GNOME Games. License: GPLv3*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS (lib_gamepad_linux_guid_helpers_get_type ()) +#define LIB_GAMEPAD_LINUX_GUID_HELPERS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS, LibGamepadLinuxGuidHelpers)) +#define LIB_GAMEPAD_LINUX_GUID_HELPERS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS, LibGamepadLinuxGuidHelpersClass)) +#define LIB_GAMEPAD_IS_LINUX_GUID_HELPERS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS)) +#define LIB_GAMEPAD_IS_LINUX_GUID_HELPERS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS)) +#define LIB_GAMEPAD_LINUX_GUID_HELPERS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS, LibGamepadLinuxGuidHelpersClass)) + +typedef struct _LibGamepadLinuxGuidHelpers LibGamepadLinuxGuidHelpers; +typedef struct _LibGamepadLinuxGuidHelpersClass LibGamepadLinuxGuidHelpersClass; +typedef struct _LibGamepadLinuxGuidHelpersPrivate LibGamepadLinuxGuidHelpersPrivate; +#define _g_free0(var) (var = (g_free (var), NULL)) +#define _libevdev_free0(var) ((var == NULL) ? NULL : (var = (libevdev_free (var), NULL))) + +struct _LibGamepadLinuxGuidHelpers { + GObject parent_instance; + LibGamepadLinuxGuidHelpersPrivate * priv; +}; + +struct _LibGamepadLinuxGuidHelpersClass { + GObjectClass parent_class; +}; + + +static gpointer lib_gamepad_linux_guid_helpers_parent_class = NULL; + +GType lib_gamepad_linux_guid_helpers_get_type (void) G_GNUC_CONST; +enum { + LIB_GAMEPAD_LINUX_GUID_HELPERS_DUMMY_PROPERTY +}; +gchar* lib_gamepad_linux_guid_helpers_from_dev (struct libevdev* dev); +gchar* lib_gamepad_uint16s_to_hex_string (guint16* data, int data_length1); +gchar* lib_gamepad_linux_guid_helpers_from_file (const gchar* file_name, GError** error); +LibGamepadLinuxGuidHelpers* lib_gamepad_linux_guid_helpers_new (void); +LibGamepadLinuxGuidHelpers* lib_gamepad_linux_guid_helpers_construct (GType object_type); + + +gchar* lib_gamepad_linux_guid_helpers_from_dev (struct libevdev* dev) { + gchar* result = NULL; + guint16 guid[8] = {0}; + struct libevdev* _tmp0_ = NULL; + gint _tmp1_ = 0; + gint _tmp2_ = 0; + gint _tmp3_ = 0; + guint16 _tmp4_ = 0U; + guint16 _tmp5_ = 0U; + struct libevdev* _tmp6_ = NULL; + gint _tmp7_ = 0; + gint _tmp8_ = 0; + gint _tmp9_ = 0; + guint16 _tmp10_ = 0U; + guint16 _tmp11_ = 0U; + struct libevdev* _tmp12_ = NULL; + gint _tmp13_ = 0; + gint _tmp14_ = 0; + gint _tmp15_ = 0; + guint16 _tmp16_ = 0U; + guint16 _tmp17_ = 0U; + struct libevdev* _tmp18_ = NULL; + gint _tmp19_ = 0; + gint _tmp20_ = 0; + gint _tmp21_ = 0; + guint16 _tmp22_ = 0U; + guint16 _tmp23_ = 0U; + gchar* _tmp24_ = NULL; + g_return_val_if_fail (dev != NULL, NULL); + _tmp0_ = dev; + _tmp1_ = libevdev_get_id_bustype (_tmp0_); + _tmp2_ = _tmp1_; + _tmp3_ = GINT_TO_LE (_tmp2_); + guid[0] = (guint16) _tmp3_; + _tmp4_ = guid[0]; + guid[1] = (guint16) 0; + _tmp5_ = guid[1]; + _tmp6_ = dev; + _tmp7_ = libevdev_get_id_vendor (_tmp6_); + _tmp8_ = _tmp7_; + _tmp9_ = GINT_TO_LE (_tmp8_); + guid[2] = (guint16) _tmp9_; + _tmp10_ = guid[2]; + guid[3] = (guint16) 0; + _tmp11_ = guid[3]; + _tmp12_ = dev; + _tmp13_ = libevdev_get_id_product (_tmp12_); + _tmp14_ = _tmp13_; + _tmp15_ = GINT_TO_LE (_tmp14_); + guid[4] = (guint16) _tmp15_; + _tmp16_ = guid[4]; + guid[5] = (guint16) 0; + _tmp17_ = guid[5]; + _tmp18_ = dev; + _tmp19_ = libevdev_get_id_version (_tmp18_); + _tmp20_ = _tmp19_; + _tmp21_ = GINT_TO_LE (_tmp20_); + guid[6] = (guint16) _tmp21_; + _tmp22_ = guid[6]; + guid[7] = (guint16) 0; + _tmp23_ = guid[7]; + _tmp24_ = lib_gamepad_uint16s_to_hex_string (guid, 8); + result = _tmp24_; + return result; +} + + +static const gchar* string_to_string (const gchar* self) { + const gchar* result = NULL; + g_return_val_if_fail (self != NULL, NULL); + result = self; + return result; +} + + +gchar* lib_gamepad_linux_guid_helpers_from_file (const gchar* file_name, GError** error) { + gchar* result = NULL; + gint fd = 0; + const gchar* _tmp0_ = NULL; + gint _tmp1_ = 0; + gint _tmp2_ = 0; + struct libevdev* dev = NULL; + struct libevdev* _tmp12_ = NULL; + struct libevdev* _tmp13_ = NULL; + gint _tmp14_ = 0; + gint _tmp15_ = 0; + gchar* guid = NULL; + struct libevdev* _tmp25_ = NULL; + gchar* _tmp26_ = NULL; + gint _tmp27_ = 0; + GError * _inner_error_ = NULL; + g_return_val_if_fail (file_name != NULL, NULL); + _tmp0_ = file_name; + _tmp1_ = open (_tmp0_, O_RDONLY | O_NONBLOCK, (mode_t) 0); + fd = _tmp1_; + _tmp2_ = fd; + if (_tmp2_ < 0) { + const gchar* _tmp3_ = NULL; + const gchar* _tmp4_ = NULL; + gint _tmp5_ = 0; + const gchar* _tmp6_ = NULL; + const gchar* _tmp7_ = NULL; + gchar* _tmp8_ = NULL; + gchar* _tmp9_ = NULL; + GError* _tmp10_ = NULL; + GError* _tmp11_ = NULL; + _tmp3_ = file_name; + _tmp4_ = string_to_string (_tmp3_); + _tmp5_ = errno; + _tmp6_ = strerror (_tmp5_); + _tmp7_ = string_to_string (_tmp6_); + _tmp8_ = g_strconcat ("Unable to open file ", _tmp4_, ": ", _tmp7_, NULL); + _tmp9_ = _tmp8_; + _tmp10_ = g_error_new_literal (G_FILE_ERROR, G_FILE_ERROR_FAILED, _tmp9_); + _tmp11_ = _tmp10_; + _g_free0 (_tmp9_); + _inner_error_ = _tmp11_; + if (_inner_error_->domain == G_FILE_ERROR) { + g_propagate_error (error, _inner_error_); + return NULL; + } else { + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + return NULL; + } + } + _tmp12_ = libevdev_new (); + dev = _tmp12_; + _tmp13_ = dev; + _tmp14_ = fd; + _tmp15_ = libevdev_set_fd (_tmp13_, _tmp14_); + if (_tmp15_ < 0) { + const gchar* _tmp16_ = NULL; + const gchar* _tmp17_ = NULL; + gint _tmp18_ = 0; + const gchar* _tmp19_ = NULL; + const gchar* _tmp20_ = NULL; + gchar* _tmp21_ = NULL; + gchar* _tmp22_ = NULL; + GError* _tmp23_ = NULL; + GError* _tmp24_ = NULL; + _tmp16_ = file_name; + _tmp17_ = string_to_string (_tmp16_); + _tmp18_ = errno; + _tmp19_ = strerror (_tmp18_); + _tmp20_ = string_to_string (_tmp19_); + _tmp21_ = g_strconcat ("Evdev error on opening file ", _tmp17_, ": ", _tmp20_, NULL); + _tmp22_ = _tmp21_; + _tmp23_ = g_error_new_literal (G_FILE_ERROR, G_FILE_ERROR_FAILED, _tmp22_); + _tmp24_ = _tmp23_; + _g_free0 (_tmp22_); + _inner_error_ = _tmp24_; + if (_inner_error_->domain == G_FILE_ERROR) { + g_propagate_error (error, _inner_error_); + _libevdev_free0 (dev); + return NULL; + } else { + _libevdev_free0 (dev); + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + return NULL; + } + } + _tmp25_ = dev; + _tmp26_ = lib_gamepad_linux_guid_helpers_from_dev (_tmp25_); + guid = _tmp26_; + _tmp27_ = fd; + close (_tmp27_); + result = guid; + _libevdev_free0 (dev); + return result; +} + + +LibGamepadLinuxGuidHelpers* lib_gamepad_linux_guid_helpers_construct (GType object_type) { + LibGamepadLinuxGuidHelpers * self = NULL; + self = (LibGamepadLinuxGuidHelpers*) g_object_new (object_type, NULL); + return self; +} + + +LibGamepadLinuxGuidHelpers* lib_gamepad_linux_guid_helpers_new (void) { + return lib_gamepad_linux_guid_helpers_construct (LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS); +} + + +static void lib_gamepad_linux_guid_helpers_class_init (LibGamepadLinuxGuidHelpersClass * klass) { + lib_gamepad_linux_guid_helpers_parent_class = g_type_class_peek_parent (klass); +} + + +static void lib_gamepad_linux_guid_helpers_instance_init (LibGamepadLinuxGuidHelpers * self) { +} + + +GType lib_gamepad_linux_guid_helpers_get_type (void) { + static volatile gsize lib_gamepad_linux_guid_helpers_type_id__volatile = 0; + if (g_once_init_enter (&lib_gamepad_linux_guid_helpers_type_id__volatile)) { + static const GTypeInfo g_define_type_info = { sizeof (LibGamepadLinuxGuidHelpersClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) lib_gamepad_linux_guid_helpers_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (LibGamepadLinuxGuidHelpers), 0, (GInstanceInitFunc) lib_gamepad_linux_guid_helpers_instance_init, NULL }; + GType lib_gamepad_linux_guid_helpers_type_id; + lib_gamepad_linux_guid_helpers_type_id = g_type_register_static (G_TYPE_OBJECT, "LibGamepadLinuxGuidHelpers", &g_define_type_info, 0); + g_once_init_leave (&lib_gamepad_linux_guid_helpers_type_id__volatile, lib_gamepad_linux_guid_helpers_type_id); + } + return lib_gamepad_linux_guid_helpers_type_id__volatile; +} + + + diff --git a/src/gamepad/linux/guid-helpers.vala b/src/gamepad/linux/linux-guid-helpers.vala similarity index 100% rename from src/gamepad/linux/guid-helpers.vala rename to src/gamepad/linux/linux-guid-helpers.vala diff --git a/src/gamepad/linux/raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala similarity index 100% rename from src/gamepad/linux/raw-gamepad-monitor.vala rename to src/gamepad/linux/linux-raw-gamepad-monitor.vala diff --git a/src/gamepad/linux/raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala similarity index 100% rename from src/gamepad/linux/raw-gamepad.vala rename to src/gamepad/linux/linux-raw-gamepad.vala diff --git a/src/gamepad/linux/raw-gamepad-monitor.c b/src/gamepad/linux/raw-gamepad-monitor.c new file mode 100644 index 00000000..cfd7bc87 --- /dev/null +++ b/src/gamepad/linux/raw-gamepad-monitor.c @@ -0,0 +1,594 @@ +/* raw-gamepad-monitor.c generated by valac 0.32.0.45-49b63, the Vala compiler + * generated from raw-gamepad-monitor.vala, do not modify */ + +/* This file is part of GNOME Games. License: GPLv3*/ + +#include +#include +#include +#include +#include + + +#define LIB_GAMEPAD_TYPE_RAW_GAMEPAD_MONITOR (lib_gamepad_raw_gamepad_monitor_get_type ()) +#define LIB_GAMEPAD_RAW_GAMEPAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD_MONITOR, LibGamepadRawGamepadMonitor)) +#define LIB_GAMEPAD_IS_RAW_GAMEPAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD_MONITOR)) +#define LIB_GAMEPAD_RAW_GAMEPAD_MONITOR_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD_MONITOR, LibGamepadRawGamepadMonitorIface)) + +typedef struct _LibGamepadRawGamepadMonitor LibGamepadRawGamepadMonitor; +typedef struct _LibGamepadRawGamepadMonitorIface LibGamepadRawGamepadMonitorIface; + +#define LIB_GAMEPAD_TYPE_RAW_GAMEPAD (lib_gamepad_raw_gamepad_get_type ()) +#define LIB_GAMEPAD_RAW_GAMEPAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD, LibGamepadRawGamepad)) +#define LIB_GAMEPAD_IS_RAW_GAMEPAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD)) +#define LIB_GAMEPAD_RAW_GAMEPAD_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD, LibGamepadRawGamepadIface)) + +typedef struct _LibGamepadRawGamepad LibGamepadRawGamepad; +typedef struct _LibGamepadRawGamepadIface LibGamepadRawGamepadIface; + +#define LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR (lib_gamepad_linux_raw_gamepad_monitor_get_type ()) +#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR, LibGamepadLinuxRawGamepadMonitor)) +#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR, LibGamepadLinuxRawGamepadMonitorClass)) +#define LIB_GAMEPAD_IS_LINUX_RAW_GAMEPAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR)) +#define LIB_GAMEPAD_IS_LINUX_RAW_GAMEPAD_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR)) +#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR, LibGamepadLinuxRawGamepadMonitorClass)) + +typedef struct _LibGamepadLinuxRawGamepadMonitor LibGamepadLinuxRawGamepadMonitor; +typedef struct _LibGamepadLinuxRawGamepadMonitorClass LibGamepadLinuxRawGamepadMonitorClass; +typedef struct _LibGamepadLinuxRawGamepadMonitorPrivate LibGamepadLinuxRawGamepadMonitorPrivate; +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL))) +#define _g_hash_table_unref0(var) ((var == NULL) ? NULL : (var = (g_hash_table_unref (var), NULL))) + +#define LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD (lib_gamepad_linux_raw_gamepad_get_type ()) +#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD, LibGamepadLinuxRawGamepad)) +#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD, LibGamepadLinuxRawGamepadClass)) +#define LIB_GAMEPAD_IS_LINUX_RAW_GAMEPAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD)) +#define LIB_GAMEPAD_IS_LINUX_RAW_GAMEPAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD)) +#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD, LibGamepadLinuxRawGamepadClass)) + +typedef struct _LibGamepadLinuxRawGamepad LibGamepadLinuxRawGamepad; +typedef struct _LibGamepadLinuxRawGamepadClass LibGamepadLinuxRawGamepadClass; +#define _g_free0(var) (var = (g_free (var), NULL)) +#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL))) +#define __g_list_free__g_object_unref0_0(var) ((var == NULL) ? NULL : (var = (_g_list_free__g_object_unref0_ (var), NULL))) +typedef struct _Block1Data Block1Data; + +struct _LibGamepadRawGamepadIface { + GTypeInterface parent_iface; + const gchar* (*get_identifier) (LibGamepadRawGamepad* self); + const gchar* (*get_name) (LibGamepadRawGamepad* self); + const gchar* (*get_guid) (LibGamepadRawGamepad* self); + guint8 (*get_axes_number) (LibGamepadRawGamepad* self); + guint8 (*get_buttons_number) (LibGamepadRawGamepad* self); + guint8 (*get_dpads_number) (LibGamepadRawGamepad* self); +}; + +typedef void (*LibGamepadRawGamepadMonitorRawGamepadCallback) (LibGamepadRawGamepad* raw_gamepad, void* user_data); +struct _LibGamepadRawGamepadMonitorIface { + GTypeInterface parent_iface; + void (*foreach_gamepad) (LibGamepadRawGamepadMonitor* self, LibGamepadRawGamepadMonitorRawGamepadCallback callback, void* callback_target); +}; + +struct _LibGamepadLinuxRawGamepadMonitor { + GObject parent_instance; + LibGamepadLinuxRawGamepadMonitorPrivate * priv; +}; + +struct _LibGamepadLinuxRawGamepadMonitorClass { + GObjectClass parent_class; +}; + +struct _LibGamepadLinuxRawGamepadMonitorPrivate { + GUdevClient* client; + GHashTable* raw_gamepads; +}; + +typedef void (*LibGamepadLinuxRawGamepadMonitorRawGamepadCallback) (LibGamepadRawGamepad* raw_gamepad, void* user_data); +struct _Block1Data { + int _ref_count_; + LibGamepadLinuxRawGamepadMonitor* self; + LibGamepadLinuxRawGamepadMonitorRawGamepadCallback callback; + gpointer callback_target; +}; + + +static gpointer lib_gamepad_linux_raw_gamepad_monitor_parent_class = NULL; +static LibGamepadRawGamepadMonitorIface* lib_gamepad_linux_raw_gamepad_monitor_lib_gamepad_raw_gamepad_monitor_parent_iface = NULL; + +GType lib_gamepad_raw_gamepad_get_type (void) G_GNUC_CONST; +GType lib_gamepad_raw_gamepad_monitor_get_type (void) G_GNUC_CONST; +GType lib_gamepad_linux_raw_gamepad_monitor_get_type (void) G_GNUC_CONST; +#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR, LibGamepadLinuxRawGamepadMonitorPrivate)) +enum { + LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR_DUMMY_PROPERTY +}; +LibGamepadLinuxRawGamepadMonitor* lib_gamepad_linux_raw_gamepad_monitor_new (void); +LibGamepadLinuxRawGamepadMonitor* lib_gamepad_linux_raw_gamepad_monitor_construct (GType object_type); +static void lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback (LibGamepadLinuxRawGamepadMonitor* self, const gchar* action, GUdevDevice* dev); +static void _lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback_g_udev_client_uevent (GUdevClient* _sender, const gchar* action, GUdevDevice* device, gpointer self); +static void __lambda5_ (LibGamepadLinuxRawGamepadMonitor* self, GUdevDevice* dev); +GType lib_gamepad_linux_raw_gamepad_get_type (void) G_GNUC_CONST; +LibGamepadLinuxRawGamepad* lib_gamepad_linux_raw_gamepad_new (const gchar* file_name, GError** error); +LibGamepadLinuxRawGamepad* lib_gamepad_linux_raw_gamepad_construct (GType object_type, const gchar* file_name, GError** error); +static void ___lambda5__gfunc (gconstpointer data, gpointer self); +static void _g_object_unref0_ (gpointer var); +static void _g_list_free__g_object_unref0_ (GList* self); +static void lib_gamepad_linux_raw_gamepad_monitor_real_foreach_gamepad (LibGamepadRawGamepadMonitor* base, LibGamepadLinuxRawGamepadMonitorRawGamepadCallback callback, void* callback_target); +static Block1Data* block1_data_ref (Block1Data* _data1_); +static void block1_data_unref (void * _userdata_); +static void __lambda6_ (Block1Data* _data1_, const gchar* identifier, LibGamepadRawGamepad* raw_gamepad); +static void ___lambda6__gh_func (gconstpointer key, gconstpointer value, gpointer self); +static void lib_gamepad_linux_raw_gamepad_monitor_finalize (GObject* obj); +static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func); +static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func); + + +static void _lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback_g_udev_client_uevent (GUdevClient* _sender, const gchar* action, GUdevDevice* device, gpointer self) { + lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback ((LibGamepadLinuxRawGamepadMonitor*) self, action, device); +} + + +static gpointer _g_object_ref0 (gpointer self) { + return self ? g_object_ref (self) : NULL; +} + + +static void __lambda5_ (LibGamepadLinuxRawGamepadMonitor* self, GUdevDevice* dev) { + GUdevDevice* _tmp0_ = NULL; + const gchar* _tmp1_ = NULL; + gchar* identifier = NULL; + GUdevDevice* _tmp2_ = NULL; + const gchar* _tmp3_ = NULL; + gchar* _tmp4_ = NULL; + gboolean _tmp5_ = FALSE; + gboolean _tmp6_ = FALSE; + GUdevDevice* _tmp7_ = NULL; + gboolean _tmp8_ = FALSE; + GError * _inner_error_ = NULL; + g_return_if_fail (dev != NULL); + _tmp0_ = dev; + _tmp1_ = g_udev_device_get_device_file (_tmp0_); + if (_tmp1_ == NULL) { + return; + } + _tmp2_ = dev; + _tmp3_ = g_udev_device_get_device_file (_tmp2_); + _tmp4_ = g_strdup (_tmp3_); + identifier = _tmp4_; + _tmp7_ = dev; + _tmp8_ = g_udev_device_has_property (_tmp7_, "ID_INPUT_JOYSTICK"); + if (_tmp8_) { + GUdevDevice* _tmp9_ = NULL; + const gchar* _tmp10_ = NULL; + _tmp9_ = dev; + _tmp10_ = g_udev_device_get_property (_tmp9_, "ID_INPUT_JOYSTICK"); + _tmp6_ = g_strcmp0 (_tmp10_, "1") == 0; + } else { + _tmp6_ = FALSE; + } + if (_tmp6_) { + _tmp5_ = TRUE; + } else { + gboolean _tmp11_ = FALSE; + GUdevDevice* _tmp12_ = NULL; + gboolean _tmp13_ = FALSE; + _tmp12_ = dev; + _tmp13_ = g_udev_device_has_property (_tmp12_, ".INPUT_CLASS"); + if (_tmp13_) { + GUdevDevice* _tmp14_ = NULL; + const gchar* _tmp15_ = NULL; + _tmp14_ = dev; + _tmp15_ = g_udev_device_get_property (_tmp14_, ".INPUT_CLASS"); + _tmp11_ = g_strcmp0 (_tmp15_, "joystick") == 0; + } else { + _tmp11_ = FALSE; + } + _tmp5_ = _tmp11_; + } + if (_tmp5_) { + LibGamepadRawGamepad* raw_gamepad = NULL; + GHashTable* _tmp20_ = NULL; + const gchar* _tmp21_ = NULL; + gchar* _tmp22_ = NULL; + LibGamepadRawGamepad* _tmp23_ = NULL; + LibGamepadRawGamepad* _tmp24_ = NULL; + { + LibGamepadLinuxRawGamepad* _tmp16_ = NULL; + const gchar* _tmp17_ = NULL; + LibGamepadLinuxRawGamepad* _tmp18_ = NULL; + LibGamepadLinuxRawGamepad* _tmp19_ = NULL; + _tmp17_ = identifier; + _tmp18_ = lib_gamepad_linux_raw_gamepad_new (_tmp17_, &_inner_error_); + _tmp16_ = _tmp18_; + if (G_UNLIKELY (_inner_error_ != NULL)) { + if (_inner_error_->domain == G_FILE_ERROR) { + goto __catch3_g_file_error; + } + _g_object_unref0 (raw_gamepad); + _g_free0 (identifier); + g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + return; + } + _tmp19_ = _tmp16_; + _tmp16_ = NULL; + _g_object_unref0 (raw_gamepad); + raw_gamepad = (LibGamepadRawGamepad*) _tmp19_; + _g_object_unref0 (_tmp16_); + } + goto __finally3; + __catch3_g_file_error: + { + GError* err = NULL; + err = _inner_error_; + _inner_error_ = NULL; + _g_error_free0 (err); + _g_object_unref0 (raw_gamepad); + _g_free0 (identifier); + return; + } + __finally3: + if (G_UNLIKELY (_inner_error_ != NULL)) { + _g_object_unref0 (raw_gamepad); + _g_free0 (identifier); + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + return; + } + _tmp20_ = self->priv->raw_gamepads; + _tmp21_ = identifier; + _tmp22_ = g_strdup (_tmp21_); + _tmp23_ = raw_gamepad; + _tmp24_ = _g_object_ref0 (_tmp23_); + g_hash_table_replace (_tmp20_, _tmp22_, _tmp24_); + _g_object_unref0 (raw_gamepad); + } + _g_free0 (identifier); +} + + +static void ___lambda5__gfunc (gconstpointer data, gpointer self) { + __lambda5_ ((LibGamepadLinuxRawGamepadMonitor*) self, (GUdevDevice*) data); +} + + +static void _g_object_unref0_ (gpointer var) { + (var == NULL) ? NULL : (var = (g_object_unref (var), NULL)); +} + + +static void _g_list_free__g_object_unref0_ (GList* self) { + g_list_foreach (self, (GFunc) _g_object_unref0_, NULL); + g_list_free (self); +} + + +LibGamepadLinuxRawGamepadMonitor* lib_gamepad_linux_raw_gamepad_monitor_construct (GType object_type) { + LibGamepadLinuxRawGamepadMonitor * self = NULL; + gchar* _tmp0_ = NULL; + gchar** _tmp1_ = NULL; + gchar** _tmp2_ = NULL; + gint _tmp2__length1 = 0; + GUdevClient* _tmp3_ = NULL; + GUdevClient* _tmp4_ = NULL; + GUdevClient* _tmp5_ = NULL; + GList* _tmp6_ = NULL; + GList* _tmp7_ = NULL; + self = (LibGamepadLinuxRawGamepadMonitor*) g_object_new (object_type, NULL); + _tmp0_ = g_strdup ("input"); + _tmp1_ = g_new0 (gchar*, 1 + 1); + _tmp1_[0] = _tmp0_; + _tmp2_ = _tmp1_; + _tmp2__length1 = 1; + _tmp3_ = g_udev_client_new (_tmp2_); + _g_object_unref0 (self->priv->client); + self->priv->client = _tmp3_; + _tmp2_ = (_vala_array_free (_tmp2_, _tmp2__length1, (GDestroyNotify) g_free), NULL); + _tmp4_ = self->priv->client; + g_signal_connect_object (_tmp4_, "uevent", (GCallback) _lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback_g_udev_client_uevent, self, 0); + _tmp5_ = self->priv->client; + _tmp6_ = g_udev_client_query_by_subsystem (_tmp5_, "input"); + _tmp7_ = _tmp6_; + g_list_foreach (_tmp7_, ___lambda5__gfunc, self); + __g_list_free__g_object_unref0_0 (_tmp7_); + return self; +} + + +LibGamepadLinuxRawGamepadMonitor* lib_gamepad_linux_raw_gamepad_monitor_new (void) { + return lib_gamepad_linux_raw_gamepad_monitor_construct (LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR); +} + + +static Block1Data* block1_data_ref (Block1Data* _data1_) { + g_atomic_int_inc (&_data1_->_ref_count_); + return _data1_; +} + + +static void block1_data_unref (void * _userdata_) { + Block1Data* _data1_; + _data1_ = (Block1Data*) _userdata_; + if (g_atomic_int_dec_and_test (&_data1_->_ref_count_)) { + LibGamepadLinuxRawGamepadMonitor* self; + self = _data1_->self; + _g_object_unref0 (self); + g_slice_free (Block1Data, _data1_); + } +} + + +static void __lambda6_ (Block1Data* _data1_, const gchar* identifier, LibGamepadRawGamepad* raw_gamepad) { + LibGamepadLinuxRawGamepadMonitor* self; + LibGamepadLinuxRawGamepadMonitorRawGamepadCallback _tmp0_ = NULL; + void* _tmp0__target = NULL; + LibGamepadRawGamepad* _tmp1_ = NULL; + self = _data1_->self; + g_return_if_fail (identifier != NULL); + g_return_if_fail (raw_gamepad != NULL); + _tmp0_ = _data1_->callback; + _tmp0__target = _data1_->callback_target; + _tmp1_ = raw_gamepad; + _tmp0_ (_tmp1_, _tmp0__target); +} + + +static void ___lambda6__gh_func (gconstpointer key, gconstpointer value, gpointer self) { + __lambda6_ (self, (const gchar*) key, (LibGamepadRawGamepad*) value); +} + + +static void lib_gamepad_linux_raw_gamepad_monitor_real_foreach_gamepad (LibGamepadRawGamepadMonitor* base, LibGamepadLinuxRawGamepadMonitorRawGamepadCallback callback, void* callback_target) { + LibGamepadLinuxRawGamepadMonitor * self; + Block1Data* _data1_; + LibGamepadLinuxRawGamepadMonitorRawGamepadCallback _tmp0_ = NULL; + void* _tmp0__target = NULL; + GHashTable* _tmp1_ = NULL; + self = (LibGamepadLinuxRawGamepadMonitor*) base; + _data1_ = g_slice_new0 (Block1Data); + _data1_->_ref_count_ = 1; + _data1_->self = g_object_ref (self); + _tmp0_ = callback; + _tmp0__target = callback_target; + _data1_->callback = _tmp0_; + _data1_->callback_target = _tmp0__target; + _tmp1_ = self->priv->raw_gamepads; + g_hash_table_foreach (_tmp1_, ___lambda6__gh_func, _data1_); + block1_data_unref (_data1_); + _data1_ = NULL; +} + + +static void lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback (LibGamepadLinuxRawGamepadMonitor* self, const gchar* action, GUdevDevice* dev) { + GUdevDevice* _tmp0_ = NULL; + const gchar* _tmp1_ = NULL; + gchar* identifier = NULL; + GUdevDevice* _tmp2_ = NULL; + const gchar* _tmp3_ = NULL; + gchar* _tmp4_ = NULL; + gboolean _tmp5_ = FALSE; + gboolean _tmp6_ = FALSE; + GUdevDevice* _tmp7_ = NULL; + gboolean _tmp8_ = FALSE; + GError * _inner_error_ = NULL; + g_return_if_fail (self != NULL); + g_return_if_fail (action != NULL); + g_return_if_fail (dev != NULL); + _tmp0_ = dev; + _tmp1_ = g_udev_device_get_device_file (_tmp0_); + if (_tmp1_ == NULL) { + return; + } + _tmp2_ = dev; + _tmp3_ = g_udev_device_get_device_file (_tmp2_); + _tmp4_ = g_strdup (_tmp3_); + identifier = _tmp4_; + _tmp7_ = dev; + _tmp8_ = g_udev_device_has_property (_tmp7_, "ID_INPUT_JOYSTICK"); + if (_tmp8_) { + GUdevDevice* _tmp9_ = NULL; + const gchar* _tmp10_ = NULL; + _tmp9_ = dev; + _tmp10_ = g_udev_device_get_property (_tmp9_, "ID_INPUT_JOYSTICK"); + _tmp6_ = g_strcmp0 (_tmp10_, "1") == 0; + } else { + _tmp6_ = FALSE; + } + if (_tmp6_) { + _tmp5_ = TRUE; + } else { + gboolean _tmp11_ = FALSE; + GUdevDevice* _tmp12_ = NULL; + gboolean _tmp13_ = FALSE; + _tmp12_ = dev; + _tmp13_ = g_udev_device_has_property (_tmp12_, ".INPUT_CLASS"); + if (_tmp13_) { + GUdevDevice* _tmp14_ = NULL; + const gchar* _tmp15_ = NULL; + _tmp14_ = dev; + _tmp15_ = g_udev_device_get_property (_tmp14_, ".INPUT_CLASS"); + _tmp11_ = g_strcmp0 (_tmp15_, "joystick") == 0; + } else { + _tmp11_ = FALSE; + } + _tmp5_ = _tmp11_; + } + if (_tmp5_) { + const gchar* _tmp16_ = NULL; + const gchar* _tmp17_ = NULL; + GQuark _tmp19_ = 0U; + static GQuark _tmp18_label0 = 0; + static GQuark _tmp18_label1 = 0; + _tmp16_ = action; + _tmp17_ = _tmp16_; + _tmp19_ = (NULL == _tmp17_) ? 0 : g_quark_from_string (_tmp17_); + if (_tmp19_ == ((0 != _tmp18_label0) ? _tmp18_label0 : (_tmp18_label0 = g_quark_from_static_string ("add")))) { + switch (0) { + default: + { + LibGamepadRawGamepad* raw_gamepad = NULL; + GHashTable* _tmp24_ = NULL; + const gchar* _tmp25_ = NULL; + gchar* _tmp26_ = NULL; + LibGamepadRawGamepad* _tmp27_ = NULL; + LibGamepadRawGamepad* _tmp28_ = NULL; + LibGamepadRawGamepad* _tmp29_ = NULL; + { + LibGamepadLinuxRawGamepad* _tmp20_ = NULL; + const gchar* _tmp21_ = NULL; + LibGamepadLinuxRawGamepad* _tmp22_ = NULL; + LibGamepadLinuxRawGamepad* _tmp23_ = NULL; + _tmp21_ = identifier; + _tmp22_ = lib_gamepad_linux_raw_gamepad_new (_tmp21_, &_inner_error_); + _tmp20_ = _tmp22_; + if (G_UNLIKELY (_inner_error_ != NULL)) { + if (_inner_error_->domain == G_FILE_ERROR) { + goto __catch4_g_file_error; + } + _g_object_unref0 (raw_gamepad); + _g_free0 (identifier); + g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + return; + } + _tmp23_ = _tmp20_; + _tmp20_ = NULL; + _g_object_unref0 (raw_gamepad); + raw_gamepad = (LibGamepadRawGamepad*) _tmp23_; + _g_object_unref0 (_tmp20_); + } + goto __finally4; + __catch4_g_file_error: + { + GError* err = NULL; + err = _inner_error_; + _inner_error_ = NULL; + _g_error_free0 (err); + _g_object_unref0 (raw_gamepad); + _g_free0 (identifier); + return; + } + __finally4: + if (G_UNLIKELY (_inner_error_ != NULL)) { + _g_object_unref0 (raw_gamepad); + _g_free0 (identifier); + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); + g_clear_error (&_inner_error_); + return; + } + _tmp24_ = self->priv->raw_gamepads; + _tmp25_ = identifier; + _tmp26_ = g_strdup (_tmp25_); + _tmp27_ = raw_gamepad; + _tmp28_ = _g_object_ref0 (_tmp27_); + g_hash_table_replace (_tmp24_, _tmp26_, _tmp28_); + _tmp29_ = raw_gamepad; + g_signal_emit_by_name ((LibGamepadRawGamepadMonitor*) self, "gamepad-plugged", _tmp29_); + _g_object_unref0 (raw_gamepad); + break; + } + } + } else if (_tmp19_ == ((0 != _tmp18_label1) ? _tmp18_label1 : (_tmp18_label1 = g_quark_from_static_string ("remove")))) { + switch (0) { + default: + { + GHashTable* _tmp30_ = NULL; + const gchar* _tmp31_ = NULL; + gboolean _tmp32_ = FALSE; + LibGamepadRawGamepad* raw_gamepad = NULL; + GHashTable* _tmp33_ = NULL; + const gchar* _tmp34_ = NULL; + gconstpointer _tmp35_ = NULL; + LibGamepadRawGamepad* _tmp36_ = NULL; + GHashTable* _tmp37_ = NULL; + const gchar* _tmp38_ = NULL; + LibGamepadRawGamepad* _tmp39_ = NULL; + LibGamepadRawGamepad* _tmp40_ = NULL; + _tmp30_ = self->priv->raw_gamepads; + _tmp31_ = identifier; + _tmp32_ = g_hash_table_contains (_tmp30_, _tmp31_); + if (!_tmp32_) { + break; + } + _tmp33_ = self->priv->raw_gamepads; + _tmp34_ = identifier; + _tmp35_ = g_hash_table_lookup (_tmp33_, _tmp34_); + _tmp36_ = _g_object_ref0 ((LibGamepadRawGamepad*) _tmp35_); + raw_gamepad = _tmp36_; + _tmp37_ = self->priv->raw_gamepads; + _tmp38_ = identifier; + g_hash_table_remove (_tmp37_, _tmp38_); + _tmp39_ = raw_gamepad; + g_signal_emit_by_name (_tmp39_, "unplugged"); + _tmp40_ = raw_gamepad; + g_signal_emit_by_name ((LibGamepadRawGamepadMonitor*) self, "gamepad-unplugged", _tmp40_); + _g_object_unref0 (raw_gamepad); + break; + } + } + } + } + _g_free0 (identifier); +} + + +static void lib_gamepad_linux_raw_gamepad_monitor_class_init (LibGamepadLinuxRawGamepadMonitorClass * klass) { + lib_gamepad_linux_raw_gamepad_monitor_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (klass, sizeof (LibGamepadLinuxRawGamepadMonitorPrivate)); + G_OBJECT_CLASS (klass)->finalize = lib_gamepad_linux_raw_gamepad_monitor_finalize; +} + + +static void lib_gamepad_linux_raw_gamepad_monitor_lib_gamepad_raw_gamepad_monitor_interface_init (LibGamepadRawGamepadMonitorIface * iface) { + lib_gamepad_linux_raw_gamepad_monitor_lib_gamepad_raw_gamepad_monitor_parent_iface = g_type_interface_peek_parent (iface); + iface->foreach_gamepad = (void (*)(LibGamepadRawGamepadMonitor*, LibGamepadRawGamepadMonitorRawGamepadCallback, void*)) lib_gamepad_linux_raw_gamepad_monitor_real_foreach_gamepad; +} + + +static void lib_gamepad_linux_raw_gamepad_monitor_instance_init (LibGamepadLinuxRawGamepadMonitor * self) { + self->priv = LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR_GET_PRIVATE (self); +} + + +static void lib_gamepad_linux_raw_gamepad_monitor_finalize (GObject* obj) { + LibGamepadLinuxRawGamepadMonitor * self; + self = G_TYPE_CHECK_INSTANCE_CAST (obj, LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR, LibGamepadLinuxRawGamepadMonitor); + _g_object_unref0 (self->priv->client); + _g_hash_table_unref0 (self->priv->raw_gamepads); + G_OBJECT_CLASS (lib_gamepad_linux_raw_gamepad_monitor_parent_class)->finalize (obj); +} + + +GType lib_gamepad_linux_raw_gamepad_monitor_get_type (void) { + static volatile gsize lib_gamepad_linux_raw_gamepad_monitor_type_id__volatile = 0; + if (g_once_init_enter (&lib_gamepad_linux_raw_gamepad_monitor_type_id__volatile)) { + static const GTypeInfo g_define_type_info = { sizeof (LibGamepadLinuxRawGamepadMonitorClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) lib_gamepad_linux_raw_gamepad_monitor_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (LibGamepadLinuxRawGamepadMonitor), 0, (GInstanceInitFunc) lib_gamepad_linux_raw_gamepad_monitor_instance_init, NULL }; + static const GInterfaceInfo lib_gamepad_raw_gamepad_monitor_info = { (GInterfaceInitFunc) lib_gamepad_linux_raw_gamepad_monitor_lib_gamepad_raw_gamepad_monitor_interface_init, (GInterfaceFinalizeFunc) NULL, NULL}; + GType lib_gamepad_linux_raw_gamepad_monitor_type_id; + lib_gamepad_linux_raw_gamepad_monitor_type_id = g_type_register_static (G_TYPE_OBJECT, "LibGamepadLinuxRawGamepadMonitor", &g_define_type_info, 0); + g_type_add_interface_static (lib_gamepad_linux_raw_gamepad_monitor_type_id, LIB_GAMEPAD_TYPE_RAW_GAMEPAD_MONITOR, &lib_gamepad_raw_gamepad_monitor_info); + g_once_init_leave (&lib_gamepad_linux_raw_gamepad_monitor_type_id__volatile, lib_gamepad_linux_raw_gamepad_monitor_type_id); + } + return lib_gamepad_linux_raw_gamepad_monitor_type_id__volatile; +} + + +static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) { + if ((array != NULL) && (destroy_func != NULL)) { + int i; + for (i = 0; i < array_length; i = i + 1) { + if (((gpointer*) array)[i] != NULL) { + destroy_func (((gpointer*) array)[i]); + } + } + } +} + + +static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) { + _vala_array_destroy (array, array_length, destroy_func); + g_free (array); +} + + + From a2274fea178d15faa348718cde5f16cf5d1f20b1 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 18:24:39 +0530 Subject: [PATCH 09/72] Remove identifier from public API of drivers --- src/gamepad/linux/linux-raw-gamepad.vala | 6 ++---- src/gamepad/raw-gamepad-monitor.vala | 5 ----- src/gamepad/raw-gamepad.vala | 4 ---- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index d6fa3f7f..f200c251 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -8,9 +8,7 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { private uint8 key_map[Linux.Input.KEY_MAX]; private uint8 abs_map[Linux.Input.ABS_MAX]; private Linux.Input.AbsInfo abs_info[Linux.Input.ABS_MAX]; - - private string _identifier; - public string identifier { get { return _identifier; } } + private string identifier; private string _name; public string name { get { return _name; } } @@ -47,7 +45,7 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { } public LinuxRawGamepad (string file_name) throws FileError { - _identifier = file_name; + identifier = file_name; fd = Posix.open (file_name, Posix.O_RDONLY | Posix.O_NONBLOCK); if (fd < 0) diff --git a/src/gamepad/raw-gamepad-monitor.vala b/src/gamepad/raw-gamepad-monitor.vala index 3df128f4..a3bc68bb 100644 --- a/src/gamepad/raw-gamepad-monitor.vala +++ b/src/gamepad/raw-gamepad-monitor.vala @@ -2,11 +2,6 @@ /** * This is one of the interfaces that needs to be implemented by the driver. - * - * This interface deals with handling events related to plugging and unplugging - * of gamepads and also provides a method to iterate through all the plugged in - * gamepads. An identifier is a string that is easily understood by the driver - * and may depend on other factors, i.e. it may not be unique for the gamepad. */ public interface LibGamepad.RawGamepadMonitor : Object { /** diff --git a/src/gamepad/raw-gamepad.vala b/src/gamepad/raw-gamepad.vala index 313bba7d..2f0fc9a2 100644 --- a/src/gamepad/raw-gamepad.vala +++ b/src/gamepad/raw-gamepad.vala @@ -6,9 +6,6 @@ * This interface represents a gamepad and deals with handling events that are * emitted by a gamepad and also provide properties like name and guid along * with number of buttons, axes and dpads. - * - * The constructor takes a identifier as a parameter. - * @see RawGamepadMonitor */ public interface LibGamepad.RawGamepad : Object { /** @@ -38,7 +35,6 @@ public interface LibGamepad.RawGamepad : Object { */ public abstract signal void unplugged (); - public abstract string identifier { get; } public abstract string name { get; } public abstract string guid { get; } From a0271c3f16f9b6ef6d48ba77d7bc7f6029361a48 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 18:36:46 +0530 Subject: [PATCH 10/72] Remove raw_name from Gamepad --- src/gamepad/gamepad.vala | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index 4e850697..9403e3a2 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -27,11 +27,6 @@ public class LibGamepad.Gamepad : Object { public signal void unplugged (); - /** - * The raw name reported by the driver - */ - public string? raw_name { get; private set; } - /** * The guid */ @@ -59,9 +54,8 @@ public class LibGamepad.Gamepad : Object { public Gamepad (RawGamepad raw_gamepad) throws FileError { this.raw_gamepad = raw_gamepad; - raw_name = raw_gamepad.name; guid = raw_gamepad.guid; - name = MappingsManager.get_name (guid) ?? raw_name; + name = MappingsManager.get_name (guid) ?? raw_gamepad.name; try { mapping = new Mapping.from_sdl_string (MappingsManager.get_mapping (guid)); mapped = true; From 8c2ffc91a56b9d91b9d67b1107172a55f46d3969 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 18:41:36 +0530 Subject: [PATCH 11/72] Fix helpers to adhere to coding standards --- src/gamepad/helpers.vala | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/gamepad/helpers.vala b/src/gamepad/helpers.vala index 6079b186..c3d7c74c 100644 --- a/src/gamepad/helpers.vala +++ b/src/gamepad/helpers.vala @@ -6,17 +6,17 @@ namespace LibGamepad { private string uint16s_to_hex_string (uint16[] data) requires (data.length == GUID_LENGTH) { - const string k_rgchHexToASCII = "0123456789abcdef"; + const string hex_to_ascii_map = "0123456789abcdef"; var builder = new StringBuilder (); - for (var i = 0; i < GUID_LENGTH; i++) { - uint8 c = (uint8) data[i]; - builder.append_unichar (k_rgchHexToASCII[c >> 4]); - builder.append_unichar (k_rgchHexToASCII[c & 0x0F]); + foreach (uint16 el in data) { + uint8 c = (uint8) el; + builder.append_unichar (hex_to_ascii_map[c >> 4]); + builder.append_unichar (hex_to_ascii_map[c & 0x0F]); - c = (uint8) (data[i] >> 8); - builder.append_unichar (k_rgchHexToASCII[c >> 4]); - builder.append_unichar (k_rgchHexToASCII[c & 0x0F]); + c = (uint8) (el >> 8); + builder.append_unichar (hex_to_ascii_map[c >> 4]); + builder.append_unichar (hex_to_ascii_map[c & 0x0F]); } return builder.str; } From 9d25f5d6f506ac9c582c006c54b8c9df31ec5edd Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 18:41:36 +0530 Subject: [PATCH 12/72] Fix helpers to adhere to coding standards --- src/gamepad/helpers.vala | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/gamepad/helpers.vala b/src/gamepad/helpers.vala index 6079b186..85554fe4 100644 --- a/src/gamepad/helpers.vala +++ b/src/gamepad/helpers.vala @@ -6,18 +6,19 @@ namespace LibGamepad { private string uint16s_to_hex_string (uint16[] data) requires (data.length == GUID_LENGTH) { - const string k_rgchHexToASCII = "0123456789abcdef"; + const string hex_to_ascii_map = "0123456789abcdef"; var builder = new StringBuilder (); - for (var i = 0; i < GUID_LENGTH; i++) { - uint8 c = (uint8) data[i]; - builder.append_unichar (k_rgchHexToASCII[c >> 4]); - builder.append_unichar (k_rgchHexToASCII[c & 0x0F]); + foreach (uint16 el in data) { + uint8 c = (uint8) el; + builder.append_unichar (hex_to_ascii_map[c >> 4]); + builder.append_unichar (hex_to_ascii_map[c & 0x0F]); - c = (uint8) (data[i] >> 8); - builder.append_unichar (k_rgchHexToASCII[c >> 4]); - builder.append_unichar (k_rgchHexToASCII[c & 0x0F]); + c = (uint8) (el >> 8); + builder.append_unichar (hex_to_ascii_map[c >> 4]); + builder.append_unichar (hex_to_ascii_map[c & 0x0F]); } + return builder.str; } } From 91598b0de522eaedd631b12c5c133a1b4a567a15 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 18:47:08 +0530 Subject: [PATCH 13/72] Convert a big lambda in LinuxRawGamepadMonitor to a function --- .../linux/linux-raw-gamepad-monitor.vala | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index 1c94aa75..810816ba 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -11,21 +11,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { client.uevent.connect (handle_udev_client_callback); // Initialize internally plugged in gamepads - client.query_by_subsystem ("input").foreach ((dev) => { - if (dev.get_device_file () == null) - return; - var identifier = dev.get_device_file (); - if ((dev.has_property ("ID_INPUT_JOYSTICK") && dev.get_property ("ID_INPUT_JOYSTICK") == "1") || - (dev.has_property (".INPUT_CLASS") && dev.get_property (".INPUT_CLASS") == "joystick")) { - RawGamepad raw_gamepad; - try { - raw_gamepad = new LinuxRawGamepad (identifier); - } catch (FileError err) { - return; - } - raw_gamepads.replace (identifier, raw_gamepad); - } - }); + client.query_by_subsystem ("input").foreach (initial_device_iterator); } public void foreach_gamepad (RawGamepadCallback callback) { @@ -64,4 +50,21 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { } } } + + private void initial_device_iterator (GUdev.Device dev) { + if (dev.get_device_file () == null) + return; + + var identifier = dev.get_device_file (); + if ((dev.has_property ("ID_INPUT_JOYSTICK") && dev.get_property ("ID_INPUT_JOYSTICK") == "1") || + (dev.has_property (".INPUT_CLASS") && dev.get_property (".INPUT_CLASS") == "joystick")) { + RawGamepad raw_gamepad; + try { + raw_gamepad = new LinuxRawGamepad (identifier); + } catch (FileError err) { + return; + } + raw_gamepads.replace (identifier, raw_gamepad); + } + } } From 812c7e6d828c7956e0130accf66bdd5aeeab6b8c Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 19:06:55 +0530 Subject: [PATCH 14/72] Use a MappedEvent struct to represent mapped events --- src/Makefile.am | 1 + src/gamepad/gamepad-event.c | 93 +++++++++++++++++++++++++++++++++++ src/gamepad/gamepad.vala | 35 +++++-------- src/gamepad/mapped-event.vala | 5 ++ src/gamepad/mapping.vala | 38 ++++++-------- 5 files changed, 127 insertions(+), 45 deletions(-) create mode 100644 src/gamepad/gamepad-event.c create mode 100644 src/gamepad/mapped-event.vala diff --git a/src/Makefile.am b/src/Makefile.am index 50ac2071..3e61cfc5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -62,6 +62,7 @@ gnome_games_SOURCES = \ gamepad/gamepad.vala \ gamepad/helpers.vala \ gamepad/input-type.vala \ + gamepad/mapped-event.vala \ gamepad/mapping-error.vala \ gamepad/mapping-helpers.vala \ gamepad/mapping.vala \ diff --git a/src/gamepad/gamepad-event.c b/src/gamepad/gamepad-event.c new file mode 100644 index 00000000..43443e1b --- /dev/null +++ b/src/gamepad/gamepad-event.c @@ -0,0 +1,93 @@ +/* gamepad-event.c generated by valac 0.32.0.45-49b63, the Vala compiler + * generated from gamepad-event.vala, do not modify */ + + +#include +#include +#include + + +#define LIB_GAMEPAD_TYPE_GAMEPAD_EVENT (lib_gamepad_gamepad_event_get_type ()) + +#define LIB_GAMEPAD_TYPE_INPUT_TYPE (lib_gamepad_input_type_get_type ()) + +#define LIB_GAMEPAD_TYPE_STANDARD_GAMEPAD_AXIS (lib_gamepad_standard_gamepad_axis_get_type ()) + +#define LIB_GAMEPAD_TYPE_STANDARD_GAMEPAD_BUTTON (lib_gamepad_standard_gamepad_button_get_type ()) +typedef struct _LibGamepadGamepadEvent LibGamepadGamepadEvent; + +typedef enum { + LIB_GAMEPAD_INPUT_TYPE_AXIS, + LIB_GAMEPAD_INPUT_TYPE_BUTTON, + LIB_GAMEPAD_INPUT_TYPE_INVALID +} LibGamepadInputType; + +typedef enum { + LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_X, + LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_Y, + LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_X, + LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_Y +} LibGamepadStandardGamepadAxis; + +typedef enum { + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_A, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_B, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_X, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_Y, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_L, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_R, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_L, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_R, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SELECT, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_START, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_L, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_R, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_UP, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_DOWN, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_LEFT, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_RIGHT, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_HOME, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_UNKNOWN +} LibGamepadStandardGamepadButton; + +struct _LibGamepadGamepadEvent { + LibGamepadInputType type; + LibGamepadStandardGamepadAxis axis; + LibGamepadStandardGamepadButton button; +}; + + + +GType lib_gamepad_gamepad_event_get_type (void) G_GNUC_CONST; +GType lib_gamepad_input_type_get_type (void) G_GNUC_CONST; +GType lib_gamepad_standard_gamepad_axis_get_type (void) G_GNUC_CONST; +GType lib_gamepad_standard_gamepad_button_get_type (void) G_GNUC_CONST; +LibGamepadGamepadEvent* lib_gamepad_gamepad_event_dup (const LibGamepadGamepadEvent* self); +void lib_gamepad_gamepad_event_free (LibGamepadGamepadEvent* self); + + +LibGamepadGamepadEvent* lib_gamepad_gamepad_event_dup (const LibGamepadGamepadEvent* self) { + LibGamepadGamepadEvent* dup; + dup = g_new0 (LibGamepadGamepadEvent, 1); + memcpy (dup, self, sizeof (LibGamepadGamepadEvent)); + return dup; +} + + +void lib_gamepad_gamepad_event_free (LibGamepadGamepadEvent* self) { + g_free (self); +} + + +GType lib_gamepad_gamepad_event_get_type (void) { + static volatile gsize lib_gamepad_gamepad_event_type_id__volatile = 0; + if (g_once_init_enter (&lib_gamepad_gamepad_event_type_id__volatile)) { + GType lib_gamepad_gamepad_event_type_id; + lib_gamepad_gamepad_event_type_id = g_boxed_type_register_static ("LibGamepadGamepadEvent", (GBoxedCopyFunc) lib_gamepad_gamepad_event_dup, (GBoxedFreeFunc) lib_gamepad_gamepad_event_free); + g_once_init_leave (&lib_gamepad_gamepad_event_type_id__volatile, lib_gamepad_gamepad_event_type_id); + } + return lib_gamepad_gamepad_event_type_id__volatile; +} + + + diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index 9403e3a2..bd95b56e 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -71,39 +71,30 @@ public class LibGamepad.Gamepad : Object { } private void on_raw_button_event (int button, bool value) { - InputType type; - StandardGamepadAxis output_axis; - StandardGamepadButton output_button; - - mapping.get_button_mapping (button, out type, out output_axis, out output_button); - emit_event (type, output_axis, output_button, value ? 1 : 0); + MappedEvent event; + mapping.get_button_mapping (button, out event); + emit_event (event, value ? 1 : 0); } private void on_raw_axis_event (int axis, double value) { - InputType type; - StandardGamepadAxis output_axis; - StandardGamepadButton output_button; - - mapping.get_axis_mapping (axis, out type, out output_axis, out output_button); - emit_event (type, output_axis, output_button, value); + MappedEvent event; + mapping.get_axis_mapping (axis, out event); + emit_event (event, value); } private void on_raw_dpad_event (int dpad_index, int axis, int value) { - InputType type; - StandardGamepadAxis output_axis; - StandardGamepadButton output_button; - - mapping.get_dpad_mapping (dpad_index, axis, value, out type, out output_axis, out output_button); - emit_event (type, output_axis, output_button, value.abs ()); + MappedEvent event; + mapping.get_dpad_mapping (dpad_index, axis, value, out event); + emit_event (event, value.abs ()); } - private void emit_event (InputType type, StandardGamepadAxis axis, StandardGamepadButton button, double value) { - switch (type) { + private void emit_event (MappedEvent event, double value) { + switch (event.type) { case InputType.AXIS: - axis_event (axis, value); + axis_event (event.axis, value); break; case InputType.BUTTON: - button_event (button, (bool) value); + button_event (event.button, (bool) value); break; } } diff --git a/src/gamepad/mapped-event.vala b/src/gamepad/mapped-event.vala new file mode 100644 index 00000000..e6816888 --- /dev/null +++ b/src/gamepad/mapped-event.vala @@ -0,0 +1,5 @@ +public struct LibGamepad.MappedEvent { + InputType type; + StandardGamepadAxis axis; + StandardGamepadButton button; +} diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index 0b0b6702..4d7c1048 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -69,9 +69,7 @@ public class LibGamepad.Mapping : Object { public void get_dpad_mapping (int dpad_index, int dpad_axis, int dpad_value, - out InputType type, - out StandardGamepadAxis output_axis, - out StandardGamepadButton output_button) { + out MappedEvent event) { int dpad_position; var dpad = dpads[dpad_index]; if (dpad_value == 0) @@ -79,43 +77,37 @@ public class LibGamepad.Mapping : Object { else dpad_position = (dpad_value + dpad_axis + 4) % 4; dpad.axisval[dpad_axis] = dpad_value; - type = dpad.types[dpad_position]; - switch (type) { + event.type = dpad.types[dpad_position]; + switch (event.type) { case InputType.AXIS: - output_axis = (StandardGamepadAxis) dpad.values[dpad_position]; + event.axis = (StandardGamepadAxis) dpad.values[dpad_position]; break; case InputType.BUTTON: - output_button = (StandardGamepadButton) dpad.values[dpad_position]; + event.button = (StandardGamepadButton) dpad.values[dpad_position]; break; } } - public void get_axis_mapping (int axis_number, - out InputType type, - out StandardGamepadAxis output_axis, - out StandardGamepadButton output_button) { - type = axes_type[axis_number]; - switch (type) { + public void get_axis_mapping (int axis_number, out MappedEvent event) { + event.type = axes_type[axis_number]; + switch (event.type) { case InputType.AXIS: - output_axis = (StandardGamepadAxis) axes_value[axis_number]; + event.axis = (StandardGamepadAxis) axes_value[axis_number]; break; case InputType.BUTTON: - output_button = (StandardGamepadButton) axes_value[axis_number]; + event.button = (StandardGamepadButton) axes_value[axis_number]; break; } } - public void get_button_mapping (int button_number, - out InputType type, - out StandardGamepadAxis output_axis, - out StandardGamepadButton output_button) { - type = buttons_type[button_number]; - switch (type) { + public void get_button_mapping (int button_number, out MappedEvent event) { + event.type = buttons_type[button_number]; + switch (event.type) { case InputType.AXIS: - output_axis = (StandardGamepadAxis) buttons_value[button_number]; + event.axis = (StandardGamepadAxis) buttons_value[button_number]; break; case InputType.BUTTON: - output_button = (StandardGamepadButton) buttons_value[button_number]; + event.button = (StandardGamepadButton) buttons_value[button_number]; break; } } From d04d597f060efc7ab6bc167850e84cea072562b4 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 19:10:01 +0530 Subject: [PATCH 15/72] Remove C files commited by mistake --- src/gamepad/gamepad-event.c | 93 ---- src/gamepad/linux/guid-helpers.c | 260 ----------- src/gamepad/linux/raw-gamepad-monitor.c | 594 ------------------------ 3 files changed, 947 deletions(-) delete mode 100644 src/gamepad/gamepad-event.c delete mode 100644 src/gamepad/linux/guid-helpers.c delete mode 100644 src/gamepad/linux/raw-gamepad-monitor.c diff --git a/src/gamepad/gamepad-event.c b/src/gamepad/gamepad-event.c deleted file mode 100644 index 43443e1b..00000000 --- a/src/gamepad/gamepad-event.c +++ /dev/null @@ -1,93 +0,0 @@ -/* gamepad-event.c generated by valac 0.32.0.45-49b63, the Vala compiler - * generated from gamepad-event.vala, do not modify */ - - -#include -#include -#include - - -#define LIB_GAMEPAD_TYPE_GAMEPAD_EVENT (lib_gamepad_gamepad_event_get_type ()) - -#define LIB_GAMEPAD_TYPE_INPUT_TYPE (lib_gamepad_input_type_get_type ()) - -#define LIB_GAMEPAD_TYPE_STANDARD_GAMEPAD_AXIS (lib_gamepad_standard_gamepad_axis_get_type ()) - -#define LIB_GAMEPAD_TYPE_STANDARD_GAMEPAD_BUTTON (lib_gamepad_standard_gamepad_button_get_type ()) -typedef struct _LibGamepadGamepadEvent LibGamepadGamepadEvent; - -typedef enum { - LIB_GAMEPAD_INPUT_TYPE_AXIS, - LIB_GAMEPAD_INPUT_TYPE_BUTTON, - LIB_GAMEPAD_INPUT_TYPE_INVALID -} LibGamepadInputType; - -typedef enum { - LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_X, - LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_Y, - LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_X, - LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_Y -} LibGamepadStandardGamepadAxis; - -typedef enum { - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_A, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_B, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_X, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_Y, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_L, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_R, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_L, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_R, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SELECT, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_START, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_L, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_R, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_UP, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_DOWN, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_LEFT, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_RIGHT, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_HOME, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_UNKNOWN -} LibGamepadStandardGamepadButton; - -struct _LibGamepadGamepadEvent { - LibGamepadInputType type; - LibGamepadStandardGamepadAxis axis; - LibGamepadStandardGamepadButton button; -}; - - - -GType lib_gamepad_gamepad_event_get_type (void) G_GNUC_CONST; -GType lib_gamepad_input_type_get_type (void) G_GNUC_CONST; -GType lib_gamepad_standard_gamepad_axis_get_type (void) G_GNUC_CONST; -GType lib_gamepad_standard_gamepad_button_get_type (void) G_GNUC_CONST; -LibGamepadGamepadEvent* lib_gamepad_gamepad_event_dup (const LibGamepadGamepadEvent* self); -void lib_gamepad_gamepad_event_free (LibGamepadGamepadEvent* self); - - -LibGamepadGamepadEvent* lib_gamepad_gamepad_event_dup (const LibGamepadGamepadEvent* self) { - LibGamepadGamepadEvent* dup; - dup = g_new0 (LibGamepadGamepadEvent, 1); - memcpy (dup, self, sizeof (LibGamepadGamepadEvent)); - return dup; -} - - -void lib_gamepad_gamepad_event_free (LibGamepadGamepadEvent* self) { - g_free (self); -} - - -GType lib_gamepad_gamepad_event_get_type (void) { - static volatile gsize lib_gamepad_gamepad_event_type_id__volatile = 0; - if (g_once_init_enter (&lib_gamepad_gamepad_event_type_id__volatile)) { - GType lib_gamepad_gamepad_event_type_id; - lib_gamepad_gamepad_event_type_id = g_boxed_type_register_static ("LibGamepadGamepadEvent", (GBoxedCopyFunc) lib_gamepad_gamepad_event_dup, (GBoxedFreeFunc) lib_gamepad_gamepad_event_free); - g_once_init_leave (&lib_gamepad_gamepad_event_type_id__volatile, lib_gamepad_gamepad_event_type_id); - } - return lib_gamepad_gamepad_event_type_id__volatile; -} - - - diff --git a/src/gamepad/linux/guid-helpers.c b/src/gamepad/linux/guid-helpers.c deleted file mode 100644 index b081805c..00000000 --- a/src/gamepad/linux/guid-helpers.c +++ /dev/null @@ -1,260 +0,0 @@ -/* guid-helpers.c generated by valac 0.32.0.45-49b63, the Vala compiler - * generated from guid-helpers.vala, do not modify */ - -/* This file is part of GNOME Games. License: GPLv3*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS (lib_gamepad_linux_guid_helpers_get_type ()) -#define LIB_GAMEPAD_LINUX_GUID_HELPERS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS, LibGamepadLinuxGuidHelpers)) -#define LIB_GAMEPAD_LINUX_GUID_HELPERS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS, LibGamepadLinuxGuidHelpersClass)) -#define LIB_GAMEPAD_IS_LINUX_GUID_HELPERS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS)) -#define LIB_GAMEPAD_IS_LINUX_GUID_HELPERS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS)) -#define LIB_GAMEPAD_LINUX_GUID_HELPERS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS, LibGamepadLinuxGuidHelpersClass)) - -typedef struct _LibGamepadLinuxGuidHelpers LibGamepadLinuxGuidHelpers; -typedef struct _LibGamepadLinuxGuidHelpersClass LibGamepadLinuxGuidHelpersClass; -typedef struct _LibGamepadLinuxGuidHelpersPrivate LibGamepadLinuxGuidHelpersPrivate; -#define _g_free0(var) (var = (g_free (var), NULL)) -#define _libevdev_free0(var) ((var == NULL) ? NULL : (var = (libevdev_free (var), NULL))) - -struct _LibGamepadLinuxGuidHelpers { - GObject parent_instance; - LibGamepadLinuxGuidHelpersPrivate * priv; -}; - -struct _LibGamepadLinuxGuidHelpersClass { - GObjectClass parent_class; -}; - - -static gpointer lib_gamepad_linux_guid_helpers_parent_class = NULL; - -GType lib_gamepad_linux_guid_helpers_get_type (void) G_GNUC_CONST; -enum { - LIB_GAMEPAD_LINUX_GUID_HELPERS_DUMMY_PROPERTY -}; -gchar* lib_gamepad_linux_guid_helpers_from_dev (struct libevdev* dev); -gchar* lib_gamepad_uint16s_to_hex_string (guint16* data, int data_length1); -gchar* lib_gamepad_linux_guid_helpers_from_file (const gchar* file_name, GError** error); -LibGamepadLinuxGuidHelpers* lib_gamepad_linux_guid_helpers_new (void); -LibGamepadLinuxGuidHelpers* lib_gamepad_linux_guid_helpers_construct (GType object_type); - - -gchar* lib_gamepad_linux_guid_helpers_from_dev (struct libevdev* dev) { - gchar* result = NULL; - guint16 guid[8] = {0}; - struct libevdev* _tmp0_ = NULL; - gint _tmp1_ = 0; - gint _tmp2_ = 0; - gint _tmp3_ = 0; - guint16 _tmp4_ = 0U; - guint16 _tmp5_ = 0U; - struct libevdev* _tmp6_ = NULL; - gint _tmp7_ = 0; - gint _tmp8_ = 0; - gint _tmp9_ = 0; - guint16 _tmp10_ = 0U; - guint16 _tmp11_ = 0U; - struct libevdev* _tmp12_ = NULL; - gint _tmp13_ = 0; - gint _tmp14_ = 0; - gint _tmp15_ = 0; - guint16 _tmp16_ = 0U; - guint16 _tmp17_ = 0U; - struct libevdev* _tmp18_ = NULL; - gint _tmp19_ = 0; - gint _tmp20_ = 0; - gint _tmp21_ = 0; - guint16 _tmp22_ = 0U; - guint16 _tmp23_ = 0U; - gchar* _tmp24_ = NULL; - g_return_val_if_fail (dev != NULL, NULL); - _tmp0_ = dev; - _tmp1_ = libevdev_get_id_bustype (_tmp0_); - _tmp2_ = _tmp1_; - _tmp3_ = GINT_TO_LE (_tmp2_); - guid[0] = (guint16) _tmp3_; - _tmp4_ = guid[0]; - guid[1] = (guint16) 0; - _tmp5_ = guid[1]; - _tmp6_ = dev; - _tmp7_ = libevdev_get_id_vendor (_tmp6_); - _tmp8_ = _tmp7_; - _tmp9_ = GINT_TO_LE (_tmp8_); - guid[2] = (guint16) _tmp9_; - _tmp10_ = guid[2]; - guid[3] = (guint16) 0; - _tmp11_ = guid[3]; - _tmp12_ = dev; - _tmp13_ = libevdev_get_id_product (_tmp12_); - _tmp14_ = _tmp13_; - _tmp15_ = GINT_TO_LE (_tmp14_); - guid[4] = (guint16) _tmp15_; - _tmp16_ = guid[4]; - guid[5] = (guint16) 0; - _tmp17_ = guid[5]; - _tmp18_ = dev; - _tmp19_ = libevdev_get_id_version (_tmp18_); - _tmp20_ = _tmp19_; - _tmp21_ = GINT_TO_LE (_tmp20_); - guid[6] = (guint16) _tmp21_; - _tmp22_ = guid[6]; - guid[7] = (guint16) 0; - _tmp23_ = guid[7]; - _tmp24_ = lib_gamepad_uint16s_to_hex_string (guid, 8); - result = _tmp24_; - return result; -} - - -static const gchar* string_to_string (const gchar* self) { - const gchar* result = NULL; - g_return_val_if_fail (self != NULL, NULL); - result = self; - return result; -} - - -gchar* lib_gamepad_linux_guid_helpers_from_file (const gchar* file_name, GError** error) { - gchar* result = NULL; - gint fd = 0; - const gchar* _tmp0_ = NULL; - gint _tmp1_ = 0; - gint _tmp2_ = 0; - struct libevdev* dev = NULL; - struct libevdev* _tmp12_ = NULL; - struct libevdev* _tmp13_ = NULL; - gint _tmp14_ = 0; - gint _tmp15_ = 0; - gchar* guid = NULL; - struct libevdev* _tmp25_ = NULL; - gchar* _tmp26_ = NULL; - gint _tmp27_ = 0; - GError * _inner_error_ = NULL; - g_return_val_if_fail (file_name != NULL, NULL); - _tmp0_ = file_name; - _tmp1_ = open (_tmp0_, O_RDONLY | O_NONBLOCK, (mode_t) 0); - fd = _tmp1_; - _tmp2_ = fd; - if (_tmp2_ < 0) { - const gchar* _tmp3_ = NULL; - const gchar* _tmp4_ = NULL; - gint _tmp5_ = 0; - const gchar* _tmp6_ = NULL; - const gchar* _tmp7_ = NULL; - gchar* _tmp8_ = NULL; - gchar* _tmp9_ = NULL; - GError* _tmp10_ = NULL; - GError* _tmp11_ = NULL; - _tmp3_ = file_name; - _tmp4_ = string_to_string (_tmp3_); - _tmp5_ = errno; - _tmp6_ = strerror (_tmp5_); - _tmp7_ = string_to_string (_tmp6_); - _tmp8_ = g_strconcat ("Unable to open file ", _tmp4_, ": ", _tmp7_, NULL); - _tmp9_ = _tmp8_; - _tmp10_ = g_error_new_literal (G_FILE_ERROR, G_FILE_ERROR_FAILED, _tmp9_); - _tmp11_ = _tmp10_; - _g_free0 (_tmp9_); - _inner_error_ = _tmp11_; - if (_inner_error_->domain == G_FILE_ERROR) { - g_propagate_error (error, _inner_error_); - return NULL; - } else { - g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); - g_clear_error (&_inner_error_); - return NULL; - } - } - _tmp12_ = libevdev_new (); - dev = _tmp12_; - _tmp13_ = dev; - _tmp14_ = fd; - _tmp15_ = libevdev_set_fd (_tmp13_, _tmp14_); - if (_tmp15_ < 0) { - const gchar* _tmp16_ = NULL; - const gchar* _tmp17_ = NULL; - gint _tmp18_ = 0; - const gchar* _tmp19_ = NULL; - const gchar* _tmp20_ = NULL; - gchar* _tmp21_ = NULL; - gchar* _tmp22_ = NULL; - GError* _tmp23_ = NULL; - GError* _tmp24_ = NULL; - _tmp16_ = file_name; - _tmp17_ = string_to_string (_tmp16_); - _tmp18_ = errno; - _tmp19_ = strerror (_tmp18_); - _tmp20_ = string_to_string (_tmp19_); - _tmp21_ = g_strconcat ("Evdev error on opening file ", _tmp17_, ": ", _tmp20_, NULL); - _tmp22_ = _tmp21_; - _tmp23_ = g_error_new_literal (G_FILE_ERROR, G_FILE_ERROR_FAILED, _tmp22_); - _tmp24_ = _tmp23_; - _g_free0 (_tmp22_); - _inner_error_ = _tmp24_; - if (_inner_error_->domain == G_FILE_ERROR) { - g_propagate_error (error, _inner_error_); - _libevdev_free0 (dev); - return NULL; - } else { - _libevdev_free0 (dev); - g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); - g_clear_error (&_inner_error_); - return NULL; - } - } - _tmp25_ = dev; - _tmp26_ = lib_gamepad_linux_guid_helpers_from_dev (_tmp25_); - guid = _tmp26_; - _tmp27_ = fd; - close (_tmp27_); - result = guid; - _libevdev_free0 (dev); - return result; -} - - -LibGamepadLinuxGuidHelpers* lib_gamepad_linux_guid_helpers_construct (GType object_type) { - LibGamepadLinuxGuidHelpers * self = NULL; - self = (LibGamepadLinuxGuidHelpers*) g_object_new (object_type, NULL); - return self; -} - - -LibGamepadLinuxGuidHelpers* lib_gamepad_linux_guid_helpers_new (void) { - return lib_gamepad_linux_guid_helpers_construct (LIB_GAMEPAD_TYPE_LINUX_GUID_HELPERS); -} - - -static void lib_gamepad_linux_guid_helpers_class_init (LibGamepadLinuxGuidHelpersClass * klass) { - lib_gamepad_linux_guid_helpers_parent_class = g_type_class_peek_parent (klass); -} - - -static void lib_gamepad_linux_guid_helpers_instance_init (LibGamepadLinuxGuidHelpers * self) { -} - - -GType lib_gamepad_linux_guid_helpers_get_type (void) { - static volatile gsize lib_gamepad_linux_guid_helpers_type_id__volatile = 0; - if (g_once_init_enter (&lib_gamepad_linux_guid_helpers_type_id__volatile)) { - static const GTypeInfo g_define_type_info = { sizeof (LibGamepadLinuxGuidHelpersClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) lib_gamepad_linux_guid_helpers_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (LibGamepadLinuxGuidHelpers), 0, (GInstanceInitFunc) lib_gamepad_linux_guid_helpers_instance_init, NULL }; - GType lib_gamepad_linux_guid_helpers_type_id; - lib_gamepad_linux_guid_helpers_type_id = g_type_register_static (G_TYPE_OBJECT, "LibGamepadLinuxGuidHelpers", &g_define_type_info, 0); - g_once_init_leave (&lib_gamepad_linux_guid_helpers_type_id__volatile, lib_gamepad_linux_guid_helpers_type_id); - } - return lib_gamepad_linux_guid_helpers_type_id__volatile; -} - - - diff --git a/src/gamepad/linux/raw-gamepad-monitor.c b/src/gamepad/linux/raw-gamepad-monitor.c deleted file mode 100644 index cfd7bc87..00000000 --- a/src/gamepad/linux/raw-gamepad-monitor.c +++ /dev/null @@ -1,594 +0,0 @@ -/* raw-gamepad-monitor.c generated by valac 0.32.0.45-49b63, the Vala compiler - * generated from raw-gamepad-monitor.vala, do not modify */ - -/* This file is part of GNOME Games. License: GPLv3*/ - -#include -#include -#include -#include -#include - - -#define LIB_GAMEPAD_TYPE_RAW_GAMEPAD_MONITOR (lib_gamepad_raw_gamepad_monitor_get_type ()) -#define LIB_GAMEPAD_RAW_GAMEPAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD_MONITOR, LibGamepadRawGamepadMonitor)) -#define LIB_GAMEPAD_IS_RAW_GAMEPAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD_MONITOR)) -#define LIB_GAMEPAD_RAW_GAMEPAD_MONITOR_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD_MONITOR, LibGamepadRawGamepadMonitorIface)) - -typedef struct _LibGamepadRawGamepadMonitor LibGamepadRawGamepadMonitor; -typedef struct _LibGamepadRawGamepadMonitorIface LibGamepadRawGamepadMonitorIface; - -#define LIB_GAMEPAD_TYPE_RAW_GAMEPAD (lib_gamepad_raw_gamepad_get_type ()) -#define LIB_GAMEPAD_RAW_GAMEPAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD, LibGamepadRawGamepad)) -#define LIB_GAMEPAD_IS_RAW_GAMEPAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD)) -#define LIB_GAMEPAD_RAW_GAMEPAD_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), LIB_GAMEPAD_TYPE_RAW_GAMEPAD, LibGamepadRawGamepadIface)) - -typedef struct _LibGamepadRawGamepad LibGamepadRawGamepad; -typedef struct _LibGamepadRawGamepadIface LibGamepadRawGamepadIface; - -#define LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR (lib_gamepad_linux_raw_gamepad_monitor_get_type ()) -#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR, LibGamepadLinuxRawGamepadMonitor)) -#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR, LibGamepadLinuxRawGamepadMonitorClass)) -#define LIB_GAMEPAD_IS_LINUX_RAW_GAMEPAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR)) -#define LIB_GAMEPAD_IS_LINUX_RAW_GAMEPAD_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR)) -#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR, LibGamepadLinuxRawGamepadMonitorClass)) - -typedef struct _LibGamepadLinuxRawGamepadMonitor LibGamepadLinuxRawGamepadMonitor; -typedef struct _LibGamepadLinuxRawGamepadMonitorClass LibGamepadLinuxRawGamepadMonitorClass; -typedef struct _LibGamepadLinuxRawGamepadMonitorPrivate LibGamepadLinuxRawGamepadMonitorPrivate; -#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL))) -#define _g_hash_table_unref0(var) ((var == NULL) ? NULL : (var = (g_hash_table_unref (var), NULL))) - -#define LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD (lib_gamepad_linux_raw_gamepad_get_type ()) -#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD, LibGamepadLinuxRawGamepad)) -#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD, LibGamepadLinuxRawGamepadClass)) -#define LIB_GAMEPAD_IS_LINUX_RAW_GAMEPAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD)) -#define LIB_GAMEPAD_IS_LINUX_RAW_GAMEPAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD)) -#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD, LibGamepadLinuxRawGamepadClass)) - -typedef struct _LibGamepadLinuxRawGamepad LibGamepadLinuxRawGamepad; -typedef struct _LibGamepadLinuxRawGamepadClass LibGamepadLinuxRawGamepadClass; -#define _g_free0(var) (var = (g_free (var), NULL)) -#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL))) -#define __g_list_free__g_object_unref0_0(var) ((var == NULL) ? NULL : (var = (_g_list_free__g_object_unref0_ (var), NULL))) -typedef struct _Block1Data Block1Data; - -struct _LibGamepadRawGamepadIface { - GTypeInterface parent_iface; - const gchar* (*get_identifier) (LibGamepadRawGamepad* self); - const gchar* (*get_name) (LibGamepadRawGamepad* self); - const gchar* (*get_guid) (LibGamepadRawGamepad* self); - guint8 (*get_axes_number) (LibGamepadRawGamepad* self); - guint8 (*get_buttons_number) (LibGamepadRawGamepad* self); - guint8 (*get_dpads_number) (LibGamepadRawGamepad* self); -}; - -typedef void (*LibGamepadRawGamepadMonitorRawGamepadCallback) (LibGamepadRawGamepad* raw_gamepad, void* user_data); -struct _LibGamepadRawGamepadMonitorIface { - GTypeInterface parent_iface; - void (*foreach_gamepad) (LibGamepadRawGamepadMonitor* self, LibGamepadRawGamepadMonitorRawGamepadCallback callback, void* callback_target); -}; - -struct _LibGamepadLinuxRawGamepadMonitor { - GObject parent_instance; - LibGamepadLinuxRawGamepadMonitorPrivate * priv; -}; - -struct _LibGamepadLinuxRawGamepadMonitorClass { - GObjectClass parent_class; -}; - -struct _LibGamepadLinuxRawGamepadMonitorPrivate { - GUdevClient* client; - GHashTable* raw_gamepads; -}; - -typedef void (*LibGamepadLinuxRawGamepadMonitorRawGamepadCallback) (LibGamepadRawGamepad* raw_gamepad, void* user_data); -struct _Block1Data { - int _ref_count_; - LibGamepadLinuxRawGamepadMonitor* self; - LibGamepadLinuxRawGamepadMonitorRawGamepadCallback callback; - gpointer callback_target; -}; - - -static gpointer lib_gamepad_linux_raw_gamepad_monitor_parent_class = NULL; -static LibGamepadRawGamepadMonitorIface* lib_gamepad_linux_raw_gamepad_monitor_lib_gamepad_raw_gamepad_monitor_parent_iface = NULL; - -GType lib_gamepad_raw_gamepad_get_type (void) G_GNUC_CONST; -GType lib_gamepad_raw_gamepad_monitor_get_type (void) G_GNUC_CONST; -GType lib_gamepad_linux_raw_gamepad_monitor_get_type (void) G_GNUC_CONST; -#define LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR, LibGamepadLinuxRawGamepadMonitorPrivate)) -enum { - LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR_DUMMY_PROPERTY -}; -LibGamepadLinuxRawGamepadMonitor* lib_gamepad_linux_raw_gamepad_monitor_new (void); -LibGamepadLinuxRawGamepadMonitor* lib_gamepad_linux_raw_gamepad_monitor_construct (GType object_type); -static void lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback (LibGamepadLinuxRawGamepadMonitor* self, const gchar* action, GUdevDevice* dev); -static void _lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback_g_udev_client_uevent (GUdevClient* _sender, const gchar* action, GUdevDevice* device, gpointer self); -static void __lambda5_ (LibGamepadLinuxRawGamepadMonitor* self, GUdevDevice* dev); -GType lib_gamepad_linux_raw_gamepad_get_type (void) G_GNUC_CONST; -LibGamepadLinuxRawGamepad* lib_gamepad_linux_raw_gamepad_new (const gchar* file_name, GError** error); -LibGamepadLinuxRawGamepad* lib_gamepad_linux_raw_gamepad_construct (GType object_type, const gchar* file_name, GError** error); -static void ___lambda5__gfunc (gconstpointer data, gpointer self); -static void _g_object_unref0_ (gpointer var); -static void _g_list_free__g_object_unref0_ (GList* self); -static void lib_gamepad_linux_raw_gamepad_monitor_real_foreach_gamepad (LibGamepadRawGamepadMonitor* base, LibGamepadLinuxRawGamepadMonitorRawGamepadCallback callback, void* callback_target); -static Block1Data* block1_data_ref (Block1Data* _data1_); -static void block1_data_unref (void * _userdata_); -static void __lambda6_ (Block1Data* _data1_, const gchar* identifier, LibGamepadRawGamepad* raw_gamepad); -static void ___lambda6__gh_func (gconstpointer key, gconstpointer value, gpointer self); -static void lib_gamepad_linux_raw_gamepad_monitor_finalize (GObject* obj); -static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func); -static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func); - - -static void _lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback_g_udev_client_uevent (GUdevClient* _sender, const gchar* action, GUdevDevice* device, gpointer self) { - lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback ((LibGamepadLinuxRawGamepadMonitor*) self, action, device); -} - - -static gpointer _g_object_ref0 (gpointer self) { - return self ? g_object_ref (self) : NULL; -} - - -static void __lambda5_ (LibGamepadLinuxRawGamepadMonitor* self, GUdevDevice* dev) { - GUdevDevice* _tmp0_ = NULL; - const gchar* _tmp1_ = NULL; - gchar* identifier = NULL; - GUdevDevice* _tmp2_ = NULL; - const gchar* _tmp3_ = NULL; - gchar* _tmp4_ = NULL; - gboolean _tmp5_ = FALSE; - gboolean _tmp6_ = FALSE; - GUdevDevice* _tmp7_ = NULL; - gboolean _tmp8_ = FALSE; - GError * _inner_error_ = NULL; - g_return_if_fail (dev != NULL); - _tmp0_ = dev; - _tmp1_ = g_udev_device_get_device_file (_tmp0_); - if (_tmp1_ == NULL) { - return; - } - _tmp2_ = dev; - _tmp3_ = g_udev_device_get_device_file (_tmp2_); - _tmp4_ = g_strdup (_tmp3_); - identifier = _tmp4_; - _tmp7_ = dev; - _tmp8_ = g_udev_device_has_property (_tmp7_, "ID_INPUT_JOYSTICK"); - if (_tmp8_) { - GUdevDevice* _tmp9_ = NULL; - const gchar* _tmp10_ = NULL; - _tmp9_ = dev; - _tmp10_ = g_udev_device_get_property (_tmp9_, "ID_INPUT_JOYSTICK"); - _tmp6_ = g_strcmp0 (_tmp10_, "1") == 0; - } else { - _tmp6_ = FALSE; - } - if (_tmp6_) { - _tmp5_ = TRUE; - } else { - gboolean _tmp11_ = FALSE; - GUdevDevice* _tmp12_ = NULL; - gboolean _tmp13_ = FALSE; - _tmp12_ = dev; - _tmp13_ = g_udev_device_has_property (_tmp12_, ".INPUT_CLASS"); - if (_tmp13_) { - GUdevDevice* _tmp14_ = NULL; - const gchar* _tmp15_ = NULL; - _tmp14_ = dev; - _tmp15_ = g_udev_device_get_property (_tmp14_, ".INPUT_CLASS"); - _tmp11_ = g_strcmp0 (_tmp15_, "joystick") == 0; - } else { - _tmp11_ = FALSE; - } - _tmp5_ = _tmp11_; - } - if (_tmp5_) { - LibGamepadRawGamepad* raw_gamepad = NULL; - GHashTable* _tmp20_ = NULL; - const gchar* _tmp21_ = NULL; - gchar* _tmp22_ = NULL; - LibGamepadRawGamepad* _tmp23_ = NULL; - LibGamepadRawGamepad* _tmp24_ = NULL; - { - LibGamepadLinuxRawGamepad* _tmp16_ = NULL; - const gchar* _tmp17_ = NULL; - LibGamepadLinuxRawGamepad* _tmp18_ = NULL; - LibGamepadLinuxRawGamepad* _tmp19_ = NULL; - _tmp17_ = identifier; - _tmp18_ = lib_gamepad_linux_raw_gamepad_new (_tmp17_, &_inner_error_); - _tmp16_ = _tmp18_; - if (G_UNLIKELY (_inner_error_ != NULL)) { - if (_inner_error_->domain == G_FILE_ERROR) { - goto __catch3_g_file_error; - } - _g_object_unref0 (raw_gamepad); - _g_free0 (identifier); - g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); - g_clear_error (&_inner_error_); - return; - } - _tmp19_ = _tmp16_; - _tmp16_ = NULL; - _g_object_unref0 (raw_gamepad); - raw_gamepad = (LibGamepadRawGamepad*) _tmp19_; - _g_object_unref0 (_tmp16_); - } - goto __finally3; - __catch3_g_file_error: - { - GError* err = NULL; - err = _inner_error_; - _inner_error_ = NULL; - _g_error_free0 (err); - _g_object_unref0 (raw_gamepad); - _g_free0 (identifier); - return; - } - __finally3: - if (G_UNLIKELY (_inner_error_ != NULL)) { - _g_object_unref0 (raw_gamepad); - _g_free0 (identifier); - g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); - g_clear_error (&_inner_error_); - return; - } - _tmp20_ = self->priv->raw_gamepads; - _tmp21_ = identifier; - _tmp22_ = g_strdup (_tmp21_); - _tmp23_ = raw_gamepad; - _tmp24_ = _g_object_ref0 (_tmp23_); - g_hash_table_replace (_tmp20_, _tmp22_, _tmp24_); - _g_object_unref0 (raw_gamepad); - } - _g_free0 (identifier); -} - - -static void ___lambda5__gfunc (gconstpointer data, gpointer self) { - __lambda5_ ((LibGamepadLinuxRawGamepadMonitor*) self, (GUdevDevice*) data); -} - - -static void _g_object_unref0_ (gpointer var) { - (var == NULL) ? NULL : (var = (g_object_unref (var), NULL)); -} - - -static void _g_list_free__g_object_unref0_ (GList* self) { - g_list_foreach (self, (GFunc) _g_object_unref0_, NULL); - g_list_free (self); -} - - -LibGamepadLinuxRawGamepadMonitor* lib_gamepad_linux_raw_gamepad_monitor_construct (GType object_type) { - LibGamepadLinuxRawGamepadMonitor * self = NULL; - gchar* _tmp0_ = NULL; - gchar** _tmp1_ = NULL; - gchar** _tmp2_ = NULL; - gint _tmp2__length1 = 0; - GUdevClient* _tmp3_ = NULL; - GUdevClient* _tmp4_ = NULL; - GUdevClient* _tmp5_ = NULL; - GList* _tmp6_ = NULL; - GList* _tmp7_ = NULL; - self = (LibGamepadLinuxRawGamepadMonitor*) g_object_new (object_type, NULL); - _tmp0_ = g_strdup ("input"); - _tmp1_ = g_new0 (gchar*, 1 + 1); - _tmp1_[0] = _tmp0_; - _tmp2_ = _tmp1_; - _tmp2__length1 = 1; - _tmp3_ = g_udev_client_new (_tmp2_); - _g_object_unref0 (self->priv->client); - self->priv->client = _tmp3_; - _tmp2_ = (_vala_array_free (_tmp2_, _tmp2__length1, (GDestroyNotify) g_free), NULL); - _tmp4_ = self->priv->client; - g_signal_connect_object (_tmp4_, "uevent", (GCallback) _lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback_g_udev_client_uevent, self, 0); - _tmp5_ = self->priv->client; - _tmp6_ = g_udev_client_query_by_subsystem (_tmp5_, "input"); - _tmp7_ = _tmp6_; - g_list_foreach (_tmp7_, ___lambda5__gfunc, self); - __g_list_free__g_object_unref0_0 (_tmp7_); - return self; -} - - -LibGamepadLinuxRawGamepadMonitor* lib_gamepad_linux_raw_gamepad_monitor_new (void) { - return lib_gamepad_linux_raw_gamepad_monitor_construct (LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR); -} - - -static Block1Data* block1_data_ref (Block1Data* _data1_) { - g_atomic_int_inc (&_data1_->_ref_count_); - return _data1_; -} - - -static void block1_data_unref (void * _userdata_) { - Block1Data* _data1_; - _data1_ = (Block1Data*) _userdata_; - if (g_atomic_int_dec_and_test (&_data1_->_ref_count_)) { - LibGamepadLinuxRawGamepadMonitor* self; - self = _data1_->self; - _g_object_unref0 (self); - g_slice_free (Block1Data, _data1_); - } -} - - -static void __lambda6_ (Block1Data* _data1_, const gchar* identifier, LibGamepadRawGamepad* raw_gamepad) { - LibGamepadLinuxRawGamepadMonitor* self; - LibGamepadLinuxRawGamepadMonitorRawGamepadCallback _tmp0_ = NULL; - void* _tmp0__target = NULL; - LibGamepadRawGamepad* _tmp1_ = NULL; - self = _data1_->self; - g_return_if_fail (identifier != NULL); - g_return_if_fail (raw_gamepad != NULL); - _tmp0_ = _data1_->callback; - _tmp0__target = _data1_->callback_target; - _tmp1_ = raw_gamepad; - _tmp0_ (_tmp1_, _tmp0__target); -} - - -static void ___lambda6__gh_func (gconstpointer key, gconstpointer value, gpointer self) { - __lambda6_ (self, (const gchar*) key, (LibGamepadRawGamepad*) value); -} - - -static void lib_gamepad_linux_raw_gamepad_monitor_real_foreach_gamepad (LibGamepadRawGamepadMonitor* base, LibGamepadLinuxRawGamepadMonitorRawGamepadCallback callback, void* callback_target) { - LibGamepadLinuxRawGamepadMonitor * self; - Block1Data* _data1_; - LibGamepadLinuxRawGamepadMonitorRawGamepadCallback _tmp0_ = NULL; - void* _tmp0__target = NULL; - GHashTable* _tmp1_ = NULL; - self = (LibGamepadLinuxRawGamepadMonitor*) base; - _data1_ = g_slice_new0 (Block1Data); - _data1_->_ref_count_ = 1; - _data1_->self = g_object_ref (self); - _tmp0_ = callback; - _tmp0__target = callback_target; - _data1_->callback = _tmp0_; - _data1_->callback_target = _tmp0__target; - _tmp1_ = self->priv->raw_gamepads; - g_hash_table_foreach (_tmp1_, ___lambda6__gh_func, _data1_); - block1_data_unref (_data1_); - _data1_ = NULL; -} - - -static void lib_gamepad_linux_raw_gamepad_monitor_handle_udev_client_callback (LibGamepadLinuxRawGamepadMonitor* self, const gchar* action, GUdevDevice* dev) { - GUdevDevice* _tmp0_ = NULL; - const gchar* _tmp1_ = NULL; - gchar* identifier = NULL; - GUdevDevice* _tmp2_ = NULL; - const gchar* _tmp3_ = NULL; - gchar* _tmp4_ = NULL; - gboolean _tmp5_ = FALSE; - gboolean _tmp6_ = FALSE; - GUdevDevice* _tmp7_ = NULL; - gboolean _tmp8_ = FALSE; - GError * _inner_error_ = NULL; - g_return_if_fail (self != NULL); - g_return_if_fail (action != NULL); - g_return_if_fail (dev != NULL); - _tmp0_ = dev; - _tmp1_ = g_udev_device_get_device_file (_tmp0_); - if (_tmp1_ == NULL) { - return; - } - _tmp2_ = dev; - _tmp3_ = g_udev_device_get_device_file (_tmp2_); - _tmp4_ = g_strdup (_tmp3_); - identifier = _tmp4_; - _tmp7_ = dev; - _tmp8_ = g_udev_device_has_property (_tmp7_, "ID_INPUT_JOYSTICK"); - if (_tmp8_) { - GUdevDevice* _tmp9_ = NULL; - const gchar* _tmp10_ = NULL; - _tmp9_ = dev; - _tmp10_ = g_udev_device_get_property (_tmp9_, "ID_INPUT_JOYSTICK"); - _tmp6_ = g_strcmp0 (_tmp10_, "1") == 0; - } else { - _tmp6_ = FALSE; - } - if (_tmp6_) { - _tmp5_ = TRUE; - } else { - gboolean _tmp11_ = FALSE; - GUdevDevice* _tmp12_ = NULL; - gboolean _tmp13_ = FALSE; - _tmp12_ = dev; - _tmp13_ = g_udev_device_has_property (_tmp12_, ".INPUT_CLASS"); - if (_tmp13_) { - GUdevDevice* _tmp14_ = NULL; - const gchar* _tmp15_ = NULL; - _tmp14_ = dev; - _tmp15_ = g_udev_device_get_property (_tmp14_, ".INPUT_CLASS"); - _tmp11_ = g_strcmp0 (_tmp15_, "joystick") == 0; - } else { - _tmp11_ = FALSE; - } - _tmp5_ = _tmp11_; - } - if (_tmp5_) { - const gchar* _tmp16_ = NULL; - const gchar* _tmp17_ = NULL; - GQuark _tmp19_ = 0U; - static GQuark _tmp18_label0 = 0; - static GQuark _tmp18_label1 = 0; - _tmp16_ = action; - _tmp17_ = _tmp16_; - _tmp19_ = (NULL == _tmp17_) ? 0 : g_quark_from_string (_tmp17_); - if (_tmp19_ == ((0 != _tmp18_label0) ? _tmp18_label0 : (_tmp18_label0 = g_quark_from_static_string ("add")))) { - switch (0) { - default: - { - LibGamepadRawGamepad* raw_gamepad = NULL; - GHashTable* _tmp24_ = NULL; - const gchar* _tmp25_ = NULL; - gchar* _tmp26_ = NULL; - LibGamepadRawGamepad* _tmp27_ = NULL; - LibGamepadRawGamepad* _tmp28_ = NULL; - LibGamepadRawGamepad* _tmp29_ = NULL; - { - LibGamepadLinuxRawGamepad* _tmp20_ = NULL; - const gchar* _tmp21_ = NULL; - LibGamepadLinuxRawGamepad* _tmp22_ = NULL; - LibGamepadLinuxRawGamepad* _tmp23_ = NULL; - _tmp21_ = identifier; - _tmp22_ = lib_gamepad_linux_raw_gamepad_new (_tmp21_, &_inner_error_); - _tmp20_ = _tmp22_; - if (G_UNLIKELY (_inner_error_ != NULL)) { - if (_inner_error_->domain == G_FILE_ERROR) { - goto __catch4_g_file_error; - } - _g_object_unref0 (raw_gamepad); - _g_free0 (identifier); - g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); - g_clear_error (&_inner_error_); - return; - } - _tmp23_ = _tmp20_; - _tmp20_ = NULL; - _g_object_unref0 (raw_gamepad); - raw_gamepad = (LibGamepadRawGamepad*) _tmp23_; - _g_object_unref0 (_tmp20_); - } - goto __finally4; - __catch4_g_file_error: - { - GError* err = NULL; - err = _inner_error_; - _inner_error_ = NULL; - _g_error_free0 (err); - _g_object_unref0 (raw_gamepad); - _g_free0 (identifier); - return; - } - __finally4: - if (G_UNLIKELY (_inner_error_ != NULL)) { - _g_object_unref0 (raw_gamepad); - _g_free0 (identifier); - g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); - g_clear_error (&_inner_error_); - return; - } - _tmp24_ = self->priv->raw_gamepads; - _tmp25_ = identifier; - _tmp26_ = g_strdup (_tmp25_); - _tmp27_ = raw_gamepad; - _tmp28_ = _g_object_ref0 (_tmp27_); - g_hash_table_replace (_tmp24_, _tmp26_, _tmp28_); - _tmp29_ = raw_gamepad; - g_signal_emit_by_name ((LibGamepadRawGamepadMonitor*) self, "gamepad-plugged", _tmp29_); - _g_object_unref0 (raw_gamepad); - break; - } - } - } else if (_tmp19_ == ((0 != _tmp18_label1) ? _tmp18_label1 : (_tmp18_label1 = g_quark_from_static_string ("remove")))) { - switch (0) { - default: - { - GHashTable* _tmp30_ = NULL; - const gchar* _tmp31_ = NULL; - gboolean _tmp32_ = FALSE; - LibGamepadRawGamepad* raw_gamepad = NULL; - GHashTable* _tmp33_ = NULL; - const gchar* _tmp34_ = NULL; - gconstpointer _tmp35_ = NULL; - LibGamepadRawGamepad* _tmp36_ = NULL; - GHashTable* _tmp37_ = NULL; - const gchar* _tmp38_ = NULL; - LibGamepadRawGamepad* _tmp39_ = NULL; - LibGamepadRawGamepad* _tmp40_ = NULL; - _tmp30_ = self->priv->raw_gamepads; - _tmp31_ = identifier; - _tmp32_ = g_hash_table_contains (_tmp30_, _tmp31_); - if (!_tmp32_) { - break; - } - _tmp33_ = self->priv->raw_gamepads; - _tmp34_ = identifier; - _tmp35_ = g_hash_table_lookup (_tmp33_, _tmp34_); - _tmp36_ = _g_object_ref0 ((LibGamepadRawGamepad*) _tmp35_); - raw_gamepad = _tmp36_; - _tmp37_ = self->priv->raw_gamepads; - _tmp38_ = identifier; - g_hash_table_remove (_tmp37_, _tmp38_); - _tmp39_ = raw_gamepad; - g_signal_emit_by_name (_tmp39_, "unplugged"); - _tmp40_ = raw_gamepad; - g_signal_emit_by_name ((LibGamepadRawGamepadMonitor*) self, "gamepad-unplugged", _tmp40_); - _g_object_unref0 (raw_gamepad); - break; - } - } - } - } - _g_free0 (identifier); -} - - -static void lib_gamepad_linux_raw_gamepad_monitor_class_init (LibGamepadLinuxRawGamepadMonitorClass * klass) { - lib_gamepad_linux_raw_gamepad_monitor_parent_class = g_type_class_peek_parent (klass); - g_type_class_add_private (klass, sizeof (LibGamepadLinuxRawGamepadMonitorPrivate)); - G_OBJECT_CLASS (klass)->finalize = lib_gamepad_linux_raw_gamepad_monitor_finalize; -} - - -static void lib_gamepad_linux_raw_gamepad_monitor_lib_gamepad_raw_gamepad_monitor_interface_init (LibGamepadRawGamepadMonitorIface * iface) { - lib_gamepad_linux_raw_gamepad_monitor_lib_gamepad_raw_gamepad_monitor_parent_iface = g_type_interface_peek_parent (iface); - iface->foreach_gamepad = (void (*)(LibGamepadRawGamepadMonitor*, LibGamepadRawGamepadMonitorRawGamepadCallback, void*)) lib_gamepad_linux_raw_gamepad_monitor_real_foreach_gamepad; -} - - -static void lib_gamepad_linux_raw_gamepad_monitor_instance_init (LibGamepadLinuxRawGamepadMonitor * self) { - self->priv = LIB_GAMEPAD_LINUX_RAW_GAMEPAD_MONITOR_GET_PRIVATE (self); -} - - -static void lib_gamepad_linux_raw_gamepad_monitor_finalize (GObject* obj) { - LibGamepadLinuxRawGamepadMonitor * self; - self = G_TYPE_CHECK_INSTANCE_CAST (obj, LIB_GAMEPAD_TYPE_LINUX_RAW_GAMEPAD_MONITOR, LibGamepadLinuxRawGamepadMonitor); - _g_object_unref0 (self->priv->client); - _g_hash_table_unref0 (self->priv->raw_gamepads); - G_OBJECT_CLASS (lib_gamepad_linux_raw_gamepad_monitor_parent_class)->finalize (obj); -} - - -GType lib_gamepad_linux_raw_gamepad_monitor_get_type (void) { - static volatile gsize lib_gamepad_linux_raw_gamepad_monitor_type_id__volatile = 0; - if (g_once_init_enter (&lib_gamepad_linux_raw_gamepad_monitor_type_id__volatile)) { - static const GTypeInfo g_define_type_info = { sizeof (LibGamepadLinuxRawGamepadMonitorClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) lib_gamepad_linux_raw_gamepad_monitor_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (LibGamepadLinuxRawGamepadMonitor), 0, (GInstanceInitFunc) lib_gamepad_linux_raw_gamepad_monitor_instance_init, NULL }; - static const GInterfaceInfo lib_gamepad_raw_gamepad_monitor_info = { (GInterfaceInitFunc) lib_gamepad_linux_raw_gamepad_monitor_lib_gamepad_raw_gamepad_monitor_interface_init, (GInterfaceFinalizeFunc) NULL, NULL}; - GType lib_gamepad_linux_raw_gamepad_monitor_type_id; - lib_gamepad_linux_raw_gamepad_monitor_type_id = g_type_register_static (G_TYPE_OBJECT, "LibGamepadLinuxRawGamepadMonitor", &g_define_type_info, 0); - g_type_add_interface_static (lib_gamepad_linux_raw_gamepad_monitor_type_id, LIB_GAMEPAD_TYPE_RAW_GAMEPAD_MONITOR, &lib_gamepad_raw_gamepad_monitor_info); - g_once_init_leave (&lib_gamepad_linux_raw_gamepad_monitor_type_id__volatile, lib_gamepad_linux_raw_gamepad_monitor_type_id); - } - return lib_gamepad_linux_raw_gamepad_monitor_type_id__volatile; -} - - -static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) { - if ((array != NULL) && (destroy_func != NULL)) { - int i; - for (i = 0; i < array_length; i = i + 1) { - if (((gpointer*) array)[i] != NULL) { - destroy_func (((gpointer*) array)[i]); - } - } - } -} - - -static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) { - _vala_array_destroy (array, array_length, destroy_func); - g_free (array); -} - - - From 535f8f61c9074b123b52029a5640ba283334117b Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 19:45:15 +0530 Subject: [PATCH 16/72] Rename err to e to follow convention --- src/gamepad/gamepad.vala | 4 ++-- src/gamepad/linux/linux-raw-gamepad-monitor.vala | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index bd95b56e..f6e57099 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -62,8 +62,8 @@ public class LibGamepad.Gamepad : Object { raw_gamepad.button_event.connect (on_raw_button_event); raw_gamepad.axis_event.connect (on_raw_axis_event); raw_gamepad.dpad_event.connect (on_raw_dpad_event); - } catch (MappingError err) { - debug ("%s - for %s/%s", err.message, guid, name); + } catch (MappingError e) { + debug ("%s - for %s/%s", e.message, guid, name); mapping = null; mapped = false; } diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index 810816ba..8e6c25e7 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -30,7 +30,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { RawGamepad raw_gamepad; try { raw_gamepad = new LinuxRawGamepad (identifier); - } catch (FileError err) { + } catch (FileError e) { return; } raw_gamepads.replace (identifier, raw_gamepad); @@ -61,7 +61,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { RawGamepad raw_gamepad; try { raw_gamepad = new LinuxRawGamepad (identifier); - } catch (FileError err) { + } catch (FileError e) { return; } raw_gamepads.replace (identifier, raw_gamepad); From d247ce3f85076dadc17e5678bbf8529d083cac4c Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 19:48:45 +0530 Subject: [PATCH 17/72] Fix indentation aligning issue in linux-raw-gamepad-monitor --- src/gamepad/linux/linux-raw-gamepad-monitor.vala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index 8e6c25e7..75d0cdbc 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -24,7 +24,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { var identifier = dev.get_device_file (); if ((dev.has_property ("ID_INPUT_JOYSTICK") && dev.get_property ("ID_INPUT_JOYSTICK") == "1") || - (dev.has_property (".INPUT_CLASS") && dev.get_property (".INPUT_CLASS") == "joystick")) { + (dev.has_property (".INPUT_CLASS") && dev.get_property (".INPUT_CLASS") == "joystick")) { switch (action) { case "add": RawGamepad raw_gamepad; @@ -57,7 +57,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { var identifier = dev.get_device_file (); if ((dev.has_property ("ID_INPUT_JOYSTICK") && dev.get_property ("ID_INPUT_JOYSTICK") == "1") || - (dev.has_property (".INPUT_CLASS") && dev.get_property (".INPUT_CLASS") == "joystick")) { + (dev.has_property (".INPUT_CLASS") && dev.get_property (".INPUT_CLASS") == "joystick")) { RawGamepad raw_gamepad; try { raw_gamepad = new LinuxRawGamepad (identifier); From 66e9506067ef86aca5c61be95c00f5246e383b08 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 20:53:09 +0530 Subject: [PATCH 18/72] Change some naming --- src/gamepad/linux/linux-guid-helpers.vala | 16 +++++------ .../linux/linux-raw-gamepad-monitor.vala | 20 ++++++------- src/gamepad/linux/linux-raw-gamepad.vala | 28 +++++++++---------- src/gamepad/mapping.vala | 8 +++--- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/gamepad/linux/linux-guid-helpers.vala b/src/gamepad/linux/linux-guid-helpers.vala index 2e4b04ae..c7993b4e 100644 --- a/src/gamepad/linux/linux-guid-helpers.vala +++ b/src/gamepad/linux/linux-guid-helpers.vala @@ -1,15 +1,15 @@ // This file is part of GNOME Games. License: GPLv3 private class LibGamepad.LinuxGuidHelpers : Object { - public static string from_dev (Libevdev.Evdev dev) { + public static string from_dev (Libevdev.Evdev device) { uint16 guid[8]; - guid[0] = (uint16) dev.id_bustype.to_little_endian (); + guid[0] = (uint16) device.id_bustype.to_little_endian (); guid[1] = 0; - guid[2] = (uint16) dev.id_vendor.to_little_endian (); + guid[2] = (uint16) device.id_vendor.to_little_endian (); guid[3] = 0; - guid[4] = (uint16) dev.id_product.to_little_endian (); + guid[4] = (uint16) device.id_product.to_little_endian (); guid[5] = 0; - guid[6] = (uint16) dev.id_version.to_little_endian (); + guid[6] = (uint16) device.id_version.to_little_endian (); guid[7] = 0; return uint16s_to_hex_string (guid); } @@ -20,11 +20,11 @@ private class LibGamepad.LinuxGuidHelpers : Object { if (fd < 0) throw new FileError.FAILED (@"Unable to open file $file_name: $(Posix.strerror (Posix.errno))"); - var dev = new Libevdev.Evdev (); - if (dev.set_fd (fd) < 0) + var device = new Libevdev.Evdev (); + if (device.set_fd (fd) < 0) throw new FileError.FAILED (@"Evdev error on opening file $file_name: $(Posix.strerror (Posix.errno))"); - var guid = from_dev (dev); + var guid = from_dev (device); Posix.close (fd); return guid; } diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index 75d0cdbc..6c1de15e 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -18,13 +18,13 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { raw_gamepads.foreach((identifier, raw_gamepad) => callback (raw_gamepad)); } - private void handle_udev_client_callback (string action, GUdev.Device dev) { - if (dev.get_device_file () == null) + private void handle_udev_client_callback (string action, GUdev.Device device) { + if (device.get_device_file () == null) return; - var identifier = dev.get_device_file (); - if ((dev.has_property ("ID_INPUT_JOYSTICK") && dev.get_property ("ID_INPUT_JOYSTICK") == "1") || - (dev.has_property (".INPUT_CLASS") && dev.get_property (".INPUT_CLASS") == "joystick")) { + var identifier = device.get_device_file (); + if ((device.has_property ("ID_INPUT_JOYSTICK") && device.get_property ("ID_INPUT_JOYSTICK") == "1") || + (device.has_property (".INPUT_CLASS") && device.get_property (".INPUT_CLASS") == "joystick")) { switch (action) { case "add": RawGamepad raw_gamepad; @@ -51,13 +51,13 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { } } - private void initial_device_iterator (GUdev.Device dev) { - if (dev.get_device_file () == null) + private void initial_device_iterator (GUdev.Device device) { + if (device.get_device_file () == null) return; - var identifier = dev.get_device_file (); - if ((dev.has_property ("ID_INPUT_JOYSTICK") && dev.get_property ("ID_INPUT_JOYSTICK") == "1") || - (dev.has_property (".INPUT_CLASS") && dev.get_property (".INPUT_CLASS") == "joystick")) { + var identifier = device.get_device_file (); + if ((device.has_property ("ID_INPUT_JOYSTICK") && device.get_property ("ID_INPUT_JOYSTICK") == "1") || + (device.has_property (".INPUT_CLASS") && device.get_property (".INPUT_CLASS") == "joystick")) { RawGamepad raw_gamepad; try { raw_gamepad = new LinuxRawGamepad (identifier); diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index f200c251..deff1781 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -3,7 +3,7 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { private int fd; private uint? event_source_id; - private Libevdev.Evdev dev; + private Libevdev.Evdev device; private uint8 key_map[Linux.Input.KEY_MAX]; private uint8 abs_map[Linux.Input.ABS_MAX]; @@ -30,9 +30,9 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { _dpads_number = 0; for (var i = Linux.Input.ABS_HAT0X; i <= Linux.Input.ABS_HAT3Y; i += 2) { - if (dev.has_event_code (Linux.Input.EV_ABS, i) || - dev.has_event_code (Linux.Input.EV_ABS, i + 1)) { - var absinfo = dev.get_abs_info (i); + if (device.has_event_code (Linux.Input.EV_ABS, i) || + device.has_event_code (Linux.Input.EV_ABS, i + 1)) { + var absinfo = device.get_abs_info (i); if (absinfo == null) continue; @@ -51,12 +51,12 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { if (fd < 0) throw new FileError.FAILED (@"Unable to open file $file_name: $(Posix.strerror (Posix.errno))"); - dev = new Libevdev.Evdev (); - if (dev.set_fd (fd) < 0) + device = new Libevdev.Evdev (); + if (device.set_fd (fd) < 0) throw new FileError.FAILED (@"Evdev is unable to open $file_name: $(Posix.strerror (Posix.errno))"); - _name = dev.name; - _guid = LinuxGuidHelpers.from_dev (dev); + _name = device.name; + _guid = LinuxGuidHelpers.from_dev (device); // Poll the events in the default main loop var channel = new IOChannel.unix_new (fd); @@ -64,13 +64,13 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { // Initialize dpads, buttons and axes for (var i = Linux.Input.BTN_JOYSTICK; i < Linux.Input.KEY_MAX; i++) { - if (dev.has_event_code (Linux.Input.EV_KEY, i)) { + if (device.has_event_code (Linux.Input.EV_KEY, i)) { key_map[i - Linux.Input.BTN_MISC] = _buttons_number; _buttons_number++; } } for (var i = Linux.Input.BTN_MISC; i < Linux.Input.BTN_JOYSTICK; i++) { - if (dev.has_event_code (Linux.Input.EV_KEY, i)) { + if (device.has_event_code (Linux.Input.EV_KEY, i)) { key_map[i - Linux.Input.BTN_MISC] = _buttons_number; _buttons_number++; } @@ -84,8 +84,8 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { i = Linux.Input.ABS_HAT3Y; continue; } - if (dev.has_event_code (Linux.Input.EV_ABS, i)) { - var absinfo = dev.get_abs_info (i); + if (device.has_event_code (Linux.Input.EV_ABS, i)) { + var absinfo = device.get_abs_info (i); abs_map[i] = _axes_number; abs_info[_axes_number] = absinfo; _axes_number++; @@ -99,7 +99,7 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { } private bool poll_events () { - while (dev.has_event_pending () > 0) + while (device.has_event_pending () > 0) handle_evdev_event (); return true; @@ -108,7 +108,7 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { private void handle_evdev_event () { int rc; Linux.Input.Event ev; - rc = dev.next_event (Libevdev.ReadFlag.NORMAL, out ev); + rc = device.next_event (Libevdev.ReadFlag.NORMAL, out ev); if (rc == 0) { int code = ev.code; switch (ev.type) { diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index 4d7c1048..ed95a785 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -18,11 +18,11 @@ public class LibGamepad.Mapping : Object { private int[] axes_value; private Dpad[] dpads; - public Mapping.from_sdl_string (string? mappingstring) throws MappingError { - if (mappingstring == null || mappingstring == "") - throw new MappingError.NOT_A_MAPPING ("mappingstring cannot be null or empty"); + public Mapping.from_sdl_string (string? mapping_string) throws MappingError { + if (mapping_string == null || mapping_string == "") + throw new MappingError.NOT_A_MAPPING ("The mapping string can't be null nor empty."); - var mappings = mappingstring.split (","); + var mappings = mapping_string.split (","); foreach (var mapping in mappings) { if (mapping.split (":").length == 2) { var str = mapping.split (":")[0]; From 79c68acc5e596c354b66f348ebd3f61b9028d58e Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 21:00:20 +0530 Subject: [PATCH 19/72] Merge MappingHelpers and Mapping --- src/Makefile.am | 1 - src/gamepad/mapping-helpers.c | 543 +++++++++++++++++++++++++++++++ src/gamepad/mapping-helpers.vala | 82 ----- src/gamepad/mapping.vala | 83 ++++- 4 files changed, 624 insertions(+), 85 deletions(-) create mode 100644 src/gamepad/mapping-helpers.c delete mode 100644 src/gamepad/mapping-helpers.vala diff --git a/src/Makefile.am b/src/Makefile.am index 266518f7..c25d895e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -64,7 +64,6 @@ gnome_games_SOURCES = \ gamepad/input-type.vala \ gamepad/mapped-event.vala \ gamepad/mapping-error.vala \ - gamepad/mapping-helpers.vala \ gamepad/mapping.vala \ gamepad/mappings-manager.vala \ gamepad/standard-gamepad-axis.vala \ diff --git a/src/gamepad/mapping-helpers.c b/src/gamepad/mapping-helpers.c new file mode 100644 index 00000000..65c8f893 --- /dev/null +++ b/src/gamepad/mapping-helpers.c @@ -0,0 +1,543 @@ +/* mapping-helpers.c generated by valac 0.32.0.45-49b63, the Vala compiler + * generated from mapping-helpers.vala, do not modify */ + +/* This file is part of GNOME Games. License: GPLv3*/ + +#include +#include +#include +#include +#include + + +#define LIB_GAMEPAD_TYPE_MAPPING_HELPERS (lib_gamepad_mapping_helpers_get_type ()) +#define LIB_GAMEPAD_MAPPING_HELPERS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_MAPPING_HELPERS, LibGamepadMappingHelpers)) +#define LIB_GAMEPAD_MAPPING_HELPERS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIB_GAMEPAD_TYPE_MAPPING_HELPERS, LibGamepadMappingHelpersClass)) +#define LIB_GAMEPAD_IS_MAPPING_HELPERS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_MAPPING_HELPERS)) +#define LIB_GAMEPAD_IS_MAPPING_HELPERS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIB_GAMEPAD_TYPE_MAPPING_HELPERS)) +#define LIB_GAMEPAD_MAPPING_HELPERS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIB_GAMEPAD_TYPE_MAPPING_HELPERS, LibGamepadMappingHelpersClass)) + +typedef struct _LibGamepadMappingHelpers LibGamepadMappingHelpers; +typedef struct _LibGamepadMappingHelpersClass LibGamepadMappingHelpersClass; +typedef struct _LibGamepadMappingHelpersPrivate LibGamepadMappingHelpersPrivate; + +#define LIB_GAMEPAD_TYPE_INPUT_TYPE (lib_gamepad_input_type_get_type ()) + +#define LIB_GAMEPAD_TYPE_STANDARD_GAMEPAD_AXIS (lib_gamepad_standard_gamepad_axis_get_type ()) + +#define LIB_GAMEPAD_TYPE_STANDARD_GAMEPAD_BUTTON (lib_gamepad_standard_gamepad_button_get_type ()) +typedef struct _LibGamepadParamSpecMappingHelpers LibGamepadParamSpecMappingHelpers; + +struct _LibGamepadMappingHelpers { + GTypeInstance parent_instance; + volatile int ref_count; + LibGamepadMappingHelpersPrivate * priv; +}; + +struct _LibGamepadMappingHelpersClass { + GTypeClass parent_class; + void (*finalize) (LibGamepadMappingHelpers *self); +}; + +typedef enum { + LIB_GAMEPAD_INPUT_TYPE_AXIS, + LIB_GAMEPAD_INPUT_TYPE_BUTTON, + LIB_GAMEPAD_INPUT_TYPE_INVALID +} LibGamepadInputType; + +typedef enum { + LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_X, + LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_Y, + LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_X, + LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_Y +} LibGamepadStandardGamepadAxis; + +typedef enum { + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_A, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_B, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_X, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_Y, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_L, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_R, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_L, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_R, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SELECT, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_START, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_L, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_R, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_UP, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_DOWN, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_LEFT, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_RIGHT, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_HOME, + LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_UNKNOWN +} LibGamepadStandardGamepadButton; + +struct _LibGamepadParamSpecMappingHelpers { + GParamSpec parent_instance; +}; + + +static gpointer lib_gamepad_mapping_helpers_parent_class = NULL; + +gpointer lib_gamepad_mapping_helpers_ref (gpointer instance); +void lib_gamepad_mapping_helpers_unref (gpointer instance); +GParamSpec* lib_gamepad_param_spec_mapping_helpers (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags); +void lib_gamepad_value_set_mapping_helpers (GValue* value, gpointer v_object); +void lib_gamepad_value_take_mapping_helpers (GValue* value, gpointer v_object); +gpointer lib_gamepad_value_get_mapping_helpers (const GValue* value); +GType lib_gamepad_mapping_helpers_get_type (void) G_GNUC_CONST; +enum { + LIB_GAMEPAD_MAPPING_HELPERS_DUMMY_PROPERTY +}; +GType lib_gamepad_input_type_get_type (void) G_GNUC_CONST; +LibGamepadInputType lib_gamepad_mapping_helpers_map_type (const gchar* str); +gint lib_gamepad_mapping_helpers_map_value (const gchar* str); +GType lib_gamepad_standard_gamepad_axis_get_type (void) G_GNUC_CONST; +GType lib_gamepad_standard_gamepad_button_get_type (void) G_GNUC_CONST; +LibGamepadMappingHelpers* lib_gamepad_mapping_helpers_new (void); +LibGamepadMappingHelpers* lib_gamepad_mapping_helpers_construct (GType object_type); +static void lib_gamepad_mapping_helpers_finalize (LibGamepadMappingHelpers* obj); + + +LibGamepadInputType lib_gamepad_mapping_helpers_map_type (const gchar* str) { + LibGamepadInputType result = 0; + const gchar* _tmp0_ = NULL; + const gchar* _tmp1_ = NULL; + GQuark _tmp3_ = 0U; + static GQuark _tmp2_label0 = 0; + static GQuark _tmp2_label1 = 0; + static GQuark _tmp2_label2 = 0; + static GQuark _tmp2_label3 = 0; + static GQuark _tmp2_label4 = 0; + static GQuark _tmp2_label5 = 0; + static GQuark _tmp2_label6 = 0; + static GQuark _tmp2_label7 = 0; + static GQuark _tmp2_label8 = 0; + static GQuark _tmp2_label9 = 0; + static GQuark _tmp2_label10 = 0; + static GQuark _tmp2_label11 = 0; + static GQuark _tmp2_label12 = 0; + static GQuark _tmp2_label13 = 0; + static GQuark _tmp2_label14 = 0; + static GQuark _tmp2_label15 = 0; + static GQuark _tmp2_label16 = 0; + static GQuark _tmp2_label17 = 0; + static GQuark _tmp2_label18 = 0; + static GQuark _tmp2_label19 = 0; + static GQuark _tmp2_label20 = 0; + g_return_val_if_fail (str != NULL, 0); + _tmp0_ = str; + _tmp1_ = _tmp0_; + _tmp3_ = (NULL == _tmp1_) ? 0 : g_quark_from_string (_tmp1_); + if ((((_tmp3_ == ((0 != _tmp2_label0) ? _tmp2_label0 : (_tmp2_label0 = g_quark_from_static_string ("leftx")))) || (_tmp3_ == ((0 != _tmp2_label1) ? _tmp2_label1 : (_tmp2_label1 = g_quark_from_static_string ("lefty"))))) || (_tmp3_ == ((0 != _tmp2_label2) ? _tmp2_label2 : (_tmp2_label2 = g_quark_from_static_string ("rightx"))))) || (_tmp3_ == ((0 != _tmp2_label3) ? _tmp2_label3 : (_tmp2_label3 = g_quark_from_static_string ("righty"))))) { + switch (0) { + default: + { + result = LIB_GAMEPAD_INPUT_TYPE_AXIS; + return result; + } + } + } else if (((((((((((((((((_tmp3_ == ((0 != _tmp2_label4) ? _tmp2_label4 : (_tmp2_label4 = g_quark_from_static_string ("a")))) || (_tmp3_ == ((0 != _tmp2_label5) ? _tmp2_label5 : (_tmp2_label5 = g_quark_from_static_string ("b"))))) || (_tmp3_ == ((0 != _tmp2_label6) ? _tmp2_label6 : (_tmp2_label6 = g_quark_from_static_string ("back"))))) || (_tmp3_ == ((0 != _tmp2_label7) ? _tmp2_label7 : (_tmp2_label7 = g_quark_from_static_string ("dpdown"))))) || (_tmp3_ == ((0 != _tmp2_label8) ? _tmp2_label8 : (_tmp2_label8 = g_quark_from_static_string ("dpleft"))))) || (_tmp3_ == ((0 != _tmp2_label9) ? _tmp2_label9 : (_tmp2_label9 = g_quark_from_static_string ("dpright"))))) || (_tmp3_ == ((0 != _tmp2_label10) ? _tmp2_label10 : (_tmp2_label10 = g_quark_from_static_string ("dpup"))))) || (_tmp3_ == ((0 != _tmp2_label11) ? _tmp2_label11 : (_tmp2_label11 = g_quark_from_static_string ("guide"))))) || (_tmp3_ == ((0 != _tmp2_label12) ? _tmp2_label12 : (_tmp2_label12 = g_quark_from_static_string ("leftshoulder"))))) || (_tmp3_ == ((0 != _tmp2_label13) ? _tmp2_label13 : (_tmp2_label13 = g_quark_from_static_string ("leftstick"))))) || (_tmp3_ == ((0 != _tmp2_label14) ? _tmp2_label14 : (_tmp2_label14 = g_quark_from_static_string ("lefttrigger"))))) || (_tmp3_ == ((0 != _tmp2_label15) ? _tmp2_label15 : (_tmp2_label15 = g_quark_from_static_string ("rightshoulder"))))) || (_tmp3_ == ((0 != _tmp2_label16) ? _tmp2_label16 : (_tmp2_label16 = g_quark_from_static_string ("rightstick"))))) || (_tmp3_ == ((0 != _tmp2_label17) ? _tmp2_label17 : (_tmp2_label17 = g_quark_from_static_string ("righttrigger"))))) || (_tmp3_ == ((0 != _tmp2_label18) ? _tmp2_label18 : (_tmp2_label18 = g_quark_from_static_string ("start"))))) || (_tmp3_ == ((0 != _tmp2_label19) ? _tmp2_label19 : (_tmp2_label19 = g_quark_from_static_string ("x"))))) || (_tmp3_ == ((0 != _tmp2_label20) ? _tmp2_label20 : (_tmp2_label20 = g_quark_from_static_string ("y"))))) { + switch (0) { + default: + { + result = LIB_GAMEPAD_INPUT_TYPE_BUTTON; + return result; + } + } + } else { + switch (0) { + default: + { + result = LIB_GAMEPAD_INPUT_TYPE_INVALID; + return result; + } + } + } +} + + +gint lib_gamepad_mapping_helpers_map_value (const gchar* str) { + gint result = 0; + const gchar* _tmp0_ = NULL; + const gchar* _tmp1_ = NULL; + GQuark _tmp3_ = 0U; + static GQuark _tmp2_label0 = 0; + static GQuark _tmp2_label1 = 0; + static GQuark _tmp2_label2 = 0; + static GQuark _tmp2_label3 = 0; + static GQuark _tmp2_label4 = 0; + static GQuark _tmp2_label5 = 0; + static GQuark _tmp2_label6 = 0; + static GQuark _tmp2_label7 = 0; + static GQuark _tmp2_label8 = 0; + static GQuark _tmp2_label9 = 0; + static GQuark _tmp2_label10 = 0; + static GQuark _tmp2_label11 = 0; + static GQuark _tmp2_label12 = 0; + static GQuark _tmp2_label13 = 0; + static GQuark _tmp2_label14 = 0; + static GQuark _tmp2_label15 = 0; + static GQuark _tmp2_label16 = 0; + static GQuark _tmp2_label17 = 0; + static GQuark _tmp2_label18 = 0; + static GQuark _tmp2_label19 = 0; + static GQuark _tmp2_label20 = 0; + g_return_val_if_fail (str != NULL, 0); + _tmp0_ = str; + _tmp1_ = _tmp0_; + _tmp3_ = (NULL == _tmp1_) ? 0 : g_quark_from_string (_tmp1_); + if (_tmp3_ == ((0 != _tmp2_label0) ? _tmp2_label0 : (_tmp2_label0 = g_quark_from_static_string ("leftx")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_X; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label1) ? _tmp2_label1 : (_tmp2_label1 = g_quark_from_static_string ("lefty")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_Y; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label2) ? _tmp2_label2 : (_tmp2_label2 = g_quark_from_static_string ("rightx")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_X; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label3) ? _tmp2_label3 : (_tmp2_label3 = g_quark_from_static_string ("righty")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_Y; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label4) ? _tmp2_label4 : (_tmp2_label4 = g_quark_from_static_string ("a")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_A; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label5) ? _tmp2_label5 : (_tmp2_label5 = g_quark_from_static_string ("b")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_B; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label6) ? _tmp2_label6 : (_tmp2_label6 = g_quark_from_static_string ("back")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SELECT; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label7) ? _tmp2_label7 : (_tmp2_label7 = g_quark_from_static_string ("dpdown")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_DOWN; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label8) ? _tmp2_label8 : (_tmp2_label8 = g_quark_from_static_string ("dpleft")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_LEFT; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label9) ? _tmp2_label9 : (_tmp2_label9 = g_quark_from_static_string ("dpright")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_RIGHT; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label10) ? _tmp2_label10 : (_tmp2_label10 = g_quark_from_static_string ("dpup")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_UP; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label11) ? _tmp2_label11 : (_tmp2_label11 = g_quark_from_static_string ("guide")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_HOME; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label12) ? _tmp2_label12 : (_tmp2_label12 = g_quark_from_static_string ("leftshoulder")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_L; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label13) ? _tmp2_label13 : (_tmp2_label13 = g_quark_from_static_string ("leftstick")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_L; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label14) ? _tmp2_label14 : (_tmp2_label14 = g_quark_from_static_string ("lefttrigger")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_L; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label15) ? _tmp2_label15 : (_tmp2_label15 = g_quark_from_static_string ("rightshoulder")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_R; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label16) ? _tmp2_label16 : (_tmp2_label16 = g_quark_from_static_string ("rightstick")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_R; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label17) ? _tmp2_label17 : (_tmp2_label17 = g_quark_from_static_string ("righttrigger")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_R; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label18) ? _tmp2_label18 : (_tmp2_label18 = g_quark_from_static_string ("start")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_START; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label19) ? _tmp2_label19 : (_tmp2_label19 = g_quark_from_static_string ("x")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_X; + return result; + } + } + } else if (_tmp3_ == ((0 != _tmp2_label20) ? _tmp2_label20 : (_tmp2_label20 = g_quark_from_static_string ("y")))) { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_Y; + return result; + } + } + } else { + switch (0) { + default: + { + result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_UNKNOWN; + return result; + } + } + } +} + + +LibGamepadMappingHelpers* lib_gamepad_mapping_helpers_construct (GType object_type) { + LibGamepadMappingHelpers* self = NULL; + self = (LibGamepadMappingHelpers*) g_type_create_instance (object_type); + return self; +} + + +LibGamepadMappingHelpers* lib_gamepad_mapping_helpers_new (void) { + return lib_gamepad_mapping_helpers_construct (LIB_GAMEPAD_TYPE_MAPPING_HELPERS); +} + + +static void lib_gamepad_value_mapping_helpers_init (GValue* value) { + value->data[0].v_pointer = NULL; +} + + +static void lib_gamepad_value_mapping_helpers_free_value (GValue* value) { + if (value->data[0].v_pointer) { + lib_gamepad_mapping_helpers_unref (value->data[0].v_pointer); + } +} + + +static void lib_gamepad_value_mapping_helpers_copy_value (const GValue* src_value, GValue* dest_value) { + if (src_value->data[0].v_pointer) { + dest_value->data[0].v_pointer = lib_gamepad_mapping_helpers_ref (src_value->data[0].v_pointer); + } else { + dest_value->data[0].v_pointer = NULL; + } +} + + +static gpointer lib_gamepad_value_mapping_helpers_peek_pointer (const GValue* value) { + return value->data[0].v_pointer; +} + + +static gchar* lib_gamepad_value_mapping_helpers_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { + if (collect_values[0].v_pointer) { + LibGamepadMappingHelpers* object; + object = collect_values[0].v_pointer; + if (object->parent_instance.g_class == NULL) { + return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); + } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) { + return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); + } + value->data[0].v_pointer = lib_gamepad_mapping_helpers_ref (object); + } else { + value->data[0].v_pointer = NULL; + } + return NULL; +} + + +static gchar* lib_gamepad_value_mapping_helpers_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { + LibGamepadMappingHelpers** object_p; + object_p = collect_values[0].v_pointer; + if (!object_p) { + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + } + if (!value->data[0].v_pointer) { + *object_p = NULL; + } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) { + *object_p = value->data[0].v_pointer; + } else { + *object_p = lib_gamepad_mapping_helpers_ref (value->data[0].v_pointer); + } + return NULL; +} + + +GParamSpec* lib_gamepad_param_spec_mapping_helpers (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) { + LibGamepadParamSpecMappingHelpers* spec; + g_return_val_if_fail (g_type_is_a (object_type, LIB_GAMEPAD_TYPE_MAPPING_HELPERS), NULL); + spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags); + G_PARAM_SPEC (spec)->value_type = object_type; + return G_PARAM_SPEC (spec); +} + + +gpointer lib_gamepad_value_get_mapping_helpers (const GValue* value) { + g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, LIB_GAMEPAD_TYPE_MAPPING_HELPERS), NULL); + return value->data[0].v_pointer; +} + + +void lib_gamepad_value_set_mapping_helpers (GValue* value, gpointer v_object) { + LibGamepadMappingHelpers* old; + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, LIB_GAMEPAD_TYPE_MAPPING_HELPERS)); + old = value->data[0].v_pointer; + if (v_object) { + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, LIB_GAMEPAD_TYPE_MAPPING_HELPERS)); + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); + value->data[0].v_pointer = v_object; + lib_gamepad_mapping_helpers_ref (value->data[0].v_pointer); + } else { + value->data[0].v_pointer = NULL; + } + if (old) { + lib_gamepad_mapping_helpers_unref (old); + } +} + + +void lib_gamepad_value_take_mapping_helpers (GValue* value, gpointer v_object) { + LibGamepadMappingHelpers* old; + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, LIB_GAMEPAD_TYPE_MAPPING_HELPERS)); + old = value->data[0].v_pointer; + if (v_object) { + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, LIB_GAMEPAD_TYPE_MAPPING_HELPERS)); + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); + value->data[0].v_pointer = v_object; + } else { + value->data[0].v_pointer = NULL; + } + if (old) { + lib_gamepad_mapping_helpers_unref (old); + } +} + + +static void lib_gamepad_mapping_helpers_class_init (LibGamepadMappingHelpersClass * klass) { + lib_gamepad_mapping_helpers_parent_class = g_type_class_peek_parent (klass); + ((LibGamepadMappingHelpersClass *) klass)->finalize = lib_gamepad_mapping_helpers_finalize; +} + + +static void lib_gamepad_mapping_helpers_instance_init (LibGamepadMappingHelpers * self) { + self->ref_count = 1; +} + + +static void lib_gamepad_mapping_helpers_finalize (LibGamepadMappingHelpers* obj) { + LibGamepadMappingHelpers * self; + self = G_TYPE_CHECK_INSTANCE_CAST (obj, LIB_GAMEPAD_TYPE_MAPPING_HELPERS, LibGamepadMappingHelpers); + g_signal_handlers_destroy (self); +} + + +GType lib_gamepad_mapping_helpers_get_type (void) { + static volatile gsize lib_gamepad_mapping_helpers_type_id__volatile = 0; + if (g_once_init_enter (&lib_gamepad_mapping_helpers_type_id__volatile)) { + static const GTypeValueTable g_define_type_value_table = { lib_gamepad_value_mapping_helpers_init, lib_gamepad_value_mapping_helpers_free_value, lib_gamepad_value_mapping_helpers_copy_value, lib_gamepad_value_mapping_helpers_peek_pointer, "p", lib_gamepad_value_mapping_helpers_collect_value, "p", lib_gamepad_value_mapping_helpers_lcopy_value }; + static const GTypeInfo g_define_type_info = { sizeof (LibGamepadMappingHelpersClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) lib_gamepad_mapping_helpers_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (LibGamepadMappingHelpers), 0, (GInstanceInitFunc) lib_gamepad_mapping_helpers_instance_init, &g_define_type_value_table }; + static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) }; + GType lib_gamepad_mapping_helpers_type_id; + lib_gamepad_mapping_helpers_type_id = g_type_register_fundamental (g_type_fundamental_next (), "LibGamepadMappingHelpers", &g_define_type_info, &g_define_type_fundamental_info, 0); + g_once_init_leave (&lib_gamepad_mapping_helpers_type_id__volatile, lib_gamepad_mapping_helpers_type_id); + } + return lib_gamepad_mapping_helpers_type_id__volatile; +} + + +gpointer lib_gamepad_mapping_helpers_ref (gpointer instance) { + LibGamepadMappingHelpers* self; + self = instance; + g_atomic_int_inc (&self->ref_count); + return instance; +} + + +void lib_gamepad_mapping_helpers_unref (gpointer instance) { + LibGamepadMappingHelpers* self; + self = instance; + if (g_atomic_int_dec_and_test (&self->ref_count)) { + LIB_GAMEPAD_MAPPING_HELPERS_GET_CLASS (self)->finalize (self); + g_type_free_instance ((GTypeInstance *) self); + } +} + + + diff --git a/src/gamepad/mapping-helpers.vala b/src/gamepad/mapping-helpers.vala deleted file mode 100644 index 33f8e232..00000000 --- a/src/gamepad/mapping-helpers.vala +++ /dev/null @@ -1,82 +0,0 @@ -// This file is part of GNOME Games. License: GPLv3 - -private class LibGamepad.MappingHelpers { - public static InputType map_type (string str) { - switch (str) { - case "leftx": - case "lefty": - case "rightx": - case "righty": - return InputType.AXIS; - case "a": - case "b": - case "back": - case "dpdown": - case "dpleft": - case "dpright": - case "dpup": - case "guide": - case "leftshoulder": - case "leftstick": - case "lefttrigger": - case "rightshoulder": - case "rightstick": - case "righttrigger": - case "start": - case "x": - case "y": - return InputType.BUTTON; - default: - return InputType.INVALID; - } - } - - public static int map_value (string str) { - switch (str) { - case "leftx": - return StandardGamepadAxis.LEFT_X; - case "lefty": - return StandardGamepadAxis.LEFT_Y; - case "rightx": - return StandardGamepadAxis.RIGHT_X; - case "righty": - return StandardGamepadAxis.RIGHT_Y; - case "a": - return StandardGamepadButton.A; - case "b": - return StandardGamepadButton.B; - case "back": - return StandardGamepadButton.SELECT; - case "dpdown": - return StandardGamepadButton.DPAD_DOWN; - case "dpleft": - return StandardGamepadButton.DPAD_LEFT; - case "dpright": - return StandardGamepadButton.DPAD_RIGHT; - case "dpup": - return StandardGamepadButton.DPAD_UP; - case "guide": - return StandardGamepadButton.HOME; - case "leftshoulder": - return StandardGamepadButton.SHOULDER_L; - case "leftstick": - return StandardGamepadButton.STICK_L; - case "lefttrigger": - return StandardGamepadButton.TRIGGER_L; - case "rightshoulder": - return StandardGamepadButton.SHOULDER_R; - case "rightstick": - return StandardGamepadButton.STICK_R; - case "righttrigger": - return StandardGamepadButton.TRIGGER_R; - case "start": - return StandardGamepadButton.START; - case "x": - return StandardGamepadButton.X; - case "y": - return StandardGamepadButton.Y; - default: - return StandardGamepadButton.UNKNOWN; - } - } -} diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index ed95a785..7a573581 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -27,12 +27,12 @@ public class LibGamepad.Mapping : Object { if (mapping.split (":").length == 2) { var str = mapping.split (":")[0]; var real = mapping.split (":")[1]; - var type = MappingHelpers.map_type (str); + var type = map_type (str); if (type == InputType.INVALID) { if (str != "platform") debug ("Invalid token : %s", str); continue; } - var value = MappingHelpers.map_value (str); + var value = map_value (str); switch (real[0]) { case 'h': var dpad_parse_array = real[1:real.length].split ("."); @@ -111,4 +111,83 @@ public class LibGamepad.Mapping : Object { break; } } + + public static InputType map_type (string str) { + switch (str) { + case "leftx": + case "lefty": + case "rightx": + case "righty": + return InputType.AXIS; + case "a": + case "b": + case "back": + case "dpdown": + case "dpleft": + case "dpright": + case "dpup": + case "guide": + case "leftshoulder": + case "leftstick": + case "lefttrigger": + case "rightshoulder": + case "rightstick": + case "righttrigger": + case "start": + case "x": + case "y": + return InputType.BUTTON; + default: + return InputType.INVALID; + } + } + + public static int map_value (string str) { + switch (str) { + case "leftx": + return StandardGamepadAxis.LEFT_X; + case "lefty": + return StandardGamepadAxis.LEFT_Y; + case "rightx": + return StandardGamepadAxis.RIGHT_X; + case "righty": + return StandardGamepadAxis.RIGHT_Y; + case "a": + return StandardGamepadButton.A; + case "b": + return StandardGamepadButton.B; + case "back": + return StandardGamepadButton.SELECT; + case "dpdown": + return StandardGamepadButton.DPAD_DOWN; + case "dpleft": + return StandardGamepadButton.DPAD_LEFT; + case "dpright": + return StandardGamepadButton.DPAD_RIGHT; + case "dpup": + return StandardGamepadButton.DPAD_UP; + case "guide": + return StandardGamepadButton.HOME; + case "leftshoulder": + return StandardGamepadButton.SHOULDER_L; + case "leftstick": + return StandardGamepadButton.STICK_L; + case "lefttrigger": + return StandardGamepadButton.TRIGGER_L; + case "rightshoulder": + return StandardGamepadButton.SHOULDER_R; + case "rightstick": + return StandardGamepadButton.STICK_R; + case "righttrigger": + return StandardGamepadButton.TRIGGER_R; + case "start": + return StandardGamepadButton.START; + case "x": + return StandardGamepadButton.X; + case "y": + return StandardGamepadButton.Y; + default: + return StandardGamepadButton.UNKNOWN; + } + } } From 8d09814d53a7b5a9a054d367de6c9044289174d2 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 21:14:21 +0530 Subject: [PATCH 20/72] Make LinuxRawGamepadMonitor more readable --- .../linux/linux-raw-gamepad-monitor.vala | 76 ++++++++++++------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index 6c1de15e..be7e62ff 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -23,31 +23,24 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { return; var identifier = device.get_device_file (); - if ((device.has_property ("ID_INPUT_JOYSTICK") && device.get_property ("ID_INPUT_JOYSTICK") == "1") || - (device.has_property (".INPUT_CLASS") && device.get_property (".INPUT_CLASS") == "joystick")) { - switch (action) { - case "add": - RawGamepad raw_gamepad; - try { - raw_gamepad = new LinuxRawGamepad (identifier); - } catch (FileError e) { - return; - } - raw_gamepads.replace (identifier, raw_gamepad); - gamepad_plugged (raw_gamepad); - break; - case "remove": - if (!raw_gamepads.contains (identifier)) - break; - var raw_gamepad = raw_gamepads.get (identifier); - raw_gamepads.remove (identifier); + if (!is_gamepad (device)) + return; + switch (action) { + case "add": + var raw_gamepad = add_gamepad (device); + if (raw_gamepad != null) + gamepad_plugged (raw_gamepad); + break; + case "remove": + var raw_gamepad = remove_gamepad (device); + if (raw_gamepad != null) { // This signal is emitted from here to simplify the code raw_gamepad.unplugged (); gamepad_unplugged (raw_gamepad); - break; } + break; } } @@ -56,15 +49,42 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { return; var identifier = device.get_device_file (); - if ((device.has_property ("ID_INPUT_JOYSTICK") && device.get_property ("ID_INPUT_JOYSTICK") == "1") || - (device.has_property (".INPUT_CLASS") && device.get_property (".INPUT_CLASS") == "joystick")) { - RawGamepad raw_gamepad; - try { - raw_gamepad = new LinuxRawGamepad (identifier); - } catch (FileError e) { - return; - } - raw_gamepads.replace (identifier, raw_gamepad); + + if (!is_gamepad (device)) + return; + + add_gamepad (device); + } + + private RawGamepad? add_gamepad (GUdev.Device device) { + RawGamepad raw_gamepad; + try { + raw_gamepad = new LinuxRawGamepad (identifier); + } catch (FileError e) { + return null; } + + if (raw_gamepads.contains (identifier)) + return null; + + raw_gamepads.insert (identifier, raw_gamepad); + } + + private RawGamepad? remove_gamepad (GUdev.Device device) { + if (!raw_gamepads.contains (identifier)) + return null; + + var raw_gamepad = raw_gamepads.get (identifier); + raw_gamepads.remove (identifier); + + return raw_gamepad; + } + + private bool is_gamepad (GUdev.Device device) { + if ((device.has_property ("ID_INPUT_JOYSTICK") && device.get_property ("ID_INPUT_JOYSTICK") == "1") || + (device.has_property (".INPUT_CLASS") && device.get_property (".INPUT_CLASS") == "joystick")) + return true; + else + return false; } } From f0f7d051cb4f03de1331bf59c952b9c4cb93b7e0 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 21:18:48 +0530 Subject: [PATCH 21/72] Return MappedEvent instead of having it as an out parameter --- src/gamepad/gamepad.vala | 9 +++------ src/gamepad/mapping.vala | 15 +++++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index f6e57099..dc6a6eca 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -71,20 +71,17 @@ public class LibGamepad.Gamepad : Object { } private void on_raw_button_event (int button, bool value) { - MappedEvent event; - mapping.get_button_mapping (button, out event); + var event = mapping.get_button_mapping (button, out event); emit_event (event, value ? 1 : 0); } private void on_raw_axis_event (int axis, double value) { - MappedEvent event; - mapping.get_axis_mapping (axis, out event); + var event = mapping.get_axis_mapping (axis, out event); emit_event (event, value); } private void on_raw_dpad_event (int dpad_index, int axis, int value) { - MappedEvent event; - mapping.get_dpad_mapping (dpad_index, axis, value, out event); + var event = mapping.get_dpad_mapping (dpad_index, axis, value, out event); emit_event (event, value.abs ()); } diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index 7a573581..705521f7 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -66,10 +66,8 @@ public class LibGamepad.Mapping : Object { } } - public void get_dpad_mapping (int dpad_index, - int dpad_axis, - int dpad_value, - out MappedEvent event) { + public MappedEvent get_dpad_mapping (int dpad_index, int dpad_axis, int dpad_value) { + var event = MappedEvent (); int dpad_position; var dpad = dpads[dpad_index]; if (dpad_value == 0) @@ -86,9 +84,11 @@ public class LibGamepad.Mapping : Object { event.button = (StandardGamepadButton) dpad.values[dpad_position]; break; } + return event; } - public void get_axis_mapping (int axis_number, out MappedEvent event) { + public MappedEvent get_axis_mapping (int axis_number) { + var event = MappedEvent (); event.type = axes_type[axis_number]; switch (event.type) { case InputType.AXIS: @@ -98,9 +98,11 @@ public class LibGamepad.Mapping : Object { event.button = (StandardGamepadButton) axes_value[axis_number]; break; } + return event; } - public void get_button_mapping (int button_number, out MappedEvent event) { + public MappedEvent get_button_mapping (int button_number) { + var event = MappedEvent (); event.type = buttons_type[button_number]; switch (event.type) { case InputType.AXIS: @@ -110,6 +112,7 @@ public class LibGamepad.Mapping : Object { event.button = (StandardGamepadButton) buttons_value[button_number]; break; } + return event; } public static InputType map_type (string str) { From 31f810c255067363c968563cf434aafc83487bae Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 21:20:53 +0530 Subject: [PATCH 22/72] Fix LinuxRawGamepadMonitor --- src/gamepad/linux/linux-raw-gamepad-monitor.vala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index be7e62ff..6bd282a9 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -68,6 +68,8 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { return null; raw_gamepads.insert (identifier, raw_gamepad); + + return raw_gamepad; } private RawGamepad? remove_gamepad (GUdev.Device device) { @@ -80,7 +82,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { return raw_gamepad; } - private bool is_gamepad (GUdev.Device device) { + private static bool is_gamepad (GUdev.Device device) { if ((device.has_property ("ID_INPUT_JOYSTICK") && device.get_property ("ID_INPUT_JOYSTICK") == "1") || (device.has_property (".INPUT_CLASS") && device.get_property (".INPUT_CLASS") == "joystick")) return true; From 6e5cd9ffeddf2c6d2abbebf8850677a05ea4b95e Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 21:21:48 +0530 Subject: [PATCH 23/72] Add new line before return --- src/gamepad/gamepad-monitor.vala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index aad42f73..e263f633 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -54,6 +54,7 @@ public class LibGamepad.GamepadMonitor : Object { gamepads.remove (gamepad); gamepad_unplugged (gamepad); }); + return gamepad; } From 959c3c9a0d40868eb8368bc5aec1019737ceea04 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 21:24:37 +0530 Subject: [PATCH 24/72] Fix out in gamepad.vala --- src/gamepad/gamepad.vala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index dc6a6eca..10fa952f 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -71,17 +71,17 @@ public class LibGamepad.Gamepad : Object { } private void on_raw_button_event (int button, bool value) { - var event = mapping.get_button_mapping (button, out event); + var event = mapping.get_button_mapping (button); emit_event (event, value ? 1 : 0); } private void on_raw_axis_event (int axis, double value) { - var event = mapping.get_axis_mapping (axis, out event); + var event = mapping.get_axis_mapping (axis); emit_event (event, value); } private void on_raw_dpad_event (int dpad_index, int axis, int value) { - var event = mapping.get_dpad_mapping (dpad_index, axis, value, out event); + var event = mapping.get_dpad_mapping (dpad_index, axis, value); emit_event (event, value.abs ()); } From eec060d92f2457cd98d3db60dae2bd7b549194ce Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 21:33:43 +0530 Subject: [PATCH 25/72] Remove unplugged signals --- src/gamepad/gamepad-monitor.vala | 11 +---------- src/gamepad/linux/linux-raw-gamepad-monitor.vala | 1 - src/gamepad/raw-gamepad-monitor.vala | 6 ------ 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index e263f633..0be6d4cc 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -12,12 +12,6 @@ public class LibGamepad.GamepadMonitor : Object { */ public signal void gamepad_plugged (Gamepad gamepad); - /** - * Emitted when a gamepad is unplugged - * @param gamepad The gamepad - */ - public signal void gamepad_unplugged (Gamepad gamepad); - public delegate void GamepadCallback (Gamepad gamepad); private static SList gamepads; @@ -50,10 +44,7 @@ public class LibGamepad.GamepadMonitor : Object { private Gamepad add_gamepad (RawGamepad raw_gamepad) { var gamepad = new Gamepad (raw_gamepad); gamepads.append (gamepad); - gamepad.unplugged.connect (() => { - gamepads.remove (gamepad); - gamepad_unplugged (gamepad); - }); + gamepad.unplugged.connect (() => gamepads.remove (gamepad)); return gamepad; } diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index 6bd282a9..da6d7f0c 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -38,7 +38,6 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { if (raw_gamepad != null) { // This signal is emitted from here to simplify the code raw_gamepad.unplugged (); - gamepad_unplugged (raw_gamepad); } break; } diff --git a/src/gamepad/raw-gamepad-monitor.vala b/src/gamepad/raw-gamepad-monitor.vala index a3bc68bb..b4589b46 100644 --- a/src/gamepad/raw-gamepad-monitor.vala +++ b/src/gamepad/raw-gamepad-monitor.vala @@ -10,12 +10,6 @@ public interface LibGamepad.RawGamepadMonitor : Object { */ public abstract signal void gamepad_plugged (RawGamepad raw_gamepad); - /** - * This signal should be emitted when a gamepad is unplugged - * @param raw_gamepad The raw gamepad - */ - public abstract signal void gamepad_unplugged (RawGamepad raw_gamepad); - public delegate void RawGamepadCallback (RawGamepad raw_gamepad); /** From 943d0c60465fbd3541fa29da50826dde6310bef2 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 21:36:10 +0530 Subject: [PATCH 26/72] Remove mapping-helpers.c left by mistake --- src/gamepad/mapping-helpers.c | 543 ---------------------------------- 1 file changed, 543 deletions(-) delete mode 100644 src/gamepad/mapping-helpers.c diff --git a/src/gamepad/mapping-helpers.c b/src/gamepad/mapping-helpers.c deleted file mode 100644 index 65c8f893..00000000 --- a/src/gamepad/mapping-helpers.c +++ /dev/null @@ -1,543 +0,0 @@ -/* mapping-helpers.c generated by valac 0.32.0.45-49b63, the Vala compiler - * generated from mapping-helpers.vala, do not modify */ - -/* This file is part of GNOME Games. License: GPLv3*/ - -#include -#include -#include -#include -#include - - -#define LIB_GAMEPAD_TYPE_MAPPING_HELPERS (lib_gamepad_mapping_helpers_get_type ()) -#define LIB_GAMEPAD_MAPPING_HELPERS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIB_GAMEPAD_TYPE_MAPPING_HELPERS, LibGamepadMappingHelpers)) -#define LIB_GAMEPAD_MAPPING_HELPERS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIB_GAMEPAD_TYPE_MAPPING_HELPERS, LibGamepadMappingHelpersClass)) -#define LIB_GAMEPAD_IS_MAPPING_HELPERS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIB_GAMEPAD_TYPE_MAPPING_HELPERS)) -#define LIB_GAMEPAD_IS_MAPPING_HELPERS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIB_GAMEPAD_TYPE_MAPPING_HELPERS)) -#define LIB_GAMEPAD_MAPPING_HELPERS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIB_GAMEPAD_TYPE_MAPPING_HELPERS, LibGamepadMappingHelpersClass)) - -typedef struct _LibGamepadMappingHelpers LibGamepadMappingHelpers; -typedef struct _LibGamepadMappingHelpersClass LibGamepadMappingHelpersClass; -typedef struct _LibGamepadMappingHelpersPrivate LibGamepadMappingHelpersPrivate; - -#define LIB_GAMEPAD_TYPE_INPUT_TYPE (lib_gamepad_input_type_get_type ()) - -#define LIB_GAMEPAD_TYPE_STANDARD_GAMEPAD_AXIS (lib_gamepad_standard_gamepad_axis_get_type ()) - -#define LIB_GAMEPAD_TYPE_STANDARD_GAMEPAD_BUTTON (lib_gamepad_standard_gamepad_button_get_type ()) -typedef struct _LibGamepadParamSpecMappingHelpers LibGamepadParamSpecMappingHelpers; - -struct _LibGamepadMappingHelpers { - GTypeInstance parent_instance; - volatile int ref_count; - LibGamepadMappingHelpersPrivate * priv; -}; - -struct _LibGamepadMappingHelpersClass { - GTypeClass parent_class; - void (*finalize) (LibGamepadMappingHelpers *self); -}; - -typedef enum { - LIB_GAMEPAD_INPUT_TYPE_AXIS, - LIB_GAMEPAD_INPUT_TYPE_BUTTON, - LIB_GAMEPAD_INPUT_TYPE_INVALID -} LibGamepadInputType; - -typedef enum { - LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_X, - LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_Y, - LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_X, - LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_Y -} LibGamepadStandardGamepadAxis; - -typedef enum { - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_A, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_B, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_X, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_Y, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_L, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_R, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_L, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_R, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SELECT, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_START, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_L, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_R, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_UP, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_DOWN, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_LEFT, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_RIGHT, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_HOME, - LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_UNKNOWN -} LibGamepadStandardGamepadButton; - -struct _LibGamepadParamSpecMappingHelpers { - GParamSpec parent_instance; -}; - - -static gpointer lib_gamepad_mapping_helpers_parent_class = NULL; - -gpointer lib_gamepad_mapping_helpers_ref (gpointer instance); -void lib_gamepad_mapping_helpers_unref (gpointer instance); -GParamSpec* lib_gamepad_param_spec_mapping_helpers (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags); -void lib_gamepad_value_set_mapping_helpers (GValue* value, gpointer v_object); -void lib_gamepad_value_take_mapping_helpers (GValue* value, gpointer v_object); -gpointer lib_gamepad_value_get_mapping_helpers (const GValue* value); -GType lib_gamepad_mapping_helpers_get_type (void) G_GNUC_CONST; -enum { - LIB_GAMEPAD_MAPPING_HELPERS_DUMMY_PROPERTY -}; -GType lib_gamepad_input_type_get_type (void) G_GNUC_CONST; -LibGamepadInputType lib_gamepad_mapping_helpers_map_type (const gchar* str); -gint lib_gamepad_mapping_helpers_map_value (const gchar* str); -GType lib_gamepad_standard_gamepad_axis_get_type (void) G_GNUC_CONST; -GType lib_gamepad_standard_gamepad_button_get_type (void) G_GNUC_CONST; -LibGamepadMappingHelpers* lib_gamepad_mapping_helpers_new (void); -LibGamepadMappingHelpers* lib_gamepad_mapping_helpers_construct (GType object_type); -static void lib_gamepad_mapping_helpers_finalize (LibGamepadMappingHelpers* obj); - - -LibGamepadInputType lib_gamepad_mapping_helpers_map_type (const gchar* str) { - LibGamepadInputType result = 0; - const gchar* _tmp0_ = NULL; - const gchar* _tmp1_ = NULL; - GQuark _tmp3_ = 0U; - static GQuark _tmp2_label0 = 0; - static GQuark _tmp2_label1 = 0; - static GQuark _tmp2_label2 = 0; - static GQuark _tmp2_label3 = 0; - static GQuark _tmp2_label4 = 0; - static GQuark _tmp2_label5 = 0; - static GQuark _tmp2_label6 = 0; - static GQuark _tmp2_label7 = 0; - static GQuark _tmp2_label8 = 0; - static GQuark _tmp2_label9 = 0; - static GQuark _tmp2_label10 = 0; - static GQuark _tmp2_label11 = 0; - static GQuark _tmp2_label12 = 0; - static GQuark _tmp2_label13 = 0; - static GQuark _tmp2_label14 = 0; - static GQuark _tmp2_label15 = 0; - static GQuark _tmp2_label16 = 0; - static GQuark _tmp2_label17 = 0; - static GQuark _tmp2_label18 = 0; - static GQuark _tmp2_label19 = 0; - static GQuark _tmp2_label20 = 0; - g_return_val_if_fail (str != NULL, 0); - _tmp0_ = str; - _tmp1_ = _tmp0_; - _tmp3_ = (NULL == _tmp1_) ? 0 : g_quark_from_string (_tmp1_); - if ((((_tmp3_ == ((0 != _tmp2_label0) ? _tmp2_label0 : (_tmp2_label0 = g_quark_from_static_string ("leftx")))) || (_tmp3_ == ((0 != _tmp2_label1) ? _tmp2_label1 : (_tmp2_label1 = g_quark_from_static_string ("lefty"))))) || (_tmp3_ == ((0 != _tmp2_label2) ? _tmp2_label2 : (_tmp2_label2 = g_quark_from_static_string ("rightx"))))) || (_tmp3_ == ((0 != _tmp2_label3) ? _tmp2_label3 : (_tmp2_label3 = g_quark_from_static_string ("righty"))))) { - switch (0) { - default: - { - result = LIB_GAMEPAD_INPUT_TYPE_AXIS; - return result; - } - } - } else if (((((((((((((((((_tmp3_ == ((0 != _tmp2_label4) ? _tmp2_label4 : (_tmp2_label4 = g_quark_from_static_string ("a")))) || (_tmp3_ == ((0 != _tmp2_label5) ? _tmp2_label5 : (_tmp2_label5 = g_quark_from_static_string ("b"))))) || (_tmp3_ == ((0 != _tmp2_label6) ? _tmp2_label6 : (_tmp2_label6 = g_quark_from_static_string ("back"))))) || (_tmp3_ == ((0 != _tmp2_label7) ? _tmp2_label7 : (_tmp2_label7 = g_quark_from_static_string ("dpdown"))))) || (_tmp3_ == ((0 != _tmp2_label8) ? _tmp2_label8 : (_tmp2_label8 = g_quark_from_static_string ("dpleft"))))) || (_tmp3_ == ((0 != _tmp2_label9) ? _tmp2_label9 : (_tmp2_label9 = g_quark_from_static_string ("dpright"))))) || (_tmp3_ == ((0 != _tmp2_label10) ? _tmp2_label10 : (_tmp2_label10 = g_quark_from_static_string ("dpup"))))) || (_tmp3_ == ((0 != _tmp2_label11) ? _tmp2_label11 : (_tmp2_label11 = g_quark_from_static_string ("guide"))))) || (_tmp3_ == ((0 != _tmp2_label12) ? _tmp2_label12 : (_tmp2_label12 = g_quark_from_static_string ("leftshoulder"))))) || (_tmp3_ == ((0 != _tmp2_label13) ? _tmp2_label13 : (_tmp2_label13 = g_quark_from_static_string ("leftstick"))))) || (_tmp3_ == ((0 != _tmp2_label14) ? _tmp2_label14 : (_tmp2_label14 = g_quark_from_static_string ("lefttrigger"))))) || (_tmp3_ == ((0 != _tmp2_label15) ? _tmp2_label15 : (_tmp2_label15 = g_quark_from_static_string ("rightshoulder"))))) || (_tmp3_ == ((0 != _tmp2_label16) ? _tmp2_label16 : (_tmp2_label16 = g_quark_from_static_string ("rightstick"))))) || (_tmp3_ == ((0 != _tmp2_label17) ? _tmp2_label17 : (_tmp2_label17 = g_quark_from_static_string ("righttrigger"))))) || (_tmp3_ == ((0 != _tmp2_label18) ? _tmp2_label18 : (_tmp2_label18 = g_quark_from_static_string ("start"))))) || (_tmp3_ == ((0 != _tmp2_label19) ? _tmp2_label19 : (_tmp2_label19 = g_quark_from_static_string ("x"))))) || (_tmp3_ == ((0 != _tmp2_label20) ? _tmp2_label20 : (_tmp2_label20 = g_quark_from_static_string ("y"))))) { - switch (0) { - default: - { - result = LIB_GAMEPAD_INPUT_TYPE_BUTTON; - return result; - } - } - } else { - switch (0) { - default: - { - result = LIB_GAMEPAD_INPUT_TYPE_INVALID; - return result; - } - } - } -} - - -gint lib_gamepad_mapping_helpers_map_value (const gchar* str) { - gint result = 0; - const gchar* _tmp0_ = NULL; - const gchar* _tmp1_ = NULL; - GQuark _tmp3_ = 0U; - static GQuark _tmp2_label0 = 0; - static GQuark _tmp2_label1 = 0; - static GQuark _tmp2_label2 = 0; - static GQuark _tmp2_label3 = 0; - static GQuark _tmp2_label4 = 0; - static GQuark _tmp2_label5 = 0; - static GQuark _tmp2_label6 = 0; - static GQuark _tmp2_label7 = 0; - static GQuark _tmp2_label8 = 0; - static GQuark _tmp2_label9 = 0; - static GQuark _tmp2_label10 = 0; - static GQuark _tmp2_label11 = 0; - static GQuark _tmp2_label12 = 0; - static GQuark _tmp2_label13 = 0; - static GQuark _tmp2_label14 = 0; - static GQuark _tmp2_label15 = 0; - static GQuark _tmp2_label16 = 0; - static GQuark _tmp2_label17 = 0; - static GQuark _tmp2_label18 = 0; - static GQuark _tmp2_label19 = 0; - static GQuark _tmp2_label20 = 0; - g_return_val_if_fail (str != NULL, 0); - _tmp0_ = str; - _tmp1_ = _tmp0_; - _tmp3_ = (NULL == _tmp1_) ? 0 : g_quark_from_string (_tmp1_); - if (_tmp3_ == ((0 != _tmp2_label0) ? _tmp2_label0 : (_tmp2_label0 = g_quark_from_static_string ("leftx")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_X; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label1) ? _tmp2_label1 : (_tmp2_label1 = g_quark_from_static_string ("lefty")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_LEFT_Y; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label2) ? _tmp2_label2 : (_tmp2_label2 = g_quark_from_static_string ("rightx")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_X; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label3) ? _tmp2_label3 : (_tmp2_label3 = g_quark_from_static_string ("righty")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_AXIS_RIGHT_Y; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label4) ? _tmp2_label4 : (_tmp2_label4 = g_quark_from_static_string ("a")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_A; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label5) ? _tmp2_label5 : (_tmp2_label5 = g_quark_from_static_string ("b")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_B; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label6) ? _tmp2_label6 : (_tmp2_label6 = g_quark_from_static_string ("back")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SELECT; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label7) ? _tmp2_label7 : (_tmp2_label7 = g_quark_from_static_string ("dpdown")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_DOWN; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label8) ? _tmp2_label8 : (_tmp2_label8 = g_quark_from_static_string ("dpleft")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_LEFT; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label9) ? _tmp2_label9 : (_tmp2_label9 = g_quark_from_static_string ("dpright")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_RIGHT; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label10) ? _tmp2_label10 : (_tmp2_label10 = g_quark_from_static_string ("dpup")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_DPAD_UP; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label11) ? _tmp2_label11 : (_tmp2_label11 = g_quark_from_static_string ("guide")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_HOME; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label12) ? _tmp2_label12 : (_tmp2_label12 = g_quark_from_static_string ("leftshoulder")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_L; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label13) ? _tmp2_label13 : (_tmp2_label13 = g_quark_from_static_string ("leftstick")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_L; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label14) ? _tmp2_label14 : (_tmp2_label14 = g_quark_from_static_string ("lefttrigger")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_L; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label15) ? _tmp2_label15 : (_tmp2_label15 = g_quark_from_static_string ("rightshoulder")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_SHOULDER_R; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label16) ? _tmp2_label16 : (_tmp2_label16 = g_quark_from_static_string ("rightstick")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_STICK_R; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label17) ? _tmp2_label17 : (_tmp2_label17 = g_quark_from_static_string ("righttrigger")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_TRIGGER_R; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label18) ? _tmp2_label18 : (_tmp2_label18 = g_quark_from_static_string ("start")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_START; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label19) ? _tmp2_label19 : (_tmp2_label19 = g_quark_from_static_string ("x")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_X; - return result; - } - } - } else if (_tmp3_ == ((0 != _tmp2_label20) ? _tmp2_label20 : (_tmp2_label20 = g_quark_from_static_string ("y")))) { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_Y; - return result; - } - } - } else { - switch (0) { - default: - { - result = (gint) LIB_GAMEPAD_STANDARD_GAMEPAD_BUTTON_UNKNOWN; - return result; - } - } - } -} - - -LibGamepadMappingHelpers* lib_gamepad_mapping_helpers_construct (GType object_type) { - LibGamepadMappingHelpers* self = NULL; - self = (LibGamepadMappingHelpers*) g_type_create_instance (object_type); - return self; -} - - -LibGamepadMappingHelpers* lib_gamepad_mapping_helpers_new (void) { - return lib_gamepad_mapping_helpers_construct (LIB_GAMEPAD_TYPE_MAPPING_HELPERS); -} - - -static void lib_gamepad_value_mapping_helpers_init (GValue* value) { - value->data[0].v_pointer = NULL; -} - - -static void lib_gamepad_value_mapping_helpers_free_value (GValue* value) { - if (value->data[0].v_pointer) { - lib_gamepad_mapping_helpers_unref (value->data[0].v_pointer); - } -} - - -static void lib_gamepad_value_mapping_helpers_copy_value (const GValue* src_value, GValue* dest_value) { - if (src_value->data[0].v_pointer) { - dest_value->data[0].v_pointer = lib_gamepad_mapping_helpers_ref (src_value->data[0].v_pointer); - } else { - dest_value->data[0].v_pointer = NULL; - } -} - - -static gpointer lib_gamepad_value_mapping_helpers_peek_pointer (const GValue* value) { - return value->data[0].v_pointer; -} - - -static gchar* lib_gamepad_value_mapping_helpers_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { - if (collect_values[0].v_pointer) { - LibGamepadMappingHelpers* object; - object = collect_values[0].v_pointer; - if (object->parent_instance.g_class == NULL) { - return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); - } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) { - return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); - } - value->data[0].v_pointer = lib_gamepad_mapping_helpers_ref (object); - } else { - value->data[0].v_pointer = NULL; - } - return NULL; -} - - -static gchar* lib_gamepad_value_mapping_helpers_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { - LibGamepadMappingHelpers** object_p; - object_p = collect_values[0].v_pointer; - if (!object_p) { - return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); - } - if (!value->data[0].v_pointer) { - *object_p = NULL; - } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) { - *object_p = value->data[0].v_pointer; - } else { - *object_p = lib_gamepad_mapping_helpers_ref (value->data[0].v_pointer); - } - return NULL; -} - - -GParamSpec* lib_gamepad_param_spec_mapping_helpers (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) { - LibGamepadParamSpecMappingHelpers* spec; - g_return_val_if_fail (g_type_is_a (object_type, LIB_GAMEPAD_TYPE_MAPPING_HELPERS), NULL); - spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags); - G_PARAM_SPEC (spec)->value_type = object_type; - return G_PARAM_SPEC (spec); -} - - -gpointer lib_gamepad_value_get_mapping_helpers (const GValue* value) { - g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, LIB_GAMEPAD_TYPE_MAPPING_HELPERS), NULL); - return value->data[0].v_pointer; -} - - -void lib_gamepad_value_set_mapping_helpers (GValue* value, gpointer v_object) { - LibGamepadMappingHelpers* old; - g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, LIB_GAMEPAD_TYPE_MAPPING_HELPERS)); - old = value->data[0].v_pointer; - if (v_object) { - g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, LIB_GAMEPAD_TYPE_MAPPING_HELPERS)); - g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); - value->data[0].v_pointer = v_object; - lib_gamepad_mapping_helpers_ref (value->data[0].v_pointer); - } else { - value->data[0].v_pointer = NULL; - } - if (old) { - lib_gamepad_mapping_helpers_unref (old); - } -} - - -void lib_gamepad_value_take_mapping_helpers (GValue* value, gpointer v_object) { - LibGamepadMappingHelpers* old; - g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, LIB_GAMEPAD_TYPE_MAPPING_HELPERS)); - old = value->data[0].v_pointer; - if (v_object) { - g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, LIB_GAMEPAD_TYPE_MAPPING_HELPERS)); - g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); - value->data[0].v_pointer = v_object; - } else { - value->data[0].v_pointer = NULL; - } - if (old) { - lib_gamepad_mapping_helpers_unref (old); - } -} - - -static void lib_gamepad_mapping_helpers_class_init (LibGamepadMappingHelpersClass * klass) { - lib_gamepad_mapping_helpers_parent_class = g_type_class_peek_parent (klass); - ((LibGamepadMappingHelpersClass *) klass)->finalize = lib_gamepad_mapping_helpers_finalize; -} - - -static void lib_gamepad_mapping_helpers_instance_init (LibGamepadMappingHelpers * self) { - self->ref_count = 1; -} - - -static void lib_gamepad_mapping_helpers_finalize (LibGamepadMappingHelpers* obj) { - LibGamepadMappingHelpers * self; - self = G_TYPE_CHECK_INSTANCE_CAST (obj, LIB_GAMEPAD_TYPE_MAPPING_HELPERS, LibGamepadMappingHelpers); - g_signal_handlers_destroy (self); -} - - -GType lib_gamepad_mapping_helpers_get_type (void) { - static volatile gsize lib_gamepad_mapping_helpers_type_id__volatile = 0; - if (g_once_init_enter (&lib_gamepad_mapping_helpers_type_id__volatile)) { - static const GTypeValueTable g_define_type_value_table = { lib_gamepad_value_mapping_helpers_init, lib_gamepad_value_mapping_helpers_free_value, lib_gamepad_value_mapping_helpers_copy_value, lib_gamepad_value_mapping_helpers_peek_pointer, "p", lib_gamepad_value_mapping_helpers_collect_value, "p", lib_gamepad_value_mapping_helpers_lcopy_value }; - static const GTypeInfo g_define_type_info = { sizeof (LibGamepadMappingHelpersClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) lib_gamepad_mapping_helpers_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (LibGamepadMappingHelpers), 0, (GInstanceInitFunc) lib_gamepad_mapping_helpers_instance_init, &g_define_type_value_table }; - static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) }; - GType lib_gamepad_mapping_helpers_type_id; - lib_gamepad_mapping_helpers_type_id = g_type_register_fundamental (g_type_fundamental_next (), "LibGamepadMappingHelpers", &g_define_type_info, &g_define_type_fundamental_info, 0); - g_once_init_leave (&lib_gamepad_mapping_helpers_type_id__volatile, lib_gamepad_mapping_helpers_type_id); - } - return lib_gamepad_mapping_helpers_type_id__volatile; -} - - -gpointer lib_gamepad_mapping_helpers_ref (gpointer instance) { - LibGamepadMappingHelpers* self; - self = instance; - g_atomic_int_inc (&self->ref_count); - return instance; -} - - -void lib_gamepad_mapping_helpers_unref (gpointer instance) { - LibGamepadMappingHelpers* self; - self = instance; - if (g_atomic_int_dec_and_test (&self->ref_count)) { - LIB_GAMEPAD_MAPPING_HELPERS_GET_CLASS (self)->finalize (self); - g_type_free_instance ((GTypeInstance *) self); - } -} - - - From f19fc75acb0c1ecf6dfda60de985d45d0e0e3cdf Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Thu, 14 Jul 2016 21:56:38 +0530 Subject: [PATCH 27/72] Use singleton and fix build error in LinuxRawGamepadMonitor --- src/gamepad/gamepad-monitor.vala | 18 +++++++++++------- .../linux/linux-raw-gamepad-monitor.vala | 13 ++++++++++++- src/retro/retro-input-manager.vala | 2 +- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index 0be6d4cc..6005dfdf 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -14,23 +14,27 @@ public class LibGamepad.GamepadMonitor : Object { public delegate void GamepadCallback (Gamepad gamepad); - private static SList gamepads; + private static GamepadMonitor instance; + private SList gamepads; private RawGamepadMonitor raw_gamepad_monitor; - public GamepadMonitor () { - init_static_if_not (); + private GamepadMonitor () { + if (gamepads == null) + gamepads = new SList (); - raw_gamepad_monitor = new LinuxRawGamepadMonitor (); + raw_gamepad_monitor = LinuxRawGamepadMonitor.get_instance (); raw_gamepad_monitor.gamepad_plugged.connect (on_raw_gamepad_plugged); raw_gamepad_monitor.foreach_gamepad ((raw_gamepad) => add_gamepad (raw_gamepad)); } - private static void init_static_if_not () { - if (gamepads == null) - gamepads = new SList (); + public static GamepadMonitor get_instance () { + if (instance == null) + instance = new GamepadMonitor (); + + return instance; } /** diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index da6d7f0c..d6f4fd98 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -3,10 +3,12 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { public delegate void RawGamepadCallback (RawGamepad raw_gamepad); + private static LinuxRawGamepadMonitor instance; + private GUdev.Client client; private HashTable raw_gamepads; - public LinuxRawGamepadMonitor () { + private LinuxRawGamepadMonitor () { client = new GUdev.Client ({"input"}); client.uevent.connect (handle_udev_client_callback); @@ -14,6 +16,13 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { client.query_by_subsystem ("input").foreach (initial_device_iterator); } + public static LinuxRawGamepadMonitor get_instance () { + if (instance == null) + instance = new LinuxRawGamepadMonitor (); + + return instance; + } + public void foreach_gamepad (RawGamepadCallback callback) { raw_gamepads.foreach((identifier, raw_gamepad) => callback (raw_gamepad)); } @@ -56,6 +65,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { } private RawGamepad? add_gamepad (GUdev.Device device) { + var identifier = device.get_device_file (); RawGamepad raw_gamepad; try { raw_gamepad = new LinuxRawGamepad (identifier); @@ -72,6 +82,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { } private RawGamepad? remove_gamepad (GUdev.Device device) { + var identifier = device.get_device_file (); if (!raw_gamepads.contains (identifier)) return null; diff --git a/src/retro/retro-input-manager.vala b/src/retro/retro-input-manager.vala index fa9919ad..0ab1e0a8 100644 --- a/src/retro/retro-input-manager.vala +++ b/src/retro/retro-input-manager.vala @@ -11,7 +11,7 @@ private class Games.RetroInputManager : Object { public RetroInputManager (Gtk.EventBox widget) { input = new RetroGtk.InputDeviceManager (); keyboard = new RetroGtk.VirtualGamepad (widget); - gamepad_monitor = new LibGamepad.GamepadMonitor (); + gamepad_monitor = LibGamepad.GamepadMonitor.get_instance (); input.set_keyboard (new RetroGtk.Keyboard (widget)); From f056bc746a8d993cb3497298435fe7a6c3956f52 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 13:28:39 +0530 Subject: [PATCH 28/72] Update gamepad-monitor to obey the AWESOME style guide --- src/gamepad/gamepad-monitor.vala | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index 6005dfdf..f71cb10d 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -17,16 +17,13 @@ public class LibGamepad.GamepadMonitor : Object { private static GamepadMonitor instance; private SList gamepads; - private RawGamepadMonitor raw_gamepad_monitor; private GamepadMonitor () { if (gamepads == null) gamepads = new SList (); - raw_gamepad_monitor = LinuxRawGamepadMonitor.get_instance (); - + var raw_gamepad_monitor = LinuxRawGamepadMonitor.get_instance (); raw_gamepad_monitor.gamepad_plugged.connect (on_raw_gamepad_plugged); - raw_gamepad_monitor.foreach_gamepad ((raw_gamepad) => add_gamepad (raw_gamepad)); } @@ -42,18 +39,24 @@ public class LibGamepad.GamepadMonitor : Object { * @param callback The callback */ public void foreach_gamepad (GamepadCallback callback) { - gamepads.foreach ((gamepad) => callback (gamepad)); + foreach (var gamepad in gamepads) + callback (gamepad); } private Gamepad add_gamepad (RawGamepad raw_gamepad) { var gamepad = new Gamepad (raw_gamepad); gamepads.append (gamepad); - gamepad.unplugged.connect (() => gamepads.remove (gamepad)); + gamepad.unplugged.connect (remove_gamepad); return gamepad; } private void on_raw_gamepad_plugged (RawGamepad raw_gamepad) { - gamepad_plugged (add_gamepad (raw_gamepad)); + var gamepad = add_gamepad (raw_gamepad); + gamepad_plugged (gamepad); + } + + private void remove_gamepad (Gamepad gamepad) { + gamepads.remove (gamepad); } } From 38c36db30469c4a17fe2783f0d3462fb686e6630 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 13:43:05 +0530 Subject: [PATCH 29/72] Merge LinuxGuidHelpers into LinuxRawGamepad --- src/Makefile.am | 1 - src/gamepad/linux/linux-guid-helpers.vala | 31 ----------------------- src/gamepad/linux/linux-raw-gamepad.vala | 25 +++++++++++++++--- 3 files changed, 21 insertions(+), 36 deletions(-) delete mode 100644 src/gamepad/linux/linux-guid-helpers.vala diff --git a/src/Makefile.am b/src/Makefile.am index c25d895e..ccf8aaa8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -55,7 +55,6 @@ gnome_games_SOURCES = \ \ gamepad/raw-gamepad-monitor.vala \ gamepad/raw-gamepad.vala \ - gamepad/linux/linux-guid-helpers.vala \ gamepad/linux/linux-raw-gamepad-monitor.vala \ gamepad/linux/linux-raw-gamepad.vala \ gamepad/gamepad-monitor.vala \ diff --git a/src/gamepad/linux/linux-guid-helpers.vala b/src/gamepad/linux/linux-guid-helpers.vala deleted file mode 100644 index c7993b4e..00000000 --- a/src/gamepad/linux/linux-guid-helpers.vala +++ /dev/null @@ -1,31 +0,0 @@ -// This file is part of GNOME Games. License: GPLv3 - -private class LibGamepad.LinuxGuidHelpers : Object { - public static string from_dev (Libevdev.Evdev device) { - uint16 guid[8]; - guid[0] = (uint16) device.id_bustype.to_little_endian (); - guid[1] = 0; - guid[2] = (uint16) device.id_vendor.to_little_endian (); - guid[3] = 0; - guid[4] = (uint16) device.id_product.to_little_endian (); - guid[5] = 0; - guid[6] = (uint16) device.id_version.to_little_endian (); - guid[7] = 0; - return uint16s_to_hex_string (guid); - } - - public static string from_file (string file_name) throws FileError { - var fd = Posix.open (file_name, Posix.O_RDONLY | Posix.O_NONBLOCK); - - if (fd < 0) - throw new FileError.FAILED (@"Unable to open file $file_name: $(Posix.strerror (Posix.errno))"); - - var device = new Libevdev.Evdev (); - if (device.set_fd (fd) < 0) - throw new FileError.FAILED (@"Evdev error on opening file $file_name: $(Posix.strerror (Posix.errno))"); - - var guid = from_dev (device); - Posix.close (fd); - return guid; - } -} diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index deff1781..02faafa2 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -13,15 +13,33 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { private string _name; public string name { get { return _name; } } - private string _guid; - public string guid { get { return _guid; } } - private uint8 _axes_number = 0; public uint8 axes_number { get { return _axes_number; } } private uint8 _buttons_number = 0; public uint8 buttons_number { get { return _buttons_number; } } + + private string _guid = ""; + public string guid { + get { + if (_guid == "") { + uint16 guid_array[8]; + guid_array[0] = (uint16) device.id_bustype.to_little_endian (); + guid_array[1] = 0; + guid_array[2] = (uint16) device.id_vendor.to_little_endian (); + guid_array[3] = 0; + guid_array[4] = (uint16) device.id_product.to_little_endian (); + guid_array[5] = 0; + guid_array[6] = (uint16) device.id_version.to_little_endian (); + guid_array[7] = 0; + _guid = uint16s_to_hex_string (guid_array); + } + + return _guid; + } + } + private int _dpads_number = -1; public uint8 dpads_number { get { @@ -56,7 +74,6 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { throw new FileError.FAILED (@"Evdev is unable to open $file_name: $(Posix.strerror (Posix.errno))"); _name = device.name; - _guid = LinuxGuidHelpers.from_dev (device); // Poll the events in the default main loop var channel = new IOChannel.unix_new (fd); From 4bcfb9e203fd07768db34a82c43699d05efd9edb Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 13:45:29 +0530 Subject: [PATCH 30/72] Hide guid in Gamepad --- src/gamepad/gamepad.vala | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index 10fa952f..bb56dfe1 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -27,11 +27,6 @@ public class LibGamepad.Gamepad : Object { public signal void unplugged (); - /** - * The guid - */ - public string? guid { get; private set; } - /** * The name present in our database */ @@ -54,7 +49,7 @@ public class LibGamepad.Gamepad : Object { public Gamepad (RawGamepad raw_gamepad) throws FileError { this.raw_gamepad = raw_gamepad; - guid = raw_gamepad.guid; + var guid = raw_gamepad.guid; name = MappingsManager.get_name (guid) ?? raw_gamepad.name; try { mapping = new Mapping.from_sdl_string (MappingsManager.get_mapping (guid)); From 244226be8d02c00ef859ea1e62ceb7ca0e658bd2 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 14:13:03 +0530 Subject: [PATCH 31/72] Remove _name from raw-gamepad --- src/gamepad/linux/linux-raw-gamepad.vala | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index 02faafa2..5eaec70e 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -9,9 +9,7 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { private uint8 abs_map[Linux.Input.ABS_MAX]; private Linux.Input.AbsInfo abs_info[Linux.Input.ABS_MAX]; private string identifier; - - private string _name; - public string name { get { return _name; } } + public string name { get { return device.name; } } private uint8 _axes_number = 0; public uint8 axes_number { get { return _axes_number; } } @@ -73,8 +71,6 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { if (device.set_fd (fd) < 0) throw new FileError.FAILED (@"Evdev is unable to open $file_name: $(Posix.strerror (Posix.errno))"); - _name = device.name; - // Poll the events in the default main loop var channel = new IOChannel.unix_new (fd); event_source_id = channel.add_watch (IOCondition.IN, poll_events); From 3c2f1f935c7887d224c3cf0c12834cdc2ce85c91 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 18:55:56 +0530 Subject: [PATCH 32/72] Dont initialize _guid and compare with null --- src/gamepad/linux/linux-raw-gamepad.vala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index 5eaec70e..779b08a9 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -18,10 +18,10 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { public uint8 buttons_number { get { return _buttons_number; } } - private string _guid = ""; + private string _guid; public string guid { get { - if (_guid == "") { + if (_guid == null) { uint16 guid_array[8]; guid_array[0] = (uint16) device.id_bustype.to_little_endian (); guid_array[1] = 0; From bab074b6171115630eedbf7b687ed4d03a724d78 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 19:12:22 +0530 Subject: [PATCH 33/72] Add blank line before break/continue/return if it is not the only statement in the block --- src/gamepad/gamepad.vala | 2 ++ src/gamepad/linux/linux-raw-gamepad-monitor.vala | 2 ++ src/gamepad/linux/linux-raw-gamepad.vala | 5 +++++ src/gamepad/mapping.vala | 13 +++++++++++++ src/gamepad/mappings-manager.vala | 2 ++ 5 files changed, 24 insertions(+) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index bb56dfe1..63b30527 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -84,9 +84,11 @@ public class LibGamepad.Gamepad : Object { switch (event.type) { case InputType.AXIS: axis_event (event.axis, value); + break; case InputType.BUTTON: button_event (event.button, (bool) value); + break; } } diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index d6f4fd98..31ec458c 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -41,6 +41,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { var raw_gamepad = add_gamepad (device); if (raw_gamepad != null) gamepad_plugged (raw_gamepad); + break; case "remove": var raw_gamepad = remove_gamepad (device); @@ -48,6 +49,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { // This signal is emitted from here to simplify the code raw_gamepad.unplugged (); } + break; } } diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index 779b08a9..f0a30c8c 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -95,6 +95,7 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { /* Skip dpads */ if (i == Linux.Input.ABS_HAT0X) { i = Linux.Input.ABS_HAT3Y; + continue; } if (device.has_event_code (Linux.Input.EV_ABS, i)) { @@ -129,6 +130,7 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { if (code >= Linux.Input.BTN_MISC) { button_event (key_map[code - Linux.Input.BTN_MISC], (bool) ev.value); } + break; case Linux.Input.EV_ABS: switch (code) { @@ -142,12 +144,15 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { case Linux.Input.ABS_HAT3Y: code -= Linux.Input.ABS_HAT0X; dpad_event (code / 2, code % 2, ev.value); + break; default: var axis = abs_map[code]; axis_event (axis, (double) ev.value / abs_info[axis].maximum); + break; } + break; } } diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index 705521f7..8c3c376e 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -30,6 +30,7 @@ public class LibGamepad.Mapping : Object { var type = map_type (str); if (type == InputType.INVALID) { if (str != "platform") debug ("Invalid token : %s", str); + continue; } var value = map_value (str); @@ -46,6 +47,7 @@ public class LibGamepad.Mapping : Object { while (dpads.length <= dpad_index) dpads += new Dpad (); dpads[dpad_index].types[dpad_position] = type; dpads[dpad_index].values[dpad_position] = value; + break; case 'b': var button = int.parse (real[1:real.length]); @@ -53,6 +55,7 @@ public class LibGamepad.Mapping : Object { if (buttons_value.length <= button) buttons_value.resize (button + 1); buttons_type[button] = type; buttons_value[button] = value; + break; case 'a': var axis = int.parse (real[1:real.length]); @@ -60,6 +63,7 @@ public class LibGamepad.Mapping : Object { if (axes_value.length <= axis) axes_value.resize (axis + 1); axes_type[axis] = type; axes_value[axis] = value; + break; } } @@ -79,11 +83,14 @@ public class LibGamepad.Mapping : Object { switch (event.type) { case InputType.AXIS: event.axis = (StandardGamepadAxis) dpad.values[dpad_position]; + break; case InputType.BUTTON: event.button = (StandardGamepadButton) dpad.values[dpad_position]; + break; } + return event; } @@ -93,11 +100,14 @@ public class LibGamepad.Mapping : Object { switch (event.type) { case InputType.AXIS: event.axis = (StandardGamepadAxis) axes_value[axis_number]; + break; case InputType.BUTTON: event.button = (StandardGamepadButton) axes_value[axis_number]; + break; } + return event; } @@ -107,11 +117,14 @@ public class LibGamepad.Mapping : Object { switch (event.type) { case InputType.AXIS: event.axis = (StandardGamepadAxis) buttons_value[button_number]; + break; case InputType.BUTTON: event.button = (StandardGamepadButton) buttons_value[button_number]; + break; } + return event; } diff --git a/src/gamepad/mappings-manager.vala b/src/gamepad/mappings-manager.vala index 39ed5962..f78c0802 100644 --- a/src/gamepad/mappings-manager.vala +++ b/src/gamepad/mappings-manager.vala @@ -72,6 +72,7 @@ public class LibGamepad.MappingsManager { */ public static string? get_name (string guid) { init_if_not (); + return names.get (guid); } @@ -83,6 +84,7 @@ public class LibGamepad.MappingsManager { */ public static string? get_mapping (string guid) { init_if_not (); + return mappings.get (guid); } From c44e5bfb069496c088fa4c2ae3f58ba19cab6e7b Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 19:23:05 +0530 Subject: [PATCH 34/72] Split one liner ifs, and whiles into two lines --- src/gamepad/mapping.vala | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index 8c3c376e..5af02040 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -29,7 +29,8 @@ public class LibGamepad.Mapping : Object { var real = mapping.split (":")[1]; var type = map_type (str); if (type == InputType.INVALID) { - if (str != "platform") debug ("Invalid token : %s", str); + if (str != "platform") + debug ("Invalid token : %s", str); continue; } @@ -44,23 +45,28 @@ public class LibGamepad.Mapping : Object { dpad_position_2pow >>= 1; dpad_position++; } - while (dpads.length <= dpad_index) dpads += new Dpad (); + while (dpads.length <= dpad_index) + dpads += new Dpad (); dpads[dpad_index].types[dpad_position] = type; dpads[dpad_index].values[dpad_position] = value; break; case 'b': var button = int.parse (real[1:real.length]); - while (buttons_type.length <= button) buttons_type += InputType.INVALID; - if (buttons_value.length <= button) buttons_value.resize (button + 1); + while (buttons_type.length <= button) + buttons_type += InputType.INVALID; + if (buttons_value.length <= button) + buttons_value.resize (button + 1); buttons_type[button] = type; buttons_value[button] = value; break; case 'a': var axis = int.parse (real[1:real.length]); - while (axes_type.length <= axis) axes_type += InputType.INVALID; - if (axes_value.length <= axis) axes_value.resize (axis + 1); + while (axes_type.length <= axis) + axes_type += InputType.INVALID; + if (axes_value.length <= axis) + axes_value.resize (axis + 1); axes_type[axis] = type; axes_value[axis] = value; From b1b31fbbb3270cd916208543bf34f53a6c1c71ba Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 19:32:13 +0530 Subject: [PATCH 35/72] Make MappingsManager a singleton --- src/gamepad/gamepad.vala | 5 +-- src/gamepad/mappings-manager.vala | 57 +++++++++++++------------------ 2 files changed, 27 insertions(+), 35 deletions(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index 63b30527..538876b1 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -50,9 +50,10 @@ public class LibGamepad.Gamepad : Object { public Gamepad (RawGamepad raw_gamepad) throws FileError { this.raw_gamepad = raw_gamepad; var guid = raw_gamepad.guid; - name = MappingsManager.get_name (guid) ?? raw_gamepad.name; + var mappings_manager = MappingsManager.get_instance (); + name = mappings_manager.get_name (guid) ?? raw_gamepad.name; try { - mapping = new Mapping.from_sdl_string (MappingsManager.get_mapping (guid)); + mapping = new Mapping.from_sdl_string (mappings_manager.get_mapping (guid)); mapped = true; raw_gamepad.button_event.connect (on_raw_button_event); raw_gamepad.axis_event.connect (on_raw_axis_event); diff --git a/src/gamepad/mappings-manager.vala b/src/gamepad/mappings-manager.vala index f78c0802..47821c9c 100644 --- a/src/gamepad/mappings-manager.vala +++ b/src/gamepad/mappings-manager.vala @@ -5,19 +5,31 @@ * * The client interfaces with this class primarily */ -public class LibGamepad.MappingsManager { - private static HashTable names; - private static HashTable mappings; +public class LibGamepad.MappingsManager : Object { + private HashTable names; + private HashTable mappings; + + private static MappingsManager? instance; + + private MappingsManager () { + if (names == null) + names = new HashTable (str_hash, str_equal); + if (mappings == null) + mappings = new HashTable (str_hash, str_equal); + add_from_resource ("/org/gnome/Games/gamepads/gamecontrollerdb.txt"); + } - private static bool? inited; + public static MappingsManager get_instance () { + if (instance == null) + instance = new MappingsManager (); + return instance; + } /** * Adds mappings from a file * @param file_name The file name */ - public static void add_from_file (string file_name) throws IOError { - init_if_not (); - + public void add_from_file (string file_name) throws IOError { var file = File.new_for_path (file_name); add_from_input_stream (file.read ()); } @@ -26,9 +38,7 @@ public class LibGamepad.MappingsManager { * Adds mappings from a resource path * @param path The path */ - public static void add_from_resource (string path) throws IOError { - init_if_not (); - + public void add_from_resource (string path) throws IOError { add_from_input_stream (resources_open_stream (path, ResourceLookupFlags.NONE)); } @@ -36,9 +46,7 @@ public class LibGamepad.MappingsManager { * Adds mappings from an InputStream * @param input_stream The input stream */ - public static void add_from_input_stream (InputStream input_stream) { - init_if_not (); - + public void add_from_input_stream (InputStream input_stream) { var data_stream = new DataInputStream (input_stream); var mappingstr = data_stream.read_line (); while (mappingstr != null) { @@ -51,9 +59,7 @@ public class LibGamepad.MappingsManager { /** * Adds a mapping from a string (only one gamepad) */ - public static void add_mapping (string mappingstr) { - init_if_not (); - + public void add_mapping (string mappingstr) { if (mappingstr == "" || mappingstr[0] == '#') return; @@ -70,9 +76,7 @@ public class LibGamepad.MappingsManager { * @param guid The guid of the wanted gamepad * @return The name if present in the database */ - public static string? get_name (string guid) { - init_if_not (); - + public string? get_name (string guid) { return names.get (guid); } @@ -82,20 +86,7 @@ public class LibGamepad.MappingsManager { * @param guid The guid of the wanted gamepad * @return The mapping if present in the database */ - public static string? get_mapping (string guid) { - init_if_not (); - + public string? get_mapping (string guid) { return mappings.get (guid); } - - private static void init_if_not () { - if (inited == null || inited == false) { - inited = true; - if (names == null) - names = new HashTable (str_hash, str_equal); - if (mappings == null) - mappings = new HashTable (str_hash, str_equal); - MappingsManager.add_from_resource ("/org/gnome/Games/gamepads/gamecontrollerdb.txt"); - } - } } From 157ee1e87358d25f3fa9cb0b73e70422000dae94 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 19:44:39 +0530 Subject: [PATCH 36/72] Switch to GenericSet instead of SList in gamepad-manager --- src/gamepad/gamepad-monitor.vala | 6 +++--- src/gnome_games_vala.stamp-t | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 src/gnome_games_vala.stamp-t diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index f71cb10d..3ee820c7 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -16,11 +16,11 @@ public class LibGamepad.GamepadMonitor : Object { private static GamepadMonitor instance; - private SList gamepads; + private GenericSet gamepads; private GamepadMonitor () { if (gamepads == null) - gamepads = new SList (); + gamepads = new GenericSet (direct_hash, direct_equal); var raw_gamepad_monitor = LinuxRawGamepadMonitor.get_instance (); raw_gamepad_monitor.gamepad_plugged.connect (on_raw_gamepad_plugged); @@ -45,7 +45,7 @@ public class LibGamepad.GamepadMonitor : Object { private Gamepad add_gamepad (RawGamepad raw_gamepad) { var gamepad = new Gamepad (raw_gamepad); - gamepads.append (gamepad); + gamepads.add (gamepad); gamepad.unplugged.connect (remove_gamepad); return gamepad; diff --git a/src/gnome_games_vala.stamp-t b/src/gnome_games_vala.stamp-t new file mode 100644 index 00000000..859afb1d --- /dev/null +++ b/src/gnome_games_vala.stamp-t @@ -0,0 +1 @@ +stamp From ecb69c4643261918edd05cf4ef7c86cf9134017f Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 19:49:36 +0530 Subject: [PATCH 37/72] Fix genericset --- src/gamepad/gamepad-monitor.vala | 4 ++-- src/gnome_games_vala.stamp-t | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 src/gnome_games_vala.stamp-t diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index 3ee820c7..be941065 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -16,11 +16,11 @@ public class LibGamepad.GamepadMonitor : Object { private static GamepadMonitor instance; - private GenericSet gamepads; + private GenericSet gamepads; private GamepadMonitor () { if (gamepads == null) - gamepads = new GenericSet (direct_hash, direct_equal); + gamepads = new GenericSet (direct_hash, direct_equal); var raw_gamepad_monitor = LinuxRawGamepadMonitor.get_instance (); raw_gamepad_monitor.gamepad_plugged.connect (on_raw_gamepad_plugged); diff --git a/src/gnome_games_vala.stamp-t b/src/gnome_games_vala.stamp-t deleted file mode 100644 index 859afb1d..00000000 --- a/src/gnome_games_vala.stamp-t +++ /dev/null @@ -1 +0,0 @@ -stamp From 9c9c98d5c309ad2de00beb3f586dfd2328f289d6 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 20:01:54 +0530 Subject: [PATCH 38/72] Cleanup LinuxRawGamepadMonitor --- .../linux/linux-raw-gamepad-monitor.vala | 34 +++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index 31ec458c..1599d806 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -12,8 +12,17 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { client = new GUdev.Client ({"input"}); client.uevent.connect (handle_udev_client_callback); - // Initialize internally plugged in gamepads - client.query_by_subsystem ("input").foreach (initial_device_iterator); + // Initialize initially plugged in gamepads + var initial_devices_list = client.query_by_subsystem ("input"); + foreach (var device in initial_devices_list) { + if (device.get_device_file () == null) + continue; + + if (!is_gamepad (device)) + continue; + + add_gamepad (device); + } } public static LinuxRawGamepadMonitor get_instance () { @@ -31,8 +40,6 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { if (device.get_device_file () == null) return; - var identifier = device.get_device_file (); - if (!is_gamepad (device)) return; @@ -54,18 +61,6 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { } } - private void initial_device_iterator (GUdev.Device device) { - if (device.get_device_file () == null) - return; - - var identifier = device.get_device_file (); - - if (!is_gamepad (device)) - return; - - add_gamepad (device); - } - private RawGamepad? add_gamepad (GUdev.Device device) { var identifier = device.get_device_file (); RawGamepad raw_gamepad; @@ -95,10 +90,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { } private static bool is_gamepad (GUdev.Device device) { - if ((device.has_property ("ID_INPUT_JOYSTICK") && device.get_property ("ID_INPUT_JOYSTICK") == "1") || - (device.has_property (".INPUT_CLASS") && device.get_property (".INPUT_CLASS") == "joystick")) - return true; - else - return false; + return ((device.has_property ("ID_INPUT_JOYSTICK") && device.get_property ("ID_INPUT_JOYSTICK") == "1") || + (device.has_property (".INPUT_CLASS") && device.get_property (".INPUT_CLASS") == "joystick")) } } From acd9adcf5f4d393b939993d9fec93c0e9fa33a50 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 20:05:50 +0530 Subject: [PATCH 39/72] Some cleanup in Mapping --- src/gamepad/mapping.vala | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index 5af02040..8464997f 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -1,12 +1,12 @@ // This file is part of GNOME Games. License: GPLv3 -private class LibGamepad.Dpad : Object { +private class LibGamepad.DPad : Object { public InputType types[4]; public int values[4]; - public int axisval[2]; + public int axis_values[2]; - public Dpad () { - axisval[0] = axisval[1] = 0; + public DPad () { + axis_values[0] = axis_values[1] = 0; types[0] = types[1] = types[2] = types[3] = InputType.INVALID; } } @@ -16,7 +16,7 @@ public class LibGamepad.Mapping : Object { private int[] buttons_value; private InputType[] axes_type; private int[] axes_value; - private Dpad[] dpads; + private DPad[] dpads; public Mapping.from_sdl_string (string? mapping_string) throws MappingError { if (mapping_string == null || mapping_string == "") @@ -46,7 +46,7 @@ public class LibGamepad.Mapping : Object { dpad_position++; } while (dpads.length <= dpad_index) - dpads += new Dpad (); + dpads += new DPad (); dpads[dpad_index].types[dpad_position] = type; dpads[dpad_index].values[dpad_position] = value; @@ -81,10 +81,10 @@ public class LibGamepad.Mapping : Object { int dpad_position; var dpad = dpads[dpad_index]; if (dpad_value == 0) - dpad_position = (dpad.axisval[dpad_axis] + dpad_axis + 4) % 4; + dpad_position = (dpad.axis_values[dpad_axis] + dpad_axis + 4) % 4; else dpad_position = (dpad_value + dpad_axis + 4) % 4; - dpad.axisval[dpad_axis] = dpad_value; + dpad.axis_values[dpad_axis] = dpad_value; event.type = dpad.types[dpad_position]; switch (event.type) { case InputType.AXIS: From d99b062593b6cc773d52d9ed961499a834521c57 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 20:15:07 +0530 Subject: [PATCH 40/72] Remove mapped from gamepad and change code accordingly and some cleanup --- src/gamepad/gamepad-monitor.vala | 28 +++++++++++++++---- src/gamepad/gamepad.vala | 22 ++++----------- .../linux/linux-raw-gamepad-monitor.vala | 2 +- src/gamepad/linux/linux-raw-gamepad.vala | 2 +- src/retro/retro-input-manager.vala | 13 +++------ 5 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index be941065..7c627ed7 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -13,10 +13,12 @@ public class LibGamepad.GamepadMonitor : Object { public signal void gamepad_plugged (Gamepad gamepad); public delegate void GamepadCallback (Gamepad gamepad); + public delegate void RawGamepadCallback (RawGamepad raw_gamepad); private static GamepadMonitor instance; private GenericSet gamepads; + private GenericSet unmapped_raw_gamepads; private GamepadMonitor () { if (gamepads == null) @@ -43,17 +45,31 @@ public class LibGamepad.GamepadMonitor : Object { callback (gamepad); } - private Gamepad add_gamepad (RawGamepad raw_gamepad) { - var gamepad = new Gamepad (raw_gamepad); - gamepads.add (gamepad); - gamepad.unplugged.connect (remove_gamepad); + /** + * This function allows to iterate over all unmapped gamepads + * @param callback The callback + */ + public void foreach_unmapped_gamepad (RawGamepadCallback callback) { + foreach (var raw_gamepad in unmapped_raw_gamepads) + callback (raw_gamepad); + } - return gamepad; + private Gamepad? add_gamepad (RawGamepad raw_gamepad) { + try { + var gamepad = new Gamepad (raw_gamepad); + gamepads.add (gamepad); + gamepad.unplugged.connect (remove_gamepad); + return gamepad; + } catch (MappingError e) { + unmapped_raw_gamepads.add (raw_gamepad); + return null; + } } private void on_raw_gamepad_plugged (RawGamepad raw_gamepad) { var gamepad = add_gamepad (raw_gamepad); - gamepad_plugged (gamepad); + if (gamepad != null) + gamepad_plugged (gamepad); } private void remove_gamepad (Gamepad gamepad) { diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index 538876b1..787c3f41 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -37,32 +37,20 @@ public class LibGamepad.Gamepad : Object { */ public RawGamepad raw_gamepad { get; private set; } - /** - * Whether this gamepad is mapped - */ - public bool mapped { get; private set; } - /** * The mapping object */ public Mapping? mapping { get; private set; } - public Gamepad (RawGamepad raw_gamepad) throws FileError { + public Gamepad (RawGamepad raw_gamepad) throws FileError, MappingError { this.raw_gamepad = raw_gamepad; var guid = raw_gamepad.guid; var mappings_manager = MappingsManager.get_instance (); name = mappings_manager.get_name (guid) ?? raw_gamepad.name; - try { - mapping = new Mapping.from_sdl_string (mappings_manager.get_mapping (guid)); - mapped = true; - raw_gamepad.button_event.connect (on_raw_button_event); - raw_gamepad.axis_event.connect (on_raw_axis_event); - raw_gamepad.dpad_event.connect (on_raw_dpad_event); - } catch (MappingError e) { - debug ("%s - for %s/%s", e.message, guid, name); - mapping = null; - mapped = false; - } + mapping = new Mapping.from_sdl_string (mappings_manager.get_mapping (guid)); + raw_gamepad.button_event.connect (on_raw_button_event); + raw_gamepad.axis_event.connect (on_raw_axis_event); + raw_gamepad.dpad_event.connect (on_raw_dpad_event); raw_gamepad.unplugged.connect (() => unplugged ()); } diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index 1599d806..30ecaeb7 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -91,6 +91,6 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { private static bool is_gamepad (GUdev.Device device) { return ((device.has_property ("ID_INPUT_JOYSTICK") && device.get_property ("ID_INPUT_JOYSTICK") == "1") || - (device.has_property (".INPUT_CLASS") && device.get_property (".INPUT_CLASS") == "joystick")) + (device.has_property (".INPUT_CLASS") && device.get_property (".INPUT_CLASS") == "joystick")); } } diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index f0a30c8c..569e8fa0 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -92,7 +92,7 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { // Get info about axes for (var i = 0; i < Linux.Input.ABS_MAX; i++) { - /* Skip dpads */ + // Skip dpads if (i == Linux.Input.ABS_HAT0X) { i = Linux.Input.ABS_HAT3Y; diff --git a/src/retro/retro-input-manager.vala b/src/retro/retro-input-manager.vala index 0ab1e0a8..69f0af5b 100644 --- a/src/retro/retro-input-manager.vala +++ b/src/retro/retro-input-manager.vala @@ -16,12 +16,10 @@ private class Games.RetroInputManager : Object { input.set_keyboard (new RetroGtk.Keyboard (widget)); gamepad_monitor.foreach_gamepad ((gamepad) => { - if (gamepad.mapped) { - var port = is_port_plugged.length; - is_port_plugged += true; - input.set_controller_device (port, new RetroGamepad (gamepad)); - gamepad.unplugged.connect (() => handle_gamepad_unplugged (port)); - } + var port = is_port_plugged.length; + is_port_plugged += true; + input.set_controller_device (port, new RetroGamepad (gamepad)); + gamepad.unplugged.connect (() => handle_gamepad_unplugged (port)); }); keyboard_port = is_port_plugged.length; @@ -31,9 +29,6 @@ private class Games.RetroInputManager : Object { } private void handle_gamepad_plugged (LibGamepad.Gamepad gamepad) { - if (!gamepad.mapped) - return; - // Plug this gamepad to the port where the keyboard was plugged as a last resort var port = keyboard_port; gamepad.unplugged.connect (() => handle_gamepad_unplugged (port)); From a4c0b92fdd8486338b93883347971755b5987cb0 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 20:22:02 +0530 Subject: [PATCH 41/72] Minor cleanup in LinuxRawGamepad --- src/gamepad/linux/linux-raw-gamepad.vala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index 569e8fa0..49e6bd90 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -127,9 +127,8 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { int code = ev.code; switch (ev.type) { case Linux.Input.EV_KEY: - if (code >= Linux.Input.BTN_MISC) { + if (code >= Linux.Input.BTN_MISC) button_event (key_map[code - Linux.Input.BTN_MISC], (bool) ev.value); - } break; case Linux.Input.EV_ABS: From 3f33a80a05a62d646296c4491d06c64042e839be Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 20:32:13 +0530 Subject: [PATCH 42/72] Merge Helpers into LinuxRawGamepad --- src/Makefile.am | 1 - src/gamepad/helpers.vala | 24 ------------------------ src/gamepad/linux/linux-raw-gamepad.vala | 24 +++++++++++++++++++++++- 3 files changed, 23 insertions(+), 26 deletions(-) delete mode 100644 src/gamepad/helpers.vala diff --git a/src/Makefile.am b/src/Makefile.am index ccf8aaa8..02f77e04 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -59,7 +59,6 @@ gnome_games_SOURCES = \ gamepad/linux/linux-raw-gamepad.vala \ gamepad/gamepad-monitor.vala \ gamepad/gamepad.vala \ - gamepad/helpers.vala \ gamepad/input-type.vala \ gamepad/mapped-event.vala \ gamepad/mapping-error.vala \ diff --git a/src/gamepad/helpers.vala b/src/gamepad/helpers.vala deleted file mode 100644 index 85554fe4..00000000 --- a/src/gamepad/helpers.vala +++ /dev/null @@ -1,24 +0,0 @@ -// This file is part of GNOME Games. License: GPLv3 - -namespace LibGamepad { - private const int GUID_LENGTH = 8; - - private string uint16s_to_hex_string (uint16[] data) - requires (data.length == GUID_LENGTH) - { - const string hex_to_ascii_map = "0123456789abcdef"; - - var builder = new StringBuilder (); - foreach (uint16 el in data) { - uint8 c = (uint8) el; - builder.append_unichar (hex_to_ascii_map[c >> 4]); - builder.append_unichar (hex_to_ascii_map[c & 0x0F]); - - c = (uint8) (el >> 8); - builder.append_unichar (hex_to_ascii_map[c >> 4]); - builder.append_unichar (hex_to_ascii_map[c & 0x0F]); - } - - return builder.str; - } -} diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index 49e6bd90..05e3e137 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -1,6 +1,9 @@ // This file is part of GNOME Games. License: GPLv3 + private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { + private const int GUID_LENGTH = 8; + private int fd; private uint? event_source_id; private Libevdev.Evdev device; @@ -22,7 +25,7 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { public string guid { get { if (_guid == null) { - uint16 guid_array[8]; + uint16 guid_array[GUID_LENGTH]; guid_array[0] = (uint16) device.id_bustype.to_little_endian (); guid_array[1] = 0; guid_array[2] = (uint16) device.id_vendor.to_little_endian (); @@ -164,4 +167,23 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { Source.remove (event_source_id); event_source_id = null; } + + private string uint16s_to_hex_string (uint16[] data) + requires (data.length == GUID_LENGTH) + { + const string hex_to_ascii_map = "0123456789abcdef"; + + var builder = new StringBuilder (); + foreach (uint16 el in data) { + uint8 c = (uint8) el; + builder.append_unichar (hex_to_ascii_map[c >> 4]); + builder.append_unichar (hex_to_ascii_map[c & 0x0F]); + + c = (uint8) (el >> 8); + builder.append_unichar (hex_to_ascii_map[c >> 4]); + builder.append_unichar (hex_to_ascii_map[c & 0x0F]); + } + + return builder.str; + } } From 7af68b1dc00735c6755211154604cf8a69da631a Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 20:37:39 +0530 Subject: [PATCH 43/72] Use brackets in HashTables --- src/gamepad/linux/linux-raw-gamepad-monitor.vala | 4 ++-- src/gamepad/mappings-manager.vala | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index 30ecaeb7..837ade46 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -73,7 +73,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { if (raw_gamepads.contains (identifier)) return null; - raw_gamepads.insert (identifier, raw_gamepad); + raw_gamepads[identifier] = raw_gamepad; return raw_gamepad; } @@ -83,7 +83,7 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { if (!raw_gamepads.contains (identifier)) return null; - var raw_gamepad = raw_gamepads.get (identifier); + var raw_gamepad = raw_gamepads[identifier]; raw_gamepads.remove (identifier); return raw_gamepad; diff --git a/src/gamepad/mappings-manager.vala b/src/gamepad/mappings-manager.vala index 47821c9c..8ee74a41 100644 --- a/src/gamepad/mappings-manager.vala +++ b/src/gamepad/mappings-manager.vala @@ -65,8 +65,8 @@ public class LibGamepad.MappingsManager : Object { if (mappingstr.index_of ("platform") == -1 || mappingstr.index_of ("platform:Linux") != -1) { var split = mappingstr.split (",", 3); - names.replace (split[0], split[1]); - mappings.replace (split[0], split[2]); + names[split[0]] = split[1]; + mappings[split[0]] = split[2]; } } @@ -77,7 +77,7 @@ public class LibGamepad.MappingsManager : Object { * @return The name if present in the database */ public string? get_name (string guid) { - return names.get (guid); + return names[guid]; } @@ -87,6 +87,6 @@ public class LibGamepad.MappingsManager : Object { * @return The mapping if present in the database */ public string? get_mapping (string guid) { - return mappings.get (guid); + return mappings[guid]; } } From 64ae04f3bade56352825c1c822f3cc3b3aab501e Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 20:43:27 +0530 Subject: [PATCH 44/72] Remove emit_event from Gamepad --- src/gamepad/gamepad.vala | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index 787c3f41..9cabf06b 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -56,27 +56,41 @@ public class LibGamepad.Gamepad : Object { private void on_raw_button_event (int button, bool value) { var event = mapping.get_button_mapping (button); - emit_event (event, value ? 1 : 0); + switch (event.type) { + case InputType.AXIS: + axis_event (event.axis, value ? 1 : 0); + + break; + case InputType.BUTTON: + button_event (event.button, value); + + break; + } } private void on_raw_axis_event (int axis, double value) { var event = mapping.get_axis_mapping (axis); - emit_event (event, value); + switch (event.type) { + case InputType.AXIS: + axis_event (event.axis, value); + + break; + case InputType.BUTTON: + button_event (event.button, (bool) value); + + break; + } } private void on_raw_dpad_event (int dpad_index, int axis, int value) { var event = mapping.get_dpad_mapping (dpad_index, axis, value); - emit_event (event, value.abs ()); - } - - private void emit_event (MappedEvent event, double value) { switch (event.type) { case InputType.AXIS: - axis_event (event.axis, value); + axis_event (event.axis, value.abs ()); break; case InputType.BUTTON: - button_event (event.button, (bool) value); + button_event (event.button, (bool) value.abs ()); break; } From 83a39a3fd38756910a8dbcffcce94379fe1a3f74 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 20:44:08 +0530 Subject: [PATCH 45/72] Fix build --- src/gamepad/linux/linux-raw-gamepad.vala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index 05e3e137..e405b235 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -1,9 +1,8 @@ // This file is part of GNOME Games. License: GPLv3 +const int GUID_LENGTH = 8; private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { - private const int GUID_LENGTH = 8; - private int fd; private uint? event_source_id; private Libevdev.Evdev device; From ae0bfee24e196cb18c7a3a06ee2abfd30193c49e Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 21:08:01 +0530 Subject: [PATCH 46/72] Cleanup Mapping --- src/gamepad/mapping.vala | 44 ++++++++++++++++++-------- src/gamepad/standard-gamepad-axis.vala | 5 +++ 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index 8464997f..77cdad32 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -25,19 +25,28 @@ public class LibGamepad.Mapping : Object { var mappings = mapping_string.split (","); foreach (var mapping in mappings) { if (mapping.split (":").length == 2) { - var str = mapping.split (":")[0]; - var real = mapping.split (":")[1]; - var type = map_type (str); + var mapping_key = mapping.split (":")[0]; + var mapping_value = mapping.split (":")[1]; + var type = parse_input_type (mapping_key); if (type == InputType.INVALID) { - if (str != "platform") - debug ("Invalid token : %s", str); + if (mapping_key != "platform") + debug ("Invalid token : %s", mapping_key); continue; } - var value = map_value (str); - switch (real[0]) { + switch (type) { + case InputType.BUTTON: + var value = parse_button (mapping_key); + + break; + case InputType.AXIS: + var value = parse_axis (mapping_key); + + break; + } + switch (mapping_value[0]) { case 'h': - var dpad_parse_array = real[1:real.length].split ("."); + var dpad_parse_array = mapping_value[1:mapping_value.length].split ("."); var dpad_index = int.parse (dpad_parse_array[0]); var dpad_position_2pow = int.parse (dpad_parse_array[1]); int dpad_position = 0; @@ -52,7 +61,7 @@ public class LibGamepad.Mapping : Object { break; case 'b': - var button = int.parse (real[1:real.length]); + var button = int.parse (mapping_value[1:mapping_value.length]); while (buttons_type.length <= button) buttons_type += InputType.INVALID; if (buttons_value.length <= button) @@ -62,7 +71,7 @@ public class LibGamepad.Mapping : Object { break; case 'a': - var axis = int.parse (real[1:real.length]); + var axis = int.parse (mapping_value[1:mapping_value.length]); while (axes_type.length <= axis) axes_type += InputType.INVALID; if (axes_value.length <= axis) @@ -134,8 +143,8 @@ public class LibGamepad.Mapping : Object { return event; } - public static InputType map_type (string str) { - switch (str) { + public static InputType parse_input_type (string mapping_string) { + switch (mapping_string) { case "leftx": case "lefty": case "rightx": @@ -164,8 +173,8 @@ public class LibGamepad.Mapping : Object { } } - public static int map_value (string str) { - switch (str) { + public static StandardGamepadAxis parse_axis (string mapping_string) { + switch (mapping_string) { case "leftx": return StandardGamepadAxis.LEFT_X; case "lefty": @@ -174,6 +183,13 @@ public class LibGamepad.Mapping : Object { return StandardGamepadAxis.RIGHT_X; case "righty": return StandardGamepadAxis.RIGHT_Y; + default: + return StandardGamepadButton.UNKNOWN; + } + } + + public static StandardGamepadButton parse_button (string mapping_string) { + switch (mapping_string) { case "a": return StandardGamepadButton.A; case "b": diff --git a/src/gamepad/standard-gamepad-axis.vala b/src/gamepad/standard-gamepad-axis.vala index 4275ce9c..15806ab0 100644 --- a/src/gamepad/standard-gamepad-axis.vala +++ b/src/gamepad/standard-gamepad-axis.vala @@ -30,4 +30,9 @@ public enum LibGamepad.StandardGamepadAxis { * Negative is up, positive is down. */ RIGHT_Y, + + /** + * An unknown axis + */ + UNKNOWN, } From a51622e68f24dfe2bb46361c337bdb6a2c590805 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 21:12:20 +0530 Subject: [PATCH 47/72] Fix build --- src/gamepad/mapping.vala | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index 77cdad32..2cfbc926 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -34,15 +34,18 @@ public class LibGamepad.Mapping : Object { continue; } + int parsed_value; switch (type) { case InputType.BUTTON: - var value = parse_button (mapping_key); + parsed_value = parse_button (mapping_key); break; case InputType.AXIS: - var value = parse_axis (mapping_key); + parsed_value = parse_axis (mapping_key); break; + default: + continue; } switch (mapping_value[0]) { case 'h': @@ -57,7 +60,7 @@ public class LibGamepad.Mapping : Object { while (dpads.length <= dpad_index) dpads += new DPad (); dpads[dpad_index].types[dpad_position] = type; - dpads[dpad_index].values[dpad_position] = value; + dpads[dpad_index].values[dpad_position] = parsed_value; break; case 'b': @@ -67,7 +70,7 @@ public class LibGamepad.Mapping : Object { if (buttons_value.length <= button) buttons_value.resize (button + 1); buttons_type[button] = type; - buttons_value[button] = value; + buttons_value[button] = parsed_value; break; case 'a': @@ -77,7 +80,7 @@ public class LibGamepad.Mapping : Object { if (axes_value.length <= axis) axes_value.resize (axis + 1); axes_type[axis] = type; - axes_value[axis] = value; + axes_value[axis] = parsed_value; break; } @@ -184,7 +187,7 @@ public class LibGamepad.Mapping : Object { case "righty": return StandardGamepadAxis.RIGHT_Y; default: - return StandardGamepadButton.UNKNOWN; + return StandardGamepadAxis.UNKNOWN; } } From 2ad044362004cc2bed71fbb45ec8d089386ae98b Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 21:22:44 +0530 Subject: [PATCH 48/72] Little cleanup Mapping --- src/gamepad/mapping.vala | 120 ++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 59 deletions(-) diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index 2cfbc926..6b4d37cb 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -24,66 +24,68 @@ public class LibGamepad.Mapping : Object { var mappings = mapping_string.split (","); foreach (var mapping in mappings) { - if (mapping.split (":").length == 2) { - var mapping_key = mapping.split (":")[0]; - var mapping_value = mapping.split (":")[1]; - var type = parse_input_type (mapping_key); - if (type == InputType.INVALID) { - if (mapping_key != "platform") - debug ("Invalid token : %s", mapping_key); - - continue; - } - int parsed_value; - switch (type) { - case InputType.BUTTON: - parsed_value = parse_button (mapping_key); - - break; - case InputType.AXIS: - parsed_value = parse_axis (mapping_key); - - break; - default: - continue; - } - switch (mapping_value[0]) { - case 'h': - var dpad_parse_array = mapping_value[1:mapping_value.length].split ("."); - var dpad_index = int.parse (dpad_parse_array[0]); - var dpad_position_2pow = int.parse (dpad_parse_array[1]); - int dpad_position = 0; - while (dpad_position_2pow > 1) { - dpad_position_2pow >>= 1; - dpad_position++; - } - while (dpads.length <= dpad_index) - dpads += new DPad (); - dpads[dpad_index].types[dpad_position] = type; - dpads[dpad_index].values[dpad_position] = parsed_value; - - break; - case 'b': - var button = int.parse (mapping_value[1:mapping_value.length]); - while (buttons_type.length <= button) - buttons_type += InputType.INVALID; - if (buttons_value.length <= button) - buttons_value.resize (button + 1); - buttons_type[button] = type; - buttons_value[button] = parsed_value; - - break; - case 'a': - var axis = int.parse (mapping_value[1:mapping_value.length]); - while (axes_type.length <= axis) - axes_type += InputType.INVALID; - if (axes_value.length <= axis) - axes_value.resize (axis + 1); - axes_type[axis] = type; - axes_value[axis] = parsed_value; - - break; + var splitted_mapping = mapping.split (":"); + if (splitted_mapping.length != 2) + continue; + + var mapping_key = mapping.split (":")[0]; + var mapping_value = mapping.split (":")[1]; + var type = parse_input_type (mapping_key); + if (type == InputType.INVALID) { + if (mapping_key != "platform") + debug ("Invalid token : %s", mapping_key); + + continue; + } + int parsed_value; + switch (type) { + case InputType.BUTTON: + parsed_value = parse_button (mapping_key); + + break; + case InputType.AXIS: + parsed_value = parse_axis (mapping_key); + + break; + default: + continue; + } + switch (mapping_value[0]) { + case 'h': + var dpad_parse_array = mapping_value[1:mapping_value.length].split ("."); + var dpad_index = int.parse (dpad_parse_array[0]); + var dpad_position_2pow = int.parse (dpad_parse_array[1]); + int dpad_position = 0; + while (dpad_position_2pow > 1) { + dpad_position_2pow >>= 1; + dpad_position++; } + while (dpads.length <= dpad_index) + dpads += new DPad (); + dpads[dpad_index].types[dpad_position] = type; + dpads[dpad_index].values[dpad_position] = parsed_value; + + break; + case 'b': + var button = int.parse (mapping_value[1:mapping_value.length]); + while (buttons_type.length <= button) + buttons_type += InputType.INVALID; + if (buttons_value.length <= button) + buttons_value.resize (button + 1); + buttons_type[button] = type; + buttons_value[button] = parsed_value; + + break; + case 'a': + var axis = int.parse (mapping_value[1:mapping_value.length]); + while (axes_type.length <= axis) + axes_type += InputType.INVALID; + if (axes_value.length <= axis) + axes_value.resize (axis + 1); + axes_type[axis] = type; + axes_value[axis] = parsed_value; + + break; } } } From dba5011ae9b540975cda51920c601129b9b36fbb Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 22:37:07 +0530 Subject: [PATCH 49/72] Remove unmapped_raw_gamepads and similar methods from gamepad-monitors --- src/gamepad/gamepad-monitor.vala | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index 7c627ed7..488ff421 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -18,12 +18,9 @@ public class LibGamepad.GamepadMonitor : Object { private static GamepadMonitor instance; private GenericSet gamepads; - private GenericSet unmapped_raw_gamepads; private GamepadMonitor () { - if (gamepads == null) - gamepads = new GenericSet (direct_hash, direct_equal); - + gamepads = new GenericSet (direct_hash, direct_equal); var raw_gamepad_monitor = LinuxRawGamepadMonitor.get_instance (); raw_gamepad_monitor.gamepad_plugged.connect (on_raw_gamepad_plugged); raw_gamepad_monitor.foreach_gamepad ((raw_gamepad) => add_gamepad (raw_gamepad)); @@ -45,25 +42,17 @@ public class LibGamepad.GamepadMonitor : Object { callback (gamepad); } - /** - * This function allows to iterate over all unmapped gamepads - * @param callback The callback - */ - public void foreach_unmapped_gamepad (RawGamepadCallback callback) { - foreach (var raw_gamepad in unmapped_raw_gamepads) - callback (raw_gamepad); - } - private Gamepad? add_gamepad (RawGamepad raw_gamepad) { + Gamepad gamepad; try { - var gamepad = new Gamepad (raw_gamepad); - gamepads.add (gamepad); - gamepad.unplugged.connect (remove_gamepad); - return gamepad; + gamepad = new Gamepad (raw_gamepad); } catch (MappingError e) { - unmapped_raw_gamepads.add (raw_gamepad); return null; } + + gamepads.add (gamepad); + gamepad.unplugged.connect (remove_gamepad); + return gamepad; } private void on_raw_gamepad_plugged (RawGamepad raw_gamepad) { From 69a1b5ff7cd335155e3e7b2f2ef904a15c8f146a Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 22:41:21 +0530 Subject: [PATCH 50/72] Move callbacks to separate file to avoid duplication --- src/Makefile.am | 1 + src/gamepad/gamepad-callbacks.vala | 6 ++++++ src/gamepad/gamepad-monitor.vala | 3 --- src/gamepad/linux/linux-raw-gamepad-monitor.vala | 2 -- src/gamepad/raw-gamepad-monitor.vala | 2 -- 5 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 src/gamepad/gamepad-callbacks.vala diff --git a/src/Makefile.am b/src/Makefile.am index 02f77e04..0c5c5423 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -57,6 +57,7 @@ gnome_games_SOURCES = \ gamepad/raw-gamepad.vala \ gamepad/linux/linux-raw-gamepad-monitor.vala \ gamepad/linux/linux-raw-gamepad.vala \ + gamepad/gamepad-callbacks.vala \ gamepad/gamepad-monitor.vala \ gamepad/gamepad.vala \ gamepad/input-type.vala \ diff --git a/src/gamepad/gamepad-callbacks.vala b/src/gamepad/gamepad-callbacks.vala new file mode 100644 index 00000000..ffe4672d --- /dev/null +++ b/src/gamepad/gamepad-callbacks.vala @@ -0,0 +1,6 @@ +// This file is part of GNOME Games. License: GPLv3 + +namespace LibGamepad { + public delegate void GamepadCallback (Gamepad gamepad); + public delegate void RawGamepadCallback (RawGamepad raw_gamepad); +} diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index 488ff421..4367b6d2 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -12,9 +12,6 @@ public class LibGamepad.GamepadMonitor : Object { */ public signal void gamepad_plugged (Gamepad gamepad); - public delegate void GamepadCallback (Gamepad gamepad); - public delegate void RawGamepadCallback (RawGamepad raw_gamepad); - private static GamepadMonitor instance; private GenericSet gamepads; diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index 837ade46..cf7db940 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -1,8 +1,6 @@ // This file is part of GNOME Games. License: GPLv3 private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { - public delegate void RawGamepadCallback (RawGamepad raw_gamepad); - private static LinuxRawGamepadMonitor instance; private GUdev.Client client; diff --git a/src/gamepad/raw-gamepad-monitor.vala b/src/gamepad/raw-gamepad-monitor.vala index b4589b46..c26c1115 100644 --- a/src/gamepad/raw-gamepad-monitor.vala +++ b/src/gamepad/raw-gamepad-monitor.vala @@ -10,8 +10,6 @@ public interface LibGamepad.RawGamepadMonitor : Object { */ public abstract signal void gamepad_plugged (RawGamepad raw_gamepad); - public delegate void RawGamepadCallback (RawGamepad raw_gamepad); - /** * This function allows to iterate over all gamepads * @param callback The callback From a022b7786918d66f1bfa98f8648ee3124216ca68 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 22:44:41 +0530 Subject: [PATCH 51/72] Make raw_gamepad of Gamepad private --- src/gamepad/gamepad.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index 9cabf06b..3e3afbaf 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -35,7 +35,7 @@ public class LibGamepad.Gamepad : Object { /** * The raw gamepad behind this gamepad */ - public RawGamepad raw_gamepad { get; private set; } + private RawGamepad raw_gamepad; /** * The mapping object From 6a0b033630dcbf9697ff825b8dc0981fad948201 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 22:46:39 +0530 Subject: [PATCH 52/72] Make mapping of gamepad private --- src/gamepad/gamepad.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index 3e3afbaf..fa9394a4 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -40,7 +40,7 @@ public class LibGamepad.Gamepad : Object { /** * The mapping object */ - public Mapping? mapping { get; private set; } + private Mapping? mapping; public Gamepad (RawGamepad raw_gamepad) throws FileError, MappingError { this.raw_gamepad = raw_gamepad; From f11f593cb48d795486a5341896b343952401897a Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Fri, 15 Jul 2016 22:53:04 +0530 Subject: [PATCH 53/72] Cleanup --- src/gamepad/gamepad-monitor.vala | 7 ++++++- src/gamepad/input-type.vala | 6 +----- src/gamepad/linux/libevdev.vapi | 2 -- src/gamepad/linux/linux-raw-gamepad-monitor.vala | 3 +-- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index 4367b6d2..ab8b8fe9 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -7,7 +7,9 @@ */ public class LibGamepad.GamepadMonitor : Object { /** - * Emitted when a gamepad is plugged in + * Emitted when a gamepad is plugged in. + * This would be emitted once even if RawGamepadMonitor emits it multiple + * times * @param gamepad The gamepad */ public signal void gamepad_plugged (Gamepad gamepad); @@ -49,11 +51,14 @@ public class LibGamepad.GamepadMonitor : Object { gamepads.add (gamepad); gamepad.unplugged.connect (remove_gamepad); + return gamepad; } private void on_raw_gamepad_plugged (RawGamepad raw_gamepad) { var gamepad = add_gamepad (raw_gamepad); + + // To emit only once even if RawGamepadMonitor emits it multiple times if (gamepad != null) gamepad_plugged (gamepad); } diff --git a/src/gamepad/input-type.vala b/src/gamepad/input-type.vala index d6de52c8..e74c5d5a 100644 --- a/src/gamepad/input-type.vala +++ b/src/gamepad/input-type.vala @@ -3,9 +3,5 @@ public enum LibGamepad.InputType { AXIS, BUTTON, - INVALID; - - public static uint length () { - return InputType.INVALID + 1; - } + INVALID, } diff --git a/src/gamepad/linux/libevdev.vapi b/src/gamepad/linux/libevdev.vapi index 2419f8f8..4c042a17 100644 --- a/src/gamepad/linux/libevdev.vapi +++ b/src/gamepad/linux/libevdev.vapi @@ -2,7 +2,6 @@ [CCode (cheader_filename = "libevdev/libevdev.h")] namespace Libevdev { - [CCode (cname = "libevdev_read_flag", cprefix = "LIBEVDEV_READ_FLAG_", has_type_id = false)] [Flags] public enum ReadFlag { @@ -35,5 +34,4 @@ namespace Libevdev { public static unowned string event_code_get_name(uint type, uint code); } - } diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index cf7db940..3f95d818 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -50,10 +50,9 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { break; case "remove": var raw_gamepad = remove_gamepad (device); - if (raw_gamepad != null) { + if (raw_gamepad != null) // This signal is emitted from here to simplify the code raw_gamepad.unplugged (); - } break; } From c4a6ca02132381e87615ee9c4cbcd19b9ed975ad Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Sat, 16 Jul 2016 11:48:34 +0530 Subject: [PATCH 54/72] Add oneline FIXME comment about constant in linux-raw-gamepad --- src/gamepad/linux/linux-raw-gamepad.vala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index e405b235..d406ac78 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -1,5 +1,6 @@ // This file is part of GNOME Games. License: GPLv3 +// FIXME This should be in LinuxRawGamepad but a bug in valac prevent us from using it in 'requires' statements. const int GUID_LENGTH = 8; private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { From 3939534d23778212b7d1be3bf9d9f2e4732f554e Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Sat, 16 Jul 2016 11:56:38 +0530 Subject: [PATCH 55/72] Revamp RawGamepad and remove properties --- src/gamepad/gamepad.vala | 2 +- src/gamepad/linux/linux-raw-gamepad.vala | 48 +++++------------------- src/gamepad/raw-gamepad.vala | 16 -------- 3 files changed, 10 insertions(+), 56 deletions(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index fa9394a4..7496429f 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -46,7 +46,7 @@ public class LibGamepad.Gamepad : Object { this.raw_gamepad = raw_gamepad; var guid = raw_gamepad.guid; var mappings_manager = MappingsManager.get_instance (); - name = mappings_manager.get_name (guid) ?? raw_gamepad.name; + name = mappings_manager.get_name (guid); mapping = new Mapping.from_sdl_string (mappings_manager.get_mapping (guid)); raw_gamepad.button_event.connect (on_raw_button_event); raw_gamepad.axis_event.connect (on_raw_axis_event); diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index d406ac78..13f862b7 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -11,15 +11,6 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { private uint8 key_map[Linux.Input.KEY_MAX]; private uint8 abs_map[Linux.Input.ABS_MAX]; private Linux.Input.AbsInfo abs_info[Linux.Input.ABS_MAX]; - private string identifier; - public string name { get { return device.name; } } - - private uint8 _axes_number = 0; - public uint8 axes_number { get { return _axes_number; } } - - private uint8 _buttons_number = 0; - public uint8 buttons_number { get { return _buttons_number; } } - private string _guid; public string guid { @@ -41,30 +32,7 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { } } - private int _dpads_number = -1; - public uint8 dpads_number { - get { - if (_dpads_number != -1) - return (uint8) _dpads_number; - - _dpads_number = 0; - for (var i = Linux.Input.ABS_HAT0X; i <= Linux.Input.ABS_HAT3Y; i += 2) { - if (device.has_event_code (Linux.Input.EV_ABS, i) || - device.has_event_code (Linux.Input.EV_ABS, i + 1)) { - var absinfo = device.get_abs_info (i); - if (absinfo == null) - continue; - - _dpads_number++; - } - } - - return (uint8) _dpads_number; - } - } - public LinuxRawGamepad (string file_name) throws FileError { - identifier = file_name; fd = Posix.open (file_name, Posix.O_RDONLY | Posix.O_NONBLOCK); if (fd < 0) @@ -79,21 +47,23 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { event_source_id = channel.add_watch (IOCondition.IN, poll_events); // Initialize dpads, buttons and axes + var buttons_number = 0; for (var i = Linux.Input.BTN_JOYSTICK; i < Linux.Input.KEY_MAX; i++) { if (device.has_event_code (Linux.Input.EV_KEY, i)) { - key_map[i - Linux.Input.BTN_MISC] = _buttons_number; - _buttons_number++; + key_map[i - Linux.Input.BTN_MISC] = buttons_number; + buttons_number++; } } for (var i = Linux.Input.BTN_MISC; i < Linux.Input.BTN_JOYSTICK; i++) { if (device.has_event_code (Linux.Input.EV_KEY, i)) { - key_map[i - Linux.Input.BTN_MISC] = _buttons_number; - _buttons_number++; + key_map[i - Linux.Input.BTN_MISC] = buttons_number; + buttons_number++; } } // Get info about axes + var axes_number = 0; for (var i = 0; i < Linux.Input.ABS_MAX; i++) { // Skip dpads if (i == Linux.Input.ABS_HAT0X) { @@ -103,9 +73,9 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { } if (device.has_event_code (Linux.Input.EV_ABS, i)) { var absinfo = device.get_abs_info (i); - abs_map[i] = _axes_number; - abs_info[_axes_number] = absinfo; - _axes_number++; + abs_map[i] = axes_number; + abs_info[axes_number] = absinfo; + axes_number++; } } } diff --git a/src/gamepad/raw-gamepad.vala b/src/gamepad/raw-gamepad.vala index 2f0fc9a2..564d7f7d 100644 --- a/src/gamepad/raw-gamepad.vala +++ b/src/gamepad/raw-gamepad.vala @@ -35,21 +35,5 @@ public interface LibGamepad.RawGamepad : Object { */ public abstract signal void unplugged (); - public abstract string name { get; } public abstract string guid { get; } - - /** - * Number of axes of the gamepad - */ - public abstract uint8 axes_number { get; } - - /** - * Number of buttons of the gamepad - */ - public abstract uint8 buttons_number { get; } - - /** - * Number of dpads of the gamepad` - */ - public abstract uint8 dpads_number { get; } } From 4dd63944905da01d8d4669af26b0d3acbc6738a0 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Sat, 16 Jul 2016 12:00:49 +0530 Subject: [PATCH 56/72] Simplify handle_evdev_callback in linux-raw-gamepad --- src/gamepad/linux/linux-raw-gamepad.vala | 59 ++++++++++++------------ 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/gamepad/linux/linux-raw-gamepad.vala b/src/gamepad/linux/linux-raw-gamepad.vala index 13f862b7..5afe0267 100644 --- a/src/gamepad/linux/linux-raw-gamepad.vala +++ b/src/gamepad/linux/linux-raw-gamepad.vala @@ -93,40 +93,41 @@ private class LibGamepad.LinuxRawGamepad : Object, RawGamepad { } private void handle_evdev_event () { - int rc; - Linux.Input.Event ev; - rc = device.next_event (Libevdev.ReadFlag.NORMAL, out ev); - if (rc == 0) { - int code = ev.code; - switch (ev.type) { - case Linux.Input.EV_KEY: - if (code >= Linux.Input.BTN_MISC) - button_event (key_map[code - Linux.Input.BTN_MISC], (bool) ev.value); + Linux.Input.Event event; + if (device.next_event (Libevdev.ReadFlag.NORMAL, out event) != 0) + return; + + // We need to typecast this to int as the Linux Input API VAPI presents them as ints + // while libevdev represents them as uints + int code = event.code; + switch (event.type) { + case Linux.Input.EV_KEY: + if (code >= Linux.Input.BTN_MISC) + button_event (key_map[code - Linux.Input.BTN_MISC], (bool) event.value); + + break; + case Linux.Input.EV_ABS: + switch (code) { + case Linux.Input.ABS_HAT0X: + case Linux.Input.ABS_HAT0Y: + case Linux.Input.ABS_HAT1X: + case Linux.Input.ABS_HAT1Y: + case Linux.Input.ABS_HAT2X: + case Linux.Input.ABS_HAT2Y: + case Linux.Input.ABS_HAT3X: + case Linux.Input.ABS_HAT3Y: + code -= Linux.Input.ABS_HAT0X; + dpad_event (code / 2, code % 2, event.value); break; - case Linux.Input.EV_ABS: - switch (code) { - case Linux.Input.ABS_HAT0X: - case Linux.Input.ABS_HAT0Y: - case Linux.Input.ABS_HAT1X: - case Linux.Input.ABS_HAT1Y: - case Linux.Input.ABS_HAT2X: - case Linux.Input.ABS_HAT2Y: - case Linux.Input.ABS_HAT3X: - case Linux.Input.ABS_HAT3Y: - code -= Linux.Input.ABS_HAT0X; - dpad_event (code / 2, code % 2, ev.value); - - break; - default: - var axis = abs_map[code]; - axis_event (axis, (double) ev.value / abs_info[axis].maximum); - - break; - } + default: + var axis = abs_map[code]; + axis_event (axis, (double) event.value / abs_info[axis].maximum); break; } + + break; } } From 727b99a312834f4c73f4847880c3193307d7d2c0 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Sat, 16 Jul 2016 13:25:35 +0530 Subject: [PATCH 57/72] Hide name in Gamepad --- src/gamepad/gamepad.vala | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index 7496429f..de665987 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -27,11 +27,6 @@ public class LibGamepad.Gamepad : Object { public signal void unplugged (); - /** - * The name present in our database - */ - public string? name { get; private set; } - /** * The raw gamepad behind this gamepad */ @@ -46,7 +41,6 @@ public class LibGamepad.Gamepad : Object { this.raw_gamepad = raw_gamepad; var guid = raw_gamepad.guid; var mappings_manager = MappingsManager.get_instance (); - name = mappings_manager.get_name (guid); mapping = new Mapping.from_sdl_string (mappings_manager.get_mapping (guid)); raw_gamepad.button_event.connect (on_raw_button_event); raw_gamepad.axis_event.connect (on_raw_axis_event); From 56dde717fc56c9f5f189cbbfad68fae6932761ad Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Sat, 16 Jul 2016 13:26:14 +0530 Subject: [PATCH 58/72] Add trailing comma in mapping-error --- src/gamepad/mapping-error.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gamepad/mapping-error.vala b/src/gamepad/mapping-error.vala index cf4ac218..8e050ca4 100644 --- a/src/gamepad/mapping-error.vala +++ b/src/gamepad/mapping-error.vala @@ -1,5 +1,5 @@ // This file is part of GNOME Games. License: GPLv3 public errordomain LibGamepad.MappingError { - NOT_A_MAPPING + NOT_A_MAPPING, } From 6b1e3bd41b150a28ea466eedd274f7a42147983c Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Sat, 16 Jul 2016 13:27:35 +0530 Subject: [PATCH 59/72] Move dpad to its own file --- src/Makefile.am | 1 + src/gamepad/dpad.vala | 0 src/gamepad/mapping.vala | 11 ----------- 3 files changed, 1 insertion(+), 11 deletions(-) create mode 100644 src/gamepad/dpad.vala diff --git a/src/Makefile.am b/src/Makefile.am index 0c5c5423..c211ccc7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -53,6 +53,7 @@ gnome_games_SOURCES = \ dummy/dummy-icon.vala \ dummy/dummy-runner.vala \ \ + gamepad/dpad.vala \ gamepad/raw-gamepad-monitor.vala \ gamepad/raw-gamepad.vala \ gamepad/linux/linux-raw-gamepad-monitor.vala \ diff --git a/src/gamepad/dpad.vala b/src/gamepad/dpad.vala new file mode 100644 index 00000000..e69de29b diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index 6b4d37cb..f1bb7991 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -1,16 +1,5 @@ // This file is part of GNOME Games. License: GPLv3 -private class LibGamepad.DPad : Object { - public InputType types[4]; - public int values[4]; - public int axis_values[2]; - - public DPad () { - axis_values[0] = axis_values[1] = 0; - types[0] = types[1] = types[2] = types[3] = InputType.INVALID; - } -} - public class LibGamepad.Mapping : Object { private InputType[] buttons_type; private int[] buttons_value; From 041553201fa15eecebac133b32d4de0b644fdb32 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Sat, 16 Jul 2016 13:29:10 +0530 Subject: [PATCH 60/72] Throw different error message for null and empty string --- src/gamepad/mapping.vala | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index f1bb7991..ebb044de 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -8,8 +8,11 @@ public class LibGamepad.Mapping : Object { private DPad[] dpads; public Mapping.from_sdl_string (string? mapping_string) throws MappingError { - if (mapping_string == null || mapping_string == "") - throw new MappingError.NOT_A_MAPPING ("The mapping string can't be null nor empty."); + if (mapping_string == null) + throw new MappingError.NOT_A_MAPPING ("The mapping string can't be null."); + + if (mapping_string == "") + throw new MappingError.NOT_A_MAPPING ("The mapping string can't be empty."); var mappings = mapping_string.split (","); foreach (var mapping in mappings) { From 1013c033fb168238b852ca789cc64b695c5cce37 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Sat, 16 Jul 2016 13:37:09 +0530 Subject: [PATCH 61/72] Split constructor of Mapping into some functions --- src/gamepad/mapping.vala | 71 ++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index ebb044de..5e20cf98 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -29,53 +29,31 @@ public class LibGamepad.Mapping : Object { continue; } - int parsed_value; + int parsed_key; switch (type) { case InputType.BUTTON: - parsed_value = parse_button (mapping_key); + parsed_key = parse_button (mapping_key); break; case InputType.AXIS: - parsed_value = parse_axis (mapping_key); + parsed_key = parse_axis (mapping_key); break; default: continue; } + switch (mapping_value[0]) { case 'h': - var dpad_parse_array = mapping_value[1:mapping_value.length].split ("."); - var dpad_index = int.parse (dpad_parse_array[0]); - var dpad_position_2pow = int.parse (dpad_parse_array[1]); - int dpad_position = 0; - while (dpad_position_2pow > 1) { - dpad_position_2pow >>= 1; - dpad_position++; - } - while (dpads.length <= dpad_index) - dpads += new DPad (); - dpads[dpad_index].types[dpad_position] = type; - dpads[dpad_index].values[dpad_position] = parsed_value; + parse_dpad_value (mapping_value, parsed_key); break; case 'b': - var button = int.parse (mapping_value[1:mapping_value.length]); - while (buttons_type.length <= button) - buttons_type += InputType.INVALID; - if (buttons_value.length <= button) - buttons_value.resize (button + 1); - buttons_type[button] = type; - buttons_value[button] = parsed_value; + parse_button_value (mapping_value, parsed_key); break; case 'a': - var axis = int.parse (mapping_value[1:mapping_value.length]); - while (axes_type.length <= axis) - axes_type += InputType.INVALID; - if (axes_value.length <= axis) - axes_value.resize (axis + 1); - axes_type[axis] = type; - axes_value[axis] = parsed_value; + parse_axis_value (mapping_value, parsed_key); break; } @@ -140,6 +118,41 @@ public class LibGamepad.Mapping : Object { return event; } + private void parse_dpad_value (string mapping_value, int parsed_key) { + var dpad_parse_array = mapping_value[1:mapping_value.length].split ("."); + var dpad_index = int.parse (dpad_parse_array[0]); + var dpad_position_2pow = int.parse (dpad_parse_array[1]); + int dpad_position = 0; + while (dpad_position_2pow > 1) { + dpad_position_2pow >>= 1; + dpad_position++; + } + while (dpads.length <= dpad_index) + dpads += new DPad (); + dpads[dpad_index].types[dpad_position] = type; + dpads[dpad_index].values[dpad_position] = parsed_key; + } + + private void parse_button_value (string mapping_value, int parsed_key) { + var button = int.parse (mapping_value[1:mapping_value.length]); + while (buttons_type.length <= button) + buttons_type += InputType.INVALID; + if (buttons_value.length <= button) + buttons_value.resize (button + 1); + buttons_type[button] = type; + buttons_value[button] = parsed_key; + } + + private void parse_axis_value (string mapping_value, int parsed_key) { + var axis = int.parse (mapping_value[1:mapping_value.length]); + while (axes_type.length <= axis) + axes_type += InputType.INVALID; + if (axes_value.length <= axis) + axes_value.resize (axis + 1); + axes_type[axis] = type; + axes_value[axis] = parsed_key; + } + public static InputType parse_input_type (string mapping_string) { switch (mapping_string) { case "leftx": From b5341dfc5166802d10885d389d7591cc8a63fce1 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 18 Jul 2016 14:31:53 +0530 Subject: [PATCH 62/72] Fix mapping build and a little cleanup --- src/gamepad/dpad.vala | 12 ++++++++++++ src/gamepad/mapping.vala | 20 +++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/gamepad/dpad.vala b/src/gamepad/dpad.vala index e69de29b..1a18a866 100644 --- a/src/gamepad/dpad.vala +++ b/src/gamepad/dpad.vala @@ -0,0 +1,12 @@ +// This file is part of GNOME Games. License: GPLv3 + +private class LibGamepad.DPad : Object { + public InputType types[4]; + public int values[4]; + public int axis_values[2]; + + public DPad () { + axis_values[0] = axis_values[1] = 0; + types[0] = types[1] = types[2] = types[3] = InputType.INVALID; + } +} diff --git a/src/gamepad/mapping.vala b/src/gamepad/mapping.vala index 5e20cf98..42e23c39 100644 --- a/src/gamepad/mapping.vala +++ b/src/gamepad/mapping.vala @@ -45,15 +45,15 @@ public class LibGamepad.Mapping : Object { switch (mapping_value[0]) { case 'h': - parse_dpad_value (mapping_value, parsed_key); + parse_dpad_value (mapping_value, type, parsed_key); break; case 'b': - parse_button_value (mapping_value, parsed_key); + parse_button_value (mapping_value, type, parsed_key); break; case 'a': - parse_axis_value (mapping_value, parsed_key); + parse_axis_value (mapping_value, type, parsed_key); break; } @@ -62,12 +62,10 @@ public class LibGamepad.Mapping : Object { public MappedEvent get_dpad_mapping (int dpad_index, int dpad_axis, int dpad_value) { var event = MappedEvent (); - int dpad_position; var dpad = dpads[dpad_index]; - if (dpad_value == 0) - dpad_position = (dpad.axis_values[dpad_axis] + dpad_axis + 4) % 4; - else - dpad_position = (dpad_value + dpad_axis + 4) % 4; + var dpad_changed_value = dpad_value == 0 ? dpad.axis_values[dpad_axis] : dpad_value; + // We add 4 so that the remainder is always positive. + int dpad_position = (dpad_changed_value + dpad_axis + 4) % 4; dpad.axis_values[dpad_axis] = dpad_value; event.type = dpad.types[dpad_position]; switch (event.type) { @@ -118,7 +116,7 @@ public class LibGamepad.Mapping : Object { return event; } - private void parse_dpad_value (string mapping_value, int parsed_key) { + private void parse_dpad_value (string mapping_value, InputType type, int parsed_key) { var dpad_parse_array = mapping_value[1:mapping_value.length].split ("."); var dpad_index = int.parse (dpad_parse_array[0]); var dpad_position_2pow = int.parse (dpad_parse_array[1]); @@ -133,7 +131,7 @@ public class LibGamepad.Mapping : Object { dpads[dpad_index].values[dpad_position] = parsed_key; } - private void parse_button_value (string mapping_value, int parsed_key) { + private void parse_button_value (string mapping_value, InputType type, int parsed_key) { var button = int.parse (mapping_value[1:mapping_value.length]); while (buttons_type.length <= button) buttons_type += InputType.INVALID; @@ -143,7 +141,7 @@ public class LibGamepad.Mapping : Object { buttons_value[button] = parsed_key; } - private void parse_axis_value (string mapping_value, int parsed_key) { + private void parse_axis_value (string mapping_value, InputType type, int parsed_key) { var axis = int.parse (mapping_value[1:mapping_value.length]); while (axes_type.length <= axis) axes_type += InputType.INVALID; From b4a633b8b9928a00dd665507d4c289f8b2b49bf3 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 18 Jul 2016 14:33:22 +0530 Subject: [PATCH 63/72] Use GTK Widget instead of EventBox in RetroInputManager --- src/retro/retro-input-manager.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/retro/retro-input-manager.vala b/src/retro/retro-input-manager.vala index 69f0af5b..605b3729 100644 --- a/src/retro/retro-input-manager.vala +++ b/src/retro/retro-input-manager.vala @@ -8,7 +8,7 @@ private class Games.RetroInputManager : Object { private bool[] is_port_plugged; private int keyboard_port; - public RetroInputManager (Gtk.EventBox widget) { + public RetroInputManager (Gtk.Widget widget) { input = new RetroGtk.InputDeviceManager (); keyboard = new RetroGtk.VirtualGamepad (widget); gamepad_monitor = LibGamepad.GamepadMonitor.get_instance (); From 9b79570da92118887d90662adc451e60f661c1ce Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 18 Jul 2016 14:36:33 +0530 Subject: [PATCH 64/72] Shift UNKNOWN in standard gamepad enums to value 0 so that it can be compared to false --- src/gamepad/standard-gamepad-axis.vala | 10 +++++----- src/gamepad/standard-gamepad-button.vala | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/gamepad/standard-gamepad-axis.vala b/src/gamepad/standard-gamepad-axis.vala index 15806ab0..6ba8a0e1 100644 --- a/src/gamepad/standard-gamepad-axis.vala +++ b/src/gamepad/standard-gamepad-axis.vala @@ -3,6 +3,11 @@ // This file is part of GNOME Games. License: GPLv3 public enum LibGamepad.StandardGamepadAxis { + /** + * An unknown axis + */ + UNKNOWN, + /** * The horizontal axis of the left stick. * @@ -30,9 +35,4 @@ public enum LibGamepad.StandardGamepadAxis { * Negative is up, positive is down. */ RIGHT_Y, - - /** - * An unknown axis - */ - UNKNOWN, } diff --git a/src/gamepad/standard-gamepad-button.vala b/src/gamepad/standard-gamepad-button.vala index 1cec6c85..58255608 100644 --- a/src/gamepad/standard-gamepad-button.vala +++ b/src/gamepad/standard-gamepad-button.vala @@ -3,6 +3,11 @@ // This file is part of GNOME Games. License: GPLv3 public enum LibGamepad.StandardGamepadButton { + /** + * An unknown button + */ + UNKNOWN, + /** * The button at the bottom of the action pad. */ @@ -87,9 +92,4 @@ public enum LibGamepad.StandardGamepadButton { * The button at the center of the menu pad. */ HOME, - - /** - * An unknown button - */ - UNKNOWN, } From 0025669ba123402c6b2b2cfd16b5f9c90c1695bc Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 18 Jul 2016 14:37:38 +0530 Subject: [PATCH 65/72] Fix else styling --- src/retro/retro-input-manager.vala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/retro/retro-input-manager.vala b/src/retro/retro-input-manager.vala index 605b3729..fcb6b47a 100644 --- a/src/retro/retro-input-manager.vala +++ b/src/retro/retro-input-manager.vala @@ -59,7 +59,8 @@ private class Games.RetroInputManager : Object { input.remove_controller_device (keyboard_port); keyboard_port = port; input.set_controller_device (keyboard_port, keyboard); - } else { + } + else { // Just remove the controller as no need to shift keyboard is_port_plugged[port] = false; input.remove_controller_device (port); From 07cd128b69efcc06f602c6034089678fe8df3f45 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 18 Jul 2016 16:06:17 +0530 Subject: [PATCH 66/72] Remove some useless comments --- src/gamepad/gamepad.vala | 6 ------ src/gamepad/mappings-manager.vala | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index de665987..3665bc0f 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -27,14 +27,8 @@ public class LibGamepad.Gamepad : Object { public signal void unplugged (); - /** - * The raw gamepad behind this gamepad - */ private RawGamepad raw_gamepad; - /** - * The mapping object - */ private Mapping? mapping; public Gamepad (RawGamepad raw_gamepad) throws FileError, MappingError { diff --git a/src/gamepad/mappings-manager.vala b/src/gamepad/mappings-manager.vala index 8ee74a41..8a207b1a 100644 --- a/src/gamepad/mappings-manager.vala +++ b/src/gamepad/mappings-manager.vala @@ -57,7 +57,7 @@ public class LibGamepad.MappingsManager : Object { /** - * Adds a mapping from a string (only one gamepad) + * Adds a mapping from a SDL2 mapping string (only one gamepad) */ public void add_mapping (string mappingstr) { if (mappingstr == "" || mappingstr[0] == '#') From 5d29dfa56788ac84e408e989bc2c489e126f1bd5 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 18 Jul 2016 16:10:32 +0530 Subject: [PATCH 67/72] Remove some more comments --- src/gamepad/mappings-manager.vala | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/gamepad/mappings-manager.vala b/src/gamepad/mappings-manager.vala index 8a207b1a..990baae8 100644 --- a/src/gamepad/mappings-manager.vala +++ b/src/gamepad/mappings-manager.vala @@ -25,27 +25,15 @@ public class LibGamepad.MappingsManager : Object { return instance; } - /** - * Adds mappings from a file - * @param file_name The file name - */ public void add_from_file (string file_name) throws IOError { var file = File.new_for_path (file_name); add_from_input_stream (file.read ()); } - /** - * Adds mappings from a resource path - * @param path The path - */ public void add_from_resource (string path) throws IOError { add_from_input_stream (resources_open_stream (path, ResourceLookupFlags.NONE)); } - /** - * Adds mappings from an InputStream - * @param input_stream The input stream - */ public void add_from_input_stream (InputStream input_stream) { var data_stream = new DataInputStream (input_stream); var mappingstr = data_stream.read_line (); From 32a75188f6a3a873a3754588bf5b5d740396684d Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 18 Jul 2016 16:41:13 +0530 Subject: [PATCH 68/72] Remove some comments --- src/gamepad/gamepad-monitor.vala | 4 ---- src/gamepad/standard-gamepad-axis.vala | 3 --- src/gamepad/standard-gamepad-button.vala | 3 --- 3 files changed, 10 deletions(-) diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index ab8b8fe9..5f513f42 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -32,10 +32,6 @@ public class LibGamepad.GamepadMonitor : Object { return instance; } - /** - * This function allows to iterate over all gamepads - * @param callback The callback - */ public void foreach_gamepad (GamepadCallback callback) { foreach (var gamepad in gamepads) callback (gamepad); diff --git a/src/gamepad/standard-gamepad-axis.vala b/src/gamepad/standard-gamepad-axis.vala index 6ba8a0e1..5c5e3c1b 100644 --- a/src/gamepad/standard-gamepad-axis.vala +++ b/src/gamepad/standard-gamepad-axis.vala @@ -3,9 +3,6 @@ // This file is part of GNOME Games. License: GPLv3 public enum LibGamepad.StandardGamepadAxis { - /** - * An unknown axis - */ UNKNOWN, /** diff --git a/src/gamepad/standard-gamepad-button.vala b/src/gamepad/standard-gamepad-button.vala index 58255608..b752542b 100644 --- a/src/gamepad/standard-gamepad-button.vala +++ b/src/gamepad/standard-gamepad-button.vala @@ -3,9 +3,6 @@ // This file is part of GNOME Games. License: GPLv3 public enum LibGamepad.StandardGamepadButton { - /** - * An unknown button - */ UNKNOWN, /** From 4edce35be4e77b98dfac75e996d1e8428f417e92 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 18 Jul 2016 16:44:01 +0530 Subject: [PATCH 69/72] Fix catch on new line --- plugins/desktop/src/desktop-tracker-query.vala | 3 ++- src/gamepad/gamepad-monitor.vala | 3 ++- src/gamepad/gamepad.vala | 2 -- src/gamepad/linux/linux-raw-gamepad-monitor.vala | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/plugins/desktop/src/desktop-tracker-query.vala b/plugins/desktop/src/desktop-tracker-query.vala index 7a013073..e50d9381 100644 --- a/plugins/desktop/src/desktop-tracker-query.vala +++ b/plugins/desktop/src/desktop-tracker-query.vala @@ -14,7 +14,8 @@ private class Games.DesktopTrackerQuery : Object, TrackerQuery { public bool is_uri_valid (string uri) { try { check_uri (uri); - } catch (Error e) { + } + catch (Error e) { return false; } diff --git a/src/gamepad/gamepad-monitor.vala b/src/gamepad/gamepad-monitor.vala index 5f513f42..2ecc0944 100644 --- a/src/gamepad/gamepad-monitor.vala +++ b/src/gamepad/gamepad-monitor.vala @@ -41,7 +41,8 @@ public class LibGamepad.GamepadMonitor : Object { Gamepad gamepad; try { gamepad = new Gamepad (raw_gamepad); - } catch (MappingError e) { + } + catch (MappingError e) { return null; } diff --git a/src/gamepad/gamepad.vala b/src/gamepad/gamepad.vala index 3665bc0f..e0e47b00 100644 --- a/src/gamepad/gamepad.vala +++ b/src/gamepad/gamepad.vala @@ -26,9 +26,7 @@ public class LibGamepad.Gamepad : Object { */ public signal void unplugged (); - private RawGamepad raw_gamepad; - private Mapping? mapping; public Gamepad (RawGamepad raw_gamepad) throws FileError, MappingError { diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor.vala b/src/gamepad/linux/linux-raw-gamepad-monitor.vala index 3f95d818..504ccf67 100644 --- a/src/gamepad/linux/linux-raw-gamepad-monitor.vala +++ b/src/gamepad/linux/linux-raw-gamepad-monitor.vala @@ -63,7 +63,8 @@ private class LibGamepad.LinuxRawGamepadMonitor : Object, RawGamepadMonitor { RawGamepad raw_gamepad; try { raw_gamepad = new LinuxRawGamepad (identifier); - } catch (FileError e) { + } + catch (FileError e) { return null; } From c35028e5836b9c0bcf44c6911443e37e359306b6 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 18 Jul 2016 16:45:48 +0530 Subject: [PATCH 70/72] mappingstr to mapping_string --- src/gamepad/mappings-manager.vala | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/gamepad/mappings-manager.vala b/src/gamepad/mappings-manager.vala index 990baae8..6ff32a08 100644 --- a/src/gamepad/mappings-manager.vala +++ b/src/gamepad/mappings-manager.vala @@ -36,10 +36,10 @@ public class LibGamepad.MappingsManager : Object { public void add_from_input_stream (InputStream input_stream) { var data_stream = new DataInputStream (input_stream); - var mappingstr = data_stream.read_line (); - while (mappingstr != null) { - add_mapping (mappingstr); - mappingstr = data_stream.read_line (); + var mapping_string = data_stream.read_line (); + while (mapping_string != null) { + add_mapping (mapping_string); + mapping_string = data_stream.read_line (); } } @@ -47,12 +47,12 @@ public class LibGamepad.MappingsManager : Object { /** * Adds a mapping from a SDL2 mapping string (only one gamepad) */ - public void add_mapping (string mappingstr) { - if (mappingstr == "" || mappingstr[0] == '#') + public void add_mapping (string mapping_string) { + if (mapping_string == "" || mapping_string[0] == '#') return; - if (mappingstr.index_of ("platform") == -1 || mappingstr.index_of ("platform:Linux") != -1) { - var split = mappingstr.split (",", 3); + if (mapping_string.index_of ("platform") == -1 || mapping_string.index_of ("platform:Linux") != -1) { + var split = mapping_string.split (",", 3); names[split[0]] = split[1]; mappings[split[0]] = split[2]; } From 5a12b7e237bcd7a6ece5c1ee6245982fff8cefcb Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 18 Jul 2016 16:48:15 +0530 Subject: [PATCH 71/72] Remove the dpad comments since they are obvious --- src/gamepad/standard-gamepad-button.vala | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/gamepad/standard-gamepad-button.vala b/src/gamepad/standard-gamepad-button.vala index b752542b..c8a2b0cf 100644 --- a/src/gamepad/standard-gamepad-button.vala +++ b/src/gamepad/standard-gamepad-button.vala @@ -65,24 +65,9 @@ public enum LibGamepad.StandardGamepadButton { */ STICK_R, - /** - * The button at the top of the directional pad. - */ DPAD_UP, - - /** - * The button at the bottom of the directional pad. - */ DPAD_DOWN, - - /** - * The button at the left of the directional pad. - */ DPAD_LEFT, - - /** - * The button at the right of the directional pad. - */ DPAD_RIGHT, /** From 6187d6db6fefb5a655923e5a47b1ba5cd11575e6 Mon Sep 17 00:00:00 2001 From: Megh Parikh Date: Mon, 18 Jul 2016 17:05:44 +0530 Subject: [PATCH 72/72] Update controller db --- data/gamepads/gamecontrollerdb.txt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/data/gamepads/gamecontrollerdb.txt b/data/gamepads/gamecontrollerdb.txt index c29ef162..86ca7a12 100644 --- a/data/gamepads/gamecontrollerdb.txt +++ b/data/gamepads/gamecontrollerdb.txt @@ -1,8 +1,11 @@ +# Source: https://github.com/gabomdq/SDL_GameControllerDB + # 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, +0d0f6e00000000000000504944564944,HORIPAD 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:a3,lefttrigger:b6,righttrigger:b7,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, @@ -29,10 +32,10 @@ a3060cff000000000000504944564944,Saitek P2500,a:b2,b:b3,y:b1,x:b0,start:b4,guide 49190204000000000000504944564944,Ipega PG-9023,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,platform:Windows, 4f0423b3000000000000504944564944,Dual Trigger 3-in-1,a:b1,b:b2,x:b0,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:a5,lefttrigger:b6,righttrigger:b7,platform:Windows, 0d0f4900000000000000504944564944,Hatsune Miku Sho Controller,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:Windows, -9000318000000000000504944564944,Mayflash Wiimote PC Adapter,platform:Windows,a:b2,b:h0.4,x:b0,y:b1,back:b4,start:b5,guide:b11,leftshoulder:b6,rightshoulder:b3,leftx:a0,lefty:a1, 79004318000000000000504944564944,Mayflash GameCube Controller Adapter,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b0,start:b9,guide:b0,leftshoulder:b4,rightshoulder:b7,leftstick:b0,rightstick:b0,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2, 79000018000000000000504944564944,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,x:b0,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:Windows, 2509e803000000000000504944564944,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows, +300f1001000000000000504944564944,Saitek P480 Rumble Pad,a:b2,b:b3,x:b0,y:b1,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b5,righttrigger:b7,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, @@ -41,7 +44,7 @@ a3060cff000000000000504944564944,Saitek P2500,a:b2,b:b3,y:b1,x:b0,start:b4,guide 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, +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, @@ -56,7 +59,7 @@ AD1B00000000000001F9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back: 050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,x:b18,y:b17,back:b7,guide:b8,start:b6,leftstick:b23,rightstick:b24,leftshoulder:b19,rightshoulder:b20,dpup:b11,dpdown:b12,dpleft:b13,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b21,righttrigger:b22,platform:Mac OS X, 79000000000000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,x:b0,y:b12,back:b32,start:b36,leftstick:b40,rightstick:b44,leftshoulder:b16,rightshoulder:b20,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a4,rightx:a8,righty:a12,lefttrigger:b24,righttrigger:b28,platform:Mac OS X, 2509000000000000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Mac OS X, - +351200000000000021ab000000000000,SFC30 Joystick,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,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, @@ -110,8 +113,8 @@ AD1B00000000000001F9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back: 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 +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, 03000000ff1100003133000010010000,PC Game Controller,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:Linux, @@ -120,7 +123,7 @@ AD1B00000000000001F9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back: 03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,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:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4, 03000000830500006020000010010000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux, 03000000c9110000f055000011010000,HJC Game GAMEPAD,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b11,rightshoulder:b5,rightx:a2,start:b9,righty:a3,dpleft:h0.8,lefttrigger:b6,x:b2,dpup:h0.1,back:b8,leftstick:b10,leftshoulder:b4,y:b3,a:b0,dpright:h0.2,righttrigger:b7,b:b1,platform:Linux, -03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,y:b3,x:b0,start:b12,guide: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:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platorm:Linux, +03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,y:b3,x:b0,start:b12,guide: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:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux, 03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,y:b3,x:b0,start:b9,guide:,back:,leftstick:,rightstick:,leftshoulder:,dpleft:b15,dpdown:b14,dpright:b13,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,rightshoulder:b7,dpup:b12,platform:Linux, 030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,platform:Linux,x:b0,a:b2,b:b3,y:b1,back:b10,guide:b12,start:b11,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3, 030000006f0e00004601000001010000,Rock Candy Wired Controller for Xbox One,platform:Linux,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,guide:b8,leftstick:b9,rightstick:b10,lefttrigger:a2,righttrigger:a5,leftx:a0,lefty:a1,rightx:a3,righty:a4,