i3
Main Page
Data Structures
Files
File List
Globals
src
assignments.c
Go to the documentation of this file.
1
/*
2
* vim:ts=4:sw=4:expandtab
3
*
4
* i3 - an improved dynamic tiling window manager
5
* © 2009-2012 Michael Stapelberg and contributors (see also: LICENSE)
6
*
7
* assignments.c: Assignments for specific windows (for_window).
8
*
9
*/
10
#include "
all.h
"
11
12
/*
13
* Checks the list of assignments for the given window and runs all matching
14
* ones (unless they have already been run for this specific window).
15
*
16
*/
17
void
run_assignments
(
i3Window
*window) {
18
DLOG
(
"Checking if any assignments match this window\n"
);
19
20
bool
needs_tree_render =
false
;
21
22
/* Check if any assignments match */
23
Assignment
*current;
24
TAILQ_FOREACH
(current, &
assignments
,
assignments
) {
25
if
(!
match_matches_window
(&(current->
match
), window))
26
continue
;
27
28
bool
skip =
false
;
29
for
(
int
c = 0; c < window->
nr_assignments
; c++) {
30
if
(window->
ran_assignments
[c] != current)
31
continue
;
32
33
DLOG
(
"This assignment already ran for the given window, not executing it again.\n"
);
34
skip =
true
;
35
break
;
36
}
37
38
if
(skip)
39
continue
;
40
41
DLOG
(
"matching assignment, would do:\n"
);
42
if
(current->
type
== A_COMMAND) {
43
DLOG
(
"execute command %s\n"
, current->
dest
.
command
);
44
char
*full_command;
45
sasprintf
(&full_command,
"[id=\"%d\"] %s"
, window->
id
, current->
dest
.
command
);
46
struct
CommandResult
*
command_output
=
parse_command
(full_command);
47
free(full_command);
48
49
if
(command_output->
needs_tree_render
)
50
needs_tree_render =
true
;
51
52
free(command_output->
json_output
);
53
}
54
55
/* Store that we ran this assignment to not execute it again */
56
window->
nr_assignments
++;
57
window->
ran_assignments
=
srealloc
(window->
ran_assignments
,
sizeof
(
Assignment
*) * window->
nr_assignments
);
58
window->
ran_assignments
[window->
nr_assignments
-1] = current;
59
}
60
61
/* If any of the commands required re-rendering, we will do that now. */
62
if
(needs_tree_render)
63
tree_render
();
64
}
65
66
/*
67
* Returns the first matching assignment for the given window.
68
*
69
*/
70
Assignment
*
assignment_for
(
i3Window
*window,
int
type) {
71
Assignment
*assignment;
72
73
TAILQ_FOREACH
(assignment, &
assignments
,
assignments
) {
74
if
((type != A_ANY && (assignment->
type
& type) == 0) ||
75
!
match_matches_window
(&(assignment->
match
), window))
76
continue
;
77
DLOG
(
"got a matching assignment (to %s)\n"
, assignment->
dest
.
workspace
);
78
return
assignment;
79
}
80
81
return
NULL;
82
}
Generated by
1.8.1.1