mirror of
https://github.com/mkxp-z/mkxp-z.git
synced 2025-04-21 21:52:04 +02:00
sync thread access to text input buffer
This commit is contained in:
parent
10f3d2655d
commit
69a89cf87f
3 changed files with 635 additions and 609 deletions
|
@ -20,11 +20,13 @@
|
|||
*/
|
||||
|
||||
#include "binding-util.h"
|
||||
#include "exception.h"
|
||||
#include "input.h"
|
||||
#include "util/exception.h"
|
||||
#include "input/input.h"
|
||||
#include "sharedstate.h"
|
||||
#include "src/util/util.h"
|
||||
|
||||
#include "eventthread.h"
|
||||
|
||||
#include <SDL_joystick.h>
|
||||
#include <string>
|
||||
|
||||
|
@ -323,10 +325,10 @@ RB_METHOD(inputSetMode) {
|
|||
|
||||
RB_METHOD(inputGets) {
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
shState->eThread().lockText(true);
|
||||
VALUE ret = rb_utf8_str_new_cstr(shState->input().getText());
|
||||
shState->input().clearText();
|
||||
|
||||
shState->eThread().lockText(false);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,23 +1,23 @@
|
|||
/*
|
||||
** eventthread.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
** eventthread.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "eventthread.h"
|
||||
|
||||
|
@ -52,8 +52,8 @@ typedef void (ALC_APIENTRY *LPALCDEVICEPAUSESOFT) (ALCdevice *device);
|
|||
typedef void (ALC_APIENTRY *LPALCDEVICERESUMESOFT) (ALCdevice *device);
|
||||
|
||||
#define AL_DEVICE_PAUSE_FUN \
|
||||
AL_FUN(DevicePause, LPALCDEVICEPAUSESOFT) \
|
||||
AL_FUN(DeviceResume, LPALCDEVICERESUMESOFT)
|
||||
AL_FUN(DevicePause, LPALCDEVICEPAUSESOFT) \
|
||||
AL_FUN(DeviceResume, LPALCDEVICERESUMESOFT)
|
||||
|
||||
struct ALCFunctions
|
||||
{
|
||||
|
@ -116,11 +116,18 @@ bool EventThread::allocUserEvents()
|
|||
}
|
||||
|
||||
EventThread::EventThread()
|
||||
: js(0),
|
||||
fullscreen(false),
|
||||
showCursor(true),
|
||||
joystickConnected(false)
|
||||
{}
|
||||
: js(0),
|
||||
fullscreen(false),
|
||||
showCursor(true),
|
||||
joystickConnected(false)
|
||||
{
|
||||
textInputLock = SDL_CreateMutex();
|
||||
}
|
||||
|
||||
EventThread::~EventThread()
|
||||
{
|
||||
SDL_DestroyMutex(textInputLock);
|
||||
}
|
||||
|
||||
void EventThread::process(RGSSThreadData &rtData)
|
||||
{
|
||||
|
@ -266,8 +273,11 @@ void EventThread::process(RGSSThreadData &rtData)
|
|||
break;
|
||||
|
||||
case SDL_TEXTINPUT :
|
||||
if (textInputBuffer.size() < 512)
|
||||
lockText(true);
|
||||
if (textInputBuffer.size() < 512) {
|
||||
textInputBuffer += event.text.text;
|
||||
}
|
||||
lockText(false);
|
||||
break;
|
||||
|
||||
case SDL_QUIT :
|
||||
|
@ -459,12 +469,16 @@ void EventThread::process(RGSSThreadData &rtData)
|
|||
if (event.user.code)
|
||||
{
|
||||
SDL_StartTextInput();
|
||||
lockText(true);
|
||||
textInputBuffer.clear();
|
||||
lockText(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
SDL_StopTextInput();
|
||||
lockText(true);
|
||||
textInputBuffer.clear();
|
||||
lockText(false);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -584,13 +598,13 @@ int EventThread::eventFilter(void *data, SDL_Event *event)
|
|||
Debug() << "SDL_APP_LOWMEMORY";
|
||||
return 0;
|
||||
|
||||
// case SDL_RENDER_TARGETS_RESET :
|
||||
// Debug() << "****** SDL_RENDER_TARGETS_RESET";
|
||||
// return 0;
|
||||
// case SDL_RENDER_TARGETS_RESET :
|
||||
// Debug() << "****** SDL_RENDER_TARGETS_RESET";
|
||||
// return 0;
|
||||
|
||||
// case SDL_RENDER_DEVICE_RESET :
|
||||
// Debug() << "****** SDL_RENDER_DEVICE_RESET";
|
||||
// return 0;
|
||||
// case SDL_RENDER_DEVICE_RESET :
|
||||
// Debug() << "****** SDL_RENDER_DEVICE_RESET";
|
||||
// return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
@ -766,6 +780,11 @@ void EventThread::notifyGameScreenChange(const SDL_Rect &screen)
|
|||
SDL_PushEvent(&event);
|
||||
}
|
||||
|
||||
void EventThread::lockText(bool lock)
|
||||
{
|
||||
lock ? SDL_LockMutex(textInputLock) : SDL_UnlockMutex(textInputLock);
|
||||
}
|
||||
|
||||
void SyncPoint::haltThreads()
|
||||
{
|
||||
if (mainSync.locked)
|
||||
|
|
|
@ -77,10 +77,13 @@ public:
|
|||
static TouchState touchState;
|
||||
|
||||
std::string textInputBuffer;
|
||||
void lockText(bool lock);
|
||||
|
||||
|
||||
static bool allocUserEvents();
|
||||
|
||||
EventThread();
|
||||
~EventThread();
|
||||
|
||||
void process(RGSSThreadData &rtData);
|
||||
void cleanup();
|
||||
|
@ -129,6 +132,8 @@ private:
|
|||
|
||||
AtomicFlag msgBoxDone;
|
||||
|
||||
SDL_mutex *textInputLock;
|
||||
|
||||
struct
|
||||
{
|
||||
AtomicFlag sendUpdates;
|
||||
|
|
Loading…
Add table
Reference in a new issue