Skip to content
This repository was archived by the owner on Jan 26, 2024. It is now read-only.
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 30 additions & 12 deletions dwl.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <libinput.h>
#include <wayland-server-core.h>
#include <wlr/backend.h>
#include <wlr/render/allocator.h>
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_compositor.h>
#include <wlr/types/wlr_cursor.h>
Expand Down Expand Up @@ -304,6 +305,7 @@ static struct wlr_backend *backend;
static struct wlr_scene *scene;
static struct wlr_scene_node *layers[NUM_LAYERS];
static struct wlr_renderer *drw;
static struct wlr_allocator *alloc;
static struct wlr_compositor *compositor;

static struct wlr_xdg_shell *xdg_shell;
Expand Down Expand Up @@ -824,6 +826,8 @@ createmon(struct wl_listener *listener, void *data)
Monitor *m = wlr_output->data = calloc(1, sizeof(*m));
m->wlr_output = wlr_output;

wlr_output_init_render(wlr_output, alloc, drw);

/* Initialize monitor state using configured rules */
for (size_t i = 0; i < LENGTH(m->layers); i++)
wl_list_init(&m->layers[i]);
Expand Down Expand Up @@ -872,11 +876,18 @@ void
createnotify(struct wl_listener *listener, void *data)
{
/* This event is raised when wlr_xdg_shell receives a new xdg surface from a
* client, either a toplevel (application window) or popup. */
* client, either a toplevel (application window) or popup.
* or when wlr_layer_shell receives a new popup from a layer, so if you want
* to do something tricky you should check if the parent is wlr_xdg_shell or
* wlr_layer_shell */
struct wlr_xdg_surface *xdg_surface = data;
Client *c;

if (xdg_surface->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL)
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
xdg_surface->surface->data = wlr_scene_xdg_surface_create(
xdg_surface->popup->parent->data, xdg_surface);
return;
} else if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_NONE)
return;

/* Allocate a Client for this surface */
Expand Down Expand Up @@ -921,8 +932,8 @@ createlayersurface(struct wl_listener *listener, void *data)
wlr_layer_surface->data = layersurface;
m = wlr_layer_surface->output->data;

layersurface->scene = wlr_scene_subsurface_tree_create(
layers[wlr_layer_surface->pending.layer],
layersurface->scene = wlr_layer_surface->surface->data =
wlr_scene_subsurface_tree_create(layers[wlr_layer_surface->pending.layer],
wlr_layer_surface->surface);
layersurface->scene->data = layersurface;

Expand Down Expand Up @@ -1076,7 +1087,7 @@ focusclient(Client *c, int lift)
return;

/* Put the new client atop the focus stack and select its monitor */
if (c) {
if (c && c->type != X11Unmanaged) {
wl_list_remove(&c->flink);
wl_list_insert(&fstack, &c->flink);
selmon = c->mon;
Expand All @@ -1100,7 +1111,8 @@ focusclient(Client *c, int lift)
))
return;
} else {
client_activate_surface(old, 0);
/* If client is unmanaged then we shoudn't deactivate old surface */
client_activate_surface(old, c && c->type == X11Unmanaged);
}
}

Expand Down Expand Up @@ -1300,16 +1312,19 @@ mapnotify(struct wl_listener *listener, void *data)

/* Create scene tree for this client and its border */
c->scene = &wlr_scene_tree_create(layers[LyrTile])->node;
c->scene_surface = wlr_scene_subsurface_tree_create(c->scene, client_surface(c));
c->scene_surface = client_surface(c)->data =
wlr_scene_subsurface_tree_create(c->scene, client_surface(c));
c->scene_surface->data = c;
for (i = 0; i < 4; i++) {
c->border[i] = wlr_scene_rect_create(c->scene, 0, 0, bordercolor);
c->border[i]->node.data = c;
}

if (client_is_unmanaged(c)) {
client_get_geometry(c, &c->geom);
/* Floating, no border */
wlr_scene_node_reparent(c->scene, layers[LyrFloat]);
wlr_scene_node_set_position(c->scene, c->geom.x, c->geom.y);
c->bw = 0;

/* Insert this independent into independents lists. */
Expand Down Expand Up @@ -1422,7 +1437,7 @@ moveresize(const Arg *arg)
if (cursor_mode != CurNormal)
return;
xytonode(cursor->x, cursor->y, NULL, &grabc, NULL, NULL, NULL);
if (!grabc)
if (!grabc || grabc->type == X11Unmanaged)
return;

/* Float the window and tell motionnotify to grab it */
Expand Down Expand Up @@ -1844,12 +1859,15 @@ setup(void)
layers[LyrTop] = &wlr_scene_tree_create(&scene->node)->node;
layers[LyrOverlay] = &wlr_scene_tree_create(&scene->node)->node;

/* If we don't provide a renderer, autocreate makes a GLES2 renderer for us.
* The renderer is responsible for defining the various pixel formats it
* supports for shared memory, this configures that for clients. */
drw = wlr_backend_get_renderer(backend);
/* Create a renderer with the default implementation */
if (!(drw = wlr_renderer_autocreate(backend)))
BARF("couldn't create renderer");
wlr_renderer_init_wl_display(drw, dpy);

/* Create a default allocator */
if (!(alloc = wlr_allocator_autocreate(backend, drw)))
BARF("couldn't create allocator");

/* This creates some hands-off wlroots interfaces. The compositor is
* necessary for clients to allocate surfaces and the data device manager
* handles the clipboard. Each of these wlroots interfaces has room for you
Expand Down