i3
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;
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 }