Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow excluding certain settings from configuration profiles #10156

Closed
pitermach opened this issue Aug 28, 2019 · 37 comments
Closed

Allow excluding certain settings from configuration profiles #10156

pitermach opened this issue Aug 28, 2019 · 37 comments
Labels
blocked/needs-product-decision A product decision needs to be made. Decisions about NVDA UX or supported use-cases. close/duplicate needs-triage

Comments

@pitermach
Copy link

Is your feature request related to a problem? Please describe.

I have created a configuration profile for an application to slightly tweak NVDA's verbosity - turning off reading of table headers. I don't want this profile doing anything else. Sometimes when I'm in this application I'll adjust other settings like speech rate and synthesizer to a different language, and NVDA writes these changes into the profile. If I later make a similar change to my main profile and return to this application I find NVDA is still using those settings saved in the profile. Currently, there's no easy way to tell NVDA to use the global voice settings so I either have to make sure they match, or open the profile's ini file in notepad and manually erase the section so NVDA uses my global settings.

Describe the solution you'd like

VoiceOver on Mac OS solves this kind of problem by letting you pick from a list what kinds of settings should be included in an Activity (VoiceOver's version of a config profile), including categories for speech, braille, verbosity and so on. If a category is checked and I make a change in that group with a hotkey while I'm using that program, it gets saved in the activity. If the category is unchecked, then the change is made to global settings instead.

I think that NVDA should offer a similar option in the dialog box to edit a profile. Probably the simplest way of presenting the list is just to look at what sections are included in the main nvda.ini file, perhaps excluding some of them like the sections for synthesizer-specific parameters

@Brian1Gaff
Copy link

Brian1Gaff commented Aug 29, 2019 via email

@XLTechie
Copy link
Collaborator

XLTechie commented Aug 29, 2019 via email

@Brian1Gaff
Copy link

Brian1Gaff commented Aug 29, 2019 via email

@XLTechie
Copy link
Collaborator

XLTechie commented Aug 30, 2019 via email

@pitermach
Copy link
Author

@XLTechie Exactly. Excel is actually another nice example where this would be useful for me, because I have table coordinate reporting off globally because I don't care about it on the web, but it's much more important in excel.

NVDA recently added a new checkable list control that developers can use, it's for example now used to set which keys are NVDA modifiers. It would work really well for my proposed suggestion here from a user experience point of view I think.

@tage64
Copy link

tage64 commented Sep 3, 2019

This sounds really interesting. I use different profiles for different languages, but the only thing I want to have different in those profiles is the language of the synthesizer not anything else.

There is how ever one critical question which has to be resolved before this feature can be implemented.
What should be default? Should all categories be on or off when creating a new profile?

I personally think that they should be off, I.E. no settings should be reflected in the profile specifically if one don't specify that. How ever, this has one downside.
It will not be the same as it is now. So users who create a new profile and changes some settings will not see those settings reflected in the profile if they don't specify that explicitly. It will make users confused.

I think a solution might be to add some kind of dialog when changing some settings if those settings should be reflected in the current profile or not. It could be an extra button aside from the "OK" and "Cancel" buttons called "Reflect in current profile". Also, if the user just press enter within the settings to save them instead of pressing on the OK button, a dialog may appear asking if the changed settings should be reflected in the current profile or applied globally. These things should of course only be shown if a custom profile is selected and not if "(normal configuration)" is selected.

What do you think?

Tage

@XLTechie
Copy link
Collaborator

XLTechie commented Sep 3, 2019 via email

@Simon818
Copy link

I really hope this gets some attention. This is a major problem for me, as I use a few profiles that only have a few settings changed. For instance, in my MUD client, I want speech interrupt for typed characters off and I want punctuation set to none. I definitely do not want speech rate, key echo, or soundcard selection to affect the MUD profile. NVDA actively resists my attempts to change this; I can for example set the profile ini file to read-only, but whenever I manually save config, it produces an error. As an alternative to this suggestion, we could have a checkbox in the profiles dialog to prevent changes to all configuration options that aren't already included in the profile unless the profile is manually activated. I Know that once I set up my profiles, I don't want anything or anyone touching the way they're set up. I asked about this when they were first implemented and was told it would be confusing, but to be honest, I don't see how it isn't confusing right now. I'm technically competent and I don't expect my soundcard change to only affect MushClient simply because I set up a thing that turns off typing echo and happen to be in the app when I change soundcards.

@CyrilleB79
Copy link
Collaborator

I suggest an other solution. This is rather a solution to #11256, but since #11256 has been closed in favor of this issue, I am commenting here where the discussion takes place.

We could imagine to be able to have a button to lock/unlock the profile in the profile window. So the steps to configure a profile for the Foo application would be:

  • Focus the Foo application
  • create a new application profile for Foo
  • close the profile window and turn back to Foo application.
  • make the parameter changes in the Foo profile thanks to settings window and/or keyboard shortcuts
  • open again the profile window
  • select the Foo profile in the list, press the lock button and validate the window; the information "modifiable" / "locked" could be displayed in a column of the profile list.
  • All subsequent setting changes (in parameter window or due to keyboard shortcuts) would be done in the main default profile even if the app Foo is active.

This solution has the advantage to allow to change only the wanted parameter on the contrary to other solutions suggesting to allow or prevent changes at a parameter category level.
I can imagine for example that in Document formatting category one would like to save only one parameter (i.e. cell coordinates for Excel) while letting other parameters changed with default (e.g. font announcement for Excel).

@XLTechie
Copy link
Collaborator

XLTechie commented Sep 30, 2020 via email

@XLTechie
Copy link
Collaborator

XLTechie commented Sep 30, 2020 via email

@CyrilleB79
Copy link
Collaborator

  1. The speech rate changes in Audacity, but is not saved to any profile. In other words, it is as if you changed the speech rate for the Audacity profile, but it can not be saved with the profile locked. The default profile ignores this change. I personally like this approach.

Yes, that is how I was seeing the things.
Thinking a bit further in this direction, we can imagine the "Save when exiting" checkbox in the "General settings" panel could apply only to NVDA normal (default) profile. And each profile could have a combobox in the profile window indicating when it should be saved. The combo-box should have the following options:

  • Save when exiting NVDA
  • Do not save when exiting NVDA
  • Follow default configuration, default configuration being the "Save when exiting" checkbox in the general setting panel.

Notes:

  • I no experience at all with VoiceOver
  • I am usually working with "Save when exiting" option disabled to avoid to have profile content increasing with more and more unwanted options defined.

@XLTechie
Copy link
Collaborator

XLTechie commented Sep 30, 2020 via email

@Simon818
Copy link

Agreed with the lock button; this is essentially what I was getting at with the "prevent further changes" checkbox.

I think that if a setting such a speech rate is changed in the profile, and that setting is again changed while the app is open, it should still only affect the app in question. More specifically, the behavior I'm hoping to prevent is the addition of new settings into the profile. If speech rate is already a part of my audacity profile and I change it, it seems acceptable to have that only affect audacity, and maybe even save to that profile. But I don't want speech volume, punctuation, or anything else to be a part of the audacity profile, even if I adjust it while using Audacity.

I would hazard a guess that for 99% of people who use profiles, once they set up the initial settings, they won't want any future ones to leak their way into the profile either.

@pitermach
Copy link
Author

That does sound like a very ellegant solution which would also not be as confusing to new users. I very much still think something should be done about the current behavior.

@Simon818
Copy link

Simon818 commented Feb 8, 2023

I sure wish something would happen with this. It's been a lot of years and I'm still constantly screwing up my config profiles because I thoughtlessly adjust the output soundcard or audio ducking or some other innocuous setting and it gets saved to the profile forever until I manually edit the INI. I can't think of a way this could be less user friendly.

@rperez030
Copy link

I run into that all the time, particularly due to the use of the synth settings ring and screen curtain. If I Alt +Tab between my open applications right now I'm sure I will hear at least 2 or 3 different volume levels. I improved the situation for me by telling NVDA not to save the configuration when exit but I still have to clean my any files manually from time to time.

@seanbudd seanbudd added the blocked/needs-product-decision A product decision needs to be made. Decisions about NVDA UX or supported use-cases. label Feb 13, 2023
@Adriani90
Copy link
Collaborator

in gneeral I agree with @CyrilleB79's lock profile approach, including the combo box for the profile letting you to choose when to save the settings.
However, I am not sure we must develop such a comprehensive solution.

Problem:

  • The user creates a profile for an application but changes a setting on the global configuration while not focusing the application. So the settings do not inherit to the profile from another place.
  • Expected solution: it should be possible to change settings else where and still impact the way NVDA behaves with the application.
  • Problems with the proposed approach (voice over approach): users would have to visit the dialog with the profiles very often to turn on and off settings that should not be considered when triggering the profile.
    Do we really need this granularity?

My proposal is to add a general keystroke which manually turns on and off the profile and applies the global configuration instead when focusing the application (e.g. nvda+shift+p). NVDA would report e.g. for Firefox "Firefox profile disabled, global configuration enabled". Pressing again, NVDA would report "Firefox profile enabled, global configuration disabled".

@Adriani90
Copy link
Collaborator

@seanbudd could you please close #14593 (comment)
?
That issue is locked only to collaborators, I don't know why I cannot close it but that issue does not have a clear use case. This one would fit most into what that user requested and this one contains a very constructive discussion.

@pitermach
Copy link
Author

@Adriani90 I'm not sure how your proposed idea would solve this problem? Unless this is something that would be available in addition to the locking features discussed earlier. NVDA already has a facility to add hotkeys to toggle profiles, but it has to be enabled for each profile so I guess having a temporarily disable app specific profile command could be useful. But I don't see how it might solve a situation like described by others and myself earlier.

@Adriani90
Copy link
Collaborator

@pitermach your explanation suggests you want to use temporarily some of the global settings on an application where you currently created a profile for. So that means you want global settings to be applied on the profile only for a certain period of time. Right?
Why is not an option for you to just apply the global profile on the application by pressing a key stroke and disable it again when you need the application profile again?

@CyrilleB79
Copy link
Collaborator

Problem:

* The user creates a profile for an application but changes a setting on the global configuration while not focusing the application. So the settings do not inherit to the profile from another place.

* Expected solution: it should be possible to change settings else where and still impact the way NVDA behaves with the application.

@Adriani90, sorry, I do not understand this part.
Could you please explain this problem and expected solution more clearly? Thanks.

@Adriani90
Copy link
Collaborator

@CyrilleB79 this was just a summary of what @pitermach described as expected. He wants to change a setting on the global profile and this should be reflected also when using the application with the specific profile.

That's why I have proposed to have a way to temporarily disable the application profile and enable the global profile, then switch again to application profile when needed, all by pressing nvda+shift+p.

@XLTechie
Copy link
Collaborator

XLTechie commented Mar 30, 2024 via email

@Adriani90
Copy link
Collaborator

@XL wrote:

So the
problem you describe is not solved.

Not entirely, but at least temporarily when some global settings are more useful.

For example

  1. Create a profile for a browser (e.g. Firefox) and make sure tables and table headers are disabled in document formating settings;
  2. take two wesites, one with a huge table where you need table headers to be reported, and one with a small table where table headers are not important
    Actual: NVDA will not read the table and the table headers on both websites
    Expected: NVDA should read headers and table role only on one of both websites

My proposal is maybe not the best solution. But in this case I can apply temporarily the global profile with nvda+shift+p on the website I need the table headers, and the role to be reported, and alternatively I can disable the global profile again and enable the Firefox profile with nvda+shift+p on the website I don't need the headers and the table role to be reported.
I think it is still the most comfortable way to do this by pressing a keystroke whenever I need it, instead of defining manually which setting should be inherited from global profile and which one should come from the application profile.

Having a list of settings where I choose which one should be excluded from a profile is an overkill in this case, but this is only my opinion.
On the other hand, having such a global keystroke switching between global profile and application profile means we have to press it everytime when we need settings from global profile to be honored instead of settings from application profile.
But in my view this is more convenient than a dialog with many settings I have to manage, and maybe I forgot which settings I excluded from the profile and I have to check this again and again.

@XLTechie
Copy link
Collaborator

@Adriani90 I understand better what you are thinking with that suggestion, thanks.
Unfortunately, it still doesn't solve the problem of other settings "leaking" into the profiles, which is the main problem of this issue. Though it does provide a possibly good temporary workaround for changing things, I think users will still accidentally change things a lot in their profiles, and it doesn't help with that.

I think @CyrilleB79's solution in #10156 (comment) is best. I may make an attempt to implement this, as I have been running into this annoying issue myself recently.

@Simon818
Copy link

Simon818 commented Apr 1, 2024

If you want to change whether table headers are read, make a hotkey for it. If you have many settings you want to quickly swap between, make a separate profile that includes those settings, and then set a hotkey to activate it. This idea is kind of adjacent to the issue.

Having a lock/unlock (or "prevent further changes") button would cover 95% of use cases. Then we could take stock of whether people want to be able to control automatic configuration saving on a per/profile basis. Personally, I would be fine with changes to existing settings within a profile being saved to that profile. I imagine most profiles will have fewer than 10 settings in them, and the existence of the lock/unlock button would mean that any settings added to the profile are very intentional, so most users should know that adjusting those settings will cause changes to be made to the profile where they reside.

If people don't like the automatic saving and someone creates an issue for it, then maybe a further addition to NVDA could allow profiles to be permanently locked so that no further settings changes would be saved to the profile at all. But this is confusing. That means if I adjust speech rate in Audacity when there's a profile active, that speech rate won't be saved at all, but if I adjust speech rate on my desktop, that change will be saved to the configuration file on exit. I don't find this approach intuitive at all.

Most importantly, settings are already saved automatically, including new ones that leak into the profile. I want to focus on pushing for a single change at a time. I think we can all agree that we badly need a lock/unlock button. (If anyone disagrees with that, feel free to chime in.) If we can get that done, that's out of the way, and then any necessary discussions can happen about future enhancements/changes to the way that works.

@XLTechie
Copy link
Collaborator

XLTechie commented Apr 1, 2024 via email

@Simon818
Copy link

Simon818 commented Apr 1, 2024

@XLTechie I hear what you're saying. I don't know the specifics of coding a system that allows value changes to existing parameters but prevents further parameters from leaking into the profiles. however, it seems like these are separate functions of the profile system and either or both should be possible.

I also feel like the value lock would be extremely user-hostile and would just solve one problem while introducing another. There are too many considerations and unexpected behaviours for me to be in favour of this approach.

For instance, if your profile for browsers automatically disables reading of table coordinates, you want to be able to re-enable those in case you need them on a particular website. If there's a value lock on the profile, you can still re-enable coordinates, but then, when does that setting revert back to default? If I go back to the desktop and then back to the browser, has NVDA temporarily saved my setting change to memory, in which case it will apply it to the browser again? Or will it be more like JAWS, where a setting change will only apply until you switch out of the window, and then it will permanently revert?

If it's the former, this is confusing because people are likely to leave NVDA running for long stretches of time, so a change to table cell coordinates will probably stay in effect for quite some time as well. But then, it will immediately revert after the first NVDA reload, which could happen at any time for any reason. This could cause confusion when users wonder why their table coordinates are back to not reading.

If setting changes only apply until you switch in and out of the profile, switching out of the browser window to read an incoming message--or, for that matter, getting a pop-up alert from another application would cause the table coordinates setting to revert to being disabled, as per the saved profile.

And in both cases, users who haven't read the documentation carefully would expect a ctrl+nvda+c to save any changes they make to the profile. It's strange to have throwaway settings in certain contexts and permanent / saveable settings globally.

So until we can work out a more sensible approach, I can't really vote in favour of the value lock. I think the lock button should simply prevent further settings from accidentally leaking into the profile. In addition to this being more user-friendly, the issue title is "allow excluding certain settings from configuration profiles", not "allow users to prevent further changes to configuration profiles", and the parameter lock would fit @pitermach's use case even if it isn't exactly the proposed solution. It also saves developers from needing to plan, design, and test an entirely new UI for adding only certain settings to the configuration profile. The lock button would decide which settings to include in the profile, rather than deciding exactly what the value of those settings should be.

Curious to hear thoughts of others who have weighed in here, in case I've missed something.

@Adriani90
Copy link
Collaborator

@XLTechie wrote:

Unfortunately, it still doesn't solve the problem of other settings "leaking" into the profiles, which is the main problem of this issue.

@XLTechie I think combining profile setitings with inherited settings from global profile can get very complex, especially when people have a lot of profiles. I guess we would need a lot of temporary ini files where the combined settings are stored for the time the profiles are locked. Not sure this is efficient. Is the leaking feature really needed? Or could people live with the nvda+shift+p solution which can switch between aplication profile and global profile on demand?

@Adriani90
Copy link
Collaborator

@Simon818 wrote:

I think the lock button should simply prevent further settings from accidentally leaking into the profile. In addition to this being more user-friendly, the issue title is "allow excluding certain settings from configuration profiles", not "allow users to prevent further changes to configuration profiles", and the parameter lock would fit @pitermach's use case even if it isn't exactly the proposed solution.

As far as I understand @CyrilleB79's approach, the lock button would not write further settings to the profile.ini file for the focused application, but settings from global profile will be inherited to the locked profiles. So for example if you lock 5 profiles, settings you change on the global profile will inherit also to all 5 locked profiles. When you unlock them the profiles will resume to the usual profile.ini file.

In fact, this is kind of a more manual approach of my nvda+shift+p approach, with the advantage that you can apply it to more than one profile at the same time.
However, the risk is that people might forget which profiles they locked and this might result in confusions.
@CyrilleB79 one question:
Let's assume you lock a profile, and change 5 different settings on the global profile which are inherited to the locked profile temporarily. How should this be stored in NVDA? should there be a temporary ini file that combines settings from locked profile with settings from main profile?

@XLTechie
Copy link
Collaborator

XLTechie commented Apr 1, 2024

@Adriani90 asked:

Is the leaking feature really needed?

Do you mean the "locking" feature? Because leaking is the symptom for which @CyrilleB79 proposed locking as the solution.
Locking is the most simple from a UI prospective, compared to trying to develop a UI for managing which settings are attached to the profile and which aren't.

Or could people live with the nvda+shift+p solution which can switch between aplication profile and global profile on demand?

Some might, I certainly can't speak for all use cases. However it doesn't really solve the problem that people complain about.

Consider:

  • As you work throughout the day, you find you are more able to understand fast speech rates. So you gradually increase speech rate. You mean for this to be the case everywhere, but you forgot that you had setup a Firefox profile a few weeks ago, so this is only effective in Firefox.
  • Then, you change out of Firefox, and suddenly find your rate lowered.
  • But meanwhile, you had also changed several reading mode options, such as column reading, character vs. word reading for form entries, etc. You want those changes to stay in Firefox, but while you were increasing your speech rate, you neglected to remember that the profile was active, so now your speech rate is mixed with your other profile settings. The only way to reset your speech rate, is to delete the profile, or to manually lower it back to where you want it, to match the rest of the system.
    This is a simplistic example, of course, because speech rate is easy to change, and easy to notice when it's out of normal. But this can also apply to much more subtle settings, that effect the screen reading experience, but are not always noticed when they aren't effective in a desired context, such as browse mode or document formatting preferences across various browse mode apps.

Now, let us say that your suggestion is implemented.
The user has to now adjust the speech rate twice, to achieve a speech rate faster everywhere.
The user must:

  1. Remember that the Firefox profile is active.
  2. Use the key sequence to return to global temporarily.
  3. Change the speech rate.
  4. Re-enable the Firefox profile.
  5. Adjust the speech rate again, because now it is slower than global.

Now the speech rate is saved in two places, when really it is only desired in one.
And the user must constantly track the differences between the two speech rates, which is no different than the situation now. So problem not solved.
Again, simplistic with speech rate as example.

@XLTechie
Copy link
Collaborator

XLTechie commented Apr 1, 2024

@Adriani90 wrote:

However, the risk is that people might forget which profiles they locked and this might result in confusions.

I think this is true. So it is with any advanced feature. If you choose to use it, you take the risk that it might confuse you, and you must learn its intricacies and comprehend its documentation. Profiles are already an advanced feature, it is just one that has become ubiquitous in screen readers because of its obvious utility.
So while I think you are right, I don't think it is a bar to implementation.

Let's assume you lock a profile, and change 5 different settings on the global profile which are inherited to the locked profile temporarily. How should this be stored in NVDA? should there be a temporary ini file that combines settings from locked profile with settings from main profile?

Why should that be necessary when it isn't necessary now? Currently, settings that have not been changed in the active profile, are read from the global profile. That situation would not change. No config file, temporary or otherwise, is necessary to tell NVDA which settings are not part of the profile. Profiles are not subtractive, they are additive. Or, said another way, the profile's settings "cover over" the global profile's settings.
It is like a piece of white tape with new words on it, covering words on a piece of paper.
You do not have to replace the whole sheet of paper with tape and replicate the original words on it, saying "these words are not changed"--you just cover the words to be changed with tape and new words, and let the remainder of the page be read as if no part of it was covered.

Locking a profile requires only a single flag (or two, at most), saying "If a non-overridden parameter is changed, pass it through to the global profile". While I haven't tried it, that flag should be able to be stored in the profile's own .ini file.

@CyrilleB79
Copy link
Collaborator

My main concern was to avoid new parameters leaking in a specific profile. E.g. I define a word profile where punctuation level is set to all. I want to be able to lock Word profile so that only punctuation level parameter belongs to Word profile. Once Word profile is locked, modifying speech rate in Word should should modify the speech rate in the global profile.

After reading @Simon818's comments, it's clear that being able to modify the profile's parameter(s), e.g. punctuation level in Word profile, is the simplest choice from a UX point of view; it avoids to define what happens if I modify punctuation level in Word when its profile is locked? And what happens when turning back to global profile?

I also fully agree with @Simon818 regarding the fact that one issue should be handled at a time. This issue is becoming always more complex. I'd vote for implementing the lock profile button/checkbox in a first step. Then we can play with it and see if something else should be added or not.

@Adriani90, not sure to understand your explanations regarding inheritance between profiles. Please provide an example to make things clearer if you expect an answer from me. Thanks.

@Adriani90
Copy link
Collaborator

@XLTechie wrote:

Currently, settings that have not been changed in the active profile, are read from the global profile. That situation would not change.

good point, Thanks this clarifies my question.

@Adriani90
Copy link
Collaborator

Actually reading through this I really support the idea of the lock profile feature. I will create a new issue summarizing the conclusion and bring the discussion on point. It seems the community agrees on @Simon818's approach as per comments above.

@Adriani90
Copy link
Collaborator

Closing in favour of #17409.

@Adriani90 Adriani90 closed this as not planned Won't fix, can't repro, duplicate, stale Nov 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
blocked/needs-product-decision A product decision needs to be made. Decisions about NVDA UX or supported use-cases. close/duplicate needs-triage
Projects
None yet
Development

No branches or pull requests

9 participants