mirror of
https://github.com/swaywm/sway.git
synced 2025-11-06 13:29:50 -05:00
criteria: Add. Learn for_window command.
A criteria is a string in the form of `[class="regex.*" title="str"]`. It is stored in a struct with a list of *tokens* which is a attribute/value pair (stored as a `crit_token` struct). Most tokens will also have a precompiled regex stored that will be used during criteria matching. for_window command: When a new view is created its metadata is tested against all stored criteria, and if a match is found the associated command list is executed. Unfortunately some metadata is not available in sway at the moment (specifically `instance`, `window_role` and `urgent`). Any criteria string that tries to match an unsupported attribute will fail. (Note that while the criteria code can be used to parse any criteria string it is currently only used by the `for_window` command.)
This commit is contained in:
parent
402c9f4bf0
commit
a06cb7cd01
7 changed files with 478 additions and 0 deletions
|
|
@ -19,6 +19,7 @@
|
|||
#include "input_state.h"
|
||||
#include "resize.h"
|
||||
#include "extensions.h"
|
||||
#include "criteria.h"
|
||||
|
||||
// Event should be sent to client
|
||||
#define EVENT_PASSTHROUGH false
|
||||
|
|
@ -172,6 +173,21 @@ static bool handle_view_created(wlc_handle handle) {
|
|||
set_focused_container(newview);
|
||||
swayc_t *output = swayc_parent_by_type(newview, C_OUTPUT);
|
||||
arrange_windows(output, -1, -1);
|
||||
// check if it matches for_window in config and execute if so
|
||||
list_t *criteria = criteria_for(newview);
|
||||
for (int i = 0; i < criteria->length; i++) {
|
||||
struct criteria *crit = criteria->items[i];
|
||||
sway_log(L_DEBUG, "for_window '%s' matches new view %p, cmd: '%s'",
|
||||
crit->crit_raw, newview, crit->cmdlist);
|
||||
struct cmd_results *res = handle_command(crit->cmdlist);
|
||||
if (res->status != CMD_SUCCESS) {
|
||||
sway_log(L_ERROR, "Command '%s' failed: %s", res->input, res->error);
|
||||
}
|
||||
free_cmd_results(res);
|
||||
// view must be focused for commands to affect it, so always
|
||||
// refocus in-between command lists
|
||||
set_focused_container(newview);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue