Merge pull request #2564 from ppascher/master

Fix window_type with disabled xwayland support
This commit is contained in:
Drew DeVault 2018-09-03 11:04:03 -04:00 committed by GitHub
commit 0b61bae8fb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 64 additions and 58 deletions

View file

@ -23,15 +23,15 @@ struct criteria {
pcre *title; pcre *title;
pcre *shell; pcre *shell;
pcre *app_id; pcre *app_id;
pcre *class;
pcre *instance;
pcre *con_mark; pcre *con_mark;
uint32_t con_id; // internal ID uint32_t con_id; // internal ID
#ifdef HAVE_XWAYLAND #ifdef HAVE_XWAYLAND
pcre *class;
uint32_t id; // X11 window ID uint32_t id; // X11 window ID
#endif pcre *instance;
pcre *window_role; pcre *window_role;
enum atom_name window_type; enum atom_name window_type;
#endif
bool floating; bool floating;
bool tiling; bool tiling;
char urgent; // 'l' for latest or 'o' for oldest char urgent; // 'l' for latest or 'o' for oldest

View file

@ -18,15 +18,15 @@ bool criteria_is_empty(struct criteria *criteria) {
return !criteria->title return !criteria->title
&& !criteria->shell && !criteria->shell
&& !criteria->app_id && !criteria->app_id
&& !criteria->class
&& !criteria->instance
&& !criteria->con_mark && !criteria->con_mark
&& !criteria->con_id && !criteria->con_id
#ifdef HAVE_XWAYLAND #ifdef HAVE_XWAYLAND
&& !criteria->class
&& !criteria->id && !criteria->id
#endif && !criteria->instance
&& !criteria->window_role && !criteria->window_role
&& criteria->window_type == ATOM_LAST && criteria->window_type == ATOM_LAST
#endif
&& !criteria->floating && !criteria->floating
&& !criteria->tiling && !criteria->tiling
&& !criteria->urgent && !criteria->urgent
@ -37,10 +37,12 @@ void criteria_destroy(struct criteria *criteria) {
pcre_free(criteria->title); pcre_free(criteria->title);
pcre_free(criteria->shell); pcre_free(criteria->shell);
pcre_free(criteria->app_id); pcre_free(criteria->app_id);
#ifdef HAVE_XWAYLAND
pcre_free(criteria->class); pcre_free(criteria->class);
pcre_free(criteria->instance); pcre_free(criteria->instance);
pcre_free(criteria->con_mark);
pcre_free(criteria->window_role); pcre_free(criteria->window_role);
#endif
pcre_free(criteria->con_mark);
free(criteria->workspace); free(criteria->workspace);
free(criteria->cmdlist); free(criteria->cmdlist);
free(criteria->raw); free(criteria->raw);
@ -51,8 +53,8 @@ static int regex_cmp(const char *item, const pcre *regex) {
return pcre_exec(regex, NULL, item, strlen(item), 0, 0, NULL, 0); return pcre_exec(regex, NULL, item, strlen(item), 0, 0, NULL, 0);
} }
static bool view_has_window_type(struct sway_view *view, enum atom_name name) {
#ifdef HAVE_XWAYLAND #ifdef HAVE_XWAYLAND
static bool view_has_window_type(struct sway_view *view, enum atom_name name) {
if (view->type != SWAY_VIEW_XWAYLAND) { if (view->type != SWAY_VIEW_XWAYLAND) {
return false; return false;
} }
@ -64,9 +66,9 @@ static bool view_has_window_type(struct sway_view *view, enum atom_name name) {
return true; return true;
} }
} }
#endif
return false; return false;
} }
#endif
static int cmp_urgent(const void *_a, const void *_b) { static int cmp_urgent(const void *_a, const void *_b) {
struct sway_view *a = *(void **)_a; struct sway_view *a = *(void **)_a;
@ -115,21 +117,7 @@ static bool criteria_matches_view(struct criteria *criteria,
return false; return false;
} }
} }
if (criteria->class) {
const char *class = view_get_class(view);
if (!class || regex_cmp(class, criteria->class) != 0) {
return false;
}
}
if (criteria->instance) {
const char *instance = view_get_instance(view);
if (!instance || regex_cmp(instance, criteria->instance) != 0) {
return false;
}
}
if (criteria->con_mark) { if (criteria->con_mark) {
bool exists = false; bool exists = false;
for (int i = 0; i < view->marks->length; ++i) { for (int i = 0; i < view->marks->length; ++i) {
@ -156,7 +144,20 @@ static bool criteria_matches_view(struct criteria *criteria,
return false; return false;
} }
} }
#endif
if (criteria->class) {
const char *class = view_get_class(view);
if (!class || regex_cmp(class, criteria->class) != 0) {
return false;
}
}
if (criteria->instance) {
const char *instance = view_get_instance(view);
if (!instance || regex_cmp(instance, criteria->instance) != 0) {
return false;
}
}
if (criteria->window_role) { if (criteria->window_role) {
// TODO // TODO
@ -167,6 +168,7 @@ static bool criteria_matches_view(struct criteria *criteria,
return false; return false;
} }
} }
#endif
if (criteria->floating) { if (criteria->floating) {
if (!container_is_floating(view->swayc)) { if (!container_is_floating(view->swayc)) {
@ -271,6 +273,7 @@ static bool generate_regex(pcre **regex, char *value) {
return true; return true;
} }
#ifdef HAVE_XWAYLAND
static enum atom_name parse_window_type(const char *type) { static enum atom_name parse_window_type(const char *type) {
if (strcasecmp(type, "normal") == 0) { if (strcasecmp(type, "normal") == 0) {
return NET_WM_WINDOW_TYPE_NORMAL; return NET_WM_WINDOW_TYPE_NORMAL;
@ -285,23 +288,24 @@ static enum atom_name parse_window_type(const char *type) {
} }
return ATOM_LAST; // ie. invalid return ATOM_LAST; // ie. invalid
} }
#endif
enum criteria_token { enum criteria_token {
T_APP_ID, T_APP_ID,
T_CLASS,
T_CON_ID, T_CON_ID,
T_CON_MARK, T_CON_MARK,
T_FLOATING, T_FLOATING,
#ifdef HAVE_XWAYLAND #ifdef HAVE_XWAYLAND
T_CLASS,
T_ID, T_ID,
#endif
T_INSTANCE, T_INSTANCE,
T_WINDOW_ROLE,
T_WINDOW_TYPE,
#endif
T_SHELL, T_SHELL,
T_TILING, T_TILING,
T_TITLE, T_TITLE,
T_URGENT, T_URGENT,
T_WINDOW_ROLE,
T_WINDOW_TYPE,
T_WORKSPACE, T_WORKSPACE,
T_INVALID, T_INVALID,
@ -310,28 +314,28 @@ enum criteria_token {
static enum criteria_token token_from_name(char *name) { static enum criteria_token token_from_name(char *name) {
if (strcmp(name, "app_id") == 0) { if (strcmp(name, "app_id") == 0) {
return T_APP_ID; return T_APP_ID;
} else if (strcmp(name, "class") == 0) {
return T_CLASS;
} else if (strcmp(name, "con_id") == 0) { } else if (strcmp(name, "con_id") == 0) {
return T_CON_ID; return T_CON_ID;
} else if (strcmp(name, "con_mark") == 0) { } else if (strcmp(name, "con_mark") == 0) {
return T_CON_MARK; return T_CON_MARK;
#ifdef HAVE_XWAYLAND #ifdef HAVE_XWAYLAND
} else if (strcmp(name, "class") == 0) {
return T_CLASS;
} else if (strcmp(name, "id") == 0) { } else if (strcmp(name, "id") == 0) {
return T_ID; return T_ID;
#endif
} else if (strcmp(name, "instance") == 0) { } else if (strcmp(name, "instance") == 0) {
return T_INSTANCE; return T_INSTANCE;
} else if (strcmp(name, "window_role") == 0) {
return T_WINDOW_ROLE;
} else if (strcmp(name, "window_type") == 0) {
return T_WINDOW_TYPE;
#endif
} else if (strcmp(name, "shell") == 0) { } else if (strcmp(name, "shell") == 0) {
return T_SHELL; 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) {
return T_URGENT; return T_URGENT;
} else if (strcmp(name, "window_role") == 0) {
return T_WINDOW_ROLE;
} else if (strcmp(name, "window_type") == 0) {
return T_WINDOW_TYPE;
} else if (strcmp(name, "workspace") == 0) { } else if (strcmp(name, "workspace") == 0) {
return T_WORKSPACE; return T_WORKSPACE;
} }
@ -360,21 +364,12 @@ static char *get_focused_prop(enum criteria_token token) {
case T_APP_ID: case T_APP_ID:
value = view_get_app_id(view); value = view_get_app_id(view);
break; break;
case T_CLASS:
value = view_get_class(view);
break;
case T_INSTANCE:
value = view_get_instance(view);
break;
case T_SHELL: case T_SHELL:
value = view_get_shell(view); value = view_get_shell(view);
break; break;
case T_TITLE: case T_TITLE:
value = view_get_class(view); value = view_get_class(view);
break; break;
case T_WINDOW_ROLE:
value = view_get_class(view);
break;
case T_WORKSPACE: case T_WORKSPACE:
{ {
struct sway_container *ws = container_parent(focus, C_WORKSPACE); struct sway_container *ws = container_parent(focus, C_WORKSPACE);
@ -396,11 +391,20 @@ static char *get_focused_prop(enum criteria_token token) {
case T_CON_MARK: // These do not support __focused__ case T_CON_MARK: // These do not support __focused__
case T_FLOATING: case T_FLOATING:
#ifdef HAVE_XWAYLAND #ifdef HAVE_XWAYLAND
case T_CLASS:
value = view_get_class(view);
break;
case T_ID: case T_ID:
case T_INSTANCE:
value = view_get_instance(view);
break;
case T_WINDOW_ROLE:
value = view_get_class(view);
break;
case T_WINDOW_TYPE:
#endif #endif
case T_TILING: case T_TILING:
case T_URGENT: case T_URGENT:
case T_WINDOW_TYPE:
case T_INVALID: case T_INVALID:
break; break;
} }
@ -447,12 +451,6 @@ static bool parse_token(struct criteria *criteria, char *name, char *value) {
case T_APP_ID: case T_APP_ID:
generate_regex(&criteria->app_id, effective_value); generate_regex(&criteria->app_id, effective_value);
break; break;
case T_CLASS:
generate_regex(&criteria->class, effective_value);
break;
case T_INSTANCE:
generate_regex(&criteria->instance, effective_value);
break;
case T_CON_ID: case T_CON_ID:
criteria->con_id = strtoul(effective_value, &endptr, 10); criteria->con_id = strtoul(effective_value, &endptr, 10);
if (*endptr != 0) { if (*endptr != 0) {
@ -462,19 +460,25 @@ static bool parse_token(struct criteria *criteria, char *name, char *value) {
case T_CON_MARK: case T_CON_MARK:
generate_regex(&criteria->con_mark, effective_value); generate_regex(&criteria->con_mark, effective_value);
break; break;
case T_WINDOW_ROLE:
generate_regex(&criteria->window_role, effective_value);
break;
case T_WINDOW_TYPE:
criteria->window_type = parse_window_type(effective_value);
break;
#ifdef HAVE_XWAYLAND #ifdef HAVE_XWAYLAND
case T_CLASS:
generate_regex(&criteria->class, effective_value);
break;
case T_ID: case T_ID:
criteria->id = strtoul(effective_value, &endptr, 10); criteria->id = strtoul(effective_value, &endptr, 10);
if (*endptr != 0) { if (*endptr != 0) {
error = strdup("The value for 'id' should be numeric"); error = strdup("The value for 'id' should be numeric");
} }
break; break;
case T_INSTANCE:
generate_regex(&criteria->instance, effective_value);
break;
case T_WINDOW_ROLE:
generate_regex(&criteria->window_role, effective_value);
break;
case T_WINDOW_TYPE:
criteria->window_type = parse_window_type(effective_value);
break;
#endif #endif
case T_FLOATING: case T_FLOATING:
criteria->floating = true; criteria->floating = true;
@ -559,7 +563,9 @@ struct criteria *criteria_parse(char *raw, char **error_arg) {
++head; ++head;
struct criteria *criteria = calloc(1, sizeof(struct criteria)); struct criteria *criteria = calloc(1, sizeof(struct criteria));
#ifdef HAVE_XWAYLAND
criteria->window_type = ATOM_LAST; // default value criteria->window_type = ATOM_LAST; // default value
#endif
char *name = NULL, *value = NULL; char *name = NULL, *value = NULL;
bool in_quotes = false; bool in_quotes = false;