Sorry, a little busy with the LSP plugin :-).
No problem, that is a good cause ;-)
I think you misunderstand how it works - tm_workspace_add_source_files() is the function that performs the parsing, tm_source_file_new() just creates a kind of handle representing the file.
Oh, that explains why the speed-up was much less then expected. Anyway, I agree that the idle approach is not really viable, because it might confuse users.
What about the other approach then? Just reading the file list from the project #1290. It just skips the files that will be opened by Geany later. It will block, but hopefully for little bit shorter time than with the double-parsing.