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