@@ -680,51 +680,50 @@ bool Menu::Open(const PositioningStrategy& strategy, Placement placement) {
680680
681681 GdkRectangle rectangle;
682682
683- // Calculate position based on strategy type
684- if (strategy.GetType () == PositioningStrategy::Type::CursorPosition) {
685- // Position relative to the window under the pointer to avoid coord space mismatches
686- int x = 0 , y = 0 ;
687- GdkWindow* pointer_window = nullptr ;
683+ switch (strategy.GetType ()) {
684+ case PositioningStrategy::Type::Absolute:
685+ // Linux does not support Absolute positioning strategy
686+ std::cerr << " Warning: Absolute positioning strategy is not supported on Linux" << std::endl;
687+ return false ;
688+
689+ case PositioningStrategy::Type::CursorPosition: {
690+ // Position relative to the window under the pointer to avoid coord space mismatches
691+ int x = 0 , y = 0 ;
692+ GdkWindow* pointer_window = nullptr ;
688693#if GTK_CHECK_VERSION(3, 20, 0)
689- GdkDisplay* display = gdk_display_get_default ();
690- GdkSeat* seat = display ? gdk_display_get_default_seat (display) : nullptr ;
691- GdkDevice* pointer = seat ? gdk_seat_get_pointer (seat) : nullptr ;
692- if (pointer) {
693- pointer_window = gdk_device_get_window_at_position (pointer, &x, &y);
694- }
694+ GdkDisplay* display = gdk_display_get_default ();
695+ GdkSeat* seat = display ? gdk_display_get_default_seat (display) : nullptr ;
696+ GdkDevice* pointer = seat ? gdk_seat_get_pointer (seat) : nullptr ;
697+ if (pointer) {
698+ pointer_window = gdk_device_get_window_at_position (pointer, &x, &y);
699+ }
695700#else
696- GdkDeviceManager* devman = gdk_display_get_device_manager (gdk_display_get_default ());
697- GdkDevice* pointer = gdk_device_manager_get_client_pointer (devman);
698- if (pointer) {
699- GdkScreen* screen = nullptr ;
700- gdk_device_get_position (pointer, &screen, &x, &y); // screen coords
701- pointer_window = gdk_get_default_root_window ();
702- }
701+ GdkDeviceManager* devman = gdk_display_get_device_manager (gdk_display_get_default ());
702+ GdkDevice* pointer = gdk_device_manager_get_client_pointer (devman);
703+ if (pointer) {
704+ GdkScreen* screen = nullptr ;
705+ gdk_device_get_position (pointer, &screen, &x, &y); // screen coords
706+ pointer_window = gdk_get_default_root_window ();
707+ }
703708#endif
704- if (pointer_window) {
705- gdk_window = pointer_window; // ensure rect coords match this window
706- } else if (!gdk_window) {
707- gdk_window = gdk_get_default_root_window ();
709+ if (pointer_window) {
710+ gdk_window = pointer_window; // ensure rect coords match this window
711+ } else if (!gdk_window) {
712+ gdk_window = gdk_get_default_root_window ();
713+ }
714+
715+ rectangle.x = x;
716+ rectangle.y = y;
717+ rectangle.width = 1 ;
718+ rectangle.height = 1 ;
719+ break ;
708720 }
709721
710- rectangle.x = x;
711- rectangle.y = y;
712- rectangle.width = 1 ;
713- rectangle.height = 1 ;
714- } else {
715- // Absolute or Relative positioning
716- Point position;
717-
718- if (strategy.GetType () == PositioningStrategy::Type::Absolute) {
719- position = strategy.GetAbsolutePosition ();
720- // For absolute positioning, use root window coordinates directly
721- rectangle.x = static_cast <int >(position.x );
722- rectangle.y = static_cast <int >(position.y );
723- } else {
722+ case PositioningStrategy::Type::Relative: {
724723 // Relative positioning
725724 Rectangle rect = strategy.GetRelativeRectangle ();
726725 Point offset = strategy.GetRelativeOffset ();
727- position = Point{rect.x + offset.x , rect.y + offset.y };
726+ Point position = Point{rect.x + offset.x , rect.y + offset.y };
728727
729728 // If we have a relative window, adjust for frame extents and title bar
730729 if (relative_window && relative_window->GetNativeObject ()) {
@@ -775,18 +774,24 @@ bool Menu::Open(const PositioningStrategy& strategy, Placement placement) {
775774
776775 // Convert content-relative coordinates to window-relative coordinates
777776 // Apply DPI scaling, then adjust for window position and frame extents
778- rectangle.x = static_cast <int >((position.x * device_pixel_ratio) + window_x - frame_rectangle.x );
779- rectangle.y = static_cast <int >((position.y * device_pixel_ratio) + window_y - frame_rectangle.y + title_bar_height);
777+ rectangle.x =
778+ static_cast <int >((position.x * device_pixel_ratio) + window_x - frame_rectangle.x );
779+ rectangle.y = static_cast <int >((position.y * device_pixel_ratio) + window_y -
780+ frame_rectangle.y + title_bar_height);
780781 } else {
781782 // Relative to rectangle (no window) - use root window coordinates
782783 rectangle.x = static_cast <int >(position.x );
783784 rectangle.y = static_cast <int >(position.y );
784785 }
786+
787+ // Set rectangle dimensions
788+ rectangle.width = 1 ;
789+ rectangle.height = 1 ;
790+ break ;
785791 }
786792
787- // Set rectangle dimensions
788- rectangle.width = 1 ;
789- rectangle.height = 1 ;
793+ default :
794+ return false ;
790795 }
791796
792797 // Map placement to GDK gravity (menu anchor)
0 commit comments