From 3b0c26d149dfe5e05df338692db8255a01f0998d Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 9 May 2018 14:23:20 +1000 Subject: Overhaul criteria implementation The criteria struct now uses properties for each token type rather than the list_t list of tokens. The reason for this is that different token types have different data types: pcre, string and number to name a few. This solution should be more flexible moving forward. A bonus of this is that criteria is now easier to understand when looking at the struct definition. The criteria parser has been rewritten because the previous one didn't support valueless pairs (eg. [class="foo" floating]). Criteria now has types. Types at the moment are CT_COMMAND, CT_ASSIGN_WORKSPACE and CT_ASSIGN_OUTPUT. i3 uses types as well. Previously the assign command was creating a criteria with 'move to workspace ' as its command, but this caused the window to appear briefly on the focused workspace before being moved to the assigned workspace. It now creates the view directly in the assigned workspace. Each view will only execute a given criteria once. This is achieved by storing a list of executed criteria in the view. This is the same strategy used by i3. Escaping now works properly. Previously you could do things like [class="Fire\"fox"] and the stored value would be 'Fire\"fox', but it should be (and now is) 'Fire"fox'. The public functions in criteria.c are now all prefixed with criteria_. Xwayland views now listen to the set_title, set_class and set_window_type events and criteria will be run when these happen. XDG shell has none of these events so it continues to update the title in handle_commit. Each view type's get_prop function has been split into get_string_prop and get_int_prop because some properties like the X11 window ID and window type are numeric. The following new criteria tokens are now supported: * id (X11 window ID) * instance * tiling * workspace --- include/sway/criteria.h | 73 ++++++++++++++++++++++++++++++------------------ include/sway/tree/view.h | 21 +++++++++++++- 2 files changed, 66 insertions(+), 28 deletions(-) (limited to 'include') diff --git a/include/sway/criteria.h b/include/sway/criteria.h index ec256ddb..74da132c 100644 --- a/include/sway/criteria.h +++ b/include/sway/criteria.h @@ -1,42 +1,61 @@ #ifndef _SWAY_CRITERIA_H #define _SWAY_CRITERIA_H -#include "tree/container.h" +#include #include "list.h" +#include "tree/view.h" -/** - * Maps criteria (as a list of criteria tokens) to a command list. - * - * A list of tokens together represent a single criteria string (e.g. - * '[class="abc" title="xyz"]' becomes two criteria tokens). - * - * for_window: Views matching all criteria will have the bound command list - * executed on them. - * - * Set via `for_window `. - */ -struct criteria { - list_t *tokens; // struct crit_token, contains compiled regex. - char *crit_raw; // entire criteria string (for logging) +enum criteria_type { + CT_COMMAND = 1 << 0, + CT_ASSIGN_OUTPUT = 1 << 1, + CT_ASSIGN_WORKSPACE = 1 << 2, +}; +struct criteria { + enum criteria_type type; + char *raw; // entire criteria string (for logging) char *cmdlist; + char *target; // workspace or output name for `assign` criteria + + pcre *title; + pcre *app_id; + pcre *class; + pcre *instance; + pcre *con_mark; + uint32_t con_id; // internal ID + uint32_t id; // X11 window ID + pcre *window_role; + uint32_t window_type; + bool floating; + bool tiling; + char urgent; // 'l' for latest or 'o' for oldest + char *workspace; }; -int criteria_cmp(const void *item, const void *data); -void free_criteria(struct criteria *crit); +bool criteria_is_empty(struct criteria *criteria); -// Pouplate list with crit_tokens extracted from criteria string, returns error -// string or NULL if successful. -char *extract_crit_tokens(list_t *tokens, const char *criteria); +void criteria_destroy(struct criteria *criteria); -// Returns list of criteria that match given container. These criteria have -// been set with `for_window` commands and have an associated cmdlist. -list_t *criteria_for(struct sway_container *cont); +/** + * Generate a criteria struct from a raw criteria string such as + * [class="foo" instance="bar"] (brackets inclusive). + * + * The error argument is expected to be an address of a null pointer. If an + * error is encountered, the function will return NULL and the pointer will be + * changed to point to the error string. This string should be freed afterwards. + */ +struct criteria *criteria_parse(char *raw, char **error); -// Returns a list of all containers that match the given list of tokens. -list_t *container_for_crit_tokens(list_t *tokens); +/** + * Compile a list of criterias matching the given view. + * + * Criteria types can be bitwise ORed. + */ +list_t *criteria_for_view(struct sway_view *view, enum criteria_type types); -// Returns true if any criteria in the given list matches this container -bool criteria_any(struct sway_container *cont, list_t *criteria); +/** + * Compile a list of views matching the given criteria. + */ +list_t *criteria_get_views(struct criteria *criteria); #endif diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index 4ecd8c44..144ad038 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -20,11 +20,15 @@ enum sway_view_prop { VIEW_PROP_APP_ID, VIEW_PROP_CLASS, VIEW_PROP_INSTANCE, + VIEW_PROP_WINDOW_TYPE, + VIEW_PROP_WINDOW_ROLE, + VIEW_PROP_X11_WINDOW_ID, }; struct sway_view_impl { - const char *(*get_prop)(struct sway_view *view, + const char *(*get_string_prop)(struct sway_view *view, enum sway_view_prop prop); + uint32_t (*get_int_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); @@ -52,6 +56,8 @@ struct sway_view { enum sway_container_border border; int border_thickness; + list_t *executed_criteria; + union { struct wlr_xdg_surface_v6 *wlr_xdg_surface_v6; struct wlr_xwayland_surface *wlr_xwayland_surface; @@ -91,6 +97,9 @@ struct sway_xwayland_view { struct wl_listener request_maximize; struct wl_listener request_configure; struct wl_listener request_fullscreen; + struct wl_listener set_title; + struct wl_listener set_class; + struct wl_listener set_window_type; struct wl_listener map; struct wl_listener unmap; struct wl_listener destroy; @@ -165,6 +174,10 @@ const char *view_get_class(struct sway_view *view); const char *view_get_instance(struct sway_view *view); +uint32_t view_get_x11_window_id(struct sway_view *view); + +uint32_t view_get_window_type(struct sway_view *view); + const char *view_get_type(struct sway_view *view); void view_configure(struct sway_view *view, double ox, double oy, int width, @@ -217,4 +230,10 @@ void view_child_destroy(struct sway_view_child *child); */ void view_update_title(struct sway_view *view, bool force); +/** + * Run any criteria that match the view and haven't been run on this view + * before. + */ +void view_execute_criteria(struct sway_view *view); + #endif -- cgit v1.2.3 From 94e42f985778ce402b4c47bf8c38ee4233b6204d Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 11 May 2018 14:58:24 +1000 Subject: Implement __focused__ criteria --- include/sway/tree/view.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'include') diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index 144ad038..65cadea1 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -176,6 +176,8 @@ const char *view_get_instance(struct sway_view *view); uint32_t view_get_x11_window_id(struct sway_view *view); +const char *view_get_window_role(struct sway_view *view); + uint32_t view_get_window_type(struct sway_view *view); const char *view_get_type(struct sway_view *view); -- cgit v1.2.3 From c72940837c24b5df99c95667befe2e4e5c64575a Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 11 May 2018 23:51:47 +1000 Subject: Implement IPC get_seats command --- include/ipc.h | 1 + include/sway/config.h | 4 +++- include/sway/ipc-json.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/include/ipc.h b/include/ipc.h index 9665a88d..83b3b386 100644 --- a/include/ipc.h +++ b/include/ipc.h @@ -14,6 +14,7 @@ enum ipc_command_type { IPC_GET_VERSION = 7, IPC_GET_INPUTS = 8, IPC_GET_CLIPBOARD = 9, + IPC_GET_SEATS = 10, // Events send from sway to clients. Events have the highest bits set. IPC_EVENT_WORKSPACE = ((1<<31) | 0), IPC_EVENT_OUTPUT = ((1<<31) | 1), diff --git a/include/sway/config.h b/include/sway/config.h index a0e7e81f..b20458cb 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -263,8 +263,10 @@ enum ipc_feature { IPC_FEATURE_EVENT_BINDING = 4096, IPC_FEATURE_EVENT_INPUT = 8192, IPC_FEATURE_GET_CLIPBOARD = 16384, + IPC_FEATURE_GET_SEATS = 32768, - IPC_FEATURE_ALL_COMMANDS = 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 16384, + IPC_FEATURE_ALL_COMMANDS = + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 16384 | 32768, IPC_FEATURE_ALL_EVENTS = 256 | 512 | 1024 | 2048 | 4096 | 8192, IPC_FEATURE_ALL = IPC_FEATURE_ALL_COMMANDS | IPC_FEATURE_ALL_EVENTS, diff --git a/include/sway/ipc-json.h b/include/sway/ipc-json.h index 7d87d377..440e3a24 100644 --- a/include/sway/ipc-json.h +++ b/include/sway/ipc-json.h @@ -9,6 +9,7 @@ json_object *ipc_json_get_version(); json_object *ipc_json_describe_container(struct sway_container *c); json_object *ipc_json_describe_container_recursive(struct sway_container *c); json_object *ipc_json_describe_input(struct sway_input_device *device); +json_object *ipc_json_describe_seat(struct sway_seat *seat); json_object *ipc_json_describe_bar_config(struct bar_config *bar); #endif -- cgit v1.2.3 From 28eb97299e564daee96d3af1f9130d6439f170f6 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 12 May 2018 18:22:21 +1000 Subject: Fix conflicting IPC command type constants with i3's --- include/ipc.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'include') diff --git a/include/ipc.h b/include/ipc.h index 83b3b386..8172c782 100644 --- a/include/ipc.h +++ b/include/ipc.h @@ -4,6 +4,7 @@ #define event_mask(ev) (1 << (ev & 0x7F)) enum ipc_command_type { + // i3 command types - see i3's I3_REPLY_TYPE constants IPC_COMMAND = 0, IPC_GET_WORKSPACES = 1, IPC_SUBSCRIBE = 2, @@ -12,10 +13,13 @@ enum ipc_command_type { IPC_GET_MARKS = 5, IPC_GET_BAR_CONFIG = 6, IPC_GET_VERSION = 7, - IPC_GET_INPUTS = 8, - IPC_GET_CLIPBOARD = 9, - IPC_GET_SEATS = 10, - // Events send from sway to clients. Events have the highest bits set. + + // sway-specific command types + IPC_GET_INPUTS = 100, + IPC_GET_CLIPBOARD = 101, + IPC_GET_SEATS = 102, + + // Events sent from sway to clients. Events have the highest bits set. IPC_EVENT_WORKSPACE = ((1<<31) | 0), IPC_EVENT_OUTPUT = ((1<<31) | 1), IPC_EVENT_MODE = ((1<<31) | 2), -- cgit v1.2.3 From ac0e62584f6101277b76622a7274866cd50f615c Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sat, 12 May 2018 08:52:48 -0400 Subject: Revert "Merge pull request #1953 from RyanDwyer/criteria-focused" This reverts commit 2511adffc29996b64d01d85b3de31de9a2af9096, reversing changes made to 3e1bf721c69cb6df70c3dc3d3d4933e987339676. --- include/sway/tree/view.h | 2 -- 1 file changed, 2 deletions(-) (limited to 'include') diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index 65cadea1..144ad038 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -176,8 +176,6 @@ const char *view_get_instance(struct sway_view *view); uint32_t view_get_x11_window_id(struct sway_view *view); -const char *view_get_window_role(struct sway_view *view); - uint32_t view_get_window_type(struct sway_view *view); const char *view_get_type(struct sway_view *view); -- cgit v1.2.3 From 32a572cecfd0f6072a78ce0a381a2f8365f9010a Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sat, 12 May 2018 08:52:54 -0400 Subject: Revert "Merge pull request #1943 from RyanDwyer/criteria-improvements" This reverts commit 3e1bf721c69cb6df70c3dc3d3d4933e987339676, reversing changes made to 2217518bd554d0f11dafa7ec4e8f35f2e4762fbd. --- include/sway/criteria.h | 73 ++++++++++++++++++------------------------------ include/sway/tree/view.h | 21 +------------- 2 files changed, 28 insertions(+), 66 deletions(-) (limited to 'include') diff --git a/include/sway/criteria.h b/include/sway/criteria.h index 74da132c..ec256ddb 100644 --- a/include/sway/criteria.h +++ b/include/sway/criteria.h @@ -1,61 +1,42 @@ #ifndef _SWAY_CRITERIA_H #define _SWAY_CRITERIA_H -#include +#include "tree/container.h" #include "list.h" -#include "tree/view.h" - -enum criteria_type { - CT_COMMAND = 1 << 0, - CT_ASSIGN_OUTPUT = 1 << 1, - CT_ASSIGN_WORKSPACE = 1 << 2, -}; +/** + * Maps criteria (as a list of criteria tokens) to a command list. + * + * A list of tokens together represent a single criteria string (e.g. + * '[class="abc" title="xyz"]' becomes two criteria tokens). + * + * for_window: Views matching all criteria will have the bound command list + * executed on them. + * + * Set via `for_window `. + */ struct criteria { - enum criteria_type type; - char *raw; // entire criteria string (for logging) + list_t *tokens; // struct crit_token, contains compiled regex. + char *crit_raw; // entire criteria string (for logging) + char *cmdlist; - char *target; // workspace or output name for `assign` criteria - - pcre *title; - pcre *app_id; - pcre *class; - pcre *instance; - pcre *con_mark; - uint32_t con_id; // internal ID - uint32_t id; // X11 window ID - pcre *window_role; - uint32_t window_type; - bool floating; - bool tiling; - char urgent; // 'l' for latest or 'o' for oldest - char *workspace; }; -bool criteria_is_empty(struct criteria *criteria); +int criteria_cmp(const void *item, const void *data); +void free_criteria(struct criteria *crit); -void criteria_destroy(struct criteria *criteria); +// Pouplate list with crit_tokens extracted from criteria string, returns error +// string or NULL if successful. +char *extract_crit_tokens(list_t *tokens, const char *criteria); -/** - * Generate a criteria struct from a raw criteria string such as - * [class="foo" instance="bar"] (brackets inclusive). - * - * The error argument is expected to be an address of a null pointer. If an - * error is encountered, the function will return NULL and the pointer will be - * changed to point to the error string. This string should be freed afterwards. - */ -struct criteria *criteria_parse(char *raw, char **error); +// Returns list of criteria that match given container. These criteria have +// been set with `for_window` commands and have an associated cmdlist. +list_t *criteria_for(struct sway_container *cont); -/** - * Compile a list of criterias matching the given view. - * - * Criteria types can be bitwise ORed. - */ -list_t *criteria_for_view(struct sway_view *view, enum criteria_type types); +// Returns a list of all containers that match the given list of tokens. +list_t *container_for_crit_tokens(list_t *tokens); -/** - * Compile a list of views matching the given criteria. - */ -list_t *criteria_get_views(struct criteria *criteria); +// Returns true if any criteria in the given list matches this container +bool criteria_any(struct sway_container *cont, list_t *criteria); #endif diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index 144ad038..4ecd8c44 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -20,15 +20,11 @@ enum sway_view_prop { VIEW_PROP_APP_ID, VIEW_PROP_CLASS, VIEW_PROP_INSTANCE, - VIEW_PROP_WINDOW_TYPE, - VIEW_PROP_WINDOW_ROLE, - VIEW_PROP_X11_WINDOW_ID, }; struct sway_view_impl { - const char *(*get_string_prop)(struct sway_view *view, + const char *(*get_prop)(struct sway_view *view, enum sway_view_prop prop); - uint32_t (*get_int_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); @@ -56,8 +52,6 @@ struct sway_view { enum sway_container_border border; int border_thickness; - list_t *executed_criteria; - union { struct wlr_xdg_surface_v6 *wlr_xdg_surface_v6; struct wlr_xwayland_surface *wlr_xwayland_surface; @@ -97,9 +91,6 @@ struct sway_xwayland_view { struct wl_listener request_maximize; struct wl_listener request_configure; struct wl_listener request_fullscreen; - struct wl_listener set_title; - struct wl_listener set_class; - struct wl_listener set_window_type; struct wl_listener map; struct wl_listener unmap; struct wl_listener destroy; @@ -174,10 +165,6 @@ const char *view_get_class(struct sway_view *view); const char *view_get_instance(struct sway_view *view); -uint32_t view_get_x11_window_id(struct sway_view *view); - -uint32_t view_get_window_type(struct sway_view *view); - const char *view_get_type(struct sway_view *view); void view_configure(struct sway_view *view, double ox, double oy, int width, @@ -230,10 +217,4 @@ void view_child_destroy(struct sway_view_child *child); */ void view_update_title(struct sway_view *view, bool force); -/** - * Run any criteria that match the view and haven't been run on this view - * before. - */ -void view_execute_criteria(struct sway_view *view); - #endif -- cgit v1.2.3