mirror of
https://github.com/love2d/love.git
synced 2026-08-19 12:14:20 +02:00
Make the new event sink thread-safe (hopefully) and make small usability fixes
This commit is contained in:
@@ -20,6 +20,9 @@
|
|||||||
|
|
||||||
#include "Event.h"
|
#include "Event.h"
|
||||||
|
|
||||||
|
using love::thread::Mutex;
|
||||||
|
using love::thread::Lock;
|
||||||
|
|
||||||
namespace love
|
namespace love
|
||||||
{
|
{
|
||||||
namespace event
|
namespace event
|
||||||
@@ -48,7 +51,7 @@ namespace event
|
|||||||
|
|
||||||
int Message::toLua(lua_State *L)
|
int Message::toLua(lua_State *L)
|
||||||
{
|
{
|
||||||
lua_pushstring(L, name.c_str());
|
luax_pushstring(L, name);
|
||||||
for (int i = 0; i < nargs; i++)
|
for (int i = 0; i < nargs; i++)
|
||||||
args[i]->toLua(L);
|
args[i]->toLua(L);
|
||||||
return nargs+1;
|
return nargs+1;
|
||||||
@@ -56,7 +59,7 @@ namespace event
|
|||||||
|
|
||||||
Message *Message::fromLua(lua_State *L, int n)
|
Message *Message::fromLua(lua_State *L, int n)
|
||||||
{
|
{
|
||||||
std::string name = luaL_checkstring(L, n);
|
std::string name = luax_checkstring(L, n);
|
||||||
n++;
|
n++;
|
||||||
Message *m = new Message(name);
|
Message *m = new Message(name);
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
@@ -65,7 +68,11 @@ namespace event
|
|||||||
break;
|
break;
|
||||||
m->args[i] = Variant::fromLua(L, n+i);
|
m->args[i] = Variant::fromLua(L, n+i);
|
||||||
if (!m->args[i])
|
if (!m->args[i])
|
||||||
break;
|
{
|
||||||
|
delete m;
|
||||||
|
luaL_error(L, "Argument %d can't be stored safely\nExpected boolean, number, string or userdata.", n+i);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
m->nargs++;
|
m->nargs++;
|
||||||
}
|
}
|
||||||
return m;
|
return m;
|
||||||
@@ -77,12 +84,14 @@ namespace event
|
|||||||
|
|
||||||
void Event::push(Message *msg)
|
void Event::push(Message *msg)
|
||||||
{
|
{
|
||||||
|
Lock lock(mutex);
|
||||||
msg->retain();
|
msg->retain();
|
||||||
queue.push(msg);
|
queue.push(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Event::poll(Message *&msg)
|
bool Event::poll(Message *&msg)
|
||||||
{
|
{
|
||||||
|
Lock lock(mutex);
|
||||||
if (queue.empty())
|
if (queue.empty())
|
||||||
return false;
|
return false;
|
||||||
msg = queue.front();
|
msg = queue.front();
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include <common/Variant.h>
|
#include <common/Variant.h>
|
||||||
#include <keyboard/Keyboard.h>
|
#include <keyboard/Keyboard.h>
|
||||||
#include <mouse/Mouse.h>
|
#include <mouse/Mouse.h>
|
||||||
|
#include <thread/threads.h>
|
||||||
|
|
||||||
// STL
|
// STL
|
||||||
#include <queue>
|
#include <queue>
|
||||||
@@ -66,6 +67,7 @@ namespace event
|
|||||||
static bool getConstant(love::keyboard::Keyboard::Key in, const char *& out);
|
static bool getConstant(love::keyboard::Keyboard::Key in, const char *& out);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
thread::Mutex mutex;
|
||||||
std::queue<Message*> queue;
|
std::queue<Message*> queue;
|
||||||
static StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM>::Entry buttonEntries[];
|
static StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM>::Entry buttonEntries[];
|
||||||
static StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM> buttons;
|
static StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM> buttons;
|
||||||
|
|||||||
Reference in New Issue
Block a user