let create_or_update_list_window doc_modules =
  let (window, wlist, wcombo) =
    match !modules_window with
      None ->
        let window = GWindow.window ~kind: `TOPLEVEL
            ~title: Cam_messages.doc_box
            ~width: 120
            ~height:
            (
             let n = 80 + 20 * (List.length !doc_modules) in
             let h_limit = (Gdk.Screen.height ()) - 30 in
             if n > h_limit then h_limit else n
            )
            ()
        in
        window#move ~x: 0 ~y: 0;

        let vbox = GPack.vbox ~packing: window#add () in
        (*let hbox_search = GPack.hbox ~packing: (vbox#pack ~expand: false) () in*)
        let wcombo = GEdit.combo
            ~enable_arrow_keys: true
            ~case_sensitive: true
            ~value_in_list: false
            ~allow_empty: true
            ~packing: (vbox#pack ~expand: false)
            ()
        in
        let wb_search = GButton.button
            ~label: Cam_messages.search_exact
            ~packing: (vbox#pack ~expand: false)
            ()
        in
        let wscroll = GBin.scrolled_window
            ~hpolicy: `NEVER
            ~vpolicy: `AUTOMATIC
            ~packing: (vbox#pack ~expand: true)
            ()
        in
        let wlist = GList.clist
            ~titles_show: false
            ~titles: [""]
            ~selection_mode: `SINGLE
            ~packing: wscroll#add
            ()
        in
        wlist_key_stroke doc_modules wlist ;
        let wb_close = GButton.button ~label: Cam_messages.close
            ~packing: (vbox#pack ~expand: false ~padding: 3) ()
        in
        let _ = window#connect#destroy
            (fun () -> modules_window := None)
        in
        ignore (wb_close#connect#clicked window#destroy);
        ignore (wb_search#connect#clicked
                  (fun () ->
                    match wcombo#entry#text with
                      "" -> ()
                    | s -> !f_search_exact doc_modules s
                  ));
        window#show () ;
        (window, wlist, wcombo)
    | Some (win, wlist, wcombo, _) -> (win, wlist, wcombo)
  in
  let _ = wlist#clear () in
  selected_line := None ;
  let _ = List.iter
      (fun m -> let _ = wlist#append [ m.m_name ] in ())
      !doc_modules
  in
  GToolbox.autosize_clist wlist;
  wcombo#set_popdown_strings Cam_doc.doc_bookmarks#get;
  modules_window := Some (window, wlist, wcombo, List.map (fun m -> m.m_name) !doc_modules) ;
  wlist#misc#grab_focus ()