Copyright (C) Kevin Larke 2009-2020

This file is part of libcm.

libcm is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

libcm is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

See the GNU General Public License distributed with the libcm package or look here: .


cmKeyboard : Query and get keypresses directly from the console.

enum
{
  kInvalidKId,
  kAsciiKId,
  kLeftArrowKId,
  kRightArrowKId,
  kUpArrowKId,
  kDownArrowKId,
  kHomeKId,
  kEndKId,
  kPgUpKId,
  kPgDownKId,
  kInsertKId,
  kDeleteKId,
  
};

typedef struct
{
  unsigned code;
  char     ch;
  bool     ctlFl;
  bool     altFl;
} cmKbRecd;

// Set 'p' to NULL if the value of the key is not required.
void cmKeyPress( cmKbRecd* p );


// Return non-zero if a key is waiting to be read otherwise return 0.
// Use getchar() to pick up the key.
// 
// Example:
// while( 1 )
// {
//    if( cmIsKeyWaiting() == 0 )
//       usleep(20000);
//    else
//    {
//      char c = getchar();
//      switch(c)
//      {
//        ....
//      } 
//    }
//
// }
//
// TODO: Note that this function turns off line-buffering on stdin.
// It should be changed to a three function sequence.
// bool org_state =  cmSetStdinLineBuffering(false);
// ....
// cmIsKeyWaiting()
// ....
// cmSetStdinLineBuffering(org_state)
int cmIsKeyWaiting();