diff options
| -rw-r--r-- | include/rootston/seat.h | 4 | ||||
| -rw-r--r-- | include/wlr/types/wlr_data_device.h | 5 | ||||
| -rw-r--r-- | include/wlr/types/wlr_seat.h | 2 | ||||
| -rw-r--r-- | include/wlr/types/wlr_surface.h | 2 | ||||
| -rw-r--r-- | include/wlr/types/wlr_xdg_shell.h | 1 | ||||
| -rw-r--r-- | include/wlr/types/wlr_xdg_shell_v6.h | 1 | ||||
| -rw-r--r-- | rootston/seat.c | 15 | ||||
| -rw-r--r-- | types/data_device/wlr_drag.c | 26 | ||||
| -rw-r--r-- | types/seat/wlr_seat.c | 74 | ||||
| -rw-r--r-- | types/wlr_box.c | 8 | ||||
| -rw-r--r-- | types/wlr_linux_dmabuf.c | 3 | ||||
| -rw-r--r-- | types/wlr_surface.c | 12 | ||||
| -rw-r--r-- | types/xdg_shell/wlr_xdg_popup.c | 6 | ||||
| -rw-r--r-- | types/xdg_shell/wlr_xdg_positioner.c | 2 | ||||
| -rw-r--r-- | types/xdg_shell/wlr_xdg_toplevel.c | 2 | ||||
| -rw-r--r-- | types/xdg_shell_v6/wlr_xdg_popup_v6.c | 6 | ||||
| -rw-r--r-- | types/xdg_shell_v6/wlr_xdg_toplevel_v6.c | 2 | 
17 files changed, 117 insertions, 54 deletions
diff --git a/include/rootston/seat.h b/include/rootston/seat.h index d2ef90f3..0e3043dd 100644 --- a/include/rootston/seat.h +++ b/include/rootston/seat.h @@ -59,6 +59,7 @@ struct roots_drag_icon {  	struct wl_listener surface_commit;  	struct wl_listener map; +	struct wl_listener unmap;  	struct wl_listener destroy;  }; @@ -94,9 +95,6 @@ void roots_seat_destroy(struct roots_seat *seat);  void roots_seat_add_device(struct roots_seat *seat,  		struct wlr_input_device *device); -void roots_seat_remove_device(struct roots_seat *seat, -		struct wlr_input_device *device); -  void roots_seat_configure_cursor(struct roots_seat *seat);  void roots_seat_configure_xcursor(struct roots_seat *seat); diff --git a/include/wlr/types/wlr_data_device.h b/include/wlr/types/wlr_data_device.h index 80d4bc8b..4de4d610 100644 --- a/include/wlr/types/wlr_data_device.h +++ b/include/wlr/types/wlr_data_device.h @@ -88,12 +88,15 @@ struct wlr_drag_icon {  	int32_t sx, sy;  	struct { -		struct wl_signal map; // emitted when mapped or unmapped +		struct wl_signal map; +		struct wl_signal unmap;  		struct wl_signal destroy;  	} events;  	struct wl_listener surface_destroy;  	struct wl_listener seat_client_destroy; + +	void *data;  };  struct wlr_drag { diff --git a/include/wlr/types/wlr_seat.h b/include/wlr/types/wlr_seat.h index f4840c89..5e04003d 100644 --- a/include/wlr/types/wlr_seat.h +++ b/include/wlr/types/wlr_seat.h @@ -13,11 +13,11 @@   * managed by wlr_seat; some may be NULL.   */  struct wlr_seat_client { -	struct wl_resource *wl_resource;  	struct wl_client *client;  	struct wlr_seat *seat;  	// lists of wl_resource +	struct wl_list wl_resources;  	struct wl_list pointers;  	struct wl_list keyboards;  	struct wl_list touches; diff --git a/include/wlr/types/wlr_surface.h b/include/wlr/types/wlr_surface.h index 0fa7e9c2..526e4e2c 100644 --- a/include/wlr/types/wlr_surface.h +++ b/include/wlr/types/wlr_surface.h @@ -62,6 +62,8 @@ struct wlr_subsurface {  	struct {  		struct wl_signal destroy;  	} events; + +	void *data;  };  struct wlr_surface { diff --git a/include/wlr/types/wlr_xdg_shell.h b/include/wlr/types/wlr_xdg_shell.h index 6a967bc7..01dc17fe 100644 --- a/include/wlr/types/wlr_xdg_shell.h +++ b/include/wlr/types/wlr_xdg_shell.h @@ -118,6 +118,7 @@ struct wlr_xdg_toplevel {  		struct wl_signal request_move;  		struct wl_signal request_resize;  		struct wl_signal request_show_window_menu; +		struct wl_signal set_parent;  	} events;  }; diff --git a/include/wlr/types/wlr_xdg_shell_v6.h b/include/wlr/types/wlr_xdg_shell_v6.h index 07c831ce..5f98eb13 100644 --- a/include/wlr/types/wlr_xdg_shell_v6.h +++ b/include/wlr/types/wlr_xdg_shell_v6.h @@ -126,6 +126,7 @@ struct wlr_xdg_toplevel_v6 {  		struct wl_signal request_move;  		struct wl_signal request_resize;  		struct wl_signal request_show_window_menu; +		struct wl_signal set_parent;  	} events;  }; diff --git a/rootston/seat.c b/rootston/seat.c index b137ff11..91561567 100644 --- a/rootston/seat.c +++ b/rootston/seat.c @@ -260,7 +260,7 @@ static void roots_drag_icon_handle_surface_commit(struct wl_listener *listener,  		void *data) {  	struct roots_drag_icon *icon =  		wl_container_of(listener, icon, surface_commit); -	roots_drag_icon_damage_whole(icon); +	roots_drag_icon_update_position(icon);  }  static void roots_drag_icon_handle_map(struct wl_listener *listener, @@ -270,6 +270,13 @@ static void roots_drag_icon_handle_map(struct wl_listener *listener,  	roots_drag_icon_damage_whole(icon);  } +static void roots_drag_icon_handle_unmap(struct wl_listener *listener, +		void *data) { +	struct roots_drag_icon *icon = +		wl_container_of(listener, icon, unmap); +	roots_drag_icon_damage_whole(icon); +} +  static void roots_drag_icon_handle_destroy(struct wl_listener *listener,  		void *data) {  	struct roots_drag_icon *icon = @@ -278,7 +285,7 @@ static void roots_drag_icon_handle_destroy(struct wl_listener *listener,  	wl_list_remove(&icon->link);  	wl_list_remove(&icon->surface_commit.link); -	wl_list_remove(&icon->map.link); +	wl_list_remove(&icon->unmap.link);  	wl_list_remove(&icon->destroy.link);  	free(icon);  } @@ -297,12 +304,16 @@ static void roots_seat_handle_new_drag_icon(struct wl_listener *listener,  	icon->surface_commit.notify = roots_drag_icon_handle_surface_commit;  	wl_signal_add(&wlr_drag_icon->surface->events.commit, &icon->surface_commit); +	icon->unmap.notify = roots_drag_icon_handle_unmap; +	wl_signal_add(&wlr_drag_icon->events.unmap, &icon->unmap);  	icon->map.notify = roots_drag_icon_handle_map;  	wl_signal_add(&wlr_drag_icon->events.map, &icon->map);  	icon->destroy.notify = roots_drag_icon_handle_destroy;  	wl_signal_add(&wlr_drag_icon->events.destroy, &icon->destroy);  	wl_list_insert(&seat->drag_icons, &icon->link); + +	roots_drag_icon_update_position(icon);  }  void roots_drag_icon_update_position(struct roots_drag_icon *icon) { diff --git a/types/data_device/wlr_drag.c b/types/data_device/wlr_drag.c index 331fba2f..4f0b2521 100644 --- a/types/data_device/wlr_drag.c +++ b/types/data_device/wlr_drag.c @@ -44,7 +44,7 @@ static void drag_set_focus(struct wlr_drag *drag,  	if (!drag->source &&  			wl_resource_get_client(surface->resource) != -			wl_resource_get_client(drag->seat_client->wl_resource)) { +			drag->seat_client->client) {  		return;  	} @@ -98,6 +98,16 @@ static void drag_set_focus(struct wlr_drag *drag,  	wlr_signal_emit_safe(&drag->events.focus, drag);  } +static void drag_icon_set_mapped(struct wlr_drag_icon *icon, bool mapped) { +	if (mapped && !icon->mapped) { +		icon->mapped = true; +		wlr_signal_emit_safe(&icon->events.map, icon); +	} else if (!mapped && icon->mapped) { +		icon->mapped = false; +		wlr_signal_emit_safe(&icon->events.unmap, icon); +	} +} +  static void drag_end(struct wlr_drag *drag) {  	if (!drag->cancelling) {  		drag->cancelling = true; @@ -115,9 +125,8 @@ static void drag_end(struct wlr_drag *drag) {  		drag_set_focus(drag, NULL, 0, 0);  		if (drag->icon) { -			drag->icon->mapped = false;  			wl_list_remove(&drag->icon_destroy.link); -			wlr_signal_emit_safe(&drag->icon->events.map, drag->icon); +			drag_icon_set_mapped(drag->icon, false);  		}  		wlr_signal_emit_safe(&drag->events.destroy, drag); @@ -310,9 +319,10 @@ static void drag_handle_drag_source_destroy(struct wl_listener *listener,  static void drag_icon_destroy(struct wlr_drag_icon *icon) { -	if (!icon) { +	if (icon == NULL) {  		return;  	} +	drag_icon_set_mapped(icon, false);  	wlr_signal_emit_safe(&icon->events.destroy, icon);  	wlr_surface_set_role_committed(icon->surface, NULL, NULL);  	wl_list_remove(&icon->surface_destroy.link); @@ -333,6 +343,8 @@ static void drag_icon_handle_surface_commit(struct wlr_surface *surface,  	struct wlr_drag_icon *icon = role_data;  	icon->sx += icon->surface->current->sx;  	icon->sy += icon->surface->current->sy; + +	drag_icon_set_mapped(icon, wlr_surface_has_buffer(surface));  }  static void drag_icon_handle_seat_client_destroy(struct wl_listener *listener, @@ -355,9 +367,9 @@ static struct wlr_drag_icon *drag_icon_create(  	icon->client = client;  	icon->is_pointer = is_pointer;  	icon->touch_id = touch_id; -	icon->mapped = true;  	wl_signal_init(&icon->events.map); +	wl_signal_init(&icon->events.unmap);  	wl_signal_init(&icon->events.destroy);  	wl_signal_add(&icon->surface->events.destroy, &icon->surface_destroy); @@ -372,6 +384,10 @@ static struct wlr_drag_icon *drag_icon_create(  	wl_list_insert(&client->seat->drag_icons, &icon->link);  	wlr_signal_emit_safe(&client->seat->events.new_drag_icon, icon); +	if (wlr_surface_has_buffer(icon_surface)) { +		drag_icon_set_mapped(icon, true); +	} +  	return icon;  } diff --git a/types/seat/wlr_seat.c b/types/seat/wlr_seat.c index 4a680157..ead4b0e7 100644 --- a/types/seat/wlr_seat.c +++ b/types/seat/wlr_seat.c @@ -60,6 +60,12 @@ static void seat_client_handle_resource_destroy(  		struct wl_resource *seat_resource) {  	struct wlr_seat_client *client =  		wlr_seat_client_from_resource(seat_resource); + +	wl_list_remove(wl_resource_get_link(seat_resource)); +	if (!wl_list_empty(&client->wl_resources)) { +		return; +	} +  	wlr_signal_emit_safe(&client->events.destroy, client);  	if (client == client->seat->pointer_state.focused_client) { @@ -108,34 +114,43 @@ static void seat_handle_bind(struct wl_client *client, void *_wlr_seat,  	struct wlr_seat *wlr_seat = _wlr_seat;  	assert(client && wlr_seat); -	struct wlr_seat_client *seat_client = -		calloc(1, sizeof(struct wlr_seat_client)); -	if (seat_client == NULL) { -		wl_client_post_no_memory(client); -		return; -	} -	seat_client->wl_resource = +	struct wl_resource *wl_resource =  		wl_resource_create(client, &wl_seat_interface, version, id); -	if (seat_client->wl_resource == NULL) { -		free(seat_client); +	if (wl_resource == NULL) {  		wl_client_post_no_memory(client);  		return;  	} -	seat_client->client = client; -	seat_client->seat = wlr_seat; -	wl_list_init(&seat_client->pointers); -	wl_list_init(&seat_client->keyboards); -	wl_list_init(&seat_client->touches); -	wl_list_init(&seat_client->data_devices); -	wl_list_init(&seat_client->primary_selection_devices); -	wl_resource_set_implementation(seat_client->wl_resource, &seat_impl, + +	struct wlr_seat_client *seat_client = +		wlr_seat_client_for_wl_client(wlr_seat, client); +	if (seat_client == NULL) { +		seat_client = calloc(1, sizeof(struct wlr_seat_client)); +		if (seat_client == NULL) { +			wl_resource_destroy(wl_resource); +			wl_client_post_no_memory(client); +			return; +		} + +		seat_client->client = client; +		seat_client->seat = wlr_seat; +		wl_list_init(&seat_client->wl_resources); +		wl_list_init(&seat_client->pointers); +		wl_list_init(&seat_client->keyboards); +		wl_list_init(&seat_client->touches); +		wl_list_init(&seat_client->data_devices); +		wl_list_init(&seat_client->primary_selection_devices); +		wl_signal_init(&seat_client->events.destroy); + +		wl_list_insert(&wlr_seat->clients, &seat_client->link); +	} + +	wl_resource_set_implementation(wl_resource, &seat_impl,  		seat_client, seat_client_handle_resource_destroy); -	wl_list_insert(&wlr_seat->clients, &seat_client->link); +	wl_list_insert(&seat_client->wl_resources, wl_resource_get_link(wl_resource));  	if (version >= WL_SEAT_NAME_SINCE_VERSION) { -		wl_seat_send_name(seat_client->wl_resource, wlr_seat->name); +		wl_seat_send_name(wl_resource, wlr_seat->name);  	} -	wl_seat_send_capabilities(seat_client->wl_resource, wlr_seat->capabilities); -	wl_signal_init(&seat_client->events.destroy); +	wl_seat_send_capabilities(wl_resource, wlr_seat->capabilities);  }  void wlr_seat_destroy(struct wlr_seat *seat) { @@ -160,8 +175,11 @@ void wlr_seat_destroy(struct wlr_seat *seat) {  	struct wlr_seat_client *client, *tmp;  	wl_list_for_each_safe(client, tmp, &seat->clients, link) { -		// will destroy other resources as well -		wl_resource_destroy(client->wl_resource); +		struct wl_resource *resource, *next_resource; +		wl_resource_for_each_safe(resource, next_resource, &client->wl_resources) { +			// will destroy other resources as well +			wl_resource_destroy(resource); +		}  	}  	wl_global_destroy(seat->wl_global); @@ -308,7 +326,10 @@ void wlr_seat_set_capabilities(struct wlr_seat *wlr_seat,  			}  		} -		wl_seat_send_capabilities(client->wl_resource, capabilities); +		struct wl_resource *resource; +		wl_resource_for_each(resource, &client->wl_resources) { +			wl_seat_send_capabilities(resource, capabilities); +		}  	}  } @@ -317,7 +338,10 @@ void wlr_seat_set_name(struct wlr_seat *wlr_seat, const char *name) {  	wlr_seat->name = strdup(name);  	struct wlr_seat_client *client;  	wl_list_for_each(client, &wlr_seat->clients, link) { -		wl_seat_send_name(client->wl_resource, name); +		struct wl_resource *resource; +		wl_resource_for_each(resource, &client->wl_resources) { +			wl_seat_send_name(resource, name); +		}  	}  } diff --git a/types/wlr_box.c b/types/wlr_box.c index c92b0aa4..ada6a733 100644 --- a/types/wlr_box.c +++ b/types/wlr_box.c @@ -11,8 +11,8 @@ void wlr_box_closest_point(const struct wlr_box *box, double x, double y,  	// find the closest x point  	if (x < box->x) {  		*dest_x = box->x; -	} else if (x > box->x + box->width) { -		*dest_x = box->x + box->width; +	} else if (x >= box->x + box->width) { +		*dest_x = box->x + box->width - 1;  	} else {  		*dest_x = x;  	} @@ -20,8 +20,8 @@ void wlr_box_closest_point(const struct wlr_box *box, double x, double y,  	// find closest y point  	if (y < box->y) {  		*dest_y = box->y; -	} else if (y > box->y + box->height) { -		*dest_y = box->y + box->height; +	} else if (y >= box->y + box->height) { +		*dest_y = box->y + box->height - 1;  	} else {  		*dest_y = y;  	} diff --git a/types/wlr_linux_dmabuf.c b/types/wlr_linux_dmabuf.c index 6e716986..3b4fc78b 100644 --- a/types/wlr_linux_dmabuf.c +++ b/types/wlr_linux_dmabuf.c @@ -101,7 +101,8 @@ static void params_add(struct wl_client *client,  	if (buffer->has_modifier && modifier != buffer->attributes.modifier) {  		wl_resource_post_error(params_resource,  			ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INVALID_FORMAT, -			"sent modifier %lu for plane %u, expected modifier %lu like other planes", +			"sent modifier %" PRIu64 " for plane %u, expected" +			" modifier %" PRIu64 " like other planes",  			modifier, plane_idx, buffer->attributes.modifier);  		close(fd);  		return; diff --git a/types/wlr_surface.c b/types/wlr_surface.c index 22026af8..9c3eb86d 100644 --- a/types/wlr_surface.c +++ b/types/wlr_surface.c @@ -805,7 +805,7 @@ static void subsurface_handle_place_above(struct wl_client *client,  	}  	wl_list_remove(&subsurface->parent_pending_link); -	wl_list_insert(sibling->parent_pending_link.prev, +	wl_list_insert(&sibling->parent_pending_link,  		&subsurface->parent_pending_link);  	subsurface->reordered = true; @@ -832,7 +832,7 @@ static void subsurface_handle_place_below(struct wl_client *client,  	}  	wl_list_remove(&subsurface->parent_pending_link); -	wl_list_insert(&sibling->parent_pending_link, +	wl_list_insert(sibling->parent_pending_link.prev,  		&subsurface->parent_pending_link);  	subsurface->reordered = true; @@ -933,8 +933,8 @@ struct wlr_subsurface *wlr_subsurface_create(struct wlr_surface *surface,  	subsurface->parent = parent;  	wl_signal_add(&parent->events.destroy, &subsurface->parent_destroy);  	subsurface->parent_destroy.notify = subsurface_handle_parent_destroy; -	wl_list_insert(&parent->subsurfaces, &subsurface->parent_link); -	wl_list_insert(&parent->subsurface_pending_list, +	wl_list_insert(parent->subsurfaces.prev, &subsurface->parent_link); +	wl_list_insert(parent->subsurface_pending_list.prev,  		&subsurface->parent_pending_link);  	surface->role_data = subsurface; @@ -956,7 +956,7 @@ struct wlr_surface *wlr_surface_get_root_surface(struct wlr_surface *surface) {  	while (wlr_surface_is_subsurface(surface)) {  		struct wlr_subsurface *subsurface =  			wlr_subsurface_from_surface(surface); -		surface = subsurface->surface; +		surface = subsurface->parent;  	}  	return surface;  } @@ -971,7 +971,7 @@ bool wlr_surface_point_accepts_input(struct wlr_surface *surface,  struct wlr_surface *wlr_surface_surface_at(struct wlr_surface *surface,  		double sx, double sy, double *sub_x, double *sub_y) {  	struct wlr_subsurface *subsurface; -	wl_list_for_each(subsurface, &surface->subsurfaces, parent_link) { +	wl_list_for_each_reverse(subsurface, &surface->subsurfaces, parent_link) {  		double _sub_x = subsurface->surface->current->subsurface_position.x;  		double _sub_y = subsurface->surface->current->subsurface_position.y;  		struct wlr_surface *sub = wlr_surface_surface_at(subsurface->surface, diff --git a/types/xdg_shell/wlr_xdg_popup.c b/types/xdg_shell/wlr_xdg_popup.c index 9c8b6eb2..e7204def 100644 --- a/types/xdg_shell/wlr_xdg_popup.c +++ b/types/xdg_shell/wlr_xdg_popup.c @@ -416,7 +416,7 @@ static bool xdg_popup_unconstrain_slide(struct wlr_xdg_popup *popup,  		(popup->positioner.constraint_adjustment &  		 XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_X); -	bool slide_y = offset_x && +	bool slide_y = offset_y &&  		(popup->positioner.constraint_adjustment &  		 XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_Y); @@ -459,7 +459,7 @@ static bool xdg_popup_unconstrain_resize(struct wlr_xdg_popup *popup,  		(popup->positioner.constraint_adjustment &  		 XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_X); -	bool resize_y = offset_x && +	bool resize_y = offset_y &&  		(popup->positioner.constraint_adjustment &  		 XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_Y); @@ -471,7 +471,7 @@ static bool xdg_popup_unconstrain_resize(struct wlr_xdg_popup *popup,  	}  	xdg_popup_box_constraints(popup, toplevel_sx_box, -		&offset_y, &offset_y); +		&offset_x, &offset_y);  	return !offset_x && !offset_y;  } diff --git a/types/xdg_shell/wlr_xdg_positioner.c b/types/xdg_shell/wlr_xdg_positioner.c index 0213c572..6f902f92 100644 --- a/types/xdg_shell/wlr_xdg_positioner.c +++ b/types/xdg_shell/wlr_xdg_positioner.c @@ -256,6 +256,8 @@ static enum xdg_positioner_anchor positioner_anchor_invert_x(  		return XDG_POSITIONER_ANCHOR_LEFT;  	case XDG_POSITIONER_ANCHOR_TOP_LEFT:  		return XDG_POSITIONER_ANCHOR_TOP_RIGHT; +	case XDG_POSITIONER_ANCHOR_TOP_RIGHT: +		return XDG_POSITIONER_ANCHOR_TOP_LEFT;  	case XDG_POSITIONER_ANCHOR_BOTTOM_LEFT:  		return XDG_POSITIONER_ANCHOR_BOTTOM_RIGHT;  	case XDG_POSITIONER_ANCHOR_BOTTOM_RIGHT: diff --git a/types/xdg_shell/wlr_xdg_toplevel.c b/types/xdg_shell/wlr_xdg_toplevel.c index 5968c835..fa0ec929 100644 --- a/types/xdg_shell/wlr_xdg_toplevel.c +++ b/types/xdg_shell/wlr_xdg_toplevel.c @@ -218,6 +218,7 @@ static void xdg_toplevel_handle_set_parent(struct wl_client *client,  	}  	surface->toplevel->parent = parent; +	wlr_signal_emit_safe(&surface->toplevel->events.set_parent, surface);  }  static void xdg_toplevel_handle_set_title(struct wl_client *client, @@ -464,6 +465,7 @@ void create_xdg_toplevel(struct wlr_xdg_surface *xdg_surface,  	wl_signal_init(&xdg_surface->toplevel->events.request_move);  	wl_signal_init(&xdg_surface->toplevel->events.request_resize);  	wl_signal_init(&xdg_surface->toplevel->events.request_show_window_menu); +	wl_signal_init(&xdg_surface->toplevel->events.set_parent);  	xdg_surface->role = WLR_XDG_SURFACE_ROLE_TOPLEVEL;  	xdg_surface->toplevel->base = xdg_surface; diff --git a/types/xdg_shell_v6/wlr_xdg_popup_v6.c b/types/xdg_shell_v6/wlr_xdg_popup_v6.c index a75201d0..ff66e812 100644 --- a/types/xdg_shell_v6/wlr_xdg_popup_v6.c +++ b/types/xdg_shell_v6/wlr_xdg_popup_v6.c @@ -443,7 +443,7 @@ static bool xdg_popup_v6_unconstrain_slide(struct wlr_xdg_popup_v6 *popup,  		(popup->positioner.constraint_adjustment &  		 ZXDG_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_SLIDE_X); -	bool slide_y = offset_x && +	bool slide_y = offset_y &&  		(popup->positioner.constraint_adjustment &  		 ZXDG_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_SLIDE_Y); @@ -486,7 +486,7 @@ static bool xdg_popup_v6_unconstrain_resize(struct wlr_xdg_popup_v6 *popup,  		(popup->positioner.constraint_adjustment &  		 ZXDG_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_RESIZE_X); -	bool resize_y = offset_x && +	bool resize_y = offset_y &&  		(popup->positioner.constraint_adjustment &  		 ZXDG_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_RESIZE_Y); @@ -498,7 +498,7 @@ static bool xdg_popup_v6_unconstrain_resize(struct wlr_xdg_popup_v6 *popup,  	}  	xdg_popup_v6_box_constraints(popup, toplevel_sx_box, -		&offset_y, &offset_y); +		&offset_x, &offset_y);  	return !offset_x && !offset_y;  } diff --git a/types/xdg_shell_v6/wlr_xdg_toplevel_v6.c b/types/xdg_shell_v6/wlr_xdg_toplevel_v6.c index 2bcfaf0d..0f9a26d3 100644 --- a/types/xdg_shell_v6/wlr_xdg_toplevel_v6.c +++ b/types/xdg_shell_v6/wlr_xdg_toplevel_v6.c @@ -42,6 +42,7 @@ static void xdg_toplevel_handle_set_parent(struct wl_client *client,  	}  	surface->toplevel->parent = parent; +	wlr_signal_emit_safe(&surface->toplevel->events.set_parent, surface);  }  static void xdg_toplevel_handle_set_title(struct wl_client *client, @@ -434,6 +435,7 @@ void create_xdg_toplevel_v6(struct wlr_xdg_surface_v6 *xdg_surface,  	wl_signal_init(&xdg_surface->toplevel->events.request_move);  	wl_signal_init(&xdg_surface->toplevel->events.request_resize);  	wl_signal_init(&xdg_surface->toplevel->events.request_show_window_menu); +	wl_signal_init(&xdg_surface->toplevel->events.set_parent);  	xdg_surface->role = WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL;  	xdg_surface->toplevel->base = xdg_surface;  | 
