UTF-8 encoding problem when pasting text into GTK4 entry
Steps to reproduce
Start gtk4-demo app and run "Completion" (section "Entry") demo:
- Copy this text (characters from [A-Za-z0-9] generated by e.g. a password generator) : swMuYJ0ih8V4JXjYnMWq8CXwijxGzBZp
- Paste it a few times into the entry using ctl-v
Current behavior
After pasting the text a few times, the entry text has encoding errors or shows different characters.
Expected outcome
The entry should show the text as it is.
Version information
- GTK: 4.2.0
- Pango: 1.48.4
- glib2: 2.68.1
- Operating system: Arch Linux
- GTK not built by myself, using the gtk4-demos (version 4.2.0) app from the repository (PKGBUILD with config/flags: https://github.com/archlinux/svntogit-packages/blob/packages/gtk4/trunk/PKGBUILD)
Additional information
Screenshot of gtk4-demo app "Completion", where pasting the text results in following encoding errors:
This is the output of the gtk4-demo app when the encoding errors appear:
...
(gtk4-demo:77835): Pango-WARNING **: 22:01:56.345: Invalid UTF-8 string passed to pango_layout_set_text()
(gtk4-demo:77835): GLib-CRITICAL **: 22:01:56.446: g_utf8_casefold: assertion 'str != NULL' failed
...
Backtrace using Fedora 34 VM (which has the same package versions) with following example:
Compiling with:
gcc $(pkg-config --cflags gtk4) -g -o example example.c $(pkg-config --libs gtk4)
(example:22126): Pango-WARNING **: 11:17:46.682: Invalid UTF-8 string passed to pango_layout_set_text()
Thread 1 "example" received signal SIGTRAP, Trace/breakpoint trap.
g_log_writer_default (log_level=<optimized out>, fields=0x7fffffffccb0, n_fields=6, user_data=0x0) at ../glib/gmessages.c:556
556 G_BREAKPOINT ();
(gdb) bt
#0 g_log_writer_default (log_level=<optimized out>, fields=0x7fffffffccb0, n_fields=6, user_data=0x0) at ../glib/gmessages.c:556
#1 0x00007ffff7287f43 in g_log_structured_array (n_fields=6, fields=0x7fffffffccb0, log_level=G_LOG_LEVEL_WARNING) at ../glib/gmessages.c:1964
#2 g_log_structured_array (log_level=G_LOG_LEVEL_WARNING, fields=0x7fffffffccb0, n_fields=6) at ../glib/gmessages.c:1937
#3 0x00007ffff7288143 in g_log_structured_standard
(log_domain=log_domain@entry=0x7ffff781400b "Pango", log_level=log_level@entry=G_LOG_LEVEL_WARNING, file=file@entry=0x7ffff781814d "../pango/pango-layout.c", line=line@entry=0x7ffff7818148 "1181", func=func@entry=0x7ffff78187b0 <__func__.30> "pango_layout_set_text", message_format=message_format@entry=0x7ffff78204e8 "Invalid UTF-8 string passed to pango_layout_set_text()") at ../glib/gmessages.c:2021
#4 0x00007ffff77feef6 in pango_layout_set_text
(layout=layout@entry=0x203a000 [PangoLayout], text=text@entry=0x203a800 "swMuYJ0ih8V4JXjYnMWq8CXwijxGzBZpswMuYJ0ih8V4JXjYnMWq8CXwijxGzBZpswMuYJ0ih8V4JXjYnMWq8CXwijxGzBZpswMuYJ0ih8V4JXjYnMWq8CXwijxGzBZpswMuYJ0ih8V4JXjYnMWq8CXwijxGzBZpswMuYJ0ih8V4JXjYnMWq8CXwijxGzBZpswMuYJ0i"..., length=length@entry=3901) at ../pango/pango-layout.c:1181
#5 0x00007ffff7a8091b in gtk_text_create_layout (include_preedit=1, self=0x5a02a0 [GtkText]) at ../gtk/gtktext.c:4523
#6 gtk_text_ensure_layout (self=self@entry=0x5a02a0 [GtkText], include_preedit=include_preedit@entry=1) at ../gtk/gtktext.c:4552
#7 0x00007ffff7a812db in gtk_text_get_scroll_limits (self=self@entry=0x5a02a0 [GtkText], min_offset=min_offset@entry=0x7fffffffd354, max_offset=max_offset@entry=0x7fffffffd350) at ../gtk/gtktext.c:4937
#8 0x00007ffff7a81405 in gtk_text_adjust_scroll (self=0x5a02a0 [GtkText]) at ../gtk/gtktext.c:4976
#9 0x00007ffff7a82830 in gtk_text_recompute (self=0x5a02a0 [GtkText]) at ../gtk/gtktext.c:4431
#10 gtk_text_recompute (self=0x5a02a0 [GtkText]) at ../gtk/gtktext.c:4422
#11 0x00007ffff7a82c21 in buffer_inserted_text (buffer=<optimized out>, position=3866, chars=0x7fffec042bc0 "swMuYJ0ih8V4JXjYnMWq8CXwijxGzBZp`\331\016", n_chars=34, self=0x5a02a0 [GtkText]) at ../gtk/gtktext.c:3605
#15 0x00007ffff7397983 in <emit signal ??? on instance 0x5b6f60 [GtkEntryBuffer]> (instance=instance@entry=0x5b6f60, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3553
#12 0x00007ffff7379c2f in g_closure_invoke (closure=0x1743530, return_value=0x0, n_param_values=4, param_values=0x7fffffffd570, invocation_hint=0x7fffffffd4f0) at ../gobject/gclosure.c:810
#13 0x00007ffff7395ea6 in signal_emit_unlocked_R
(node=node@entry=0x17417a0, detail=detail@entry=0, instance=instance@entry=0x5b6f60, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffd570) at ../gobject/gsignal.c:3741
#14 0x00007ffff739776a in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffd770) at ../gobject/gsignal.c:3497
#16 0x00007ffff7972ca6 in gtk_entry_buffer_emit_inserted_text
(buffer=buffer@entry=0x5b6f60 [GtkEntryBuffer], position=position@entry=3866, chars=chars@entry=0x7fff5c001f70 "swMuYJ0ih8V4JXjYnMWq8CXwijxGzBZp`\331\016", n_chars=n_chars@entry=34) at ../gtk/gtkentrybuffer.c:715
#17 0x00007ffff7972d9f in gtk_entry_buffer_normal_insert_text (buffer=0x5b6f60 [GtkEntryBuffer], position=3866, chars=0x7fff5c001f70 "swMuYJ0ih8V4JXjYnMWq8CXwijxGzBZp`\331\016", n_chars=34) at ../gtk/gtkentrybuffer.c:182
#18 0x00007ffff7a7b9e0 in gtk_text_insert_text (position=0x7fffffffdd84, length=<optimized out>, text=0x7fff5c001f70 "swMuYJ0ih8V4JXjYnMWq8CXwijxGzBZp`\331\016", self=0x5a02a0 [GtkText]) at ../gtk/gtktext.c:5382
#19 editable_insert_text (editable=0x5a02a0, text=0x7fff5c001f70 "swMuYJ0ih8V4JXjYnMWq8CXwijxGzBZp`\331\016", length=<optimized out>, position=0x7fffffffdd84) at ../gtk/gtktext.c:1553
#23 0x00007ffff7397983 in <emit signal ??? on instance 0x5a02a0 [GtkText]> (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>) at ../gobject/gsignal.c:3553
#20 0x00007ffff7379c2f in g_closure_invoke (closure=0x59cb90, return_value=0x0, n_param_values=4, param_values=0x7fffffffdaa0, invocation_hint=0x7fffffffda20) at ../gobject/gclosure.c:810
#21 0x00007ffff7395894 in signal_emit_unlocked_R
(node=node@entry=0x516f70, detail=detail@entry=0, instance=instance@entry=0x5a02a0, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffdaa0) at ../gobject/gsignal.c:3780
#22 0x00007ffff739776a in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffdca0) at ../gobject/gsignal.c:3497
#24 0x00007ffff7a837a2 in paste_received (clipboard=<optimized out>, result=<optimized out>, data=0x5a02a0) at ../gtk/gtktext.c:5300
#25 0x00007ffff746fa7a in g_task_return_now (task=0x20dd4a0 [GTask]) at ../gio/gtask.c:1219
#26 0x00007ffff746fc7b in g_task_return (type=<optimized out>, task=0x20dd4a0 [GTask]) at ../gio/gtask.c:1289
#27 g_task_return (task=0x20dd4a0 [GTask], type=<optimized out>) at ../gio/gtask.c:1245
#28 0x00007ffff7470a5c in g_task_return_pointer (task=<optimized out>, result=<optimized out>, result_destroy=<optimized out>) at ../gio/gtask.c:1709
#29 0x00007ffff7bcd45d in gdk_clipboard_read_value_done (source=<optimized out>, result=0x1743940, data=0x20dd4a0) at ../gdk/gdkclipboard.c:724
#30 0x00007ffff7bc585c in gdk_content_deserializer_emit_callback (data=data@entry=0x1743940) at ../gdk/gdkcontentdeserializer.c:338
#31 0x00007ffff727d74b in g_idle_dispatch (source=0x1b51930, callback=0x7ffff7bc5840 <gdk_content_deserializer_emit_callback>, user_data=0x1743940) at ../glib/gmain.c:5848
#32 0x00007ffff72814cf in g_main_dispatch (context=0x420ec0) at ../glib/gmain.c:3337
#33 g_main_context_dispatch (context=0x420ec0) at ../glib/gmain.c:4055
#34 0x00007ffff72d54e8 in g_main_context_iterate.constprop.0 (context=context@entry=0x420ec0, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4131
#35 0x00007ffff727ec03 in g_main_context_iteration (context=context@entry=0x420ec0, may_block=may_block@entry=1) at ../glib/gmain.c:4196
#36 0x00007ffff749d92d in g_application_run (application=0x41e0e0 [GtkApplication], argc=-8236, argv=<optimized out>) at ../gio/gapplication.c:2560
#37 0x00000000004012d4 in main (argc=1, argv=0x7fffffffe148) at example.c:28
Screencast showing the behavior with example.c on Arch Linux:
Edited by Martin Pobaschnig