library of assembled shared sources

http://lass.cocamware.com

keyboard.cpp

Go to the documentation of this file.
00001 /**     @file
00002  *      @author Bram de Greve (bramz@users.sourceforge.net)
00003  *      @author Tom De Muer (tomdemuer@users.sourceforge.net)
00004  *
00005  *      *** BEGIN LICENSE INFORMATION ***
00006  *      
00007  *      The contents of this file are subject to the Common Public Attribution License 
00008  *      Version 1.0 (the "License"); you may not use this file except in compliance with 
00009  *      the License. You may obtain a copy of the License at 
00010  *      http://lass.sourceforge.net/cpal-license. The License is based on the 
00011  *      Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover 
00012  *      use of software over a computer network and provide for limited attribution for 
00013  *      the Original Developer. In addition, Exhibit A has been modified to be consistent 
00014  *      with Exhibit B.
00015  *      
00016  *      Software distributed under the License is distributed on an "AS IS" basis, WITHOUT 
00017  *      WARRANTY OF ANY KIND, either express or implied. See the License for the specific 
00018  *      language governing rights and limitations under the License.
00019  *      
00020  *      The Original Code is LASS - Library of Assembled Shared Sources.
00021  *      
00022  *      The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
00023  *      The Original Developer is the Initial Developer.
00024  *      
00025  *      All portions of the code written by the Initial Developer are:
00026  *      Copyright (C) 2004-2007 the Initial Developer.
00027  *      All Rights Reserved.
00028  *      
00029  *      Contributor(s):
00030  *
00031  *      Alternatively, the contents of this file may be used under the terms of the 
00032  *      GNU General Public License Version 2 or later (the GPL), in which case the 
00033  *      provisions of GPL are applicable instead of those above.  If you wish to allow use
00034  *      of your version of this file only under the terms of the GPL and not to allow 
00035  *      others to use your version of this file under the CPAL, indicate your decision by 
00036  *      deleting the provisions above and replace them with the notice and other 
00037  *      provisions required by the GPL License. If you do not delete the provisions above,
00038  *      a recipient may use your version of this file under either the CPAL or the GPL.
00039  *      
00040  *      *** END LICENSE INFORMATION ***
00041  */
00042 
00043 #include "io_common.h"
00044 #include "keyboard.h"
00045 
00046 #if LASS_PLATFORM_TYPE == LASS_PLATFORM_TYPE_WIN32
00047 #       pragma LASS_NOTE("io/keyboard: using win32 implementation")
00048 #       define LASS_IO_KEYBOARD_HAVE_WIN32
00049 #       include <conio.h>
00050 #elif LASS_HAVE_TERMIOS_H && LASS_HAVE_SYS_IOCTL_H
00051 #       define LASS_IO_KEYBOARD_HAVE_TERMIOS_H_AND_IOCTL_H
00052 #       include <termios.h>
00053 #       include <sys/ioctl.h>
00054 #       if LASS_HAVE_UNISTD_H
00055 #               include <unistd.h>
00056 #       endif
00057 #       if LASS_HAVE_SYS_SOCKET_H
00058 #               include <sys/socket.h>
00059 #       endif
00060 #       include "../util/impl/lass_errno.h"
00061 #else
00062 #       error lass/io/keyboard.cpp not supported
00063 #endif
00064 
00065 #
00066 namespace lass
00067 {
00068 namespace io
00069 {
00070 
00071 #if defined(LASS_IO_KEYBOARD_HAVE_TERMIOS_H_AND_IOCTL_H)
00072 namespace impl
00073 {
00074         class TerminalAttributeSaver
00075         {
00076         public:
00077                 TerminalAttributeSaver()
00078                 {
00079                         LASS_ENFORCE_CLIB(tcgetattr(STDIN_FILENO, &savedAttributes_));
00080                 }
00081                 ~TerminalAttributeSaver()
00082                 {
00083                         const int rc = tcsetattr(STDIN_FILENO, TCSANOW, &savedAttributes_);
00084                         LASS_ASSERT(rc == 0);
00085                         if (rc == -1)
00086                         {
00087                                 const int errnum = util::impl::lass_errno();
00088                                 std::cerr << "[LASS RUN MSG] UNDEFINED BEHAVIOUR WARNING: "
00089                                         << "failed to restore terminal attributes: ("
00090                                         << errnum << ") " << util::impl::lass_strerror(errnum)
00091                                         << std::endl;
00092                         }
00093                 }
00094                 const termios& savedAttributes() const
00095                 {
00096                         return savedAttributes_;
00097                 }
00098         private:
00099                 termios savedAttributes_;
00100         };
00101 }
00102 #endif
00103 
00104 /** return true if a key is pressed and which is waiting in the buffer ...
00105  *  @ingroup Keyboard
00106  */
00107 bool keyboardIsHit()
00108 {
00109 #if defined(LASS_IO_KEYBOARD_HAVE_WIN32)
00110         return _kbhit() != 0;
00111 #elif defined(LASS_IO_KEYBOARD_HAVE_TERMIOS_H_AND_IOCTL_H)
00112         impl::TerminalAttributeSaver attributeSaver;
00113         termios rawMode = attributeSaver.savedAttributes();
00114         rawMode.c_lflag &= ~ICANON;
00115         LASS_ENFORCE_CLIB(tcsetattr(STDIN_FILENO, TCSANOW, &rawMode));
00116 
00117         int count = 0;
00118         LASS_ENFORCE_CLIB(ioctl(STDIN_FILENO, FIONREAD, &count));
00119         return count > 0;
00120 #else
00121 #       error keyboardIsHit not supported
00122 #endif
00123 }
00124 
00125 /** get a character from the console without echo
00126  *  @ingroup Keyboard
00127  */
00128 int keyboardGetKey()
00129 {
00130 #if defined(LASS_IO_KEYBOARD_HAVE_WIN32)
00131         return _getch();
00132 #elif defined(LASS_IO_KEYBOARD_HAVE_TERMIOS_H_AND_IOCTL_H)
00133         impl::TerminalAttributeSaver attributeSaver;
00134         termios rawMode = attributeSaver.savedAttributes();
00135         rawMode.c_lflag &= ~ICANON;
00136         rawMode.c_lflag &= ~ECHO;
00137         rawMode.c_cc[VMIN]  = 1; // block for input
00138         rawMode.c_cc[VTIME] = 0; // timer is ignored
00139         LASS_ENFORCE_CLIB(tcsetattr(STDIN_FILENO, TCSANOW, &rawMode));
00140 
00141         unsigned char character = 0;
00142         const ssize_t charactersRead = LASS_ENFORCE_CLIB(read(STDIN_FILENO, &character, 1));
00143         LASS_ENFORCE(charactersRead == 1);
00144         return static_cast<int>(character);
00145 #else
00146 #       error keyboardIsHit not supported
00147 #endif
00148 }
00149 
00150 }
00151 }
00152 
00153 // EOF

Generated on Mon Nov 10 14:20:06 2008 for Library of Assembled Shared Sources by doxygen 1.5.7.1
SourceForge.net Logo