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
... | ... | @@ -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