Commit Graph

317 Commits

Author SHA1 Message Date
Luis Javier Merino Morán
28931090bc Adjust selection point coords when scrollback shrinks
The selection point coordinates are relative to the start of the
scrollback, so when the scrollback shrinks, either because it is limited
to some amount of lines, or because it is cleared, we could end up with
stale coordinates which could cause a crash on a subsequent selection
extend operation.

BUG: 470346
2023-06-01 06:24:55 +00:00
Matan Ziv-Av
542a04560d Add "Monitor for Prompt" action
When semantic shell integration is enabled, Konsole will generate a
notification when a shell prompt is displayed.
2023-05-14 14:15:19 +00:00
Matan Ziv-Av
be2a5ac6ae Fix width of emoji characters with VS16
VS16 (emoji presentation variation) may change the width of some
emoji characters from 1 to 2. With this commit, konsole changes the
character width in those cases.
2023-05-07 20:08:15 +00:00
Matan Ziv-Av
a206396862 Do not use _lineProperties.at(line) where line might be too large
Use an access function that returns a default line property when
the line may be outside the screen.

BUG: 466874
2023-03-07 00:54:34 +02:00
Kurt Hindenburg
6cb5e43473 Fix comment spelling 2023-02-23 20:21:53 -05:00
Matan Ziv-Av
feb44c226f Make behaviour of characters with problematic width configurable
Add a profile option to follow Unicode standard for the display width of
characters, where this width differs from glibc's wcwidth.

Currently the only character affected by this is soft hyphen (unicode 0x00ad).

Konsole generally follows wcwidth() function when determining the display
width of characters, since this is behaviour expected by libreadline, and
doing otherwise corrupts lines containing problematic characters. When such
characters are used more for display, then on the command line, following
the Unicode standard may be prefferable.

The default for this option is disabled - that is follow wcwidth().

CCBUG: 464823
2023-02-24 00:46:34 +00:00
Waqar Ahmed
d7706fab23 KonsoleDecoders: Remove konsolecolorscheme dependency 2023-02-23 23:53:26 +00:00
Dāvis Mosāns
5f632663e5 Screen: Fix copyLineToStream Qt6 assert
Qt6 added assert for qBound when min > max.

lineLength can be 0 in which case start always must be 0
2023-02-11 09:23:13 +00:00
Dāvis Mosāns
fc82d52ae1 Screen: Fix copyLineToStream Qt6 assert
Qt6 added assert for qBound when min > max.
This can happen if you try to select text that's after whitespace
because then length will be before start causing negative max.
2023-02-11 09:23:13 +00:00
Luis Javier Merino Morán
f01fdd0a55 Fix trimmed selections in scrollback buffer
Commits 4e69f47b and 9046680f where using an incorrect start of buffer
when trimming trailing spaces and trailing empty cells in a line from
the scrollback buffer.  This could cause too short of a text to be
copied from the selection when there were trailing spaces in the
selection.

BUG: 461542
CCBUG: 455165
2022-11-10 16:35:48 +00:00
Matan Ziv-Av
a732f0060d Some small fixes
- Change Brahmic ranges according to https://invent.kde.org/utilities/konsole/-/merge_requests/764#note_558117
- Use symbolic bitmap values,instead of a magic number.
- Fix a crash with wordModeAttr enabled and bidi disabled
2022-11-08 00:32:56 +00:00
Matan Ziv-Av
31bfc55521 When a character is sent to the screen, calculate and save its script
A character is sent once, and rendered many times, so this is the best
place for the calculation, though it is used only when rendering.
2022-11-08 00:32:56 +00:00
Matan Ziv-Av
29bff83722 Track error status of the command in the line properties. 2022-10-21 23:20:58 +00:00
Matan Ziv-Av
f1cd611108 Track command count in line property
To remember which command each line in the terminal belongs to.
2022-10-21 23:20:58 +00:00
Matan Ziv-Av
7ff0d2bab7 Change LineProperty from int to a class.
It includes more than just flags, and will include even more information.
2022-10-21 23:20:58 +00:00
Matan Ziv-Av
5d6d0b43e6 Keep selection cursor in place when scrolling due to output 2022-10-03 10:46:46 +00:00
Matan Ziv-Av
f26f71db01 Add keyboard selection mode
Similar to screen copy/scrollback mode it allows browsing the scrollback
and selecting text.

Selection is done either by standard GUI shift+arrows, or `vi` style with
`v` starting/ending selection.

BUG: 100317
2022-10-03 10:46:46 +00:00
Tomaz Canabrava
6adbc55310 Don't crash on Screen.cpp 2022-09-07 11:20:13 +02:00
Tomaz Canabrava
25e2a9f6f9 Remove level of indentation
We can always return on the if, and remove the else.
2022-09-07 10:08:21 +02:00
Christoph Cullmann
bec7a69c11 fix Qt 6 compile 2022-08-27 23:36:39 +02:00
Matan Ziv-Av
a4681775ae Modify setDefaultRendition() to reset the underline color. 2022-08-26 19:24:56 +00:00
Matan Ziv-Av
76f879cd70 Draw characters in exact positions
QT can't be made to draw monospaced text (if the font does not cooperate),
so avoid combining characters, using a QPainter::drawText() call for each
character.

For bidi text support this change requires konsole to reorder and reshape
the characters. This is done using the ICU library (which QT also uses).

This change allows for some improvements related to text rendering:

- More precise bidi reordering, which is no longer changed by characters'
  attributes and selection.
- underlines drawn separately from the text, allowing for differing
  underline modes (double, curly, dashed, dotted, colored).
- Overriding font for emoji characters.

This commit fixes a few bugs and addresses a lot more:

Feature requests: More standard conforming RTL and various underlines:
BUG: 403729
BUG: 387811

Using non-monospace font:
BUG: 416508
BUG: 452087
BUG: 425973
BUG: 430822
BUG: 442742
BUG: 441037
BUG: 430822



Emoji:
BUG: 440070
CCBUG: 450017
CCBUG: 445846
CCBUG: 453086

Regression: devanagari rendering
CCBUG: 381593
CCBUG: 451716
2022-08-26 19:24:56 +00:00
Matan Ziv-Av
4e875cdfdd Prevent _replModeStart line number from becoming negative
Hopefully, this solves:
BUG: 457920
BUG: 458015
2022-08-25 19:47:45 +00:00
Matan Ziv-Av
24b0c08d9f Fix three coverity issues
Reported here:
https://mail.kde.org/pipermail/konsole-devel/2022-July/041429.html

- Use delete[] to free array allocated with new.
- Don't separate two cases which are handled identically.
- In vt100 parsing state machine no need to handle in specific states
  characters which are handles identically in all states.
2022-07-18 14:57:25 +00:00
Harald Sitter
87e27eb811 automatic clang-format run (clang 14) 2022-07-11 11:43:02 +02:00
Matan Ziv-Av
9333d6713a Add semantic integration copy actions
- Selecting Copy (or pressing ctrl-shift-c) when there is no selection
  selects current output if current mode is output, current input if
  current mode is input and input is non-empty, and last output if current
  input is empty.
- Ctrl + mouse triple click selects the pointed input/output/prompt.
- There is also a fix that was missed in previous patch for keeping
  track of current semantic mode through scrolls.
2022-07-04 23:53:48 +03:00
Matan Ziv-Av
5389ec11b0 Fix bugs in semantic shell integration
Bugs reported here:
https://invent.kde.org/utilities/konsole/-/merge_requests/691#note_480025
- Properly ignore OSC parameters for now. (later we'll support some).
- Handle Input end for when command gets shorter.
- Always draw separating line in foreground color
- Don't group characters of different REPL type.
- Don't reset double width/height attributes of erased lines.
2022-07-03 21:40:56 +03:00
Matan Ziv-Av
d67de797b6 Allow filtered copy to clipboard
This adds three copy actions:
- Copy only user input
- Copy only command output
- Copy both (filter out shell prompts).
2022-07-03 07:58:54 +00:00
Matan Ziv-Av
c4779f359b Add scroll to previous/next prompt
When using semantic shell integration (OSC 133), ctrl+shift+PgUp/Down
scrolls up down to the next prompt.
2022-07-03 07:58:54 +00:00
Matan Ziv-Av
cfaf997eba Add semantic shell integration
- Add `OSC 133 ; *` escape sequences (where * stands for one of
  A,B,C,D,L,P. For the shell to report text mode
  (one of prompt/input/output).
- Store the mode of each character written to the screen.
- Replace isRealCharacter field in Character with flags.
- Store line length in _lineProperties array.
2022-07-03 07:58:54 +00:00
Matan Ziv-Av
59290e12af Add a new rendition flag RE_TRANSPARENT
This flag is used for cells where the background is not drawn
unlike RE_CONCEAL, which draws background, but not foreground.

This flag is used for cells where an unmanaged image is placed.
2022-06-20 21:38:25 +00:00
Ahmad Samir
7522686088 Use cmakedefine01
This way we get a build time warning if the var isn't defined at all, e.g.
a missing check_include_files() CMake call.
2022-06-13 19:21:52 +00:00
Matan Ziv-Av
37b9f9e363 Manage graphics placements vertical position on text reflow.
When a line is reflowed then the vertical position of all
graphics placements above or below it (as appropriate) are
adjusted, so they remain in the same place relative to the
text lines.
2022-06-10 14:25:03 +00:00
Kurt Hindenburg
a5d69875a4 Fix comment spelling error 2022-05-27 13:10:32 -04:00
Kurt Hindenburg
eb834ca2f7 Give loop variables unique names to avoid shadowing 2022-05-26 11:15:48 -04:00
Luis Javier Merino Morán
836b1d9814 Selecting past last char -> extend to last column
When selecting past the last character, extend the selection to the last
column.  This allows the user to know when the selection has extended
past the last character on a line, even in the presence of trailing
spaces, and will get a newline added to the last line.

This is the behavior of xterm, VTE and rxvt.  mlterm doesn't allow
selections to extend past the last non-space character on a line.

BUG: 413426
CCBUG: 158726
2022-05-26 08:12:52 +00:00
Luis Javier Merino Morán
9046680f5a Ignore non-real chars for selection in history
Commit e8f77101 did this for screen lines.  Do it also for lines in the
history buffer.
2022-05-26 08:12:52 +00:00
Luis Javier Merino Morán
4e69f47b06 Respect Trim Trailing Space also in history buffer
The TrimTrailingSpacesInSelectedText profile option was not being
respected when selecting text in the history buffer.
2022-05-26 08:12:52 +00:00
Luis Javier Merino Morán
9b364450f0 Remove unused include 2022-05-26 08:12:52 +00:00
Luis Javier Merino Morán
d2ca202abd Fix scroll position jumps regression
Commit d37d3ac1 "CompactHistoryScroll: Remove _maxLineCount + 5 lines at
a time" caused a regression: addHistLine queried the number of lines in
history before and after adding a line, and if it had not incremented it
assumed one line entered history and another was dropped at the other
end.  Now, lines are dropped from history in batches, so take care of
that.

Very similar to the regression fixed at 7a1e4768, only this one is about
keeping the scroll position on the presence of scroll, and that other
one is about keeping the selection.

Thanks to the bug reporters Michael and Luke-Jr for the heads-up.

BUG: 452955
BUG: 453112
2022-05-24 12:51:32 +02:00
Martin T. H. Sandsmark
ec64ccd352 the url extractor kills performance a bit, so skip it if we can 2022-05-23 08:45:27 +00:00
Matan Ziv-Av
fac05b712d Correctly fill the cell with background color for text drawn above images with negative z-index
Still needs some work.
2022-05-23 08:32:41 +00:00
Luis Javier Merino Morán
e8f7710180 Do not count trailing empty cells on selections
When selecting, the last line gets an added newline if the characters
returned from copyLineToStream() are less than the cells selected on that
last line.

A weird behaviour was that after running:

printf '                   v\n'
printf '\e[KSELECT ME\n'
printf '\e[31m\e[Kselect me\n'
printf '\e[0m                   ^\n'

selecting "SELECT ME          " would add a newline, while
selecting "select me          " would not add a newline.

This is a side-effect of clearImage() resizing lines which end with
spaces with the default rendition, so selecting the "SELECT ME" line
would get a count of 9 characters, which would make selecting more than
the initial 9 characters add a newline, while the "select me" line would
have additional spaces with isRealCharacter == false and a non-default
rendition.

Solve it but making copyLineToStream() not count and not pass to
PlainTextDecoder trailing characters where isRealCharacter == false.
2022-05-23 01:30:00 +00:00
Luis Javier Merino Morán
4e0bcd4edb Set default rendition before clearing the screen
Otherwise, weirdness ensues.  e.g. if you do:

seq 1 $((LINES)); printf '\e[31m\ec'

and try to select the blank lines, the selection shows the previous
rendition color.
2022-05-23 01:30:00 +00:00
Luis Javier Merino Morán
9dadb7b562 Fix regression preserving tcsh command prompt
Commit c3b3ef19 introduced a regression when invoking the
clear-history-and-reset action.  While RIS (Reset to Initial State) is
specified in DEC STD-070 as homing the cursor, konsole has grown some
hacks in the name of usability to preserve the command prompt line.

For a long time, it has sent two SIGWINCH with changed sizes after clear
and reset actions to force the shell to redraw the prompt (see d346a2cc,
temporarily disabled on 5d61b69e and re-added on 82778e87), which works
for bash, zsh, ksh, ...

tcsh doesn't redraw its prompt on SIGWINCH, but commit b8e96bcd modified
Screen::refresh() so instead of clearing the entire screen and homing
the cursor, it scrolled up everything but the last (usually the prompt)
line.

So, keep that last hack when called from clear-history-and-reset, and
behave as specified on DEC STD-070 otherwise.

Note that other ways of clearing the screen don't need hacks, e.g.
Ctrl-L, if handled at all, is handled by the shell, which then redraws
its prompt.  Calling "clear" or invoking "printf '\ec'" will result in
the shell redrawing its prompt in the usual way.

BUG: 453568
2022-05-16 22:51:53 +00:00
Heiko Becker
f6310c2b79 Detect the presence of malloc_trim to fix the build with musl
malloc_trim is indeed a GNU extension, but an extension of glibc.
Relying on __GNUC__ unfortunately doesn't help with that. Check for
the actual presence of malloc_trim with cmake's check_function_exists
instead.
This fixes the build with musl libc, which doesn't come with
malloc_trim.

Co-authored-by: Ahmad Samir <a.samirh78@gmail.com>
2022-04-26 14:18:29 +02:00
Martin T. H. Sandsmark
15392b307f Clean up images when clearing screen/history 2022-04-25 16:16:04 -04:00
Matan Ziv-Av
ad1421f8b8 Fix cursor position after drawing Sixel graphics
Moving all cursor and scroll handling to addPlacement.

This requires the moveCursor parameter to have three possible values,
since Sixel cursor movement is not the same as Kitty/iterm2. This also
unnecessitates addPlacement return value.

BUG: 452476
(cherry picked from commit 9ae57f4e1d)
2022-04-19 14:40:20 -04:00
Matan Ziv-Av
d28359124b Fix problems discovered by coverity (and more):
- Better handling of data pointer and errors for compressed data in kitty protocol
- Correct handling of iterator when erasing a placement.
- Use midRef() instead of mid().
2022-03-18 16:53:12 +00:00
Luis Javier Merino Morán
0952e29f9b Fix misplaced parenthesis
This was causing "notcurses-demo v" (view) to run really slow.
2022-03-04 13:45:51 +00:00