aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/container.h1
-rw-r--r--sway/border.c4
-rw-r--r--sway/container.c7
-rw-r--r--sway/criteria.c15
-rw-r--r--sway/ipc-json.c2
5 files changed, 25 insertions, 4 deletions
diff --git a/include/sway/container.h b/include/sway/container.h
index ff65628c..46925589 100644
--- a/include/sway/container.h
+++ b/include/sway/container.h
@@ -115,6 +115,7 @@ struct sway_container {
// Attributes that mostly views have.
char *name;
char *class;
+ char *instance;
char *app_id;
// Used by output containers to keep track of swaybg child processes.
diff --git a/sway/border.c b/sway/border.c
index 5ae32d24..d79029a9 100644
--- a/sway/border.c
+++ b/sway/border.c
@@ -254,7 +254,9 @@ static char *generate_container_title(swayc_t *container) {
swayc_t* child = container->children->items[i];
const char *title = NULL;
if (child->type == C_VIEW) {
- title = child->app_id ? child->app_id : (child->class ? child->class : "(null)");
+ title = child->app_id ? child->app_id :
+ (child->instance ? child->instance :
+ (child->class ? child->class :"(null)"));
} else { //child->type == C_CONTAINER
title = generate_container_title(child);
}
diff --git a/sway/container.c b/sway/container.c
index cf7d7dda..11dcdb7f 100644
--- a/sway/container.c
+++ b/sway/container.c
@@ -70,6 +70,9 @@ static void free_swayc(swayc_t *cont) {
if (cont->class) {
free(cont->class);
}
+ if (cont->instance) {
+ free(cont->instance);
+ }
if (cont->app_id) {
free(cont->app_id);
}
@@ -295,6 +298,8 @@ swayc_t *new_view(swayc_t *sibling, wlc_handle handle) {
view->name = title ? strdup(title) : NULL;
const char *class = wlc_view_get_class(handle);
view->class = class ? strdup(class) : NULL;
+ const char *instance = wlc_view_get_instance(handle);
+ view->instance = instance ? strdup(instance) : NULL;
const char *app_id = wlc_view_get_app_id(handle);
view->app_id = app_id ? strdup(app_id) : NULL;
view->visible = true;
@@ -333,6 +338,8 @@ swayc_t *new_floating_view(wlc_handle handle) {
view->name = title ? strdup(title) : NULL;
const char *class = wlc_view_get_class(handle);
view->class = class ? strdup(class) : NULL;
+ const char *instance = wlc_view_get_instance(handle);
+ view->instance = instance ? strdup(instance) : NULL;
const char *app_id = wlc_view_get_app_id(handle);
view->app_id = app_id ? strdup(app_id) : NULL;
view->visible = true;
diff --git a/sway/criteria.c b/sway/criteria.c
index c4fe6ecc..5c305193 100644
--- a/sway/criteria.c
+++ b/sway/criteria.c
@@ -173,9 +173,8 @@ static char *parse_criteria_name(enum criteria_type *type, char *name) {
char *error = malloc(len);
snprintf(error, len, fmt, name);
return error;
- } else if (*type == CRIT_INSTANCE || *type == CRIT_URGENT ||
- *type == CRIT_WINDOW_ROLE || *type == CRIT_WINDOW_TYPE) {
-
+ } else if (*type == CRIT_URGENT || *type == CRIT_WINDOW_ROLE ||
+ *type == CRIT_WINDOW_TYPE) {
// (we're just being helpful here)
const char *fmt = "\"%s\" criteria currently unsupported, "
"no window will match this";
@@ -272,6 +271,16 @@ static bool criteria_test(swayc_t *cont, list_t *tokens) {
}
break;
case CRIT_INSTANCE:
+ if (!cont->instance) {
+ // ignore
+ } else if (strcmp(crit->raw, "focused") == 0) {
+ swayc_t *focused = get_focused_view(&root_container);
+ if (focused->instance && strcmp(cont->instance, focused->instance) == 0) {
+ matches++;
+ }
+ } else if (crit->regex && regexec(crit->regex, cont->instance, 0, NULL, 0) == 0) {
+ matches++;
+ }
break;
case CRIT_TITLE:
if (!cont->name) {
diff --git a/sway/ipc-json.c b/sway/ipc-json.c
index 876fc87c..6bd5204c 100644
--- a/sway/ipc-json.c
+++ b/sway/ipc-json.c
@@ -188,6 +188,8 @@ static void ipc_json_describe_view(swayc_t *c, json_object *object) {
json_object_object_add(object, "window", json_object_new_int(c->handle)); // for the sake of i3 compat
json_object_object_add(props, "class", c->class ? json_object_new_string(c->class) :
c->app_id ? json_object_new_string(c->app_id) : NULL);
+ json_object_object_add(props, "instance", c->instance ? json_object_new_string(c->instance) :
+ c->app_id ? json_object_new_string(c->app_id) : NULL);
json_object_object_add(props, "title", (c->name) ? json_object_new_string(c->name) : NULL);
json_object_object_add(props, "transient_for", parent ? json_object_new_int(parent) : NULL);
json_object_object_add(object, "window_properties", props);