@@ -395,7 +395,7 @@ std::vector<std::shared_ptr<MenuItem>> Menu::GetAllItems() const {
395395 return pimpl_->items_ ;
396396}
397397
398- bool Menu::Open (const PositioningStrategy& strategy) {
398+ bool Menu::Open (const PositioningStrategy& strategy, Placement placement ) {
399399 if (pimpl_->gtk_menu_ ) {
400400 gtk_widget_show_all (pimpl_->gtk_menu_ );
401401
@@ -426,6 +426,61 @@ bool Menu::Open(const PositioningStrategy& strategy) {
426426 }
427427 }
428428
429+ // Map placement to GDK gravity values
430+ GdkGravity anchor_gravity = GDK_GRAVITY_NORTH_WEST;
431+ GdkGravity menu_gravity = GDK_GRAVITY_NORTH_WEST;
432+
433+ switch (placement) {
434+ case Placement::Top:
435+ anchor_gravity = GDK_GRAVITY_SOUTH;
436+ menu_gravity = GDK_GRAVITY_NORTH;
437+ break ;
438+ case Placement::TopStart:
439+ anchor_gravity = GDK_GRAVITY_SOUTH_WEST;
440+ menu_gravity = GDK_GRAVITY_NORTH_WEST;
441+ break ;
442+ case Placement::TopEnd:
443+ anchor_gravity = GDK_GRAVITY_SOUTH_EAST;
444+ menu_gravity = GDK_GRAVITY_NORTH_EAST;
445+ break ;
446+ case Placement::Right:
447+ anchor_gravity = GDK_GRAVITY_WEST;
448+ menu_gravity = GDK_GRAVITY_EAST;
449+ break ;
450+ case Placement::RightStart:
451+ anchor_gravity = GDK_GRAVITY_NORTH_WEST;
452+ menu_gravity = GDK_GRAVITY_NORTH_EAST;
453+ break ;
454+ case Placement::RightEnd:
455+ anchor_gravity = GDK_GRAVITY_SOUTH_WEST;
456+ menu_gravity = GDK_GRAVITY_SOUTH_EAST;
457+ break ;
458+ case Placement::Bottom:
459+ anchor_gravity = GDK_GRAVITY_NORTH;
460+ menu_gravity = GDK_GRAVITY_SOUTH;
461+ break ;
462+ case Placement::BottomStart:
463+ anchor_gravity = GDK_GRAVITY_NORTH_WEST;
464+ menu_gravity = GDK_GRAVITY_SOUTH_WEST;
465+ break ;
466+ case Placement::BottomEnd:
467+ anchor_gravity = GDK_GRAVITY_NORTH_EAST;
468+ menu_gravity = GDK_GRAVITY_SOUTH_EAST;
469+ break ;
470+ case Placement::Left:
471+ anchor_gravity = GDK_GRAVITY_EAST;
472+ menu_gravity = GDK_GRAVITY_WEST;
473+ break ;
474+ case Placement::LeftStart:
475+ anchor_gravity = GDK_GRAVITY_NORTH_EAST;
476+ menu_gravity = GDK_GRAVITY_NORTH_WEST;
477+ break ;
478+ case Placement::LeftEnd:
479+ anchor_gravity = GDK_GRAVITY_SOUTH_EAST;
480+ menu_gravity = GDK_GRAVITY_SOUTH_WEST;
481+ break ;
482+ }
483+
429484 // Try to position at explicit coordinates if available
430485 if (use_explicit_position) {
431486 GdkWindow* root_window = gdk_get_default_root_window ();
@@ -436,7 +491,7 @@ bool Menu::Open(const PositioningStrategy& strategy) {
436491 rect.width = 1 ;
437492 rect.height = 1 ;
438493 gtk_menu_popup_at_rect (GTK_MENU (pimpl_->gtk_menu_ ), root_window, &rect,
439- GDK_GRAVITY_NORTH_WEST, GDK_GRAVITY_NORTH_WEST , nullptr );
494+ anchor_gravity, menu_gravity , nullptr );
440495 } else {
441496 // Fallback to pointer if root window not available
442497 gtk_menu_popup_at_pointer (GTK_MENU (pimpl_->gtk_menu_ ), nullptr );
0 commit comments