2021-01-13 05:29:35 +01:00
|
|
|
# Widgets (2)
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
## GtkTextView, GtkTextbuffer and GtkScrolledWindow
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
### GtkTextView and GtkTextBuffer
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-02-06 09:26:57 +01:00
|
|
|
GtkTextview is a widget for multi-line text editing.
|
2021-01-13 05:29:35 +01:00
|
|
|
GtkTextBuffer is a text buffer which is connected to GtkTextView.
|
2021-06-14 10:10:23 +02:00
|
|
|
See the sample program `tfv1.c` below.
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-02-08 14:24:54 +01:00
|
|
|
@@@include
|
|
|
|
tfv/tfv1.c
|
|
|
|
@@@
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
Look at line 25.
|
2021-06-14 10:10:23 +02:00
|
|
|
A GtkTextView instance is created and its pointer is assigned to `tv`.
|
|
|
|
When the GtkTextView instance is created, a GtkTextBuffer instance is also created and connected to the GtkTextView automatically.
|
|
|
|
"GtkTextBuffer instance" will be referred to simply as "GtkTextBuffer" or "buffer".
|
2021-01-13 05:29:35 +01:00
|
|
|
In the next line, the pointer to the buffer is got and assigned to `tb`.
|
|
|
|
Then, the text from line 10 to 20 is assigned to the buffer.
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
GtkTextView has a wrap mode.
|
2021-02-06 09:26:57 +01:00
|
|
|
When it is set to `GTK_WRAP_WORD_CHAR`, text wraps in between words, or if that is not enough, also between graphemes.
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-02-06 09:26:57 +01:00
|
|
|
In line 30, `tv` is added to `win` as a child.
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
Now compile and run it.
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
![GtkTextView](../image/screenshot_tfv1.png){width=6.3cm height=5.325cm}
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
There's an I-beam pointer in the window.
|
2021-06-14 10:10:23 +02:00
|
|
|
You can add or delete any characters on the GtkTextview.
|
|
|
|
And your change is kept in the GtkTextBuffer.
|
2021-01-13 05:29:35 +01:00
|
|
|
If you add more characters than the limit of the window, the height of the window extends.
|
|
|
|
If the height gets bigger than the height of the display screen, you won't be able to control the size of the window back to the original size.
|
|
|
|
It's a problem and it shows that there exists a bug in the program.
|
2021-06-14 10:10:23 +02:00
|
|
|
You can solve it by putting a GtkScrolledWindow between the GtkApplicationWindow and GtkTextView.
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
### GtkScrolledWindow
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
What we need to do is:
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-06-14 10:10:23 +02:00
|
|
|
- Create a GtkScrolledWindow instance and insert it to the GtkApplicationWindow as a child.
|
|
|
|
- insert the GtkTextView to the GtkScrolledWindow as a child.
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
Modify `tfv1.c` and save it as `tfv2.c`.
|
|
|
|
The difference between these two files is very little.
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-02-08 14:24:54 +01:00
|
|
|
@@@shell
|
2021-01-13 05:29:35 +01:00
|
|
|
cd tfv; diff tfv1.c tfv2.c
|
2021-02-08 14:24:54 +01:00
|
|
|
@@@
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
Though you can modify the source file by this diff output, It's good for you to show `tfv2.c`.
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-02-08 14:24:54 +01:00
|
|
|
@@@include
|
|
|
|
tfv/tfv2.c
|
|
|
|
@@@
|
2020-12-21 13:12:05 +01:00
|
|
|
|
2021-01-13 05:29:35 +01:00
|
|
|
Now compile and run it.
|
|
|
|
This time the window doesn't extend even if you type a lot of characters.
|
|
|
|
It just scrolls.
|
2020-12-22 03:30:06 +01:00
|
|
|
|