From 88b8c199e3524b7c4e2667db3683c77d70f34a26 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Wed, 29 Sep 2021 10:53:41 -0700 Subject: feat(wm): working prototype --- sys/cmd/wm/main.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 8 deletions(-) (limited to 'sys/cmd/wm/main.c') diff --git a/sys/cmd/wm/main.c b/sys/cmd/wm/main.c index dac0aa3..3dd9903 100644 --- a/sys/cmd/wm/main.c +++ b/sys/cmd/wm/main.c @@ -3,7 +3,7 @@ Server server = { .event = { .make_input = { .notify = make_input }, - .make_output = { .notify = make_output }, + .make_monitor = { .notify = make_monitor }, .make_xdg_surface = { .notify = make_xdg_surface }, .cursor_move = { .notify = cursor_move }, @@ -27,26 +27,42 @@ init_compositor(void) server.display = wl_display_create(); server.backend = wlr_backend_autocreate(server.display); server.renderer = wlr_backend_get_renderer(server.backend); + server.present = wlr_presentation_create(server.display, server.backend); wlr_renderer_init_wl_display(server.renderer, server.display); wlr_compositor_create(server.display, server.renderer); + wlr_export_dmabuf_manager_v1_create(server.display); + wlr_screencopy_manager_v1_create(server.display); + wlr_data_control_manager_v1_create(server.display); wlr_data_device_manager_create(server.display); + wlr_gamma_control_manager_v1_create(server.display); + wlr_primary_selection_v1_device_manager_create(server.display); + wlr_viewporter_create(server.display); - server.output.layout = wlr_output_layout_create(); + wlr_data_device_manager_create(server.display); + + server.monitor.layout = wlr_output_layout_create(); - wl_list_init(&server.output.list); - wl_signal_add(&server.backend->events.new_output, &server.event.make_output); + wl_list_init(&server.monitor.list); + wl_signal_add(&server.backend->events.new_output, &server.event.make_monitor); } static inline void -init_desktop(void) +init_shells(void) { wl_list_init(&server.clients); + wl_list_init(&server.stack); server.shell.xdg = wlr_xdg_shell_create(server.display); wl_signal_add(&server.shell.xdg->events.new_surface, &server.event.make_xdg_surface); + + wlr_server_decoration_manager_set_default_mode( + wlr_server_decoration_manager_create(server.display), + WLR_SERVER_DECORATION_MANAGER_MODE_SERVER + ); + wlr_xdg_decoration_manager_v1_create(server.display); } static inline @@ -54,7 +70,7 @@ void init_inputs(void) { server.cursor.dot = wlr_cursor_create(); - wlr_cursor_attach_output_layout(server.cursor.dot, server.output.layout); + wlr_cursor_attach_output_layout(server.cursor.dot, server.monitor.layout); server.cursor.manager = wlr_xcursor_manager_create(nil, 24); wlr_xcursor_manager_load(server.cursor.manager, 1); @@ -79,21 +95,46 @@ void cleanup(void) { wl_display_destroy_clients(server.display); + + wlr_backend_destroy(server.backend); + wlr_xcursor_manager_destroy(server.cursor.manager); + wlr_output_layout_destroy(server.monitor.layout); + wlr_seat_destroy(server.input.seat); + wl_display_destroy(server.display); } // ----------------------------------------------------------------------- // main point of entry +int +usage(void) +{ + fprintf(stderr, "usage: %s [-s startup command]\n", argv0); + return 1; +} + + int main(int argc, char *argv[]) { - char *socket; + char *socket, *cmd=nil; + + ARGBEGIN { + case 's': + cmd = ARGF(); + break; + default: + return usage(); + } ARGEND + + if(argc != 0) + return usage(); wlr_log_init(WLR_DEBUG, nil); init_compositor(); - init_desktop(); + init_shells(); init_inputs(); if(!(socket=(char*)wl_display_add_socket_auto(server.display))) { @@ -108,6 +149,10 @@ main(int argc, char *argv[]) } setenv("WAYLAND_DISPLAY", socket, true); + if(cmd) { + if(fork()==0) + execl("/bin/sh", "/bin/sh", "-c", cmd, nil); + } wlr_log(WLR_INFO, "Running Wayland compositor on WAYLAND_DISPLAY=%s", socket); wl_display_run(server.display); /* event loop */ -- cgit v1.2.1