microsoft / terminal

The new Windows Terminal and the original Windows console host, all in the same place!
MIT License
95.26k stars 8.27k forks source link

Allow user to specify the number of rows or columns to increase or decrease by when resizing pane via keyboard. #17843

Open freddiehaddad opened 1 month ago

freddiehaddad commented 1 month ago

Description of the new feature/enhancement

When resizing panes via keyboard, it would be nice to specify the resize amount. Right now, when you resize the pane, the amount is different depending on pane width, window width, etc. Can we have the ability to resize by X columns or rows (depending on resize direction)?

Proposed technical implementation details (optional)

In the keyboard settings, when assigning a keyboard shortcut for pane resizing, allow a second integer value specifying the number of columns or rows to resize by.

If the user specifies the value 2 for the resize pane action, then if they grow or shrink the pane, it will increase or decrease by 2 rows or columns depending on direction.

carlos-zamora commented 2 weeks ago

Thanks for filing! Yeah, this seems like something we could add in as an action arg for the resize pane action.

freddiehaddad commented 2 weeks ago

@carlos-zamora If you think this could be a good first ticket for me and you have some cycles to provide guidance, I can work on it.

carlos-zamora commented 2 weeks ago

Sure! I can help a bit. Here's a writeup of what needs to be done. Hope it helps 🙂

References:

freddiehaddad commented 2 weeks ago

After a few minutes looking through the code, I see the default behavior is to resize the pane in 5% increments based on the focused pane's dimensions. This explains the peculiar resize behavior (i.e. 5% of 500px pane vs 5% of a 1000px pane).

Questions:

  1. In order to resize by rows or columns, we need to know font dimensions, correct?
  2. If the answer to question 1 is yes, then how do we query the row/col dimensions of the font being displayed in the pane?
  3. Would it be easier to just resize by a user-specified number of pixels?
carlos-zamora commented 2 weeks ago
  1. In order to resize by rows or columns, we need to know font dimensions, correct?
  2. If the answer to question 1 is yes, then how do we query the row/col dimensions of the font being displayed in the pane?

Hmm, looks like Pane::_CreateRowColDefinitions() uses _desiredSplitPosition to determine where the split is (in percentage units). So, I guess if you can figure out a way to update that appropriately, yeah. You'd have to use the font size to figure out how much a row/column is and update that appropriately?

📝 Keep in mind, different terminals/panes may be using different font sizes (though I think you'll be fine; you'll just have to retrieve the font dimensions from the current pane/terminal and use that).

Looks like the font dimensions are exposed on TermControl::CharacterDimensions (check the units on that). So you'll have to go from Pane --> IPaneContent (check that it's a TerminalPaneContent) --> TermControl.

📝 Hmm... if the current pane isn't a terminal, what should we do to resize? I think it would still be good to resize as opposed to just preventing the action from happening, but it'll probably be something to play with to see how it feels "right".

  1. Would it be easier to just resize by a user-specified number of pixels?

Oh totally. I have a personal dislike for pixels as a unit though haha. Maybe percentage? That would avoid all of the extra work I mentioned above, and you'd really just modify the amount variable in Pane::_Resize(). I imagine that would solve your feature request adequately too.

Oh, I also found this PR: https://github.com/microsoft/terminal/pull/16895. Seems pretty relevant to you 🙂.