static status eventHandler(Handler h, EventObj ev) { DEBUG(NAME_post, Cprintf("eventHandler(%s, %s)\n", pp(h), pp(ev))); if ( isAEvent(ev, h->event) ) { if (isDefault(h->region)) { if (isNil(h->message)) succeed; return forwardReceiverCodev(h->message, getMasterEvent(ev), 1, (Any *)&ev); } else { Graphical gr = ev->receiver; if ( insideRegion(h->region, gr->area, getAreaPositionEvent(ev, gr)) == SUCCEED ) { if ( notNil(h->message) ) return forwardReceiverCodev(h->message, getMasterEvent(ev), 1, (Any *)&ev); succeed; } } } fail; }
static status eventPopupGesture(PopupGesture g, EventObj ev) { if ( g->status == NAME_active && isUpEvent(ev) ) { PceWindow sw; if ( !(sw = getWindowGraphical(ev->receiver)) ) sw = ev->window; if ( notNil(g->current) && g->current->displayed == OFF ) { send(g->current, NAME_open, ev->receiver, getAreaPositionEvent(ev, DEFAULT), EAV); attributeObject(g, NAME_Stayup, ON); grabPointerWindow(sw, ON); focusWindow(sw, ev->receiver, (Recogniser) g, g->cursor, NIL); } else if ( valInt(getClickTimeEvent(ev)) < 400 && getAttributeObject(g, NAME_Stayup) != ON ) { attributeObject(g, NAME_Stayup, ON); grabPointerWindow(sw, ON); focusWindow(sw, ev->receiver, (Recogniser) g, g->cursor, NIL); } else { send(g, NAME_terminate, EAV); if ( isNil(g->current) ) { grabPointerWindow(sw, OFF); focusWindow(sw, NIL, NIL, NIL, NIL); deleteAttributeObject(g, NAME_Stayup); assign(g, status, NAME_inactive); } } succeed; } else if ( notNil(g->current) && g->current->displayed == ON ) return postEvent(ev, (Graphical) g->current, DEFAULT); if ( eventGesture(g, ev) ) succeed; if ( g->status == NAME_active && isAEvent(ev, NAME_keyboard) ) { Name key; TRY(updatePopupGesture(g, ev)); key = characterName(getIdEvent(ev)); if ( send(g->current, NAME_key, key, EAV) ) { Any context = g->context; PopupObj current = g->current; assign(g, context, NIL); assign(g, current, NIL); send(current, NAME_execute, context, EAV); succeed; } else send(g, NAME_cancel, ev, EAV); } fail; }
static status initiatePopupGesture(PopupGesture g, EventObj ev) { if ( isNil(g->max_drag_distance) ) { send(g->current, NAME_open, ev->receiver, getAreaPositionEvent(ev, DEFAULT), EAV); postEvent(ev, (Graphical) g->current, DEFAULT); } succeed; }