xdg-shell: rework roles

This commit is contained in:
Kirill Primak 2023-07-26 11:36:24 +03:00 committed by Simon Ser
parent e5300c225e
commit bd5c4f4a4a
6 changed files with 174 additions and 140 deletions

View file

@ -5,16 +5,13 @@
#include <wlr/types/wlr_xdg_shell.h>
#include "xdg-shell-protocol.h"
extern const struct wlr_surface_role xdg_toplevel_surface_role;
extern const struct wlr_surface_role xdg_popup_surface_role;
void create_xdg_surface(struct wlr_xdg_client *client, struct wlr_surface *wlr_surface,
uint32_t id);
void destroy_xdg_surface(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_unmap(struct wlr_surface *wlr_surface);
void xdg_surface_role_destroy(struct wlr_surface *wlr_surface);
bool set_xdg_surface_role(struct wlr_xdg_surface *surface, enum wlr_xdg_surface_role role);
void set_xdg_surface_role_object(struct wlr_xdg_surface *surface,
struct wl_resource *role_resource);
void create_xdg_positioner(struct wlr_xdg_client *client, uint32_t id);

View file

@ -231,8 +231,18 @@ struct wlr_xdg_surface {
struct wl_resource *resource;
struct wlr_surface *surface;
struct wl_list link; // wlr_xdg_client.surfaces
enum wlr_xdg_surface_role role;
/**
* The lifetime-bound role of the xdg_surface. WLR_XDG_SURFACE_ROLE_NONE
* if the role was never set.
*/
enum wlr_xdg_surface_role role;
/**
* The role object representing the role. NULL if the object was destroyed.
*/
struct wl_resource *role_resource;
// NULL if the role resource is inert
union {
struct wlr_xdg_toplevel *toplevel;
struct wlr_xdg_popup *popup;
@ -247,8 +257,6 @@ struct wlr_xdg_surface {
struct wlr_xdg_surface_state current, pending;
struct wl_listener surface_commit;
struct {
struct wl_signal destroy;
struct wl_signal ping_timeout;
@ -260,6 +268,11 @@ struct wlr_xdg_surface {
} events;
void *data;
// private state
bool client_mapped;
struct wl_listener role_resource_destroy;
};
struct wlr_xdg_toplevel_move_event {