AtlatestRepositorysigil-wm
1
/* SPDX-License-Identifier: BSD-3-Clause2
* Legacy protocol ownership and copied mode facts, without presentation policy. */3
struct legacy_decoration {4
struct wl_list link;5
struct server *server;6
struct wlr_server_decoration *native;7
struct wl_listener mode,destroy;8
uint64_t id,window;9
uint32_t copied_mode;10
bool published;11
};12
static void legacy_decoration_state(struct legacy_decoration *owner) {13
uint64_t window=window_for_surface(owner->server,owner->native->surface);14
if(owner->published && owner->window==window && owner->copied_mode==owner->native->mode) return;15
owner->published=true;16
owner->window=window;17
owner->copied_mode=owner->native->mode;18
EVENT(116,owner->id,window,owner->copied_mode,1);19
}20
static void refresh_decorations(struct server *s) {21
struct legacy_decoration *owner;22
wl_list_for_each(owner,&s->legacy_decorations,link) legacy_decoration_state(owner);23
}24
static void legacy_decoration_mode(struct wl_listener *listener,void *data) {25
(void)data;26
struct legacy_decoration *owner=wl_container_of(listener,owner,mode);27
legacy_decoration_state(owner);28
}29
static void legacy_decoration_destroy(struct wl_listener *listener,void *data) {30
(void)data;31
struct legacy_decoration *owner=wl_container_of(listener,owner,destroy);32
EVENT(117,owner->id);33
wl_list_remove(&owner->mode.link); wl_list_remove(&owner->destroy.link);34
wl_list_remove(&owner->link);35
owner->server->decoration_count--;36
atomic_fetch_sub(&bridge.objects,1);37
free(owner);38
}39
static void new_legacy_decoration(struct wl_listener *listener,void *data) {40
struct server *s=wl_container_of(listener,s,new_legacy_decoration);41
struct wlr_server_decoration *native=data;42
if(s->decoration_count>=256) { wl_resource_destroy(native->resource); return; }43
struct legacy_decoration *owner=calloc(1,sizeof(*owner));44
if(!owner) { wl_resource_post_no_memory(native->resource); return; }45
owner->id=++s->next_id; owner->server=s; owner->native=native;46
wl_list_insert(&s->legacy_decorations,&owner->link); s->decoration_count++;47
listen(&native->events.mode,&owner->mode,legacy_decoration_mode);48
listen(&native->events.destroy,&owner->destroy,legacy_decoration_destroy);49
atomic_fetch_add(&bridge.objects,1);50
legacy_decoration_state(owner);51
}