diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/sway/config.h | 27 | ||||
-rw-r--r-- | include/sway/input/input-manager.h | 23 | ||||
-rw-r--r-- | include/sway/input/seat.h | 37 | ||||
-rw-r--r-- | include/sway/output.h | 3 | ||||
-rw-r--r-- | include/sway/tree/container.h | 76 | ||||
-rw-r--r-- | include/sway/tree/layout.h | 26 | ||||
-rw-r--r-- | include/sway/tree/view.h | 59 | ||||
-rw-r--r-- | include/swaybar/ipc.h | 2 | ||||
-rw-r--r-- | include/swaybar/status_line.h | 53 |
9 files changed, 234 insertions, 72 deletions
diff --git a/include/sway/config.h b/include/sway/config.h index 03b51948..91f772b5 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -377,6 +377,7 @@ void free_config(struct sway_config *config); void config_clear_handler_context(struct sway_config *config); void free_sway_variable(struct sway_variable *var); + /** * Does variable replacement for a string based on the config's currently loaded variables. */ @@ -385,44 +386,68 @@ char *do_var_replacement(char *str); struct cmd_results *check_security_config(); int input_identifier_cmp(const void *item, const void *data); + struct input_config *new_input_config(const char* identifier); + void merge_input_config(struct input_config *dst, struct input_config *src); + struct input_config *copy_input_config(struct input_config *ic); + void free_input_config(struct input_config *ic); + void apply_input_config(struct input_config *input); int seat_name_cmp(const void *item, const void *data); + struct seat_config *new_seat_config(const char* name); + void merge_seat_config(struct seat_config *dst, struct seat_config *src); + struct seat_config *copy_seat_config(struct seat_config *seat); + void free_seat_config(struct seat_config *ic); + struct seat_attachment_config *seat_attachment_config_new(); + struct seat_attachment_config *seat_config_get_attachment( struct seat_config *seat_config, char *identifier); + void apply_seat_config(struct seat_config *seat); int output_name_cmp(const void *item, const void *data); + void output_get_identifier(char *identifier, size_t len, struct sway_output *output); + struct output_config *new_output_config(const char *name); + void merge_output_config(struct output_config *dst, struct output_config *src); + void apply_output_config(struct output_config *oc, struct sway_container *output); + void free_output_config(struct output_config *oc); int workspace_output_cmp_workspace(const void *a, const void *b); int sway_binding_cmp(const void *a, const void *b); + int sway_binding_cmp_qsort(const void *a, const void *b); + int sway_binding_cmp_keys(const void *a, const void *b); + void free_sway_binding(struct sway_binding *sb); + struct sway_binding *sway_binding_dup(struct sway_binding *sb); -/* Bar stuff */ void load_swaybars(); + void invoke_swaybar(struct bar_config *bar); + void terminate_swaybg(pid_t pid); + struct bar_config *default_bar_config(void); + void free_bar_config(struct bar_config *bar); /* Global config singleton. */ diff --git a/include/sway/input/input-manager.h b/include/sway/input/input-manager.h index c6c73dba..8e39a4a7 100644 --- a/include/sway/input/input-manager.h +++ b/include/sway/input/input-manager.h @@ -14,7 +14,6 @@ extern struct sway_input_manager *input_manager; struct sway_input_device { char *identifier; struct wlr_input_device *wlr_device; - struct input_config *config; struct wl_list link; struct wl_listener device_destroy; }; @@ -27,30 +26,34 @@ struct sway_input_manager { struct wl_listener new_input; }; -struct sway_input_manager *sway_input_manager_create( - struct sway_server *server); +struct sway_input_manager *input_manager_create(struct sway_server *server); -bool sway_input_manager_has_focus(struct sway_input_manager *input, +bool input_manager_has_focus(struct sway_input_manager *input, struct sway_container *container); -void sway_input_manager_set_focus(struct sway_input_manager *input, +void input_manager_set_focus(struct sway_input_manager *input, struct sway_container *container); -void sway_input_manager_configure_xcursor(struct sway_input_manager *input); +void input_manager_configure_xcursor(struct sway_input_manager *input); -void sway_input_manager_apply_input_config(struct sway_input_manager *input, +void input_manager_apply_input_config(struct sway_input_manager *input, struct input_config *input_config); -void sway_input_manager_apply_seat_config(struct sway_input_manager *input, +void input_manager_apply_seat_config(struct sway_input_manager *input, struct seat_config *seat_config); -struct sway_seat *sway_input_manager_get_default_seat( +struct sway_seat *input_manager_get_default_seat( struct sway_input_manager *input); struct sway_seat *input_manager_get_seat(struct sway_input_manager *input, const char *seat_name); -/** Gets the last seat the user interacted with */ +/** + * Gets the last seat the user interacted with + */ struct sway_seat *input_manager_current_seat(struct sway_input_manager *input); +struct input_config *input_device_get_config(struct sway_input_device *device); + + #endif diff --git a/include/sway/input/seat.h b/include/sway/input/seat.h index 31210a5a..137fcd22 100644 --- a/include/sway/input/seat.h +++ b/include/sway/input/seat.h @@ -1,6 +1,7 @@ #ifndef _SWAY_INPUT_SEAT_H #define _SWAY_INPUT_SEAT_H +#include <wlr/types/wlr_layer_shell.h> #include <wlr/types/wlr_seat.h> #include "sway/input/input-manager.h" @@ -8,7 +9,6 @@ struct sway_seat_device { struct sway_seat *sway_seat; struct sway_input_device *input_device; struct sway_keyboard *keyboard; - struct seat_attachment_config *attachment_config; struct wl_list link; // sway_seat::devices }; @@ -23,13 +23,15 @@ struct sway_seat_container { struct sway_seat { struct wlr_seat *wlr_seat; - struct seat_config *config; struct sway_cursor *cursor; struct sway_input_manager *input; bool has_focus; struct wl_list focus_stack; // list of containers in focus order + // If the focused layer is set, views cannot receive keyboard focus + struct wlr_layer_surface *focused_layer; + struct wl_listener focus_destroy; struct wl_listener new_container; @@ -38,28 +40,31 @@ struct sway_seat { struct wl_list link; // input_manager::seats }; -struct sway_seat *sway_seat_create(struct sway_input_manager *input, +struct sway_seat *seat_create(struct sway_input_manager *input, const char *seat_name); -void sway_seat_destroy(struct sway_seat *seat); +void seat_destroy(struct sway_seat *seat); -void sway_seat_add_device(struct sway_seat *seat, +void seat_add_device(struct sway_seat *seat, struct sway_input_device *device); -void sway_seat_configure_device(struct sway_seat *seat, +void seat_configure_device(struct sway_seat *seat, struct sway_input_device *device); -void sway_seat_remove_device(struct sway_seat *seat, +void seat_remove_device(struct sway_seat *seat, struct sway_input_device *device); -void sway_seat_configure_xcursor(struct sway_seat *seat); +void seat_configure_xcursor(struct sway_seat *seat); -void sway_seat_set_focus(struct sway_seat *seat, struct sway_container *container); +void seat_set_focus(struct sway_seat *seat, struct sway_container *container); -void sway_seat_set_focus_warp(struct sway_seat *seat, +void seat_set_focus_warp(struct sway_seat *seat, struct sway_container *container, bool warp); -struct sway_container *sway_seat_get_focus(struct sway_seat *seat); +void seat_set_focus_layer(struct sway_seat *seat, + struct wlr_layer_surface *layer); + +struct sway_container *seat_get_focus(struct sway_seat *seat); /** * Return the last container to be focused for the seat (or the most recently @@ -70,12 +75,14 @@ struct sway_container *sway_seat_get_focus(struct sway_seat *seat); * is destroyed, or focus moves to a container with children and we need to * descend into the next leaf in focus order. */ -struct sway_container *sway_seat_get_focus_inactive(struct sway_seat *seat, +struct sway_container *seat_get_focus_inactive(struct sway_seat *seat, struct sway_container *container); -struct sway_container *sway_seat_get_focus_by_type(struct sway_seat *seat, - enum sway_container_type type); +struct sway_container *seat_get_focus_by_type(struct sway_seat *seat, + struct sway_container *container, enum sway_container_type type); + +void seat_apply_config(struct sway_seat *seat, struct seat_config *seat_config); -void sway_seat_set_config(struct sway_seat *seat, struct seat_config *seat_config); +struct seat_config *seat_get_config(struct sway_seat *seat); #endif diff --git a/include/sway/output.h b/include/sway/output.h index b4980cd8..98d0f83f 100644 --- a/include/sway/output.h +++ b/include/sway/output.h @@ -24,6 +24,7 @@ struct sway_output { struct wl_listener destroy; struct wl_listener mode; struct wl_listener transform; + struct wl_listener scale; struct wl_listener damage_destroy; struct wl_listener damage_frame; @@ -36,4 +37,6 @@ void output_damage_whole(struct sway_output *output); void output_damage_whole_view(struct sway_output *output, struct sway_view *view); +struct sway_container *output_by_name(const char *name); + #endif diff --git a/include/sway/tree/container.h b/include/sway/tree/container.h index 6aa66da0..464f80c4 100644 --- a/include/sway/tree/container.h +++ b/include/sway/tree/container.h @@ -70,9 +70,10 @@ struct sway_container { enum sway_container_layout prev_layout; enum sway_container_layout workspace_layout; - // TODO convert to layout coordinates + // For C_ROOT, this has no meaning + // For C_OUTPUT, this is the output position in layout coordinates + // For other types, this is the position in output-local coordinates double x, y; - // does not include borders or gaps. double width, height; @@ -84,38 +85,67 @@ struct sway_container { struct { struct wl_signal destroy; + // Raised after the tree updates, but before arrange_windows + // Passed the previous parent + struct wl_signal reparent; } events; }; +// TODO make private and use the container-specific create functions +struct sway_container *container_create(enum sway_container_type type); + +const char *container_type_to_str(enum sway_container_type type); + // TODO only one container create function and pass the type? struct sway_container *container_output_create( struct sway_output *sway_output); -struct sway_container *container_workspace_create( - struct sway_container *output, const char *name); +/** + * Create a new container container. A container container can be a a child of + * a workspace container or another container container. + */ +struct sway_container *container_container_create(); -struct sway_container *container_view_create( - struct sway_container *sibling, struct sway_view *sway_view); +/** + * Create a new output. Outputs are children of the root container and have no + * order in the tree structure. + */ +struct sway_container *container_output_create(struct sway_output *sway_output); -struct sway_container *container_output_destroy(struct sway_container *output); +/** + * Create a new workspace container. Workspaces are children of an output + * container and are ordered alphabetically by name. + */ +struct sway_container *container_workspace_create(struct sway_container *output, const char *name); -struct sway_container *container_workspace_destroy( - struct sway_container *workspace); +/* + * Create a new view container. A view can be a child of a workspace container + * or a container container and are rendered in the order and structure of + * how they are attached to the tree. + */ +// TODO view containers should be created in a detached state. +struct sway_container *container_view_create( + struct sway_container *sibling, struct sway_view *sway_view); -struct sway_container *container_view_destroy(struct sway_container *view); +// TODO don't return the parent on destroy +struct sway_container *container_destroy(struct sway_container *container); -struct sway_container *container_destroy(struct sway_container *cont); +struct sway_container *container_workspace_destroy(struct sway_container *container); +struct sway_container *container_output_destroy(struct sway_container *container); +struct sway_container *container_view_destroy(struct sway_container *container); +// TODO move to layout.c struct sway_container *container_set_layout(struct sway_container *container, enum sway_container_layout layout); +// TODO rename to container_descendants_for_each() void container_descendants(struct sway_container *root, enum sway_container_type type, void (*func)(struct sway_container *item, void *data), void *data); /** - * Finds a container based on test criteria. Returns the first container that - * passes the test. + * Search a container's descendants a container based on test criteria. Returns + * the first container that passes the test. */ struct sway_container *container_find(struct sway_container *container, bool (*test)(struct sway_container *view, void *data), void *data); @@ -123,18 +153,21 @@ struct sway_container *container_find(struct sway_container *container, /** * Finds a parent container with the given struct sway_containerype. */ +// TODO rename to container_parent_of_type() struct sway_container *container_parent(struct sway_container *container, enum sway_container_type type); /** - * Find a container at the given coordinates. + * Find a container at the given coordinates. Returns the the surface and + * surface-local coordinates of the given layout coordinates if the container + * is a view and the view contains a surface at those coordinates. */ -struct sway_container *container_at(struct sway_container *parent, +struct sway_container *container_at(struct sway_container *container, double lx, double ly, struct wlr_surface **surface, double *sx, double *sy); /** - * Apply the function for each child of the container breadth first. + * Apply the function for each descendant of the container breadth first. */ void container_for_each_descendant_bfs(struct sway_container *container, void (*f)(struct sway_container *container, void *data), void *data); @@ -145,7 +178,16 @@ void container_for_each_descendant_bfs(struct sway_container *container, void container_for_each_descendant_dfs(struct sway_container *container, void (*f)(struct sway_container *container, void *data), void *data); -bool container_has_anscestor(struct sway_container *descendant, +/** + * Returns true if the given container is an ancestor of this container. + */ +bool container_has_anscestor(struct sway_container *container, struct sway_container *anscestor); +/** + * Returns true if the given container is a child descendant of this container. + */ +bool container_has_child(struct sway_container *con, + struct sway_container *child); + #endif diff --git a/include/sway/tree/layout.h b/include/sway/tree/layout.h index 0a904c4b..8badb244 100644 --- a/include/sway/tree/layout.h +++ b/include/sway/tree/layout.h @@ -11,9 +11,6 @@ enum movement_direction { MOVE_DOWN, MOVE_PARENT, MOVE_CHILD, - MOVE_NEXT, - MOVE_PREV, - MOVE_FIRST }; struct sway_container; @@ -23,7 +20,7 @@ struct sway_root { struct wl_listener output_layout_change; - struct wl_list unmanaged_views; // sway_view::unmanaged_view_link + struct wl_list xwayland_unmanaged; // sway_xwayland_unmanaged::link struct { struct wl_signal new_container; @@ -32,26 +29,43 @@ struct sway_root { void layout_init(void); -void container_add_child(struct sway_container *parent, struct sway_container *child); +// TODO move to tree.h +void container_add_child(struct sway_container *parent, + struct sway_container *child); +// TODO move to tree.h struct sway_container *container_add_sibling(struct sway_container *parent, struct sway_container *child); +// TODO move to tree.h struct sway_container *container_remove_child(struct sway_container *child); +// TODO PRIVATE in tree.h struct sway_container *container_reap_empty(struct sway_container *container); +// TODO move to tree.h void container_move_to(struct sway_container* container, struct sway_container* destination); -enum sway_container_layout container_get_default_layout(struct sway_container *output); +void container_move(struct sway_container *container, + enum movement_direction dir, int move_amt); + +// TODO move to output.c +enum sway_container_layout container_get_default_layout( + struct sway_container *output); +// TODO move to output.c void container_sort_workspaces(struct sway_container *output); void arrange_windows(struct sway_container *container, double width, double height); +// TODO move to container.h struct sway_container *container_get_in_direction(struct sway_container *container, struct sway_seat *seat, enum movement_direction dir); +// TODO move to tree.h +struct sway_container *container_split(struct sway_container *child, + enum sway_container_layout layout); + #endif diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index 3965d2b7..4b84205e 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -4,6 +4,8 @@ #include <wlr/types/wlr_surface.h> #include <wlr/types/wlr_xdg_shell_v6.h> #include <wlr/xwayland.h> +#include "sway/input/input-manager.h" +#include "sway/input/seat.h" struct sway_container; struct sway_view; @@ -37,6 +39,13 @@ struct sway_xwayland_surface { int pending_width, pending_height; }; +struct sway_xwayland_unmanaged { + struct wlr_xwayland_surface *wlr_xwayland_surface; + struct wl_list link; + + struct wl_listener destroy; +}; + struct sway_wl_shell_surface { struct sway_view *view; @@ -64,10 +73,21 @@ enum sway_view_prop { VIEW_PROP_INSTANCE, }; +struct sway_view_impl { + const char *(*get_prop)(struct sway_view *view, + enum sway_view_prop prop); + void (*configure)(struct sway_view *view, double ox, double oy, int width, + int height); + void (*set_activated)(struct sway_view *view, bool activated); + void (*close)(struct sway_view *view); +}; + struct sway_view { enum sway_view_type type; - struct sway_container *swayc; - struct wlr_surface *surface; + const struct sway_view_impl *impl; + + struct sway_container *swayc; // NULL for unmanaged views + struct wlr_surface *surface; // NULL for unmapped views int width, height; union { @@ -82,21 +102,15 @@ struct sway_view { struct sway_wl_shell_surface *sway_wl_shell_surface; }; - struct { - const char *(*get_prop)(struct sway_view *view, - enum sway_view_prop prop); - void (*set_size)(struct sway_view *view, - int width, int height); - void (*set_position)(struct sway_view *view, - double ox, double oy); - void (*set_activated)(struct sway_view *view, bool activated); - void (*close)(struct sway_view *view); - } iface; - // only used for unmanaged views (shell specific) - struct wl_list unmanaged_view_link; // sway_root::unmanaged views + struct wl_list unmanaged_view_link; // sway_root::unmanaged_views }; +struct sway_view *view_create(enum sway_view_type type, + const struct sway_view_impl *impl); + +void view_destroy(struct sway_view *view); + const char *view_get_title(struct sway_view *view); const char *view_get_app_id(struct sway_view *view); @@ -105,18 +119,25 @@ const char *view_get_class(struct sway_view *view); const char *view_get_instance(struct sway_view *view); -void view_set_size(struct sway_view *view, int width, int height); - -void view_set_position(struct sway_view *view, double ox, double oy); +void view_configure(struct sway_view *view, double ox, double oy, int width, + int height); void view_set_activated(struct sway_view *view, bool activated); void view_close(struct sway_view *view); -void view_update_outputs(struct sway_view *view, const struct wlr_box *before); - void view_damage_whole(struct sway_view *view); void view_damage_from(struct sway_view *view); +// view implementation + +void view_map(struct sway_view *view, struct wlr_surface *wlr_surface); + +void view_unmap(struct sway_view *view); + +void view_update_position(struct sway_view *view, double ox, double oy); + +void view_update_size(struct sway_view *view, int width, int height); + #endif diff --git a/include/swaybar/ipc.h b/include/swaybar/ipc.h index 6ea7c4d6..a1696bcf 100644 --- a/include/swaybar/ipc.h +++ b/include/swaybar/ipc.h @@ -4,7 +4,7 @@ #include "swaybar/bar.h" void ipc_initialize(struct swaybar *bar, const char *bar_id); -bool handle_ipc_event(struct swaybar *bar); +bool handle_ipc_readable(struct swaybar *bar); void ipc_get_workspaces(struct swaybar *bar); void ipc_send_workspace_command(struct swaybar *bar, const char *ws); diff --git a/include/swaybar/status_line.h b/include/swaybar/status_line.h index 6c595df0..3538f49c 100644 --- a/include/swaybar/status_line.h +++ b/include/swaybar/status_line.h @@ -7,10 +7,52 @@ enum status_protocol { PROTOCOL_UNDEF, + PROTOCOL_ERROR, PROTOCOL_TEXT, PROTOCOL_I3BAR, }; +struct text_protocol_state { + char *buffer; + size_t buffer_size; +}; + +enum json_node_type { + JSON_NODE_UNKNOWN, + JSON_NODE_ARRAY, + JSON_NODE_STRING, +}; + +struct i3bar_protocol_state { + bool click_events; + char *buffer; + size_t buffer_size; + size_t buffer_index; + const char *current_node; + bool escape; + size_t depth; + enum json_node_type nodes[16]; +}; + +struct i3bar_block { + struct wl_list link; + char *full_text, *short_text, *align; + bool urgent; + uint32_t *color; + int min_width; + char *name, *instance; + bool separator; + int separator_block_width; + bool markup; + // Airblader features + uint32_t background; + uint32_t border; + int border_top; + int border_bottom; + int border_left; + int border_right; +}; + struct status_line { pid_t pid; int read_fd, write_fd; @@ -18,13 +60,18 @@ struct status_line { enum status_protocol protocol; const char *text; + struct wl_list blocks; // i3bar_block::link - char *buffer; - size_t buffer_size; + struct text_protocol_state text_state; + struct i3bar_protocol_state i3bar_state; }; struct status_line *status_line_init(char *cmd); +void status_error(struct status_line *status, const char *text); +bool status_handle_readable(struct status_line *status); void status_line_free(struct status_line *status); -bool handle_status_readable(struct status_line *status); +bool i3bar_handle_readable(struct status_line *status); +void i3bar_block_send_click(struct status_line *status, + struct i3bar_block *block, int x, int y, uint32_t button); #endif |