As explained by magiblot at the bug below, "When double clicking with
the right button, the sequences sent to the application in the terminal
are DOWN-UP-UP instead of DOWN-UP-DOWN-UP."
BUG: 425926
When a Splitter has only one child, it can be removed, and the
child can be united with the widget above, unless it's the only
splitter - as that holds the main widget.
The existing code scans through `programs` to find an acceptable
shell to start; `_program` is the shell that is configured for
the session (line 456). The first shell to be found from that
list, is assigned to `exec` and we'll run that shell.
If the shell found wasn't the one configured (e.g. one of the
other ones from the list) then a warning is printed, but we carry on.
**However**, if the shell found is the **last** one in the list
(i.e. `/bin/sh`) then a warning is printed and the shell does
not start.
If the configured shell is `/bin/sh` this obviously breaks down:
it is found (as the first one in the list!) but still equals the
last one; the warning is printed and nothing runs.
It is unclear **why** `/bin/sh` is not allowed as a shell:
it exists, it's an executable, and it's an interactive shell.
Curiously, configuring the shell as `sh` for the session runs
`/bin/sh` in the end, but just tricks the logic here:
- `checkProgram("sh")` returns `sh` as string,
- so the comparison against `/bin/sh` fails,
- and we can run `sh` .. which is `/bin/sh`.
There's no good reason to forbid `/bin/sh`, so change the check to
**only** fail if no shell was found at all (`exec` stayed empty)
or if the found shell behaves weirdly (is not equal to itself).
A new assert in GCC 11.1.0 std::piecewise_linear_distribution fails in
the case that the lower and upper boundaries are equal. So, make sure
to not construct a std::piecewise_linear_distribution when minSaturation
equals maxSaturation and when minLightness equals maxLightness.
BUG: 434892
It should be uint. I am not sure this fixes the mentioned bug, but it's
correct anyway, std::mt19937 and co. unsigned types; and we shouldn't mix
signed with unsigned.
CCBUG: 434892
We only need to set the favourite emblem for the default profile icon, for
other profiles, the profile icon is already set on the menu action.
Rename a lambda to a more meaningful name.
BUG: 437200
FIXED-IN: 21.08
Commits 9ffe33a27a and
4352df00d9 introduce and use a
getScreenLineColumns(line) method to provide support for DECDWL
(Double-Width) lines.
It turns out that under some conditions on resize Screen::_cuY (the
current cursor Y position) and ScreenWindow::endWindowLine() can have
different ideas of how many lines the terminal has.
A test that asserts:
- while [ true ]; do echo -e "\e[?1047h"; done
- Resize the window, making it smaller
BUG: 436327
Restore Y coordinate before X coordinate, so we make sure Y is in bounds
before trying to access _lineProperties depending on Y.
To test:
- Go to the last line
- tput sc
- Shrink the terminal
- tput rc
It is removing the vector of lines storage. Now it is using a similar
idea used in history file.
All chars are stored in a linear way, only the line indexes are
changed when reflowing.
No speed problem found when removing lines.
When you open settings and close it, than open a new window, than
close the old window, the MainWindow with the settings will
delete the configDialog. If you try to open settings againg it crashes.
Fix is each MainWindow now has its own configDialog.
BUG: 436366
Konsole wasn't really keeping track of changes to line rendition
attributes, and was just always marking for update the top line of
double-height lines. This didn't account for double-width lines, changes
back to single-width single-height, and did not provide proper support for
separate rendering of the bottom of double-height lines.
The effect can be seen on vttest "Test of known bugs" (9) -> "Erase
right half of double-width lines" (8), where a line is changed from
single-width to double-width and back. The line wasn't re-rendered on
each change, as it should.
Can also be tested with:
echo -e "\e[2J\e[1;1HTEST\n"; sleep 1; echo -e "\e[1;1H\e#6\e[2;1H"
Double height lines are actually two lines, the first with the top part
of the characters, the second with the bottom part. Reflowing could lead
to situations where we render a top part, a double height line with its
top and bottom parts, and a bottom part, which looks weird.
There is a difference with xterm behavior: when the screen width is an
odd number of columns, xterm allows selecting up to columns/2+1, we just
allow selecting up to columns/2.
While DECDHL/DECDWL lines are not wrapped at the correct column, now at
least reflowing doesn't clear line rendition attributes, so resizing
Konsole and going back to the original size always recovers the original
content, including double-height/double-width status of each line.
Reflowing double-height lines doesn't make much sense, since a
double-height line actually consists of a top (T) and a bottom (B)
line. Shrinking them could lead to TTBB lines, which look weird. At
least now going back to the original size brings back the original
content in all its glory.
While DECHDL sequences should be used in pairs on adjacent lines, the
first line drawing the top half, and the second line drawing the bottom
half, apparently real VTxxx (or at least the VT220) terminals did draw
only the top or bottom of characters when confronted with an isolated
DECDHL line (https://retrocomputing.stackexchange.com/questions/18023/).
xterm has that same behavior. So behave likewise.
EL (Erase Line) should not reset the line rendition attribute to
single-width. ED (Erase Display) should only reset it for completely
cleared lines. ECH (Erase CHaracters) should obviously not reset it.
DECSED and DECSEL (Selective Erase, not supported by Konsole) should not
reset it.
This fixes a vttest test where a line is set to double-height-top and
then EL before writing its text and the double-height-bottom line below.
Can also be tested with:
echo -e "\e[2J\e[4;1HNormal\n\e#6DOUBLE\n\e#6DOUBLE\nNormal" &&
sleep 2; echo -e "\e[5;3H\e[1J\e[8;1H"
Some control functions special case the last column. When a line has
been set to double-width via DECDWL or DECDHL (double-height and
double-width), the correcr last column for that line should be used.
Control functions which special case the last column include TAB, CUF,
ICH and DECRC.
Can be tested with:
perl -E '$r=join "", map{$_%10}1..80; say "\e<\e[?40h\e[?3l\e[?7l$r";
$s="L"."\tx"x4 ."\t\tR"; say "\e#3$s\n\e#4$s"'
The above tests that tabs don't travel beyond the last column in
double-width lines. The last column (below columns 79 and 80 of
the previous line) should have an "R".
perl -E '$r=join "", map{$_%10}1..80; say "\e<\e[?40h\e[?3l\e[?7h$r";
$s="L"."X"x36 ."\e[6C"."R"; say "\e#3$s\n\e#4$s"'
The above tests that CUF (Cursor Forward) doesn't travel beyond the last
column in double-width lines. The last column (below columns 79 and 80
of the previous line) should have an "R".
perl -E '$r=join "", map{$_%10}1..80; say "\e<\e[?40h\e[?3l\e[?7h$r";
$s="L"."X"x22 ."R"."x"x8 ."r"."\e[17D\e[16@";
say "\e#3$s\n\e#4$s"'
The above tests that ICH (Insert CHaracters; VT200+) doesn't write past
the last column, visible on repaints (switch to another window and
back).
perl -E '$r=join "", map{$_%10}1..80; say "\e<\e[?40h\e[?3l\e[?7h$r";
$s="L"."X"x38 ."r\e7\e[H\e8R"; say "\e#3$s\n\e#4$s"'
The above tests that DECRC (Restore Cursor) doesn't restore the cursor
to a position beyond the last column on double-width lines. The last
column should have an "R", "r" should not be visible.
perl -E '$r=join "", map{$_%10}1..80; say "\e<\e[?40h\e[?3l\e[?7l$r";
$s="L"."X"x38 ."R"; print "\e#6$s"'; sleep 5; echo
The above tests that the cursor stays at the rightmost column. The
cursor should stay over the "R" for 5 seconds.
Since double-width/double-height lines have room for just half the
characters, take that into account.
Can be tested with:
perl -E '$r=join "", map{$_%10}1..80; say "\e<\e[?40h\e[?3l\e[?7h$r";
$s="L"."X"x38 ."RL"; say "\e#6$s"'
The above tests that appending characters to double-width lines in
DECAWM (Auto Wrap Mode) wraps at the correct last column. There should
appear a second line (single-width) with a single "L".
perl -E '$r=join "", map{$_%10}1..80; say "\e<\e[?40h\e[?3l\e[?7l$r";
$s="L"."X"x42 ." TEST FAILED OUTOFBOUNDS R"; say "\e#6$s"'
The above tests that appending characters to double-width lines in
non-DECAWM (Auto Wrap Mode) doesn't write past the last column (visible
on repaints - switch to another window and back). The last column (below
columns 79 and 80 of prev line) should have an "R".
When there were several runs of double width/double height runs with
differing color/rendition/line draw/..., the second and subsequent runs
were positioned wrong. Fix the calculation of the starting x position to
account for double width, and fix a bug were the y position was
incremented for every run instead of for every line.
Can be tested with:
perl -E '$s="\e[0mTEST\e[32mTEST\e[0m"; say "\e#3$s\n\e#4$s"'