Merge branch 'master' into beta

This commit is contained in:
David Capello 2016-12-07 14:41:28 -03:00
commit 1e4f846e1b
6 changed files with 336 additions and 30 deletions

View File

@ -61,6 +61,7 @@ if(WITH_WEBP_SUPPORT)
endif()
# cmark include files
add_definitions(-DCMARK_STATIC_DEFINE)
include_directories(${CMAKE_BINARY_DIR}/third_party/cmark)
######################################################################

View File

@ -30,6 +30,7 @@ if(USE_ALLEG4_BACKEND)
alleg4/display_events.cpp
alleg4/key_poller.cpp
alleg4/mouse_poller.cpp
alleg4/scancode.cpp
alleg4/she.cpp)
if(APPLE)

View File

@ -10,24 +10,27 @@
#include "she/she.h"
#include "she/alleg4/scancode.h"
#include <allegro.h>
namespace she {
namespace {
int key_repeated[KEY_MAX];
int key_repeated[kKeyScancodes];
int she_keyboard_ucallback(int unicode_char, int* scancode)
{
int c = ((*scancode) & 0x7f);
KeyScancode she_scancode =
alleg_to_she_scancode((*scancode) & 0x7f);
Event ev;
ev.setType(Event::KeyDown);
ev.setScancode(static_cast<KeyScancode>(c));
ev.setScancode(she_scancode);
if (unicode_char > 0)
ev.setUnicodeChar(unicode_char);
ev.setRepeat(key_repeated[c]++);
ev.setRepeat(key_repeated[she_scancode]++);
queue_event(ev);
return unicode_char;
@ -36,29 +39,29 @@ int she_keyboard_ucallback(int unicode_char, int* scancode)
void she_keyboard_lowlevel_callback(int scancode)
{
// Bit 0x80 indicates that it is a key release.
#ifdef ALLEGRO_UNIX
if (!(scancode & 0x80)) {
// Generate KeyDown events for modifiers. Needed for Allegro 4 on
// Mac OS X and Linux as modifiers don't generate
// keyboard_ucallback() calls.
if (scancode == KEY_CAPSLOCK ||
scancode == KEY_LSHIFT ||
scancode == KEY_LCONTROL ||
scancode == KEY_ALT ||
scancode == KEY_COMMAND ||
scancode == KEY_LWIN ||
scancode == KEY_RWIN ) {
// Linux as modifiers don't generate keyboard_ucallback() calls.
if (scancode == KEY_CAPSLOCK || scancode == KEY_COMMAND ||
scancode == KEY_LSHIFT || scancode == KEY_RSHIFT ||
scancode == KEY_LCONTROL || scancode == KEY_RCONTROL ||
scancode == KEY_ALT || scancode == KEY_ALTGR ||
scancode == KEY_LWIN || scancode == KEY_RWIN) {
she_keyboard_ucallback(-1, &scancode);
}
return;
}
#endif
scancode ^= 0x80;
key_repeated[scancode] = 0;
KeyScancode she_scancode = alleg_to_she_scancode(scancode);
key_repeated[she_scancode] = 0;
Event ev;
ev.setType(Event::KeyUp);
ev.setScancode(static_cast<KeyScancode>(scancode));
ev.setUnicodeChar(::scancode_to_ascii(scancode));
ev.setScancode(she_scancode);
ev.setUnicodeChar(scancode_to_ascii(scancode));
ev.setRepeat(0);
queue_event(ev);
}
@ -67,7 +70,7 @@ void she_keyboard_lowlevel_callback(int scancode)
void key_poller_init()
{
for (int c=0; c<KEY_MAX; c++)
for (int c=0; c<kKeyScancodes; c++)
key_repeated[c] = 0;
keyboard_ucallback = she_keyboard_ucallback;

291
src/she/alleg4/scancode.cpp Normal file
View File

@ -0,0 +1,291 @@
// SHE library
// Copyright (C) 2016 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "she/alleg4/scancode.h"
#include <allegro.h>
namespace she {
KeyScancode alleg_to_she_scancode(int scancode)
{
static KeyScancode table[] = {
kKeyNil,
kKeyA, // KEY_A
kKeyB, // KEY_B
kKeyC, // KEY_C
kKeyD, // KEY_D
kKeyE, // KEY_E
kKeyF, // KEY_F
kKeyG, // KEY_G
kKeyH, // KEY_H
kKeyI, // KEY_I
kKeyJ, // KEY_J
kKeyK, // KEY_K
kKeyL, // KEY_L
kKeyM, // KEY_M
kKeyN, // KEY_N
kKeyO, // KEY_O
kKeyP, // KEY_P
kKeyQ, // KEY_Q
kKeyR, // KEY_R
kKeyS, // KEY_S
kKeyT, // KEY_T
kKeyU, // KEY_U
kKeyV, // KEY_V
kKeyW, // KEY_W
kKeyX, // KEY_X
kKeyY, // KEY_Y
kKeyZ, // KEY_Z
kKey0, // KEY_0
kKey1, // KEY_1
kKey2, // KEY_2
kKey3, // KEY_3
kKey4, // KEY_4
kKey5, // KEY_5
kKey6, // KEY_6
kKey7, // KEY_7
kKey8, // KEY_8
kKey9, // KEY_9
kKey0Pad, // KEY_0_PAD
kKey1Pad, // KEY_1_PAD
kKey2Pad, // KEY_2_PAD
kKey3Pad, // KEY_3_PAD
kKey4Pad, // KEY_4_PAD
kKey5Pad, // KEY_5_PAD
kKey6Pad, // KEY_6_PAD
kKey7Pad, // KEY_7_PAD
kKey8Pad, // KEY_8_PAD
kKey9Pad, // KEY_9_PAD
kKeyF1, // KEY_F1
kKeyF2, // KEY_F2
kKeyF3, // KEY_F3
kKeyF4, // KEY_F4
kKeyF5, // KEY_F5
kKeyF6, // KEY_F6
kKeyF7, // KEY_F7
kKeyF8, // KEY_F8
kKeyF9, // KEY_F9
kKeyF10, // KEY_F10
kKeyF11, // KEY_F11
kKeyF12, // KEY_F12
kKeyEsc, // KEY_ESC
kKeyTilde, // KEY_TILDE
kKeyMinus, // KEY_MINUS
kKeyEquals, // KEY_EQUALS
kKeyBackspace, // KEY_BACKSPACE
kKeyTab, // KEY_TAB
kKeyOpenbrace, // KEY_OPENBRACE
kKeyClosebrace, // KEY_CLOSEBRACE
kKeyEnter, // KEY_ENTER
kKeyColon, // KEY_COLON
kKeyQuote, // KEY_QUOTE
kKeyBackslash, // KEY_BACKSLASH
kKeyBackslash2, // KEY_BACKSLASH2
kKeyComma, // KEY_COMMA
kKeyStop, // KEY_STOP
kKeySlash, // KEY_SLASH
kKeySpace, // KEY_SPACE
kKeyInsert, // KEY_INSERT
kKeyDel, // KEY_DEL
kKeyHome, // KEY_HOME
kKeyEnd, // KEY_END
kKeyPageUp, // KEY_PGUP
kKeyPageDown, // KEY_PGDN
kKeyLeft, // KEY_LEFT
kKeyRight, // KEY_RIGHT
kKeyUp, // KEY_UP
kKeyDown, // KEY_DOWN
kKeySlashPad, // KEY_SLASH_PAD
kKeyAsterisk, // KEY_ASTERISK
kKeyMinusPad, // KEY_MINUS_PAD
kKeyPlusPad, // KEY_PLUS_PAD
kKeyDelPad, // KEY_DEL_PAD
kKeyEnterPad, // KEY_ENTER_PAD
kKeyPrtscr, // KEY_PRTSCR
kKeyPause, // KEY_PAUSE
kKeyAbntC1, // KEY_ABNT_C1
kKeyYen, // KEY_YEN
kKeyKana, // KEY_KANA
kKeyConvert, // KEY_CONVERT
kKeyNoconvert, // KEY_NOCONVERT
kKeyAt, // KEY_AT
kKeyCircumflex, // KEY_CIRCUMFLEX
kKeyColon2, // KEY_COLON2
kKeyKanji, // KEY_KANJI
kKeyEqualsPad, // KEY_EQUALS_PAD
kKeyBackquote, // KEY_BACKQUOTE
kKeySemicolon, // KEY_SEMICOLON
kKeyCommand, // KEY_COMMAND
kKeyUnknown1, // KEY_UNKNOWN1
kKeyUnknown2, // KEY_UNKNOWN2
kKeyUnknown3, // KEY_UNKNOWN3
kKeyUnknown4, // KEY_UNKNOWN4
kKeyUnknown5, // KEY_UNKNOWN5
kKeyUnknown6, // KEY_UNKNOWN6
kKeyUnknown7, // KEY_UNKNOWN7
kKeyNil, // KEY_UNKNOWN8
kKeyLShift, // KEY_LSHIFT
kKeyRShift, // KEY_RSHIFT
kKeyLControl, // KEY_LCONTROL
kKeyRControl, // KEY_RCONTROL
kKeyAlt, // KEY_ALT
kKeyAltGr, // KEY_ALTGR
kKeyLWin, // KEY_LWIN
kKeyRWin, // KEY_RWIN
kKeyMenu, // KEY_MENU
kKeyScrLock, // KEY_SCRLOCK
kKeyNumLock, // KEY_NUMLOCK
kKeyCapsLock, // KEY_CAPSLOCK
};
if (scancode >= 0 && scancode < int(sizeof(table) / sizeof(table[0])))
return table[scancode];
else
return kKeyNil;
}
int she_to_alleg_scancode(KeyScancode scancode)
{
static int table[] = {
0,
KEY_A, // kKeyA
KEY_B, // kKeyB
KEY_C, // kKeyC
KEY_D, // kKeyD
KEY_E, // kKeyE
KEY_F, // kKeyF
KEY_G, // kKeyG
KEY_H, // kKeyH
KEY_I, // kKeyI
KEY_J, // kKeyJ
KEY_K, // kKeyK
KEY_L, // kKeyL
KEY_M, // kKeyM
KEY_N, // kKeyN
KEY_O, // kKeyO
KEY_P, // kKeyP
KEY_Q, // kKeyQ
KEY_R, // kKeyR
KEY_S, // kKeyS
KEY_T, // kKeyT
KEY_U, // kKeyU
KEY_V, // kKeyV
KEY_W, // kKeyW
KEY_X, // kKeyX
KEY_Y, // kKeyY
KEY_Z, // kKeyZ
KEY_0, // kKey0
KEY_1, // kKey1
KEY_2, // kKey2
KEY_3, // kKey3
KEY_4, // kKey4
KEY_5, // kKey5
KEY_6, // kKey6
KEY_7, // kKey7
KEY_8, // kKey8
KEY_9, // kKey9
KEY_0_PAD, // kKey0Pad
KEY_1_PAD, // kKey1Pad
KEY_2_PAD, // kKey2Pad
KEY_3_PAD, // kKey3Pad
KEY_4_PAD, // kKey4Pad
KEY_5_PAD, // kKey5Pad
KEY_6_PAD, // kKey6Pad
KEY_7_PAD, // kKey7Pad
KEY_8_PAD, // kKey8Pad
KEY_9_PAD, // kKey9Pad
KEY_F1, // kKeyF1
KEY_F2, // kKeyF2
KEY_F3, // kKeyF3
KEY_F4, // kKeyF4
KEY_F5, // kKeyF5
KEY_F6, // kKeyF6
KEY_F7, // kKeyF7
KEY_F8, // kKeyF8
KEY_F9, // kKeyF9
KEY_F10, // kKeyF10
KEY_F11, // kKeyF11
KEY_F12, // kKeyF12
KEY_ESC, // kKeyEsc
KEY_TILDE, // kKeyTilde
KEY_MINUS, // kKeyMinus
KEY_EQUALS, // kKeyEquals
KEY_BACKSPACE, // kKeyBackspace
KEY_TAB, // kKeyTab
KEY_OPENBRACE, // kKeyOpenbrace
KEY_CLOSEBRACE, // kKeyClosebrace
KEY_ENTER, // kKeyEnter
KEY_COLON, // kKeyColon
KEY_QUOTE, // kKeyQuote
KEY_BACKSLASH, // kKeyBackslash
KEY_BACKSLASH2, // kKeyBackslash2
KEY_COMMA, // kKeyComma
KEY_STOP, // kKeyStop
KEY_SLASH, // kKeySlash
KEY_SPACE, // kKeySpace
KEY_INSERT, // kKeyInsert
KEY_DEL, // kKeyDel
KEY_HOME, // kKeyHome
KEY_END, // kKeyEnd
KEY_PGUP, // kKeyPageUp
KEY_PGDN, // kKeyPageDown
KEY_LEFT, // kKeyLeft
KEY_RIGHT, // kKeyRight
KEY_UP, // kKeyUp
KEY_DOWN, // kKeyDown
KEY_SLASH_PAD, // kKeySlashPad
KEY_ASTERISK, // kKeyAsterisk
KEY_MINUS_PAD, // kKeyMinusPad
KEY_PLUS_PAD, // kKeyPlusPad
KEY_DEL_PAD, // kKeyDelPad
KEY_ENTER_PAD, // kKeyEnterPad
KEY_PRTSCR, // kKeyPrtscr
KEY_PAUSE, // kKeyPause
KEY_ABNT_C1, // kKeyAbntC1
KEY_YEN, // kKeyYen
KEY_KANA, // kKeyKana
KEY_CONVERT, // kKeyConvert
KEY_NOCONVERT, // kKeyNoconvert
KEY_AT, // kKeyAt
KEY_CIRCUMFLEX, // kKeyCircumflex
KEY_COLON2, // kKeyColon2
KEY_KANJI, // kKeyKanji
KEY_EQUALS_PAD, // kKeyEqualsPad
KEY_BACKQUOTE, // kKeyBackquote
KEY_SEMICOLON, // kKeySemicolon
KEY_UNKNOWN1, // kKeyUnknown1
KEY_UNKNOWN2, // kKeyUnknown2
KEY_UNKNOWN3, // kKeyUnknown3
KEY_UNKNOWN4, // kKeyUnknown4
KEY_UNKNOWN5, // kKeyUnknown5
KEY_UNKNOWN6, // kKeyUnknown6
KEY_UNKNOWN7, // kKeyUnknown7
KEY_UNKNOWN8, // kKeyUnknown8
KEY_LSHIFT, // kKeyLShift
KEY_RSHIFT, // kKeyRShift
KEY_LCONTROL, // kKeyLControl
KEY_RCONTROL, // kKeyRControl
KEY_ALT, // kKeyAlt
KEY_ALTGR, // kKeyAltGr
KEY_LWIN, // kKeyLWin
KEY_RWIN, // kKeyRWin
KEY_MENU, // kKeyMenu
KEY_COMMAND, // kKeyCommand
KEY_SCRLOCK, // kKeyScrLock
KEY_NUMLOCK, // kKeyNumLock
KEY_CAPSLOCK, // kKeyCapsLock
};
if (scancode >= 0 && scancode < int(sizeof(table) / sizeof(table[0])))
return table[scancode];
else
return kKeyNil;
}
} // namespace she

20
src/she/alleg4/scancode.h Normal file
View File

@ -0,0 +1,20 @@
// SHE library
// Copyright (C) 2016 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
#ifndef SHE_ALLEG4_SCANCODE_H_INCLUDED
#define SHE_ALLEG4_SCANCODE_H_INCLUDED
#pragma once
#include "she/keys.h"
namespace she {
KeyScancode alleg_to_she_scancode(int scancode);
int she_to_alleg_scancode(KeyScancode scancode);
} // namespace she
#endif

View File

@ -56,6 +56,7 @@
#include <vector>
#include "she/alleg4/display_events.h"
#include "she/alleg4/scancode.h"
#ifdef USE_KEY_POLLER
#include "she/alleg4/key_poller.h"
#endif
@ -201,24 +202,13 @@ public:
}
bool isKeyPressed(KeyScancode scancode) override {
#ifdef ALLEGRO_UNIX
if (scancode == kKeyLShift || scancode == kKeyRShift) {
return key_shifts & KB_SHIFT_FLAG;
}
else if (scancode == kKeyLControl || scancode == kKeyRControl) {
return key_shifts & KB_CTRL_FLAG;
}
else if (scancode == kKeyAlt) {
return key_shifts & KB_ALT_FLAG;
}
#endif
return key[scancode] ? true: false;
return key[she_to_alleg_scancode(scancode)] ? true: false;
}
int getUnicodeFromScancode(KeyScancode scancode) override {
if (isKeyPressed(scancode))
return scancode_to_ascii(scancode);
return scancode_to_ascii(she_to_alleg_scancode(scancode));
else
return false;
}