fwd_nfshp2.lua (1163B)
1 local fn = ... 2 3 local input = require("lib.input") 4 local uinput = require("lib.uinput") 5 local poll = require("lib.helper.posix_io").poll_read 6 7 local inp = input(fn) 8 local ui = uinput() 9 10 ui:copy_caps(inp) 11 ui:setup{ 12 -- id=inp.device_id, 13 -- some apps (like wine) doesn't like if you have multiple devices with the 14 -- same id, in that case fake something here: 15 id={bustype="BLUETOOTH", vendor=1, product=2}, 16 name="Virtual gamepad", 17 ff_effects_max=inp.ff_count 18 } 19 20 -- Assumes DS4 limits 21 ui:abs_setup("Z", {minimum=-255,maximum=255}) 22 ui:abs_setup("RZ", {minimum=-255,maximum=255}) 23 24 ui:create() 25 print("created", ui.sysname) 26 27 local kbd = uinput() 28 kbd:add_keyboard_caps(true) 29 kbd:setup{id={bustype="USB", vendor=1, product=2}, name="virtual kbd"} 30 kbd:create() 31 32 inp:grab() -- ! DANGER 33 34 local to_poll = { inp, ui } 35 local ui_ff = ui:gen_ff_forwarder(inp) 36 37 while true do 38 local rdy = poll(to_poll) 39 if rdy[inp] then 40 local rd = inp:read() 41 if rd.type == "KEY" and rd.code == "BTN_MODE" then 42 rd.code = "KEY_ESC" 43 kbd:write(rd) 44 kbd:write{type="SYN", code="REPORT"} 45 else 46 ui:write(rd) 47 end 48 end 49 50 if rdy[ui] then ui_ff() end 51 end