mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-12-14 12:09:36 +00:00
Add some initial widget functionality (prefs partly working)
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
#include "PLBigEndian.h"
|
||||
#include "PLEventQueue.h"
|
||||
#include "PLKeyEncoding.h"
|
||||
#include "PLSysCalls.h"
|
||||
#include "PLTimeTaggedVOSEvent.h"
|
||||
#include "QDManager.h"
|
||||
#include "Vec2i.h"
|
||||
@@ -65,113 +66,6 @@ static bool ConvertFilenameToSafePStr(const char *str, uint8_t *pstr)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void TranslateMouseInputEvent(const GpVOSEvent &vosEventBase, uint32_t timestamp, PortabilityLayer::EventQueue *queue)
|
||||
{
|
||||
const GpMouseInputEvent &vosEvent = vosEventBase.m_event.m_mouseInputEvent;
|
||||
|
||||
bool requeue = false;
|
||||
if (vosEvent.m_button == GpMouseButtons::kLeft)
|
||||
{
|
||||
if (vosEvent.m_eventType == GpMouseEventTypes::kDown)
|
||||
requeue = true;
|
||||
else if (vosEvent.m_eventType == GpMouseEventTypes::kUp)
|
||||
requeue = true;
|
||||
}
|
||||
else if (vosEvent.m_eventType == GpMouseEventTypes::kMove)
|
||||
requeue = true;
|
||||
|
||||
if (requeue)
|
||||
{
|
||||
if (TimeTaggedVOSEvent *evt = queue->Enqueue())
|
||||
*evt = TimeTaggedVOSEvent::Create(vosEventBase, timestamp);
|
||||
}
|
||||
}
|
||||
|
||||
static void TranslateGamepadInputEvent(const GpGamepadInputEvent &vosEvent, PortabilityLayer::EventQueue *queue)
|
||||
{
|
||||
PortabilityLayer::InputManager *inputManager = PortabilityLayer::InputManager::GetInstance();
|
||||
|
||||
inputManager->ApplyGamepadEvent(vosEvent);
|
||||
|
||||
PL_DEAD(queue);
|
||||
}
|
||||
|
||||
static void TranslateKeyboardInputEvent(const GpVOSEvent &vosEventBase, uint32_t timestamp, PortabilityLayer::EventQueue *queue)
|
||||
{
|
||||
const GpKeyboardInputEvent &vosEvent = vosEventBase.m_event.m_keyboardInputEvent;
|
||||
|
||||
PL_STATIC_ASSERT((1 << PL_INPUT_PLAYER_INDEX_BITS) >= PL_INPUT_MAX_PLAYERS);
|
||||
PL_STATIC_ASSERT((1 << PL_INPUT_TYPE_CODE_BITS) >= KeyEventType_Count);
|
||||
|
||||
PortabilityLayer::InputManager *inputManager = PortabilityLayer::InputManager::GetInstance();
|
||||
|
||||
if (vosEvent.m_eventType == GpKeyboardInputEventTypes::kUp || vosEvent.m_eventType == GpKeyboardInputEventTypes::kDown)
|
||||
inputManager->ApplyKeyboardEvent(vosEvent);
|
||||
|
||||
if (TimeTaggedVOSEvent *evt = queue->Enqueue())
|
||||
*evt = TimeTaggedVOSEvent::Create(vosEventBase, timestamp);
|
||||
}
|
||||
|
||||
intptr_t PackVOSKeyCode(const GpKeyboardInputEvent &vosEvent)
|
||||
{
|
||||
switch (vosEvent.m_keyIDSubset)
|
||||
{
|
||||
case GpKeyIDSubsets::kASCII:
|
||||
return PL_KEY_ASCII(vosEvent.m_key.m_asciiChar);
|
||||
case GpKeyIDSubsets::kFKey:
|
||||
return PL_KEY_FKEY(vosEvent.m_key.m_fKey);
|
||||
case GpKeyIDSubsets::kNumPadNumber:
|
||||
return PL_KEY_NUMPAD_NUMBER(vosEvent.m_key.m_numPadNumber);
|
||||
case GpKeyIDSubsets::kSpecial:
|
||||
return PL_KEY_SPECIAL_ENCODE(vosEvent.m_key.m_specialKey);
|
||||
break;
|
||||
case GpKeyIDSubsets::kNumPadSpecial:
|
||||
return PL_KEY_NUMPAD_SPECIAL_ENCODE(vosEvent.m_key.m_numPadSpecialKey);
|
||||
break;
|
||||
case GpKeyIDSubsets::kUnicode:
|
||||
for (int i = 128; i < 256; i++)
|
||||
{
|
||||
if (PortabilityLayer::MacRoman::g_toUnicode[i] == vosEvent.m_key.m_unicodeChar)
|
||||
return PL_KEY_MACROMAN(i);
|
||||
}
|
||||
break;
|
||||
case GpKeyIDSubsets::kGamepadButton:
|
||||
return PL_KEY_GAMEPAD_BUTTON_ENCODE(vosEvent.m_key.m_gamepadKey.m_button, vosEvent.m_key.m_gamepadKey.m_player);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void TranslateVOSEvent(const GpVOSEvent *vosEvent, uint32_t timestamp, PortabilityLayer::EventQueue *queue)
|
||||
{
|
||||
switch (vosEvent->m_eventType)
|
||||
{
|
||||
case GpVOSEventTypes::kMouseInput:
|
||||
TranslateMouseInputEvent(*vosEvent, timestamp, queue);
|
||||
break;
|
||||
case GpVOSEventTypes::kKeyboardInput:
|
||||
TranslateKeyboardInputEvent(*vosEvent, timestamp, queue);
|
||||
break;
|
||||
case GpVOSEventTypes::kGamepadInput:
|
||||
TranslateGamepadInputEvent(vosEvent->m_event.m_gamepadInputEvent, queue);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void ImportVOSEvents(uint32_t timestamp)
|
||||
{
|
||||
PortabilityLayer::EventQueue *plQueue = PortabilityLayer::EventQueue::GetInstance();
|
||||
|
||||
PortabilityLayer::HostVOSEventQueue *evtQueue = PortabilityLayer::HostVOSEventQueue::GetInstance();
|
||||
while (const GpVOSEvent *evt = evtQueue->GetNext())
|
||||
{
|
||||
TranslateVOSEvent(evt, timestamp, plQueue);
|
||||
evtQueue->DischargeOne();
|
||||
}
|
||||
}
|
||||
|
||||
void InitCursor()
|
||||
{
|
||||
PortabilityLayer::HostDisplayDriver::GetInstance()->SetStandardCursor(EGpStandardCursors::kArrow);
|
||||
@@ -244,15 +138,7 @@ void DisposeCCursor(CCrsrHandle handle)
|
||||
|
||||
void Delay(int ticks, UInt32 *endTickCount)
|
||||
{
|
||||
if (ticks > 0)
|
||||
{
|
||||
PortabilityLayer::HostSuspendCallArgument args[1];
|
||||
args[0].m_uint = static_cast<uint32_t>(ticks);
|
||||
|
||||
PortabilityLayer::SuspendApplication(PortabilityLayer::HostSuspendCallID_Delay, args, nullptr);
|
||||
|
||||
ImportVOSEvents(PortabilityLayer::DisplayDeviceManager::GetInstance()->GetTickCount());
|
||||
}
|
||||
PLSysCalls::Sleep(ticks);
|
||||
|
||||
if (endTickCount)
|
||||
*endTickCount = PortabilityLayer::DisplayDeviceManager::GetInstance()->GetTickCount();
|
||||
@@ -718,30 +604,6 @@ void DisposeDirectoryFiles(DirectoryFileListEntry *firstDFL)
|
||||
}
|
||||
}
|
||||
|
||||
short StringWidth(const PLPasStr &str)
|
||||
{
|
||||
const PortabilityLayer::QDState *qdState = PortabilityLayer::QDManager::GetInstance()->GetState();
|
||||
PortabilityLayer::FontManager *fontManager = PortabilityLayer::FontManager::GetInstance();
|
||||
|
||||
PortabilityLayer::FontFamily *fontFamily = qdState->m_fontFamily;
|
||||
|
||||
if (!fontFamily)
|
||||
return 0;
|
||||
|
||||
const int variationFlags = qdState->m_fontVariationFlags;
|
||||
const int fontSize = qdState->m_fontSize;
|
||||
|
||||
PortabilityLayer::RenderedFont *rfont = fontManager->GetRenderedFontFromFamily(fontFamily, fontSize, variationFlags);
|
||||
if (!rfont)
|
||||
return 0;
|
||||
|
||||
const size_t width = rfont->MeasureString(str.UChars(), str.Length());
|
||||
if (width > SHRT_MAX)
|
||||
return SHRT_MAX;
|
||||
|
||||
return static_cast<short>(width);
|
||||
}
|
||||
|
||||
void GetMouse(Point *point)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
@@ -965,3 +827,8 @@ DrawSurface *Window::GetDrawSurface() const
|
||||
{
|
||||
return const_cast<DrawSurface*>(&m_graf);
|
||||
}
|
||||
|
||||
Point Window::MouseToLocal(const GpMouseInputEvent &evt) const
|
||||
{
|
||||
return Point::Create(evt.m_x - m_wmX, evt.m_y - m_wmY);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user