diff --git a/glonkers.c b/glonkers.c index 4bebc35..b660871 100644 --- a/glonkers.c +++ b/glonkers.c @@ -9,6 +9,7 @@ #include #include "renderer.h" #include "wayland.h" +#include struct timespec program_start; @@ -26,15 +27,24 @@ double time_since_start() { int main(int argc, char *argv[]) { char *shader_path = NULL; + int output_type = OUTPUT_WINDOW; if (argc >= 2) { shader_path = argv[1]; } else { printf("need to supply path to shader\n"); exit(1); } + if (argc >= 3) { + // xdg toplevel window (window) or wlr_layer_shell window (layer) + if (strcmp(argv[2], "window")) { + output_type = OUTPUT_WINDOW; + } else if (strcmp(argv[2], "layer")) { + output_type = OUTPUT_LAYER; + } + } struct client_state state; - wayland_init(&state); + wayland_init(&state, output_type); Renderer renderer = new_renderer(); diff --git a/wayland.c b/wayland.c index c571f98..43b0a82 100644 --- a/wayland.c +++ b/wayland.c @@ -71,12 +71,28 @@ registry_handle_global(void *data, struct wl_registry *registry, if (strcmp(interface, wl_compositor_interface.name) == 0) { state->wl_compositor = wl_registry_bind( registry, name, &wl_compositor_interface, 4); + // Set up wl_surface + state->wl_surface = wl_compositor_create_surface(state->wl_compositor); } if (strcmp(interface, xdg_wm_base_interface.name) == 0) { state->xdg_wm_base = wl_registry_bind( registry, name, &xdg_wm_base_interface, 1); xdg_wm_base_add_listener(state->xdg_wm_base, &xdg_wm_base_listener, state); + + state->xdg_surface = xdg_wm_base_get_xdg_surface( + state->xdg_wm_base, state->wl_surface); + xdg_surface_add_listener(state->xdg_surface, &xdg_surface_listener, state); + state->xdg_toplevel = xdg_surface_get_toplevel(state->xdg_surface); + xdg_toplevel_set_title(state->xdg_toplevel, "GLONKERS! 🕴️"); + xdg_toplevel_add_listener(state->xdg_toplevel, &xdg_toplevel_listener, state); + } + if (strcmp(interface, zwlr_layer_shell_v1_interface.name) == 0) { + state->zwlr_layer_shell_v1 = wl_registry_bind(registry, name, &zwlr_layer_shell_v1_interface, 4); + } + if (strcmp(interface, wl_output_interface.name) == 0) { + state->wl_output = wl_registry_bind( + registry, name, &wl_output_interface, 4); } } @@ -180,23 +196,21 @@ static void egl_init(struct client_state *state) { } /// Initializes wayland and creates an opengl context -void wayland_init(struct client_state *state) { +void wayland_init(struct client_state *state, int output_type) { int width = 700, height = 700; state->width = width; state->height = height; state->running = 1; + state->output_type = output_type; state->wl_display = wl_display_connect(NULL); state->wl_registry = wl_display_get_registry(state->wl_display); wl_registry_add_listener(state->wl_registry, &wl_registry_listener, state); wl_display_roundtrip(state->wl_display); - state->wl_surface = wl_compositor_create_surface(state->wl_compositor); - state->xdg_surface = xdg_wm_base_get_xdg_surface( - state->xdg_wm_base, state->wl_surface); - xdg_surface_add_listener(state->xdg_surface, &xdg_surface_listener, state); - state->xdg_toplevel = xdg_surface_get_toplevel(state->xdg_surface); - xdg_toplevel_set_title(state->xdg_toplevel, "GLONKERS! 🕴️"); - xdg_toplevel_add_listener(state->xdg_toplevel, &xdg_toplevel_listener, state); + // wlr_layer_shell + //int layer = ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND; + //struct zwlr_layer_surface_v1 *zwlr_layer_surface = zwlr_layer_shell_v1_get_layer_surface(state->zwlr_layer_shell_v1, state->wl_surface, state->wl_output, layer, "wallpaper"); + // toplevel wl_surface_commit(state->wl_surface); egl_init(state); diff --git a/wayland.h b/wayland.h index 8d79e9b..bcc4098 100644 --- a/wayland.h +++ b/wayland.h @@ -1,10 +1,17 @@ #include #include #include "xdg-shell-protocol.h" +#include "wlr-layer-shell-unstable-v1-protocol.h" + +/// A normal window +#define OUTPUT_WINDOW 0; +/// A desktop layer (wallpaper) +#define OUTPUT_LAYER 1; struct client_state { int width, height; int running; + int output_type; /* Globals */ struct wl_display *wl_display; struct wl_registry *wl_registry; @@ -17,12 +24,16 @@ struct client_state { struct wl_egl_window *egl_window; + // wlr_layer_shell + struct zwlr_layer_shell_v1 *zwlr_layer_shell_v1; + struct wl_output *wl_output; + EGLDisplay egl_display; EGLConfig egl_config; EGLSurface egl_surface; EGLContext egl_context; }; -void wayland_init(struct client_state *state); +void wayland_init(struct client_state *state, int output_type); void commit(struct client_state *state);