Skip to content

Commit

Permalink
Merge pull request #6 from ARDiDo/basic_damage_tracking
Browse files Browse the repository at this point in the history
Fix unmanaged x11 windows + layersurfaces
  • Loading branch information
MilesBreslin authored Oct 6, 2021
2 parents de0c391 + 5352229 commit 6a31483
Showing 1 changed file with 40 additions and 35 deletions.
75 changes: 40 additions & 35 deletions dwl.c
Original file line number Diff line number Diff line change
Expand Up @@ -343,10 +343,6 @@ static struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard_mgr;

static struct wlr_cursor *cursor;
static struct wlr_xcursor_manager *cursor_mgr;
#ifdef XWAYLAND
static struct wlr_xcursor *xcursor;
static struct wlr_xcursor_manager *xcursor_mgr;
#endif

static struct wlr_seat *seat;
static struct wl_list keyboards;
Expand Down Expand Up @@ -384,6 +380,7 @@ static void configurex11(struct wl_listener *listener, void *data);
static void createnotifyx11(struct wl_listener *listener, void *data);
void commitnotifyx11(struct wl_listener *listener, void *data);
static Atom getatom(xcb_connection_t *xc, const char *name);
static void mapnotify_unmanaged(struct wl_listener *listener, void *data);
static void renderindependents(struct wlr_output *output, struct timespec *now);
static void xwaylandready(struct wl_listener *listener, void *data);
static Client *xytoindependent(double x, double y);
Expand Down Expand Up @@ -816,7 +813,8 @@ void
commitnotify_sub(struct wl_listener *listener, void *data)
{
Subsurface *s = wl_container_of(listener, s, commit);
wlr_output_damage_add_whole(s->c->mon->damage);
if (s->c->mon)
wlr_output_damage_add_whole(s->c->mon->damage);
}

void
Expand All @@ -829,7 +827,7 @@ createkeyboard(struct wlr_input_device *device)

/* Prepare an XKB keymap and assign it to the keyboard. */
context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
keymap = xkb_map_new_from_names(context, &xkb_rules,
keymap = xkb_keymap_new_from_names(context, &xkb_rules,
XKB_KEYMAP_COMPILE_NO_FLAGS);

wlr_keyboard_set_keymap(device->keyboard, keymap);
Expand Down Expand Up @@ -1024,8 +1022,10 @@ destroylayersurfacenotify(struct wl_listener *listener, void *data)
wl_list_remove(&layersurface->surface_commit.link);
if (layersurface->layer_surface->output) {
Monitor *m = layersurface->layer_surface->output->data;
if (m)
if (m) {
arrangelayers(m);
wlr_output_damage_add_whole(m->damage);
}
layersurface->layer_surface->output = NULL;
}
free(layersurface);
Expand All @@ -1044,14 +1044,20 @@ destroynotify(struct wl_listener *listener, void *data)
wl_list_remove(&c->map.link);
wl_list_remove(&c->unmap.link);
wl_list_remove(&c->destroy.link);
wl_list_remove(&c->set_title.link);
wl_list_remove(&c->fullscreen.link);
if (client_is_unmanaged(c)) {
#ifdef XWAYLAND
if (c->type == X11Managed)
wl_list_remove(&c->configure.link);
free(c);
return;
} else if (c->type == X11Managed) {
wl_list_remove(&c->activate.link);
else if (c->type == XDGShell)
wl_list_remove(&c->configure.link);
#endif
} else {
wl_list_remove(&c->commit.link);
}
wl_list_remove(&c->set_title.link);
wl_list_remove(&c->fullscreen.link);
free(c);
}

Expand Down Expand Up @@ -1353,12 +1359,6 @@ mapnotify(struct wl_listener *listener, void *data)
/* Called when the surface is mapped, or ready to display on-screen. */
Client *c = wl_container_of(listener, c, map);

if (client_is_unmanaged(c)) {
/* Insert this independent into independents lists. */
wl_list_insert(&independents, &c->link);
return;
}

/* Insert this client into client lists. */
wl_list_insert(&clients, &c->link);
wl_list_insert(&fstack, &c->flink);
Expand Down Expand Up @@ -2224,18 +2224,6 @@ setup(void)
wl_signal_add(&xwayland->events.ready, &xwayland_ready);
wl_signal_add(&xwayland->events.new_surface, &new_xwayland_surface);

/*
* Create the XWayland cursor manager at scale 1, setting its default
* pointer to match the rest of dwl.
*/
xcursor_mgr = wlr_xcursor_manager_create(NULL, 24);
wlr_xcursor_manager_load(xcursor_mgr, 1);
if ((xcursor = wlr_xcursor_manager_get_xcursor(xcursor_mgr, "left_ptr", 1)))
wlr_xwayland_set_cursor(xwayland,
xcursor->images[0]->buffer, xcursor->images[0]->width * 4,
xcursor->images[0]->width, xcursor->images[0]->height,
xcursor->images[0]->hotspot_x, xcursor->images[0]->hotspot_y);

setenv("DISPLAY", xwayland->display_name, 1);
} else {
fprintf(stderr, "failed to setup XWayland X server, continuing without it\n");
Expand Down Expand Up @@ -2594,16 +2582,21 @@ createnotifyx11(struct wl_listener *listener, void *data)
c->isfullscreen = 0;

/* Listen to the various events it can emit */
LISTEN(&xwayland_surface->events.map, &c->map, mapnotify);
if (c->type == X11Managed) {
LISTEN(&xwayland_surface->events.map, &c->map, mapnotify);
LISTEN(&xwayland_surface->events.request_activate, &c->activate,
activatex11);
LISTEN(&xwayland_surface->events.set_title, &c->set_title, updatetitle);
LISTEN(&xwayland_surface->events.request_fullscreen, &c->fullscreen,
fullscreennotify);
}
else {
LISTEN(&xwayland_surface->events.map, &c->map, mapnotify_unmanaged);
}
LISTEN(&xwayland_surface->events.unmap, &c->unmap, unmapnotify);
LISTEN(&xwayland_surface->events.request_activate, &c->activate,
activatex11);
LISTEN(&xwayland_surface->events.request_configure, &c->configure,
configurex11);
LISTEN(&xwayland_surface->events.set_title, &c->set_title, updatetitle);
LISTEN(&xwayland_surface->events.destroy, &c->destroy, destroynotify);
LISTEN(&xwayland_surface->events.request_fullscreen, &c->fullscreen,
fullscreennotify);
}

void
Expand All @@ -2628,6 +2621,18 @@ getatom(xcb_connection_t *xc, const char *name)
return atom;
}

void
mapnotify_unmanaged(struct wl_listener *listener, void *data)
{
Client *c = wl_container_of(listener, c, map);
wl_list_insert(&independents, &c->link);
client_get_geometry(c, &c->geom);
c->mon = xytomon(c->geom.x, c->geom.y);
LISTEN(&c->surface.xwayland->surface->events.commit, &c->commit, commitnotifyx11);
wlr_output_damage_add_whole(c->mon->damage);
}


void
renderindependents(struct wlr_output *output, struct timespec *now)
{
Expand Down

0 comments on commit 6a31483

Please sign in to comment.