[Git][wxwidgets/wxwidgets][master] Use GdkSeat API for mouse capture/release with GTK 3.20+

2 views
Skip to first unread message

Vadim Zeitlin (@_VZ_)

unread,
Jul 10, 2024, 8:19:28 PMJul 10
to wx-commi...@googlegroups.com

Vadim Zeitlin pushed to branch master at wxWidgets / wxWidgets

Commits:

  • ba026c21
    by Paul Cornett at 2024-07-10T16:02:34-07:00
    Use GdkSeat API for mouse capture/release with GTK 3.20+
    
    Avoids "Gdk-WARNING **: Window x is already mapped at the time of grabbing" on Wayland
    See #24690
    

1 changed file:

Changes:

  • src/gtk/window.cpp
    ... ... @@ -6402,34 +6402,31 @@ void wxWindowGTK::DoCaptureMouse()
    6402 6402
     
    
    6403 6403
         wxCHECK_RET( window, wxT("CaptureMouse() failed") );
    
    6404 6404
     
    
    6405
    -#ifdef __WXGTK4__
    
    6406
    -    GdkDisplay* display = gdk_window_get_display(window);
    
    6407
    -    GdkSeat* seat = gdk_display_get_default_seat(display);
    
    6408
    -    gdk_seat_grab(seat, window, GDK_SEAT_CAPABILITY_POINTER, false, nullptr, nullptr, nullptr, 0);
    
    6409
    -#else
    
    6410
    -    const GdkEventMask mask = GdkEventMask(
    
    6411
    -        GDK_SCROLL_MASK |
    
    6412
    -        GDK_BUTTON_PRESS_MASK |
    
    6413
    -        GDK_BUTTON_RELEASE_MASK |
    
    6414
    -        GDK_POINTER_MOTION_HINT_MASK |
    
    6415
    -        GDK_POINTER_MOTION_MASK);
    
    6416
    -#ifdef __WXGTK3__
    
    6417
    -    GdkDisplay* display = gdk_window_get_display(window);
    
    6418
    -    wxGCC_WARNING_SUPPRESS(deprecated-declarations)
    
    6419
    -    GdkDeviceManager* manager = gdk_display_get_device_manager(display);
    
    6420
    -    GdkDevice* device = gdk_device_manager_get_client_pointer(manager);
    
    6421
    -    gdk_device_grab(
    
    6422
    -        device, window, GDK_OWNERSHIP_NONE, false, mask,
    
    6423
    -        nullptr, unsigned(GDK_CURRENT_TIME));
    
    6424
    -    wxGCC_WARNING_RESTORE()
    
    6425
    -#else
    
    6426
    -    gdk_pointer_grab( window, FALSE,
    
    6427
    -                      mask,
    
    6428
    -                      nullptr,
    
    6429
    -                      nullptr,
    
    6430
    -                      (guint32)GDK_CURRENT_TIME );
    
    6405
    +#if GTK_CHECK_VERSION(3,20,0)
    
    6406
    +    if (gtk_check_version(3,20,0) == nullptr)
    
    6407
    +    {
    
    6408
    +        GdkDisplay* display = gdk_window_get_display(window);
    
    6409
    +        GdkSeat* seat = gdk_display_get_default_seat(display);
    
    6410
    +        gdk_seat_grab(seat, window, GDK_SEAT_CAPABILITY_ALL_POINTING, false,
    
    6411
    +            nullptr, nullptr, nullptr, nullptr);
    
    6412
    +    }
    
    6413
    +    else
    
    6431 6414
     #endif
    
    6432
    -#endif // !__WXGTK4__
    
    6415
    +    {
    
    6416
    +        const GdkEventMask mask = GdkEventMask(
    
    6417
    +            GDK_SCROLL_MASK |
    
    6418
    +            GDK_BUTTON_PRESS_MASK |
    
    6419
    +            GDK_BUTTON_RELEASE_MASK |
    
    6420
    +            GDK_POINTER_MOTION_HINT_MASK |
    
    6421
    +            GDK_POINTER_MOTION_MASK);
    
    6422
    +        wxGCC_WARNING_SUPPRESS(deprecated-declarations)
    
    6423
    +        gdk_pointer_grab( window, FALSE,
    
    6424
    +                          mask,
    
    6425
    +                          nullptr,
    
    6426
    +                          nullptr,
    
    6427
    +                          (guint32)GDK_CURRENT_TIME );
    
    6428
    +        wxGCC_WARNING_RESTORE()
    
    6429
    +    }
    
    6433 6430
         g_captureWindow = this;
    
    6434 6431
         g_captureWindowHasMouse = true;
    
    6435 6432
     }
    
    ... ... @@ -6451,38 +6448,32 @@ void wxWindowGTK::DoReleaseMouse()
    6451 6448
         if (!window)
    
    6452 6449
             return;
    
    6453 6450
     
    
    6454
    -#ifdef __WXGTK3__
    
    6455 6451
         GdkDisplay* display = gdk_window_get_display(window);
    
    6456
    -#ifdef __WXGTK4__
    
    6457
    -    gdk_seat_ungrab(gdk_display_get_default_seat(display));
    
    6458
    -#else
    
    6459
    -    wxGCC_WARNING_SUPPRESS(deprecated-declarations)
    
    6460
    -    GdkDeviceManager* manager = gdk_display_get_device_manager(display);
    
    6461
    -    GdkDevice* device = gdk_device_manager_get_client_pointer(manager);
    
    6462
    -    gdk_device_ungrab(device, unsigned(GDK_CURRENT_TIME));
    
    6463
    -    wxGCC_WARNING_RESTORE()
    
    6464
    -#endif
    
    6465
    -#else
    
    6466
    -    gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME );
    
    6452
    +#if GTK_CHECK_VERSION(3,20,0)
    
    6453
    +    if (gtk_check_version(3,20,0) == nullptr)
    
    6454
    +        gdk_seat_ungrab(gdk_display_get_default_seat(display));
    
    6455
    +    else
    
    6467 6456
     #endif
    
    6457
    +    {
    
    6458
    +        wxGCC_WARNING_SUPPRESS(deprecated-declarations)
    
    6459
    +        gdk_display_pointer_ungrab(display, unsigned(GDK_CURRENT_TIME));
    
    6460
    +        wxGCC_WARNING_RESTORE()
    
    6461
    +    }
    
    6468 6462
     }
    
    6469 6463
     
    
    6470 6464
     void wxWindowGTK::GTKReleaseMouseAndNotify()
    
    6471 6465
     {
    
    6472 6466
         GdkDisplay* display = gtk_widget_get_display(m_widget);
    
    6473
    -#ifdef __WXGTK3__
    
    6474
    -#ifdef __WXGTK4__
    
    6475
    -    gdk_seat_ungrab(gdk_display_get_default_seat(display));
    
    6476
    -#else
    
    6477
    -    wxGCC_WARNING_SUPPRESS(deprecated-declarations)
    
    6478
    -    GdkDeviceManager* manager = gdk_display_get_device_manager(display);
    
    6479
    -    GdkDevice* device = gdk_device_manager_get_client_pointer(manager);
    
    6480
    -    gdk_device_ungrab(device, unsigned(GDK_CURRENT_TIME));
    
    6481
    -    wxGCC_WARNING_RESTORE()
    
    6482
    -#endif
    
    6483
    -#else
    
    6484
    -    gdk_display_pointer_ungrab(display, unsigned(GDK_CURRENT_TIME));
    
    6467
    +#if GTK_CHECK_VERSION(3,20,0)
    
    6468
    +    if (gtk_check_version(3,20,0) == nullptr)
    
    6469
    +        gdk_seat_ungrab(gdk_display_get_default_seat(display));
    
    6470
    +    else
    
    6485 6471
     #endif
    
    6472
    +    {
    
    6473
    +        wxGCC_WARNING_SUPPRESS(deprecated-declarations)
    
    6474
    +        gdk_display_pointer_ungrab(display, unsigned(GDK_CURRENT_TIME));
    
    6475
    +        wxGCC_WARNING_RESTORE()
    
    6476
    +    }
    
    6486 6477
         g_captureWindow = nullptr;
    
    6487 6478
         NotifyCaptureLost();
    
    6488 6479
     }
    


View it on GitLab.
You're receiving this email because of your account on gitlab.com. Manage all notifications · Help

Reply all
Reply to author
Forward
0 new messages