static int dispatch_click_event(struct rtb_button *self, const struct rtb_mouse_event *e) { struct rtb_button_event event = *((struct rtb_button_event *) e); event.type = RTB_BUTTON_CLICK; event.cursor.x -= self->x; event.cursor.y -= self->y; return rtb_handle(RTB_ELEMENT(self), RTB_EVENT(&event)); }
static int win_event(struct rtb_element *elem, const struct rtb_event *e) { SELF_FROM(elem); switch (e->type) { case RTB_WINDOW_CLOSE: if (!rtb_handle(elem, e)) rtb_event_loop_stop(self->rtb); return 1; case RTB_KEY_PRESS: case RTB_KEY_RELEASE: if (self->focus && self->focus != RTB_ELEMENT(self)) if (rtb_elem_deliver_event(self->focus, e)) return 1; if (rtb_handle(elem, e)) return 1; } return super.on_event(elem, e); }
static int handle_key_press(struct rtb_button *self, const struct rtb_key_event *e) { struct rtb_button_event event = { .type = RTB_BUTTON_CLICK, .source = RTB_EVENT_SYNTHETIC }; if ((e->keysym == RTB_KEY_NORMAL && e->character == ' ') || (e->keysym == RTB_KEY_ENTER)) { rtb_handle(RTB_ELEMENT(self), RTB_EVENT(&event)); return 1; } return 0; }
int rtb_elem_deliver_event(struct rtb_element *self, const struct rtb_event *e) { int ret; /* elements should not receive events if they've not been attached * into the tree yet. */ if (self->state == RTB_STATE_UNATTACHED) return 0; ret = self->on_event(self, e); ret = rtb_handle(self, e) || ret; switch (e->type) { case RTB_MOUSE_ENTER: transition_mouse_enter(self, RTB_EVENT_AS(e, rtb_mouse_event)); break; case RTB_MOUSE_LEAVE: transition_mouse_leave(self, RTB_EVENT_AS(e, rtb_mouse_event)); break; case RTB_FOCUS: transition_focus(self); break; case RTB_UNFOCUS: transition_unfocus(self); break; case RTB_MOUSE_DOWN: transition_mouse_down(self, RTB_EVENT_AS(e, rtb_mouse_event)); break; case RTB_MOUSE_UP: case RTB_DRAG_DROP: transition_mouse_up(self, RTB_EVENT_AS(e, rtb_mouse_event)); break; } return ret; }