xaizek / vifm-pdcurses (License: mostly public domain) (since 2019-03-20)
PDCurses 3.4 with vifm-specific patches applied (a couple were upstreamed)
<root> / x11 / pdckbd.c (30c37a87c1dfc2a8a3a83ad4d074964070b1298d) (2,479B) (mode 100644) [raw]
/* Public Domain Curses */

#include "pdcx11.h"

RCSID("$Id: pdckbd.c,v 1.62 2008/07/14 04:24:52 wmcbrine Exp $")

/*man-start**************************************************************

  Name:                                                         pdckbd

  Synopsis:
        unsigned long PDC_get_input_fd(void);

  Description:
        PDC_get_input_fd() returns the file descriptor that PDCurses 
        reads its input from. It can be used for select().

  Portability                                X/Open    BSD    SYS V
        PDC_get_input_fd                        -       -       -

**man-end****************************************************************/

/* check if a key or mouse event is waiting */

bool PDC_check_key(void)
{
    struct timeval socket_timeout = {0};
    int s;

    /* Is something ready to be read on the socket ? Must be a key. */

    FD_ZERO(&xc_readfds);
    FD_SET(xc_key_sock, &xc_readfds);

    if ((s = select(FD_SETSIZE, (FD_SET_CAST)&xc_readfds, NULL, 
        NULL, &socket_timeout)) < 0)
        XCursesExitCursesProcess(3, "child - exiting from "
                                    "PDC_check_key select failed");

    PDC_LOG(("%s:PDC_check_key() - returning %s\n", XCLOGMSG,
             s ? "TRUE" : "FALSE"));

    return !!s;
}

/* return the next available key or mouse event */

int PDC_get_key(void)
{
    unsigned long newkey = 0;
    int key = 0;

    if (XC_read_socket(xc_key_sock, &newkey, sizeof(unsigned long)) < 0)
        XCursesExitCursesProcess(2, "exiting from PDC_get_key");

    pdc_key_modifiers = (newkey >> 24) & 0xFF;
    key = (int)(newkey & 0x00FFFFFF);

    if (key == KEY_MOUSE && SP->key_code)
    {
        if (XC_read_socket(xc_key_sock, &pdc_mouse_status,
            sizeof(MOUSE_STATUS)) < 0)
            XCursesExitCursesProcess(2, "exiting from PDC_get_key");
    }

    PDC_LOG(("%s:PDC_get_key() - key %d returned\n", XCLOGMSG, key));

    return key;
}

unsigned long PDC_get_input_fd(void)
{
    PDC_LOG(("PDC_get_input_fd() - called\n"));

    return xc_key_sock;
}

void PDC_set_keyboard_binary(bool on)
{
    PDC_LOG(("PDC_set_keyboard_binary() - called\n"));
}

/* discard any pending keyboard or mouse input -- this is the core
   routine for flushinp() */

void PDC_flushinp(void)
{
    PDC_LOG(("PDC_flushinp() - called\n"));

    while (PDC_check_key())
        PDC_get_key();
}

int PDC_mouse_set(void)
{
    return OK;
}

int PDC_modifiers_set(void)
{
    return OK;
}
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/vifm-pdcurses

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/vifm-pdcurses

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master