let main () =
  Cam_args.parse ();
  if Sys.file_exists Cam_server.socket_file && !Cam_args.commands <> [] then
    (
     List.iter Cam_server.send_to_server !Cam_args.commands;
     exit 0
    );

  Cam_rc.load_core ();
  Cam_com_history.init ();
  Cam_rc.load_gui ();
  Cam_doc.init_keymaps ();
  Cam_keymaps.init_common_keymaps ();
  let w = new Cam_gui.main () in
  ignore (w#window#connect#destroy GMain.Main.quit);
  Cam_keymaps.set_window_common_keymaps w#window;
  List.iter Cam_commands.register default_commands ;
  Cam_menus.update_menus ~load_doc: true w#menubar;
  Cam_bbar.update w#hbox_buttons;
  Cam_rc.save_core ();
  Cam_rc.save_gui ();
  Cam_rc.handle_window w#window "main";
  let log_window = Cam_log.get_log_window () in
  Cam_rc.handle_window log_window "log";
  Cam_log.hide_log_window ();
  
  Cam_commands.register
    { Cam_commands.com_name = Cam_constant.com_configure_doc_sources ;
      Cam_commands.com_args = [| |] ;
      Cam_commands.com_more_args = None ;
      Cam_commands.com_f =
        (fun _ ->
          Cam_doc.config_doc_sources
            ~f_update_menu: (fun () -> Cam_menus.update_doc_menu true)
        );
    } ;

  Cam_commands.register
    { Cam_commands.com_name = Cam_constant.com_display_doc_box ;
      Cam_commands.com_args = [| |] ;
      Cam_commands.com_more_args = None ;
      Cam_commands.com_f =
        (fun _ -> Cam_doc_gui.create_or_update_list_window
            Cam_doc.default_doc_modules) ;
    } ;

  init_iconize_commands w#window;
  List.iter Cam_commands.eval_command (!Cam_args.init_commands @ !Cam_args.commands);
  GMain.Main.main ()