Hi,
While working on unhide prefs, I noticed that different checks are used to verify if the instance has VTE. In detail:
vte_info has a load_vte field, which corresponds to the "Load virtual terminal support" setting in the preferences dialog. The most obvious way to check for VTE, and also completely wrong: the preference can be (un)checked at any time.
When the preferences are loaded on startup, load_vte is checked, and if true, VteConfig *vc is allocated. So load_vte && vc != NULL seems like a better check, but that ignores the -t (--no-terminal) option.
Also on startup, vte_info.have_vte = load_vte && !--no-terminal, and in vte.c, have_vte = FALSE if VTE can not be loaded. So checking have_vte is the right thing.
---
Following is a short list of load_vte and vc checks, and load_vte usage (drop me a note if you need details):
build.c: prepare_run_script(), build_run_cmd(): checks load_vte && vc run command in vte if one exists and "Execute programs in VTE" is set Should be has_vte: one can't execute programs in VTE if -t...
keybindings.c: cb_func_select_action(): checks load_vte on Ctrl+A and if VTE is focused do vte_select_all() Should be has_vte. If instance is started without vte, and the dialog preference is set, this crashes.
prefs.c: prefs_init_dialog(), on_prefs_button_clicked(): uses load_vte set/get the "Load virtual terminal support" check button state - OK.
callbacks.c: on_send_selection_to_vte1_activate(): checks load_vte handler for Edit -> Commands -> Send selection to terminal Should be has_vte or no check. The command is removed on startup if !load_vte, but crashes if -t is specified.
keyfile.c: save_dialog_prefs(): check load_vte && vc meaning something like "save the preferences if loaded", but ignoring the case when they can not be changed and so also require no saving.
keyfile.c: load_dialog_prefs(): read and check load_vte allocate vc and read the other vte settings only if load_vte, but ignoring -t (the option is local to main.c)
main.c: apply_settings(): checks load_vte removes the Send selection to terminal command, but see callbacks.c
main.c: load_settings(): vte_info.have_vte = (no_vte) ? FALSE : vte_info.load_vte - OK.
---
What I plan to do:
1. Replace if (load_vte [&& vc != NULL]) with has_vte as needed.
2. Add some "use have_vte not load_vte to check for VTE" comment to load_vte/have_vte.
3. Make the loading/saving of VTE settings unconditional. Avoiding load/save economizes only a very short time, and the current checks whether the settings should be load/saved are wrong anyway.
4. Make vc non-pointer? This way, it'll be clear that vc != NULL is not a valid check. OTOH, vc-> crashes if vc is not allocated, which is good, but the current allocation condition is wrong. That would be about 140 "s/vc->/vc./" changes.
Request for comments.