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

Version 1.5.3142.0: Unexpected behaviour in tab switcher with "inOrder" mode and custom nextTab/prevTab binding #8247

Closed
viljoviitanen opened this issue Nov 12, 2020 · 20 comments · Fixed by #8250
Labels
Needs-Tag-Fix Doesn't match tag requirements Needs-Triage It's a new issue that the core contributor team needs to triage at the next triage meeting Resolution-Fix-Committed Fix is checked in, but it might be 3-4 weeks until a release.

Comments

@viljoviitanen
Copy link

Environment

Windows build number: Microsoft Windows [Version 10.0.19042.630]
Windows Terminal version (if applicable): Windows Terminal Preview Version: 1.5.3142.0

Any other software? None that should affect this

Steps to reproduce

Set

{
    "$schema": "https://aka.ms/terminal-profiles-schema",
    "tabSwitcherMode": "inOrder",

and custom keybindings for nextTab and prevTab, e.g.

    "actions":
    [
        { "command": "nextTab", "keys": "shift+a" },
        { "command": "prevTab", "keys": "shift+b" }
    ]

Open two tabs or more. Fiddle with the custom keybinds, keep modifier down and press e.g. a key multiple times. Compare to standard ctrl-tab or control-shift-tab bindings.

Expected behavior

Behaviour of nextTab and prevTab is the same with custom bindings as default bindings

Actual behavior

Tabs get changed seemingly randomly. E.g. with four tabs, nextTab second press (modifier kept down) gets stuck to first tab, prevTab to third tab.

Notes

This is not very important, I can personally get the behavior I want by setting tabswitcher to "disabled". Still, this is something that clearly is unexpected, or rather, wrong behavior.

@ghost ghost added Needs-Triage It's a new issue that the core contributor team needs to triage at the next triage meeting Needs-Tag-Fix Doesn't match tag requirements labels Nov 12, 2020
@justinkb
Copy link

I have the default nextTab/prevTab binding and it's not working right for me either, so probably not related to keybindings

@Don-Vito
Copy link
Contributor

I have the default nextTab/prevTab binding and it's not working right for me either, so probably not related to keybindings

@justinkb - are you sure you have "tabSwitcherMode": "inOrder" setting?
I am trying to reproduce the issue and it happens only with custom bindings

@Don-Vito
Copy link
Contributor

The problem happens for me only for custom binding and only if I continue holding shift.

In this situation we somehow call CommandPalette::SelectNextItem where no item is still selected.
Since no item is selected

  • when moving forward we get to the tab (-1 + 1) modulo size - aka first tab
  • when going backward we get to the tab -1 -1 modulo size - aka tab before the last

@Don-Vito
Copy link
Contributor

@zadjii-msft - it looks that there are two code paths for Ctrl+Tab and for everything else:

Ctrl + Tab is working perfectly

  • On the first tab navigation TerminalPage::_SelectNextTab resets the tab commands, and since palette is not visible selects the relevant tab index
  • On the second navigation Ctrl+Tab is intercepted by CommandPalette::_previewKeyDownHandler and everything works fine

But with custom binding things are screwed:

  • On the first tab navigation TerminalPage::_SelectNextTab resets the tab commands, and since palette is not visible selects the relevant tab index
  • On the second navigation keys are not intercepted and thus TerminalPage::_SelectNextTab is called again. It resets the commands, but now since the palette is visible we simply invoke CommandPalette::SelectNextItem. Which in turn misbehaves because no item is selected.

I am working on some fix, let's continue the discussion in the PR once it is open.

@ghost ghost added the In-PR This issue has a related PR label Nov 12, 2020
@justinkb
Copy link

justinkb commented Nov 12, 2020

I'm just using ctrl+tab, and I do have "tabSwitcherMode": "inOrder" in my settings.json, and it works only alternatingly, like with your use case. Is there any easy way I can create a quick screen cast video to demonstrate the behavior?

In any case, since the tab switcher is a regression for my workflow anyway, I'm just disabling it entirely.

@Don-Vito
Copy link
Contributor

@justinkb - thanks for the reply! If you could create a screen capture it could really help:

  • I believe I fixed a bug with custom bindings (if the team will like my implementation), but the scenario I fixed should not happen with Ctrl+Tab.
  • I am unable to repro the scenario

To create the captures I usually use https://www.screentogif.com/ (which is free and doesn't require installation).

@justinkb
Copy link

About to go to sleep, I'll take another look at this tomorrow, or over the weekend, cheers

@ghost ghost closed this as completed in #8250 Nov 13, 2020
ghost pushed a commit that referenced this issue Nov 13, 2020
There are two code paths for Ctrl+Tab and for everything else:

Ctrl + Tab is working perfectly
* On the first tab navigation TerminalPage::_SelectNextTab resets the
  tab commands, and since palette is not visible selects the relevant
  tab index
* On the second navigation Ctrl+Tab is intercepted by
  CommandPalette::_previewKeyDownHandler and everything works fine

But with custom binding things are screwed:
* On the first tab navigation TerminalPage::_SelectNextTab resets the
  tab commands, and since palette is not visible selects the relevant
  tab index
* On the second navigation keys are not intercepted and thus
  TerminalPage::_SelectNextTab is called again. It resets the commands,
  but now since the palette is visible we simply invoke
  CommandPalette::SelectNextItem. Which in turn misbehaves because no
  item is selected.

The approach for the solution is not to reset anything if the command
palette is already open.

## Validation Steps Performed
* Manual testing of both custom and non-custom bindings with different
  amount of tabs.

Closes #8247
@ghost ghost added Resolution-Fix-Committed Fix is checked in, but it might be 3-4 weeks until a release. and removed In-PR This issue has a related PR labels Nov 13, 2020
@DHowett DHowett pinned this issue Nov 13, 2020
@Don-Vito
Copy link
Contributor

@justinkb - this issue was auto-closed since the custom binding fix was merged. Yet if you have a capture for non-custom binding please attach it here or open a new ticket and I will take a look.

@Tira007
Copy link

Tira007 commented Nov 13, 2020

@Don-Vito Why do you break the tool that always worked? Just switch the tab forward - this is a hemorrhoid for 10 seconds, turn it back, another hemorrhoid for 10 seconds. We made a new function, so let people put it and enable it, leave the working version by default. How do I get it back? your "useTabSwitcher" : false , not "tabSwitcherMode" : "inOrder" do not work, as tabs switch randomly, and continue. 1.4.3141.0. With all the nerves burned.

@zadjii-msft
Copy link
Member

Hey don't throw shade at @Don-Vito, he's just a contributor who's fixed a bunch of bugs. You can throw shade at me, or anyone else in the Microsoft org, but not other external contributors

@Don-Vito
Copy link
Contributor

@Don-Vito Why do you break the tool that always worked? Just switch the tab forward - this is a hemorrhoid for 10 seconds, turn it back, another hemorrhoid for 10 seconds. We made a new function, so let people put it and enable it, leave the working version by default. How do I get it back? your "useTabSwitcher" : false , not "tabSwitcherMode" : "inOrder" do not work, as tabs switch randomly, and continue. 1.4.3141.0. With all the nerves burned.

@Tira007

  1. I mentioned "tabSwitcherMode" in this post since in the original reporter used version 1.5 and mentioned this flag explicitly. I could not assume that you will try to apply techniques from 1.5 to 1.4.
  2. There were several threads from yesterday and today talking about how to revert to the original behavior in all versions. You can find some more explanation (by me) here: Ctrl+Tab toggle between last two windows like Alt+Tab #973 (comment)
  3. I can feel your frustration when working functionality breaks, I agree that it is probably not a good idea to change the default behavior when the feature is just released, but please remember - that behind the code there are people who work really hard to deliver what community asks, and not some flawless robots with perfect decision making.

@viljoviitanen viljoviitanen changed the title Unexpected behaviour in tab switcher with "inOrder" mode and custom nextTab/prevTab binding Version 1.5.3142.0: Unexpected behaviour in tab switcher with "inOrder" mode and custom nextTab/prevTab binding Nov 13, 2020
@Don-Vito
Copy link
Contributor

Hey don't throw shade at @Don-Vito, he's just a contributor who's fixed a bunch of bugs. You can throw shade at me, or anyone else in the Microsoft org, but not other external contributors

@zadjii-msft - few things:

  1. I am not "just a contributor" - I am your favorite one 😆
  2. By your definition, Tira can throw a shade on me as well, since I am also in Microsoft org (though work on the Terminal at nights / while eating my lunch)

@Blklove

This comment has been minimized.

@Tira007
Copy link

Tira007 commented Nov 14, 2020

@Don-Vito I apologize for my emotional outburst, I just tried to read the documentation, they told us how to do it, to return it, I did it, it didn't work, I went to read the comments, and who wrote what helped them, but I still couldn't work, I had to abandon terminal, and look for a new terminal to continue working. Thanks for the answer. And yes, I understand what people are behind the code, and what people are asking about the function, but probably start it correctly, describe how to enable it, and then, if everything is fine, and it is so necessary by default, enable it, and not immediately on release ... And so in the beginning I look for everything in the comments, in the documentation, looking for solutions trying to understand. But it doesn't work. All the best.

@Don-Vito
Copy link
Contributor

@Tira007 - we are good, I absolutely get your frustration and I totally agree that changing default behavior should be treated very carefully. I am not on the team, but I would suggest (for major use-cases at least):

  1. Don't change the default to an alternative that wasn't tested in production for one minor at least (usually one month)
  2. Upon changing defaults provide clear way to opt out (if possible - in UI)
  3. Engage with the end-users / community more: make decision making more transparent, provide heads up for upcoming changes

BTW, not sure if it was applicable in your scenario, for critical scenarios I simply pin the version, e.g., with chocolatey:

choco install microsoft-windows-terminal --version=1.3.2651.0

In any case, there is a bunch of other good terminals, that will hopefully meet your needs. Hope that one day you try this one again, as the team and the community is learning and improving.

@viljoviitanen
Copy link
Author

Don-Vito:

  1. Don't change the default to an alternative that wasn't tested in production for one minor at least (usually one month)

Indeed. In my opinion this change in tab behavior to mru by default was a not a good thing. Tabs changing is such a basic thing with tabbed terminals, changes to tab behavior should not be done without careful consideration. Anyway, I consider the tabbed interface model to copy from to be browsers - especially new Edge - so the default behavior should be the same as there, i.e. "disabled" (or in 1.4 "useTabSwitcher": false). But I guess it's way too late for this discussion, that ship already sailed.

@DHowett
Copy link
Member

DHowett commented Nov 19, 2020

Hey everyone,

Thanks for bearing with us while we make our mistakes. I'm going to release a quick servicing update to both 1.4 and 1.5 that flips the default back to the way it's been for the past year and a half. MRU will be opt-in, and when #1564 lands it'll be easier to find than "just go your JSON settings and type in whatever magic string we tell you to." I accept that we allowed a vocal subset of our users to dictate what our default settings should be, to the detriment of the folks who've been using Terminal the longest.

If all goes to plan, these updates will go out as 1.4.3241 and 1.5.3242.

/cc @WilliamKyle @davidchisnall @zachjweiner from #8233

d

@davidchisnall
Copy link

Thanks @DHowett, great to see all of the improvements in the terminal (and happy to be running the preview version so things like this get caught before most users see them)!

DHowett pushed a commit that referenced this issue Nov 20, 2020
There are two code paths for Ctrl+Tab and for everything else:

Ctrl + Tab is working perfectly
* On the first tab navigation TerminalPage::_SelectNextTab resets the
  tab commands, and since palette is not visible selects the relevant
  tab index
* On the second navigation Ctrl+Tab is intercepted by
  CommandPalette::_previewKeyDownHandler and everything works fine

But with custom binding things are screwed:
* On the first tab navigation TerminalPage::_SelectNextTab resets the
  tab commands, and since palette is not visible selects the relevant
  tab index
* On the second navigation keys are not intercepted and thus
  TerminalPage::_SelectNextTab is called again. It resets the commands,
  but now since the palette is visible we simply invoke
  CommandPalette::SelectNextItem. Which in turn misbehaves because no
  item is selected.

The approach for the solution is not to reset anything if the command
palette is already open.

## Validation Steps Performed
* Manual testing of both custom and non-custom bindings with different
  amount of tabs.

Closes #8247

(cherry picked from commit 0437fe9)
DHowett pushed a commit that referenced this issue Nov 20, 2020
There are two code paths for Ctrl+Tab and for everything else:

Ctrl + Tab is working perfectly
* On the first tab navigation TerminalPage::_SelectNextTab resets the
  tab commands, and since palette is not visible selects the relevant
  tab index
* On the second navigation Ctrl+Tab is intercepted by
  CommandPalette::_previewKeyDownHandler and everything works fine

But with custom binding things are screwed:
* On the first tab navigation TerminalPage::_SelectNextTab resets the
  tab commands, and since palette is not visible selects the relevant
  tab index
* On the second navigation keys are not intercepted and thus
  TerminalPage::_SelectNextTab is called again. It resets the commands,
  but now since the palette is visible we simply invoke
  CommandPalette::SelectNextItem. Which in turn misbehaves because no
  item is selected.

The approach for the solution is not to reset anything if the command
palette is already open.

* Manual testing of both custom and non-custom bindings with different
  amount of tabs.

Closes #8247

(cherry picked from commit 0437fe9)
@ghost
Copy link

ghost commented Nov 20, 2020

🎉This issue was addressed in #8250, which has now been successfully released as Windows Terminal v1.4.3243.0.:tada:

Handy links:

@ghost
Copy link

ghost commented Nov 20, 2020

🎉This issue was addressed in #8250, which has now been successfully released as Windows Terminal Preview v1.5.3242.0.:tada:

Handy links:

@DHowett DHowett unpinned this issue Nov 27, 2020
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Needs-Tag-Fix Doesn't match tag requirements Needs-Triage It's a new issue that the core contributor team needs to triage at the next triage meeting Resolution-Fix-Committed Fix is checked in, but it might be 3-4 weeks until a release.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

9 participants