Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4.c
Original file line number Diff line number Diff line change
Expand Up @@ -1362,6 +1362,18 @@ JNIEXPORT jlong JNICALL GTK4_NATIVE(gtk_1gesture_1drag_1new)
}
#endif

#ifndef NO_gtk_1gesture_1get_1last_1updated_1sequence
JNIEXPORT jlong JNICALL GTK4_NATIVE(gtk_1gesture_1get_1last_1updated_1sequence)
(JNIEnv *env, jclass that, jlong arg0)
{
jlong rc = 0;
GTK4_NATIVE_ENTER(env, that, gtk_1gesture_1get_1last_1updated_1sequence_FUNC);
rc = (jlong)gtk_gesture_get_last_updated_sequence((GtkGesture *)arg0);
GTK4_NATIVE_EXIT(env, that, gtk_1gesture_1get_1last_1updated_1sequence_FUNC);
return rc;
}
#endif

#ifndef NO_gtk_1gesture_1rotate_1new
JNIEXPORT jlong JNICALL GTK4_NATIVE(gtk_1gesture_1rotate_1new)
(JNIEnv *env, jclass that)
Expand All @@ -1374,6 +1386,18 @@ JNIEXPORT jlong JNICALL GTK4_NATIVE(gtk_1gesture_1rotate_1new)
}
#endif

#ifndef NO_gtk_1gesture_1set_1sequence_1state
JNIEXPORT jboolean JNICALL GTK4_NATIVE(gtk_1gesture_1set_1sequence_1state)
(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
jboolean rc = 0;
GTK4_NATIVE_ENTER(env, that, gtk_1gesture_1set_1sequence_1state_FUNC);
rc = (jboolean)gtk_gesture_set_sequence_state((GtkGesture *)arg0, (GdkEventSequence *)arg1, (GtkEventSequenceState)arg2);
GTK4_NATIVE_EXIT(env, that, gtk_1gesture_1set_1sequence_1state_FUNC);
return rc;
}
#endif

#ifndef NO_gtk_1gesture_1zoom_1new
JNIEXPORT jlong JNICALL GTK4_NATIVE(gtk_1gesture_1zoom_1new)
(JNIEnv *env, jclass that)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,9 @@ typedef enum {
gtk_1frame_1set_1child_FUNC,
gtk_1gesture_1click_1new_FUNC,
gtk_1gesture_1drag_1new_FUNC,
gtk_1gesture_1get_1last_1updated_1sequence_FUNC,
gtk_1gesture_1rotate_1new_FUNC,
gtk_1gesture_1set_1sequence_1state_FUNC,
gtk_1gesture_1zoom_1new_FUNC,
gtk_1hsv_1to_1rgb_FUNC,
gtk_1icon_1paintable_1get_1file_FUNC,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2021, 2024 Syntevo and others.
* Copyright (c) 2021, 2025 Syntevo and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
Expand All @@ -22,6 +22,10 @@ public class GTK4 {

public static final int GTK_POPOVER_MENU_NESTED = 1 << 0;

public static final int GTK_EVENT_SEQUENCE_NONE = 0;
public static final int GTK_EVENT_SEQUENCE_CLAIMED = 1;
public static final int GTK_EVENT_SEQUENCE_DENIED = 2;

/**
* @param context cast=(GtkIMContext *)
* @param event cast=(GdkEvent *)
Expand Down Expand Up @@ -830,4 +834,16 @@ public class GTK4 {

public static final native long gtk_gesture_drag_new();

/**
* @param gesture cast=(GtkGesture *)
* @param sequence cast=(GdkEventSequence *)
* @param state cast=(GtkEventSequenceState)
*/
public static final native boolean gtk_gesture_set_sequence_state(long gesture, long sequence, int state);

/**
* @param gesture cast=(GtkGesture *)
*/
public static final native long gtk_gesture_get_last_updated_sequence(long gesture);

}
Original file line number Diff line number Diff line change
Expand Up @@ -3406,28 +3406,38 @@ void gtk_style_context_get_border (long context, int state, GtkBorder padding) {
* Handling multi-press event on GTK4
*/
@Override
void gtk_gesture_press_event (long gesture, int n_press, double x, double y, long event) {
int gtk_gesture_press_event (long gesture, int n_press, double x, double y, long event) {
mouseDown = true;

int eventButton = GDK.gdk_button_event_get_button(event);
int eventTime = GDK.gdk_event_get_time(event);
int eventState = GDK.gdk_event_get_modifier_state(event);
int result = GTK4.GTK_EVENT_SEQUENCE_NONE;

display.clickCount = n_press;
if (n_press == 1) {
sendMouseEvent(SWT.MouseDown, eventButton, n_press, 0, false, eventTime, x, y, false, eventState);
if ((state & MENU) == 0) {
boolean cancelled = sendMouseEvent(SWT.MouseDown, eventButton, n_press, 0, false, eventTime, x, y, false, eventState);
if (!cancelled) {
result = GTK4.GTK_EVENT_SEQUENCE_CLAIMED;
}
if ((state & MENU) != 0) {
if (eventButton == 3) {
showMenu ((int)x, (int)y);
if (showMenu ((int)x, (int)y)) {
result = GTK4.GTK_EVENT_SEQUENCE_CLAIMED;
}
}
}
} else if (n_press == 2) {
sendMouseEvent(SWT.MouseDoubleClick, eventButton, n_press, 0, false, eventTime, x, y, false, eventState);
boolean cancelled = sendMouseEvent(SWT.MouseDoubleClick, eventButton, n_press, 0, false, eventTime, x, y, false, eventState);
if (!cancelled) {
result = GTK4.GTK_EVENT_SEQUENCE_CLAIMED;
}
}
return result;
}

@Override
void gtk_gesture_release_event (long gesture, int n_press, double x, double y, long event) {
int gtk_gesture_release_event (long gesture, int n_press, double x, double y, long event) {
mouseDown = false;

double [] eventX = new double [1];
Expand All @@ -3440,8 +3450,13 @@ void gtk_gesture_release_event (long gesture, int n_press, double x, double y, l

lastInput.x = (int) eventX[0];
lastInput.y = (int) eventY[0];
if (containedInRegion(lastInput.x, lastInput.y)) return;
sendMouseEvent(SWT.MouseUp, eventButton, display.clickCount, 0, false, eventTime, 0, 0, false, eventState);
if (containedInRegion(lastInput.x, lastInput.y)) return GTK4.GTK_EVENT_SEQUENCE_NONE;
boolean cancelled = sendMouseEvent(SWT.MouseUp, eventButton, display.clickCount, 0, false, eventTime, 0, 0, false, eventState);
int result = GTK4.GTK_EVENT_SEQUENCE_NONE;
if (!cancelled) {
result = GTK4.GTK_EVENT_SEQUENCE_CLAIMED;
}
return result;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2222,7 +2222,7 @@ long gtk_button_release_event (long widget, long event) {
}

@Override
void gtk_gesture_release_event(long gesture, int n_press, double x, double y, long event) {
int gtk_gesture_release_event(long gesture, int n_press, double x, double y, long event) {
if (isDate() || isTime()) {
int button = GTK.gtk_gesture_single_get_current_button(gesture);

Expand All @@ -2231,7 +2231,7 @@ void gtk_gesture_release_event(long gesture, int n_press, double x, double y, lo
}
}

super.gtk_gesture_release_event(gesture, n_press, x, y, event);
return super.gtk_gesture_release_event(gesture, n_press, x, y, event);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -905,14 +905,16 @@ long gtk_button_press_event (long widget, long event) {
}

@Override
void gtk_gesture_press_event (long gesture, int n_press, double x, double y, long event) {
if (n_press == 1) return;
super.gtk_gesture_press_event(gesture, n_press, x, y, event);
int gtk_gesture_press_event (long gesture, int n_press, double x, double y, long event) {
if (n_press == 1) return GTK4.GTK_EVENT_SEQUENCE_NONE;
int result = super.gtk_gesture_press_event(gesture, n_press, x, y, event);

if (n_press == 2 && rowActivated) {
sendTreeDefaultSelection ();
rowActivated = false;
}

return result;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,11 +170,11 @@ void createHandle(int index) {
}

@Override
void gtk_gesture_press_event(long gesture, int n_press, double x, double y, long event) {
super.gtk_gesture_press_event(gesture, n_press, x, y, event);
int gtk_gesture_press_event(long gesture, int n_press, double x, double y, long event) {
int result = super.gtk_gesture_press_event(gesture, n_press, x, y, event);

int eventButton = GDK.gdk_button_event_get_button(event);
if (eventButton != 1 || n_press != 1) return;
if (eventButton != 1 || n_press != 1) return result;

startX = (int)x;
startY = (int)y;
Expand All @@ -197,20 +197,24 @@ void gtk_gesture_press_event(long gesture, int n_press, double x, double y, long
}
if ((parent.style & SWT.MIRRORED) != 0) jEvent.x = DPIUtil.autoScaleDown(parent.getClientWidth() - width) - jEvent.x;
sendSelectionEvent(SWT.Selection, jEvent, true);
if (isDisposed()) return;
if (isDisposed()) return result;

if (jEvent.doit) {
dragging = true;
}

return result;
}

@Override
void gtk_gesture_release_event(long gesture, int n_press, double x, double y, long event) {
super.gtk_gesture_release_event(gesture, n_press, x, y, event);
int gtk_gesture_release_event(long gesture, int n_press, double x, double y, long event) {
int result = super.gtk_gesture_release_event(gesture, n_press, x, y, event);

int eventButton = GDK.gdk_button_event_get_button(event);
if (eventButton != 1 || !dragging) return;
if (eventButton != 1 || !dragging) return result;
dragging = false;

return result;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2129,16 +2129,18 @@ long gtk_button_press_event (long widget, long event) {
}

@Override
void gtk_gesture_press_event (long gesture, int n_press, double x, double y, long event) {
if (n_press == 1) return;
super.gtk_gesture_press_event(gesture, n_press, x, y, event);
int gtk_gesture_press_event (long gesture, int n_press, double x, double y, long event) {
if (n_press == 1) return GTK4.GTK_EVENT_SEQUENCE_NONE;
int result = super.gtk_gesture_press_event(gesture, n_press, x, y, event);

// TODO: GTK4 replicate gtk_button_press_event functions

if (n_press == 2 && rowActivated) {
sendTreeDefaultSelection ();
rowActivated = false;
}

return result;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.eclipse.swt.internal.*;
import org.eclipse.swt.internal.gtk.*;
import org.eclipse.swt.internal.gtk3.*;
import org.eclipse.swt.internal.gtk4.*;

/**
* Instances of this class represent icons that can be placed on the
Expand Down Expand Up @@ -288,7 +289,7 @@ long gtk_button_press_event (long widget, long event) {
}

@Override
void gtk_gesture_press_event(long gesture, int n_press, double x, double y, long event) {
int gtk_gesture_press_event(long gesture, int n_press, double x, double y, long event) {
switch (n_press) {
case 1: {
int eventButton = GDK.gdk_button_event_get_button(event);
Expand All @@ -306,6 +307,7 @@ void gtk_gesture_press_event(long gesture, int n_press, double x, double y, long
default:
break;
}
return GTK4.GTK_EVENT_SEQUENCE_NONE;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2318,13 +2318,15 @@ long gtk_button_press_event (long widget, long event) {
}

@Override
void gtk_gesture_press_event (long gesture, int n_press, double x, double y, long event) {
super.gtk_gesture_press_event(gesture, n_press, x, y, event);
int gtk_gesture_press_event (long gesture, int n_press, double x, double y, long event) {
int result = super.gtk_gesture_press_event(gesture, n_press, x, y, event);

if (n_press == 2 && rowActivated) {
sendTreeDefaultSelection ();
rowActivated = false;
}

return result;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,10 +365,12 @@ long gtk_clicked (long widget) {
}

@Override
void gtk_gesture_press_event(long gesture, int n_press, double x, double y, long event) {
int gtk_gesture_press_event(long gesture, int n_press, double x, double y, long event) {
boolean doubleClick = n_press >= 2 ? true : false;

sendSelectionEvent(doubleClick ? SWT.DefaultSelection : SWT.Selection);

return GTK4.GTK_EVENT_SEQUENCE_NONE;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2024 IBM Corporation and others.
* Copyright (c) 2000, 2025 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
Expand Down Expand Up @@ -806,7 +806,9 @@ long gtk_button_release_event (long widget, long event) {
* @param y the y coordinate, in widget allocation coordinates
* @param event the GdkEvent captured
*/
void gtk_gesture_press_event(long gesture, int n_press, double x, double y, long event) {}
int gtk_gesture_press_event(long gesture, int n_press, double x, double y, long event) {
return GTK4.GTK_EVENT_SEQUENCE_NONE;
}

/**
* @param gesture the corresponding controller responsible for capturing the event
Expand All @@ -815,7 +817,9 @@ void gtk_gesture_press_event(long gesture, int n_press, double x, double y, long
* @param y the y coordinate, in widget allocation coordinates
* @param event the GdkEvent captured
*/
void gtk_gesture_release_event(long gesture, int n_press, double x, double y, long event) {}
int gtk_gesture_release_event(long gesture, int n_press, double x, double y, long event) {
return GTK4.GTK_EVENT_SEQUENCE_NONE;
}

/**
* @param controller the corresponding controller responsible for capturing the event
Expand Down Expand Up @@ -2531,15 +2535,20 @@ boolean keyPressReleaseProc(long controller, int keyval, int keycode, int state,

void gesturePressReleaseProc(long gesture, int n_press, double x, double y, long user_data) {
long event = GTK4.gtk_event_controller_get_current_event(gesture);
long sequence = GTK4.gtk_gesture_get_last_updated_sequence(gesture);

int result = GTK4.GTK_EVENT_SEQUENCE_NONE;

switch ((int)user_data) {
case GESTURE_PRESSED:
gtk_gesture_press_event(gesture, n_press, x, y, event);
result = gtk_gesture_press_event(gesture, n_press, x, y, event);
break;
case GESTURE_RELEASED:
gtk_gesture_release_event(gesture, n_press, x, y, event);
result = gtk_gesture_release_event(gesture, n_press, x, y, event);
break;
}

GTK4.gtk_gesture_set_sequence_state(gesture, sequence, result);
}

void leaveProc(long controller, long handle, long user_data) {
Expand Down
Loading