1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-10 06:39:49 +00:00

Fixed up the OIS->MyGUI event dispatcher

This commit is contained in:
Nicolay Korslund 2010-07-16 21:46:57 +02:00
parent 69a56e8677
commit fedb1a8025
3 changed files with 50 additions and 13 deletions

View File

@ -3,24 +3,59 @@
#include "events.hpp"
using namespace MyGUI;
using namespace OIS;
using namespace OEngine::GUI;
void EventInjector::event(Type type, int index, const void *p)
{
if(enabled) return;
if(!enabled) return;
KeyEvent *key = (KeyEvent*)p;
MouseEvent *mouse = (MouseEvent*)p;
MouseButtonID id = (MouseButtonID)index;
switch(type)
if(type & EV_Keyboard)
{
case EV_KeyDown: gui->injectKeyPress(key); break;
case EV_KeyUp: gui->injectKeyRelease(key); break;
case EV_MouseDown: gui->injectMousePress(mouse, id); break;
case EV_MouseUp: gui->injectMouseRelease(mouse, id); break;
case EV_MouseMove: gui->injectMouseMove(mouse); break;
KeyEvent *key = (KeyEvent*)p;
MyGUI::KeyCode code = MyGUI::KeyCode::Enum(key->key);
if(type == EV_KeyDown)
{
/*
This is just a first approximation. Apparently, OIS sucks
to such a degree that it's unable to provide any sort of
reliable unicode character on all platforms and for all
keys. At least that's what I surmise from the amount of
workaround that the MyGUI folks have put in place for
this. See Common/Input/OIS/InputManager.cpp in the MyGUI
sources for details. If this is indeed necessary (I
haven't tested that it is, although I have had dubious
experinces with OIS events in the past), then we should
probably adapt all that code here. Or even better,
directly into the OIS input manager in Mangle.
Note that all this only affects the 'text' field, and
should thus only affect typed text in input boxes (which
is still pretty significant.)
*/
MyGUI::Char text = (MyGUI::Char)key->text;
gui->injectKeyPress(code,text);
}
else
{
gui->injectKeyRelease(code);
}
}
else if(type & EV_Mouse)
{
MouseEvent *mouse = (MouseEvent*)p;
MyGUI::MouseButton id = MyGUI::MouseButton::Enum(index);
// I'm not sure these should be used directly, MyGUI demo code
// use local mouse position variables.
int mouseX = mouse->state.X.abs;
int mouseY = mouse->state.Y.abs;
if(type == EV_MouseDown)
gui->injectMousePress(mouseX, mouseY, id);
else if(type == EV_MouseUp)
gui->injectMouseRelease(mouseX, mouseY, id);
else
gui->injectMouseMove(mouseX, mouseY, mouse->state.Z.abs);
}
}

View File

@ -13,7 +13,7 @@ namespace GUI
{
/** Event handler that injects OIS events into MyGUI
*/
class EventInjector : Mangle::Input::Event
class EventInjector : public Mangle::Input::Event
{
MyGUI::Gui *gui;

View File

@ -29,6 +29,8 @@ namespace GUI
void setup(Ogre::RenderWindow *wnd, Ogre::SceneManager *mgr, bool logging=false);
void shutdown();
MyGUI::Gui *getGui() { return mGui; }
};
}}
#endif