mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-24 13:45:58 +01:00
xdg-shell: use unified map logic
This commit is contained in:
parent
c590bb600f
commit
b0437fc416
10 changed files with 28 additions and 60 deletions
|
@ -14,8 +14,7 @@ struct wlr_xdg_surface *create_xdg_surface(
|
||||||
void destroy_xdg_surface(struct wlr_xdg_surface *surface);
|
void destroy_xdg_surface(struct wlr_xdg_surface *surface);
|
||||||
void destroy_xdg_surface_role_object(struct wlr_xdg_surface *surface);
|
void destroy_xdg_surface_role_object(struct wlr_xdg_surface *surface);
|
||||||
void xdg_surface_role_commit(struct wlr_surface *wlr_surface);
|
void xdg_surface_role_commit(struct wlr_surface *wlr_surface);
|
||||||
void xdg_surface_role_precommit(struct wlr_surface *wlr_surface,
|
void xdg_surface_role_unmap(struct wlr_surface *wlr_surface);
|
||||||
const struct wlr_surface_state *state);
|
|
||||||
void xdg_surface_role_destroy(struct wlr_surface *wlr_surface);
|
void xdg_surface_role_destroy(struct wlr_surface *wlr_surface);
|
||||||
|
|
||||||
void create_xdg_positioner(struct wlr_xdg_client *client, uint32_t id);
|
void create_xdg_positioner(struct wlr_xdg_client *client, uint32_t id);
|
||||||
|
|
|
@ -251,7 +251,7 @@ struct wlr_xdg_surface {
|
||||||
|
|
||||||
struct wl_list popups; // wlr_xdg_popup.link
|
struct wl_list popups; // wlr_xdg_popup.link
|
||||||
|
|
||||||
bool added, configured, mapped;
|
bool added, configured;
|
||||||
struct wl_event_source *configure_idle;
|
struct wl_event_source *configure_idle;
|
||||||
uint32_t scheduled_serial;
|
uint32_t scheduled_serial;
|
||||||
struct wl_list configure_list;
|
struct wl_list configure_list;
|
||||||
|
@ -264,22 +264,6 @@ struct wlr_xdg_surface {
|
||||||
struct wl_signal destroy;
|
struct wl_signal destroy;
|
||||||
struct wl_signal ping_timeout;
|
struct wl_signal ping_timeout;
|
||||||
struct wl_signal new_popup;
|
struct wl_signal new_popup;
|
||||||
/**
|
|
||||||
* The `map` event signals that the shell surface is ready to be
|
|
||||||
* managed by the compositor and rendered on the screen. At this point,
|
|
||||||
* the surface has configured its properties, has had the opportunity
|
|
||||||
* to bind to the seat to receive input events, and has a buffer that
|
|
||||||
* is ready to be rendered. You can now safely add this surface to a
|
|
||||||
* list of views.
|
|
||||||
*/
|
|
||||||
struct wl_signal map;
|
|
||||||
/**
|
|
||||||
* The `unmap` event signals that the surface is no longer in a state
|
|
||||||
* where it should be shown on the screen. This might happen if the
|
|
||||||
* surface no longer has a displayable buffer because either the
|
|
||||||
* surface has been hidden or is about to be destroyed.
|
|
||||||
*/
|
|
||||||
struct wl_signal unmap;
|
|
||||||
|
|
||||||
// for protocol extensions
|
// for protocol extensions
|
||||||
struct wl_signal configure; // struct wlr_xdg_surface_configure
|
struct wl_signal configure; // struct wlr_xdg_surface_configure
|
||||||
|
|
|
@ -795,9 +795,9 @@ static void server_new_xdg_surface(struct wl_listener *listener, void *data) {
|
||||||
|
|
||||||
/* Listen to the various events it can emit */
|
/* Listen to the various events it can emit */
|
||||||
view->map.notify = xdg_toplevel_map;
|
view->map.notify = xdg_toplevel_map;
|
||||||
wl_signal_add(&xdg_surface->events.map, &view->map);
|
wl_signal_add(&xdg_surface->surface->events.map, &view->map);
|
||||||
view->unmap.notify = xdg_toplevel_unmap;
|
view->unmap.notify = xdg_toplevel_unmap;
|
||||||
wl_signal_add(&xdg_surface->events.unmap, &view->unmap);
|
wl_signal_add(&xdg_surface->surface->events.unmap, &view->unmap);
|
||||||
view->destroy.notify = xdg_toplevel_destroy;
|
view->destroy.notify = xdg_toplevel_destroy;
|
||||||
wl_signal_add(&xdg_surface->events.destroy, &view->destroy);
|
wl_signal_add(&xdg_surface->events.destroy, &view->destroy);
|
||||||
|
|
||||||
|
|
|
@ -106,18 +106,21 @@ struct wlr_scene_tree *wlr_scene_xdg_surface_create(
|
||||||
|
|
||||||
scene_xdg_surface->xdg_surface_map.notify =
|
scene_xdg_surface->xdg_surface_map.notify =
|
||||||
scene_xdg_surface_handle_xdg_surface_map;
|
scene_xdg_surface_handle_xdg_surface_map;
|
||||||
wl_signal_add(&xdg_surface->events.map, &scene_xdg_surface->xdg_surface_map);
|
wl_signal_add(&xdg_surface->surface->events.map,
|
||||||
|
&scene_xdg_surface->xdg_surface_map);
|
||||||
|
|
||||||
scene_xdg_surface->xdg_surface_unmap.notify =
|
scene_xdg_surface->xdg_surface_unmap.notify =
|
||||||
scene_xdg_surface_handle_xdg_surface_unmap;
|
scene_xdg_surface_handle_xdg_surface_unmap;
|
||||||
wl_signal_add(&xdg_surface->events.unmap, &scene_xdg_surface->xdg_surface_unmap);
|
wl_signal_add(&xdg_surface->surface->events.unmap,
|
||||||
|
&scene_xdg_surface->xdg_surface_unmap);
|
||||||
|
|
||||||
scene_xdg_surface->xdg_surface_commit.notify =
|
scene_xdg_surface->xdg_surface_commit.notify =
|
||||||
scene_xdg_surface_handle_xdg_surface_commit;
|
scene_xdg_surface_handle_xdg_surface_commit;
|
||||||
wl_signal_add(&xdg_surface->surface->events.commit,
|
wl_signal_add(&xdg_surface->surface->events.commit,
|
||||||
&scene_xdg_surface->xdg_surface_commit);
|
&scene_xdg_surface->xdg_surface_commit);
|
||||||
|
|
||||||
wlr_scene_node_set_enabled(&scene_xdg_surface->tree->node, xdg_surface->mapped);
|
wlr_scene_node_set_enabled(&scene_xdg_surface->tree->node,
|
||||||
|
xdg_surface->surface->mapped);
|
||||||
scene_xdg_surface_update_position(scene_xdg_surface);
|
scene_xdg_surface_update_position(scene_xdg_surface);
|
||||||
|
|
||||||
return scene_xdg_surface->tree;
|
return scene_xdg_surface->tree;
|
||||||
|
|
|
@ -547,7 +547,7 @@ void wlr_layer_surface_v1_for_each_popup_surface(struct wlr_layer_surface_v1 *su
|
||||||
wlr_surface_iterator_func_t iterator, void *user_data) {
|
wlr_surface_iterator_func_t iterator, void *user_data) {
|
||||||
struct wlr_xdg_popup *popup;
|
struct wlr_xdg_popup *popup;
|
||||||
wl_list_for_each(popup, &surface->popups, link) {
|
wl_list_for_each(popup, &surface->popups, link) {
|
||||||
if (!popup->base->configured || !popup->base->mapped) {
|
if (!popup->base->surface->mapped) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -582,7 +582,7 @@ struct wlr_surface *wlr_layer_surface_v1_popup_surface_at(
|
||||||
double *sub_x, double *sub_y) {
|
double *sub_x, double *sub_y) {
|
||||||
struct wlr_xdg_popup *popup;
|
struct wlr_xdg_popup *popup;
|
||||||
wl_list_for_each(popup, &surface->popups, link) {
|
wl_list_for_each(popup, &surface->popups, link) {
|
||||||
if (!popup->base->mapped) {
|
if (!popup->base->surface->mapped) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ static void xdg_imported_handle_set_parent_of(struct wl_client *client,
|
||||||
struct wlr_xdg_surface *surface =
|
struct wlr_xdg_surface *surface =
|
||||||
wlr_xdg_surface_try_from_wlr_surface(wlr_surface);
|
wlr_xdg_surface_try_from_wlr_surface(wlr_surface);
|
||||||
|
|
||||||
if (!surface->mapped) {
|
if (!surface->surface->mapped) {
|
||||||
wlr_xdg_toplevel_set_parent(child_toplevel, NULL);
|
wlr_xdg_toplevel_set_parent(child_toplevel, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ static void xdg_imported_handle_set_parent_of(struct wl_client *client,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!surface->mapped) {
|
if (!surface->surface->mapped) {
|
||||||
wlr_xdg_toplevel_set_parent(child_toplevel, NULL);
|
wlr_xdg_toplevel_set_parent(child_toplevel, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -360,7 +360,7 @@ static void xdg_popup_handle_resource_destroy(struct wl_resource *resource) {
|
||||||
const struct wlr_surface_role xdg_popup_surface_role = {
|
const struct wlr_surface_role xdg_popup_surface_role = {
|
||||||
.name = "xdg_popup",
|
.name = "xdg_popup",
|
||||||
.commit = xdg_surface_role_commit,
|
.commit = xdg_surface_role_commit,
|
||||||
.precommit = xdg_surface_role_precommit,
|
.unmap = xdg_surface_role_unmap,
|
||||||
.destroy = xdg_surface_role_destroy,
|
.destroy = xdg_surface_role_destroy,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -54,15 +54,6 @@ static void reset_xdg_surface(struct wlr_xdg_surface *surface) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unmap_xdg_surface(struct wlr_xdg_surface *surface) {
|
|
||||||
surface->mapped = false;
|
|
||||||
|
|
||||||
// TODO: probably need to ungrab before this event
|
|
||||||
wl_signal_emit_mutable(&surface->events.unmap, NULL);
|
|
||||||
|
|
||||||
reset_xdg_surface(surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void xdg_surface_handle_ack_configure(struct wl_client *client,
|
static void xdg_surface_handle_ack_configure(struct wl_client *client,
|
||||||
struct wl_resource *resource, uint32_t serial) {
|
struct wl_resource *resource, uint32_t serial) {
|
||||||
struct wlr_xdg_surface *surface = wlr_xdg_surface_from_resource(resource);
|
struct wlr_xdg_surface *surface = wlr_xdg_surface_from_resource(resource);
|
||||||
|
@ -306,24 +297,17 @@ void xdg_surface_role_commit(struct wlr_surface *wlr_surface) {
|
||||||
wl_signal_emit_mutable(&surface->client->shell->events.new_surface,
|
wl_signal_emit_mutable(&surface->client->shell->events.new_surface,
|
||||||
surface);
|
surface);
|
||||||
}
|
}
|
||||||
if (surface->configured && wlr_surface_has_buffer(surface->surface) &&
|
|
||||||
!surface->mapped) {
|
if (surface->configured && wlr_surface_has_buffer(wlr_surface)) {
|
||||||
surface->mapped = true;
|
wlr_surface_map(wlr_surface);
|
||||||
wl_signal_emit_mutable(&surface->events.map, NULL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void xdg_surface_role_precommit(struct wlr_surface *wlr_surface,
|
void xdg_surface_role_unmap(struct wlr_surface *wlr_surface) {
|
||||||
const struct wlr_surface_state *state) {
|
|
||||||
struct wlr_xdg_surface *surface = wlr_xdg_surface_try_from_wlr_surface(wlr_surface);
|
struct wlr_xdg_surface *surface = wlr_xdg_surface_try_from_wlr_surface(wlr_surface);
|
||||||
assert(surface != NULL);
|
assert(surface != NULL);
|
||||||
|
|
||||||
if (state->committed & WLR_SURFACE_STATE_BUFFER && state->buffer == NULL) {
|
reset_xdg_surface(surface);
|
||||||
// This is a NULL commit
|
|
||||||
if (surface->configured && surface->mapped) {
|
|
||||||
unmap_xdg_surface(surface);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void xdg_surface_role_destroy(struct wlr_surface *wlr_surface) {
|
void xdg_surface_role_destroy(struct wlr_surface *wlr_surface) {
|
||||||
|
@ -376,8 +360,6 @@ struct wlr_xdg_surface *create_xdg_surface(
|
||||||
wl_signal_init(&surface->events.destroy);
|
wl_signal_init(&surface->events.destroy);
|
||||||
wl_signal_init(&surface->events.ping_timeout);
|
wl_signal_init(&surface->events.ping_timeout);
|
||||||
wl_signal_init(&surface->events.new_popup);
|
wl_signal_init(&surface->events.new_popup);
|
||||||
wl_signal_init(&surface->events.map);
|
|
||||||
wl_signal_init(&surface->events.unmap);
|
|
||||||
wl_signal_init(&surface->events.configure);
|
wl_signal_init(&surface->events.configure);
|
||||||
wl_signal_init(&surface->events.ack_configure);
|
wl_signal_init(&surface->events.ack_configure);
|
||||||
|
|
||||||
|
@ -396,8 +378,8 @@ struct wlr_xdg_surface *create_xdg_surface(
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroy_xdg_surface_role_object(struct wlr_xdg_surface *surface) {
|
void destroy_xdg_surface_role_object(struct wlr_xdg_surface *surface) {
|
||||||
if (surface->configured && surface->mapped) {
|
if (surface->surface->mapped) {
|
||||||
unmap_xdg_surface(surface);
|
wlr_surface_unmap(surface->surface);
|
||||||
} else {
|
} else {
|
||||||
reset_xdg_surface(surface);
|
reset_xdg_surface(surface);
|
||||||
}
|
}
|
||||||
|
@ -473,7 +455,7 @@ struct wlr_surface *wlr_xdg_surface_popup_surface_at(
|
||||||
double *sub_x, double *sub_y) {
|
double *sub_x, double *sub_y) {
|
||||||
struct wlr_xdg_popup *popup;
|
struct wlr_xdg_popup *popup;
|
||||||
wl_list_for_each(popup, &surface->popups, link) {
|
wl_list_for_each(popup, &surface->popups, link) {
|
||||||
if (!popup->base->mapped) {
|
if (!popup->base->surface->mapped) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,7 +490,7 @@ static void xdg_surface_for_each_popup_surface(struct wlr_xdg_surface *surface,
|
||||||
int x, int y, wlr_surface_iterator_func_t iterator, void *user_data) {
|
int x, int y, wlr_surface_iterator_func_t iterator, void *user_data) {
|
||||||
struct wlr_xdg_popup *popup;
|
struct wlr_xdg_popup *popup;
|
||||||
wl_list_for_each(popup, &surface->popups, link) {
|
wl_list_for_each(popup, &surface->popups, link) {
|
||||||
if (!popup->base->configured || !popup->base->mapped) {
|
if (!popup->base->surface->mapped) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -182,10 +182,10 @@ bool wlr_xdg_toplevel_set_parent(struct wlr_xdg_toplevel *toplevel,
|
||||||
wl_list_remove(&toplevel->parent_unmap.link);
|
wl_list_remove(&toplevel->parent_unmap.link);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parent != NULL && parent->base->mapped) {
|
if (parent != NULL && parent->base->surface->mapped) {
|
||||||
toplevel->parent = parent;
|
toplevel->parent = parent;
|
||||||
toplevel->parent_unmap.notify = handle_parent_unmap;
|
toplevel->parent_unmap.notify = handle_parent_unmap;
|
||||||
wl_signal_add(&toplevel->parent->base->events.unmap,
|
wl_signal_add(&toplevel->parent->base->surface->events.unmap,
|
||||||
&toplevel->parent_unmap);
|
&toplevel->parent_unmap);
|
||||||
} else {
|
} else {
|
||||||
toplevel->parent = NULL;
|
toplevel->parent = NULL;
|
||||||
|
@ -475,7 +475,7 @@ static void xdg_toplevel_handle_resource_destroy(struct wl_resource *resource) {
|
||||||
const struct wlr_surface_role xdg_toplevel_surface_role = {
|
const struct wlr_surface_role xdg_toplevel_surface_role = {
|
||||||
.name = "xdg_toplevel",
|
.name = "xdg_toplevel",
|
||||||
.commit = xdg_surface_role_commit,
|
.commit = xdg_surface_role_commit,
|
||||||
.precommit = xdg_surface_role_precommit,
|
.unmap = xdg_surface_role_unmap,
|
||||||
.destroy = xdg_surface_role_destroy,
|
.destroy = xdg_surface_role_destroy,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue