void GSPanel::OnFocus( wxFocusEvent& evt ) { evt.Skip(); m_HasFocus = true; if( g_Conf->GSWindow.AlwaysHideMouse ) { SetCursor( wxCursor(wxCURSOR_BLANK) ); m_CursorShown = false; } else DoShowMouse(); #if defined(__unix__) // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // the event before the pad see it. So you send key event directly to the pad. if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) { keyEvent event = {0, 9}; // X equivalent of FocusIn; PADWriteEvent(event); } #endif //Console.Warning("GS frame > focus set"); UpdateScreensaver(); }
void GSPanel::OnKeyDown( wxKeyEvent& evt ) { // HACK: Legacy PAD plugins expect PCSX2 to ignore keyboard messages on the GS Window while // the PAD plugin is open, so ignore here (PCSX2 will direct messages routed from PAD directly // to the APP level message handler, which in turn routes them right back here -- yes it's // silly, but oh well). #ifdef __linux__ // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // the event before the pad see it. So you send key event directly to the pad. if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) { keyEvent event; event.key = evt.GetRawKeyCode(); if (evt.GetEventType() == wxEVT_KEY_UP) event.evt = 3; // X equivalent of KEYRELEASE; else if (evt.GetEventType() == wxEVT_KEY_DOWN) event.evt = 2; // X equivalent of KEYPRESS; else event.evt = 0; PADWriteEvent(event); } #endif if( (PADopen != NULL) && CoreThread.IsOpen() ) return; DirectKeyCommand( evt ); }
void GSPanel::OnMouseEvent( wxMouseEvent& evt ) { if( IsBeingDeleted() ) return; // Do nothing for left-button event if (!evt.Button(wxMOUSE_BTN_LEFT)) { evt.Skip(); DoShowMouse(); } #if defined(__unix__) // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // the event before the pad see it. So you send key event directly to the pad. if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) { keyEvent event; // FIXME how to handle double click ??? if (evt.ButtonDown()) { event.evt = 4; // X equivalent of ButtonPress event.key = evt.GetButton(); } else if (evt.ButtonUp()) { event.evt = 5; // X equivalent of ButtonRelease event.key = evt.GetButton(); } else if (evt.Moving() || evt.Dragging()) { event.evt = 6; // X equivalent of MotionNotify long x,y; evt.GetPosition(&x, &y); wxCoord w, h; wxWindowDC dc( this ); dc.GetSize(&w, &h); // Special case to allow continuous mouvement near the border if (x < 10) x = 0; else if (x > (w-10)) x = 0xFFFF; if (y < 10) y = 0; else if (y > (w-10)) y = 0xFFFF; // For compatibility purpose with the existing structure. I decide to reduce // the position to 16 bits. event.key = ((y & 0xFFFF) << 16) | (x & 0xFFFF); } else { event.key = 0; event.evt = 0; } PADWriteEvent(event); } #endif }
void GSPanel::OnFocusLost( wxFocusEvent& evt ) { evt.Skip(); m_HasFocus = false; DoShowMouse(); #ifdef __linux__ // TODO OSX handle properly these HACK2: otherwise events are not recognized // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // the event before the pad see it. So you send key event directly to the pad. if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) { keyEvent event = {0, 10}; // X equivalent of FocusOut PADWriteEvent(event); } #endif //Console.Warning("GS frame > focus lost"); }
void GSPanel::OnKeyDownOrUp( wxKeyEvent& evt ) { // HACK: Legacy PAD plugins expect PCSX2 to ignore keyboard messages on the GS Window while // the PAD plugin is open, so ignore here (PCSX2 will direct messages routed from PAD directly // to the APP level message handler, which in turn routes them right back here -- yes it's // silly, but oh well). #if defined(__unix__) // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // the event before the pad see it. So you send key event directly to the pad. if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) { keyEvent event; event.key = evt.GetRawKeyCode(); if (evt.GetEventType() == wxEVT_KEY_UP) event.evt = 3; // X equivalent of KEYRELEASE; else if (evt.GetEventType() == wxEVT_KEY_DOWN) event.evt = 2; // X equivalent of KEYPRESS; else event.evt = 0; PADWriteEvent(event); } #endif #ifdef __WXMSW__ // Not sure what happens on Linux, but on windows this method is called only when emulation // is paused and the GS window is not hidden (and therefore the event doesn't arrive from // the pad plugin and doesn't go through Pcsx2App::PadKeyDispatch). On such case (paused). // It needs to handle two issues: // 1. It's called both for key down and key up (linux apparently needs it this way) - but we // don't want to execute the command twice (normally commands execute on key down only). // 2. It has wx keycode which is upper case for ascii chars, but our command handlers expect // lower case for non-special keys. // ignore key up events if (evt.GetEventType() == wxEVT_KEY_UP) return; // Make ascii keys lower case - this apparently works correctly also with modifiers (shift included) if (evt.m_keyCode >= 'A' && evt.m_keyCode <= 'Z') evt.m_keyCode += (int)'a' - 'A'; #endif if( (PADopen != NULL) && CoreThread.IsOpen() ) return; DirectKeyCommand( evt ); }
void GSPanel::OnFocusLost( wxFocusEvent& evt ) { evt.Skip(); m_HasFocus = false; DoShowMouse(); #if defined(__unix__) // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // the event before the pad see it. So you send key event directly to the pad. if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) { keyEvent event = {0, 10}; // X equivalent of FocusOut PADWriteEvent(event); } #endif //Console.Warning("GS frame > focus lost"); UpdateScreensaver(); }