Get the wiimote new plugin working in linux. Wiimote emulation works at least. Real wiimotes don't.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5399 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Glenn Rice 2010-04-23 04:46:42 +00:00
parent 219e8beb6d
commit 05e3808beb
4 changed files with 71 additions and 9 deletions

View File

@ -16,9 +16,12 @@ Keyboard::Keyboard(Display* display) : m_display(display)
{ {
memset(&m_state, 0, sizeof(m_state)); memset(&m_state, 0, sizeof(m_state));
m_window = DefaultRootWindow(m_display);
int min_keycode, max_keycode; int min_keycode, max_keycode;
XDisplayKeycodes(m_display, &min_keycode, &max_keycode); XDisplayKeycodes(m_display, &min_keycode, &max_keycode);
// Keyboard Keys
for (int i = min_keycode; i <= max_keycode; ++i) for (int i = min_keycode; i <= max_keycode; ++i)
{ {
Key *temp_key = new Key(m_display, i); Key *temp_key = new Key(m_display, i);
@ -27,6 +30,13 @@ Keyboard::Keyboard(Display* display) : m_display(display)
else else
delete temp_key; delete temp_key;
} }
// Mouse Buttons
inputs.push_back(new Button(Button1Mask));
inputs.push_back(new Button(Button2Mask));
inputs.push_back(new Button(Button3Mask));
inputs.push_back(new Button(Button4Mask));
inputs.push_back(new Button(Button5Mask));
} }
Keyboard::~Keyboard() Keyboard::~Keyboard()
@ -48,7 +58,9 @@ bool Keyboard::UpdateInput()
{ {
XQueryKeymap(m_display, m_state.keyboard); XQueryKeymap(m_display, m_state.keyboard);
// mouse stuff in here too int root_x, root_y, win_x, win_y;
Window root, child;
XQueryPointer(m_display, m_window, &root, &child, &root_x, &root_y, &win_x, &win_y, &m_state.buttons);
return true; return true;
} }
@ -101,10 +113,30 @@ ControlState Keyboard::Key::GetState(const State* const state)
return (state->keyboard[m_keycode/8] & (1 << (m_keycode%8))) != 0; return (state->keyboard[m_keycode/8] & (1 << (m_keycode%8))) != 0;
} }
ControlState Keyboard::Button::GetState(const State* const state)
{
return ((state->buttons & m_index) > 0);
}
std::string Keyboard::Key::GetName() const std::string Keyboard::Key::GetName() const
{ {
return m_keyname; return m_keyname;
} }
std::string Keyboard::Button::GetName() const
{
char button = '0';
switch (m_index)
{
case Button1Mask: button = '1'; break;
case Button2Mask: button = '2'; break;
case Button3Mask: button = '3'; break;
case Button4Mask: button = '4'; break;
case Button5Mask: button = '5'; break;
}
return std::string("Button ") + button;
}
} }
} }

View File

@ -22,7 +22,7 @@ class Keyboard : public ControllerInterface::Device
struct State struct State
{ {
char keyboard[32]; char keyboard[32];
// mouse crap will go here unsigned int buttons;
}; };
class Input : public ControllerInterface::Device::Input class Input : public ControllerInterface::Device::Input
@ -46,11 +46,26 @@ class Keyboard : public ControllerInterface::Device
private: private:
Display* const m_display; Display* const m_display;
const KeyCode m_keycode; const KeyCode m_keycode;
std::string m_keyname; std::string m_keyname;
}; };
class Button : public Input
{
friend class Keyboard;
public:
std::string GetName() const;
protected:
Button(const unsigned int index) : m_index(index) {}
ControlState GetState(const State* const state);
private:
const unsigned int m_index;
};
bool UpdateInput(); bool UpdateInput();
bool UpdateOutput(); bool UpdateOutput();
@ -66,6 +81,7 @@ class Keyboard : public ControllerInterface::Device
int GetId() const; int GetId() const;
private: private:
Window m_window;
Display* m_display; Display* m_display;
State m_state; State m_state;
}; };

View File

@ -321,7 +321,7 @@ void Initialize(void *init)
{ {
g_PADInitialize = (SPADInitialize*)init; g_PADInitialize = (SPADInitialize*)init;
if ( false == g_plugin.controller_interface.IsInit() ) if ( false == g_plugin.controller_interface.IsInit() )
InitPlugin( ((SPADInitialize*)init)->hWnd ); InitPlugin( g_PADInitialize->hWnd );
} }
// ___________________________________________________________________________ // ___________________________________________________________________________

View File

@ -12,6 +12,10 @@
#if defined(HAVE_X11) && HAVE_X11 #if defined(HAVE_X11) && HAVE_X11
#include <X11/Xlib.h> #include <X11/Xlib.h>
#if defined(HAVE_WX) && HAVE_WX
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#endif
#endif #endif
#define PLUGIN_VERSION 0x0100 #define PLUGIN_VERSION 0x0100
@ -232,14 +236,24 @@ void GetDllInfo(PLUGIN_INFO* _pPluginInfo)
// //
void DllConfig(HWND _hParent) void DllConfig(HWND _hParent)
{ {
#if defined(HAVE_WX) && HAVE_WX
bool was_init = false; bool was_init = false;
if ( g_plugin.controller_interface.IsInit() ) // hack for showing dialog when game isnt running if ( g_plugin.controller_interface.IsInit() ) // hack for showing dialog when game isnt running
was_init = true; was_init = true;
else else
InitPlugin( _hParent ); {
#if defined(HAVE_X11) && HAVE_X11
Window win = GDK_WINDOW_XID(GTK_WIDGET(_hParent)->window);
g_WiimoteInitialize.hWnd = GDK_WINDOW_XDISPLAY(GTK_WIDGET(_hParent)->window);
g_WiimoteInitialize.pXWindow = &win;
InitPlugin(g_WiimoteInitialize.hWnd);
#else
InitPlugin(_hParent);
#endif
}
// copied from GCPad // copied from GCPad
#if defined(HAVE_WX) && HAVE_WX
wxWindow *frame = GetParentedWxWindow(_hParent); wxWindow *frame = GetParentedWxWindow(_hParent);
ConfigDialog* m_ConfigFrame = new ConfigDialog( frame, g_plugin, PLUGIN_FULL_NAME, was_init ); ConfigDialog* m_ConfigFrame = new ConfigDialog( frame, g_plugin, PLUGIN_FULL_NAME, was_init );
@ -260,11 +274,11 @@ void DllConfig(HWND _hParent)
m_ConfigFrame->Destroy(); m_ConfigFrame->Destroy();
m_ConfigFrame = NULL; m_ConfigFrame = NULL;
frame->Destroy(); frame->Destroy();
#endif
// / // /
if ( false == was_init ) // hack for showing dialog when game isnt running if ( false == was_init ) // hack for showing dialog when game isnt running
DeInitPlugin(); DeInitPlugin();
#endif
} }
// ___________________________________________________________________________ // ___________________________________________________________________________
@ -299,7 +313,7 @@ void Initialize(void *init)
{ {
g_WiimoteInitialize = *(SWiimoteInitialize*)init; g_WiimoteInitialize = *(SWiimoteInitialize*)init;
if ( false == g_plugin.controller_interface.IsInit() ) if ( false == g_plugin.controller_interface.IsInit() )
InitPlugin( ((SPADInitialize*)init)->hWnd ); InitPlugin( g_WiimoteInitialize.hWnd );
} }
// ___________________________________________________________________________ // ___________________________________________________________________________