Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

There are many questions about this subject:

But the purpose of these questions/answers is to be able to use the gamepad for playing a game.

I would a like a solution to use the gamepad to control THE mouse.
To replace the mouse by the gamepad in all applications.
That way I could control my computer in the living-room from my couch with a wireless gamepad.

share|improve this question

4 Answers 4

I found a solution based on these 2 answers found in askUbuntu :
- to make my gamepad acts like the keyboard
- activate "Pointing and Clicking" by "Mouse Keys" in "Universal Access"

  • step 1 : rejoystick to configure the gamepad rejoystick to acts like the Numpad:
    UP= 8
    DOWN = 2
    LEFT = 4
    RIGHT =6
    Left button = 5
    Right button = 0

    enter image description here enter image description here

  • step 2: rejoystick -d to aplly it

  • step 3: activate "Pointing and Clicking" by keyboard numpad
    go to "System Setting" -> "Universal Access" -> "Pointing and Clicking" and activate "Mouse Keys" you can use the numpad keys to move the mouse pointer.
    For more detail about Click and move the mouse pointer without a mouse, consult this Ubuntu doc.



Issues that remains:

  • With this solution I lose the capability to use Numpad to tape numbers. Even if it is supposed to be possible using Num Lock
  • Mouse moves are not smooth, and I can only move vertically or horizontally, not in diagonal.
share|improve this answer

xboxdrv should be able to do what you want. It requires however a bit of configuration to work with non-Xbox gamepads, something along the lines of (check man-page for details, use --evdev-debug to find out the button and axis names):

#!/bin/sh

xboxdrv \
  --evdev /dev/input/event9 \
  --evdev-absmap ABS_X=X1,ABS_Y=y1 \
  --evdev-absmap ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \
  --evdev-keymap BTN_BASE=LB,BTN_BASE2=RB \
  --evdev-keymap BTN_BASE3=guide,BTN_TOP2=start,BTN_PINKIE=back \
  --evdev-keymap BTN_THUMB=x,BTN_TOP=a,BTN_THUMB2=b,BTN_TRIGGER=y \
  \
 --ui-clear \
  --ui-buttonmap rb=BTN_LEFT,lb=BTN_RIGHT,start=KEY_ESC,back=KEY_F1 \
  --ui-buttonmap a=KEY_SPACE \
  --ui-axismap X1=REL_X:20,Y1=REL_Y:20 \
  --ui-axismap DPAD_X=KEY_A:KEY_D:1,DPAD_Y=KEY_W:KEY_S:1 \
  -s "$@"

# EOF #
share|improve this answer
    
difficult, i only get "invalid argument" –  Boris May 7 '12 at 19:33
    
A little more information would be helpful, how did your config look like, what was the exact output of xboxdrv, which version did you use, etc. Also the above is just a example, you have to customize it for your controller to have it work. –  Grumbel May 8 '12 at 22:20
    
thank you Grumbel ! trying not be be lazy, I read the doc and I finally set my xboxdrv config, I detailed how in my answer –  Boris May 13 '12 at 11:31
up vote 3 down vote accepted

Following Grumbel's answer, I tried xboxdrv solution with the support of his link and specially this page:

1. Install xboxdrv 0.8.2 from Ubuntu Software Center.

Install also uinput and joydev if needed. I did it this way sudo modprobe uinput + sudo modprobe joydev

2. Need to know the event of the gamepad:

Launch udevadm monitor --udev and then plug the game pad :

$ udevadm monitor --udev
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing

UDEV  [6722.377700] add      /devices/pci0000:00/0000:00:1d.3/usb5/5-1 (usb)
UDEV  [6722.383264] add      /devices/pci0000:00/0000:00:1d.3/usb5/5-1/5-1:1.0 (usb)
UDEV  [6722.383333] add      /devices/pci0000:00/0000:00:1d.3/usb5/5-1/5-1:1.0/0003:046D:C218.0003 (hid)
UDEV  [6722.383389] add      /devices/pci0000:00/0000:00:1d.3/usb5/5-1/5-1:1.0/0003:046D:C218.0003/hidraw/hidraw1 (hidraw)
UDEV  [6722.387123] add      /devices/pci0000:00/0000:00:1d.3/usb5/5-1/5-1:1.0/input/input10 (input)
UDEV  [6722.399284] add      /devices/pci0000:00/0000:00:1d.3/usb5/5-1/5-1:1.0/input/input10/event8 (input)
UDEV  [6722.412128] add      /devices/pci0000:00/0000:00:1d.3/usb5/5-1/5-1:1.0/input/input10/js0 (input)

I conclude that my gamepad's event is /dev/input/event8

3. Display names of every keys, axis, buttons of the gamepad.

The idea is to launch xboxdrv and test every buttons and note the result on paper.

$ sudo xboxdrv --evdev /dev/input/event8 --evdev-debug
Your Xbox/Xbox360 controller should now be available as:
/dev/input/js1
/dev/input/event9
Press Ctrl-c to quit, use '--silent' to suppress the event output
EV_ABS ABS_X 128
EV_ABS ABS_Y 128
...

In my case the result is: enter image description here

4. Set the config file

Create a xboxdrv-mouse.ini file to set X Y axis and left and right mouse button.
Here I set gamepad buttons 2 for left mouse button and 3 for right mouse button:

[xboxdrv]
evdev=/dev/input/event8
silent=true

[evdev-absmap]
ABS_X=x1
ABS_Y=y1

[ui-axismap]
x1=REL_X:10
y1=REL_Y:-10

[evdev-keymap]
BTN_THUMB=a
BTN_THUMB2=b

[ui-buttonmap]
a=BTN_LEFT
b=BTN_RIGHT

# EOF #

Note that value for REl_X and REL_Y seems to define the speed of the mouse, and by defining a negative value it invert the axis (see here for REL_Y)

An other example with more button definition

[xboxdrv]
evdev=/dev/input/event8
silent=true

[evdev-absmap]
ABS_X=x1
ABS_Y=y1
ABS_HAT0X=x2
ABS_HAT0Y=y2

[ui-axismap]
x1=REL_X:10
y1=REL_Y:-10
x2=KEY_LEFT:KEY_RIGHT
y2=KEY_DOWN:KEY_UP

[evdev-keymap]
BTN_TRIGGER=x
BTN_TOP=y
BTN_THUMB=a
BTN_THUMB2=b
BTN_PINKIE=rt
BTN_BASE2=rb
BTN_TOP2=lt
BTN_BASE=lb
BTN_BASE3=back
BTN_BASE4=start

[ui-buttonmap]
x=KEY_KPENTER
y=KEY_SPACE
a=BTN_LEFT
b=BTN_RIGHT
rt=KEY_KP8
rb=KEY_KP2
lt=KEY_KP6
lb=KEY_KP4
back=KEY_LEFTSHIFT
start=KEY_RIGHTCTRL

# EOF #

5. Launch it

sudo xboxdrv --config xboxdrv-mouse.ini

To avoid launching it with sudo, create a udev rule.

CONCLUSION

It works fine, it's the best solution for me.

share|improve this answer

Same for a Nintendo 64 gamepad

[xboxdrv]
evdev=/dev/input/event9
silent=true

[evdev-absmap]
ABS_X=x1
ABS_Y=y1
ABS_RZ=x2
ABS_Z=y2
ABS_HAT0X=dpad_x
ABS_HAT0Y=dpad_y

[axismap]
-X2=X2

[ui-axismap]
x1=REL_X:30
y1=REL_Y:30
x2=KEY_Q:KEY_D
y2=KEY_DOWN:KEY_UP
dpad_x=KEY_LEFT:KEY_RIGHT
dpad_y=KEY_DOWN:KEY_UP

[evdev-keymap]
BTN_THUMB2=b
BTN_THUMB=a
BTN_BASE3=back
BTN_BASE4=start
BTN_BASE=lb
BTN_BASE2=rb

[ui-buttonmap]
start=KEY_KPENTER
rb=BTN_RIGHT
lb=void
a=REL_WHEEL:-1:150
b=REL_WHEEL:1:150
back=BTN_LEFT

Some details

My aim was to set this up to play to first person shoot games, as I am not used to play with mouse and keyboard. However most games on GNU/Linux do not support very well gamepad. I tried to do that like the advanced gamepad mode on the famous N64 Game 007 - GoldenEye.

This way, you can also use the gamepad to replace your mouse.

My choices

  • emulate the mouse on the main stick
  • yellow C (x2 y2) buttons are set to UP, DOWN keyboard keys, and the keys on an azerty keayboard for lateral move (Q and D ; change the letter for your keyboard layout)
  • up right down left are assigned to the cross
  • mouse left click is on Z (back) to shoot, and right click on R (rb). You might want to change the R button to KEY_SPACE to jump, depending of the game you play.
  • A and B are on the mouse wheel, so you can easily change your weapons.
  • the L button (lb) is left unset

Hope this will help other players.

Todo If someone knows how to do it, I would be interested to know how to setup a kind of "center area" qhere the mouse cursor don't move, even if the stick is not perfectly in the middle. This would avoid the cursor to move a bit when you don't use the gamepad but it is still enabled.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.