Skip to content

Commit 90a7d81

Browse files
committed
[Gtk4] Link click support
Implement Gtk 4 controllers handling by refactoring the non version dependent parts of Gtk 3 handling into separate methods.
1 parent 2acafe3 commit 90a7d81

1 file changed

Lines changed: 82 additions & 47 deletions

File tree

  • bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets

bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Link.java

Lines changed: 82 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2025 IBM Corporation and others.
2+
* Copyright (c) 2000, 2026 IBM Corporation and others.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the Eclipse Public License 2.0
@@ -348,39 +348,43 @@ long gtk3_button_press_event (long widget, long event) {
348348
double [] eventX = new double [1];
349349
double [] eventY = new double [1];
350350
GDK.gdk_event_get_coords(event, eventX, eventY);
351-
352351
if (eventButton[0] == 1 && eventType == GDK.GDK_BUTTON_PRESS) {
353-
if (focusIndex != -1) setFocus ();
354-
int x = (int) eventX[0];
355-
int y = (int) eventY[0];
356-
if ((style & SWT.MIRRORED) != 0) x = getClientWidth () - x;
357-
int offset = layout.getOffset (x, y, null);
358-
int oldSelectionX = selection.x;
359-
int oldSelectionY = selection.y;
360-
selection.x = offset;
361-
selection.y = -1;
362-
if (oldSelectionX != -1 && oldSelectionY != -1) {
363-
if (oldSelectionX > oldSelectionY) {
364-
int temp = oldSelectionX;
365-
oldSelectionX = oldSelectionY;
366-
oldSelectionY = temp;
367-
}
368-
Rectangle rect = layout.getBounds (oldSelectionX, oldSelectionY);
369-
redraw (rect.x, rect.y, rect.width, rect.height, false);
352+
handlePress((int) eventX[0], (int) eventY[0]);
353+
}
354+
return result;
355+
}
356+
357+
private void handlePress(int x, int y) {
358+
359+
if (focusIndex != -1)
360+
setFocus();
361+
if ((style & SWT.MIRRORED) != 0)
362+
x = getClientWidth() - x;
363+
int offset = layout.getOffset(x, y, null);
364+
int oldSelectionX = selection.x;
365+
int oldSelectionY = selection.y;
366+
selection.x = offset;
367+
selection.y = -1;
368+
if (oldSelectionX != -1 && oldSelectionY != -1) {
369+
if (oldSelectionX > oldSelectionY) {
370+
int temp = oldSelectionX;
371+
oldSelectionX = oldSelectionY;
372+
oldSelectionY = temp;
370373
}
371-
for (int j = 0; j < offsets.length; j++) {
372-
Rectangle [] rects = getRectanglesInPixels (j);
373-
for (int i = 0; i < rects.length; i++) {
374-
Rectangle rect = rects [i];
375-
if (rect.contains (x, y)) {
376-
focusIndex = j;
377-
redraw ();
378-
return result;
379-
}
374+
Rectangle rect = layout.getBounds(oldSelectionX, oldSelectionY);
375+
redraw(rect.x, rect.y, rect.width, rect.height, false);
376+
}
377+
for (int j = 0; j < offsets.length; j++) {
378+
Rectangle[] rects = getRectanglesInPixels(j);
379+
for (int i = 0; i < rects.length; i++) {
380+
Rectangle rect = rects[i];
381+
if (rect.contains(x, y)) {
382+
focusIndex = j;
383+
redraw();
384+
return;
380385
}
381386
}
382387
}
383-
return result;
384388
}
385389

386390
@Override
@@ -397,23 +401,44 @@ long gtk3_button_release_event (long widget, long event) {
397401
GDK.gdk_event_get_coords(event, eventX, eventY);
398402

399403
if (eventButton[0] == 1) {
400-
int x = (int) eventX[0];
401-
int y = (int) eventY[0];
402-
if ((style & SWT.MIRRORED) != 0) x = getClientWidth () - x;
403-
Rectangle [] rects = getRectanglesInPixels (focusIndex);
404-
for (int i = 0; i < rects.length; i++) {
405-
Rectangle rect = rects [i];
406-
if (rect.contains (x, y)) {
407-
Event ev = new Event ();
408-
ev.text = ids [focusIndex];
409-
sendSelectionEvent (SWT.Selection, ev, true);
410-
return result;
411-
}
412-
}
404+
handleRelease((int) eventX[0], (int) eventY[0]);
413405
}
414406
return result;
415407
}
416408

409+
@Override
410+
int gtk_gesture_press_event(long gesture, int n_press, double x, double y, long event) {
411+
int result = super.gtk_gesture_press_event(gesture, n_press, x, y, event);
412+
413+
if (GTK.gtk_gesture_single_get_current_button(gesture) != 1 || n_press != 1) return result;
414+
415+
if (focusIndex != -1) setFocus();
416+
handlePress((int) x, (int) y);
417+
return result;
418+
}
419+
420+
@Override
421+
int gtk_gesture_release_event(long gesture, int n_press, double x, double y, long event) {
422+
int result = super.gtk_gesture_release_event(gesture, n_press, x, y, event);
423+
if (focusIndex == -1 || GTK.gtk_gesture_single_get_current_button(gesture) != 1) return result;
424+
425+
handleRelease((int) x, (int) y);
426+
return result;
427+
}
428+
429+
private void handleRelease(int hitX, int hitY) {
430+
if ((style & SWT.MIRRORED) != 0) hitX = getClientWidth() - hitX;
431+
Rectangle [] rects = getRectanglesInPixels(focusIndex);
432+
for (Rectangle rect : rects) {
433+
if (rect.contains(hitX, hitY)) {
434+
Event ev = new Event();
435+
ev.text = ids[focusIndex];
436+
sendSelectionEvent(SWT.Selection, ev, true);
437+
return;
438+
}
439+
}
440+
}
441+
417442
@Override
418443
long gtk_draw (long widget, long cairo) {
419444
long context = GTK.gtk_widget_get_style_context(widget);
@@ -514,11 +539,22 @@ long gtk3_motion_notify_event (long widget, long event) {
514539
GDK.gdk_event_get_coords(event, eventX, eventY);
515540
GDK.gdk_event_get_state(event, state);
516541

517-
int x = (int) eventX[0];
518-
int y = (int) eventY[0];
542+
handleMotion(state[0], (int) eventX[0], (int) eventY[0]);
543+
return result;
544+
}
545+
546+
@Override
547+
void gtk4_motion_event(long controller, double x, double y, long event) {
548+
super.gtk4_motion_event(controller, x, y, event);
549+
550+
int state = event != 0 ? GDK.gdk_event_get_modifier_state(event) : 0;
519551

552+
handleMotion(state, (int) x, (int) y);
553+
}
554+
555+
private void handleMotion(int mask, int x, int y) {
520556
if ((style & SWT.MIRRORED) != 0) x = getClientWidth () - x;
521-
if ((state[0] & GDK.GDK_BUTTON1_MASK) != 0) {
557+
if ((mask & GDK.GDK_BUTTON1_MASK) != 0) {
522558
int oldSelection = selection.y;
523559
selection.y = layout.getOffset (x, y, null);
524560
if (selection.y != oldSelection) {
@@ -538,13 +574,12 @@ long gtk3_motion_notify_event (long widget, long event) {
538574
Rectangle rect = rects [i];
539575
if (rect.contains (x, y)) {
540576
setCursor (display.getSystemCursor (SWT.CURSOR_HAND));
541-
return result;
577+
return;
542578
}
543579
}
544580
}
545581
setCursor (null);
546582
}
547-
return result;
548583
}
549584

550585
@Override

0 commit comments

Comments
 (0)