Merge branch 'master' into vulkan
This commit is contained in:
108
src/Nazara/Platform/SDL2/CursorImpl.cpp
Normal file
108
src/Nazara/Platform/SDL2/CursorImpl.cpp
Normal file
@@ -0,0 +1,108 @@
|
||||
// Copyright (C) 2017 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
#include <Nazara/Platform/Debug.hpp>
|
||||
#include <Nazara/Platform/SDL2/CursorImpl.hpp>
|
||||
#include <Nazara/Utility/Image.hpp>
|
||||
#include <Nazara/Utility/PixelFormat.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
bool CursorImpl::Create(const Image& cursor, int hotSpotX, int hotSpotY)
|
||||
{
|
||||
m_iconImage = cursor;
|
||||
if (!m_iconImage.Convert(PixelFormatType_BGRA8))
|
||||
{
|
||||
NazaraError("Failed to convert icon to BGRA8");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_icon = SDL_CreateRGBSurfaceWithFormatFrom(
|
||||
m_iconImage.GetPixels(),
|
||||
m_iconImage.GetWidth(),
|
||||
m_iconImage.GetHeight(),
|
||||
32,
|
||||
32 * m_iconImage.GetWidth(),
|
||||
SDL_PIXELFORMAT_BGRA8888
|
||||
);
|
||||
|
||||
if (!m_icon)
|
||||
{
|
||||
NazaraError(SDL_GetError());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
m_cursor = SDL_CreateColorCursor(m_icon, hotSpotX, hotSpotY);
|
||||
|
||||
if (!m_cursor)
|
||||
{
|
||||
NazaraError(SDL_GetError());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CursorImpl::Create(SystemCursor cursor)
|
||||
{
|
||||
if (cursor != SystemCursor_None)
|
||||
m_cursor = SDL_CreateSystemCursor(s_systemCursorIds[cursor]);
|
||||
else
|
||||
m_cursor = nullptr;
|
||||
|
||||
m_icon = nullptr;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CursorImpl::Destroy()
|
||||
{
|
||||
if (m_icon)
|
||||
SDL_FreeSurface(m_icon);
|
||||
|
||||
if (m_cursor)
|
||||
SDL_FreeCursor(m_cursor);
|
||||
}
|
||||
|
||||
SDL_Cursor* CursorImpl::GetCursor()
|
||||
{
|
||||
return m_cursor;
|
||||
}
|
||||
|
||||
bool CursorImpl::Initialize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void CursorImpl::Uninitialize()
|
||||
{
|
||||
}
|
||||
|
||||
std::array<SDL_SystemCursor, SystemCursor_Max + 1> CursorImpl::s_systemCursorIds =
|
||||
{
|
||||
SDL_SYSTEM_CURSOR_CROSSHAIR, // SystemCursor_Crosshair
|
||||
SDL_SYSTEM_CURSOR_ARROW, // SystemCursor_Default
|
||||
SDL_SYSTEM_CURSOR_HAND, // SystemCursor_Hand
|
||||
SDL_SYSTEM_CURSOR_ARROW, // SystemCursor_Help
|
||||
SDL_SYSTEM_CURSOR_SIZEALL, // SystemCursor_Move
|
||||
SDL_NUM_SYSTEM_CURSORS, // SystemCursor_None
|
||||
SDL_SYSTEM_CURSOR_HAND, // SystemCursor_Pointer
|
||||
SDL_SYSTEM_CURSOR_WAITARROW, // SystemCursor_Progress
|
||||
SDL_SYSTEM_CURSOR_SIZEWE, // SystemCursor_ResizeE
|
||||
SDL_SYSTEM_CURSOR_SIZENS, // SystemCursor_ResizeN
|
||||
SDL_SYSTEM_CURSOR_SIZENESW, // SystemCursor_ResizeNE
|
||||
SDL_SYSTEM_CURSOR_SIZENWSE, // SystemCursor_ResizeNW
|
||||
SDL_SYSTEM_CURSOR_SIZENS, // SystemCursor_ResizeS
|
||||
SDL_SYSTEM_CURSOR_SIZENWSE, // SystemCursor_ResizeSE
|
||||
SDL_SYSTEM_CURSOR_SIZENESW, // SystemCursor_ResizeSW
|
||||
SDL_SYSTEM_CURSOR_SIZEWE, // SystemCursor_ResizeW
|
||||
SDL_SYSTEM_CURSOR_IBEAM, // SystemCursor_Text
|
||||
SDL_SYSTEM_CURSOR_WAIT // SystemCursor_Wait
|
||||
};
|
||||
|
||||
static_assert(SystemCursor_Max + 1 == 18, "System cursor array is incomplete");
|
||||
}
|
||||
45
src/Nazara/Platform/SDL2/CursorImpl.hpp
Normal file
45
src/Nazara/Platform/SDL2/CursorImpl.hpp
Normal file
@@ -0,0 +1,45 @@
|
||||
// Copyright (C) 2020 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_CURSORIMPL_HPP
|
||||
#define NAZARA_CURSORIMPL_HPP
|
||||
|
||||
#include <array>
|
||||
#include <Nazara/Platform/Enums.hpp>
|
||||
#include <Nazara/Prerequisites.hpp>
|
||||
#include <Nazara/Utility/Image.hpp>
|
||||
|
||||
#include <SDL2/SDL_mouse.h>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class Image;
|
||||
|
||||
class CursorImpl
|
||||
{
|
||||
friend class Cursor;
|
||||
|
||||
public:
|
||||
bool Create(const Image& image, int hotSpotX, int hotSpotY);
|
||||
bool Create(SystemCursor cursor);
|
||||
|
||||
void Destroy();
|
||||
|
||||
SDL_Cursor* GetCursor();
|
||||
|
||||
private:
|
||||
static bool Initialize();
|
||||
static void Uninitialize();
|
||||
|
||||
SDL_Cursor* m_cursor = nullptr;
|
||||
SDL_Surface* m_icon = nullptr;
|
||||
Image m_iconImage;
|
||||
|
||||
static std::array<SDL_SystemCursor, SystemCursor_Max + 1> s_systemCursorIds;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // NAZARA_CURSORIMPL_HPP
|
||||
49
src/Nazara/Platform/SDL2/IconImpl.cpp
Normal file
49
src/Nazara/Platform/SDL2/IconImpl.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
// Copyright (C) 2017 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Platform/Debug.hpp>
|
||||
#include <Nazara/Platform/SDL2/IconImpl.hpp>
|
||||
#include <Nazara/Utility/Image.hpp>
|
||||
#include <Nazara/Utility/PixelFormat.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
bool IconImpl::Create(const Image& icon)
|
||||
{
|
||||
m_iconImage = icon;
|
||||
if (!m_iconImage.Convert(PixelFormatType_BGRA8))
|
||||
{
|
||||
NazaraError("Failed to convert icon to BGRA8");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_icon = SDL_CreateRGBSurfaceWithFormatFrom(
|
||||
m_iconImage.GetPixels(),
|
||||
m_iconImage.GetWidth(),
|
||||
m_iconImage.GetHeight(),
|
||||
32,
|
||||
32 * m_iconImage.GetWidth(),
|
||||
SDL_PIXELFORMAT_BGRA8888
|
||||
);
|
||||
|
||||
if (!m_icon)
|
||||
{
|
||||
NazaraError(SDL_GetError());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void IconImpl::Destroy()
|
||||
{
|
||||
SDL_FreeSurface(m_icon);
|
||||
m_iconImage.Destroy();
|
||||
}
|
||||
|
||||
SDL_Surface* IconImpl::GetIcon()
|
||||
{
|
||||
return m_icon;
|
||||
}
|
||||
}
|
||||
33
src/Nazara/Platform/SDL2/IconImpl.hpp
Normal file
33
src/Nazara/Platform/SDL2/IconImpl.hpp
Normal file
@@ -0,0 +1,33 @@
|
||||
// Copyright (C) 2020 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_ICONIMPL_HPP
|
||||
#define NAZARA_ICONIMPL_HPP
|
||||
|
||||
#include <Nazara/Prerequisites.hpp>
|
||||
#include <Nazara/Utility/Image.hpp>
|
||||
#include <SDL2/SDL_surface.h>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class Image;
|
||||
|
||||
class IconImpl
|
||||
{
|
||||
public:
|
||||
bool Create(const Image& image);
|
||||
void Destroy();
|
||||
|
||||
SDL_Surface* GetIcon();
|
||||
|
||||
private:
|
||||
|
||||
SDL_Surface* m_icon = nullptr;
|
||||
Image m_iconImage;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // NAZARA_ICONIMPL_HPP
|
||||
117
src/Nazara/Platform/SDL2/InputImpl.cpp
Normal file
117
src/Nazara/Platform/SDL2/InputImpl.cpp
Normal file
@@ -0,0 +1,117 @@
|
||||
// Copyright (C) 2017 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
#include <Nazara/Platform/Debug.hpp>
|
||||
#include <Nazara/Platform/SDL2/InputImpl.hpp>
|
||||
#include <Nazara/Platform/SDL2/SDLHelper.hpp>
|
||||
#include <Nazara/Platform/SDL2/WindowImpl.hpp>
|
||||
#include <Nazara/Platform/Window.hpp>
|
||||
#include <SDL2/SDL_keyboard.h>
|
||||
#include <SDL2/SDL_keycode.h>
|
||||
#include <SDL2/SDL_mouse.h>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
String EventImpl::GetKeyName(Keyboard::Scancode key)
|
||||
{
|
||||
SDL_Scancode scancode = SDLHelper::ToSDL(key);
|
||||
|
||||
String name;
|
||||
if (scancode != SDL_SCANCODE_UNKNOWN)
|
||||
name = SDL_GetScancodeName(scancode);
|
||||
|
||||
return !name.IsEmpty() ? name : String::Unicode("Unknown");
|
||||
}
|
||||
|
||||
String EventImpl::GetKeyName(Keyboard::VKey key)
|
||||
{
|
||||
SDL_Keycode vkey = SDLHelper::ToSDL(key);
|
||||
|
||||
String name;
|
||||
if (vkey != SDLK_UNKNOWN)
|
||||
name = SDL_GetKeyName(vkey);
|
||||
|
||||
return !name.IsEmpty() ? name : String::Unicode("Unknown");
|
||||
}
|
||||
|
||||
Vector2i EventImpl::GetMousePosition()
|
||||
{
|
||||
Vector2i pos;
|
||||
SDL_GetGlobalMouseState(&pos.x, &pos.y);
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
Vector2i EventImpl::GetMousePosition(const Window& relativeTo)
|
||||
{
|
||||
auto windowPos = relativeTo.GetPosition();
|
||||
auto mousePos = GetMousePosition();
|
||||
|
||||
return mousePos - windowPos;
|
||||
}
|
||||
|
||||
bool EventImpl::IsKeyPressed(Keyboard::Scancode key)
|
||||
{
|
||||
return SDL_GetKeyboardState(nullptr)[SDLHelper::ToSDL(key)];
|
||||
}
|
||||
|
||||
bool EventImpl::IsKeyPressed(Keyboard::VKey key)
|
||||
{
|
||||
return IsKeyPressed(ToScanCode(key));
|
||||
}
|
||||
|
||||
bool EventImpl::IsMouseButtonPressed(Mouse::Button button)
|
||||
{
|
||||
static int vButtons[Mouse::Max + 1] = {
|
||||
SDL_BUTTON_LMASK, // Button::Left
|
||||
SDL_BUTTON_MMASK, // Button::Middle
|
||||
SDL_BUTTON_RMASK, // Button::Right
|
||||
SDL_BUTTON_X1MASK, // Button::XButton1
|
||||
SDL_BUTTON_X2MASK // Button::XButton2
|
||||
};
|
||||
|
||||
return (SDL_GetGlobalMouseState(nullptr, nullptr) & vButtons[button]) != 0;
|
||||
}
|
||||
|
||||
bool EventImpl::SetRelativeMouseMode(bool relativeMouseMode)
|
||||
{
|
||||
return SDL_SetRelativeMouseMode((relativeMouseMode) ? SDL_TRUE : SDL_FALSE) == 0;
|
||||
}
|
||||
|
||||
void EventImpl::SetMousePosition(int x, int y)
|
||||
{
|
||||
if (SDL_WarpMouseGlobal(x, y) != 0)
|
||||
NazaraWarning(SDL_GetError());
|
||||
}
|
||||
|
||||
void EventImpl::SetMousePosition(int x, int y, const Window& relativeTo)
|
||||
{
|
||||
SDL_Window* handle = static_cast<const WindowImpl*>(relativeTo.GetImpl())->GetHandle();
|
||||
if (handle)
|
||||
SDL_WarpMouseInWindow(handle, x, y);
|
||||
else
|
||||
NazaraError("Invalid window handle");
|
||||
}
|
||||
|
||||
void EventImpl::StartTextInput()
|
||||
{
|
||||
SDL_StartTextInput();
|
||||
}
|
||||
|
||||
void EventImpl::StopTextInput()
|
||||
{
|
||||
SDL_StopTextInput();
|
||||
}
|
||||
|
||||
Keyboard::Scancode EventImpl::ToScanCode(Keyboard::VKey key)
|
||||
{
|
||||
return SDLHelper::FromSDL(SDL_GetScancodeFromKey(SDLHelper::ToSDL(key)));
|
||||
}
|
||||
|
||||
Keyboard::VKey EventImpl::ToVirtualKey(Keyboard::Scancode scancode)
|
||||
{
|
||||
return SDLHelper::FromSDL(SDL_GetKeyFromScancode(SDLHelper::ToSDL(scancode)));
|
||||
}
|
||||
}
|
||||
37
src/Nazara/Platform/SDL2/InputImpl.hpp
Normal file
37
src/Nazara/Platform/SDL2/InputImpl.hpp
Normal file
@@ -0,0 +1,37 @@
|
||||
// Copyright (C) 2020 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_INPUTIMPL_HPP
|
||||
#define NAZARA_INPUTIMPL_HPP
|
||||
|
||||
#include <Nazara/Core/String.hpp>
|
||||
#include <Nazara/Math/Vector2.hpp>
|
||||
#include <Nazara/Platform/Keyboard.hpp>
|
||||
#include <Nazara/Platform/Mouse.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class EventImpl
|
||||
{
|
||||
public:
|
||||
static String GetKeyName(Keyboard::Scancode scancode);
|
||||
static String GetKeyName(Keyboard::VKey key);
|
||||
static Vector2i GetMousePosition();
|
||||
static Vector2i GetMousePosition(const Window& relativeTo);
|
||||
static bool IsKeyPressed(Keyboard::Scancode key);
|
||||
static bool IsKeyPressed(Keyboard::VKey key);
|
||||
static bool IsMouseButtonPressed(Mouse::Button button);
|
||||
static bool SetRelativeMouseMode(bool relativeMouseMode);
|
||||
static void SetMousePosition(int x, int y);
|
||||
static void SetMousePosition(int x, int y, const Window& relativeTo);
|
||||
static void StartTextInput();
|
||||
static void StopTextInput();
|
||||
static Keyboard::Scancode ToScanCode(Keyboard::VKey key);
|
||||
static Keyboard::VKey ToVirtualKey(Keyboard::Scancode scancode);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // NAZARA_INPUTIMPL_HPP
|
||||
586
src/Nazara/Platform/SDL2/SDLHelper.cpp
Normal file
586
src/Nazara/Platform/SDL2/SDLHelper.cpp
Normal file
@@ -0,0 +1,586 @@
|
||||
// Copyright (C) 2017 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Platform/SDL2/SDLHelper.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
namespace
|
||||
{
|
||||
SDL_Scancode nzScancodeToSDLScanCode[static_cast<std::size_t>(Keyboard::VKey::Max) + 1] = {
|
||||
// Lettres
|
||||
SDL_SCANCODE_A, // Key::A
|
||||
SDL_SCANCODE_B, // Key::B
|
||||
SDL_SCANCODE_C, // Key::C
|
||||
SDL_SCANCODE_D, // Key::D
|
||||
SDL_SCANCODE_E, // Key::E
|
||||
SDL_SCANCODE_F, // Key::F
|
||||
SDL_SCANCODE_G, // Key::G
|
||||
SDL_SCANCODE_H, // Key::H
|
||||
SDL_SCANCODE_I, // Key::I
|
||||
SDL_SCANCODE_J, // Key::J
|
||||
SDL_SCANCODE_K, // Key::K
|
||||
SDL_SCANCODE_L, // Key::L
|
||||
SDL_SCANCODE_M, // Key::M
|
||||
SDL_SCANCODE_N, // Key::N
|
||||
SDL_SCANCODE_O, // Key::O
|
||||
SDL_SCANCODE_P, // Key::P
|
||||
SDL_SCANCODE_Q, // Key::Q
|
||||
SDL_SCANCODE_R, // Key::R
|
||||
SDL_SCANCODE_S, // Key::S
|
||||
SDL_SCANCODE_T, // Key::T
|
||||
SDL_SCANCODE_U, // Key::U
|
||||
SDL_SCANCODE_V, // Key::V
|
||||
SDL_SCANCODE_W, // Key::W
|
||||
SDL_SCANCODE_X, // Key::X
|
||||
SDL_SCANCODE_Y, // Key::Y
|
||||
SDL_SCANCODE_Z, // Key::Z
|
||||
|
||||
// Touches de fonction
|
||||
SDL_SCANCODE_F1, // Key::F1
|
||||
SDL_SCANCODE_F2, // Key::F2
|
||||
SDL_SCANCODE_F3, // Key::F3
|
||||
SDL_SCANCODE_F4, // Key::F4
|
||||
SDL_SCANCODE_F5, // Key::F5
|
||||
SDL_SCANCODE_F6, // Key::F6
|
||||
SDL_SCANCODE_F7, // Key::F7
|
||||
SDL_SCANCODE_F8, // Key::F8
|
||||
SDL_SCANCODE_F9, // Key::F9
|
||||
SDL_SCANCODE_F10, // Key::F10
|
||||
SDL_SCANCODE_F11, // Key::F11
|
||||
SDL_SCANCODE_F12, // Key::F12
|
||||
SDL_SCANCODE_F13, // Key::F13
|
||||
SDL_SCANCODE_F14, // Key::F14
|
||||
SDL_SCANCODE_F15, // Key::F15
|
||||
|
||||
// Flèches directionnelles
|
||||
SDL_SCANCODE_DOWN, // Key::Down
|
||||
SDL_SCANCODE_LEFT, // Key::Left
|
||||
SDL_SCANCODE_RIGHT, // Key::Right
|
||||
SDL_SCANCODE_UP, // Key::Up
|
||||
|
||||
// Pavé numérique
|
||||
SDL_SCANCODE_KP_PLUS, // Key::Add
|
||||
SDL_SCANCODE_KP_PERIOD, // Key::Decimal
|
||||
SDL_SCANCODE_KP_DIVIDE, // Key::Divide
|
||||
SDL_SCANCODE_KP_MULTIPLY, // Key::Multiply
|
||||
SDL_SCANCODE_KP_ENTER, // Key::NumpadReturn
|
||||
SDL_SCANCODE_KP_0, // Key::Numpad0
|
||||
SDL_SCANCODE_KP_1, // Key::Numpad1
|
||||
SDL_SCANCODE_KP_2, // Key::Numpad2
|
||||
SDL_SCANCODE_KP_3, // Key::Numpad3
|
||||
SDL_SCANCODE_KP_4, // Key::Numpad4
|
||||
SDL_SCANCODE_KP_5, // Key::Numpad5
|
||||
SDL_SCANCODE_KP_6, // Key::Numpad6
|
||||
SDL_SCANCODE_KP_7, // Key::Numpad7
|
||||
SDL_SCANCODE_KP_8, // Key::Numpad8
|
||||
SDL_SCANCODE_KP_9, // Key::Numpad9
|
||||
SDL_SCANCODE_KP_MINUS, // Key::Subtract
|
||||
|
||||
// Divers
|
||||
SDL_SCANCODE_BACKSLASH, // Key::Backslash
|
||||
SDL_SCANCODE_BACKSPACE, // Key::Backspace
|
||||
SDL_SCANCODE_CLEAR, // Key::Clear
|
||||
SDL_SCANCODE_COMMA, // Key::Comma,
|
||||
SDL_SCANCODE_MINUS, // Key::Dash
|
||||
SDL_SCANCODE_DELETE, // Key::Delete
|
||||
SDL_SCANCODE_END, // Key::End
|
||||
SDL_SCANCODE_EQUALS, // Key::Equal
|
||||
SDL_SCANCODE_ESCAPE, // Key::Escape
|
||||
SDL_SCANCODE_HOME, // Key::Home
|
||||
SDL_SCANCODE_INSERT, // Key::Insert
|
||||
SDL_SCANCODE_LALT, // Key::LAlt
|
||||
SDL_SCANCODE_LEFTBRACKET, // Key::LBracket
|
||||
SDL_SCANCODE_LCTRL, // Key::LControl
|
||||
SDL_SCANCODE_LSHIFT, // Key::LShift
|
||||
SDL_SCANCODE_LGUI, // Key::LSystem
|
||||
SDL_SCANCODE_0, // Key::Num0
|
||||
SDL_SCANCODE_1, // Key::Num1
|
||||
SDL_SCANCODE_2, // Key::Num2
|
||||
SDL_SCANCODE_3, // Key::Num3
|
||||
SDL_SCANCODE_4, // Key::Num4
|
||||
SDL_SCANCODE_5, // Key::Num5
|
||||
SDL_SCANCODE_6, // Key::Num6
|
||||
SDL_SCANCODE_7, // Key::Num7
|
||||
SDL_SCANCODE_8, // Key::Num8
|
||||
SDL_SCANCODE_9, // Key::Num9
|
||||
SDL_SCANCODE_PAGEDOWN, // Key::PageDown
|
||||
SDL_SCANCODE_PAGEUP, // Key::PageUp
|
||||
SDL_SCANCODE_PAUSE, // Key::Pause
|
||||
SDL_SCANCODE_PERIOD, // Key::Period
|
||||
SDL_SCANCODE_SYSREQ, // Key::Print
|
||||
SDL_SCANCODE_PRINTSCREEN, // Key::PrintScreen
|
||||
SDL_SCANCODE_APOSTROPHE, // Key::Quote
|
||||
SDL_SCANCODE_RALT, // Key::RAlt
|
||||
SDL_SCANCODE_RIGHTBRACKET, // Key::RBracket
|
||||
SDL_SCANCODE_RCTRL, // Key::RControl
|
||||
SDL_SCANCODE_RETURN, // Key::Return
|
||||
SDL_SCANCODE_RSHIFT, // Key::RShift
|
||||
SDL_SCANCODE_RGUI, // Key::RSystem
|
||||
SDL_SCANCODE_SEMICOLON, // Key::Semicolon
|
||||
SDL_SCANCODE_SLASH, // Key::Slash
|
||||
SDL_SCANCODE_SPACE, // Key::Space
|
||||
SDL_SCANCODE_TAB, // Key::Tab
|
||||
SDL_SCANCODE_GRAVE, // Key::Tilde
|
||||
SDL_SCANCODE_APPLICATION, // Key::Menu
|
||||
SDL_SCANCODE_NONUSBACKSLASH,// Key::ISOBackslash102
|
||||
|
||||
// Touches navigateur
|
||||
SDL_SCANCODE_AC_BACK, // Key::Browser_Back
|
||||
SDL_SCANCODE_AC_BOOKMARKS, // Key::Browser_Favorites
|
||||
SDL_SCANCODE_AC_FORWARD, // Key::Browser_Forward
|
||||
SDL_SCANCODE_AC_HOME, // Key::Browser_Home
|
||||
SDL_SCANCODE_AC_REFRESH, // Key::Browser_Refresh
|
||||
SDL_SCANCODE_AC_SEARCH, // Key::Browser_Search
|
||||
SDL_SCANCODE_AC_STOP, // Key::Browser_Stop
|
||||
|
||||
// Touches de contrôle
|
||||
SDL_SCANCODE_AUDIONEXT, // Key::Media_Next,
|
||||
SDL_SCANCODE_AUDIOPLAY, // Key::Media_PlayPause,
|
||||
SDL_SCANCODE_AUDIOPREV, // Key::Media_Previous,
|
||||
SDL_SCANCODE_AUDIOSTOP, // Key::Media_Stop,
|
||||
|
||||
// Touches de contrôle du volume
|
||||
SDL_SCANCODE_VOLUMEDOWN, // Key::Volume_Down
|
||||
SDL_SCANCODE_MUTE, // Key::Volume_Mute
|
||||
SDL_SCANCODE_VOLUMEUP, // Key::Volume_Up
|
||||
|
||||
// Touches à verrouillage
|
||||
SDL_SCANCODE_CAPSLOCK, // Key::CapsLock
|
||||
SDL_SCANCODE_NUMLOCKCLEAR, // Key::NumLock
|
||||
SDL_SCANCODE_SCROLLLOCK // Key::ScrollLock
|
||||
};
|
||||
SDL_Keycode nzVKeyToSDLVKey[static_cast<std::size_t>(Keyboard::VKey::Max) + 1] = {
|
||||
// Keys
|
||||
SDLK_a, // VKey::A
|
||||
SDLK_b, // VKey::B
|
||||
SDLK_c, // VKey::C
|
||||
SDLK_d, // VKey::D
|
||||
SDLK_e, // VKey::E
|
||||
SDLK_f, // VKey::F
|
||||
SDLK_g, // VKey::G
|
||||
SDLK_h, // VKey::H
|
||||
SDLK_i, // VKey::I
|
||||
SDLK_j, // VKey::J
|
||||
SDLK_k, // VKey::K
|
||||
SDLK_l, // VKey::L
|
||||
SDLK_m, // VKey::M
|
||||
SDLK_n, // VKey::N
|
||||
SDLK_o, // VKey::O
|
||||
SDLK_p, // VKey::P
|
||||
SDLK_q, // VKey::Q
|
||||
SDLK_r, // VKey::R
|
||||
SDLK_s, // VKey::S
|
||||
SDLK_t, // VKey::T
|
||||
SDLK_u, // VKey::U
|
||||
SDLK_v, // VKey::V
|
||||
SDLK_w, // VKey::W
|
||||
SDLK_x, // VKey::X
|
||||
SDLK_y, // VKey::Y
|
||||
SDLK_z, // VKey::Z
|
||||
|
||||
// Function keys
|
||||
SDLK_F1, // VKey::F1
|
||||
SDLK_F2, // VKey::F2
|
||||
SDLK_F3, // VKey::F3
|
||||
SDLK_F4, // VKey::F4
|
||||
SDLK_F5, // VKey::F5
|
||||
SDLK_F6, // VKey::F6
|
||||
SDLK_F7, // VKey::F7
|
||||
SDLK_F8, // VKey::F8
|
||||
SDLK_F9, // VKey::F9
|
||||
SDLK_F10, // VKey::F10
|
||||
SDLK_F11, // VKey::F11
|
||||
SDLK_F12, // VKey::F12
|
||||
SDLK_F13, // VKey::F13
|
||||
SDLK_F14, // VKey::F14
|
||||
SDLK_F15, // VKey::F15
|
||||
|
||||
// Arrows
|
||||
SDLK_DOWN, // VKey::Down
|
||||
SDLK_LEFT, // VKey::Left
|
||||
SDLK_RIGHT, // VKey::Right
|
||||
SDLK_UP, // VKey::Up
|
||||
|
||||
// Keypad
|
||||
SDLK_KP_PLUS, // VKey::Add
|
||||
SDLK_KP_PERIOD, // VKey::Decimal
|
||||
SDLK_KP_DIVIDE, // VKey::Divide
|
||||
SDLK_KP_MULTIPLY, // VKey::Multiply
|
||||
SDLK_KP_ENTER, // VKey::NumpadReturn
|
||||
SDLK_KP_0, // VKey::Numpad0
|
||||
SDLK_KP_1, // VKey::Numpad1
|
||||
SDLK_KP_2, // VKey::Numpad2
|
||||
SDLK_KP_3, // VKey::Numpad3
|
||||
SDLK_KP_4, // VKey::Numpad4
|
||||
SDLK_KP_5, // VKey::Numpad5
|
||||
SDLK_KP_6, // VKey::Numpad6
|
||||
SDLK_KP_7, // VKey::Numpad7
|
||||
SDLK_KP_8, // VKey::Numpad8
|
||||
SDLK_KP_9, // VKey::Numpad9
|
||||
SDLK_KP_MINUS, // VKey::Subtract
|
||||
|
||||
// Divers
|
||||
SDLK_BACKSLASH, // VKey::Backslash
|
||||
SDLK_BACKSPACE, // VKey::Backspace
|
||||
SDLK_CLEAR, // VKey::Clear
|
||||
SDLK_COMMA, // VKey::Comma,
|
||||
SDLK_MINUS, // VKey::Dash
|
||||
SDLK_DELETE, // VKey::Delete
|
||||
SDLK_END, // VKey::End
|
||||
SDLK_EQUALS, // VKey::Equal
|
||||
SDLK_ESCAPE, // VKey::Escape
|
||||
SDLK_HOME, // VKey::Home
|
||||
SDLK_INSERT, // VKey::Insert
|
||||
SDLK_LALT, // VKey::LAlt
|
||||
SDLK_LEFTBRACKET, // VKey::LBracket
|
||||
SDLK_LCTRL, // VKey::LControl
|
||||
SDLK_LSHIFT, // VKey::LShift
|
||||
SDLK_LGUI, // VKey::LSystem
|
||||
SDLK_0, // VKey::Num0
|
||||
SDLK_1, // VKey::Num1
|
||||
SDLK_2, // VKey::Num2
|
||||
SDLK_3, // VKey::Num3
|
||||
SDLK_4, // VKey::Num4
|
||||
SDLK_5, // VKey::Num5
|
||||
SDLK_6, // VKey::Num6
|
||||
SDLK_7, // VKey::Num7
|
||||
SDLK_8, // VKey::Num8
|
||||
SDLK_9, // VKey::Num9
|
||||
SDLK_PAGEDOWN, // VKey::PageDown
|
||||
SDLK_PAGEUP, // VKey::PageUp
|
||||
SDLK_PAUSE, // VKey::Pause
|
||||
SDLK_PERIOD, // VKey::Period
|
||||
SDLK_SYSREQ, // VKey::Print
|
||||
SDLK_PRINTSCREEN, // VKey::PrintScreen
|
||||
SDLK_QUOTE, // VKey::Quote
|
||||
SDLK_RALT, // VKey::RAlt
|
||||
SDLK_RIGHTBRACKET, // VKey::RBracket
|
||||
SDLK_RCTRL, // VKey::RControl
|
||||
SDLK_RETURN, // VKey::Return
|
||||
SDLK_RSHIFT, // VKey::RShift
|
||||
SDLK_RGUI, // VKey::RSystem
|
||||
SDLK_SEMICOLON, // VKey::Semicolon
|
||||
SDLK_SLASH, // VKey::Slash
|
||||
SDLK_SPACE, // VKey::Space
|
||||
SDLK_TAB, // VKey::Tab
|
||||
SDLK_BACKQUOTE, // VKey::Tilde
|
||||
SDLK_APPLICATION, // VKey::Menu
|
||||
SDLK_UNKNOWN, // VKey::ISOBackslash102
|
||||
|
||||
// Browser control
|
||||
SDLK_AC_BACK, // VKey::Browser_Back
|
||||
SDLK_AC_BOOKMARKS, // VKey::Browser_Favorites
|
||||
SDLK_AC_FORWARD, // VKey::Browser_Forward
|
||||
SDLK_AC_HOME, // VKey::Browser_Home
|
||||
SDLK_AC_REFRESH, // VKey::Browser_Refresh
|
||||
SDLK_AC_SEARCH, // VKey::Browser_Search
|
||||
SDLK_AC_STOP, // VKey::Browser_Stop
|
||||
|
||||
// Audio control
|
||||
SDLK_AUDIONEXT, // VKey::Media_Next,
|
||||
SDLK_AUDIOPLAY, // VKey::Media_PlayPause,
|
||||
SDLK_AUDIOPREV, // VKey::Media_Previous,
|
||||
SDLK_AUDIOSTOP, // VKey::Media_Stop,
|
||||
|
||||
// Volume control
|
||||
SDLK_VOLUMEDOWN, // VKey::Volume_Down
|
||||
SDLK_MUTE, // VKey::Volume_Mute
|
||||
SDLK_VOLUMEUP, // VKey::Volume_Up
|
||||
|
||||
// Lock keys
|
||||
SDLK_CAPSLOCK, // VKey::CapsLock
|
||||
SDLK_NUMLOCKCLEAR, // VKey::NumLock
|
||||
SDLK_SCROLLLOCK // VKey::ScrollLock
|
||||
};
|
||||
}
|
||||
|
||||
Keyboard::Scancode SDLHelper::FromSDL(SDL_Scancode scancode)
|
||||
{
|
||||
switch (scancode)
|
||||
{
|
||||
case SDL_SCANCODE_LCTRL: return Keyboard::Scancode::LControl;
|
||||
case SDL_SCANCODE_RCTRL: return Keyboard::Scancode::RControl;
|
||||
case SDL_SCANCODE_LALT: return Keyboard::Scancode::LAlt;
|
||||
case SDL_SCANCODE_RALT: return Keyboard::Scancode::RAlt;
|
||||
case SDL_SCANCODE_LSHIFT: return Keyboard::Scancode::LShift;
|
||||
case SDL_SCANCODE_RSHIFT: return Keyboard::Scancode::RShift;
|
||||
|
||||
case SDL_SCANCODE_0: return Keyboard::Scancode::Num0;
|
||||
case SDL_SCANCODE_1: return Keyboard::Scancode::Num1;
|
||||
case SDL_SCANCODE_2: return Keyboard::Scancode::Num2;
|
||||
case SDL_SCANCODE_3: return Keyboard::Scancode::Num3;
|
||||
case SDL_SCANCODE_4: return Keyboard::Scancode::Num4;
|
||||
case SDL_SCANCODE_5: return Keyboard::Scancode::Num5;
|
||||
case SDL_SCANCODE_6: return Keyboard::Scancode::Num6;
|
||||
case SDL_SCANCODE_7: return Keyboard::Scancode::Num7;
|
||||
case SDL_SCANCODE_8: return Keyboard::Scancode::Num8;
|
||||
case SDL_SCANCODE_9: return Keyboard::Scancode::Num9;
|
||||
case SDL_SCANCODE_A: return Keyboard::Scancode::A;
|
||||
case SDL_SCANCODE_B: return Keyboard::Scancode::B;
|
||||
case SDL_SCANCODE_C: return Keyboard::Scancode::C;
|
||||
case SDL_SCANCODE_D: return Keyboard::Scancode::D;
|
||||
case SDL_SCANCODE_E: return Keyboard::Scancode::E;
|
||||
case SDL_SCANCODE_F: return Keyboard::Scancode::F;
|
||||
case SDL_SCANCODE_G: return Keyboard::Scancode::G;
|
||||
case SDL_SCANCODE_H: return Keyboard::Scancode::H;
|
||||
case SDL_SCANCODE_I: return Keyboard::Scancode::I;
|
||||
case SDL_SCANCODE_J: return Keyboard::Scancode::J;
|
||||
case SDL_SCANCODE_K: return Keyboard::Scancode::K;
|
||||
case SDL_SCANCODE_L: return Keyboard::Scancode::L;
|
||||
case SDL_SCANCODE_M: return Keyboard::Scancode::M;
|
||||
case SDL_SCANCODE_N: return Keyboard::Scancode::N;
|
||||
case SDL_SCANCODE_O: return Keyboard::Scancode::O;
|
||||
case SDL_SCANCODE_P: return Keyboard::Scancode::P;
|
||||
case SDL_SCANCODE_Q: return Keyboard::Scancode::Q;
|
||||
case SDL_SCANCODE_R: return Keyboard::Scancode::R;
|
||||
case SDL_SCANCODE_S: return Keyboard::Scancode::S;
|
||||
case SDL_SCANCODE_T: return Keyboard::Scancode::T;
|
||||
case SDL_SCANCODE_U: return Keyboard::Scancode::U;
|
||||
case SDL_SCANCODE_V: return Keyboard::Scancode::V;
|
||||
case SDL_SCANCODE_W: return Keyboard::Scancode::W;
|
||||
case SDL_SCANCODE_X: return Keyboard::Scancode::X;
|
||||
case SDL_SCANCODE_Y: return Keyboard::Scancode::Y;
|
||||
case SDL_SCANCODE_Z: return Keyboard::Scancode::Z;
|
||||
case SDL_SCANCODE_KP_PLUS: return Keyboard::Scancode::Add;
|
||||
case SDL_SCANCODE_BACKSPACE: return Keyboard::Scancode::Backspace;
|
||||
case SDL_SCANCODE_AC_BACK: return Keyboard::Scancode::Browser_Back;
|
||||
case SDL_SCANCODE_AC_BOOKMARKS: return Keyboard::Scancode::Browser_Favorites;
|
||||
case SDL_SCANCODE_AC_FORWARD: return Keyboard::Scancode::Browser_Forward;
|
||||
case SDL_SCANCODE_AC_HOME: return Keyboard::Scancode::Browser_Home;
|
||||
case SDL_SCANCODE_AC_REFRESH: return Keyboard::Scancode::Browser_Refresh;
|
||||
case SDL_SCANCODE_AC_SEARCH: return Keyboard::Scancode::Browser_Search;
|
||||
case SDL_SCANCODE_AC_STOP: return Keyboard::Scancode::Browser_Stop;
|
||||
case SDL_SCANCODE_CAPSLOCK: return Keyboard::Scancode::CapsLock;
|
||||
case SDL_SCANCODE_CLEAR: return Keyboard::Scancode::Clear;
|
||||
case SDL_SCANCODE_KP_PERIOD: return Keyboard::Scancode::Decimal;
|
||||
case SDL_SCANCODE_DELETE: return Keyboard::Scancode::Delete;
|
||||
case SDL_SCANCODE_KP_DIVIDE: return Keyboard::Scancode::Divide;
|
||||
case SDL_SCANCODE_DOWN: return Keyboard::Scancode::Down;
|
||||
case SDL_SCANCODE_END: return Keyboard::Scancode::End;
|
||||
case SDL_SCANCODE_ESCAPE: return Keyboard::Scancode::Escape;
|
||||
case SDL_SCANCODE_F1: return Keyboard::Scancode::F1;
|
||||
case SDL_SCANCODE_F2: return Keyboard::Scancode::F2;
|
||||
case SDL_SCANCODE_F3: return Keyboard::Scancode::F3;
|
||||
case SDL_SCANCODE_F4: return Keyboard::Scancode::F4;
|
||||
case SDL_SCANCODE_F5: return Keyboard::Scancode::F5;
|
||||
case SDL_SCANCODE_F6: return Keyboard::Scancode::F6;
|
||||
case SDL_SCANCODE_F7: return Keyboard::Scancode::F7;
|
||||
case SDL_SCANCODE_F8: return Keyboard::Scancode::F8;
|
||||
case SDL_SCANCODE_F9: return Keyboard::Scancode::F9;
|
||||
case SDL_SCANCODE_F10: return Keyboard::Scancode::F10;
|
||||
case SDL_SCANCODE_F11: return Keyboard::Scancode::F11;
|
||||
case SDL_SCANCODE_F12: return Keyboard::Scancode::F12;
|
||||
case SDL_SCANCODE_F13: return Keyboard::Scancode::F13;
|
||||
case SDL_SCANCODE_F14: return Keyboard::Scancode::F14;
|
||||
case SDL_SCANCODE_F15: return Keyboard::Scancode::F15;
|
||||
case SDL_SCANCODE_HOME: return Keyboard::Scancode::Home;
|
||||
case SDL_SCANCODE_INSERT: return Keyboard::Scancode::Insert;
|
||||
case SDL_SCANCODE_LEFT: return Keyboard::Scancode::Left;
|
||||
case SDL_SCANCODE_LGUI: return Keyboard::Scancode::LSystem;
|
||||
case SDL_SCANCODE_AUDIONEXT: return Keyboard::Scancode::Media_Next;
|
||||
case SDL_SCANCODE_AUDIOPLAY: return Keyboard::Scancode::Media_Play;
|
||||
case SDL_SCANCODE_AUDIOPREV: return Keyboard::Scancode::Media_Previous;
|
||||
case SDL_SCANCODE_AUDIOSTOP: return Keyboard::Scancode::Media_Stop;
|
||||
case SDL_SCANCODE_KP_MULTIPLY: return Keyboard::Scancode::Multiply;
|
||||
case SDL_SCANCODE_PAGEDOWN: return Keyboard::Scancode::PageDown;
|
||||
case SDL_SCANCODE_KP_0: return Keyboard::Scancode::Numpad0;
|
||||
case SDL_SCANCODE_KP_1: return Keyboard::Scancode::Numpad1;
|
||||
case SDL_SCANCODE_KP_2: return Keyboard::Scancode::Numpad2;
|
||||
case SDL_SCANCODE_KP_3: return Keyboard::Scancode::Numpad3;
|
||||
case SDL_SCANCODE_KP_4: return Keyboard::Scancode::Numpad4;
|
||||
case SDL_SCANCODE_KP_5: return Keyboard::Scancode::Numpad5;
|
||||
case SDL_SCANCODE_KP_6: return Keyboard::Scancode::Numpad6;
|
||||
case SDL_SCANCODE_KP_7: return Keyboard::Scancode::Numpad7;
|
||||
case SDL_SCANCODE_KP_8: return Keyboard::Scancode::Numpad8;
|
||||
case SDL_SCANCODE_KP_9: return Keyboard::Scancode::Numpad9;
|
||||
case SDL_SCANCODE_NUMLOCKCLEAR: return Keyboard::Scancode::NumLock;
|
||||
case SDL_SCANCODE_SEMICOLON: return Keyboard::Scancode::Semicolon;
|
||||
case SDL_SCANCODE_SLASH: return Keyboard::Scancode::Slash;
|
||||
case SDL_SCANCODE_GRAVE: return Keyboard::Scancode::Tilde;
|
||||
case SDL_SCANCODE_APPLICATION: return Keyboard::Scancode::Menu;
|
||||
case SDL_SCANCODE_NONUSBACKSLASH: return Keyboard::Scancode::ISOBackslash102;
|
||||
case SDL_SCANCODE_LEFTBRACKET: return Keyboard::Scancode::LBracket;
|
||||
case SDL_SCANCODE_BACKSLASH: return Keyboard::Scancode::Backslash;
|
||||
case SDL_SCANCODE_RIGHTBRACKET: return Keyboard::Scancode::RBracket;
|
||||
case SDL_SCANCODE_APOSTROPHE: return Keyboard::Scancode::Quote;
|
||||
case SDL_SCANCODE_COMMA: return Keyboard::Scancode::Comma;
|
||||
case SDL_SCANCODE_MINUS: return Keyboard::Scancode::Dash;
|
||||
case SDL_SCANCODE_PERIOD: return Keyboard::Scancode::Period;
|
||||
case SDL_SCANCODE_EQUALS: return Keyboard::Scancode::Equal;
|
||||
case SDL_SCANCODE_RIGHT: return Keyboard::Scancode::Right;
|
||||
case SDL_SCANCODE_PAGEUP: return Keyboard::Scancode::PageUp;
|
||||
case SDL_SCANCODE_PAUSE: return Keyboard::Scancode::Pause;
|
||||
case SDL_SCANCODE_SYSREQ: return Keyboard::Scancode::Print;
|
||||
case SDL_SCANCODE_SCROLLLOCK: return Keyboard::Scancode::ScrollLock;
|
||||
case SDL_SCANCODE_PRINTSCREEN: return Keyboard::Scancode::PrintScreen;
|
||||
case SDL_SCANCODE_KP_MINUS: return Keyboard::Scancode::Subtract;
|
||||
case SDL_SCANCODE_RETURN: return Keyboard::Scancode::Return;
|
||||
case SDL_SCANCODE_KP_ENTER: return Keyboard::Scancode::NumpadReturn;
|
||||
case SDL_SCANCODE_RGUI: return Keyboard::Scancode::RSystem;
|
||||
case SDL_SCANCODE_SPACE: return Keyboard::Scancode::Space;
|
||||
case SDL_SCANCODE_TAB: return Keyboard::Scancode::Tab;
|
||||
case SDL_SCANCODE_UP: return Keyboard::Scancode::Up;
|
||||
case SDL_SCANCODE_VOLUMEDOWN: return Keyboard::Scancode::Volume_Down;
|
||||
case SDL_SCANCODE_MUTE: return Keyboard::Scancode::Volume_Mute;
|
||||
case SDL_SCANCODE_AUDIOMUTE: return Keyboard::Scancode::Volume_Mute;
|
||||
case SDL_SCANCODE_VOLUMEUP: return Keyboard::Scancode::Volume_Up;
|
||||
|
||||
default:
|
||||
return Keyboard::Scancode::Undefined;
|
||||
}
|
||||
}
|
||||
|
||||
Keyboard::VKey SDLHelper::FromSDL(SDL_Keycode keycode)
|
||||
{
|
||||
switch (keycode)
|
||||
{
|
||||
case SDLK_LCTRL: return Keyboard::VKey::LControl;
|
||||
case SDLK_RCTRL: return Keyboard::VKey::RControl;
|
||||
case SDLK_LALT: return Keyboard::VKey::LAlt;
|
||||
case SDLK_RALT: return Keyboard::VKey::RAlt;
|
||||
case SDLK_LSHIFT: return Keyboard::VKey::LShift;
|
||||
case SDLK_RSHIFT: return Keyboard::VKey::RShift;
|
||||
|
||||
case SDLK_0: return Keyboard::VKey::Num0;
|
||||
case SDLK_1: return Keyboard::VKey::Num1;
|
||||
case SDLK_2: return Keyboard::VKey::Num2;
|
||||
case SDLK_3: return Keyboard::VKey::Num3;
|
||||
case SDLK_4: return Keyboard::VKey::Num4;
|
||||
case SDLK_5: return Keyboard::VKey::Num5;
|
||||
case SDLK_6: return Keyboard::VKey::Num6;
|
||||
case SDLK_7: return Keyboard::VKey::Num7;
|
||||
case SDLK_8: return Keyboard::VKey::Num8;
|
||||
case SDLK_9: return Keyboard::VKey::Num9;
|
||||
case SDLK_a: return Keyboard::VKey::A;
|
||||
case SDLK_b: return Keyboard::VKey::B;
|
||||
case SDLK_c: return Keyboard::VKey::C;
|
||||
case SDLK_d: return Keyboard::VKey::D;
|
||||
case SDLK_e: return Keyboard::VKey::E;
|
||||
case SDLK_f: return Keyboard::VKey::F;
|
||||
case SDLK_g: return Keyboard::VKey::G;
|
||||
case SDLK_h: return Keyboard::VKey::H;
|
||||
case SDLK_i: return Keyboard::VKey::I;
|
||||
case SDLK_j: return Keyboard::VKey::J;
|
||||
case SDLK_k: return Keyboard::VKey::K;
|
||||
case SDLK_l: return Keyboard::VKey::L;
|
||||
case SDLK_m: return Keyboard::VKey::M;
|
||||
case SDLK_n: return Keyboard::VKey::N;
|
||||
case SDLK_o: return Keyboard::VKey::O;
|
||||
case SDLK_p: return Keyboard::VKey::P;
|
||||
case SDLK_q: return Keyboard::VKey::Q;
|
||||
case SDLK_r: return Keyboard::VKey::R;
|
||||
case SDLK_s: return Keyboard::VKey::S;
|
||||
case SDLK_t: return Keyboard::VKey::T;
|
||||
case SDLK_u: return Keyboard::VKey::U;
|
||||
case SDLK_v: return Keyboard::VKey::V;
|
||||
case SDLK_w: return Keyboard::VKey::W;
|
||||
case SDLK_x: return Keyboard::VKey::X;
|
||||
case SDLK_y: return Keyboard::VKey::Y;
|
||||
case SDLK_z: return Keyboard::VKey::Z;
|
||||
case SDLK_KP_PLUS: return Keyboard::VKey::Add;
|
||||
case SDLK_BACKSPACE: return Keyboard::VKey::Backspace;
|
||||
case SDLK_AC_BACK: return Keyboard::VKey::Browser_Back;
|
||||
case SDLK_AC_BOOKMARKS: return Keyboard::VKey::Browser_Favorites;
|
||||
case SDLK_AC_FORWARD: return Keyboard::VKey::Browser_Forward;
|
||||
case SDLK_AC_HOME: return Keyboard::VKey::Browser_Home;
|
||||
case SDLK_AC_REFRESH: return Keyboard::VKey::Browser_Refresh;
|
||||
case SDLK_AC_SEARCH: return Keyboard::VKey::Browser_Search;
|
||||
case SDLK_AC_STOP: return Keyboard::VKey::Browser_Stop;
|
||||
case SDLK_CAPSLOCK: return Keyboard::VKey::CapsLock;
|
||||
case SDLK_CLEAR: return Keyboard::VKey::Clear;
|
||||
case SDLK_KP_PERIOD: return Keyboard::VKey::Decimal;
|
||||
case SDLK_DELETE: return Keyboard::VKey::Delete;
|
||||
case SDLK_KP_DIVIDE: return Keyboard::VKey::Divide;
|
||||
case SDLK_DOWN: return Keyboard::VKey::Down;
|
||||
case SDLK_END: return Keyboard::VKey::End;
|
||||
case SDLK_ESCAPE: return Keyboard::VKey::Escape;
|
||||
case SDLK_F1: return Keyboard::VKey::F1;
|
||||
case SDLK_F2: return Keyboard::VKey::F2;
|
||||
case SDLK_F3: return Keyboard::VKey::F3;
|
||||
case SDLK_F4: return Keyboard::VKey::F4;
|
||||
case SDLK_F5: return Keyboard::VKey::F5;
|
||||
case SDLK_F6: return Keyboard::VKey::F6;
|
||||
case SDLK_F7: return Keyboard::VKey::F7;
|
||||
case SDLK_F8: return Keyboard::VKey::F8;
|
||||
case SDLK_F9: return Keyboard::VKey::F9;
|
||||
case SDLK_F10: return Keyboard::VKey::F10;
|
||||
case SDLK_F11: return Keyboard::VKey::F11;
|
||||
case SDLK_F12: return Keyboard::VKey::F12;
|
||||
case SDLK_F13: return Keyboard::VKey::F13;
|
||||
case SDLK_F14: return Keyboard::VKey::F14;
|
||||
case SDLK_F15: return Keyboard::VKey::F15;
|
||||
case SDLK_HOME: return Keyboard::VKey::Home;
|
||||
case SDLK_INSERT: return Keyboard::VKey::Insert;
|
||||
case SDLK_LEFT: return Keyboard::VKey::Left;
|
||||
case SDLK_LGUI: return Keyboard::VKey::LSystem;
|
||||
case SDLK_AUDIONEXT: return Keyboard::VKey::Media_Next;
|
||||
case SDLK_AUDIOPLAY: return Keyboard::VKey::Media_Play;
|
||||
case SDLK_AUDIOPREV: return Keyboard::VKey::Media_Previous;
|
||||
case SDLK_AUDIOSTOP: return Keyboard::VKey::Media_Stop;
|
||||
case SDLK_KP_MULTIPLY: return Keyboard::VKey::Multiply;
|
||||
case SDLK_PAGEDOWN: return Keyboard::VKey::PageDown;
|
||||
case SDLK_KP_0: return Keyboard::VKey::Numpad0;
|
||||
case SDLK_KP_1: return Keyboard::VKey::Numpad1;
|
||||
case SDLK_KP_2: return Keyboard::VKey::Numpad2;
|
||||
case SDLK_KP_3: return Keyboard::VKey::Numpad3;
|
||||
case SDLK_KP_4: return Keyboard::VKey::Numpad4;
|
||||
case SDLK_KP_5: return Keyboard::VKey::Numpad5;
|
||||
case SDLK_KP_6: return Keyboard::VKey::Numpad6;
|
||||
case SDLK_KP_7: return Keyboard::VKey::Numpad7;
|
||||
case SDLK_KP_8: return Keyboard::VKey::Numpad8;
|
||||
case SDLK_KP_9: return Keyboard::VKey::Numpad9;
|
||||
case SDLK_NUMLOCKCLEAR: return Keyboard::VKey::NumLock;
|
||||
case SDLK_SEMICOLON: return Keyboard::VKey::Semicolon;
|
||||
case SDLK_SLASH: return Keyboard::VKey::Slash;
|
||||
case SDLK_BACKQUOTE: return Keyboard::VKey::Tilde;
|
||||
case SDLK_APPLICATION: return Keyboard::VKey::Menu;
|
||||
case SDLK_LEFTBRACKET: return Keyboard::VKey::LBracket;
|
||||
case SDLK_BACKSLASH: return Keyboard::VKey::Backslash;
|
||||
case SDLK_RIGHTBRACKET: return Keyboard::VKey::RBracket;
|
||||
case SDLK_QUOTE: return Keyboard::VKey::Quote;
|
||||
case SDLK_COMMA: return Keyboard::VKey::Comma;
|
||||
case SDLK_MINUS: return Keyboard::VKey::Dash;
|
||||
case SDLK_PERIOD: return Keyboard::VKey::Period;
|
||||
case SDLK_EQUALS: return Keyboard::VKey::Equal;
|
||||
case SDLK_RIGHT: return Keyboard::VKey::Right;
|
||||
case SDLK_PAGEUP: return Keyboard::VKey::PageUp;
|
||||
case SDLK_PAUSE: return Keyboard::VKey::Pause;
|
||||
case SDLK_SYSREQ: return Keyboard::VKey::Print;
|
||||
case SDLK_SCROLLLOCK: return Keyboard::VKey::ScrollLock;
|
||||
case SDLK_PRINTSCREEN: return Keyboard::VKey::PrintScreen;
|
||||
case SDLK_KP_MINUS: return Keyboard::VKey::Subtract;
|
||||
case SDLK_RETURN: return Keyboard::VKey::Return;
|
||||
case SDLK_KP_ENTER: return Keyboard::VKey::NumpadReturn;
|
||||
case SDLK_RGUI: return Keyboard::VKey::RSystem;
|
||||
case SDLK_SPACE: return Keyboard::VKey::Space;
|
||||
case SDLK_TAB: return Keyboard::VKey::Tab;
|
||||
case SDLK_UP: return Keyboard::VKey::Up;
|
||||
case SDLK_VOLUMEDOWN: return Keyboard::VKey::Volume_Down;
|
||||
case SDLK_MUTE: return Keyboard::VKey::Volume_Mute;
|
||||
case SDLK_AUDIOMUTE: return Keyboard::VKey::Volume_Mute;
|
||||
case SDLK_VOLUMEUP: return Keyboard::VKey::Volume_Up;
|
||||
|
||||
default:
|
||||
return Keyboard::VKey::Undefined;
|
||||
}
|
||||
}
|
||||
|
||||
SDL_Scancode SDLHelper::ToSDL(Keyboard::Scancode scancode)
|
||||
{
|
||||
if (scancode == Keyboard::Scancode::Undefined)
|
||||
return SDL_SCANCODE_UNKNOWN;
|
||||
|
||||
return nzScancodeToSDLScanCode[static_cast<std::size_t>(scancode)];
|
||||
}
|
||||
|
||||
SDL_Keycode SDLHelper::ToSDL(Keyboard::VKey keycode)
|
||||
{
|
||||
if (keycode == Keyboard::VKey::Undefined)
|
||||
return SDLK_UNKNOWN;
|
||||
|
||||
return nzVKeyToSDLVKey[static_cast<std::size_t>(keycode)];
|
||||
}
|
||||
|
||||
}
|
||||
26
src/Nazara/Platform/SDL2/SDLHelper.hpp
Normal file
26
src/Nazara/Platform/SDL2/SDLHelper.hpp
Normal file
@@ -0,0 +1,26 @@
|
||||
// Copyright (C) 2017 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_SDL2_HELPER_HPP
|
||||
#define NAZARA_SDL2_HELPER_HPP
|
||||
|
||||
#include <Nazara/Platform/Keyboard.hpp>
|
||||
#include <SDL2/SDL_keycode.h>
|
||||
#include <SDL2/SDL_scancode.h>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class SDLHelper
|
||||
{
|
||||
public:
|
||||
static Keyboard::Scancode FromSDL(SDL_Scancode scancode);
|
||||
static Keyboard::VKey FromSDL(SDL_Keycode keycode);
|
||||
static SDL_Scancode ToSDL(Keyboard::Scancode scancode);
|
||||
static SDL_Keycode ToSDL(Keyboard::VKey keycode);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // NAZARA_SDL2_HELPER_HPP
|
||||
51
src/Nazara/Platform/SDL2/VideoModeImpl.cpp
Normal file
51
src/Nazara/Platform/SDL2/VideoModeImpl.cpp
Normal file
@@ -0,0 +1,51 @@
|
||||
// Copyright (C) 2017 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <algorithm>
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
#include <Nazara/Platform/Debug.hpp>
|
||||
#include <Nazara/Platform/SDL2/VideoModeImpl.hpp>
|
||||
#include <Nazara/Platform/VideoMode.hpp>
|
||||
#include <SDL2/SDL_video.h>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
VideoMode VideoModeImpl::GetDesktopMode()
|
||||
{
|
||||
SDL_DisplayMode mode;
|
||||
if (SDL_GetDesktopDisplayMode(0, &mode) != 0) // handle multi screen ?
|
||||
{
|
||||
NazaraError(SDL_GetError());
|
||||
|
||||
return VideoMode(800, 600, static_cast<UInt8>(32)); // useless ?
|
||||
}
|
||||
|
||||
return VideoMode(mode.w, mode.h, SDL_BITSPERPIXEL(mode.format));
|
||||
}
|
||||
|
||||
void VideoModeImpl::GetFullscreenModes(std::vector<VideoMode>& modes)
|
||||
{
|
||||
SDL_DisplayMode mode;
|
||||
|
||||
int numModes = SDL_GetNumDisplayModes(0);
|
||||
if (numModes < 0)
|
||||
{
|
||||
NazaraError(SDL_GetError());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < numModes; i++)
|
||||
{
|
||||
if (SDL_GetDisplayMode(0, i, &mode) != 0) // handle multi screen ?
|
||||
|
||||
NazaraError(SDL_GetError());
|
||||
|
||||
VideoMode vMode(mode.w, mode.h, SDL_BITSPERPIXEL(mode.format));
|
||||
|
||||
if (std::find(modes.begin(), modes.end(), vMode) == modes.end())
|
||||
modes.push_back(vMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
22
src/Nazara/Platform/SDL2/VideoModeImpl.hpp
Normal file
22
src/Nazara/Platform/SDL2/VideoModeImpl.hpp
Normal file
@@ -0,0 +1,22 @@
|
||||
// Copyright (C) 2020 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_VIDEOMODEIMPL_HPP
|
||||
#define NAZARA_VIDEOMODEIMPL_HPP
|
||||
|
||||
#include <Nazara/Platform/VideoMode.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class VideoModeImpl
|
||||
{
|
||||
public:
|
||||
static VideoMode GetDesktopMode();
|
||||
static void GetFullscreenModes(std::vector<VideoMode>& modes);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // NNAZARA_VIDEOMODEIMPL_HPP
|
||||
653
src/Nazara/Platform/SDL2/WindowImpl.cpp
Normal file
653
src/Nazara/Platform/SDL2/WindowImpl.cpp
Normal file
@@ -0,0 +1,653 @@
|
||||
// Copyright (C) 2017 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <cstdio>
|
||||
#include <memory>
|
||||
#include <Nazara/Core/ConditionVariable.hpp>
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
#include <Nazara/Core/ErrorFlags.hpp>
|
||||
#include <Nazara/Core/Mutex.hpp>
|
||||
#include <Nazara/Core/Thread.hpp>
|
||||
#include <Nazara/Platform/Config.hpp>
|
||||
#include <Nazara/Platform/Cursor.hpp>
|
||||
#include <Nazara/Platform/Icon.hpp>
|
||||
#include <Nazara/Platform/SDL2/CursorImpl.hpp>
|
||||
#include <Nazara/Platform/SDL2/IconImpl.hpp>
|
||||
#include <Nazara/Platform/SDL2/SDLHelper.hpp>
|
||||
#include <Nazara/Platform/SDL2/WindowImpl.hpp>
|
||||
#include <Nazara/Utility/Image.hpp>
|
||||
#include <SDL2/SDL.h>
|
||||
#include <SDL2/SDL_syswm.h>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
namespace
|
||||
{
|
||||
WindowImpl* fullscreenWindow = nullptr;
|
||||
|
||||
Mouse::Button SDLToNazaraButton(Uint8 sdlButton)
|
||||
{
|
||||
switch (sdlButton)
|
||||
{
|
||||
case SDL_BUTTON_LEFT:
|
||||
return Mouse::Left;
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
return Mouse::Middle;
|
||||
case SDL_BUTTON_RIGHT:
|
||||
return Mouse::Right;
|
||||
case SDL_BUTTON_X1:
|
||||
return Mouse::XButton1;
|
||||
case SDL_BUTTON_X2:
|
||||
return Mouse::XButton2;
|
||||
default:
|
||||
NazaraAssert(false, "Unkown mouse button");
|
||||
return Mouse::Left;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WindowImpl::WindowImpl(Window* parent) :
|
||||
m_cursor(nullptr),
|
||||
m_handle(nullptr),
|
||||
//m_callback(0),
|
||||
m_style(0),
|
||||
m_maxSize(-1),
|
||||
m_minSize(-1),
|
||||
m_parent(parent),
|
||||
m_keyRepeat(true),
|
||||
m_mouseInside(false),
|
||||
m_smoothScrolling(false),
|
||||
m_scrolling(0)
|
||||
{
|
||||
m_cursor = SDL_GetDefaultCursor();
|
||||
}
|
||||
|
||||
bool WindowImpl::Create(const VideoMode& mode, const String& title, WindowStyleFlags style)
|
||||
{
|
||||
bool async = (style & WindowStyle_Threaded) != 0;
|
||||
if (async)
|
||||
{
|
||||
NazaraError("SDL2 backend doesn't support asyn window for now");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool fullscreen = (style & WindowStyle_Fullscreen) != 0;
|
||||
|
||||
Uint32 winStyle = 0;
|
||||
|
||||
unsigned int x, y;
|
||||
unsigned int width = mode.width;
|
||||
unsigned int height = mode.height;
|
||||
if (fullscreen)
|
||||
winStyle |= SDL_WINDOW_FULLSCREEN;
|
||||
|
||||
// Testé une seconde fois car sa valeur peut changer
|
||||
if (fullscreen)
|
||||
{
|
||||
x = 0;
|
||||
y = 0;
|
||||
|
||||
fullscreenWindow = this;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(style & WindowStyle_Titlebar))
|
||||
winStyle |= SDL_WINDOW_BORDERLESS;
|
||||
|
||||
x = SDL_WINDOWPOS_CENTERED;
|
||||
y = SDL_WINDOWPOS_CENTERED;
|
||||
}
|
||||
|
||||
if (style & WindowStyle_Resizable)
|
||||
winStyle |= SDL_WINDOW_RESIZABLE;
|
||||
if (style & WindowStyle_Max)
|
||||
winStyle |= SDL_WINDOW_MAXIMIZED;
|
||||
|
||||
m_eventListener = true;
|
||||
m_ownsWindow = true;
|
||||
m_sizemove = false;
|
||||
m_style = style;
|
||||
|
||||
m_handle = SDL_CreateWindow(title.GetConstBuffer(), x, y, width, height, winStyle);
|
||||
|
||||
if (!m_handle)
|
||||
{
|
||||
NazaraError("Failed to create window: " + Error::GetLastSystemError());
|
||||
return false;
|
||||
}
|
||||
|
||||
PrepareWindow(fullscreen);
|
||||
|
||||
SDL_AddEventWatch(HandleEvent, this);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WindowImpl::Create(void* handle)
|
||||
{
|
||||
m_handle = SDL_CreateWindowFrom(handle);
|
||||
if (!m_handle || !SDL_GetWindowID(m_handle))
|
||||
{
|
||||
NazaraError("Invalid handle");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_eventListener = false;
|
||||
m_ownsWindow = false;
|
||||
m_sizemove = false;
|
||||
|
||||
SDL_GetWindowPosition(m_handle, &m_position.x, &m_position.y);
|
||||
|
||||
int width;
|
||||
int height;
|
||||
SDL_GetWindowSize(m_handle, &width, &height);
|
||||
|
||||
m_size.Set(width, height);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void WindowImpl::Destroy()
|
||||
{
|
||||
if (m_ownsWindow && m_handle)
|
||||
{
|
||||
SDL_DelEventWatch(HandleEvent, this);
|
||||
SDL_DestroyWindow(m_handle);
|
||||
}
|
||||
else
|
||||
SetEventListener(false);
|
||||
}
|
||||
|
||||
void WindowImpl::EnableKeyRepeat(bool enable)
|
||||
{
|
||||
m_keyRepeat = enable;
|
||||
}
|
||||
|
||||
void WindowImpl::EnableSmoothScrolling(bool enable)
|
||||
{
|
||||
m_smoothScrolling = enable;
|
||||
}
|
||||
|
||||
SDL_Window* WindowImpl::GetHandle() const
|
||||
{
|
||||
return m_handle;
|
||||
}
|
||||
|
||||
Vector2i WindowImpl::GetPosition() const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
|
||||
Vector2ui WindowImpl::GetSize() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
WindowStyleFlags WindowImpl::GetStyle() const
|
||||
{
|
||||
return m_style;
|
||||
}
|
||||
|
||||
WindowHandle WindowImpl::GetSystemHandle() const
|
||||
{
|
||||
SDL_SysWMinfo wmInfo;
|
||||
SDL_VERSION(&wmInfo.version);
|
||||
|
||||
if (SDL_GetWindowWMInfo(m_handle, &wmInfo) != SDL_TRUE)
|
||||
{
|
||||
ErrorFlags flags(ErrorFlag_ThrowException, true);
|
||||
NazaraError(std::string("failed to retrieve window manager info: ") + SDL_GetError());
|
||||
}
|
||||
|
||||
WindowHandle handle;
|
||||
|
||||
switch (wmInfo.subsystem)
|
||||
{
|
||||
#if defined(SDL_VIDEO_DRIVER_X11)
|
||||
case SDL_SYSWM_X11:
|
||||
{
|
||||
handle.type = WindowManager::X11;
|
||||
handle.x11.display = wmInfo.info.x11.display;
|
||||
handle.x11.window = wmInfo.info.x11.window;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#if defined(SDL_VIDEO_DRIVER_WAYLAND)
|
||||
case SDL_SYSWM_WAYLAND:
|
||||
{
|
||||
handle.type = WindowManager::Wayland;
|
||||
handle.wayland.display = wmInfo.info.wl.display;
|
||||
handle.wayland.surface = wmInfo.info.wl.surface;
|
||||
handle.wayland.shellSurface = wmInfo.info.wl.shell_surface;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#if defined(SDL_VIDEO_DRIVER_WINDOWS)
|
||||
case SDL_SYSWM_WINDOWS:
|
||||
{
|
||||
handle.type = WindowManager::Windows;
|
||||
handle.windows.window = wmInfo.info.win.window;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
{
|
||||
ErrorFlags flags(ErrorFlag_ThrowException, true);
|
||||
NazaraError("unhandled window subsystem");
|
||||
}
|
||||
}
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
String WindowImpl::GetTitle() const
|
||||
{
|
||||
return String::Unicode(SDL_GetWindowTitle(m_handle));
|
||||
}
|
||||
|
||||
bool WindowImpl::HasFocus() const
|
||||
{
|
||||
return (SDL_GetWindowFlags(m_handle) & SDL_WINDOW_INPUT_FOCUS) != 0;
|
||||
}
|
||||
|
||||
void WindowImpl::IgnoreNextMouseEvent(int mouseX, int mouseY)
|
||||
{
|
||||
m_ignoreNextMouseMove = true;
|
||||
// Petite astuce ... probablement foireuse dans certains cas :ahde:
|
||||
m_mousePos.x = mouseX;
|
||||
m_mousePos.y = mouseY;
|
||||
}
|
||||
|
||||
bool WindowImpl::IsMinimized() const
|
||||
{
|
||||
return (SDL_GetWindowFlags(m_handle) & SDL_WINDOW_MINIMIZED) != 0;
|
||||
}
|
||||
|
||||
bool WindowImpl::IsVisible() const
|
||||
{
|
||||
return (SDL_GetWindowFlags(m_handle) & SDL_WINDOW_SHOWN) != 0;
|
||||
}
|
||||
|
||||
void WindowImpl::RefreshCursor()
|
||||
{
|
||||
if (!m_cursor)
|
||||
{
|
||||
if (SDL_ShowCursor(SDL_DISABLE) < 0)
|
||||
NazaraWarning(SDL_GetError());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (SDL_ShowCursor(SDL_ENABLE) < 0)
|
||||
NazaraWarning(SDL_GetError());
|
||||
|
||||
SDL_SetCursor(m_cursor);
|
||||
}
|
||||
}
|
||||
|
||||
void WindowImpl::ProcessEvents(bool block)
|
||||
{
|
||||
SDL_PumpEvents();
|
||||
|
||||
|
||||
/*if (m_ownsWindow)
|
||||
{
|
||||
if (block)
|
||||
WaitMessage();
|
||||
|
||||
MSG message;
|
||||
while (PeekMessageW(&message, nullptr, 0, 0, PM_REMOVE))
|
||||
{
|
||||
TranslateMessage(&message);
|
||||
DispatchMessageW(&message);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
int SDLCALL WindowImpl::HandleEvent(void *userdata, SDL_Event* event)
|
||||
{
|
||||
try {
|
||||
auto window = static_cast<WindowImpl*>(userdata);
|
||||
|
||||
WindowEvent evt;
|
||||
evt.type = WindowEventType::WindowEventType_Max;
|
||||
|
||||
switch (event->type)
|
||||
{
|
||||
case SDL_WINDOWEVENT:
|
||||
if (SDL_GetWindowID(window->m_handle) != event->window.windowID)
|
||||
return 0;
|
||||
|
||||
switch (event->window.event)
|
||||
{
|
||||
case SDL_WINDOWEVENT_CLOSE:
|
||||
evt.type = Nz::WindowEventType::WindowEventType_Quit;
|
||||
break;
|
||||
case SDL_WINDOWEVENT_RESIZED:
|
||||
evt.type = Nz::WindowEventType::WindowEventType_Resized;
|
||||
|
||||
evt.size.width = static_cast<unsigned int>(std::max(0, event->window.data1));
|
||||
evt.size.height = static_cast<unsigned int>(std::max(0, event->window.data2));
|
||||
|
||||
window->m_size.Set(evt.size.width, evt.size.height);
|
||||
|
||||
break;
|
||||
case SDL_WINDOWEVENT_MOVED:
|
||||
evt.type = Nz::WindowEventType::WindowEventType_Moved;
|
||||
|
||||
evt.position.x = event->window.data1;
|
||||
evt.position.y = event->window.data2;
|
||||
|
||||
window->m_position.Set(event->window.data1, event->window.data2);
|
||||
|
||||
break;
|
||||
case SDL_WINDOWEVENT_FOCUS_GAINED:
|
||||
evt.type = Nz::WindowEventType::WindowEventType_GainedFocus;
|
||||
|
||||
break;
|
||||
case SDL_WINDOWEVENT_FOCUS_LOST:
|
||||
evt.type = Nz::WindowEventType::WindowEventType_LostFocus;
|
||||
|
||||
break;
|
||||
case SDL_WINDOWEVENT_ENTER:
|
||||
evt.type = Nz::WindowEventType::WindowEventType_MouseEntered;
|
||||
|
||||
break;
|
||||
case SDL_WINDOWEVENT_LEAVE:
|
||||
evt.type = Nz::WindowEventType::WindowEventType_MouseLeft;
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_MOUSEMOTION:
|
||||
if (SDL_GetWindowID(window->m_handle) != event->motion.windowID)
|
||||
return 0;
|
||||
|
||||
if (window->m_ignoreNextMouseMove /*&& event->motion.x == window->m_mousePos.x && event->motion.y == window->m_mousePos.y*/)
|
||||
{
|
||||
window->m_ignoreNextMouseMove = false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
evt.type = Nz::WindowEventType::WindowEventType_MouseMoved;
|
||||
|
||||
evt.mouseMove.x = event->motion.x;
|
||||
evt.mouseMove.y = event->motion.y;
|
||||
evt.mouseMove.deltaX = event->motion.xrel;
|
||||
evt.mouseMove.deltaY = event->motion.yrel;
|
||||
|
||||
break;
|
||||
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
if (SDL_GetWindowID(window->m_handle) != event->button.windowID)
|
||||
return 0;
|
||||
|
||||
evt.mouseButton.button = SDLToNazaraButton(event->button.button);
|
||||
evt.mouseButton.x = event->button.x;
|
||||
evt.mouseButton.y = event->button.y;
|
||||
|
||||
if (event->button.clicks % 2 == 0)
|
||||
{
|
||||
evt.type = Nz::WindowEventType::WindowEventType_MouseButtonDoubleClicked;
|
||||
|
||||
window->m_parent->PushEvent(evt);
|
||||
}
|
||||
|
||||
evt.type = Nz::WindowEventType::WindowEventType_MouseButtonPressed;
|
||||
|
||||
break;
|
||||
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
if (SDL_GetWindowID(window->m_handle) != event->button.windowID)
|
||||
return 0;
|
||||
|
||||
evt.mouseButton.button = SDLToNazaraButton(event->button.button);
|
||||
evt.mouseButton.x = event->button.x;
|
||||
evt.mouseButton.y = event->button.y;
|
||||
|
||||
evt.type = Nz::WindowEventType::WindowEventType_MouseButtonReleased;
|
||||
|
||||
break;
|
||||
|
||||
case SDL_MOUSEWHEEL:
|
||||
if (SDL_GetWindowID(window->m_handle) != event->wheel.windowID)
|
||||
return 0;
|
||||
|
||||
evt.type = Nz::WindowEventType::WindowEventType_MouseWheelMoved;
|
||||
|
||||
evt.mouseWheel.delta = event->wheel.y;
|
||||
|
||||
break;
|
||||
|
||||
case SDL_KEYDOWN:
|
||||
if (SDL_GetWindowID(window->m_handle) != event->key.windowID)
|
||||
return 0;
|
||||
|
||||
evt.type = WindowEventType_KeyPressed;
|
||||
|
||||
evt.key.scancode = SDLHelper::FromSDL(event->key.keysym.scancode);
|
||||
evt.key.virtualKey = SDLHelper::FromSDL(event->key.keysym.sym);
|
||||
evt.key.alt = (event->key.keysym.mod & KMOD_ALT) != 0;
|
||||
evt.key.control = (event->key.keysym.mod & KMOD_CTRL) != 0;
|
||||
evt.key.repeated = event->key.repeat != 0;
|
||||
evt.key.shift = (event->key.keysym.mod & KMOD_SHIFT) != 0;
|
||||
evt.key.system = (event->key.keysym.mod & KMOD_GUI) != 0;
|
||||
|
||||
// implements X11/Win32 APIs behavior for Enter and Backspace
|
||||
switch (evt.key.virtualKey) {
|
||||
case Nz::Keyboard::VKey::NumpadReturn:
|
||||
case Nz::Keyboard::VKey::Return:
|
||||
if (window->m_lastEditEventLength != 0)
|
||||
break;
|
||||
window->m_parent->PushEvent(evt);
|
||||
|
||||
evt.type = WindowEventType_TextEntered;
|
||||
|
||||
evt.text.character = U'\n';
|
||||
evt.text.repeated = event->key.repeat != 0;
|
||||
|
||||
window->m_parent->PushEvent(evt);
|
||||
|
||||
break;
|
||||
case Nz::Keyboard::VKey::Backspace:
|
||||
window->m_parent->PushEvent(evt);
|
||||
|
||||
evt.type = WindowEventType_TextEntered;
|
||||
|
||||
evt.text.character = U'\b';
|
||||
evt.text.repeated = event->key.repeat != 0;
|
||||
|
||||
window->m_parent->PushEvent(evt);
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SDL_KEYUP:
|
||||
if (SDL_GetWindowID(window->m_handle) != event->key.windowID)
|
||||
return 0;
|
||||
|
||||
evt.type = WindowEventType_KeyReleased;
|
||||
|
||||
evt.key.scancode = SDLHelper::FromSDL(event->key.keysym.scancode);
|
||||
evt.key.virtualKey = SDLHelper::FromSDL(event->key.keysym.sym);
|
||||
evt.key.alt = (event->key.keysym.mod & KMOD_ALT) != 0;
|
||||
evt.key.control = (event->key.keysym.mod & KMOD_CTRL) != 0;
|
||||
evt.key.repeated = event->key.repeat != 0;
|
||||
evt.key.shift = (event->key.keysym.mod & KMOD_SHIFT) != 0;
|
||||
evt.key.system = (event->key.keysym.mod & KMOD_GUI) != 0;
|
||||
|
||||
break;
|
||||
|
||||
case SDL_TEXTINPUT:
|
||||
if (SDL_GetWindowID(window->m_handle) != event->text.windowID)
|
||||
return 0;
|
||||
|
||||
evt.type = WindowEventType_TextEntered;
|
||||
evt.text.repeated = false;
|
||||
|
||||
for (decltype(evt.text.character) codepoint : String::Unicode(event->text.text).Simplify().GetUtf32String())
|
||||
{
|
||||
evt.text.character = codepoint;
|
||||
|
||||
window->m_parent->PushEvent(evt);
|
||||
}
|
||||
|
||||
// prevent post switch event
|
||||
evt.type = WindowEventType::WindowEventType_Max;
|
||||
|
||||
break;
|
||||
|
||||
case SDL_TEXTEDITING:
|
||||
if (SDL_GetWindowID(window->m_handle) != event->edit.windowID)
|
||||
return 0;
|
||||
|
||||
evt.type = WindowEventType_TextEdited;
|
||||
evt.edit.length = event->edit.length;
|
||||
window->m_lastEditEventLength = evt.edit.length;
|
||||
|
||||
for (std::size_t i = 0; i < 32; i++)
|
||||
{
|
||||
evt.edit.text[i] = event->edit.text[i];
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (evt.type != WindowEventType::WindowEventType_Max)
|
||||
window->m_parent->PushEvent(evt);
|
||||
}
|
||||
catch (std::exception e)
|
||||
{
|
||||
NazaraError(e.what());
|
||||
}
|
||||
catch (...) // Don't let any exceptions go thru C calls
|
||||
{
|
||||
NazaraError("An unknown error happened");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void WindowImpl::SetCursor(const Cursor& cursor)
|
||||
{
|
||||
m_cursor = cursor.m_impl->GetCursor();
|
||||
|
||||
if (HasFocus())
|
||||
RefreshCursor();
|
||||
}
|
||||
|
||||
void WindowImpl::SetEventListener(bool listener)
|
||||
{
|
||||
if (m_ownsWindow)
|
||||
return;
|
||||
|
||||
if (listener)
|
||||
SDL_AddEventWatch(HandleEvent, this);
|
||||
else
|
||||
SDL_DelEventWatch(HandleEvent, this);
|
||||
}
|
||||
|
||||
void WindowImpl::SetFocus()
|
||||
{
|
||||
SDL_RaiseWindow(m_handle);
|
||||
}
|
||||
|
||||
void WindowImpl::SetIcon(const Icon& icon)
|
||||
{
|
||||
SDL_SetWindowIcon(m_handle, icon.m_impl->GetIcon());
|
||||
}
|
||||
|
||||
void WindowImpl::SetMaximumSize(int width, int height)
|
||||
{
|
||||
SDL_SetWindowMaximumSize(m_handle, width, height);
|
||||
}
|
||||
|
||||
void WindowImpl::SetMinimumSize(int width, int height)
|
||||
{
|
||||
SDL_SetWindowMinimumSize(m_handle, width, height);
|
||||
}
|
||||
|
||||
void WindowImpl::SetPosition(int x, int y)
|
||||
{
|
||||
SDL_SetWindowPosition(m_handle, x, y);
|
||||
}
|
||||
|
||||
void WindowImpl::SetSize(unsigned int width, unsigned int height)
|
||||
{
|
||||
m_size.Set(width, height);
|
||||
SDL_SetWindowSize(m_handle, width, height);
|
||||
}
|
||||
|
||||
void WindowImpl::SetStayOnTop(bool stayOnTop)
|
||||
{
|
||||
NazaraDebug("Stay on top isn't supported by SDL2 backend for now");
|
||||
}
|
||||
|
||||
void WindowImpl::SetTitle(const String& title)
|
||||
{
|
||||
SDL_SetWindowTitle(m_handle, title.GetConstBuffer());
|
||||
}
|
||||
|
||||
void WindowImpl::SetVisible(bool visible)
|
||||
{
|
||||
visible ? SDL_ShowWindow(m_handle) : SDL_HideWindow(m_handle);
|
||||
}
|
||||
|
||||
void WindowImpl::PrepareWindow(bool fullscreen)
|
||||
{
|
||||
(void)fullscreen; // ignore param warning
|
||||
|
||||
SDL_GetWindowPosition(m_handle, &m_position.x, &m_position.y);
|
||||
|
||||
int width, height;
|
||||
SDL_GetWindowSize(m_handle, &width, &height);
|
||||
|
||||
m_size.Set(width, height);
|
||||
}
|
||||
|
||||
bool WindowImpl::Initialize()
|
||||
{
|
||||
if (SDL_Init(SDL_INIT_VIDEO) < 0)
|
||||
{
|
||||
NazaraError(SDL_GetError());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void WindowImpl::Uninitialize()
|
||||
{
|
||||
SDL_Quit();
|
||||
}
|
||||
|
||||
// not implemented for now, wait for mainloop friendly input
|
||||
//void WindowImpl::WindowThread(SDL_Window* handle, /*DWORD styleEx,*/ const String& title, /*DWORD style,*/ bool fullscreen, const Rectui& dimensions, WindowImpl* window, Mutex* mutex, ConditionVariable* condition)
|
||||
//{
|
||||
// SDL_Window& winHandle = *handle;
|
||||
/*winHandle = CreateWindowExW(styleEx, className, title.GetWideString().data(), style, dimensions.x, dimensions.y, dimensions.width, dimensions.height, nullptr, nullptr, GetModuleHandle(nullptr), window);
|
||||
|
||||
if (winHandle)
|
||||
window->PrepareWindow(fullscreen);
|
||||
|
||||
mutex->Lock();
|
||||
condition->Signal();
|
||||
mutex->Unlock(); // mutex and condition may be destroyed after this line
|
||||
|
||||
if (!winHandle)
|
||||
return;
|
||||
|
||||
while (window->m_threadActive)
|
||||
window->ProcessEvents(true);
|
||||
|
||||
DestroyWindow(winHandle);*/
|
||||
//}
|
||||
}
|
||||
108
src/Nazara/Platform/SDL2/WindowImpl.hpp
Normal file
108
src/Nazara/Platform/SDL2/WindowImpl.hpp
Normal file
@@ -0,0 +1,108 @@
|
||||
// Copyright (C) 2020 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Platform module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
// Interface inspirée de la SFML par Laurent Gomila
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_WINDOWIMPL_HPP
|
||||
#define NAZARA_WINDOWIMPL_HPP
|
||||
|
||||
#include <Nazara/Core/String.hpp>
|
||||
#include <Nazara/Math/Rect.hpp>
|
||||
#include <Nazara/Math/Vector2.hpp>
|
||||
#include <Nazara/Platform/Config.hpp>
|
||||
#include <Nazara/Platform/Keyboard.hpp>
|
||||
#include <Nazara/Platform/Mouse.hpp>
|
||||
#include <Nazara/Platform/VideoMode.hpp>
|
||||
#include <Nazara/Platform/Window.hpp>
|
||||
#include <Nazara/Prerequisites.hpp>
|
||||
#include <SDL2/SDL_events.h>
|
||||
#include <SDL2/SDL_keyboard.h>
|
||||
#include <SDL2/SDL_video.h>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class Window;
|
||||
|
||||
class WindowImpl
|
||||
{
|
||||
public:
|
||||
WindowImpl(Window* parent);
|
||||
WindowImpl(const WindowImpl&) = delete;
|
||||
WindowImpl(WindowImpl&&) = delete; ///TODO?
|
||||
~WindowImpl() = default;
|
||||
|
||||
bool Create(const VideoMode& mode, const String& title, WindowStyleFlags style);
|
||||
bool Create(void* handle);
|
||||
|
||||
void Destroy();
|
||||
|
||||
void EnableKeyRepeat(bool enable);
|
||||
void EnableSmoothScrolling(bool enable);
|
||||
|
||||
SDL_Window* GetHandle() const;
|
||||
Vector2i GetPosition() const;
|
||||
Vector2ui GetSize() const;
|
||||
WindowStyleFlags GetStyle() const;
|
||||
WindowHandle GetSystemHandle() const;
|
||||
String GetTitle() const;
|
||||
|
||||
bool HasFocus() const;
|
||||
|
||||
void IgnoreNextMouseEvent(int mouseX, int mouseY);
|
||||
|
||||
bool IsMinimized() const;
|
||||
bool IsVisible() const;
|
||||
|
||||
void RefreshCursor();
|
||||
|
||||
void ProcessEvents(bool block);
|
||||
|
||||
void SetCursor(const Cursor& cursor);
|
||||
void SetEventListener(bool listener);
|
||||
void SetFocus();
|
||||
void SetIcon(const Icon& icon);
|
||||
void SetMaximumSize(int width, int height);
|
||||
void SetMinimumSize(int width, int height);
|
||||
void SetPosition(int x, int y);
|
||||
void SetSize(unsigned int width, unsigned int height);
|
||||
void SetStayOnTop(bool stayOnTop);
|
||||
void SetTitle(const String& title);
|
||||
void SetVisible(bool visible);
|
||||
|
||||
WindowImpl& operator=(const WindowImpl&) = delete;
|
||||
WindowImpl& operator=(WindowImpl&&) = delete; ///TODO?
|
||||
|
||||
static bool Initialize();
|
||||
static void Uninitialize();
|
||||
|
||||
private:
|
||||
int static SDLCALL HandleEvent(void *userdata, SDL_Event * event);
|
||||
|
||||
void PrepareWindow(bool fullscreen);
|
||||
|
||||
int m_lastEditEventLength = 0;
|
||||
SDL_Cursor* m_cursor;
|
||||
SDL_Window* m_handle;
|
||||
WindowStyleFlags m_style;
|
||||
Vector2i m_maxSize;
|
||||
Vector2i m_minSize;
|
||||
Vector2i m_mousePos;
|
||||
Vector2i m_position;
|
||||
Vector2ui m_size;
|
||||
Window* m_parent;
|
||||
bool m_eventListener;
|
||||
bool m_ignoreNextMouseMove = false;
|
||||
bool m_keyRepeat;
|
||||
bool m_mouseInside;
|
||||
bool m_ownsWindow;
|
||||
bool m_sizemove;
|
||||
bool m_smoothScrolling;
|
||||
bool m_threadActive;
|
||||
short m_scrolling;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // NAZARA_WINDOWIMPL_HPP
|
||||
Reference in New Issue
Block a user