let handle_click_button_event (wr: win_ref) (but_pos: int) (b: b)
  : state * output_event list =
    assert (win_valid wr b);
    begin match button_handlers_in_pos wr but_pos b with
    | None -> (Waiting({ waiting_state = b }), [])
    | Some(dr, vs) ->
        let task v = {
          task_win = wr;
          task_expr = Apply(X(R(v)), X(R(Node_value(dr))));
        } in
        let r = {
          running_state = b;
          running_task_queue = List.map task vs;
        } in
        (Running(r), [])
    end