don't send configure events to uninitialized xdg-popups
This commit is contained in:
		
							
								
								
									
										45
									
								
								dwl.c
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								dwl.c
									
									
									
									
									
								
							@@ -245,6 +245,7 @@ static void cleanupmon(struct wl_listener *listener, void *data);
 | 
				
			|||||||
static void closemon(Monitor *m);
 | 
					static void closemon(Monitor *m);
 | 
				
			||||||
static void commitlayersurfacenotify(struct wl_listener *listener, void *data);
 | 
					static void commitlayersurfacenotify(struct wl_listener *listener, void *data);
 | 
				
			||||||
static void commitnotify(struct wl_listener *listener, void *data);
 | 
					static void commitnotify(struct wl_listener *listener, void *data);
 | 
				
			||||||
 | 
					static void commitpopup(struct wl_listener *listener, void *data);
 | 
				
			||||||
static void createdecoration(struct wl_listener *listener, void *data);
 | 
					static void createdecoration(struct wl_listener *listener, void *data);
 | 
				
			||||||
static void createidleinhibitor(struct wl_listener *listener, void *data);
 | 
					static void createidleinhibitor(struct wl_listener *listener, void *data);
 | 
				
			||||||
static void createkeyboard(struct wlr_keyboard *keyboard);
 | 
					static void createkeyboard(struct wlr_keyboard *keyboard);
 | 
				
			||||||
@@ -753,6 +754,33 @@ commitnotify(struct wl_listener *listener, void *data)
 | 
				
			|||||||
		c->resize = 0;
 | 
							c->resize = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					commitpopup(struct wl_listener *listener, void *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct wlr_surface *surface = data;
 | 
				
			||||||
 | 
						struct wlr_xdg_popup *popup = wlr_xdg_popup_try_from_wlr_surface(surface);
 | 
				
			||||||
 | 
						LayerSurface *l = NULL;
 | 
				
			||||||
 | 
						Client *c = NULL;
 | 
				
			||||||
 | 
						struct wlr_box box;
 | 
				
			||||||
 | 
						int type = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!popup->base->initial_commit)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type = toplevel_from_wlr_surface(popup->base->surface, &c, &l);
 | 
				
			||||||
 | 
						if (!popup->parent || type < 0)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						popup->base->surface->data = wlr_scene_xdg_surface_create(
 | 
				
			||||||
 | 
								popup->parent->data, popup->base);
 | 
				
			||||||
 | 
						if ((l && !l->mon) || (c && !c->mon))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						box = type == LayerShell ? l->mon->m : c->mon->w;
 | 
				
			||||||
 | 
						box.x -= (type == LayerShell ? l->geom.x : c->geom.x);
 | 
				
			||||||
 | 
						box.y -= (type == LayerShell ? l->geom.y : c->geom.y);
 | 
				
			||||||
 | 
						wlr_xdg_popup_unconstrain_from_box(popup, &box);
 | 
				
			||||||
 | 
						wl_list_remove(&listener->link);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
createdecoration(struct wl_listener *listener, void *data)
 | 
					createdecoration(struct wl_listener *listener, void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -989,22 +1017,7 @@ createpopup(struct wl_listener *listener, void *data)
 | 
				
			|||||||
	/* This event is raised when a client (either xdg-shell or layer-shell)
 | 
						/* This event is raised when a client (either xdg-shell or layer-shell)
 | 
				
			||||||
	 * creates a new popup. */
 | 
						 * creates a new popup. */
 | 
				
			||||||
	struct wlr_xdg_popup *popup = data;
 | 
						struct wlr_xdg_popup *popup = data;
 | 
				
			||||||
	LayerSurface *l = NULL;
 | 
						LISTEN_STATIC(&popup->base->surface->events.commit, commitpopup);
 | 
				
			||||||
	Client *c = NULL;
 | 
					 | 
				
			||||||
	struct wlr_box box;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	int type = toplevel_from_wlr_surface(popup->base->surface, &c, &l);
 | 
					 | 
				
			||||||
	if (!popup->parent || type < 0)
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	popup->base->surface->data = wlr_scene_xdg_surface_create(
 | 
					 | 
				
			||||||
			popup->parent->data, popup->base);
 | 
					 | 
				
			||||||
	if ((l && !l->mon) || (c && !c->mon))
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	box = type == LayerShell ? l->mon->m : c->mon->w;
 | 
					 | 
				
			||||||
	box.x -= (type == LayerShell ? l->geom.x : c->geom.x);
 | 
					 | 
				
			||||||
	box.y -= (type == LayerShell ? l->geom.y : c->geom.y);
 | 
					 | 
				
			||||||
	/* FIXME: this send a configure event to a uninitialized wlr_xdg_surface */
 | 
					 | 
				
			||||||
	wlr_xdg_popup_unconstrain_from_box(popup, &box);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user