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

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


The following commit(s) were added to refs/heads/main by this push:
     new 61167507fc0d CAMEL-23727: camel-jbang - Add mouse scroll support for 
TUI shell panel (#23919)
61167507fc0d is described below

commit 61167507fc0dbe3eef7dbf9d9ad908345b4bffb3
Author: Guillaume Nodet <[email protected]>
AuthorDate: Wed Jun 10 19:38:10 2026 +0200

    CAMEL-23727: camel-jbang - Add mouse scroll support for TUI shell panel 
(#23919)
---
 .../dsl/jbang/core/commands/tui/CamelMonitor.java  |  6 +++++
 .../dsl/jbang/core/commands/tui/ShellPanel.java    | 28 ++++++++++++++++++++++
 .../jbang/core/commands/tui/TuiBackendHelper.java  |  4 ++--
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
index 663421572b55..452c15c3324b 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
@@ -59,6 +59,7 @@ import dev.tamboui.tui.event.Event;
 import dev.tamboui.tui.event.KeyCode;
 import dev.tamboui.tui.event.KeyEvent;
 import dev.tamboui.tui.event.KeyModifiers;
+import dev.tamboui.tui.event.MouseEvent;
 import dev.tamboui.tui.event.PasteEvent;
 import dev.tamboui.tui.event.TickEvent;
 import dev.tamboui.widgets.Clear;
@@ -408,6 +409,11 @@ public class CamelMonitor extends CamelCommand {
                 return true;
             }
         }
+        if (event instanceof MouseEvent me) {
+            if (shellPanel.isOpen() && shellPanel.handleMouseEvent(me)) {
+                return true;
+            }
+        }
         if (event instanceof PasteEvent pe) {
             return handlePasteEvent(pe);
         }
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java
index 6593620512e8..3de73a8aa7e7 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java
@@ -35,6 +35,8 @@ import dev.tamboui.text.Span;
 import dev.tamboui.text.Text;
 import dev.tamboui.tui.event.KeyCode;
 import dev.tamboui.tui.event.KeyEvent;
+import dev.tamboui.tui.event.MouseEvent;
+import dev.tamboui.tui.event.MouseEventKind;
 import dev.tamboui.widgets.block.Block;
 import dev.tamboui.widgets.block.BorderType;
 import dev.tamboui.widgets.block.Title;
@@ -71,6 +73,7 @@ import org.jline.utils.AttributedStyle;
 class ShellPanel {
 
     private static final int[] SPLIT_PERCENTS = { 25, 50, 75 };
+    private static final int MOUSE_SCROLL_LINES = 3;
 
     private boolean visible;
     private int splitIndex = 1; // default 50%
@@ -84,6 +87,7 @@ class ShellPanel {
     private int lastHeight;
     private int scrollOffset;
     private int lastHistorySize;
+    private Rect lastArea;
     private volatile boolean shellExited;
 
     void setContext(MonitorContext ctx) {
@@ -160,6 +164,28 @@ class ShellPanel {
         return true;
     }
 
+    boolean handleMouseEvent(MouseEvent me) {
+        if (!visible || lastArea == null) {
+            return false;
+        }
+        int mx = me.x();
+        int my = me.y();
+        if (mx < lastArea.x() || mx >= lastArea.x() + lastArea.width()
+                || my < lastArea.y() || my >= lastArea.y() + 
lastArea.height()) {
+            return false;
+        }
+        if (me.kind() == MouseEventKind.SCROLL_UP) {
+            int histSize = screenTerminal != null ? 
getHistorySize(screenTerminal) : 0;
+            scrollOffset = Math.min(scrollOffset + MOUSE_SCROLL_LINES, 
histSize);
+            return true;
+        }
+        if (me.kind() == MouseEventKind.SCROLL_DOWN) {
+            scrollOffset = Math.max(0, scrollOffset - MOUSE_SCROLL_LINES);
+            return true;
+        }
+        return false;
+    }
+
     void render(Frame frame, Rect area) {
         if (!visible) {
             return;
@@ -170,6 +196,8 @@ class ShellPanel {
             return;
         }
 
+        lastArea = area;
+
         // Render border matching other tabs
         Block block = Block.builder()
                 .borderType(BorderType.ROUNDED)
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiBackendHelper.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiBackendHelper.java
index 87c2c641561a..b8f38e7a358f 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiBackendHelper.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiBackendHelper.java
@@ -35,10 +35,10 @@ final class TuiBackendHelper {
         if (activeTerminal != null) {
             Backend backend = createBackendForTerminal(activeTerminal);
             if (backend != null) {
-                return 
TuiRunner.create(TuiConfig.builder().backend(backend).build());
+                return 
TuiRunner.create(TuiConfig.builder().backend(backend).mouseCapture(true).build());
             }
         }
-        return TuiRunner.create();
+        return 
TuiRunner.create(TuiConfig.builder().mouseCapture(true).build());
     }
 
     private static Backend createBackendForTerminal(Terminal terminal) {

Reply via email to