From 4a04ba2237a4a59bd2505433c4b99c9d1d6700cb Mon Sep 17 00:00:00 2001 From: wizbright Date: Wed, 21 Feb 2018 13:19:27 -0600 Subject: [PATCH] fixing issues now --- .gitignore | 1 + meson.build | 41 +++++++++++++++++++++++++++++ src/main.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 .gitignore create mode 100644 meson.build diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..9f9ce65 --- /dev/null +++ b/meson.build @@ -0,0 +1,41 @@ +# SirCmpwn is a god. (from mcwayface) + +project( + 'waybox', + 'c', + version: '0.0.1', + license: 'MIT', + meson_version: '>=0.43.0', + default_options: [ + 'c_std=c11', + 'warning_level=2', + 'werror=true', + ], +) + +add_project_arguments('-Wno-unused-parameter', language: 'c') + +cc = meson.get_compiler('c') +if cc.get_id() == 'clang' + add_project_arguments('-Wno-missing-field-initializers', language: 'c') + add_project_arguments('-Wno-missing-braces', language: 'c') +endif + +# Hiding depreciation warnings +add_project_arguments('-DWL_HIDE_DEPRECATED', language: 'c') + +pixman = dependency('pixman-1') +wlroots = dependency('wlroots') +wayland_server = dependency('wayland-server') + +executable( + 'waybox', + [ + 'src/main.c' + ], + dependencies: [ + pixman, + wlroots, + wayland_server, + ] +) diff --git a/src/main.c b/src/main.c index 719e253..4a5d2dc 100644 --- a/src/main.c +++ b/src/main.c @@ -1,12 +1,82 @@ +#include #include +#include +#include #include +#include +#include + struct wb_server { struct wl_display *wl_display; struct wl_event_loop *wl_event_loop; + struct wlr_backend *backend; + + struct wl_listener new_output; + struct wl_list outputs; // wb_output::link }; +struct wb_output { + struct wlr_output *wlr_output; + struct wb_server *server; + struct timespec last_frame; + float color[4]; + int dec; + + struct wl_listener destroy; + struct wl_listener frame; + + struct wl_list link; +}; + +static void output_frame_notify(struct wl_listener *listener, void *data) { + struct wb_output *output = wl_container_of(listener, output, frame); + struct wlr_output *wlr_output = data; + struct wlr_renderer *renderer = wlr_backend_get_renderer( + wlr_output->backend); + + wlr_output_make_current(wlr_output, NULL); + wlr_renderer_begin(renderer, wlr_output); + + float color[4] = {1.0, 0, 0, 1.0}; // Color red + wlr_renderer_clear(renderer, &output->color); + + wlr_output_swap_buffers(wlr_output, NULL, NULL); + wlr_renderer_end(renderer); +} + +static void output_remove_notify(struct wl_listener *listener, void *data) { + struct wb_output *output = wl_container_of(listener, output, destroy); + wl_list_remove(&output->link); + wl_list_remove(&output->destroy.link); + wl_list_remove(&output->frame.link); + free(output); +} + +static void new_output_notify(struct wl_listener *listener, void *data) { + struct wb_server *server = wl_container_of( + listener, server, new_output + ); + + if (!wl_list_empty(&wlr_output->modes)) { + struct wlr_output_mode *mode = + wl_container_of(wlr_output->modes.prev, mode, link); + wlr_output_set_mode(wlr_output, mode); + } + + struct wb_output *output = calloc(1, sizeof(struct wb_output)); + clock_gettime(CLOCK_MONOTONIC, &output->last_frame); + output->server = server; + output->wlr_output = wlr_output; + wl_list_insert(&server->outputs, &output->link); + + output->destroy.notify = output_destroy_notify; + wl_signal_add(&wlr_output->events.destroy, &output->destroy); + output->frame.notify = output_frame_notify; + wl_signal_add(&wlr_output->events.frame, &output->frame); +} + int main(int argc, char **argv){ struct wb_server server; @@ -18,6 +88,11 @@ int main(int argc, char **argv){ server.backend = wlr_backend_autocreate(server.wl_display); assert(server.backend); + wl_list_init(&server.outputs); + + server.new_output.notify = new_output_notify; + wl_signal_add(&server.backend->events.new_output, &server.new_output); + if (!wlr_backend_start(server.backend)) { fprintf(stderr, "Failed to start backend\n"); wl_display_destroy(server.wl_display);