let receive (ie: input_event) (w: waiting)
  : state * output_event list =
    begin match ie with

    | User_load_in_new_win_event(u) ->
        handle_load_in_new_win_event No_opener No_name u w.waiting_state

    | User_load_in_win_event(uw, u) ->
        begin match win_from_user_window uw w.waiting_state with
        | None -> (Waiting(w), [])
        | Some(wr) -> handle_load_in_win_event wr u w.waiting_state
        end

    | User_link_to_new_win_event(uw, u) ->
        let wo =
          begin match win_from_user_window uw w.waiting_state with
          | None -> No_opener
          | Some(wr) -> Win_opener(wr)
          end
        in
        handle_load_in_new_win_event wo No_name u w.waiting_state

    | User_link_to_named_win_event(uw, str, u) ->
        let wo =
          begin match win_from_user_window uw w.waiting_state with
          | None -> No_opener
          | Some(wr) -> Win_opener(wr)
          end
        in
        begin match win_from_win_name str w.waiting_state with
        | None ->
            handle_load_in_new_win_event wo (Str_name(str)) u w.waiting_state
        | Some(wr) ->
            handle_load_in_win_event wr u w.waiting_state
        end

    | User_close_win_event(uw) ->
        begin match win_from_user_window uw w.waiting_state with
        | None -> (Waiting(w), [])
        | Some(wr) -> handle_close_win_event wr w.waiting_state
        end

    | User_input_text_event(User_textbox(uw, box_pos), str, _) ->
        begin match win_from_user_window uw w.waiting_state with
        | None -> (Waiting(w), [])
        | Some(wr) -> handle_input_text_event wr box_pos str w.waiting_state
        end

    | User_click_button_event(User_button(uw, but_pos)) ->
        begin match win_from_user_window uw w.waiting_state with
        | None -> (Waiting(w), [])
        | Some(wr) -> handle_click_button_event wr but_pos w.waiting_state
        end

    | Network_response_event(nr, resp) ->
        handle_network_response_event nr resp w.waiting_state

    end