aboutsummaryrefslogtreecommitdiffstats
path: root/sway/handlers.c
diff options
context:
space:
mode:
authorLibravatar S. Christoffer Eliesen <christoffer@eliesen.no>2015-11-17 19:27:01 +0100
committerLibravatar S. Christoffer Eliesen <christoffer@eliesen.no>2015-11-25 14:34:33 +0100
commita06cb7cd01acfbb5e31dd1aacbbde7887a0509b9 (patch)
tree1474dbed01d4c31318883a3a837e02ce30125bef /sway/handlers.c
parentMerge pull request #255 from christophgysin/ninja (diff)
downloadsway-a06cb7cd01acfbb5e31dd1aacbbde7887a0509b9.tar.gz
sway-a06cb7cd01acfbb5e31dd1aacbbde7887a0509b9.tar.zst
sway-a06cb7cd01acfbb5e31dd1aacbbde7887a0509b9.zip
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.)
Diffstat (limited to 'sway/handlers.c')
-rw-r--r--sway/handlers.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/sway/handlers.c b/sway/handlers.c
index 28fa9564..267a8f3a 100644
--- a/sway/handlers.c
+++ b/sway/handlers.c
@@ -19,6 +19,7 @@
19#include "input_state.h" 19#include "input_state.h"
20#include "resize.h" 20#include "resize.h"
21#include "extensions.h" 21#include "extensions.h"
22#include "criteria.h"
22 23
23// Event should be sent to client 24// Event should be sent to client
24#define EVENT_PASSTHROUGH false 25#define EVENT_PASSTHROUGH false
@@ -172,6 +173,21 @@ static bool handle_view_created(wlc_handle handle) {
172 set_focused_container(newview); 173 set_focused_container(newview);
173 swayc_t *output = swayc_parent_by_type(newview, C_OUTPUT); 174 swayc_t *output = swayc_parent_by_type(newview, C_OUTPUT);
174 arrange_windows(output, -1, -1); 175 arrange_windows(output, -1, -1);
176 // check if it matches for_window in config and execute if so
177 list_t *criteria = criteria_for(newview);
178 for (int i = 0; i < criteria->length; i++) {
179 struct criteria *crit = criteria->items[i];
180 sway_log(L_DEBUG, "for_window '%s' matches new view %p, cmd: '%s'",
181 crit->crit_raw, newview, crit->cmdlist);
182 struct cmd_results *res = handle_command(crit->cmdlist);
183 if (res->status != CMD_SUCCESS) {
184 sway_log(L_ERROR, "Command '%s' failed: %s", res->input, res->error);
185 }
186 free_cmd_results(res);
187 // view must be focused for commands to affect it, so always
188 // refocus in-between command lists
189 set_focused_container(newview);
190 }
175 } 191 }
176 return true; 192 return true;
177} 193}