mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Merge pull request #2049 from RyanDwyer/criteria-shell
Add shell criteria token
This commit is contained in:
		
						commit
						e4c54b04ce
					
				
					 5 changed files with 27 additions and 3 deletions
				
			
		| 
						 | 
					@ -18,6 +18,7 @@ struct criteria {
 | 
				
			||||||
	char *target; // workspace or output name for `assign` criteria
 | 
						char *target; // workspace or output name for `assign` criteria
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pcre *title;
 | 
						pcre *title;
 | 
				
			||||||
 | 
						pcre *shell;
 | 
				
			||||||
	pcre *app_id;
 | 
						pcre *app_id;
 | 
				
			||||||
	pcre *class;
 | 
						pcre *class;
 | 
				
			||||||
	pcre *instance;
 | 
						pcre *instance;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -201,7 +201,7 @@ const char *view_get_window_role(struct sway_view *view);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t view_get_window_type(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,
 | 
					void view_configure(struct sway_view *view, double ox, double oy, int width,
 | 
				
			||||||
	int height);
 | 
						int height);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool criteria_is_empty(struct criteria *criteria) {
 | 
					bool criteria_is_empty(struct criteria *criteria) {
 | 
				
			||||||
	return !criteria->title
 | 
						return !criteria->title
 | 
				
			||||||
 | 
							&& !criteria->shell
 | 
				
			||||||
		&& !criteria->app_id
 | 
							&& !criteria->app_id
 | 
				
			||||||
		&& !criteria->class
 | 
							&& !criteria->class
 | 
				
			||||||
		&& !criteria->instance
 | 
							&& !criteria->instance
 | 
				
			||||||
| 
						 | 
					@ -29,6 +30,7 @@ bool criteria_is_empty(struct criteria *criteria) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void criteria_destroy(struct criteria *criteria) {
 | 
					void criteria_destroy(struct criteria *criteria) {
 | 
				
			||||||
	pcre_free(criteria->title);
 | 
						pcre_free(criteria->title);
 | 
				
			||||||
 | 
						pcre_free(criteria->shell);
 | 
				
			||||||
	pcre_free(criteria->app_id);
 | 
						pcre_free(criteria->app_id);
 | 
				
			||||||
	pcre_free(criteria->class);
 | 
						pcre_free(criteria->class);
 | 
				
			||||||
	pcre_free(criteria->instance);
 | 
						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) {
 | 
						if (criteria->app_id) {
 | 
				
			||||||
		const char *app_id = view_get_app_id(view);
 | 
							const char *app_id = view_get_app_id(view);
 | 
				
			||||||
		if (!app_id || regex_cmp(app_id, criteria->app_id) != 0) {
 | 
							if (!app_id || regex_cmp(app_id, criteria->app_id) != 0) {
 | 
				
			||||||
| 
						 | 
					@ -206,6 +215,7 @@ enum criteria_token {
 | 
				
			||||||
	T_FLOATING,
 | 
						T_FLOATING,
 | 
				
			||||||
	T_ID,
 | 
						T_ID,
 | 
				
			||||||
	T_INSTANCE,
 | 
						T_INSTANCE,
 | 
				
			||||||
 | 
						T_SHELL,
 | 
				
			||||||
	T_TILING,
 | 
						T_TILING,
 | 
				
			||||||
	T_TITLE,
 | 
						T_TITLE,
 | 
				
			||||||
	T_URGENT,
 | 
						T_URGENT,
 | 
				
			||||||
| 
						 | 
					@ -229,6 +239,8 @@ static enum criteria_token token_from_name(char *name) {
 | 
				
			||||||
		return T_ID;
 | 
							return T_ID;
 | 
				
			||||||
	} else if (strcmp(name, "instance") == 0) {
 | 
						} else if (strcmp(name, "instance") == 0) {
 | 
				
			||||||
		return T_INSTANCE;
 | 
							return T_INSTANCE;
 | 
				
			||||||
 | 
						} else if (strcmp(name, "shell") == 0) {
 | 
				
			||||||
 | 
							return T_SHELL;
 | 
				
			||||||
	} else if (strcmp(name, "title") == 0) {
 | 
						} else if (strcmp(name, "title") == 0) {
 | 
				
			||||||
		return T_TITLE;
 | 
							return T_TITLE;
 | 
				
			||||||
	} else if (strcmp(name, "urgent") == 0) {
 | 
						} else if (strcmp(name, "urgent") == 0) {
 | 
				
			||||||
| 
						 | 
					@ -271,6 +283,9 @@ static char *get_focused_prop(enum criteria_token token) {
 | 
				
			||||||
	case T_INSTANCE:
 | 
						case T_INSTANCE:
 | 
				
			||||||
		value = view_get_instance(view);
 | 
							value = view_get_instance(view);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
						case T_SHELL:
 | 
				
			||||||
 | 
							value = view_get_shell(view);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
	case T_TITLE:
 | 
						case T_TITLE:
 | 
				
			||||||
		value = view_get_class(view);
 | 
							value = view_get_class(view);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
| 
						 | 
					@ -332,6 +347,9 @@ static bool parse_token(struct criteria *criteria, char *name, char *value) {
 | 
				
			||||||
	case T_TITLE:
 | 
						case T_TITLE:
 | 
				
			||||||
		generate_regex(&criteria->title, effective_value);
 | 
							generate_regex(&criteria->title, effective_value);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
						case T_SHELL:
 | 
				
			||||||
 | 
							generate_regex(&criteria->shell, effective_value);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
	case T_APP_ID:
 | 
						case T_APP_ID:
 | 
				
			||||||
		generate_regex(&criteria->app_id, effective_value);
 | 
							generate_regex(&criteria->app_id, effective_value);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -551,6 +551,11 @@ The following attributes may be matched with:
 | 
				
			||||||
	value is \_\_focused\_\_, then the window instance must be the same as that
 | 
						value is \_\_focused\_\_, then the window instance must be the same as that
 | 
				
			||||||
	of the currently focused window.
 | 
						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*
 | 
					*tiling*
 | 
				
			||||||
	Matches tiling windows.
 | 
						Matches tiling windows.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,7 +107,7 @@ uint32_t view_get_window_type(struct sway_view *view) {
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char *view_get_type(struct sway_view *view) {
 | 
					const char *view_get_shell(struct sway_view *view) {
 | 
				
			||||||
	switch(view->type) {
 | 
						switch(view->type) {
 | 
				
			||||||
	case SWAY_VIEW_XDG_SHELL_V6:
 | 
						case SWAY_VIEW_XDG_SHELL_V6:
 | 
				
			||||||
		return "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 *app_id = view_get_app_id(view);
 | 
				
			||||||
	const char *class = view_get_class(view);
 | 
						const char *class = view_get_class(view);
 | 
				
			||||||
	const char *instance = view_get_instance(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 title_len = title ? strlen(title) : 0;
 | 
				
			||||||
	size_t app_id_len = app_id ? strlen(app_id) : 0;
 | 
						size_t app_id_len = app_id ? strlen(app_id) : 0;
 | 
				
			||||||
	size_t class_len = class ? strlen(class) : 0;
 | 
						size_t class_len = class ? strlen(class) : 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue