let handle_input_text_event (wr: win_ref) (box_pos: int) (str: string) (b: b)
  : state * output_event list =                                    
    assert (win_valid wr b);
    begin match textbox_handlers_in_pos wr box_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 n' =
          begin match node_assoc_valid dr b with
          | Textbox_node(oeid, _, hs) -> Textbox_node(oeid, str, hs)
          | _ -> assert false
          end
        in
        let b' = node_update dr n' b in
        let r = {
          running_state = b';
          running_task_queue = List.map task vs;
        } in
        (Running(r), [])
    end