Merge pull request #2578 from elyosh/fix-evdev-mouse

qt: fix busy looping with evdev mouse
This commit is contained in:
Miran Grča
2022-08-06 02:13:05 +02:00
committed by GitHub

View File

@@ -31,6 +31,7 @@ extern "C"
#include <86box/86box.h> #include <86box/86box.h>
#include <86box/plat.h> #include <86box/plat.h>
#include <86box/mouse.h> #include <86box/mouse.h>
#include <poll.h>
} }
static std::vector<std::pair<int, libevdev*>> evdev_mice; static std::vector<std::pair<int, libevdev*>> evdev_mice;
@@ -54,25 +55,39 @@ void evdev_mouse_poll()
void evdev_thread_func() void evdev_thread_func()
{ {
struct pollfd *pfds = (struct pollfd*)calloc(evdev_mice.size(), sizeof(struct pollfd));
for (unsigned int i = 0; i < evdev_mice.size(); i++)
{
pfds[i].fd = libevdev_get_fd(evdev_mice[i].second);
pfds[i].events = POLLIN;
}
while (!stopped) while (!stopped)
{ {
poll(pfds, evdev_mice.size(), 500);
for (unsigned int i = 0; i < evdev_mice.size(); i++) for (unsigned int i = 0; i < evdev_mice.size(); i++)
{ {
struct input_event ev; struct input_event ev;
int rc = libevdev_next_event(evdev_mice[i].second, LIBEVDEV_READ_FLAG_NORMAL, &ev); if (pfds[i].revents & POLLIN) {
if (rc == 0 && ev.type == EV_REL && mouse_capture) while (libevdev_next_event(evdev_mice[i].second, LIBEVDEV_READ_FLAG_NORMAL, &ev) == 0)
{
if (ev.type == EV_REL && mouse_capture)
{ {
if (ev.code == REL_X) evdev_mouse_rel_x += ev.value; if (ev.code == REL_X) evdev_mouse_rel_x += ev.value;
if (ev.code == REL_Y) evdev_mouse_rel_y += ev.value; if (ev.code == REL_Y) evdev_mouse_rel_y += ev.value;
} }
} }
} }
}
}
for (unsigned int i = 0; i < evdev_mice.size(); i++) for (unsigned int i = 0; i < evdev_mice.size(); i++)
{ {
libevdev_free(evdev_mice[i].second); libevdev_free(evdev_mice[i].second);
evdev_mice[i].second = nullptr; evdev_mice[i].second = nullptr;
close(evdev_mice[i].first); close(evdev_mice[i].first);
} }
free(pfds);
evdev_mice.clear(); evdev_mice.clear();
} }