Discussion:
[directfb-users] Why this DFB example gives 2 "press" or 2 "release" events when there's only one?
Wellington Carvalho
2012-04-05 14:30:58 UTC
Permalink
Hi! I'm trying to understand the use of `CreateInputEventBuffer`, and I
have the following test:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

#include <directfb.h>

#include <iostream>

using namespace std;

static IDirectFB *dfb = NULL;
static IDirectFBSurface *primary = NULL;
static IDirectFBSurface *foot = NULL;
static IDirectFBInputDevice *keyboard = NULL;
static int screen_width = 0;
static int screen_height = 0;
#define DFBCHECK(x...) \
{ \
DFBResult err = x; \
\
if (err != DFB_OK) \
{ \
fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
DirectFBErrorFatal( #x, err ); \
} \
}
static IDirectFBEventBuffer *buffer = NULL;
int main (int argc, char **argv)
{

DFBSurfaceDescription dsc;
IDirectFBImageProvider *provider;
int quit = 0;
DFBCHECK (DirectFBInit (&argc, &argv));
DFBCHECK (DirectFBCreate (&dfb));
DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));
dsc.flags = DSDESC_CAPS;
dsc.caps = DSCAPS_PRIMARY;
DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary ));
DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height));
DFBCHECK (primary->FillRectangle (primary, 0, 0, screen_width,
screen_height));
DFBCHECK (dfb->CreateImageProvider (dfb, DATADIR"/foot.jpg",
&provider));
DFBCHECK (provider->GetSurfaceDescription (provider, &dsc));
DFBCHECK (dfb->CreateSurface (dfb, &dsc, &foot));
DFBCHECK (provider->RenderTo (provider, foot, NULL));
provider->Release (provider);
DFBCHECK (primary->SetBlittingFlags (primary,
DSBLIT_BLEND_ALPHACHANNEL));

IDirectFBEventBuffer* eventBuffer = NULL;

while (!quit) {
DFBCHECK(dfb->CreateInputEventBuffer(
dfb,
DICAPS_ALL,
DFB_TRUE,
&eventBuffer));

if (eventBuffer != NULL) {
eventBuffer->WaitForEvent(eventBuffer);
}

cout << "DFBEventBuffer::getNextEvent ...";
if (eventBuffer != NULL &&
(eventBuffer->HasEvent(eventBuffer) == DFB_OK)) {

DFBInputEvent* evt = new DFBInputEvent;
if (eventBuffer->GetEvent(eventBuffer, DFB_EVENT(evt)) ==
DFB_OK) {
cout << " evt=" << evt->type << endl;
if (evt->key_id == DIKI_ESCAPE)
quit = 1;
} else {
delete evt;
evt = NULL;
}
}
cout << " NULL !!!" << endl;
}
dfb->Release (dfb);
return 0;
}

For some reason, after press the key about 10 times, it stats to give me 2
"release" events for a single keypress. And sometimes 2 "press" events
also. Any idea why is this happening? (using DirectFB 1.4.11)

Obs. I know I could use `GetInputDevice`, but I really would like to use
`CreateInputEventBuffer`, and understand what's happening on this example.
*
*
*
*
*Wellington B. de Carvalho*
Denis Oliver Kropp
2012-04-11 08:28:19 UTC
Permalink
For some reason, after press the key about 10 times, it stats to give me 2 "release" events for a single keypress. And sometimes 2 "press" events also. Any idea
why is this happening? (using DirectFB 1.4.11)
It would not explain why it starts only after a certain time, but did you
check if the keyboard AND linux-input driver is in use?
--
Best regards,
Denis Oliver Kropp

.------------------------------------------.
| DirectFB - Hardware accelerated graphics |
| http://www.directfb.org/ |
"------------------------------------------"
Loading...