diff options
author | Nicholas Noll <nbnoll@eml.cc> | 2021-09-29 10:53:41 -0700 |
---|---|---|
committer | Nicholas Noll <nbnoll@eml.cc> | 2021-09-29 10:53:41 -0700 |
commit | 88b8c199e3524b7c4e2667db3683c77d70f34a26 (patch) | |
tree | afe6f897edf813e9cf2c9221f3eab3fee935a900 /sys/cmd/wm/main.c | |
parent | b9a07a67b85e9192faa0e285b4419bd5ef242a03 (diff) |
feat(wm): working prototype
Diffstat (limited to 'sys/cmd/wm/main.c')
-rw-r--r-- | sys/cmd/wm/main.c | 61 |
1 files changed, 53 insertions, 8 deletions
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,6 +95,12 @@ 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); } @@ -86,14 +108,33 @@ cleanup(void) // 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 */ |