mirror of
https://github.com/jmarshall23/CnC_Remastered_Collection.git
synced 2026-08-15 07:41:04 +02:00
Simplifying I/O flow
This commit is contained in:
+100
-83
@@ -2,20 +2,22 @@
|
||||
#include "EventQueue.h"
|
||||
|
||||
/*
|
||||
Clears the event queue
|
||||
Clears the event queue and frees memory
|
||||
*/
|
||||
void EventQueueClass::Clear()
|
||||
{
|
||||
while (this->eventQueue.size() > 0) this->eventQueue.pop();
|
||||
while (this->eventQueue.size() > 0) {
|
||||
this->eventQueue.pop();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Inserts a new KeyNumType event into the FIFO buffer. KeyNumType represents a key press or mouse button
|
||||
Input: KeyNumType + optional flag bits for SHIFT/CTRL/etc. cast as unsigned short
|
||||
Inserts a new event message event into the FIFO buffer.
|
||||
*/
|
||||
void EventQueueClass::Put(EventMessage* input)
|
||||
void EventQueueClass::Put(EventMessage input)
|
||||
{
|
||||
this->eventQueue.push(input);
|
||||
if ( Is_Buffer_Full() ) return;
|
||||
this->eventQueue.push( input );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -29,12 +31,12 @@ bool EventQueueClass::Check() const
|
||||
/*
|
||||
Get the first (unprocessed) element in the event queue
|
||||
*/
|
||||
EventMessage* EventQueueClass::Get()
|
||||
EventMessage EventQueueClass::Get()
|
||||
{
|
||||
// wait for buffer
|
||||
while( !this->Check() ) { }
|
||||
|
||||
EventMessage* returnVal = this->eventQueue.front();
|
||||
|
||||
EventMessage returnVal = this->eventQueue.front();
|
||||
this->eventQueue.pop();
|
||||
|
||||
return returnVal;
|
||||
@@ -46,95 +48,110 @@ EventMessage* EventQueueClass::Get()
|
||||
char EventQueueClass::Get_ASCII()
|
||||
{
|
||||
// get the last key from the buffer
|
||||
KeyboardEventMessage* keyMessage = dynamic_cast<KeyboardEventMessage*>( this->Get() );
|
||||
unsigned short key = keyMessage->Key;
|
||||
|
||||
// check if it is a keyboard
|
||||
if (key == KN_LMOUSE || key == KN_RMOUSE) return 0x0;
|
||||
|
||||
// convert to ascii
|
||||
char ascii;
|
||||
unsigned short key_raw = (UINT)(key & 0xFF);
|
||||
|
||||
// find the SDL keycode
|
||||
auto sdl_Key = sdl_keyMapping_reverse.find( (KeyNumType)key_raw );
|
||||
if (sdl_Key != sdl_keyMapping_reverse.end())
|
||||
{
|
||||
// convert to ascii
|
||||
ascii = SDL_GetKeyName( sdl_Key->first )[0];
|
||||
|
||||
// convert to uppercase
|
||||
if (keyMessage->Shift || keyMessage->CapsLock) ascii = toupper(ascii);
|
||||
}
|
||||
|
||||
return 0x0;
|
||||
EventMessage eventMessage = this->Get();
|
||||
return eventMessage.Keyboard.ASCII;
|
||||
}
|
||||
|
||||
KeyboardEventMessage::KeyboardEventMessage(KeyNumType key, bool shift, bool alt, bool control, bool capsLock) {
|
||||
EventMessage::EventMessage(KeyNumType key, char ascii, bool shift, bool alt, bool control, bool capsLock) {
|
||||
this->Clear();
|
||||
|
||||
this->Valid = true;
|
||||
this->EventType = EventMessageType::EVENT_KEYBOARD;
|
||||
this->Key = key;
|
||||
this->Shift = shift;
|
||||
this->Alt = alt;
|
||||
this->Control = control;
|
||||
this->CapsLock = capsLock;
|
||||
|
||||
this->Flags = 0;
|
||||
if (this->Shift) this->Flags |= KN_SHIFT_BIT;
|
||||
if (this->Alt) this->Flags |= KN_ALT_BIT;
|
||||
if (this->Control) this->Flags |= KN_CTRL_BIT;
|
||||
this->Keyboard.Key = key;
|
||||
this->Keyboard.Shift = shift;
|
||||
this->Keyboard.Alt = alt;
|
||||
this->Keyboard.Control = control;
|
||||
this->Keyboard.CapsLock = capsLock;
|
||||
this->Keyboard.ASCII = ascii;
|
||||
}
|
||||
|
||||
void KeyboardEventMessage::Key_Flags(KeyNumType& key, int& flags)
|
||||
EventMessage::EventMessage(int x, int y, unsigned short button, MouseButtonState buttonState)
|
||||
{
|
||||
flags = this->Flags;
|
||||
flags |= GadgetClass::KEYBOARD;
|
||||
this->Clear();
|
||||
|
||||
key = (KeyNumType)this->Key;
|
||||
}
|
||||
|
||||
MouseEventMessage::MouseEventMessage(int x, int y, unsigned short button, UserInputClass::MouseButtonState buttonState)
|
||||
{
|
||||
this->Valid = true;
|
||||
this->EventType = EventMessageType::EVENT_MOUSE;
|
||||
this->x = x;
|
||||
this->y = y;
|
||||
|
||||
this->Button = button;
|
||||
this->ButtonState = buttonState;
|
||||
this->Mouse.x = x;
|
||||
this->Mouse.y = y;
|
||||
this->Mouse.Button = button;
|
||||
this->Mouse.ButtonState = buttonState;
|
||||
|
||||
this->Flags = 0;
|
||||
}
|
||||
|
||||
void MouseEventMessage::Key_Flags(KeyNumType& key, int& flags)
|
||||
{
|
||||
key = (KeyNumType)this->Button;
|
||||
|
||||
if (key == KN_LMOUSE) {
|
||||
switch (this->ButtonState)
|
||||
{
|
||||
case UserInputClass::MouseButtonState::MOUSE_BUTTON_DOWN:
|
||||
flags = GadgetClass::LEFTPRESS;
|
||||
break;
|
||||
case UserInputClass::MouseButtonState::MOUSE_BUTTON_RELEASE:
|
||||
flags = GadgetClass::LEFTRELEASE;
|
||||
break;
|
||||
case UserInputClass::MouseButtonState::MOUSE_BUTTON_HOLD:
|
||||
flags = GadgetClass::LEFTHELD;
|
||||
break;
|
||||
}
|
||||
if (buttonState == MouseButtonState::MOUSE_BUTTON_UP) {
|
||||
this->Flags = (button == KN_LMOUSE) ? GadgetClass::LEFTUP : GadgetClass::RIGHTUP;
|
||||
}
|
||||
|
||||
if (key == KN_RMOUSE) {
|
||||
switch (this->ButtonState)
|
||||
{
|
||||
case UserInputClass::MouseButtonState::MOUSE_BUTTON_DOWN:
|
||||
flags = GadgetClass::RIGHTPRESS;
|
||||
break;
|
||||
case UserInputClass::MouseButtonState::MOUSE_BUTTON_RELEASE:
|
||||
flags = GadgetClass::RIGHTRELEASE;
|
||||
break;
|
||||
case UserInputClass::MouseButtonState::MOUSE_BUTTON_HOLD:
|
||||
flags = GadgetClass::RIGHTHELD;
|
||||
break;
|
||||
if (buttonState == MouseButtonState::MOUSE_BUTTON_DOWN) {
|
||||
this->Flags = (button == KN_LMOUSE) ? GadgetClass::LEFTPRESS : GadgetClass::RIGHTPRESS;
|
||||
}
|
||||
|
||||
if (buttonState == MouseButtonState::MOUSE_BUTTON_HOLD) {
|
||||
this->Flags = (button == KN_LMOUSE) ? GadgetClass::LEFTHELD : GadgetClass::RIGHTHELD;
|
||||
}
|
||||
|
||||
if (buttonState == MouseButtonState::MOUSE_BUTTON_RELEASE) {
|
||||
this->Flags = (button == KN_LMOUSE) ? GadgetClass::LEFTRELEASE : GadgetClass::RIGHTRELEASE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void EventMessage::Key_Flags(KeyNumType& key, int& flags)
|
||||
{
|
||||
if (this->EventType == EventMessageType::EVENT_KEYBOARD)
|
||||
{
|
||||
flags = this->Flags;
|
||||
flags |= GadgetClass::KEYBOARD;
|
||||
|
||||
unsigned short outputKey = this->Keyboard.Key;
|
||||
|
||||
if (this->Keyboard.Shift) outputKey |= KN_SHIFT_BIT;
|
||||
if (this->Keyboard.Alt) outputKey |= KN_ALT_BIT;
|
||||
if (this->Keyboard.Control) outputKey |= KN_CTRL_BIT;
|
||||
|
||||
key = (KeyNumType)outputKey;
|
||||
}
|
||||
|
||||
if (this->EventType == EventMessageType::EVENT_MOUSE)
|
||||
{
|
||||
key = (KeyNumType)this->Mouse.Button;
|
||||
|
||||
if (key == KN_LMOUSE) {
|
||||
switch (this->Mouse.ButtonState)
|
||||
{
|
||||
case MouseButtonState::MOUSE_BUTTON_UP:
|
||||
flags = GadgetClass::LEFTUP;
|
||||
break;
|
||||
case MouseButtonState::MOUSE_BUTTON_DOWN:
|
||||
flags = GadgetClass::LEFTPRESS;
|
||||
break;
|
||||
case MouseButtonState::MOUSE_BUTTON_RELEASE:
|
||||
flags = GadgetClass::LEFTRELEASE;
|
||||
break;
|
||||
case MouseButtonState::MOUSE_BUTTON_HOLD:
|
||||
flags = GadgetClass::LEFTHELD;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (key == KN_RMOUSE) {
|
||||
switch (this->Mouse.ButtonState)
|
||||
{
|
||||
case MouseButtonState::MOUSE_BUTTON_UP:
|
||||
flags = GadgetClass::LEFTUP;
|
||||
break;
|
||||
case MouseButtonState::MOUSE_BUTTON_DOWN:
|
||||
flags = GadgetClass::RIGHTPRESS;
|
||||
break;
|
||||
case MouseButtonState::MOUSE_BUTTON_RELEASE:
|
||||
flags = GadgetClass::RIGHTRELEASE;
|
||||
break;
|
||||
case MouseButtonState::MOUSE_BUTTON_HOLD:
|
||||
flags = GadgetClass::RIGHTHELD;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user