[DEV] Remove automatic key respown on X11

This commit is contained in:
Edouard DUPIN 2012-12-19 23:28:27 +01:00
parent 57c22f93ef
commit 95c94a9c9e
4 changed files with 64 additions and 33 deletions

View File

@ -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) :

View File

@ -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 {

View File

@ -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

View File

@ -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);
}
}
}