This is an automated email from the ASF dual-hosted git repository.

hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new 64566a4e9b fixed IllegalArgumentException on KDE/Plasma. fixes #5998 
(#6143)
64566a4e9b is described below

commit 64566a4e9b8b53fe196b311d472236527092a071
Author: Bart Maertens <[email protected]>
AuthorDate: Tue Dec 9 16:01:57 2025 +0100

    fixed IllegalArgumentException on KDE/Plasma. fixes #5998 (#6143)
---
 .../main/java/org/apache/hop/ui/core/PropsUi.java  | 79 ++++++++++++++++++++++
 1 file changed, 79 insertions(+)

diff --git a/ui/src/main/java/org/apache/hop/ui/core/PropsUi.java 
b/ui/src/main/java/org/apache/hop/ui/core/PropsUi.java
index 3b19e7dfac..00cf036b94 100644
--- a/ui/src/main/java/org/apache/hop/ui/core/PropsUi.java
+++ b/ui/src/main/java/org/apache/hop/ui/core/PropsUi.java
@@ -37,10 +37,15 @@ import org.apache.hop.ui.hopgui.TextSizeUtilFacade;
 import org.apache.hop.ui.util.EnvironmentUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabFolderRenderer;
+import org.eclipse.swt.custom.CTabItem;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.layout.FormLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Combo;
@@ -516,6 +521,77 @@ public class PropsUi extends Props {
     }
   }
 
+  /**
+   * Ensures that a CTabFolder has a safe renderer that catches 
IllegalArgumentException when
+   * drawing tab images. This prevents crashes on some Linux desktop 
environments (e.g., KDE Plasma
+   * on Wayland) where images may be invalid or disposed. Only applied on 
Linux to avoid any
+   * potential impact on unaffected platforms.
+   *
+   * @param tabFolder the CTabFolder to protect
+   */
+  private static void ensureSafeRenderer(CTabFolder tabFolder) {
+    // Only apply safe renderer on Linux where the issue occurs
+    if (Const.isLinux() && !(tabFolder.getRenderer() instanceof 
SafeCTabFolderRenderer)) {
+      tabFolder.setRenderer(new SafeCTabFolderRenderer(tabFolder));
+    }
+  }
+
+  /**
+   * A safe CTabFolderRenderer that catches IllegalArgumentException when 
drawing tab images. This
+   * prevents crashes on some Linux desktop environments where images may be 
invalid or disposed
+   * during rendering. When an image drawing error occurs, the image is 
skipped but the text is
+   * still rendered.
+   */
+  private static class SafeCTabFolderRenderer extends CTabFolderRenderer {
+    private final CTabFolder parentFolder;
+
+    SafeCTabFolderRenderer(CTabFolder parent) {
+      super(parent);
+      this.parentFolder = parent;
+    }
+
+    @Override
+    protected void draw(int part, int state, Rectangle bounds, GC gc) {
+      if (bounds != null && (bounds.width <= 0 || bounds.height <= 0)) {
+        return;
+      }
+      try {
+        super.draw(part, state, bounds, gc);
+      } catch (IllegalArgumentException e) {
+        // If image drawing fails, temporarily remove images from tab items 
and redraw
+        // This allows text to be rendered even when images are invalid
+        if (parentFolder != null && !parentFolder.isDisposed()) {
+          CTabItem[] items = parentFolder.getItems();
+          Image[] savedImages = new Image[items.length];
+          boolean hadImages = false;
+
+          // Save and temporarily clear images
+          for (int i = 0; i < items.length; i++) {
+            savedImages[i] = items[i].getImage();
+            if (savedImages[i] != null) {
+              items[i].setImage(null);
+              hadImages = true;
+            }
+          }
+
+          if (hadImages) {
+            try {
+              // Redraw without images - this should succeed and render the 
text
+              super.draw(part, state, bounds, gc);
+            } finally {
+              // Restore images (even if they're invalid, we'll catch the 
exception next time)
+              for (int i = 0; i < items.length; i++) {
+                if (savedImages[i] != null) {
+                  items[i].setImage(savedImages[i]);
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
   protected static void setLookOnWindows(final Widget widget, int style) {
     final GuiResource gui = GuiResource.getInstance();
     Font font = gui.getFontDefault();
@@ -569,6 +645,7 @@ public class PropsUi extends Props {
         CTabFolder tabFolder = (CTabFolder) widget;
         tabFolder.setBorderVisible(true);
         tabFolder.setTabHeight(28);
+        ensureSafeRenderer(tabFolder);
         if (PropsUi.getInstance().isDarkMode()) {
           tabFolder.setBackground(gui.getColorWhite());
           tabFolder.setForeground(gui.getColorBlack());
@@ -648,6 +725,7 @@ public class PropsUi extends Props {
         tabFolder.setBorderVisible(true);
         tabFolder.setBackground(gui.getColorGray());
         tabFolder.setForeground(gui.getColorBlack());
+        ensureSafeRenderer(tabFolder);
         tabFolder.setSelectionBackground(gui.getColorWhite());
         tabFolder.setSelectionForeground(gui.getColorBlack());
         break;
@@ -719,6 +797,7 @@ public class PropsUi extends Props {
         tabFolder.setBorderVisible(true);
         tabFolder.setBackground(gui.getColorGray());
         tabFolder.setForeground(gui.getColorBlack());
+        ensureSafeRenderer(tabFolder);
         tabFolder.setSelectionBackground(gui.getColorWhite());
         tabFolder.setSelectionForeground(gui.getColorBlack());
         break;

Reply via email to