From 95c94a9c9eeec78a6dace08b4d671a051c4bac8d Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Wed, 19 Dec 2012 23:28:27 +0100 Subject: [PATCH] [DEV] Remove automatic key respown on X11 --- sources/ewol/game/Camera.cpp | 2 +- sources/ewol/renderer/os/eSystem.cpp | 1 + sources/ewol/renderer/os/gui.X11.cpp | 14 +++++ sources/ewol/widget/Scene.cpp | 80 +++++++++++++++++----------- 4 files changed, 64 insertions(+), 33 deletions(-) diff --git a/sources/ewol/game/Camera.cpp b/sources/ewol/game/Camera.cpp index e999a746..7996ad8d 100644 --- a/sources/ewol/game/Camera.cpp +++ b/sources/ewol/game/Camera.cpp @@ -21,7 +21,7 @@ void game::Camera::Update(void) m_matrix.Rotate(vec3(0,0,1), m_angles.z ); vec3 tmpp = m_position * -1; m_matrix.Translate(tmpp); - EWOL_DEBUG("camera: pos=" << m_position << " angle=" << m_angles); + //EWOL_DEBUG("camera: pos=" << m_position << " angle=" << m_angles); } game::Camera::Camera(vec3 pos, vec3 angles) : diff --git a/sources/ewol/renderer/os/eSystem.cpp b/sources/ewol/renderer/os/eSystem.cpp index 0abb7077..b274987d 100644 --- a/sources/ewol/renderer/os/eSystem.cpp +++ b/sources/ewol/renderer/os/eSystem.cpp @@ -157,6 +157,7 @@ void ewolProcessEvents(void) tmpWidget->OnEventKb(ewol::keyEvent::statusUp, data.keyboardChar); } } else { // THREAD_KEYBORAD_MOVE + EWOL_DEBUG("THREAD_KEYBORAD_MOVE" << data.keyboardMove << " " << data.stateIsDown); if(true == data.stateIsDown) { tmpWidget->OnEventKbMove(ewol::keyEvent::statusDown, data.keyboardMove); } else { diff --git a/sources/ewol/renderer/os/gui.X11.cpp b/sources/ewol/renderer/os/gui.X11.cpp index f34af505..b33be3df 100644 --- a/sources/ewol/renderer/os/gui.X11.cpp +++ b/sources/ewol/renderer/os/gui.X11.cpp @@ -760,6 +760,20 @@ void X11_Run(void) break; case KeyPress: case KeyRelease: + // filter repeate key : + if( event.type == KeyRelease + && XEventsQueued(m_display, QueuedAfterReading)) { + XEvent nev; + XPeekEvent(m_display, &nev); + if( nev.type == KeyPress + && nev.xkey.time == event.xkey.time + && nev.xkey.keycode == event.xkey.keycode) { + // Key was not actually released + // remove next event too ... + XNextEvent(m_display, &nev); + break; + } + } #ifdef DEBUG_X11_EVENT EWOL_INFO("X11 event : " << event.type << " = \"KeyPress/KeyRelease\" "); #endif diff --git a/sources/ewol/widget/Scene.cpp b/sources/ewol/widget/Scene.cpp index 26860e55..e2b819b8 100644 --- a/sources/ewol/widget/Scene.cpp +++ b/sources/ewol/widget/Scene.cpp @@ -86,38 +86,6 @@ void widget::Scene::OnDraw(ewol::DrawProperty& displayProp) void widget::Scene::PeriodicCall(int64_t localTime) { - if (m_walk!=0) { - if ( (m_walk&(WALK_FLAG_FORWARD|WALK_FLAG_BACK))!=0) { - // request back and forward in the same time ... this is really bad .... - } else if ( (m_walk&WALK_FLAG_FORWARD)!=0) { - vec3 angles = m_camera.GetAngle(); - angles.x = cosf(angles.z); - angles.y = sinf(angles.z); - angles.z = 0; - vec3 pos = m_camera.GetPosition(); - pos += angles; - EWOL_DEBUG("walk = " << angles); - m_camera.SetPosition(pos); - } else if ( (m_walk&WALK_FLAG_BACK)!=0) { - vec3 angles = m_camera.GetAngle(); - angles.x = cosf(angles.z); - angles.y = sinf(angles.z); - angles.z = 0; - vec3 pos = m_camera.GetPosition(); - pos -= angles; - EWOL_DEBUG("walk = " << angles*-1); - m_camera.SetPosition(pos); - } - - if ( (m_walk&(WALK_FLAG_LEFT|WALK_FLAG_RIGHT))!=0) { - // request left and right in the same time ... this is really bad .... - } else if ( (m_walk&WALK_FLAG_LEFT)!=0) { - - } else if ( (m_walk&WALK_FLAG_RIGHT)!=0) { - - } - } - double curentTime=(double)localTime/1000000.0; // small hack to change speed ... if (m_ratioTime != 1) { @@ -145,6 +113,54 @@ void widget::Scene::PeriodicCall(int64_t localTime) } m_lastCallTime = curentTime; MarkToRedraw(); + + if (m_walk!=0) { + if( (m_walk&WALK_FLAG_FORWARD)!=0 + && (m_walk&WALK_FLAG_BACK)!=0) { + // request back and forward in the same time ... this is really bad .... + } else if ( (m_walk&WALK_FLAG_FORWARD)!=0) { + vec3 angles = m_camera.GetAngle(); + angles.x = cosf(angles.z); + angles.y = sinf(angles.z); + angles.z = 0; + vec3 pos = m_camera.GetPosition(); + // walk is 6 km/h + pos += angles*0.001666f/deltaTime; + m_camera.SetPosition(pos); + } else if ( (m_walk&WALK_FLAG_BACK)!=0) { + vec3 angles = m_camera.GetAngle(); + angles.x = cosf(angles.z); + angles.y = sinf(angles.z); + angles.z = 0; + vec3 pos = m_camera.GetPosition(); + // walk is 6 km/h + pos -= angles*0.001666f/deltaTime; + m_camera.SetPosition(pos); + } + + if( (m_walk&WALK_FLAG_LEFT)!=0 + && (m_walk&WALK_FLAG_RIGHT)!=0) { + // request left and right in the same time ... this is really bad .... + } else if ( (m_walk&WALK_FLAG_LEFT)!=0) { + vec3 angles = m_camera.GetAngle(); + angles.x = cosf(angles.z+M_PI/2.0); + angles.y = sinf(angles.z+M_PI/2.0); + angles.z = 0; + vec3 pos = m_camera.GetPosition(); + // lateral walk is 4 km/h + pos += angles*0.0011f/deltaTime; + m_camera.SetPosition(pos); + } else if ( (m_walk&WALK_FLAG_RIGHT)!=0) { + vec3 angles = m_camera.GetAngle(); + angles.x = cosf(angles.z+M_PI/2.0); + angles.y = sinf(angles.z+M_PI/2.0); + angles.z = 0; + vec3 pos = m_camera.GetPosition(); + // lateral walk is 4 km/h + pos -= angles*0.0011f/deltaTime; + m_camera.SetPosition(pos); + } + } }