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
418443long 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