AtlatestRepositorysigil-wm

sigil-wm / tree / src / cpermissions.h

1/* SPDX-License-Identifier: BSD-3-Clause
2 * Client virtual devices are inert until a copied permission request is granted. */
3struct permission {
4 struct wl_list link;
5 struct server *server;
6 uint64_t token,deadline;
7 struct wl_resource *resource;
8 struct wlr_input_device *device;
9 struct wl_listener destroy;
10};
11static void permission_destroy(struct wl_listener *listener,void *data) {
12 (void)data;
13 struct permission *p=wl_container_of(listener,p,destroy);
14 EVENT(72,p->token);
15 wl_list_remove(&p->destroy.link); wl_list_remove(&p->link); free(p);
17static void permission_request(struct server *s,struct wl_resource *resource,struct wlr_input_device *device) {
18 struct permission *p=calloc(1,sizeof(*p));
19 if(!p) return;
20 p->server=s; p->resource=resource; p->device=device;
21 p->token=++s->next_token; p->deadline=now_ms()+bridge.request_deadline;
22 wl_resource_add_destroy_listener(resource,&p->destroy);
23 p->destroy.notify=permission_destroy;
24 wl_list_insert(&s->permissions,&p->link);
25 pid_t pid; uid_t uid; gid_t gid;
26 wl_client_get_credentials(wl_resource_get_client(resource),&pid,&uid,&gid);
27 EVENT(70,p->token,device->type,pid,uid,gid);
29static void virtual_keyboard(struct wl_listener *listener,void *data) {
30 struct server *s=wl_container_of(listener,s,new_virtual_keyboard);
31 struct wlr_virtual_keyboard_v1 *k=data;
32 permission_request(s,k->resource,&k->keyboard.base);
34static void virtual_pointer(struct wl_listener *listener,void *data) {
35 struct server *s=wl_container_of(listener,s,new_virtual_pointer);
36 struct wlr_virtual_pointer_v1_new_pointer_event *e=data;
37 permission_request(s,e->new_pointer->resource,&e->new_pointer->pointer.base);
39static bool permission_reply(struct server *s,uint64_t token,bool allow) {
40 struct permission *p;
41 wl_list_for_each(p,&s->permissions,link) {
42 if(p->token!=token) continue;
43 struct wl_resource *resource=p->resource;
44 struct wlr_input_device *device=p->device;
45 wl_list_remove(&p->destroy.link); wl_list_remove(&p->link); free(p);
46 if(allow && !s->lock_state) {
47 attach_input(s,device,true);
48 } else wl_resource_destroy(resource);
49 EVENT(71,token,allow && !s->lock_state);
50 return true;
51 }
52 return false;
54static void permissions_expire(struct server *s) {
55 struct permission *p,*next;
56 wl_list_for_each_safe(p,next,&s->permissions,link)
57 if(now_ms()>=p->deadline) permission_reply(s,p->token,false);