xdg-positioner: honor constraint flags
This commit is contained in:
parent
dbffda7549
commit
0bfcce50a9
|
@ -51,6 +51,9 @@ static void popup_handle_new_popup(struct wl_listener *listener, void *data) {
|
|||
}
|
||||
|
||||
static void popup_unconstrain(struct roots_xdg_popup_v6 *popup) {
|
||||
// get the output of the popup's positioner anchor point and convert it to
|
||||
// the toplevel parent's coordinate system and then pass it to
|
||||
// wlr_xdg_popup_v6_unconstrain_from_box
|
||||
struct roots_view *view = popup->view_child.view;
|
||||
struct wlr_output_layout *layout = view->desktop->layout;
|
||||
struct wlr_xdg_popup_v6 *wlr_popup = popup->wlr_popup;
|
||||
|
|
|
@ -1723,28 +1723,34 @@ static bool wlr_xdg_popup_v6_unconstrain_flip(struct wlr_xdg_popup_v6 *popup,
|
|||
return true;
|
||||
}
|
||||
|
||||
if (offset_x) {
|
||||
bool flip_x = offset_x &&
|
||||
(popup->positioner.constraint_adjustment &
|
||||
WLR_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_FLIP_X);
|
||||
|
||||
bool flip_y = offset_x &&
|
||||
(popup->positioner.constraint_adjustment &
|
||||
WLR_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_FLIP_Y);
|
||||
|
||||
if (flip_x) {
|
||||
wlr_positioner_v6_invert_x(&popup->positioner);
|
||||
}
|
||||
if (offset_y) {
|
||||
if (flip_y) {
|
||||
wlr_positioner_v6_invert_y(&popup->positioner);
|
||||
}
|
||||
|
||||
popup->geometry =
|
||||
wlr_xdg_positioner_v6_get_geometry(&popup->positioner);
|
||||
|
||||
wlr_xdg_popup_v6_box_constraints(popup, toplevel_box, &offset_x, &offset_y);
|
||||
|
||||
if (!offset_x && !offset_y) {
|
||||
// no longer constrained
|
||||
return true;
|
||||
}
|
||||
|
||||
// revert the positioner back if it didn't fix it and go to the next part
|
||||
if (offset_x) {
|
||||
if (flip_x) {
|
||||
wlr_positioner_v6_invert_x(&popup->positioner);
|
||||
}
|
||||
if (offset_y) {
|
||||
if (flip_y) {
|
||||
wlr_positioner_v6_invert_y(&popup->positioner);
|
||||
}
|
||||
|
||||
|
@ -1763,11 +1769,19 @@ static bool wlr_xdg_popup_v6_unconstrain_slide(struct wlr_xdg_popup_v6 *popup,
|
|||
return true;
|
||||
}
|
||||
|
||||
if (offset_x) {
|
||||
bool slide_x = offset_x &&
|
||||
(popup->positioner.constraint_adjustment &
|
||||
WLR_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_SLIDE_X);
|
||||
|
||||
bool slide_y = offset_x &&
|
||||
(popup->positioner.constraint_adjustment &
|
||||
WLR_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_SLIDE_Y);
|
||||
|
||||
if (slide_x) {
|
||||
popup->geometry.x += offset_x;
|
||||
}
|
||||
|
||||
if (offset_y) {
|
||||
if (slide_y) {
|
||||
popup->geometry.y += offset_y;
|
||||
}
|
||||
|
||||
|
@ -1785,10 +1799,18 @@ static bool wlr_xdg_popup_v6_unconstrain_resize(struct wlr_xdg_popup_v6 *popup,
|
|||
return true;
|
||||
}
|
||||
|
||||
if (offset_x) {
|
||||
bool resize_x = offset_x &&
|
||||
(popup->positioner.constraint_adjustment &
|
||||
WLR_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_RESIZE_X);
|
||||
|
||||
bool resize_y = offset_x &&
|
||||
(popup->positioner.constraint_adjustment &
|
||||
WLR_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_RESIZE_Y);
|
||||
|
||||
if (resize_x) {
|
||||
popup->geometry.width -= offset_x;
|
||||
}
|
||||
if (offset_y) {
|
||||
if (resize_y) {
|
||||
popup->geometry.height -= offset_y;
|
||||
}
|
||||
|
||||
|
@ -1799,8 +1821,15 @@ static bool wlr_xdg_popup_v6_unconstrain_resize(struct wlr_xdg_popup_v6 *popup,
|
|||
|
||||
void wlr_xdg_popup_v6_unconstrain_from_box(struct wlr_xdg_popup_v6 *popup,
|
||||
struct wlr_box *toplevel_box) {
|
||||
wlr_xdg_popup_v6_unconstrain_flip(popup, toplevel_box);
|
||||
wlr_xdg_popup_v6_unconstrain_slide(popup, toplevel_box);
|
||||
if (wlr_xdg_popup_v6_unconstrain_flip(popup, toplevel_box)) {
|
||||
return;
|
||||
}
|
||||
if (wlr_xdg_popup_v6_unconstrain_slide(popup, toplevel_box)) {
|
||||
return;
|
||||
}
|
||||
if (wlr_xdg_popup_v6_unconstrain_resize(popup, toplevel_box)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void wlr_positioner_v6_invert_x(struct wlr_xdg_positioner_v6_attributes *positioner) {
|
||||
|
|
Loading…
Reference in New Issue