On Wed, 22 May 2024, Joel wrote:

wsmuxctl -f 0 -l
wsmouse0
wsmouse2


Can you run this program on the console (no X; no wsmoused) and see if it
reports any scroll events when you move the mouse? Run on /dev/wsmouse2
first, then on /dev/wsmouse. Both should report the same type of events, I
think.

-RVP

--- START mousetest.c ---
/**
 * 64-bit systems: hexdump -e '24/1 "%02x " "\n"' /dev/wsmouseN
 * 32-bit systems: hexdump -e '20/1 "%02x " "\n"' /dev/wsmouseN
 */

#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dev/wscons/wsconsio.h>

int
main(int argc, char* argv[])
{
        struct wscons_event e[16], *ep;
        char* dev;
        int fd;

        if (argc != 2) {
                fprintf(stderr, "Usage: %s mouse-dev\n", getprogname());
                exit(EXIT_FAILURE);
        }

        dev = argv[1];
        if ((fd = open(dev, O_RDONLY)) == -1)
                err(EXIT_FAILURE, "%s: open failed", dev);

        for (;;) {
                ssize_t i, n;
                if ((n = read(fd, e, sizeof e)) <= 0) {
                        close(fd);
                        err(EXIT_FAILURE, "%s: packet read failed", dev);
                }
                if (n % sizeof(e[0])) {
                        close(fd);
                        err(EXIT_FAILURE, "%s: partial packet read", dev);
                }
                n /= sizeof(e[0]);
                for (i = 0, ep = e; i < n; i++, ep++) {
                        switch (ep->type) {
                        case WSCONS_EVENT_MOUSE_UP:
                                printf(" release: %d\n", ep->value);
                                break;
                        case WSCONS_EVENT_MOUSE_DOWN:
                                printf("   press: %d\n", ep->value);
                                break;
                        case WSCONS_EVENT_MOUSE_DELTA_X:
                                printf("    move: %d (%s)\n", ep->value, ep->value < 0 ? 
"left" : "right");
                                break;
                        case WSCONS_EVENT_MOUSE_DELTA_Y:
                                printf("    move: %d (%s)\n", ep->value, ep->value < 0 ? 
"down" : "up");
                                break;
                        case WSCONS_EVENT_MOUSE_ABSOLUTE_X:
                                printf("   loc X: %d\n", ep->value);
                                break;
                        case WSCONS_EVENT_MOUSE_ABSOLUTE_Y:
                                printf("   loc Y: %d\n", ep->value);
                                break;
                        case WSCONS_EVENT_MOUSE_DELTA_Z:
                                printf("  scroll: %d (%s)\n", ep->value, ep->value < 0 ? 
"up" : "down");
                                break;
                        case WSCONS_EVENT_MOUSE_ABSOLUTE_Z:
                                printf("   loc Z: %d\n", ep->value);
                                break;
                        case WSCONS_EVENT_MOUSE_DELTA_W:
                                printf(" delta-w: %d (%s)\n", ep->value, ep->value < 0 ? 
"left" : "right");
                                break;
                        case WSCONS_EVENT_MOUSE_ABSOLUTE_W:
                                printf("   loc W: %d\n", ep->value);
                                break;
                        case WSCONS_EVENT_HSCROLL:
                                printf("H-scroll: %d\n", ep->value);
                                break;
                        case WSCONS_EVENT_VSCROLL:
                                printf("V-scroll: %d\n", ep->value);
                                break;
                        default:
                                printf("Unknown: %u %d\n", ep->type, ep->value);
                                break;
                        }
                }
        }
        return 0;
}
--- END mousetest.c ---

Reply via email to