Merge remote-tracking branch 'vanilla/next' into gaps-next
Ingo Bürk
3 years ago
9 | 9 | SpaceBeforeParens: ControlStatements |
10 | 10 | SortIncludes: false |
11 | 11 | ForEachMacros: [ TAILQ_FOREACH, TAILQ_FOREACH_REVERSE, SLIST_FOREACH, CIRCLEQ_FOREACH, CIRCLEQ_FOREACH_REVERSE, NODES_FOREACH, NODES_FOREACH_REVERSE, FOREACH_NONINTERNAL] |
12 | TypenameMacros: [ SLIST_HEAD, SLIST_ENTRY, LIST_HEAD, LIST_ENTRY, SIMPLEQ_HEAD, SIMPLEQ_ENTRY, TAILQ_HEAD, TAILQ_ENTRY, CIRCLEQ_HEAD, CIRCLEQ_ENTRY ] |
125 | 125 | I3_VERSION \ |
126 | 126 | LICENSE \ |
127 | 127 | PACKAGE-MAINTAINER \ |
128 | RELEASE-NOTES-4.18.2 \ | |
128 | RELEASE-NOTES-4.18.3 \ | |
129 | 129 | generate-command-parser.pl \ |
130 | 130 | parser-specs/commands.spec \ |
131 | 131 | parser-specs/config.spec \ |
0 | ||
1 | ┌──────────────────────────────┐ | |
2 | │ Release notes for i3 v4.18.2 │ | |
3 | └──────────────────────────────┘ | |
4 | ||
5 | This is i3 v4.18.2. This version is considered stable. All users of i3 are | |
6 | strongly encouraged to upgrade. | |
7 | ||
8 | This is a bugfix release for v4.18. | |
9 | ||
10 | ┌────────────────────────────┐ | |
11 | │ Bugfixes │ | |
12 | └────────────────────────────┘ | |
13 | ||
14 | • floating_maybe_reassign_ws: only re-focus if previously focused | |
15 | (fixes a focus issue with KDE notifications) | |
16 | • get_output_by_name: guard output->primary with require_active | |
17 | • i3bar: fix Xorg memory leak | |
18 | ||
19 | ┌────────────────────────────┐ | |
20 | │ Thanks! │ | |
21 | └────────────────────────────┘ | |
22 | ||
23 | Thanks for testing, bugfixes, discussions and everything I forgot go out to: | |
24 | ||
25 | Orestis Floros | |
26 | ||
27 | -- Michael Stapelberg, 2020-07-26 |
0 | ||
1 | ┌──────────────────────────────┐ | |
2 | │ Release notes for i3 v4.18.3 │ | |
3 | └──────────────────────────────┘ | |
4 | ||
5 | This is i3 v4.18.3. This version is considered stable. All users of i3 are | |
6 | strongly encouraged to upgrade. | |
7 | ||
8 | This is a bugfix release for v4.18. | |
9 | ||
10 | ┌────────────────────────────┐ | |
11 | │ Bugfixes │ | |
12 | └────────────────────────────┘ | |
13 | ||
14 | • Bugfix: kick tray clients before destroying the bar | |
15 | ||
16 | ┌────────────────────────────┐ | |
17 | │ Thanks! │ | |
18 | └────────────────────────────┘ | |
19 | ||
20 | Thanks for testing, bugfixes, discussions and everything I forgot go out to: | |
21 | ||
22 | Mark Guptill, Orestis Floros | |
23 | ||
24 | -- Michael Stapelberg, 2020-10-19 |
25 | 25 | to their definition order in the config file |
26 | 26 | • update i3bar config when necessary (reduces redraws on bar mode changes) |
27 | 27 | • mention rofi in default config file |
28 | • i3-input: add different exit codes for when i3-input fails | |
28 | 29 | |
29 | 30 | ┌────────────────────────────┐ |
30 | 31 | │ Bugfixes │ |
1 | 1 | # Run autoreconf -fi to generate a configure script from this file. |
2 | 2 | |
3 | 3 | AC_PREREQ([2.69]) |
4 | AC_INIT([i3], [4.18.2], [https://github.com/i3/i3/issues]) | |
4 | AC_INIT([i3], [4.18.3], [https://github.com/i3/i3/issues]) | |
5 | 5 | # For AX_EXTEND_SRCDIR |
6 | 6 | AX_ENABLE_BUILDDIR |
7 | 7 | AM_INIT_AUTOMAKE([foreign -Wall no-dist-gzip dist-bzip2]) |
0 | i3-wm (4.19-1) unstable; urgency=medium | |
1 | ||
2 | * New upstream release. | |
3 | ||
4 | -- Michael Stapelberg <[email protected]> Mon, 19 Oct 2020 22:48:30 +0200 | |
5 | ||
0 | 6 | i3-wm (4.18.3-1) unstable; urgency=medium |
1 | 7 | |
2 | 8 | * New upstream release. |
3 | 9 | |
4 | -- Michael Stapelberg <[email protected]> Sun, 26 Jul 2020 10:24:46 +0200 | |
10 | -- Michael Stapelberg <[email protected]> Mon, 19 Oct 2020 22:48:30 +0200 | |
5 | 11 | |
6 | 12 | i3-wm (4.18.2-1) unstable; urgency=medium |
7 | 13 |
30 | 30 | #define MAX_WIDTH logical_px(500) |
31 | 31 | #define BORDER logical_px(2) |
32 | 32 | #define PADDING logical_px(2) |
33 | ||
34 | /* Exit codes for i3-input: | |
35 | * 0 if i3-input exited successfully and the command was run | |
36 | * 1 if the user canceled input | |
37 | * 2 if i3-input fails for any other reason */ | |
38 | const int EXIT_OK = 0; | |
39 | const int EXIT_CANCEL = 1; | |
40 | const int EXIT_ERROR = 2; | |
33 | 41 | |
34 | 42 | /* IPC format string. %s will be replaced with what the user entered, then |
35 | 43 | * the command will be sent to i3 */ |
185 | 193 | /* prefix the command if a prefix was specified on commandline */ |
186 | 194 | printf("command = %s\n", full); |
187 | 195 | |
188 | ipc_send_message(sockfd, strlen(full), 0, (uint8_t *)full); | |
196 | int ret = ipc_send_message(sockfd, strlen(full), 0, (uint8_t *)full); | |
189 | 197 | |
190 | 198 | free(full); |
191 | 199 | |
192 | exit(0); | |
200 | exit(ret == 0 ? EXIT_OK : EXIT_ERROR); | |
193 | 201 | } |
194 | 202 | |
195 | 203 | /* |
238 | 246 | return 1; |
239 | 247 | } |
240 | 248 | if (sym == XK_Escape) { |
241 | exit(0); | |
249 | exit(EXIT_CANCEL); | |
242 | 250 | } |
243 | 251 | |
244 | 252 | /* TODO: handle all of these? */ |
296 | 304 | xcb_intern_atom_reply_t *nswc_reply = xcb_intern_atom_reply(conn, nswc_cookie, NULL); |
297 | 305 | if (nswc_reply == NULL) { |
298 | 306 | ELOG("Could not intern atom _NET_SUPPORTING_WM_CHECK\n"); |
299 | exit(-1); | |
307 | exit(EXIT_ERROR); | |
300 | 308 | } |
301 | 309 | A__NET_SUPPORTING_WM_CHECK = nswc_reply->atom; |
302 | 310 | free(nswc_reply); |
391 | 399 | break; |
392 | 400 | case 'v': |
393 | 401 | printf("i3-input " I3_VERSION); |
394 | return 0; | |
402 | return EXIT_OK; | |
395 | 403 | case 'p': |
396 | 404 | /* This option is deprecated, but will still work in i3 v4.1, 4.2 and 4.3 */ |
397 | 405 | fprintf(stderr, "i3-input: WARNING: the -p option is DEPRECATED in favor of the -F (format) option\n"); |
419 | 427 | printf("\n"); |
420 | 428 | printf("Example:\n"); |
421 | 429 | printf(" i3-input -F 'workspace \"%%s\"' -P 'Switch to workspace: '\n"); |
422 | return 0; | |
430 | return EXIT_OK; | |
423 | 431 | } |
424 | 432 | } |
425 | 433 | if (!format) { |
490 | 498 | |
491 | 499 | if (reply->status != XCB_GRAB_STATUS_SUCCESS) { |
492 | 500 | fprintf(stderr, "Could not grab keyboard, status = %d\n", reply->status); |
493 | exit(-1); | |
501 | exit(EXIT_ERROR); | |
494 | 502 | } |
495 | 503 | |
496 | 504 | xcb_flush(conn); |
526 | 534 | } |
527 | 535 | |
528 | 536 | draw_util_surface_free(conn, &surface); |
529 | return 0; | |
530 | } | |
537 | return EXIT_OK; | |
538 | } |
76 | 76 | char *name; |
77 | 77 | char *instance; |
78 | 78 | |
79 | TAILQ_ENTRY(status_block) | |
80 | blocks; | |
79 | TAILQ_ENTRY(status_block) blocks; | |
81 | 80 | }; |
82 | 81 | |
83 | extern TAILQ_HEAD(statusline_head, status_block) | |
84 | statusline_head; | |
82 | extern TAILQ_HEAD(statusline_head, status_block) statusline_head; | |
85 | 83 | |
86 | 84 | #include "child.h" |
87 | 85 | #include "ipc.h" |
28 | 28 | char *command; |
29 | 29 | bool release; |
30 | 30 | |
31 | TAILQ_ENTRY(binding_t) | |
32 | bindings; | |
31 | TAILQ_ENTRY(binding_t) bindings; | |
33 | 32 | } binding_t; |
34 | 33 | |
35 | 34 | typedef struct tray_output_t { |
36 | 35 | char *output; |
37 | 36 | |
38 | TAILQ_ENTRY(tray_output_t) | |
39 | tray_outputs; | |
37 | TAILQ_ENTRY(tray_output_t) tray_outputs; | |
40 | 38 | } tray_output_t; |
41 | 39 | |
42 | 40 | typedef struct config_t { |
43 | 41 | uint32_t modifier; |
44 | ||
45 | TAILQ_HEAD(bindings_head, binding_t) | |
46 | bindings; | |
47 | ||
42 | TAILQ_HEAD(bindings_head, binding_t) bindings; | |
48 | 43 | position_t position; |
49 | 44 | bool verbose; |
50 | 45 | uint32_t bar_height; |
59 | 54 | char *command; |
60 | 55 | char *fontname; |
61 | 56 | i3String *separator_symbol; |
62 | ||
63 | TAILQ_HEAD(tray_outputs_head, tray_output_t) | |
64 | tray_outputs; | |
65 | ||
57 | TAILQ_HEAD(tray_outputs_head, tray_output_t) tray_outputs; | |
66 | 58 | int tray_padding; |
67 | 59 | int num_outputs; |
68 | 60 | char **outputs; |
72 | 72 | struct ws_head* workspaces; /* The workspaces on this output */ |
73 | 73 | struct tc_head* trayclients; /* The tray clients on this output */ |
74 | 74 | |
75 | SLIST_ENTRY(i3_output) | |
76 | slist; /* Pointer for the SLIST-Macro */ | |
75 | SLIST_ENTRY(i3_output) slist; /* Pointer for the SLIST-Macro */ | |
77 | 76 | }; |
20 | 20 | char *class_class; |
21 | 21 | char *class_instance; |
22 | 22 | |
23 | TAILQ_ENTRY(trayclient) | |
24 | tailq; /* Pointer for the TAILQ-Macro */ | |
23 | TAILQ_ENTRY(trayclient) tailq; /* Pointer for the TAILQ-Macro */ | |
25 | 24 | }; |
40 | 40 | rect rect; /* The rect of the ws (not used (yet)) */ |
41 | 41 | struct i3_output *output; /* The current output of the ws */ |
42 | 42 | |
43 | TAILQ_ENTRY(i3_ws) | |
44 | tailq; /* Pointer for the TAILQ-Macro */ | |
43 | TAILQ_ENTRY(i3_ws) tailq; /* Pointer for the TAILQ-Macro */ | |
45 | 44 | }; |
65 | 65 | char *value; |
66 | 66 | char *next_match; |
67 | 67 | |
68 | SLIST_ENTRY(Variable) | |
69 | variables; | |
68 | SLIST_ENTRY(Variable) variables; | |
70 | 69 | }; |
71 | 70 | |
72 | 71 | /** |
80 | 79 | bool pango_markup; |
81 | 80 | struct bindings_head *bindings; |
82 | 81 | |
83 | SLIST_ENTRY(Mode) | |
84 | modes; | |
82 | SLIST_ENTRY(Mode) modes; | |
85 | 83 | }; |
86 | 84 | |
87 | 85 | /** |
280 | 278 | /* List of outputs on which the tray is allowed to be shown, in order. |
281 | 279 | * The special value "none" disables it (per default, it will be shown) and |
282 | 280 | * the special value "primary" enabled it on the primary output. */ |
283 | TAILQ_HEAD(tray_outputs_head, tray_output_t) | |
284 | tray_outputs; | |
281 | TAILQ_HEAD(tray_outputs_head, tray_output_t) tray_outputs; | |
285 | 282 | |
286 | 283 | /* Padding around the tray icons. */ |
287 | 284 | int tray_padding; |
303 | 300 | /** Bar modifier (to show bar when in hide mode). */ |
304 | 301 | uint32_t modifier; |
305 | 302 | |
306 | TAILQ_HEAD(bar_bindings_head, Barbinding) | |
307 | bar_bindings; | |
303 | TAILQ_HEAD(bar_bindings_head, Barbinding) bar_bindings; | |
308 | 304 | |
309 | 305 | /** Bar position (bottom by default). */ |
310 | 306 | enum { P_BOTTOM = 0, |
381 | 377 | char *binding_mode_text; |
382 | 378 | } colors; |
383 | 379 | |
384 | TAILQ_ENTRY(Barconfig) | |
385 | configs; | |
380 | TAILQ_ENTRY(Barconfig) configs; | |
386 | 381 | }; |
387 | 382 | |
388 | 383 | /** |
400 | 395 | /** If true, the command will be executed after the button is released. */ |
401 | 396 | bool release; |
402 | 397 | |
403 | TAILQ_ENTRY(Barbinding) | |
404 | bindings; | |
398 | TAILQ_ENTRY(Barbinding) bindings; | |
405 | 399 | }; |
406 | 400 | |
407 | 401 | struct tray_output_t { |
408 | 402 | char *output; |
409 | 403 | |
410 | TAILQ_ENTRY(tray_output_t) | |
411 | tray_outputs; | |
404 | TAILQ_ENTRY(tray_output_t) tray_outputs; | |
412 | 405 | }; |
413 | 406 | |
414 | 407 | typedef enum { |
224 | 224 | char *output; |
225 | 225 | gaps_t gaps; |
226 | 226 | |
227 | TAILQ_ENTRY(Workspace_Assignment) | |
228 | ws_assignments; | |
227 | TAILQ_ENTRY(Workspace_Assignment) ws_assignments; | |
229 | 228 | }; |
230 | 229 | |
231 | 230 | struct Ignore_Event { |
233 | 232 | int response_type; |
234 | 233 | time_t added; |
235 | 234 | |
236 | SLIST_ENTRY(Ignore_Event) | |
237 | ignore_events; | |
235 | SLIST_ENTRY(Ignore_Event) ignore_events; | |
238 | 236 | }; |
239 | 237 | |
240 | 238 | /** |
253 | 251 | * completed) */ |
254 | 252 | time_t delete_at; |
255 | 253 | |
256 | TAILQ_ENTRY(Startup_Sequence) | |
257 | sequences; | |
254 | TAILQ_ENTRY(Startup_Sequence) sequences; | |
258 | 255 | }; |
259 | 256 | |
260 | 257 | /** |
280 | 277 | struct Binding_Keycode { |
281 | 278 | xcb_keycode_t keycode; |
282 | 279 | i3_event_state_mask_t modifiers; |
283 | ||
284 | TAILQ_ENTRY(Binding_Keycode) | |
285 | keycodes; | |
280 | TAILQ_ENTRY(Binding_Keycode) keycodes; | |
286 | 281 | }; |
287 | 282 | |
288 | 283 | /****************************************************************************** |
343 | 338 | /** Only in use if symbol != NULL. Contains keycodes which generate the |
344 | 339 | * specified symbol. Useful for unbinding and checking which binding was |
345 | 340 | * used when a key press event comes in. */ |
346 | TAILQ_HEAD(keycodes_head, Binding_Keycode) | |
347 | keycodes_head; | |
341 | TAILQ_HEAD(keycodes_head, Binding_Keycode) keycodes_head; | |
348 | 342 | |
349 | 343 | /** Command, like in command mode */ |
350 | 344 | char *command; |
351 | 345 | |
352 | TAILQ_ENTRY(Binding) | |
353 | bindings; | |
346 | TAILQ_ENTRY(Binding) bindings; | |
354 | 347 | }; |
355 | 348 | |
356 | 349 | /** |
366 | 359 | /** no_startup_id flag for start_application(). Determines whether a |
367 | 360 | * startup notification context/ID should be created. */ |
368 | 361 | bool no_startup_id; |
369 | ||
370 | TAILQ_ENTRY(Autostart) | |
371 | autostarts; | |
372 | ||
373 | TAILQ_ENTRY(Autostart) | |
374 | autostarts_always; | |
362 | TAILQ_ENTRY(Autostart) autostarts; | |
363 | TAILQ_ENTRY(Autostart) autostarts_always; | |
375 | 364 | }; |
376 | 365 | |
377 | 366 | struct output_name { |
378 | 367 | char *name; |
379 | ||
380 | SLIST_ENTRY(output_name) | |
381 | names; | |
368 | SLIST_ENTRY(output_name) names; | |
382 | 369 | }; |
383 | 370 | |
384 | 371 | /** |
405 | 392 | /** List of names for the output. |
406 | 393 | * An output always has at least one name; the first name is |
407 | 394 | * considered the primary one. */ |
408 | SLIST_HEAD(names_head, output_name) | |
409 | names_head; | |
395 | SLIST_HEAD(names_head, output_name) names_head; | |
410 | 396 | |
411 | 397 | /** Pointer to the Con which represents this output */ |
412 | 398 | Con *con; |
414 | 400 | /** x, y, width, height */ |
415 | 401 | Rect rect; |
416 | 402 | |
417 | TAILQ_ENTRY(xoutput) | |
418 | outputs; | |
403 | TAILQ_ENTRY(xoutput) outputs; | |
419 | 404 | }; |
420 | 405 | |
421 | 406 | /** |
566 | 551 | M_ASSIGN_WS, |
567 | 552 | M_BELOW } insert_where; |
568 | 553 | |
569 | TAILQ_ENTRY(Match) | |
570 | matches; | |
554 | TAILQ_ENTRY(Match) matches; | |
571 | 555 | |
572 | 556 | /* Whether this match was generated when restarting i3 inplace. |
573 | 557 | * Leads to not setting focus when managing a new window, because the old |
614 | 598 | char *output; |
615 | 599 | } dest; |
616 | 600 | |
617 | TAILQ_ENTRY(Assignment) | |
618 | assignments; | |
601 | TAILQ_ENTRY(Assignment) assignments; | |
619 | 602 | }; |
620 | 603 | |
621 | 604 | /** Fullscreen modes. Used by Con.fullscreen_mode. */ |
626 | 609 | struct mark_t { |
627 | 610 | char *name; |
628 | 611 | |
629 | TAILQ_ENTRY(mark_t) | |
630 | marks; | |
612 | TAILQ_ENTRY(mark_t) marks; | |
631 | 613 | }; |
632 | 614 | |
633 | 615 | /** |
694 | 676 | char *sticky_group; |
695 | 677 | |
696 | 678 | /* user-definable marks to jump to this container later */ |
697 | TAILQ_HEAD(marks_head, mark_t) | |
698 | marks_head; | |
679 | TAILQ_HEAD(marks_head, mark_t) marks_head; | |
699 | 680 | /* cached to decide whether a redraw is needed */ |
700 | 681 | bool mark_changed; |
701 | 682 | |
714 | 695 | struct deco_render_params *deco_render_params; |
715 | 696 | |
716 | 697 | /* Only workspace-containers can have floating clients */ |
717 | TAILQ_HEAD(floating_head, Con) | |
718 | floating_head; | |
719 | ||
720 | TAILQ_HEAD(nodes_head, Con) | |
721 | nodes_head; | |
722 | ||
723 | TAILQ_HEAD(focus_head, Con) | |
724 | focus_head; | |
725 | ||
726 | TAILQ_HEAD(swallow_head, Match) | |
727 | swallow_head; | |
698 | TAILQ_HEAD(floating_head, Con) floating_head; | |
699 | ||
700 | TAILQ_HEAD(nodes_head, Con) nodes_head; | |
701 | TAILQ_HEAD(focus_head, Con) focus_head; | |
702 | ||
703 | TAILQ_HEAD(swallow_head, Match) swallow_head; | |
728 | 704 | |
729 | 705 | fullscreen_mode_t fullscreen_mode; |
730 | 706 | |
762 | 738 | FLOATING_USER_ON = 3 |
763 | 739 | } floating; |
764 | 740 | |
765 | TAILQ_ENTRY(Con) | |
766 | nodes; | |
767 | ||
768 | TAILQ_ENTRY(Con) | |
769 | focused; | |
770 | ||
771 | TAILQ_ENTRY(Con) | |
772 | all_cons; | |
773 | ||
774 | TAILQ_ENTRY(Con) | |
775 | floating_windows; | |
741 | TAILQ_ENTRY(Con) nodes; | |
742 | TAILQ_ENTRY(Con) focused; | |
743 | TAILQ_ENTRY(Con) all_cons; | |
744 | TAILQ_ENTRY(Con) floating_windows; | |
776 | 745 | |
777 | 746 | /** callbacks */ |
778 | 747 | void (*on_remove_child)(Con *); |
56 | 56 | extern char **start_argv; |
57 | 57 | extern Display *xlibdpy, *xkbdpy; |
58 | 58 | extern int xkb_current_group; |
59 | extern TAILQ_HEAD(bindings_head, Binding) * bindings; | |
59 | extern TAILQ_HEAD(bindings_head, Binding) *bindings; | |
60 | 60 | extern const char *current_binding_mode; |
61 | 61 | extern TAILQ_HEAD(autostarts_head, Autostart) autostarts; |
62 | 62 | extern TAILQ_HEAD(autostarts_always_head, Autostart) autostarts_always; |
39 | 39 | uint8_t *buffer; |
40 | 40 | size_t buffer_size; |
41 | 41 | |
42 | TAILQ_ENTRY(ipc_client) | |
43 | clients; | |
42 | TAILQ_ENTRY(ipc_client) clients; | |
44 | 43 | } ipc_client; |
45 | 44 | |
46 | 45 | /* |
14 | 14 | char hex[8]; |
15 | 15 | uint32_t pixel; |
16 | 16 | |
17 | SLIST_ENTRY(Colorpixel) | |
18 | colorpixels; | |
17 | SLIST_ENTRY(Colorpixel) colorpixels; | |
19 | 18 | }; |
20 | 19 | |
21 | SLIST_HEAD(colorpixel_head, Colorpixel) | |
22 | colorpixels; | |
20 | SLIST_HEAD(colorpixel_head, Colorpixel) colorpixels; | |
23 | 21 | |
24 | 22 | /* |
25 | 23 | * Returns the colorpixel to use for the given hex color (think of HTML). |
597 | 597 | # because configure_file strips the backslash in e.g. \@display, |
598 | 598 | # resulting in @display, breaking our Perl code: |
599 | 599 | # https://github.com/mesonbuild/meson/issues/7165 |
600 | sed = find_program('sed') | |
600 | bash = find_program('bash') | |
601 | 601 | replace_dirs = [ |
602 | sed, | |
603 | '-e', | |
604 | 's,@abs_top_builddir@,'+meson.current_build_dir()+',g;s,@abs_top_srcdir@,'+meson.current_source_dir()+',g', | |
605 | '@INPUT@', | |
602 | bash, '-c', # Use bash to capture output and mark as executable | |
603 | 'sed -e \'s,@abs_top_builddir@,' | |
604 | + meson.current_build_dir() | |
605 | + ',g;s,@abs_top_srcdir@,' | |
606 | + meson.current_source_dir()+',g\'' | |
607 | # Only mark files ending in .pl as executables | |
608 | + ' "$0" > "$1" && { [[ "${1##*.}" == pl ]] && chmod +x "$1" || true; }', | |
609 | '@INPUT0@', # $0 | |
610 | '@OUTPUT0@', # $1 | |
606 | 611 | ] |
607 | 612 | complete_run = custom_target( |
608 | 613 | 'complete-run', |
609 | 614 | input: ['testcases/complete-run.pl.in'], |
610 | 615 | output: ['complete-run.pl'], |
611 | capture: true, | |
612 | 616 | command: replace_dirs, |
613 | 617 | # build this target when running e.g. ninja or ninja test. |
614 | 618 | # This is required for older meson versions (< 0.46.0). |
618 | 622 | 'i3test-pm', |
619 | 623 | input: ['testcases/lib/i3test.pm.in'], |
620 | 624 | output: ['i3test.pm'], |
621 | capture: true, | |
622 | 625 | command: replace_dirs, |
623 | 626 | # build this target when running e.g. ninja or ninja test. |
624 | 627 | # This is required for older meson versions (< 0.46.0). |
128 | 128 | */ |
129 | 129 | typedef struct owindow { |
130 | 130 | Con *con; |
131 | ||
132 | TAILQ_ENTRY(owindow) | |
133 | owindows; | |
131 | TAILQ_ENTRY(owindow) owindows; | |
134 | 132 | } owindow; |
135 | 133 | |
136 | 134 | typedef TAILQ_HEAD(owindows_head, owindow) owindows_head; |
513 | 513 | struct bfs_entry { |
514 | 514 | Con *con; |
515 | 515 | |
516 | TAILQ_ENTRY(bfs_entry) | |
517 | entries; | |
516 | TAILQ_ENTRY(bfs_entry) entries; | |
518 | 517 | }; |
519 | 518 | |
520 | 519 | /* |
526 | 525 | |
527 | 526 | /* TODO: is breadth-first-search really appropriate? (check as soon as |
528 | 527 | * fullscreen levels and fullscreen for containers is implemented) */ |
529 | TAILQ_HEAD(bfs_head, bfs_entry) | |
530 | bfs_head = TAILQ_HEAD_INITIALIZER(bfs_head); | |
531 | ||
528 | TAILQ_HEAD(bfs_head, bfs_entry) bfs_head = TAILQ_HEAD_INITIALIZER(bfs_head); | |
532 | 529 | struct bfs_entry *entry = smalloc(sizeof(struct bfs_entry)); |
533 | 530 | entry->con = con; |
534 | 531 | TAILQ_INSERT_TAIL(&bfs_head, entry, entries); |
24 | 24 | |
25 | 25 | char *current_socketpath = NULL; |
26 | 26 | |
27 | TAILQ_HEAD(ipc_client_head, ipc_client) | |
28 | all_clients = TAILQ_HEAD_INITIALIZER(all_clients); | |
27 | TAILQ_HEAD(ipc_client_head, ipc_client) all_clients = TAILQ_HEAD_INITIALIZER(all_clients); | |
29 | 28 | |
30 | 29 | /* |
31 | 30 | * Puts the given socket file descriptor into non-blocking mode or dies if |
44 | 44 | * array. */ |
45 | 45 | struct focus_mapping { |
46 | 46 | int old_id; |
47 | ||
48 | TAILQ_ENTRY(focus_mapping) | |
49 | focus_mappings; | |
47 | TAILQ_ENTRY(focus_mapping) focus_mappings; | |
50 | 48 | }; |
51 | 49 | |
52 | 50 | static TAILQ_HEAD(focus_mappings_head, focus_mapping) focus_mappings = |
28 | 28 | /** The drawable surface */ |
29 | 29 | surface_t surface; |
30 | 30 | |
31 | TAILQ_ENTRY(placeholder_state) | |
32 | state; | |
31 | TAILQ_ENTRY(placeholder_state) state; | |
33 | 32 | } placeholder_state; |
34 | 33 | |
35 | 34 | static TAILQ_HEAD(state_head, placeholder_state) state_head = |
15 | 15 | xcb_colormap_t colormap; |
16 | 16 | Rect dims; |
17 | 17 | surface_t surface; |
18 | ||
19 | TAILQ_ENTRY(dialog_t) | |
20 | dialogs; | |
18 | TAILQ_ENTRY(dialog_t) dialogs; | |
21 | 19 | } dialog_t; |
22 | 20 | |
23 | 21 | static TAILQ_HEAD(dialogs_head, dialog_t) dialogs = TAILQ_HEAD_INITIALIZER(dialogs); |
62 | 62 | |
63 | 63 | char *name; |
64 | 64 | |
65 | CIRCLEQ_ENTRY(con_state) | |
66 | state; | |
67 | ||
68 | CIRCLEQ_ENTRY(con_state) | |
69 | old_state; | |
70 | ||
71 | TAILQ_ENTRY(con_state) | |
72 | initial_mapping_order; | |
65 | CIRCLEQ_ENTRY(con_state) state; | |
66 | CIRCLEQ_ENTRY(con_state) old_state; | |
67 | TAILQ_ENTRY(con_state) initial_mapping_order; | |
73 | 68 | } con_state; |
74 | 69 | |
75 | CIRCLEQ_HEAD(state_head, con_state) | |
76 | state_head = | |
70 | CIRCLEQ_HEAD(state_head, con_state) state_head = | |
77 | 71 | CIRCLEQ_HEAD_INITIALIZER(state_head); |
78 | 72 | |
79 | CIRCLEQ_HEAD(old_state_head, con_state) | |
80 | old_state_head = | |
73 | CIRCLEQ_HEAD(old_state_head, con_state) old_state_head = | |
81 | 74 | CIRCLEQ_HEAD_INITIALIZER(old_state_head); |
82 | 75 | |
83 | TAILQ_HEAD(initial_mapping_head, con_state) | |
84 | initial_mapping_head = | |
76 | TAILQ_HEAD(initial_mapping_head, con_state) initial_mapping_head = | |
85 | 77 | TAILQ_HEAD_INITIALIZER(initial_mapping_head); |
86 | 78 | |
87 | 79 | /* |