diff --git a/include/sway/server.h b/include/sway/server.h index 9202cb562..ab4caac62 100644 --- a/include/sway/server.h +++ b/include/sway/server.h @@ -1,10 +1,10 @@ #ifndef _SWAY_SERVER_H #define _SWAY_SERVER_H -#include -#include #include "config.h" #include "list.h" #include "sway/desktop/idle_inhibit_v1.h" +#include +#include #if WLR_HAS_XWAYLAND #include "sway/xwayland.h" #endif @@ -16,153 +16,163 @@ struct sway_transaction; struct sway_session_lock { - struct wlr_session_lock_v1 *lock; - struct wlr_surface *focused; - bool abandoned; + struct wlr_session_lock_v1 *lock; + struct wlr_surface *focused; + bool abandoned; - struct wl_list outputs; // struct sway_session_lock_output + struct wl_list outputs; // struct sway_session_lock_output - // invalid if the session is abandoned - struct wl_listener new_surface; - struct wl_listener unlock; - struct wl_listener destroy; + // invalid if the session is abandoned + struct wl_listener new_surface; + struct wl_listener unlock; + struct wl_listener destroy; }; +#if HAVE_LIBSFDO +struct sfdo { + struct sfdo_desktop_ctx *desktop_ctx; + struct sfdo_icon_ctx *icon_ctx; + struct sfdo_desktop_db *desktop_db; + struct sfdo_icon_theme *icon_theme; +}; +#endif + struct sway_server { - struct wl_display *wl_display; - struct wl_event_loop *wl_event_loop; - char *socket; + struct wl_display *wl_display; + struct wl_event_loop *wl_event_loop; + char *socket; - struct wlr_backend *backend; - struct wlr_session *session; - // secondary headless backend used for creating virtual outputs on-the-fly - struct wlr_backend *headless_backend; - struct wlr_renderer *renderer; - struct wlr_allocator *allocator; + struct wlr_backend *backend; + struct wlr_session *session; + // secondary headless backend used for creating virtual outputs on-the-fly + struct wlr_backend *headless_backend; + struct wlr_renderer *renderer; + struct wlr_allocator *allocator; - struct wlr_compositor *compositor; + struct wlr_compositor *compositor; - struct wlr_linux_dmabuf_v1 *linux_dmabuf_v1; + struct wlr_linux_dmabuf_v1 *linux_dmabuf_v1; - struct wlr_data_device_manager *data_device_manager; + struct wlr_data_device_manager *data_device_manager; - struct sway_input_manager *input; + struct sway_input_manager *input; - struct wl_listener new_output; - struct wl_listener renderer_lost; - struct wl_event_source *recreating_renderer; + struct wl_listener new_output; + struct wl_listener renderer_lost; + struct wl_event_source *recreating_renderer; - struct wlr_idle_notifier_v1 *idle_notifier_v1; - struct sway_idle_inhibit_manager_v1 idle_inhibit_manager_v1; + struct wlr_idle_notifier_v1 *idle_notifier_v1; + struct sway_idle_inhibit_manager_v1 idle_inhibit_manager_v1; - struct wlr_layer_shell_v1 *layer_shell; - struct wl_listener layer_shell_surface; + struct wlr_layer_shell_v1 *layer_shell; + struct wl_listener layer_shell_surface; - struct wlr_xdg_shell *xdg_shell; - struct wl_listener xdg_shell_toplevel; + struct wlr_xdg_shell *xdg_shell; + struct wl_listener xdg_shell_toplevel; - struct wlr_tablet_manager_v2 *tablet_v2; + struct wlr_tablet_manager_v2 *tablet_v2; #if WLR_HAS_XWAYLAND - struct sway_xwayland xwayland; - struct wl_listener xwayland_surface; - struct wl_listener xwayland_ready; + struct sway_xwayland xwayland; + struct wl_listener xwayland_surface; + struct wl_listener xwayland_ready; #endif - struct wlr_relative_pointer_manager_v1 *relative_pointer_manager; + struct wlr_relative_pointer_manager_v1 *relative_pointer_manager; - struct wlr_server_decoration_manager *server_decoration_manager; - struct wl_listener server_decoration; - struct wl_list decorations; // sway_server_decoration::link + struct wlr_server_decoration_manager *server_decoration_manager; + struct wl_listener server_decoration; + struct wl_list decorations; // sway_server_decoration::link - struct wlr_xdg_decoration_manager_v1 *xdg_decoration_manager; - struct wl_listener xdg_decoration; - struct wl_list xdg_decorations; // sway_xdg_decoration::link + struct wlr_xdg_decoration_manager_v1 *xdg_decoration_manager; + struct wl_listener xdg_decoration; + struct wl_list xdg_decorations; // sway_xdg_decoration::link - struct wlr_drm_lease_v1_manager *drm_lease_manager; - struct wl_listener drm_lease_request; + struct wlr_drm_lease_v1_manager *drm_lease_manager; + struct wl_listener drm_lease_request; - struct wlr_pointer_constraints_v1 *pointer_constraints; - struct wl_listener pointer_constraint; + struct wlr_pointer_constraints_v1 *pointer_constraints; + struct wl_listener pointer_constraint; - struct wlr_xdg_output_manager_v1 *xdg_output_manager_v1; + struct wlr_xdg_output_manager_v1 *xdg_output_manager_v1; - struct wlr_output_manager_v1 *output_manager_v1; - struct wl_listener output_manager_apply; - struct wl_listener output_manager_test; + struct wlr_output_manager_v1 *output_manager_v1; + struct wl_listener output_manager_apply; + struct wl_listener output_manager_test; - struct wlr_gamma_control_manager_v1 *gamma_control_manager_v1; - struct wl_listener gamma_control_set_gamma; + struct wlr_gamma_control_manager_v1 *gamma_control_manager_v1; + struct wl_listener gamma_control_set_gamma; - struct { - struct sway_session_lock *lock; - struct wlr_session_lock_manager_v1 *manager; + struct { + struct sway_session_lock *lock; + struct wlr_session_lock_manager_v1 *manager; - struct wl_listener new_lock; - struct wl_listener manager_destroy; - } session_lock; + struct wl_listener new_lock; + struct wl_listener manager_destroy; + } session_lock; - struct wlr_output_power_manager_v1 *output_power_manager_v1; - struct wl_listener output_power_manager_set_mode; - struct wlr_input_method_manager_v2 *input_method; - struct wlr_text_input_manager_v3 *text_input; - struct wlr_ext_foreign_toplevel_list_v1 *foreign_toplevel_list; - struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager; - struct wlr_content_type_manager_v1 *content_type_manager_v1; - struct wlr_data_control_manager_v1 *wlr_data_control_manager_v1; - struct wlr_ext_data_control_manager_v1 *ext_data_control_manager_v1; - struct wlr_screencopy_manager_v1 *screencopy_manager_v1; - struct wlr_ext_image_copy_capture_manager_v1 *ext_image_copy_capture_manager_v1; - struct wlr_export_dmabuf_manager_v1 *export_dmabuf_manager_v1; - struct wlr_security_context_manager_v1 *security_context_manager_v1; + struct wlr_output_power_manager_v1 *output_power_manager_v1; + struct wl_listener output_power_manager_set_mode; + struct wlr_input_method_manager_v2 *input_method; + struct wlr_text_input_manager_v3 *text_input; + struct wlr_ext_foreign_toplevel_list_v1 *foreign_toplevel_list; + struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager; + struct wlr_content_type_manager_v1 *content_type_manager_v1; + struct wlr_data_control_manager_v1 *wlr_data_control_manager_v1; + struct wlr_ext_data_control_manager_v1 *ext_data_control_manager_v1; + struct wlr_screencopy_manager_v1 *screencopy_manager_v1; + struct wlr_ext_image_copy_capture_manager_v1 + *ext_image_copy_capture_manager_v1; + struct wlr_export_dmabuf_manager_v1 *export_dmabuf_manager_v1; + struct wlr_security_context_manager_v1 *security_context_manager_v1; - struct wlr_ext_foreign_toplevel_image_capture_source_manager_v1 *ext_foreign_toplevel_image_capture_source_manager_v1; - struct wl_listener new_foreign_toplevel_capture_request; + struct wlr_ext_foreign_toplevel_image_capture_source_manager_v1 + *ext_foreign_toplevel_image_capture_source_manager_v1; + struct wl_listener new_foreign_toplevel_capture_request; - struct wlr_xdg_activation_v1 *xdg_activation_v1; - struct wl_listener xdg_activation_v1_request_activate; - struct wl_listener xdg_activation_v1_new_token; + struct wlr_xdg_activation_v1 *xdg_activation_v1; + struct wl_listener xdg_activation_v1_request_activate; + struct wl_listener xdg_activation_v1_new_token; - struct wl_listener request_set_cursor_shape; + struct wl_listener request_set_cursor_shape; - struct wlr_tearing_control_manager_v1 *tearing_control_v1; - struct wl_listener tearing_control_new_object; - struct wl_list tearing_controllers; // sway_tearing_controller::link + struct wlr_tearing_control_manager_v1 *tearing_control_v1; + struct wl_listener tearing_control_new_object; + struct wl_list tearing_controllers; // sway_tearing_controller::link - struct wl_list pending_launcher_ctxs; // launcher_ctx::link + struct wl_list pending_launcher_ctxs; // launcher_ctx::link - // The timeout for transactions, after which a transaction is applied - // regardless of readiness. - size_t txn_timeout_ms; + // The timeout for transactions, after which a transaction is applied + // regardless of readiness. + size_t txn_timeout_ms; - // Stores a transaction after it has been committed, but is waiting for - // views to ack the new dimensions before being applied. A queued - // transaction is frozen and must not have new instructions added to it. - struct sway_transaction *queued_transaction; + // Stores a transaction after it has been committed, but is waiting for + // views to ack the new dimensions before being applied. A queued + // transaction is frozen and must not have new instructions added to it. + struct sway_transaction *queued_transaction; - // Stores a pending transaction that will be committed once the existing - // queued transaction is applied and freed. The pending transaction can be - // updated with new instructions as needed. - struct sway_transaction *pending_transaction; + // Stores a pending transaction that will be committed once the existing + // queued transaction is applied and freed. The pending transaction can be + // updated with new instructions as needed. + struct sway_transaction *pending_transaction; - // Stores the nodes that have been marked as "dirty" and will be put into - // the pending transaction. - list_t *dirty_nodes; + // Stores the nodes that have been marked as "dirty" and will be put into + // the pending transaction. + list_t *dirty_nodes; - struct wl_event_source *delayed_modeset; + struct wl_event_source *delayed_modeset; #if HAVE_LIBSFDO - struct sfdo *sfdo; + struct sfdo *sfdo; #endif - }; extern struct sway_server server; struct sway_debug { - bool noatomic; // Ignore atomic layout updates - bool txn_timings; // Log verbose messages about transactions - bool txn_wait; // Always wait for the timeout before applying + bool noatomic; // Ignore atomic layout updates + bool txn_timings; // Log verbose messages about transactions + bool txn_wait; // Always wait for the timeout before applying }; extern struct sway_debug debug; @@ -182,9 +192,9 @@ void handle_idle_inhibitor_v1(struct wl_listener *listener, void *data); void handle_layer_shell_surface(struct wl_listener *listener, void *data); void sway_session_lock_init(void); void sway_session_lock_add_output(struct sway_session_lock *lock, - struct sway_output *output); + struct sway_output *output); bool sway_session_lock_has_surface(struct sway_session_lock *lock, - struct wlr_surface *surface); + struct wlr_surface *surface); void handle_xdg_shell_toplevel(struct wl_listener *listener, void *data); #if WLR_HAS_XWAYLAND void handle_xwayland_surface(struct wl_listener *listener, void *data); @@ -193,12 +203,17 @@ void handle_server_decoration(struct wl_listener *listener, void *data); void handle_xdg_decoration(struct wl_listener *listener, void *data); void handle_pointer_constraint(struct wl_listener *listener, void *data); void xdg_activation_v1_handle_request_activate(struct wl_listener *listener, - void *data); + void *data); void xdg_activation_v1_handle_new_token(struct wl_listener *listener, - void *data); + void *data); void set_rr_scheduling(void); void handle_new_tearing_hint(struct wl_listener *listener, void *data); +#if HAVE_LIBSFDO +struct sfdo *sfdo_create(char *theme); +void sfdo_destroy(struct sfdo *sfdo); +#endif + #endif diff --git a/meson.build b/meson.build index 38fa5c606..f22fa7be2 100644 --- a/meson.build +++ b/meson.build @@ -38,34 +38,6 @@ if is_freebsd add_project_arguments('-D_C11_SOURCE', language: 'c') endif -# Check for (currrently) optional libsfdo -sfdo_basedir = dependency( - 'libsfdo-basedir', - default_options: ['default_library=static', 'examples=false', 'tests=false'], - version: '>=0.1.3', - required: get_option('sfdo'), -) -sfdo_desktop = dependency( - 'libsfdo-desktop', - default_options: ['default_library=static', 'examples=false', 'tests=false'], - version: '>=0.1.3', - required: get_option('sfdo'), -) -sfdo_desktop_file = dependency( - 'libsfdo-desktop-file', - default_options: ['default_library=static', 'examples=false', 'tests=false'], - version: '>=0.1.3', - required: get_option('sfdo'), -) -sfdo_icon = dependency( - 'libsfdo-icon', - default_options: ['default_library=static', 'examples=false', 'tests=false'], - version: '>=0.1.3', - required: get_option('sfdo'), -) -have_libsfdo = sfdo_basedir.found() and sfdo_desktop.found() and sfdo_desktop_file.found() and sfdo_icon.found() - - # Execute the wlroots subproject, if any wlroots_version = ['>=0.20.0', '<0.21.0'] subproject( diff --git a/sway/server.c b/sway/server.c index 89ec6d180..3b77dc88e 100644 --- a/sway/server.c +++ b/sway/server.c @@ -70,7 +70,13 @@ #endif #if HAVE_LIBSFDO +<<<<<<< HEAD #include "sfdo.h" +======= +#include +#include +#include +>>>>>>> 8b3ea59a (Clean up build scaffolding for libsfdo and add the creation and) #endif #define SWAY_XDG_SHELL_VERSION 5 @@ -526,19 +532,25 @@ void server_fini(struct sway_server *server) { wl_list_remove(&server->drm_lease_request.link); } #endif +<<<<<<< HEAD <<<<<<< HEAD wl_list_remove(&server->tearing_control_new_object.link); wl_list_remove(&server->xdg_activation_v1_request_activate.link); wl_list_remove(&server->xdg_activation_v1_new_token.link); wl_list_remove(&server->request_set_cursor_shape.link); input_manager_finish(server->input); ======= +======= +>>>>>>> 8b3ea59a (Clean up build scaffolding for libsfdo and add the creation and) wl_list_remove(&server->tearing_control_new_object.link); wl_list_remove(&server->xdg_activation_v1_request_activate.link); wl_list_remove(&server->xdg_activation_v1_new_token.link); wl_list_remove(&server->request_set_cursor_shape.link); wl_list_remove(&server->new_foreign_toplevel_capture_request.link); input_manager_finish(server->input); +<<<<<<< HEAD >>>>>>> 170c9c95 (Add support for toplevel capture) +======= +>>>>>>> 8b3ea59a (Clean up build scaffolding for libsfdo and add the creation and) // TODO: free sway-specific resources #if WLR_HAS_XWAYLAND @@ -547,6 +559,7 @@ void server_fini(struct sway_server *server) { wl_list_remove(&server->xwayland_ready.link); wlr_xwayland_destroy(server->xwayland.wlr_xwayland); } +<<<<<<< HEAD #endif wl_display_destroy_clients(server->wl_display); wlr_backend_destroy(server->backend); @@ -556,6 +569,18 @@ void server_fini(struct sway_server *server) { sfdo_destroy(server->sfdo); #endif free(server->socket); +======= +#endif + wl_display_destroy_clients(server->wl_display); + wlr_backend_destroy(server->backend); + wl_display_destroy(server->wl_display); + list_free(server->dirty_nodes); + free(server->socket); + +#if HAVE_LIBSFDO + sfdo_destroy(server->sfdo); +#endif +>>>>>>> 8b3ea59a (Clean up build scaffolding for libsfdo and add the creation and) } bool server_start(struct sway_server *server) { @@ -610,3 +635,73 @@ void server_run(struct sway_server *server) { server->socket); wl_display_run(server->wl_display); } + +#if HAVE_LIBSFDO +struct sfdo *sfdo_create(char *theme) { + struct sfdo *sfdo = calloc(1, sizeof(struct sfdo)); + if (!sfdo) { + goto error_calloc; + } + + struct sfdo_basedir_ctx *basedir_ctx = sfdo_basedir_ctx_create(); + if (!basedir_ctx) { + goto error_basedir_ctx; + } + + sfdo->desktop_ctx = sfdo_desktop_ctx_create(basedir_ctx); + if (!sfdo->desktop_ctx) { + goto error_desktop_ctx; + } + + sfdo->icon_ctx = sfdo_icon_ctx_create(basedir_ctx); + if (!sfdo->icon_ctx) { + goto error_icon_ctx; + } + + sfdo->desktop_db = sfdo_desktop_db_load(sfdo->desktop_ctx, NULL); + if (!sfdo->desktop_db) { + goto error_desktop_db; + } + + int load_options = SFDO_ICON_THEME_LOAD_OPTIONS_DEFAULT | + SFDO_ICON_THEME_LOAD_OPTION_ALLOW_MISSING | + SFDO_ICON_THEME_LOAD_OPTION_RELAXED; + + sfdo->icon_theme = sfdo_icon_theme_load(sfdo->icon_ctx, theme, load_options); + if (!sfdo->icon_theme) { + goto error_icon_theme; + } + + sfdo_basedir_ctx_destroy(basedir_ctx); + + sway_log(SWAY_DEBUG, "Successfully setup sfdo"); + return sfdo; + +error_icon_theme: + sfdo_desktop_db_destroy(sfdo->desktop_db); +error_desktop_db: + sfdo_icon_ctx_destroy(sfdo->icon_ctx); +error_icon_ctx: + sfdo_desktop_ctx_destroy(sfdo->desktop_ctx); +error_desktop_ctx: + sfdo_basedir_ctx_destroy(basedir_ctx); +error_basedir_ctx: + free(sfdo); +error_calloc: + sway_log(SWAY_ERROR, "Failed to setup sfdo"); + return NULL; +} + +void sfdo_destroy(struct sfdo *sfdo) { + if (!sfdo) { + sway_log(SWAY_DEBUG, "Null sfdo passed in"); + return; + } + + sfdo_icon_theme_destroy(sfdo->icon_theme); + sfdo_desktop_db_destroy(sfdo->desktop_db); + sfdo_icon_ctx_destroy(sfdo->icon_ctx); + sfdo_desktop_ctx_destroy(sfdo->desktop_ctx); + sway_log(SWAY_DEBUG, "Successfully destroyed sfdo"); +} +#endif