From df366b8aba66c29acabcc2c19bc1c8f5ee004988 Mon Sep 17 00:00:00 2001 From: gfhopper Date: Fri, 9 May 2025 14:25:25 -0400 Subject: [PATCH] Test new codebase in Fedora VM and push upstream --- Makefile | 17 ++++++ cursor.png => assets/cursor.png | Bin include/panes/compositor.h | 20 ++++++ include/panes/input.h | 0 include/panes/renderer.h | 4 ++ main.c | 105 -------------------------------- panes | Bin 29632 -> 36080 bytes src/compositor.c | 102 +++++++++++++++++++++++++++++++ src/compositor.o | Bin 0 -> 23472 bytes src/input.c | 0 src/main.c | 17 ++++++ src/main.o | Bin 0 -> 10856 bytes src/renderer.c | 24 ++++++++ src/renderer.o | Bin 0 -> 8576 bytes 14 files changed, 184 insertions(+), 105 deletions(-) create mode 100644 Makefile rename cursor.png => assets/cursor.png (100%) create mode 100644 include/panes/compositor.h create mode 100644 include/panes/input.h create mode 100644 include/panes/renderer.h delete mode 100644 main.c create mode 100644 src/compositor.c create mode 100644 src/compositor.o create mode 100644 src/input.c create mode 100644 src/main.c create mode 100644 src/main.o create mode 100644 src/renderer.c create mode 100644 src/renderer.o diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..405f995 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +CC = cc +CFLAGS = -g -std=c11 -DWLR_USE_UNSTABLE $(shell pkg-config --cflags wlroots-0.18 wayland-server) -Iinclude +LDFLAGS = $(shell pkg-config --libs wlroots-0.18 wayland-server) +SRC = src/main.c src/compositor.c src/renderer.c +OBJ = $(SRC:.c=.o) +BIN = panes + +all: $(BIN) + +$(BIN): $(OBJ) + $(CC) -o $@ $^ $(LDFLAGS) + +%.o: %.c + $(CC) -c $< -o $@ $(CFLAGS) + +clean: + rm -f $(OBJ) $(BIN) diff --git a/cursor.png b/assets/cursor.png similarity index 100% rename from cursor.png rename to assets/cursor.png diff --git a/include/panes/compositor.h b/include/panes/compositor.h new file mode 100644 index 0000000..c5a76a3 --- /dev/null +++ b/include/panes/compositor.h @@ -0,0 +1,20 @@ +#pragma once +#include +#include +#include +#include +#include +#include + +struct compositor_state { + struct wl_display *display; + struct wlr_backend *backend; + struct wlr_renderer *renderer; + struct wlr_allocator *allocator; + struct wlr_scene *scene; + struct wlr_output_layout *layout; + struct wl_listener new_output; +}; + +void compositor_init(struct compositor_state *state); +void handle_new_output(struct wl_listener *listener, void *data); diff --git a/include/panes/input.h b/include/panes/input.h new file mode 100644 index 0000000..e69de29 diff --git a/include/panes/renderer.h b/include/panes/renderer.h new file mode 100644 index 0000000..903ba12 --- /dev/null +++ b/include/panes/renderer.h @@ -0,0 +1,4 @@ +#pragma once +#include + +void renderer_set_background(struct wlr_scene *scene, uint32_t hex_color); diff --git a/main.c b/main.c deleted file mode 100644 index 4e9dc3a..0000000 --- a/main.c +++ /dev/null @@ -1,105 +0,0 @@ -#define WLR_USE_UNSTABLE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct server { - struct wl_display *display; - struct wlr_backend *backend; - struct wlr_renderer *renderer; - struct wlr_allocator *allocator; - struct wlr_scene *scene; - struct wlr_output_layout *layout; - struct wl_listener new_output; -}; - -static void handle_new_output(struct wl_listener *listener, void *data) { - struct server *server = wl_container_of(listener, server, new_output); - struct wlr_output *output = data; - - // Pick the first available mode - if (!wl_list_empty(&output->modes)) { - struct wlr_output_mode *mode = wl_container_of(output->modes.next, mode, link); - - struct wlr_output_state state; - memset(&state, 0, sizeof(state)); - state.committed = WLR_OUTPUT_STATE_ENABLED | WLR_OUTPUT_STATE_MODE; - state.enabled = true; - state.mode_type = WLR_OUTPUT_STATE_MODE_FIXED; - state.mode = mode; - - if (!wlr_output_commit_state(output, &state)) { - wlr_log(WLR_ERROR, "Failed to commit output state"); - return; - } - } - - wlr_output_layout_add_auto(server->layout, output); - wlr_scene_output_create(server->scene, output); - - float bg[4] = {0.1f, 0.1f, 0.1f, 1.0f}; - struct wlr_scene_rect *rect = - wlr_scene_rect_create(&server->scene->tree, 1, 1, bg); - wlr_scene_node_lower_to_bottom(&rect->node); -} - -int main(void) { - wlr_log_init(WLR_DEBUG, NULL); - struct server server = {0}; - - server.display = wl_display_create(); - struct wl_event_loop *loop = wl_display_get_event_loop(server.display); - - // Create the backend first - server.backend = wlr_backend_autocreate(loop, NULL); // Automatically choose the backend - if (!server.backend) { - wlr_log(WLR_ERROR, "Failed to create backend"); - return 1; - } - - // Create the renderer after the backend - server.renderer = wlr_renderer_autocreate(server.backend); - if (!server.renderer) { - wlr_log(WLR_ERROR, "Failed to create renderer"); - return 1; - } - - // Now create the allocator with the valid renderer - server.allocator = wlr_allocator_autocreate(server.backend, server.renderer); - if (!server.allocator) { - wlr_log(WLR_ERROR, "Failed to create allocator"); - return 1; - } - - // Create the compositor with the renderer - wlr_compositor_create(server.display, 4, server.renderer); - wlr_data_device_manager_create(server.display); - - server.scene = wlr_scene_create(); - server.layout = wlr_output_layout_create(server.display); - - server.new_output.notify = handle_new_output; - wl_signal_add(&server.backend->events.new_output, &server.new_output); - - // Start the backend - if (!wlr_backend_start(server.backend)) { - wlr_log(WLR_ERROR, "Failed to start backend"); - return 1; - } - - wlr_log(WLR_INFO, "Panes compositor running (wlroots 0.18)..."); - wl_display_run(server.display); - wl_display_destroy(server.display); - return 0; -} diff --git a/panes b/panes index 380a9ae9b34f02301f1090758cb68374d05c7e48..5e1f12b4740c547e827a3b094bf6cec02faac70b 100755 GIT binary patch literal 36080 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

9` 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 diff --git a/src/compositor.c b/src/compositor.c new file mode 100644 index 0000000..b0b6e53 --- /dev/null +++ b/src/compositor.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // Add this to the top of the file + +static bool parse_hex_color(const char *hex_str, float *rgba_out) { + if (!hex_str) return false; + + if (hex_str[0] == '#') hex_str++; + else if (hex_str[0] == '0' && tolower(hex_str[1]) == 'x') hex_str += 2; + + if (strlen(hex_str) != 6) return false; + + char r_str[3] = { hex_str[0], hex_str[1], '\0' }; + char g_str[3] = { hex_str[2], hex_str[3], '\0' }; + char b_str[3] = { hex_str[4], hex_str[5], '\0' }; + + int r = strtol(r_str, NULL, 16); + int g = strtol(g_str, NULL, 16); + int b = strtol(b_str, NULL, 16); + + rgba_out[0] = r / 255.0f; + rgba_out[1] = g / 255.0f; + rgba_out[2] = b / 255.0f; + rgba_out[3] = 1.0f; + + return true; +} + +void compositor_init(struct compositor_state *state) { + state->display = wl_display_create(); + struct wl_event_loop *loop = wl_display_get_event_loop(state->display); + + state->backend = wlr_backend_autocreate(loop, NULL); + state->renderer = wlr_renderer_autocreate(state->backend); + state->allocator = wlr_allocator_autocreate(state->backend, state->renderer); + state->layout = wlr_output_layout_create(state->display); + state->scene = wlr_scene_create(); + + // Add headless output if applicable (nested testing) + if (wlr_backend_is_headless(state->backend)) { + struct wlr_output *headless_output = wlr_headless_add_output(state->backend, 800, 600); + if (!headless_output) { + wlr_log(WLR_ERROR, "Failed to create headless output"); + } else { + struct wlr_output_state pending; + memset(&pending, 0, sizeof(pending)); + pending.committed = WLR_OUTPUT_STATE_ENABLED | WLR_OUTPUT_STATE_MODE; + pending.enabled = true; + pending.mode_type = WLR_OUTPUT_STATE_MODE_CUSTOM; + pending.custom_mode.width = 800; + pending.custom_mode.height = 600; + pending.custom_mode.refresh = 60000; + + if (!wlr_output_commit_state(headless_output, &pending)) { + wlr_log(WLR_ERROR, "Failed to commit headless output state"); + } + } + } + + wlr_compositor_create(state->display, 4, state->renderer); + wlr_data_device_manager_create(state->display); + + wl_signal_add(&state->backend->events.new_output, &state->new_output); + state->new_output.notify = handle_new_output; +} + +void handle_new_output(struct wl_listener *listener, void *data) { + struct compositor_state *state = wl_container_of(listener, state, new_output); + struct wlr_output *output = data; + + if (!wl_list_empty(&output->modes)) { + struct wlr_output_mode *mode = wl_container_of(output->modes.next, mode, link); + + struct wlr_output_state pending; + memset(&pending, 0, sizeof(pending)); + pending.committed = WLR_OUTPUT_STATE_ENABLED | WLR_OUTPUT_STATE_MODE; + pending.enabled = true; + pending.mode_type = WLR_OUTPUT_STATE_MODE_FIXED; + pending.mode = mode; + + if (!wlr_output_commit_state(output, &pending)) { + wlr_log(WLR_ERROR, "Failed to commit output"); + return; + } + } + + wlr_output_layout_add_auto(state->layout, output); + wlr_scene_output_create(state->scene, output); + renderer_set_background(state->scene, 0x018281); // Hex color +} diff --git a/src/compositor.o b/src/compositor.o new file mode 100644 index 0000000000000000000000000000000000000000..03ab5254fd7f1df2b810d1b06355ed40bb3c2921 GIT binary patch literal 23472 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

e3UUnHCp|N_~qaAk1)5`caHX7Zm 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 literal 0 HcmV?d00001 diff --git a/src/input.c b/src/input.c new file mode 100644 index 0000000..e69de29 diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..242c13f --- /dev/null +++ b/src/main.c @@ -0,0 +1,17 @@ +#include +#include + +int main() { + struct compositor_state state = {0}; + compositor_init(&state); + + if (!wlr_backend_start(state.backend)) { + wlr_log(WLR_ERROR, "Failed to start backend"); + return 1; + } + + wlr_log(WLR_INFO, "Panes compositor running..."); + wl_display_run(state.display); + wl_display_destroy(state.display); + return 0; +} diff --git a/src/main.o b/src/main.o new file mode 100644 index 0000000000000000000000000000000000000000..ff8ce7a34a151476179dfa0f0841adc0ad183d77 GIT binary patch literal 10856 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 literal 0 HcmV?d00001 diff --git a/src/renderer.c b/src/renderer.c new file mode 100644 index 0000000..e088314 --- /dev/null +++ b/src/renderer.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void renderer_set_background(struct wlr_scene *scene, uint32_t hex_color) { + float rgba[4]; + rgba[0] = ((hex_color >> 16) & 0xFF) / 255.0f; + rgba[1] = ((hex_color >> 8) & 0xFF) / 255.0f; + rgba[2] = ( hex_color & 0xFF) / 255.0f; + rgba[3] = 1.0f; + + struct wlr_scene_rect *rect = wlr_scene_rect_create(&scene->tree, 1, 1, rgba); + wlr_scene_node_lower_to_bottom(&rect->node); +} diff --git a/src/renderer.o b/src/renderer.o new file mode 100644 index 0000000000000000000000000000000000000000..2c8e0b34deee522066ada9a0bdd05dcb3e541b88 GIT binary patch literal 8576 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