Description
When using org.eclipse.swt.widgets.DateTime on GTK (Linux), the widget consumes TAB key events internally instead of propagating them as SWT traversal events.
As a result, focus never leaves the control and TAB navigation loops between internal fields (day → month → year).
This behavior does not occur on Windows.
Environment
SWT: 3.133.0 (Eclipse 4.39)
Java: OpenJDK 25.0.3
OS: Ubuntu 26.04
Desktop: MATE
Windowing system: X11
GTK: 3.24.52
Locale: es_ES.UTF-8
(and tests in Ubuntu 26.04 Gnome and swt 3.134.0)
Steps To Reproduce
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
public class DateTimeTabDebug {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout(2, false));
new Label(shell, SWT.NONE).setText("Text 1:");
Text t1 = new Text(shell, SWT.BORDER);
t1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
new Label(shell, SWT.NONE).setText("Date:");
DateTime dt = new DateTime(shell, SWT.DATE | SWT.DROP_DOWN | SWT.BORDER);
dt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
new Label(shell, SWT.NONE).setText("Text 2:");
Text t2 = new Text(shell, SWT.BORDER);
t2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
javac --release 25 \
-cp org.eclipse.swt.gtk.linux.x86_64-3.133.0.jar \
DateTimeTabDebug.java
java \
-cp .:org.eclipse.swt.gtk.linux.x86_64-3.133.0.jar \
DateTimeTabDebug
Actual Behavior
When pressing TAB:
Focus moves from Text1 → DateTime correctly
Inside DateTime:
- TAB cycles through internal fields (day → month → year)
- Focus never leaves the widget
- No focusLost event is generated
- No TRAVERSE_TAB_NEXT is received
Debug output shows repeated:
[FILTER TRAVERSE] widget=DateTime detail=0 doit=true
[DATE TRAVERSE] detail=0 doit=true
(detail=0 corresponds to SWT.TRAVERSE_NONE)
The event is repeated indefinitely.
Expected behavior
Pressing TAB inside DateTime should:
- Move focus to next control (Text2)
- Generate SWT.TRAVERSE_TAB_NEXT
- Trigger focusLost on DateTime
Same behavior as on Window
A clear and concise description of what you expected to happen.
Observed Impact
- Keyboard navigation is broken on GTK
- Focus becomes trapped inside DateTime
- Cross-platform inconsistency (Windows vs Linux)
- No reliable workaround using standard SWT listeners
Additional Notes
- TraverseListener is triggered but only with SWT.TRAVERSE_NONE (detail=0)
- KeyListener does not reliably receive TAB before GTK consumes it
- Issue reproducible in minimal SWT application
- Likely related to GTK DateTime internal editing of sub-fields
Request
Please confirm whether this is:
- a known limitation of SWT GTK DateTime, or
- a regression in SWT GTK event translation layer
and whether there is a recommended workaround or fix planned.
Description
When using org.eclipse.swt.widgets.DateTime on GTK (Linux), the widget consumes TAB key events internally instead of propagating them as SWT traversal events.
As a result, focus never leaves the control and TAB navigation loops between internal fields (day → month → year).
This behavior does not occur on Windows.
Environment
SWT: 3.133.0 (Eclipse 4.39)
Java: OpenJDK 25.0.3
OS: Ubuntu 26.04
Desktop: MATE
Windowing system: X11
GTK: 3.24.52
Locale: es_ES.UTF-8
(and tests in Ubuntu 26.04 Gnome and swt 3.134.0)
Steps To Reproduce
Actual Behavior
When pressing TAB:
Focus moves from Text1 → DateTime correctly
Inside DateTime:
Debug output shows repeated:
(detail=0 corresponds to SWT.TRAVERSE_NONE)
The event is repeated indefinitely.
Expected behavior
Pressing TAB inside DateTime should:
Same behavior as on Window
A clear and concise description of what you expected to happen.
Observed Impact
Additional Notes
Request
Please confirm whether this is:
and whether there is a recommended workaround or fix planned.