I’ve created a region between ROOT and DEVICE to filter some keys but I
reemit the event I don’t want to block, nobody receive it.
This how I create the region:
void CreateRcvRegion(void)
{
PhArea_t area;
PtArg_t arg[20];
short numargs = 0;
long fields;
fields = Ph_REGION_PARENT
| Ph_REGION_EV_SENSE
| Ph_REGION_IN_FRONT
| Ph_REGION_EV_OPAQUE
| Ph_REGION_FLAGS
| Ph_REGION_INPUT_GROUP;
PtSetArg( &arg[numargs++], Pt_ARG_REGION_FIELDS, fields, fields );
area.pos.x = area.pos.y = 0; area.size.w = area.size.h = SHRT_MAX;
PtSetArg( &arg[numargs++], Pt_ARG_AREA, &area, 0 );
PtSetArg( &arg[numargs++], Pt_ARG_REGION_PARENT, Ph_ROOT_RID, 0
);
PtSetArg( &arg[numargs++], Pt_ARG_REGION_SENSE, Ph_EV_KEY,
Ph_EV_KEY);
PtSetArg( &arg[numargs++], Pt_ARG_REGION_OPAQUE, Ph_EV_KEY,
Ph_EV_KEY);
PtSetArg( &arg[numargs++], Pt_ARG_REGION_INPUT_GROUP, 0, 0);
PtSetArg( &arg[numargs++], Pt_ARG_REGION_FLAGS, Ph_KBD_REGION,
Ph_KBD_REGION);
PtSetArg( &arg[numargs++], Pt_ARG_REGION_INFRONT, Ph_DEV_RID, 0
);
PtSetArg( &arg[numargs++], Pt_ARG_FILL_COLOR,
Pg_TRANSPARENT, 0 );
rcv_region_widget = PtCreateWidget( PtRegion, NULL, numargs, arg );
PtAddEventHandler( rcv_region_widget, Ph_EV_KEY, cbRegionFilterEvent,
NULL );
PtRealizeWidget( rcv_region_widget );
/*
- this is going to be a Raw event, not a key event, because
- we want to emit it rootwards towards the Device region,
- which will consume, focus, and reemit our event as a true
- key event
*/
phEvent.processing_flags = Ph_FAKE_EVENT;
phEvent.type = Ph_EV_KEY;
phEvent.subtype = Ph_EV_KEY;
phEvent.emitter.rid = PtWidgetRid( rcv_region_widget );
phEvent.collector.rid = Ph_ROOT_RID;
phEvent.input_group = PhInputGroup( NULL );
phEvent.data_len = sizeof( PhKeyEvent_t );
phEvent.num_rects = 1;
/*
- the event’s rectangle covers the entire event space;
- this saves us from finding out the extent of the
- collector’s region
*/
phEvent_rect.ul.x = phEvent_rect.ul.y = SHRT_MIN;
phEvent_rect.lr.x = phEvent_rect.lr.y = SHRT_MAX;
misc_verbose(verbose, 1, “rid %d\n”, (int)phEvent.emitter.rid);
}
Here is how I filter ou the events:
int cbRegionFilterEvent( PtWidget_t *widget, void *data, PtCallbackInfo_t
*cbinfo )
{
PhKeyEvent_t * keyEvent = NULL;
if ( (cbinfo == NULL)
|| (cbinfo->event == NULL) )
return Pt_CONTINUE;
switch (cbinfo->event->type) {
case Ph_EV_KEY :
keyEvent = (PhKeyEvent_t*)PhGetData(cbinfo->event);
if (keyEvent == NULL)
return Pt_CONTINUE;
if (keyEvent->key_flags & Pk_KF_Key_Down) {
misc_verbose(verbose, 1, “Rcv Key Down\n”);
misc_verbose(verbose, 2, " key_mods :
0x%08x\n", (unsigned)keyEvent->key_mods);
if (keyEvent->key_flags & Pk_KF_Sym_Valid) {
misc_verbose(verbose, 2, " key_sym :
0x%08x\n", (unsigned)keyEvent->key_sym);
switch ((unsigned)keyEvent->key_sym) {
case T5_KEY_STOP_L:
break;
case T5_KEY_START_L:
break;
case T5_KEY_SLOW_L:
break;
case T5_KEY_TEMP_L:
break;
case T5_KEY_STOP_R:
break;
case T5_KEY_START_R:
break;
case T5_KEY_SLOW_R:
break;
case T5_KEY_TEMP_R:
break;
case T5_KEY_STOP_DOF:
break;
case T5_KEY_START_DOF:
break;
default:
misc_verbose(verbose, 1, “reemit event\n”);
PhEventEmit( &phEvent, &phEvent_rect,
&keyEvent );
break;
}
}
if (keyEvent->key_flags & Pk_KF_Cap_Valid)
misc_verbose(verbose, 2, " key_cap :
0x%08x\n", (unsigned)keyEvent->key_cap);
}
break;
default:
misc_verbose(verbose, 1, “reemit event\n”);
PhEventEmit( &phEvent, &phEvent_rect, &keyEvent );
break;
}
return Pt_CONTINUE;
}
What is wrong ?
Thanks,
Alain.