The following procedure describes how an application can request an
asynchronous notification from Screen for
keyboard events.
You will learn to:
- create a native context
-
establish a connection between your application and
Screen
-
use specific Screen object to
filter for specific events
-
receive and handle a notification from Screen
- disarm notification and release resources
-
Define your pulse code:
#define MY_PULSE_CODE _PULSE_CODE_MINAVAIL
-
Create variables for your Screen
and a keyboard device:
screen_context_t screen_ctx = NULL;
screen_device_t keyboard = NULL;
screen_device_t* devices = NULL;
-
Create a native context:
screen_create_context(&screen_ctx, 0);
-
Set up your device object as a keyboard type:
int devcnt;
screen_get_context_property_iv(screen_ctx, SCREEN_PROPERTY_DEVICE_COUNT, &devcnt);
devices = malloc(devcnt*sizeof(void*));
screen_get_context_property_pv(screen_ctx, SCREEN_PROPERTY_DEVICES, (void**)devices);
int i=0;
int type;
for(; i<devcnt; i++)
{
screen_get_device_property_iv(devices[i], SCREEN_PROPERTY_TYPE, &type);
if(type == SCREEN_EVENT_KEYBOARD)
{
keyboard = devices[i];
}
}
if(keyboard == NULL)
{
printf("FATAL: Couldn't get keyboard device\n");
exit(1);
}
Events specific to a keyboard can be detected by passing
the appropriate screen_device_t handle
in the obj argument of
screen_notify().
-
Establish a connection:
int chid = -1;
chid = ChannelCreate(0);
int coid = -1;
coid = ConnectAttach(0, 0, chid, _NTO_SIDE_CHANNEL, 0);
-
Request notification from Screen:
struct sigevent event;
SIGEV_PULSE_INIT(&event, coid, SIGEV_PULSE_PRIO_INHERIT, MY_PULSE_CODE, 0);
screen_notify(screen_ctx, SCREEN_NOTIFY_INPUT, keyboard, &event);
-
Check for receipt of notification:
while (1) {
struct _pulse pulse;
int rcvid = MsgReceivePulse(chid, &pulse, sizeof(pulse), NULL);
if (rcvid == 0) {
printf("keyboard input detected...\n");
} else if (rcvid < 0) {
break;
}
}
-
Disarm any further notifications of keyboard events from
Screen in this context:
SIGEV_NONE_INIT(&event);
screen_notify(screen_ctx, SCREEN_NOTIFY_INPUT, keyboard, &event);
free(devices);
Passing NULL or an event with
the type of SIGEV_NONE disables notifications
that were enabled with the same combination of arguments:
ctx, flags,
and obj.
-
Clean up your resources:
ConnectDetach(coid);
ChannelDestroy(chid);
screen_destroy_context(screen_ctx);