Skip to content
Merged
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ $ kiwmic 'return kiwmi:focused_view():id()'

The dependencies required are:

- [wlroots](https://github.com/swaywm/wlroots)
- [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
- lua or luajit
- pixman
- meson (build)
Expand Down
3 changes: 1 addition & 2 deletions include/desktop/desktop.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
#define KIWMI_DESKTOP_DESKTOP_H

#include <wayland-server.h>
#include <wlr/render/wlr_renderer.h>

struct kiwmi_desktop {
struct wlr_compositor *compositor;
Expand All @@ -35,7 +34,7 @@ struct kiwmi_desktop {
} events;
};

bool desktop_init(struct kiwmi_desktop *desktop, struct wlr_renderer *renderer);
bool desktop_init(struct kiwmi_desktop *desktop);
void desktop_fini(struct kiwmi_desktop *desktop);

struct kiwmi_server;
Expand Down
2 changes: 1 addition & 1 deletion include/desktop/layer_shell.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
#include <stdbool.h>

#include <wayland-server.h>
#include <wlr/types/wlr_box.h>
#include <wlr/types/wlr_surface.h>
#include <wlr/util/box.h>

#include "desktop/output.h"

Expand Down
2 changes: 1 addition & 1 deletion include/desktop/output.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#define KIWMI_DESKTOP_OUTPUT_H

#include <wayland-server.h>
#include <wlr/types/wlr_box.h>
#include <wlr/util/box.h>

struct kiwmi_output {
struct wl_list link;
Expand Down
4 changes: 2 additions & 2 deletions include/desktop/view.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ struct kiwmi_view {

struct kiwmi_view_impl {
void (*close)(struct kiwmi_view *view);
void (*for_each_mapped_surface)(
void (*for_each_surface)(
struct kiwmi_view *view,
wlr_surface_iterator_func_t callback,
void *user_data);
Expand Down Expand Up @@ -131,7 +131,7 @@ struct kiwmi_request_resize_event {
};

void view_close(struct kiwmi_view *view);
void view_for_each_mapped_surface(
void view_for_each_surface(
struct kiwmi_view *view,
wlr_surface_iterator_func_t callback,
void *user_data);
Expand Down
3 changes: 3 additions & 0 deletions include/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ struct kiwmi_server {
struct wl_display *wl_display;
struct wl_event_loop *wl_event_loop;
struct wlr_backend *backend;
struct wlr_renderer *renderer;
struct wlr_allocator *allocator;

const char *socket;
char *config_path;
struct kiwmi_lua *lua;
Expand Down
5 changes: 3 additions & 2 deletions kiwmi/desktop/desktop.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,12 @@
#include "server.h"

bool
desktop_init(struct kiwmi_desktop *desktop, struct wlr_renderer *renderer)
desktop_init(struct kiwmi_desktop *desktop)
{
struct kiwmi_server *server = wl_container_of(desktop, server, desktop);

desktop->compositor = wlr_compositor_create(server->wl_display, renderer);
desktop->compositor =
wlr_compositor_create(server->wl_display, server->renderer);
desktop->data_device_manager =
wlr_data_device_manager_create(server->wl_display);
desktop->output_layout = wlr_output_layout_create();
Expand Down
14 changes: 7 additions & 7 deletions kiwmi/desktop/layer_shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ kiwmi_layer_destroy_notify(struct wl_listener *listener, void *UNUSED(data))
wl_list_remove(&layer->map.link);
wl_list_remove(&layer->unmap.link);

wlr_layer_surface_v1_close(layer->layer_surface);

arrange_layers(layer->output);

free(layer);
Expand All @@ -44,7 +42,9 @@ kiwmi_layer_commit_notify(struct wl_listener *listener, void *UNUSED(data))

struct wlr_box old_geom = layer->geom;

arrange_layers(output);
if (layer->layer_surface->current.committed != 0) {
arrange_layers(output);
}

bool layer_changed = layer->layer != layer->layer_surface->current.layer;
bool geom_changed = memcmp(&old_geom, &layer->geom, sizeof(old_geom)) != 0;
Expand Down Expand Up @@ -237,7 +237,7 @@ arrange_layer(
"Bad width/height: %d, %d",
arranged_area.width,
arranged_area.height);
wlr_layer_surface_v1_close(layer_surface);
wlr_layer_surface_v1_destroy(layer_surface);
continue;
}

Expand Down Expand Up @@ -404,7 +404,7 @@ layer_shell_new_surface_notify(struct wl_listener *listener, void *data)
WLR_ERROR,
"Bad layer surface layer '%d'",
layer_surface->current.layer);
wlr_layer_surface_v1_close(layer_surface);
wlr_layer_surface_v1_destroy(layer_surface);
free(layer);
return;
}
Expand All @@ -427,10 +427,10 @@ layer_shell_new_surface_notify(struct wl_listener *listener, void *data)

wl_list_insert(&output->layers[layer->layer], &layer->link);

// Temporarily set the layer's current state to client_pending
// Temporarily set the layer's current state to pending
// So that we can easily arrange it
struct wlr_layer_surface_v1_state old_state = layer_surface->current;
layer_surface->current = layer_surface->client_pending;
layer_surface->current = layer_surface->pending;
arrange_layers(output);
layer_surface->current = old_state;
}
17 changes: 9 additions & 8 deletions kiwmi/desktop/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <pixman.h>
#include <wayland-server.h>
#include <wlr/backend.h>
#include <wlr/render/allocator.h>
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_layer_shell_v1.h>
#include <wlr/types/wlr_matrix.h>
Expand Down Expand Up @@ -178,8 +179,7 @@ output_frame_notify(struct wl_listener *listener, void *data)

struct kiwmi_view *view;
wl_list_for_each (view, &desktop->views, link) {
view_for_each_mapped_surface(
view, send_frame_done_to_surface, &now);
view_for_each_surface(view, send_frame_done_to_surface, &now);
}

if (render_cursors(wlr_output)) {
Expand All @@ -191,8 +191,8 @@ output_frame_notify(struct wl_listener *listener, void *data)
}

struct wlr_output_layout *output_layout = desktop->output_layout;
struct wlr_renderer *renderer =
wlr_backend_get_renderer(wlr_output->backend);
struct kiwmi_server *server = wl_container_of(desktop, server, desktop);
struct wlr_renderer *renderer = server->renderer;

int width;
int height;
Expand Down Expand Up @@ -226,7 +226,7 @@ output_frame_notify(struct wl_listener *listener, void *data)
rdata.data = view;

wl_signal_emit(&view->events.pre_render, &rdata);
view_for_each_mapped_surface(view, render_surface, &rdata);
view_for_each_surface(view, render_surface, &rdata);
wl_signal_emit(&view->events.post_render, &rdata);
}

Expand Down Expand Up @@ -334,9 +334,10 @@ new_output_notify(struct wl_listener *listener, void *data)

wlr_log(WLR_DEBUG, "New output %p: %s", wlr_output, wlr_output->name);

if (!wl_list_empty(&wlr_output->modes)) {
struct wlr_output_mode *mode =
wl_container_of(wlr_output->modes.prev, mode, link);
wlr_output_init_render(wlr_output, server->allocator, server->renderer);

struct wlr_output_mode *mode = wlr_output_preferred_mode(wlr_output);
if (mode) {
wlr_output_set_mode(wlr_output, mode);

if (!wlr_output_commit(wlr_output)) {
Expand Down
12 changes: 7 additions & 5 deletions kiwmi/desktop/view.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ view_close(struct kiwmi_view *view)
}

void
view_for_each_mapped_surface(
view_for_each_surface(
struct kiwmi_view *view,
wlr_surface_iterator_func_t callback,
void *user_data)
{
if (view->impl->for_each_mapped_surface) {
view->impl->for_each_mapped_surface(view, callback, user_data);
if (view->impl->for_each_surface) {
view->impl->for_each_surface(view, callback, user_data);
}
}

Expand Down Expand Up @@ -262,10 +262,12 @@ view_init_subsurfaces(struct kiwmi_view_child *child, struct kiwmi_view *view)
}

struct wlr_subsurface *subsurface;
wl_list_for_each (subsurface, &surface->subsurfaces_below, parent_link) {
wl_list_for_each (
subsurface, &surface->current.subsurfaces_below, current.link) {
view_child_subsurface_create(child, view, subsurface);
}
wl_list_for_each (subsurface, &surface->subsurfaces_above, parent_link) {
wl_list_for_each (
subsurface, &surface->current.subsurfaces_above, current.link) {
view_child_subsurface_create(child, view, subsurface);
}
}
Expand Down
97 changes: 11 additions & 86 deletions kiwmi/desktop/xdg_shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,87 +294,12 @@ xdg_shell_view_close(struct kiwmi_view *view)
}

static void
surface_for_each_mapped_surface(
struct wlr_surface *surface,
int x,
int y,
wlr_surface_iterator_func_t callback,
void *user_data)
{
struct wlr_subsurface *subsurface;
wl_list_for_each (subsurface, &surface->subsurfaces_below, parent_link) {
if (!subsurface->mapped) {
continue;
}

surface_for_each_mapped_surface(
subsurface->surface,
x + subsurface->current.x,
y + subsurface->current.y,
callback,
user_data);
}

callback(surface, x, y, user_data);

wl_list_for_each (subsurface, &surface->subsurfaces_above, parent_link) {
if (!subsurface->mapped) {
continue;
}

surface_for_each_mapped_surface(
subsurface->surface,
x + subsurface->current.x,
y + subsurface->current.y,
callback,
user_data);
}
}

static void
xdg_surface_for_each_mapped_popup_surface(
struct wlr_xdg_surface *surface,
int x,
int y,
wlr_surface_iterator_func_t callback,
void *user_data)
{
struct wlr_xdg_popup *popup;
wl_list_for_each (popup, &surface->popups, link) {
struct wlr_xdg_surface *popup_surface = popup->base;
if (!popup_surface->configured || !popup_surface->mapped) {
continue;
}

double popup_sx, popup_sy;
wlr_xdg_popup_get_position(popup, &popup_sx, &popup_sy);

surface_for_each_mapped_surface(
popup_surface->surface,
x + popup_sx,
y + popup_sy,
callback,
user_data);
xdg_surface_for_each_mapped_popup_surface(
popup_surface, x + popup_sx, y + popup_sy, callback, user_data);
}
}

static void
xdg_shell_view_for_each_mapped_surface(
xdg_shell_view_for_each_surface(
struct kiwmi_view *view,
wlr_surface_iterator_func_t callback,
void *user_data)
{
if (!view->mapped) {
return;
}

// Have to copy over the wlroots implementation with only small changes
surface_for_each_mapped_surface(
view->xdg_surface->surface, 0, 0, callback, user_data);
xdg_surface_for_each_mapped_popup_surface(
view->xdg_surface, 0, 0, callback, user_data);
wlr_xdg_surface_for_each_surface(view->xdg_surface, callback, user_data);
}

static pid_t
Expand Down Expand Up @@ -436,14 +361,14 @@ xdg_shell_view_surface_at(
}

static const struct kiwmi_view_impl xdg_shell_view_impl = {
.close = xdg_shell_view_close,
.for_each_mapped_surface = xdg_shell_view_for_each_mapped_surface,
.get_pid = xdg_shell_view_get_pid,
.get_string_prop = xdg_shell_view_get_string_prop,
.set_activated = xdg_shell_view_set_activated,
.set_size = xdg_shell_view_set_size,
.set_tiled = xdg_shell_view_set_tiled,
.surface_at = xdg_shell_view_surface_at,
.close = xdg_shell_view_close,
.for_each_surface = xdg_shell_view_for_each_surface,
.get_pid = xdg_shell_view_get_pid,
.get_string_prop = xdg_shell_view_get_string_prop,
.set_activated = xdg_shell_view_set_activated,
.set_size = xdg_shell_view_set_size,
.set_tiled = xdg_shell_view_set_tiled,
.surface_at = xdg_shell_view_surface_at,
};

void
Expand Down Expand Up @@ -534,7 +459,7 @@ xdg_decoration_request_mode_notify(
wl_container_of(listener, decoration, request_mode);

enum wlr_xdg_toplevel_decoration_v1_mode mode =
decoration->wlr_decoration->client_pending_mode;
decoration->wlr_decoration->requested_mode;
if (mode == WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_NONE) {
mode = WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE;
}
Expand Down
2 changes: 1 addition & 1 deletion kiwmi/luak/kiwmi_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
#include "luak/kiwmi_output.h"

#include <lauxlib.h>
#include <wlr/types/wlr_box.h>
#include <wlr/types/wlr_output.h>
#include <wlr/types/wlr_output_layout.h>
#include <wlr/util/box.h>
#include <wlr/util/log.h>

#include "desktop/output.h"
Expand Down
10 changes: 7 additions & 3 deletions kiwmi/server.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

#include <wayland-server.h>
#include <wlr/backend.h>
#include <wlr/render/allocator.h>
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_data_control_v1.h>
#include <wlr/types/wlr_gamma_control_v1.h>
Expand Down Expand Up @@ -43,12 +44,15 @@ server_init(struct kiwmi_server *server, char *config_path)
return false;
}

struct wlr_renderer *renderer = wlr_backend_get_renderer(server->backend);
wlr_renderer_init_wl_display(renderer, server->wl_display);
server->renderer = wlr_renderer_autocreate(server->backend);
wlr_renderer_init_wl_display(server->renderer, server->wl_display);

server->allocator =
wlr_allocator_autocreate(server->backend, server->renderer);

wl_signal_init(&server->events.destroy);

if (!desktop_init(&server->desktop, renderer)) {
if (!desktop_init(&server->desktop)) {
wlr_log(WLR_ERROR, "Failed to initialize desktop");
wl_display_destroy(server->wl_display);
return false;
Expand Down