From 6b8ac26546601f6d02b6d3cb7719983a1904ebf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=8A?= =?UTF-8?q?=D1=80=20=D0=9A=D1=83=D1=80=D1=82=D0=B0=D0=BA=D0=BE=D0=B2?= Date: Thu, 2 Oct 2025 15:04:22 +0300 Subject: [PATCH] Fix Carret drawing on GTK 4 Hooked Gtk 4 focus and draw events for Canvas to enable drawing. It is unclear why cairo_set_source_rgb actually reverses color on Gtk 4 but this makes us move a step ahead towards working editor. Tested via Snippet74. --- .../gtk/org/eclipse/swt/widgets/Canvas.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java index d123429a5d5..f5762a3576c 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java @@ -175,6 +175,13 @@ long gtk_draw (long widget, long cairo) { return result; } +@Override +void gtk4_draw (long widget, long cairo, Rectangle bounds) { + if ((state & OBSCURED) != 0) return; + super.gtk4_draw (widget, cairo, bounds); + drawCaretInFocus(widget, cairo); +} + void drawCaretInFocus(long widget, long cairo) { /* * blink is needed to be checked as gtk_draw() signals sent from other parts of the canvas @@ -197,7 +204,9 @@ private void drawCaret(long widget, long cairo) { Cairo.cairo_save(cairo); if (caret.image != null && !caret.image.isDisposed() && caret.image.mask == 0) { - Cairo.cairo_set_source_rgb(cairo, 1, 1, 1); + if (!GTK.GTK4) { + Cairo.cairo_set_source_rgb(cairo, 1, 1, 1); + } Cairo.cairo_set_operator(cairo, Cairo.CAIRO_OPERATOR_DIFFERENCE); long surface = Cairo.cairo_get_target(cairo); int nWidth = 0; @@ -215,7 +224,9 @@ private void drawCaret(long widget, long cairo) { Cairo.cairo_set_source_surface(cairo, caret.image.surface, 0, 0); Cairo.cairo_paint(cairo); } else { - Cairo.cairo_set_source_rgb(cairo, 1, 1, 1); + if (!GTK.GTK4) { + Cairo.cairo_set_source_rgb(cairo, 1, 1, 1); + } Cairo.cairo_set_operator(cairo, Cairo.CAIRO_OPERATOR_DIFFERENCE); int nWidth = caret.width, nHeight = caret.height; if (nWidth <= 0) nWidth = Caret.DEFAULT_WIDTH; @@ -248,6 +259,15 @@ long gtk_focus_out_event (long widget, long event) { return result; } +@Override +void gtk4_focus_window_event(long handle, long event) { + if(event == SWT.FocusIn) { + gtk_focus_in_event (handle, event); + if (caret != null) caret.setFocus (); + } + else gtk_focus_out_event(handle, event); +} + @Override long gtk_preedit_changed (long imcontext) { if (ime != null) {