mirror of
https://codeberg.org/dwl/dwl.git
synced 2026-09-19 13:52:48 +00:00
support screenshare of single windows
Supersedes https://codeberg.org/dwl/dwl/pulls/1157. Co-authored-by: Zuki Air <zukirust@gmail.com>
This commit is contained in:
@@ -121,6 +121,12 @@ typedef struct {
|
|||||||
} surface;
|
} surface;
|
||||||
struct wlr_xdg_toplevel_decoration_v1 *decoration;
|
struct wlr_xdg_toplevel_decoration_v1 *decoration;
|
||||||
struct wlr_ext_foreign_toplevel_handle_v1 *foreign_toplevel_handle;
|
struct wlr_ext_foreign_toplevel_handle_v1 *foreign_toplevel_handle;
|
||||||
|
struct wlr_scene *image_capture_scene;
|
||||||
|
struct wlr_ext_image_capture_source_v1 *image_capture_source;
|
||||||
|
union {
|
||||||
|
struct wlr_scene_tree *image_capture_tree;
|
||||||
|
struct wlr_scene_surface *image_capture_scene_surface;
|
||||||
|
} capture;
|
||||||
struct wl_listener commit;
|
struct wl_listener commit;
|
||||||
struct wl_listener map;
|
struct wl_listener map;
|
||||||
struct wl_listener maximize;
|
struct wl_listener maximize;
|
||||||
@@ -251,6 +257,7 @@ static void arrangelayer(Monitor *m, struct wl_list *list,
|
|||||||
static void arrangelayers(Monitor *m);
|
static void arrangelayers(Monitor *m);
|
||||||
static void axisnotify(struct wl_listener *listener, void *data);
|
static void axisnotify(struct wl_listener *listener, void *data);
|
||||||
static void buttonpress(struct wl_listener *listener, void *data);
|
static void buttonpress(struct wl_listener *listener, void *data);
|
||||||
|
static void capturerequest(struct wl_listener *listener, void *data);
|
||||||
static void chvt(const Arg *arg);
|
static void chvt(const Arg *arg);
|
||||||
static void checkidleinhibitor(struct wlr_surface *exclude);
|
static void checkidleinhibitor(struct wlr_surface *exclude);
|
||||||
static void cleanup(void);
|
static void cleanup(void);
|
||||||
@@ -386,6 +393,7 @@ static struct wlr_virtual_pointer_manager_v1 *virtual_pointer_mgr;
|
|||||||
static struct wlr_cursor_shape_manager_v1 *cursor_shape_mgr;
|
static struct wlr_cursor_shape_manager_v1 *cursor_shape_mgr;
|
||||||
static struct wlr_output_power_manager_v1 *power_mgr;
|
static struct wlr_output_power_manager_v1 *power_mgr;
|
||||||
static struct wlr_ext_foreign_toplevel_list_v1 *foreign_toplevel_list;
|
static struct wlr_ext_foreign_toplevel_list_v1 *foreign_toplevel_list;
|
||||||
|
static struct wlr_ext_foreign_toplevel_image_capture_source_manager_v1 *ext_foreign_toplevel_image_capture_source_manager_v1;
|
||||||
|
|
||||||
static struct wlr_pointer_constraints_v1 *pointer_constraints;
|
static struct wlr_pointer_constraints_v1 *pointer_constraints;
|
||||||
static struct wlr_relative_pointer_manager_v1 *relative_pointer_mgr;
|
static struct wlr_relative_pointer_manager_v1 *relative_pointer_mgr;
|
||||||
@@ -440,6 +448,7 @@ static struct wl_listener request_set_cursor_shape = {.notify = setcursorshape};
|
|||||||
static struct wl_listener request_start_drag = {.notify = requeststartdrag};
|
static struct wl_listener request_start_drag = {.notify = requeststartdrag};
|
||||||
static struct wl_listener start_drag = {.notify = startdrag};
|
static struct wl_listener start_drag = {.notify = startdrag};
|
||||||
static struct wl_listener new_session_lock = {.notify = locksession};
|
static struct wl_listener new_session_lock = {.notify = locksession};
|
||||||
|
static struct wl_listener new_foreign_toplevel_capture_request = {.notify = capturerequest};
|
||||||
|
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
static void activatex11(struct wl_listener *listener, void *data);
|
static void activatex11(struct wl_listener *listener, void *data);
|
||||||
@@ -688,6 +697,23 @@ buttonpress(struct wl_listener *listener, void *data)
|
|||||||
event->time_msec, event->button, event->state);
|
event->time_msec, event->button, event->state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
capturerequest(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
struct wlr_ext_foreign_toplevel_image_capture_source_manager_v1_request *request = data;
|
||||||
|
Client *view = request->toplevel_handle->data;
|
||||||
|
|
||||||
|
if (!view->image_capture_source) {
|
||||||
|
view->image_capture_source = wlr_ext_image_capture_source_v1_create_with_scene_node(
|
||||||
|
&view->image_capture_scene->tree.node, event_loop, alloc, drw);
|
||||||
|
if (!view->image_capture_source)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlr_ext_foreign_toplevel_image_capture_source_manager_v1_request_accept(
|
||||||
|
request, view->image_capture_source);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
chvt(const Arg *arg)
|
chvt(const Arg *arg)
|
||||||
{
|
{
|
||||||
@@ -800,6 +826,7 @@ cleanuplisteners(void)
|
|||||||
wl_list_remove(&request_start_drag.link);
|
wl_list_remove(&request_start_drag.link);
|
||||||
wl_list_remove(&start_drag.link);
|
wl_list_remove(&start_drag.link);
|
||||||
wl_list_remove(&new_session_lock.link);
|
wl_list_remove(&new_session_lock.link);
|
||||||
|
wl_list_remove(&new_foreign_toplevel_capture_request.link);
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
wl_list_remove(&new_xwayland_surface.link);
|
wl_list_remove(&new_xwayland_surface.link);
|
||||||
wl_list_remove(&xwayland_ready.link);
|
wl_list_remove(&xwayland_ready.link);
|
||||||
@@ -1838,6 +1865,14 @@ mapnotify(struct wl_listener *listener, void *data)
|
|||||||
c->foreign_toplevel_handle = wlr_ext_foreign_toplevel_handle_v1_create(
|
c->foreign_toplevel_handle = wlr_ext_foreign_toplevel_handle_v1_create(
|
||||||
foreign_toplevel_list, &foreign_toplevel_state);
|
foreign_toplevel_list, &foreign_toplevel_state);
|
||||||
c->foreign_toplevel_handle->data = c;
|
c->foreign_toplevel_handle->data = c;
|
||||||
|
c->image_capture_scene = wlr_scene_create();
|
||||||
|
if (c->type == XDGShell)
|
||||||
|
c->capture.image_capture_tree = wlr_scene_xdg_surface_create(&c->image_capture_scene->tree, c->surface.xdg);
|
||||||
|
#ifdef XWAYLAND
|
||||||
|
else
|
||||||
|
c->capture.image_capture_scene_surface = wlr_scene_surface_create(&c->image_capture_scene->tree, c->surface.xwayland->surface);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Set initial monitor, tags, floating status, and focus:
|
/* Set initial monitor, tags, floating status, and focus:
|
||||||
* we always consider floating, clients that have parent and thus
|
* we always consider floating, clients that have parent and thus
|
||||||
@@ -2630,6 +2665,10 @@ setup(void)
|
|||||||
wlr_scene_node_set_enabled(&locked_bg->node, 0);
|
wlr_scene_node_set_enabled(&locked_bg->node, 0);
|
||||||
|
|
||||||
foreign_toplevel_list = wlr_ext_foreign_toplevel_list_v1_create(dpy,1);
|
foreign_toplevel_list = wlr_ext_foreign_toplevel_list_v1_create(dpy,1);
|
||||||
|
ext_foreign_toplevel_image_capture_source_manager_v1 =
|
||||||
|
wlr_ext_foreign_toplevel_image_capture_source_manager_v1_create(dpy, 1);
|
||||||
|
wl_signal_add(&ext_foreign_toplevel_image_capture_source_manager_v1->events.new_request,
|
||||||
|
&new_foreign_toplevel_capture_request);
|
||||||
|
|
||||||
/* Use decoration protocols to negotiate server-side decorations */
|
/* Use decoration protocols to negotiate server-side decorations */
|
||||||
wlr_server_decoration_manager_set_default_mode(
|
wlr_server_decoration_manager_set_default_mode(
|
||||||
@@ -2898,6 +2937,14 @@ unmapnotify(struct wl_listener *listener, void *data)
|
|||||||
wlr_ext_foreign_toplevel_handle_v1_destroy(c->foreign_toplevel_handle);
|
wlr_ext_foreign_toplevel_handle_v1_destroy(c->foreign_toplevel_handle);
|
||||||
c->foreign_toplevel_handle = NULL;
|
c->foreign_toplevel_handle = NULL;
|
||||||
}
|
}
|
||||||
|
#ifdef XWAYLAND
|
||||||
|
if (c->type != XDGShell && c->capture.image_capture_scene_surface) {
|
||||||
|
wlr_scene_node_destroy(&c->capture.image_capture_scene_surface->buffer->node);
|
||||||
|
c->capture.image_capture_scene_surface = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wlr_scene_node_destroy(&c->image_capture_scene->tree.node);
|
||||||
wlr_scene_node_destroy(&c->scene->node);
|
wlr_scene_node_destroy(&c->scene->node);
|
||||||
client_surface(c)->data = NULL;
|
client_surface(c)->data = NULL;
|
||||||
printstatus();
|
printstatus();
|
||||||
|
|||||||
Reference in New Issue
Block a user