/////////////////////////////////////////////////////////////////////////////
// Name: keyboardcode.h
// Purpose:
// Author: Cesar Mauri Loba (cesar at crea-si dot com)
// Modified by:
// Created: 28/09/2010
// Copyright: (C) 2008 Cesar Mauri Loba - CREA Software Systems
//
// This program 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.
//
// This program 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.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
/////////////////////////////////////////////////////////////////////////////
#ifndef KEYBOARDCODE_H
#define KEYBOARDCODE_H
#include // for wxKeyCode
#include
// Store a keyboard code which is a unique key identifier after
// taking into account the keyboard layout.
//
// The code is stored in its native format (KeySym on X11 and as
// virtual key code on Windows)
//
// Several conversion methods are provided
//
// This class has only one integer in its layout (is cheap)
//
// TODO: for X11, consider storing a KeyCode instead of a KeySym.
// https://tronche.com/gui/x/xlib/input/keyboard-encoding.html
// https://wiki.archlinux.org/index.php/extra_keyboard_keys
class KeyboardCode {
public:
// Default constructor: initializes internal keycode to a invalid value
KeyboardCode() : m_nativeKeyCode(0) { }
// Construct object from its native value
KeyboardCode(int v) : m_nativeKeyCode(v) { }
// Default destructor, copy constructor and copy operator are fine
bool operator==(const KeyboardCode &other) const {
return m_nativeKeyCode== other.m_nativeKeyCode;
}
bool operator!=(const KeyboardCode &other) const {
return !(*this== other);
}
// Get its native value (KeySym on X11, virtual key codes)
int get_native() const { return m_nativeKeyCode; }
bool is_valud() const { return m_nativeKeyCode!= 0; }
// Get its readable name
wxString GetName() const;
// Send a keystoke to the system
void SendKey();
// Reads a keycode from keyboard and returns a KeyboardCode object
static KeyboardCode ReadKeyCode();
// Given an char returns the corresponding KeyboardCode object
// Currently ignores shift state (SHIFT, CTRL, ALT, etc.)
static KeyboardCode FromChar (char c);
// Given an scan code returns the corresponding KeyboardCode object
static KeyboardCode FromScanCode (int scanCode);
// Given an wxKeyCode code returns the corresponding KeyboardCode object
static KeyboardCode FromWXK (wxKeyCode kc);
#if defined(DEBUG)
void Dump() const;
#endif
private:
// Stores the native value for virtual key codes. This corresponds to a
// unique key after taking into account the keyboard layout (the keyboard
// returns a scan code which, using the layout, is converted to this
// value). In Unix systems this corresponds to KeySym. For Windows
// systems it is called virtual-key code. According to:
// https://cgit.freedesktop.org/xorg/proto/x11proto/plain/keysymdef.h
// KeySym is a 29-bit value and according to
// https://msdn.microsoft.com/en-us//library/windows/desktop/dd375731(v=vs.85).aspx
// it seems that virtual key codes are 8-bit values. Therefore, we store
// it as 32-bit value
int m_nativeKeyCode;
};
#endif // KEYBOARDCODE_H