Wellington Carvalho
2012-04-05 14:30:58 UTC
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*
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*