On Sat, Mar 30, 2019 at 10:54:21AM -0000, Stuart Henderson wrote:
> On 2019-03-30, Leonid Bobrov <[email protected]> wrote:
> > On Tue, Mar 26, 2019 at 10:51:35AM +0200, Leonid Bobrov wrote:
> >> Hi, dear NetBSD and OpenBSD communities.
> >>
> >> I need to work with wscons, but I don't want to guess by examples
> >> how to work with it, can you please provide documentation for its
> >> API?
> >
> > Theo, Ulf, Anton, Todd, Martin, Frederic, Jasper and Jonathan,
> > you are the most recent committers to wscons, you know wscons
> > more than anyone else, so why won't you respond?
> >
> > I had to ask letoram from Arcan for help, but he only knows 3/10
> > of wscons and he had to read kernel source to understand how to
> > work with wscons.
> >
> >
>
> Docs are often better written by a smart person learning to use
> something (so they identify what they need to learn), reading the
> existing source and asking specific questions where they get stuck, than
> by someone who already knows the area.
>
> Also: figuring out *what* question to ask will often lead you to the
> answer yourself.
>
Ok, it makes sense, thank you for an adequate answer.
Right now I'm testing raw keyboard input, but I'd like to get to more
abstract interface (KS_* constants in <dev/wscons/wsksymdef.h>) so that
I can conveniently execute code on particular key presses.
I've written a small program and it appears to work:
/* Public domain. */
#include <time.h>
#include <dev/wscons/wsconsio.h>
#include <dev/wscons/wskbdraw.h>
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
int
main(void)
{
int kbdfd = open("/dev/wskbd", O_RDONLY | O_NONBLOCK | O_EXCL);
if (kbdfd == -1) {
printf("Couldn't open /dev/wskbd\n");
return 1;
}
struct wscons_event events[32];
int n;
bool quit = false;
while ((n = read(kbdfd, events, sizeof(events))) != 0) {
if (n == -1 && errno != EAGAIN && errno != EWOULDBLOCK) {
printf("Error while reading.\n");
return 1;
}
n /= sizeof(struct wscons_event);
for (int i = 0; i < n; ++i)
if (events[i].type == WSCONS_EVENT_KEY_DOWN) {
int value = events[i].value;
if (value == RAWKEY_q) {
printf("Quit.\n");
quit = true;
break;
} else if (value >= RAWKEY_1
&& value <= RAWKEY_9) {
printf("You pressed number: %c!\n",
value - RAWKEY_1 + '1');
} else if (value == RAWKEY_0) {
printf("You pressed number: 0!\n");
} else {
/* Nonsense. */
printf("You pressed: %c\n", value);
}
}
if (quit)
break;
}
return 0;
}