diff options
| -rw-r--r-- | include/sway/criteria.h | 1 | ||||
| -rw-r--r-- | include/sway/tree/view.h | 2 | ||||
| -rw-r--r-- | sway/criteria.c | 18 | ||||
| -rw-r--r-- | sway/sway.5.scd | 5 | ||||
| -rw-r--r-- | sway/tree/view.c | 4 | 
5 files changed, 27 insertions, 3 deletions
diff --git a/include/sway/criteria.h b/include/sway/criteria.h index 74da132c..bd3ca0ac 100644 --- a/include/sway/criteria.h +++ b/include/sway/criteria.h @@ -18,6 +18,7 @@ struct criteria {  	char *target; // workspace or output name for `assign` criteria  	pcre *title; +	pcre *shell;  	pcre *app_id;  	pcre *class;  	pcre *instance; diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index 0fb8f1b3..a8bf4955 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -201,7 +201,7 @@ 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); +const char *view_get_shell(struct sway_view *view);  void view_configure(struct sway_view *view, double ox, double oy, int width,  	int height); diff --git a/sway/criteria.c b/sway/criteria.c index 4295cacc..dec5fed7 100644 --- a/sway/criteria.c +++ b/sway/criteria.c @@ -13,6 +13,7 @@  bool criteria_is_empty(struct criteria *criteria) {  	return !criteria->title +		&& !criteria->shell  		&& !criteria->app_id  		&& !criteria->class  		&& !criteria->instance @@ -29,6 +30,7 @@ bool criteria_is_empty(struct criteria *criteria) {  void criteria_destroy(struct criteria *criteria) {  	pcre_free(criteria->title); +	pcre_free(criteria->shell);  	pcre_free(criteria->app_id);  	pcre_free(criteria->class);  	pcre_free(criteria->instance); @@ -53,6 +55,13 @@ static bool criteria_matches_view(struct criteria *criteria,  		}  	} +	if (criteria->shell) { +		const char *shell = view_get_shell(view); +		if (!shell || regex_cmp(shell, criteria->shell) != 0) { +			return false; +		} +	} +  	if (criteria->app_id) {  		const char *app_id = view_get_app_id(view);  		if (!app_id || regex_cmp(app_id, criteria->app_id) != 0) { @@ -206,6 +215,7 @@ enum criteria_token {  	T_FLOATING,  	T_ID,  	T_INSTANCE, +	T_SHELL,  	T_TILING,  	T_TITLE,  	T_URGENT, @@ -229,6 +239,8 @@ static enum criteria_token token_from_name(char *name) {  		return T_ID;  	} else if (strcmp(name, "instance") == 0) {  		return T_INSTANCE; +	} else if (strcmp(name, "shell") == 0) { +		return T_SHELL;  	} else if (strcmp(name, "title") == 0) {  		return T_TITLE;  	} else if (strcmp(name, "urgent") == 0) { @@ -271,6 +283,9 @@ static char *get_focused_prop(enum criteria_token token) {  	case T_INSTANCE:  		value = view_get_instance(view);  		break; +	case T_SHELL: +		value = view_get_shell(view); +		break;  	case T_TITLE:  		value = view_get_class(view);  		break; @@ -332,6 +347,9 @@ static bool parse_token(struct criteria *criteria, char *name, char *value) {  	case T_TITLE:  		generate_regex(&criteria->title, effective_value);  		break; +	case T_SHELL: +		generate_regex(&criteria->shell, effective_value); +		break;  	case T_APP_ID:  		generate_regex(&criteria->app_id, effective_value);  		break; diff --git a/sway/sway.5.scd b/sway/sway.5.scd index ff138562..8d1cb8a1 100644 --- a/sway/sway.5.scd +++ b/sway/sway.5.scd @@ -551,6 +551,11 @@ The following attributes may be matched with:  	value is \_\_focused\_\_, then the window instance must be the same as that  	of the currently focused window. +*shell* +	Compare value against the window shell, such as "xdg\_shell" or "xwayland". +	Can be a regular expression. If value is \_\_focused\_\_, then the shell +	must be the same as that of the currently focused window. +  *tiling*  	Matches tiling windows. diff --git a/sway/tree/view.c b/sway/tree/view.c index d72a2235..d91182ed 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -107,7 +107,7 @@ uint32_t view_get_window_type(struct sway_view *view) {  	return 0;  } -const char *view_get_type(struct sway_view *view) { +const char *view_get_shell(struct sway_view *view) {  	switch(view->type) {  	case SWAY_VIEW_XDG_SHELL_V6:  		return "xdg_shell_v6"; @@ -657,7 +657,7 @@ static size_t parse_title_format(struct sway_view *view, char *buffer) {  	const char *app_id = view_get_app_id(view);  	const char *class = view_get_class(view);  	const char *instance = view_get_instance(view); -	const char *shell = view_get_type(view); +	const char *shell = view_get_shell(view);  	size_t title_len = title ? strlen(title) : 0;  	size_t app_id_len = app_id ? strlen(app_id) : 0;  	size_t class_len = class ? strlen(class) : 0;  | 
