Time Lord technology: for_window config directive to run arbitrary cmds
An example to set all XTerms floating: for_window [class="XTerm"] mode floating To make all urxvts use a 1-pixel border: for_window [class="urxvt"] border 1pixel A less useful, but rather funny example: for_window [title="x200: ~/work"] mode floating The commands are not completely arbitrary. The commands above were tested, others may need some fixing. Internally, windows are compared against your criteria (class, title, …) when they are initially managed and whenever one of the relevant values change. Then, the specified command is run *once* (per window). It gets prefixed with a criteria to make it match only the specific window that triggered it. So, if you configure "mode floating", i3 runs something like '[id="8393923"] mode floating'.
This commit is contained in:
50
src/assignments.c
Normal file
50
src/assignments.c
Normal file
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* vim:ts=4:sw=4:expandtab
|
||||
*
|
||||
* i3 - an improved dynamic tiling window manager
|
||||
* © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
|
||||
*
|
||||
*/
|
||||
#include "all.h"
|
||||
|
||||
/*
|
||||
* Checks the list of assignments for the given window and runs all matching
|
||||
* ones (unless they have already been run for this specific window).
|
||||
*
|
||||
*/
|
||||
void run_assignments(i3Window *window) {
|
||||
DLOG("Checking assignments...\n");
|
||||
|
||||
/* Check if any assignments match */
|
||||
Assignment *current;
|
||||
TAILQ_FOREACH(current, &real_assignments, real_assignments) {
|
||||
if (!match_matches_window(&(current->match), window))
|
||||
continue;
|
||||
|
||||
bool skip = false;
|
||||
for (int c = 0; c < window->nr_assignments; c++) {
|
||||
if (window->ran_assignments[c] != current)
|
||||
continue;
|
||||
|
||||
DLOG("This assignment already ran for the given window, not executing it again.\n");
|
||||
skip = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (skip)
|
||||
continue;
|
||||
|
||||
DLOG("matching assignment, would do:\n");
|
||||
if (current->type == A_COMMAND) {
|
||||
DLOG("execute command %s\n", current->dest.command);
|
||||
char *full_command;
|
||||
asprintf(&full_command, "[id=\"%d\"] %s", window->id, current->dest.command);
|
||||
parse_cmd(full_command);
|
||||
}
|
||||
|
||||
/* Store that we ran this assignment to not execute it again */
|
||||
window->nr_assignments++;
|
||||
window->ran_assignments = srealloc(window->ran_assignments, sizeof(Assignment*) * window->nr_assignments);
|
||||
window->ran_assignments[window->nr_assignments-1] = current;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user