diff --git a/org.eclipse.wb.os.linux/src_java24/org/eclipse/wb/internal/os/linux/ScreenshotMaker.java b/org.eclipse.wb.os.linux/src_java24/org/eclipse/wb/internal/os/linux/ScreenshotMaker.java index 9ae5e4ded..aafa45cf6 100644 --- a/org.eclipse.wb.os.linux/src_java24/org/eclipse/wb/internal/os/linux/ScreenshotMaker.java +++ b/org.eclipse.wb.os.linux/src_java24/org/eclipse/wb/internal/os/linux/ScreenshotMaker.java @@ -26,6 +26,7 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Widget; import java.lang.foreign.MemorySegment; import java.util.HashMap; @@ -148,7 +149,40 @@ private void makeShots0(final Shell shell) { * model. Can be null. * @return the GdkPixmap* or cairo_surface_t* of {@link Shell}. */ - protected abstract Image makeShot(Shell shell, BiConsumer callback); + protected Image makeShot(Shell shell, BiConsumer callback) { + return traverse(shell, callback); + } + + private Image traverse(Widget w, BiConsumer callback) { + GtkWidget widget = GtkWidget.from(w); + Image image = getImageSurface(GtkWidget.from(w)); + if (image == null) { + return null; + } + if (callback != null) { + callback.accept(widget, image); + } + if (w instanceof Composite composite) { + for (Control childWidget : composite.getChildren()) { + Image childImage = traverse(childWidget, callback); + if (childImage == null) { + continue; + } + if (callback == null) { + childImage.dispose(); + } + } + } + return image; + } + + /** + * Captures the given widget. + * + * @param widget The widget to capture + * @return An image containing the visual representation of the given widget. + */ + protected abstract Image getImageSurface(GtkWidget widget); private boolean bindImage(final Control control, final Image image) { if (control.getData(OSSupport.WBP_NEED_IMAGE) != null && control.getData(OSSupport.WBP_IMAGE) == null) { diff --git a/org.eclipse.wb.os.linux/src_java24/org/eclipse/wb/internal/os/linux/gtk3/GTK3ScreenshotMaker.java b/org.eclipse.wb.os.linux/src_java24/org/eclipse/wb/internal/os/linux/gtk3/GTK3ScreenshotMaker.java index 615532eab..46715fa6b 100644 --- a/org.eclipse.wb.os.linux/src_java24/org/eclipse/wb/internal/os/linux/gtk3/GTK3ScreenshotMaker.java +++ b/org.eclipse.wb.os.linux/src_java24/org/eclipse/wb/internal/os/linux/gtk3/GTK3ScreenshotMaker.java @@ -27,12 +27,6 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Widget; - -import java.util.function.BiConsumer; /** * Creates a screenshot of a given widget using the GTK3 API. @@ -40,30 +34,7 @@ public class GTK3ScreenshotMaker extends ScreenshotMaker { @Override - protected Image makeShot(Shell shell, BiConsumer callback) { - return traverse(shell, callback); - } - - private Image traverse(Widget widget, BiConsumer callback) { - Image image = getImageSurface(GtkWidget.from(widget), callback); - if (image == null) { - return null; - } - if (widget instanceof Composite composite) { - for (Control childWidget : composite.getChildren()) { - Image childImage = traverse(childWidget, callback); - if (childImage == null) { - continue; - } - if (callback == null) { - childImage.dispose(); - } - } - } - return image; - } - - protected Image getImageSurface(GtkWidget widget, BiConsumer callback) { + protected Image getImageSurface(GtkWidget widget) { GdkWindow window = GTK3.gtk_widget_get_window(widget); if (!GDK3.gdk_window_is_visible(window)) { // don't deal with unmapped windows @@ -77,10 +48,6 @@ protected Image getImageSurface(GtkWidget widget, BiConsumer c GDK3.gdk_window_process_updates(window, true); // take screenshot Image image = createImage(window, width, height); - // get Java code notified - if (callback != null) { - callback.accept(widget, image); - } // done return image; }