Можете ли вы отслеживать более одной мыши с помощью SDL2?

Можно ли работать с двумя мышами через SDL 2?

На SDL_MOUSEBUTTONDOWN-событие, event.button.which равно нулю, независимо от того, какая мышь используется. (У меня есть две мыши, подключенные к моей машине OpenSuse через USB.)

Если да, то как ты можешь это сделать?

1 ответ

Решение

SDL вики говорит:

Пожалуйста, обратите внимание, что в этом разделе обсуждаются "мыши" только с понятием графического интерфейса рабочего стола. У вас (обычно) один системный курсор, а ОС скрывает от вас детали оборудования. Если вы подключите 10 мышей, все десять перемещают этот курсор. Для многих приложений и игр это прекрасно, и этот API хорошо обслуживал сотни SDL-программ с момента своего рождения.

Похоже, вам не повезло, по крайней мере, с помощью простого SDL. Поскольку вы работаете в Linux (и, вероятно, используете Xorg), вы можете посмотреть, как xinput обрабатывает несколько входов; исходный код для тестирования событий XI2 может быть особенно полезным.

Например, на моей машине xinput показывает целую кучу устройств:

$ xinput
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=11   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=16   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Video Bus                                 id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Integrated Camera                         id=10   [slave  keyboard (3)]
    ↳ HID 046a:0011                             id=12   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=13   [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                    id=15   [slave  keyboard (3)]

Я могу затем использовать test-xi2 Команда для получения событий только для одного устройства (например, моей USB-мыши), например:

$ xinput test-xi2 11
...
EVENT type 17 (RawMotion)
device: 11 (11)
detail: 0
valuators:
flags: 
      0: -5.25 (-3.00)
      1: 12.75 (8.00)
...

Это выводит только движения указателя, вызванные моей мышью, но не те, которые вызваны, например, трекпадом. Если xinput является опцией для вас, исходный код может помочь вам реализовать свой собственный механизм.

Другие вопросы по тегам