summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-05-03 17:46:51 +0000
committerMatthias Clasen <mclasen@redhat.com>2022-05-03 17:46:51 +0000
commitc645da00dc1b29a1d974f36cced0ed79831c55a8 (patch)
treefe7bff8454e8eaad89d9188d4915964eac3a9a73
parent4867ac653a12bc564691b942f04342830c405336 (diff)
parent4ddf1b70a225d2c383145e257a084ea43fd60484 (diff)
downloadgtk+-c645da00dc1b29a1d974f36cced0ed79831c55a8.tar.gz
Merge branch 'wrap-mode-invalid-cast' into 'main'
Don't cast GtkWrapMode to the incompatible enum PangoWrapMode Closes #4869 See merge request GNOME/gtk!4671
-rw-r--r--gtk/a11y/gtkatspipango.c1
-rw-r--r--gtk/a11y/gtkatspitextbuffer.c25
-rw-r--r--testsuite/gtk/meson.build2
-rw-r--r--testsuite/gtk/textbuffer.c69
4 files changed, 94 insertions, 3 deletions
diff --git a/gtk/a11y/gtkatspipango.c b/gtk/a11y/gtkatspipango.c
index 4db6a1a64b..b353027cc4 100644
--- a/gtk/a11y/gtkatspipango.c
+++ b/gtk/a11y/gtkatspipango.c
@@ -113,6 +113,7 @@ pango_underline_to_string (PangoUnderline value)
const char *
pango_wrap_mode_to_string (PangoWrapMode mode)
{
+ /* Keep these in sync with gtk_wrap_mode_to_string() */
switch (mode)
{
case PANGO_WRAP_WORD:
diff --git a/gtk/a11y/gtkatspitextbuffer.c b/gtk/a11y/gtkatspitextbuffer.c
index 61e240fb0d..40fd05fa1f 100644
--- a/gtk/a11y/gtkatspitextbuffer.c
+++ b/gtk/a11y/gtkatspitextbuffer.c
@@ -55,6 +55,27 @@ gtk_text_direction_to_string (GtkTextDirection direction)
}
}
+static const char *
+gtk_wrap_mode_to_string (GtkWrapMode wrap_mode)
+{
+ /* Keep these in sync with pango_wrap_mode_to_string(); note that
+ * here we have an extra case for NONE.
+ */
+ switch (wrap_mode)
+ {
+ case GTK_WRAP_NONE:
+ return "none";
+ case GTK_WRAP_CHAR:
+ return "char";
+ case GTK_WRAP_WORD:
+ return "word";
+ case GTK_WRAP_WORD_CHAR:
+ return "word-char";
+ default:
+ g_assert_not_reached ();
+ }
+}
+
void
gtk_text_view_add_default_attributes (GtkTextView *view,
GVariantBuilder *builder)
@@ -75,7 +96,7 @@ gtk_text_view_add_default_attributes (GtkTextView *view,
g_variant_builder_add (builder, "{ss}", "direction",
gtk_text_direction_to_string (text_attrs->direction));
g_variant_builder_add (builder, "{ss}", "wrap-mode",
- pango_wrap_mode_to_string ((PangoWrapMode)text_attrs->wrap_mode));
+ gtk_wrap_mode_to_string (text_attrs->wrap_mode));
g_variant_builder_add (builder, "{ss}", "editable",
text_attrs->editable ? "true" : "false");
g_variant_builder_add (builder, "{ss}", "invisible",
@@ -256,7 +277,7 @@ gtk_text_buffer_get_run_attributes (GtkTextBuffer *buffer,
"wrap-mode", &wrap_mode,
NULL);
if (val_set)
- g_variant_builder_add (builder, "{ss}", "wrap-mode", pango_wrap_mode_to_string ((PangoWrapMode)wrap_mode));
+ g_variant_builder_add (builder, "{ss}", "wrap-mode", gtk_wrap_mode_to_string (wrap_mode));
temp_tags = temp_tags->next;
}
val_set = FALSE;
diff --git a/testsuite/gtk/meson.build b/testsuite/gtk/meson.build
index 3324664cac..fcf85ce509 100644
--- a/testsuite/gtk/meson.build
+++ b/testsuite/gtk/meson.build
@@ -76,7 +76,6 @@ tests = [
{ 'name': 'spinbutton' },
{ 'name': 'stringlist' },
{ 'name': 'templates' },
- { 'name': 'textbuffer' },
{ 'name': 'textiter' },
{ 'name': 'theme-validate' },
{ 'name': 'tooltips' },
@@ -119,6 +118,7 @@ internal_tests = [
{ 'name': 'propertylookuplistmodel' },
{ 'name': 'rbtree' },
{ 'name': 'timsort' },
+ { 'name': 'textbuffer' },
{ 'name': 'texthistory' },
{ 'name': 'fnmatch' },
]
diff --git a/testsuite/gtk/textbuffer.c b/testsuite/gtk/textbuffer.c
index 2dcb0b5fd7..d1c2997c4f 100644
--- a/testsuite/gtk/textbuffer.c
+++ b/testsuite/gtk/textbuffer.c
@@ -22,6 +22,7 @@
#include <gtk/gtk.h>
#include "gtk/gtktexttypes.h" /* Private header, for UNKNOWN_CHAR */
+#include "gtk/a11y/gtkatspitextbufferprivate.h" /* Private header */
static void
gtk_text_iter_spew (const GtkTextIter *iter, const char *desc)
@@ -1818,6 +1819,72 @@ test_undo3 (void)
g_object_unref (buffer);
}
+static void
+test_serialize_wrap_mode (void)
+{
+ GtkTextBuffer *buffer = gtk_text_buffer_new (NULL);
+ struct val {
+ GtkWrapMode mode;
+ const char *name;
+ } values[] = {
+ { .mode = GTK_WRAP_NONE, .name = "none" },
+ { .mode = GTK_WRAP_CHAR, .name = "char" },
+ { .mode = GTK_WRAP_WORD, .name = "word" },
+ { .mode = GTK_WRAP_WORD_CHAR, .name = "word-char" },
+ };
+ gsize i;
+
+ /* Four lines, each with a 2-byte run (digit plus newline) */
+ gtk_text_buffer_set_text (buffer, "0\n1\n2\n3\n", -1);
+
+ for (i = 0; i < G_N_ELEMENTS (values); i++)
+ {
+ GtkTextTag *tag = gtk_text_buffer_create_tag (buffer, NULL, "wrap-mode", values[i].mode, NULL);
+ GtkTextIter start;
+ GtkTextIter end;
+
+ gtk_text_buffer_get_iter_at_offset (buffer, &start, i * 2);
+ gtk_text_buffer_get_iter_at_offset (buffer, &end, (i + 1) * 2);
+ gtk_text_buffer_apply_tag (buffer, tag, &start, &end);
+ }
+
+ /* Get the attributes for each line run as a GVariant */
+
+ for (i = 0; i < G_N_ELEMENTS (values); i++)
+ {
+ /* Each line has a { wrap-mode: name } run */
+ GVariantBuilder expected_builder = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE ("a{ss}"));
+ g_variant_builder_add (&expected_builder, "{ss}", "wrap-mode", values[i].name);
+
+ GVariant *expected = g_variant_builder_end (&expected_builder);
+
+ GVariantBuilder result_builder = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE ("a{ss}"));
+ int run_start, run_end;
+
+ gtk_text_buffer_get_run_attributes (buffer, &result_builder, 2 * i, &run_start, &run_end);
+
+ GVariant *result = g_variant_builder_end (&result_builder);
+
+ g_assert_cmpint (run_start, ==, 2 * i);
+ g_assert_cmpint (run_end, ==, 2 * (i + 1));
+ g_assert_cmpvariant (result, expected);
+
+ g_variant_unref (result);
+ g_variant_unref (expected);
+ }
+
+ g_assert_finalize_object (buffer);
+}
+
+static void
+add_unix_only_tests (void)
+{
+#ifdef G_OS_UNIX
+ /* The atspi2 code for this is not available in Windows */
+ g_test_add_func ("/TextBuffer/Serialize wrap-mode", test_serialize_wrap_mode);
+#endif
+}
+
int
main (int argc, char** argv)
{
@@ -1844,5 +1911,7 @@ main (int argc, char** argv)
g_test_add_func ("/TextBuffer/Undo 2", test_undo2);
g_test_add_func ("/TextBuffer/Undo 3", test_undo3);
+ add_unix_only_tests ();
+
return g_test_run();
}