twin_dispatch_result_t _twin_clock_dispatch (twin_widget_t *widget, twin_event_t *event) { twin_clock_t *clock = (twin_clock_t *) widget; if (_twin_widget_dispatch (widget, event) == TwinDispatchDone) return TwinDispatchDone; switch (event->kind) { case TwinEventPaint: _twin_clock_paint (clock); break; default: break; } return TwinDispatchContinue; }
twin_dispatch_result_t _twin_box_dispatch (twin_widget_t *widget, twin_event_t *event) { twin_box_t *box = (twin_box_t *) widget; twin_event_t ev; twin_widget_t *child; if (event->kind != TwinEventPaint && _twin_widget_dispatch (widget, event) == TwinDispatchDone) return TwinDispatchDone; switch (event->kind) { case TwinEventQueryGeometry: return _twin_box_query_geometry (box); case TwinEventConfigure: return _twin_box_configure (box); case TwinEventButtonDown: box->button_down = _twin_box_xy_to_widget (box, event->u.pointer.x, event->u.pointer.y); if (box->button_down && box->button_down->want_focus) box->focus = box->button_down; /* fall through ... */ case TwinEventButtonUp: case TwinEventMotion: if (box->button_down) { child = box->button_down; ev = *event; ev.u.pointer.x -= child->extents.left; ev.u.pointer.y -= child->extents.top; return (*box->button_down->dispatch) (child, &ev); } break; case TwinEventKeyDown: case TwinEventKeyUp: case TwinEventUcs4: if (box->focus) return (*box->focus->dispatch) (box->focus, event); break; case TwinEventPaint: box->widget.paint = TWIN_FALSE; for (child = box->children; child; child = child->next) if (child->paint) { twin_pixmap_t *pixmap = box->widget.window->pixmap; twin_rect_t clip = twin_pixmap_save_clip (pixmap); twin_coord_t ox, oy; twin_pixmap_get_origin (pixmap, &ox, &oy); if (child->shape != TwinShapeRectangle) twin_fill (child->window->pixmap, widget->background, TWIN_SOURCE, child->extents.left, child->extents.top, child->extents.right, child->extents.bottom); twin_pixmap_set_clip (pixmap, child->extents); twin_pixmap_origin_to_clip (pixmap); child->paint = TWIN_FALSE; (*child->dispatch) (child, event); twin_pixmap_restore_clip (pixmap, clip); twin_pixmap_set_origin (pixmap, ox, oy); } break; default: break; } return TwinDispatchContinue; }