Skip to content

Commit 6439cea

Browse files
committed
Refactor menu positioning strategy handling
Replaces if-else logic with a switch statement for handling PositioningStrategy types in Menu::Open. Improves code clarity and explicitly handles unsupported Absolute positioning and default cases by returning false.
1 parent cfe05d6 commit 6439cea

File tree

1 file changed

+47
-42
lines changed

1 file changed

+47
-42
lines changed

src/platform/linux/menu_linux.cpp

Lines changed: 47 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)