Full Code of swaywm/sway for AI

master 82227d610394 cached
378 files
1.8 MB
520.1k tokens
3751 symbols
1 requests
Download .txt
Showing preview only (1,946K chars total). Download the full file or copy to clipboard to get everything.
Repository: swaywm/sway
Branch: master
Commit: 82227d610394
Files: 378
Total size: 1.8 MB

Directory structure:
gitextract_b61p9gre/

├── .builds/
│   ├── alpine.yml
│   ├── archlinux.yml
│   └── freebsd.yml
├── .editorconfig
├── .github/
│   └── ISSUE_TEMPLATE/
│       ├── bug_report.md
│       ├── config.yml
│       ├── enhancement.md
│       └── i3_compat.md
├── .gitignore
├── .mailmap
├── CONTRIBUTING.md
├── LICENSE
├── README.ar.md
├── README.az.md
├── README.cs.md
├── README.de.md
├── README.dk.md
├── README.es.md
├── README.fr.md
├── README.ge.md
├── README.gr.md
├── README.hi.md
├── README.hu.md
├── README.ir.md
├── README.it.md
├── README.ja.md
├── README.ko.md
├── README.md
├── README.nl.md
├── README.no.md
├── README.pl.md
├── README.pt.md
├── README.ro.md
├── README.ru.md
├── README.sr.md
├── README.sv.md
├── README.tr.md
├── README.uk.md
├── README.zh-CN.md
├── README.zh-TW.md
├── assets/
│   └── LICENSE
├── client/
│   ├── meson.build
│   └── pool-buffer.c
├── common/
│   ├── cairo.c
│   ├── gesture.c
│   ├── ipc-client.c
│   ├── list.c
│   ├── log.c
│   ├── loop.c
│   ├── meson.build
│   ├── pango.c
│   ├── stringop.c
│   └── util.c
├── completions/
│   ├── bash/
│   │   ├── sway
│   │   ├── swaybar
│   │   └── swaymsg
│   ├── fish/
│   │   ├── sway.fish
│   │   ├── swaymsg.fish
│   │   └── swaynag.fish
│   ├── meson.build
│   └── zsh/
│       ├── _sway
│       ├── _swaybar
│       └── _swaymsg
├── config.in
├── include/
│   ├── cairo_util.h
│   ├── gesture.h
│   ├── ipc-client.h
│   ├── ipc.h
│   ├── list.h
│   ├── log.h
│   ├── loop.h
│   ├── meson.build
│   ├── pango.h
│   ├── pool-buffer.h
│   ├── stringop.h
│   ├── sway/
│   │   ├── commands.h
│   │   ├── config.h
│   │   ├── criteria.h
│   │   ├── decoration.h
│   │   ├── desktop/
│   │   │   ├── idle_inhibit_v1.h
│   │   │   ├── launcher.h
│   │   │   └── transaction.h
│   │   ├── input/
│   │   │   ├── cursor.h
│   │   │   ├── input-manager.h
│   │   │   ├── keyboard.h
│   │   │   ├── libinput.h
│   │   │   ├── seat.h
│   │   │   ├── switch.h
│   │   │   ├── tablet.h
│   │   │   ├── text_input.h
│   │   │   └── text_input_popup.h
│   │   ├── ipc-json.h
│   │   ├── ipc-server.h
│   │   ├── layers.h
│   │   ├── lock.h
│   │   ├── output.h
│   │   ├── scene_descriptor.h
│   │   ├── server.h
│   │   ├── sway_text_node.h
│   │   ├── swaynag.h
│   │   ├── tree/
│   │   │   ├── arrange.h
│   │   │   ├── container.h
│   │   │   ├── node.h
│   │   │   ├── root.h
│   │   │   ├── view.h
│   │   │   └── workspace.h
│   │   ├── xdg_decoration.h
│   │   └── xwayland.h
│   ├── swaybar/
│   │   ├── bar.h
│   │   ├── config.h
│   │   ├── i3bar.h
│   │   ├── image.h
│   │   ├── input.h
│   │   ├── ipc.h
│   │   ├── render.h
│   │   ├── status_line.h
│   │   └── tray/
│   │       ├── host.h
│   │       ├── icon.h
│   │       ├── item.h
│   │       ├── tray.h
│   │       └── watcher.h
│   ├── swaynag/
│   │   ├── config.h
│   │   ├── render.h
│   │   ├── swaynag.h
│   │   └── types.h
│   └── util.h
├── meson.build
├── meson_options.txt
├── protocols/
│   ├── meson.build
│   ├── wlr-layer-shell-unstable-v1.xml
│   └── wlr-output-power-management-unstable-v1.xml
├── release.sh
├── sway/
│   ├── commands/
│   │   ├── allow_tearing.c
│   │   ├── assign.c
│   │   ├── bar/
│   │   │   ├── bind.c
│   │   │   ├── binding_mode_indicator.c
│   │   │   ├── colors.c
│   │   │   ├── font.c
│   │   │   ├── gaps.c
│   │   │   ├── height.c
│   │   │   ├── hidden_state.c
│   │   │   ├── icon_theme.c
│   │   │   ├── id.c
│   │   │   ├── mode.c
│   │   │   ├── modifier.c
│   │   │   ├── output.c
│   │   │   ├── pango_markup.c
│   │   │   ├── position.c
│   │   │   ├── separator_symbol.c
│   │   │   ├── status_command.c
│   │   │   ├── status_edge_padding.c
│   │   │   ├── status_padding.c
│   │   │   ├── strip_workspace_name.c
│   │   │   ├── strip_workspace_numbers.c
│   │   │   ├── swaybar_command.c
│   │   │   ├── tray_bind.c
│   │   │   ├── tray_output.c
│   │   │   ├── tray_padding.c
│   │   │   ├── workspace_buttons.c
│   │   │   ├── workspace_min_width.c
│   │   │   └── wrap_scroll.c
│   │   ├── bar.c
│   │   ├── bind.c
│   │   ├── border.c
│   │   ├── client.c
│   │   ├── create_output.c
│   │   ├── default_border.c
│   │   ├── default_floating_border.c
│   │   ├── default_orientation.c
│   │   ├── exec.c
│   │   ├── exec_always.c
│   │   ├── exit.c
│   │   ├── floating.c
│   │   ├── floating_minmax_size.c
│   │   ├── floating_modifier.c
│   │   ├── focus.c
│   │   ├── focus_follows_mouse.c
│   │   ├── focus_on_window_activation.c
│   │   ├── focus_wrapping.c
│   │   ├── font.c
│   │   ├── for_window.c
│   │   ├── force_display_urgency_hint.c
│   │   ├── force_focus_wrapping.c
│   │   ├── fullscreen.c
│   │   ├── gaps.c
│   │   ├── gesture.c
│   │   ├── hide_edge_borders.c
│   │   ├── include.c
│   │   ├── inhibit_idle.c
│   │   ├── input/
│   │   │   ├── accel_profile.c
│   │   │   ├── calibration_matrix.c
│   │   │   ├── click_method.c
│   │   │   ├── clickfinger_button_map.c
│   │   │   ├── drag.c
│   │   │   ├── drag_lock.c
│   │   │   ├── dwt.c
│   │   │   ├── dwtp.c
│   │   │   ├── events.c
│   │   │   ├── left_handed.c
│   │   │   ├── map_from_region.c
│   │   │   ├── map_to_output.c
│   │   │   ├── map_to_region.c
│   │   │   ├── middle_emulation.c
│   │   │   ├── natural_scroll.c
│   │   │   ├── pointer_accel.c
│   │   │   ├── repeat_delay.c
│   │   │   ├── repeat_rate.c
│   │   │   ├── rotation_angle.c
│   │   │   ├── scroll_button.c
│   │   │   ├── scroll_button_lock.c
│   │   │   ├── scroll_factor.c
│   │   │   ├── scroll_method.c
│   │   │   ├── tap.c
│   │   │   ├── tap_button_map.c
│   │   │   ├── tool_mode.c
│   │   │   ├── xkb_capslock.c
│   │   │   ├── xkb_file.c
│   │   │   ├── xkb_layout.c
│   │   │   ├── xkb_model.c
│   │   │   ├── xkb_numlock.c
│   │   │   ├── xkb_options.c
│   │   │   ├── xkb_rules.c
│   │   │   ├── xkb_switch_layout.c
│   │   │   └── xkb_variant.c
│   │   ├── input.c
│   │   ├── kill.c
│   │   ├── layout.c
│   │   ├── mark.c
│   │   ├── max_render_time.c
│   │   ├── mode.c
│   │   ├── mouse_warping.c
│   │   ├── move.c
│   │   ├── new_float.c
│   │   ├── new_window.c
│   │   ├── no_focus.c
│   │   ├── nop.c
│   │   ├── opacity.c
│   │   ├── output/
│   │   │   ├── adaptive_sync.c
│   │   │   ├── allow_tearing.c
│   │   │   ├── background.c
│   │   │   ├── color_profile.c
│   │   │   ├── disable.c
│   │   │   ├── dpms.c
│   │   │   ├── enable.c
│   │   │   ├── hdr.c
│   │   │   ├── max_render_time.c
│   │   │   ├── mode.c
│   │   │   ├── position.c
│   │   │   ├── power.c
│   │   │   ├── render_bit_depth.c
│   │   │   ├── scale.c
│   │   │   ├── scale_filter.c
│   │   │   ├── subpixel.c
│   │   │   ├── toggle.c
│   │   │   ├── transform.c
│   │   │   └── unplug.c
│   │   ├── output.c
│   │   ├── popup_during_fullscreen.c
│   │   ├── primary_selection.c
│   │   ├── reload.c
│   │   ├── rename.c
│   │   ├── resize.c
│   │   ├── scratchpad.c
│   │   ├── seat/
│   │   │   ├── attach.c
│   │   │   ├── cursor.c
│   │   │   ├── fallback.c
│   │   │   ├── hide_cursor.c
│   │   │   ├── idle.c
│   │   │   ├── keyboard_grouping.c
│   │   │   ├── pointer_constraint.c
│   │   │   ├── shortcuts_inhibitor.c
│   │   │   └── xcursor_theme.c
│   │   ├── seat.c
│   │   ├── set.c
│   │   ├── shortcuts_inhibitor.c
│   │   ├── show_marks.c
│   │   ├── smart_borders.c
│   │   ├── smart_gaps.c
│   │   ├── split.c
│   │   ├── sticky.c
│   │   ├── swap.c
│   │   ├── swaybg_command.c
│   │   ├── swaynag_command.c
│   │   ├── tiling_drag.c
│   │   ├── tiling_drag_threshold.c
│   │   ├── title_align.c
│   │   ├── title_format.c
│   │   ├── titlebar_border_thickness.c
│   │   ├── titlebar_padding.c
│   │   ├── unmark.c
│   │   ├── urgent.c
│   │   ├── workspace.c
│   │   ├── workspace_layout.c
│   │   ├── ws_auto_back_and_forth.c
│   │   └── xwayland.c
│   ├── commands.c
│   ├── config/
│   │   ├── bar.c
│   │   ├── input.c
│   │   ├── output.c
│   │   └── seat.c
│   ├── config.c
│   ├── criteria.c
│   ├── decoration.c
│   ├── desktop/
│   │   ├── idle_inhibit_v1.c
│   │   ├── launcher.c
│   │   ├── layer_shell.c
│   │   ├── output.c
│   │   ├── tearing.c
│   │   ├── transaction.c
│   │   ├── xdg_shell.c
│   │   └── xwayland.c
│   ├── input/
│   │   ├── cursor.c
│   │   ├── input-manager.c
│   │   ├── keyboard.c
│   │   ├── libinput.c
│   │   ├── seat.c
│   │   ├── seatop_default.c
│   │   ├── seatop_down.c
│   │   ├── seatop_move_floating.c
│   │   ├── seatop_move_tiling.c
│   │   ├── seatop_resize_floating.c
│   │   ├── seatop_resize_tiling.c
│   │   ├── switch.c
│   │   ├── tablet.c
│   │   └── text_input.c
│   ├── ipc-json.c
│   ├── ipc-server.c
│   ├── lock.c
│   ├── main.c
│   ├── meson.build
│   ├── realtime.c
│   ├── scene_descriptor.c
│   ├── server.c
│   ├── sway-bar.5.scd
│   ├── sway-input.5.scd
│   ├── sway-ipc.7.scd
│   ├── sway-output.5.scd
│   ├── sway.1.scd
│   ├── sway.5.scd
│   ├── sway_text_node.c
│   ├── swaynag.c
│   ├── tree/
│   │   ├── arrange.c
│   │   ├── container.c
│   │   ├── node.c
│   │   ├── output.c
│   │   ├── root.c
│   │   ├── view.c
│   │   └── workspace.c
│   ├── xdg_activation_v1.c
│   └── xdg_decoration.c
├── sway.desktop
├── swaybar/
│   ├── bar.c
│   ├── config.c
│   ├── i3bar.c
│   ├── image.c
│   ├── input.c
│   ├── ipc.c
│   ├── main.c
│   ├── meson.build
│   ├── render.c
│   ├── status_line.c
│   ├── swaybar-protocol.7.scd
│   └── tray/
│       ├── host.c
│       ├── icon.c
│       ├── item.c
│       ├── tray.c
│       └── watcher.c
├── swaymsg/
│   ├── main.c
│   ├── meson.build
│   └── swaymsg.1.scd
└── swaynag/
    ├── config.c
    ├── main.c
    ├── meson.build
    ├── render.c
    ├── swaynag.1.scd
    ├── swaynag.5.scd
    ├── swaynag.c
    └── types.c

================================================
FILE CONTENTS
================================================

================================================
FILE: .builds/alpine.yml
================================================
image: alpine/edge
packages:
  - cairo-dev
  - eudev-dev
  - gdk-pixbuf-dev
  - json-c-dev
  - lcms2-dev
  - libdisplay-info-dev
  - libevdev-dev
  - libinput-dev
  - libseat-dev
  - libxcb-dev
  - libxkbcommon-dev
  - mesa-dev
  - meson
  - pango-dev
  - pcre2-dev
  - pixman-dev
  - scdoc
  - wayland-dev
  - wayland-protocols
  - xcb-util-image-dev
  - xcb-util-wm-dev
  - xwayland-dev
  - hwdata-dev
sources:
  - https://github.com/swaywm/sway
  - https://gitlab.freedesktop.org/wlroots/wlroots.git
tasks:
  - wlroots: |
      cd wlroots
      meson setup --prefix=/usr build -Dexamples=false
      ninja -C build
      sudo ninja -C build install
  - setup: |
      cd sway
      meson setup build --fatal-meson-warnings -Dauto_features=enabled -Dtray=disabled
  - build: |
      cd sway
      ninja -C build
  - build-no-xwayland: |
      cd wlroots
      meson configure build -Dxwayland=disabled
      ninja -C build
      sudo ninja -C build install

      cd ../sway
      meson configure build --clearcache
      ninja -C build
  - build-static: |
      cd sway
      mkdir subprojects
      ln -s ../../wlroots subprojects/wlroots
      rm -rf build
      meson setup build --fatal-meson-warnings --default-library=static --force-fallback-for=wlroots
      ninja -C build


================================================
FILE: .builds/archlinux.yml
================================================
image: archlinux
packages:
  - cairo
  - gdk-pixbuf2
  - json-c
  - lcms2
  - libdisplay-info
  - libegl
  - libinput
  - libxcb
  - libxkbcommon
  - meson
  - pango
  - pcre2
  - scdoc
  - wayland
  - wayland-protocols
  - xcb-util-image
  - xcb-util-wm
  - xorg-xwayland
  - seatd
  - hwdata
sources:
  - https://github.com/swaywm/sway
  - https://gitlab.freedesktop.org/wlroots/wlroots.git
tasks:
  - wlroots: |
      cd wlroots
      meson setup --prefix=/usr build -Dexamples=false
      ninja -C build
      sudo ninja -C build install
  - setup: |
      cd sway
      meson setup build --fatal-meson-warnings -Dauto_features=enabled -Dsd-bus-provider=libsystemd
  - build: |
      cd sway
      ninja -C build


================================================
FILE: .builds/freebsd.yml
================================================
image: freebsd/latest
packages:
- devel/basu
- devel/json-c
- devel/libevdev
- devel/meson
- devel/pcre2
- devel/pkgconf
- graphics/cairo
- graphics/gdk-pixbuf2
- graphics/lcms2
- graphics/wayland
- graphics/wayland-protocols
- textproc/scdoc
- x11-toolkits/pango
- x11/libxcb
- x11/libxkbcommon
# wlroots dependencies
- devel/evdev-proto
- devel/libepoll-shim
- devel/libudev-devd
- graphics/libdrm
- graphics/mesa-libs
- sysutils/libdisplay-info
- sysutils/seatd
- x11/libinput
- x11/libX11
- x11/pixman
- x11/xcb-util-wm
- x11-servers/xwayland
- misc/hwdata
sources:
- https://github.com/swaywm/sway
- https://gitlab.freedesktop.org/wlroots/wlroots.git
tasks:
- setup: |
    cd sway
    mkdir subprojects
    cd subprojects
    ln -s ../../wlroots wlroots
    cd ..
    meson setup build --fatal-meson-warnings -Dtray=enabled -Dsd-bus-provider=basu
- build: |
    cd sway
    ninja -C build


================================================
FILE: .editorconfig
================================================
# For the full list of code style requirements, see CONTRIBUTING.md

root = true

[*]
charset = utf-8
end_of_line = lf

[*.{c,h,cmake,txt}]
indent_style = tab
indent_size = 4

[*.{xml,yml}]
indent_style = space
indent_size = 2

[config]
indent_style = space
indent_size = 4

[*.md]
trim_trailing_whitespace = false


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bugs
about: Crashes and other bugs
labels: 'bug'

---

### Please read the following before submitting:
- Please do NOT submit bug reports for questions. Ask questions on IRC at #sway on Libera Chat.
- Proprietary graphics drivers, including nvidia, are not supported. Please use the open source equivalents, such as nouveau, if you would like to use Sway.
- Please do NOT submit issues for information from the github wiki. The github wiki is community maintained and therefore may contain outdated information, scripts that don't work or obsolete workarounds.
  If you fix a script or find outdated information, don't hesitate to adjust the wiki page.

### Please fill out the following:
- **Sway Version:**
  - `swaymsg -t get_version` or `sway -v`

- **Debug Log:**
  - Run `sway -d 2> ~/sway.log` from a TTY and upload it to a pastebin, such as gist.github.com.
  - This will record information about sway's activity. Please try to keep the reproduction as brief as possible and exit sway.
  - Attach the **full** file, do not truncate it.

- **Configuration File:**
  - Please try to produce with the default configuration.
  - If you cannot reproduce with the default configuration, please try to find the minimal configuration to reproduce.
  - Upload the config to a pastebin such as gist.github.com.

- **Stack Trace:**
  - This is only needed if sway crashes.
  - If you use systemd, you should be able to open the coredump of the most recent crash with gdb with
    `coredumpctl gdb sway` and then `bt full` to obtain the stack trace.
  - If the lines mentioning sway or wlroots have `??` for the location, your binaries were built without debug symbols. Please compile both sway and wlroots from source and try to reproduce.

- **Description:**
  - The steps you took in plain English to reproduce the problem.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Questions
    url: "https://libera.chat"
    about: "Please ask questions on IRC in #sway on Libera Chat"


================================================
FILE: .github/ISSUE_TEMPLATE/enhancement.md
================================================
---
name: Enhancements
about: New functionality
labels: 'enhancement'

---

### Please read the following before submitting:
- We are not accepting any new window management features unless they get implemented by i3.

### Please fill out the following:
- **Description:**
Please describe in plain English what the enhancement is and what the use case is.


================================================
FILE: .github/ISSUE_TEMPLATE/i3_compat.md
================================================
---
name: i3 Compatibility
about: Sway behaves differently from or lacks i3 functionality
labels: 'i3-compat'

---

### Please read the following before submitting:
- The following either do not make sense for Wayland or we have decided against supporting:
  - `restart`
  - `resource`
  - saving and loading layouts
  - the i3 sync protocol

### Please fill out the following:
- **i3 PR:**
  - If this is new i3 functionality, please add a link to the i3 pull request.

- **Description:**
  - Please describe in plain English how Sway and i3's behaviors differ or what functionality Sway is lacking.


================================================
FILE: .gitignore
================================================
install_manifest.txt
*.swp
*.o
*.a
bin/
test/
build/
build-*/
.cache/
.lvimrc
config-debug
wayland-*-protocol.*
/subprojects/wlroots
subprojects


================================================
FILE: .mailmap
================================================
Ronan Pigott <ronan@rjp.ie> <rpigott@berkeley.edu>


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to sway

Contributing just involves sending a pull request. You will probably be more
successful with your contribution if you visit #sway-devel on Libera Chat
upfront and discuss your plans.

Note: rules are made to be broken. Adjust or ignore any/all of these as you see
fit, but be prepared to justify it to your peers.

## Scope of future changes to sway

**Important**: Sway has completed its core value proposition: it is a fully
featured Wayland-compatible replacement for i3. It is not our intention to
expand on the scope of what i3 aims to accomplish. Our priorities now are
increasing the stability, reliability, and performance of sway within its
current scope. For this reason, most new window management feature requests are
not accepted, even if accompanied by a patch.

## Pull Requests

If you already have your own pull request habits, feel free to use them. If you
don't, however, allow me to make a suggestion: feature branches pulled from
upstream. Try this:

1. Fork sway
2. `git clone https://github.com/username/sway && cd sway`
3. `git remote add upstream https://github.com/swaywm/sway`

You only need to do this once. You're never going to use your fork's master
branch. Instead, when you start working on a feature, do this:

1. `git fetch upstream`
2. `git checkout -b add-so-and-so-feature upstream/master`
3. Add and commit your changes
4. `git push -u origin add-so-and-so-feature`
5. Make a pull request from your feature branch

When you submit your pull request, your commit log should do most of the talking
when it comes to describing your changes and their motivation. In addition to
this, your pull request's comments will ideally include a test plan that the
reviewers can use to (1) demonstrate the problem on master, if applicable and
(2) verify that the problem no longer exists with your changes applied (or that
your new features work correctly). Document all of the edge cases you're aware
of so we can adequately test them - then verify the test plan yourself before
submitting.

## Commit Messages

Please strive to write good commit messages. Here's some guidelines to follow:

The first line should be limited to 50 characters and should be a sentence that
completes the thought [When applied, this commit will...] *"Implement
cmd_move"* or *"Fix #742"* or *"Improve performance of arrange_windows on ARM"*
or similar.

The subsequent lines should be separated from the subject line by a single
blank line, and include optional details. In this you can give justification
for the change, [reference Github
issues](https://help.github.com/articles/closing-issues-via-commit-messages/),
or explain some of the subtler details of your patch. This is important because
when someone finds a line of code they don't understand later, they can use the
`git blame` command to find out what the author was thinking when they wrote
it. It's also easier to review your pull requests if they're separated into
logical commits that have good commit messages and justify themselves in the
extended commit description.

As a good rule of thumb, anything you might put into the pull request
description on Github is probably fair game for going into the extended commit
message as well.

See [here](https://chris.beams.io/posts/git-commit/) for more details.

## Code Review

When your changes are submitted for review, one or more core committers will
look over them. Smaller changes might be merged with little fanfare, but larger
changes will typically see review from several people. Be prepared to receive
some feedback - you may be asked to make changes to your work. Our code review
process is:

1. **Triage** the pull request. Do the commit messages make sense? Is a test
   plan necessary and/or present? Add anyone as reviewers that you think should
   be there (using the relevant GitHub feature, if you have the permissions, or
   with an @mention if necessary).
2. **Review** the code. Look for code style violations, naming convention
   violations, buffer overflows, memory leaks, logic errors, non-portable code
   (including GNU-isms), etc. For significant changes to the public API, loop in
   a couple more people for discussion.
3. **Execute** the test plan, if present.
4. **Merge** the pull request when all reviewers approve.
5. **File** follow-up tickets if appropriate.

## Style Reference

Sway is written in C with a style similar to the [kernel
style](https://www.kernel.org/doc/Documentation/process/coding-style.rst), but
with a few notable differences.

Try to keep your code conforming to C11 and POSIX as much as possible, and do
not use GNU extensions.

### Brackets

Brackets always go on the same line, including in functions.
Always include brackets for if/while/for, even if it's a single statement.
```c
void function(void) {
	if (condition1) {
		do_thing1();
	}

	if (condition2) {
		do_thing2();
	} else {
		do_thing3();
	}
}
```

### Indentation

Indentations are a single tab.

For long lines that need to be broken, the continuation line should be indented
with an additional tab.

If the line being broken is opening a new block (functions, if, while, etc.),
the continuation line should be indented with two tabs, so they can't be
misread as being part of the block.

```c
really_long_function(argument1, argument2, ...,
	argument3, argument4);

if (condition1 && condition2 && ...
		condition3 && condition4) {
	do_thing();
}
```

Try to break the line in the place which you think is the most appropriate to
balance the lines.

### Line Length

Try to keep your lines under 80 columns, assuming a tab width equal to 4 spaces,
but you can go up to 100 if it improves readability. Don't break lines
indiscriminately, try to find nice breaking points so your code is easy to read.

### Names

Global function and type names should be prefixed with `sway_submodule_` (e.g.
`struct sway_output`, `sway_output_destroy`).  For static functions and
types local to a file, the names chosen aren't as important. Static functions
shouldn't have a `sway_` prefix.

For include guards, use the header's filename relative to include.  Uppercase
all of the characters, and replace any invalid characters with an underscore.

### Construction/Destruction Functions

For functions that are responsible for constructing and destructing an object,
they should be written as a pair of one of two forms:

* `init`/`finish`: These initialize/deinitialize a type, but are **NOT**
  responsible for allocating it. They should accept a pointer to some
  pre-allocated memory (e.g. a member of a struct).
* `create`/`destroy`: These also initialize/deinitialize, but will return a
  pointer to a `malloc`ed chunk of memory, and will `free` it in `destroy`.

A destruction function should always be able to accept a NULL pointer or a
zeroed value and exit cleanly; this simplifies error handling a lot.

### Error Codes

For functions not returning a value, they should return a (stdbool.h) bool to
indicated if they succeeded or not.

### Macros

Keep the use of macros to a minimum, especially if a function can do the job. If
you do need to use them, try to keep them close to where they're being used and
`#undef` them after.

### Example

```c
struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) {
	struct wlr_backend *backend;
	if (getenv("WAYLAND_DISPLAY") || getenv("_WAYLAND_DISPLAY")) {
		backend = attempt_wl_backend(display);
		if (backend) {
			return backend;
		}
	}

	const char *x11_display = getenv("DISPLAY");
	if (x11_display) {
		return wlr_x11_backend_create(display, x11_display);
	}

	// Attempt DRM+libinput

	struct wlr_session *session = wlr_session_create(display);
	if (!session) {
		wlr_log(WLR_ERROR, "Failed to start a DRM session");
		return NULL;
	}

	int gpu = wlr_session_find_gpu(session);
	if (gpu == -1) {
		wlr_log(WLR_ERROR, "Failed to open DRM device");
		goto error_session;
	}

	backend = wlr_multi_backend_create(session);
	if (!backend) {
		goto error_gpu;
	}

	struct wlr_backend *libinput = wlr_libinput_backend_create(display, session);
	if (!libinput) {
		goto error_multi;
	}

	struct wlr_backend *drm = wlr_drm_backend_create(display, session, gpu);
	if (!drm) {
		goto error_libinput;
	}

	wlr_multi_backend_add(backend, libinput);
	wlr_multi_backend_add(backend, drm);
	return backend;

error_libinput:
	wlr_backend_destroy(libinput);
error_multi:
	wlr_backend_destroy(backend);
error_gpu:
	wlr_session_close_file(session, gpu);
error_session:
	wlr_session_destroy(session);
	return NULL;
}
```


================================================
FILE: LICENSE
================================================
Copyright (c) 2016-2017 Drew DeVault

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.ar.md
================================================
# sway

sway 

هو مدير للمجموعات المركبة لـ[Wayland] متوافق مع [i3] -

إقرأ [الأسئلة الشائعة](https://github.com/swaywm/sway/wiki)

 انضم الى [قناة IRC](https://web.libera.chat/gamja/?channels=#sway)


## تواقيع الإصدار
 تٌوقع الإصدارات بـواسطة [E88F5E48] و تُنشر على [GitHub](https://github.com/swaywm/sway/releases)

## التثبيت

### بإستخدام الحزم

يتوفر Sway للعديد من التوزيعات، حاول تثبيت حزمة "sway" لتوزيعتك
### التجميع من المصدر
إطلع على [صفحة الويكي هذه](https://github.com/swaywm/sway/wiki/Development-Setup) إذا أردت بناء الـHEAD من sway و wlroots لأغراض الفحص والتطوير 

تثبيت اللوازم: 
* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (optional: system tray)
* [scdoc] (optional: man pages) \*
* git (optional: version info) \*

_\* Compile-time dep_

نفذ هذه الأوامر:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

## الإعدادات

إذا كنت بالفعل تستخدم i3، فعليك نسخ إعدادات i3 لديك إلى  `~/.config/sway/config` وسوف تعمل تلقائياً.

و إلا عليك نسخ ملف الإعدادات النموذج إلى `config/sway/config` الموجود عادةً في `/etc/sway/config.` 


## التشغيل

شغل `sway` بإستخدام أمر TTY. 
قد يعمل بعض مدراء العرض مع أنهم غير مدعومون من sway 
(gdm مثلاً يعمل بشكل جيد إلى حد ما)

[en]: https://github.com/swaywm/sway#readme
[ar]: README.ar.md
[cs]: README.cs.md
[de]: README.de.md
[dk]: README.dk.md
[es]: README.es.md
[fr]: README.fr.md
[ge]: README.ge.md
[gr]: README.gr.md
[hi]: README.hi.md
[hu]: README.hu.md
[ir]: README.ir.md
[it]: README.it.md
[ja]: README.ja.md
[ko]: README.ko.md
[nl]: README.nl.md
[no]: README.no.md
[pl]: README.pl.md
[pt]: README.pt.md
[ro]: README.ro.md
[ru]: README.ru.md
[sv]: README.sv.md
[tr]: README.tr.md
[uk]: README.uk.md
[zh-CN]: README.zh-CN.md
[zh-TW]: README.zh-TW.md
[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[IRC channel]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.az.md
================================================
# sway

sway [i3]-ə uyğun [Wayland] kompozitorudur. [Tez-tez verilən sualları] oxuyun. 
[IRC kanalına] qoşulun ("irc.libera.chat"-da #sway).

## Buraxılış İmzaları

Buraxılışlar [E88F5E48] ilə imzalanıb və [GitHub-da][GitHub releases] dərc edilib.

## Quraşdırma

### Paketlərdən

Sway bir çox distributivdə mövcuddur. Öz distributiviniz üçün 
"sway" paketini quraşdırmağa çalışın.

### Mənbə kodundan kompilyasiya

Test və ya inkişaf üçün sway və wlroots-un HEAD-ini qurmaq istəyirsinizsə, 
[bu viki səhifəsini][Development setup] nəzərdən keçirin.

Asılılıqları quraşdırın:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (ixtiyari: sistem trayı üçün əlavə şəkil formatları)
* [swaybg] (ixtiyari: divar kağızı)
* [scdoc] (ixtiyari: man səhifələri) \*
* git (ixtiyari: versiya məlumatı) \*

_\* Kompilyasiya asılılıqları_

Bu əmrləri icra edin:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

## Konfiqurasiya

Əgər artıq i3-dən istifadə edirsinizsə, i3 konfiqurasiyanızı `~/.config/sway/config` 
ünvanına köçürün və o, dərhal işləyəcək. Əks halda, nümunə konfiqurasiya faylını 
`~/.config/sway/config` ünvanına köçürün. O, adətən `/etc/sway/config` ünvanında yerləşir.
Konfiqurasiya haqqında məlumat üçün `man 5 sway` əmrini icra edin.

## İşə Salma

TTY-dan `sway`-ı işə salın. Bəzi ekran menecerləri işləyə bilər, lakin sway tərəfindən 
dəstəklənmir (gdm-in kifayət qədər yaxşı işlədiyi məlumdur).

[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[Tez-tez verilən sualları]: https://github.com/swaywm/sway/wiki
[IRC kanalına]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[swaybg]: https://github.com/swaywm/swaybg/
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.cs.md
================================================
# sway

sway je [waylandový][Wayland] kompozitor kompatibilní s [i3]. Přečtěte si
[FAQ (anglicky)][FAQ]. Připojte se na [IRC kanál (anglicky)][IRC channel]
\(#sway na irc.libera.chat).

## Podpisy vydání

Vydané verze jsou podepsány klíčem [E88F5E48] a publikovány
[na GitHubu][GitHub releases].

## Instalace

### Z balíků

Sway je dostupný v mnoha distribucích. Zkuste v té vaší nainstalovat balík "sway".

### Kompilace ze zdrojových kódů

Pokud chcete sestavit HEAD repozitáře sway a wlroots pro testování nebo vývoj,
použijte návod na [této stránce na wiki (anglicky)][Development setup].

Nainstalujte závislosti:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (volitelné: dodatečné formáty ikon pro oznamovací oblast)
* [swaybg] (volitelné: tapeta plochy)
* [scdoc] (volitelné: man stránky) \*
* git (volitelné: informace o verzi) \*

_\* Závislost pouze pro kompilaci_

Spusťte tyto příkazy:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

## Konfigurace

Pokud již používáte i3, zkopírujte svou konfiguraci i3 do `~/.config/sway/config`
a ta bude ihned fungovat. Jinak zkopírujte do `~/.config/sway/config` ukázkový
konfigurační soubor. Ten se obvykle nachází v `/etc/sway/config`.
Pro více informací o konfiguraci spusťte `man 5 sway`.

## Spuštění

Spusťte `sway` z TTY nebo ze správce displeje.

[en]: https://github.com/swaywm/sway#readme
[ar]: README.ar.md
[cs]: README.cs.md
[de]: README.de.md
[dk]: README.dk.md
[es]: README.es.md
[fr]: README.fr.md
[ge]: README.ge.md
[gr]: README.gr.md
[hi]: README.hi.md
[hu]: README.hu.md
[ir]: README.ir.md
[it]: README.it.md
[ja]: README.ja.md
[ko]: README.ko.md
[nl]: README.nl.md
[no]: README.no.md
[pl]: README.pl.md
[pt]: README.pt.md
[ro]: README.ro.md
[ru]: README.ru.md
[sv]: README.sv.md
[tr]: README.tr.md
[uk]: README.uk.md
[zh-CN]: README.zh-CN.md
[zh-TW]: README.zh-TW.md
[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[IRC channel]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[swaybg]: https://github.com/swaywm/swaybg/
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.de.md
================================================
# Sway
Sway ist ein [i3]-kompatibler [Wayland]-Compositor. Lies die [FAQ]. Tritt dem [IRC Channel] bei (#sway on irc.libera.chat; Englisch).

## Signaturen
Jeder Release wird mit dem PGP-Schlüssel [E88F5E48] signiert und [auf GitHub][GitHub releases] veröffentlicht.

## Installation

### Über die Paketverwaltung

Sway kann in vielen Distributionen direkt durch die Paketverwaltung installiert werden. Versuche einfach das Paket "sway" zu installieren.

### Quellcode selbst kompilieren

sway benötigt die folgenden Pakete:

* meson \*
* [wlroots]
* wayland
* wayland-protocols\*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (Optional, wird für das Benachrichtigungsfeld (System Tray) benötigt)
* [swaybg] (Optional, wird für das Setzen von Desktophintergrundbildern benötigt)
* [scdoc] (Optional, wird für die Dokumentation (Man Pages) benötigt)\*
* git (Optional: Versionsinfo)\*

_\*Werden nur für das Kompilieren benötigt_

Führe die folgenden Befehle aus:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

Schaue in das [Wiki][Development setup] (Englisch) für Informationen, falls du zum Testen oder Entwickeln den neuesten Stand (HEAD) von sway und wlroots kompilieren willst.

## Konfiguration

Falls du von i3 migrierst, kannst du deine Konfigurationsdatei nach `~/.config/sway/config` kopieren und die Einstellungen sollten ohne Weiteres funktionieren. Ansonsten kannst du die Beispielkonfiguration, die normalerweise in `/etc/sway/config` liegt, nach `~/.config/sway/config` kopieren. Die Dokumentation zur Konfigurationsdatei findest du in `man 5 sway`.

## Sway starten
Sway kann einfach mit dem Befehl `sway` vom TTY oder mithilfe eines Displaymanagers gestartet werden.

[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[IRC channel]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[swaybg]: https://github.com/swaywm/swaybg
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.dk.md
================================================
# Sway

Sway er en [i3]-kompatibel [Wayland] compositor. Læs [Ofte stillede spørgsmål].
Deltag på [IRC kanalen][IRC kanal] \(#sway på irc.libera.chat).

## Udgivelses Signaturer

Udgivelser er signeret med [E88F5E48] og publiceret [på GitHub][GitHub
releases].

## Installation

### Fra pakker

Sway er tilgængelig i mange distributioner. Prøv at installere "sway" pakken
fra din.

Hvis du er interesseret i at pakke Sway til din distribution, kan du tage forbi
IRC kanalen eller sende en email til sir@cmpwn.com for rådgivning.

### Kompilering fra kildekode

Se [denne wiki-side][Opsætning til udvikling] hvis du vil bygge HEAD af sway og
wlroots til test eller udvikling.

Installationsafhængigheder:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (valgfrit: system tray)
* [scdoc] (valgfrit: man pages) \*
* git \*

_\*Kompileringsafhængighed_

Kør følgende kommandoer:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## Konfiguration

Hvis du allerede bruger i3 kan du bare kopiere din i3 konfiguration til
`~/.config/sway/config`. Ellers skal du kopiere eksempelkonfigurationsfilen til
`~/.config/sway/config`. Den er normalt placeret i `/etc/sway/config`.  Kør
`man 5 sway` for at få oplysninger om konfigurationen.

## Eksekvering

Kør `sway` fra en TTY eller fra en display manager.

[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[Ofte stillede spørgsmål]: https://github.com/swaywm/sway/wiki
[IRC kanal]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Opsætning til udvikling]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.es.md
================================================
# sway

sway es un compositor de [Wayland](http://wayland.freedesktop.org/) compatible con [i3](https://i3wm.org/).
Lea el [FAQ](https://github.com/swaywm/sway/wiki). Únase al [canal de IRC](https://web.libera.chat/gamja/?channels=#sway) (#sway on
irc.libera.chat).

## Firmas de las versiones

Las distintas versiones están firmadas con [E88F5E48](https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48)
y publicadas [en GitHub](https://github.com/swaywm/sway/releases).

## Instalación

### Usando paquetes

Sway está disponible en muchas distribuciones. Pruebe instalando el paquete "sway" desde la suya.
Si no está disponible, puede consultar [esta documentación](https://github.com/swaywm/sway/wiki/Unsupported-packages) 
y así obtener información acerca de como instalarlo.

Si está interesado en crear un paquete para su distribución, únase al canal de IRC  o
escriba un email a sir@cmpwn.com

### Compilando el código fuente

Instale las dependencias:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (optional: system tray)
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (optional: man pages) \*
* git \*

_\*Compile-time dep_

Desde su consola, ejecute las órdenes:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## Configuración

Si ya utiliza i3, copie su archivo de configuración de i3 a `~/.config/sway/config` y
sway funcionará sin tener que configurar nada más. En otro caso, copie el archivo de
configuración básico a `~/.config/sway/config`, normalmente se encuentra en `/etc/sway/config`.
Ejecute `man 5 sway` para obtener información sobre la configuración.

## Ejecución

Ejecute `sway` desde su consola. Algunos gestores de pantalla pueden funcionar sin estar 
soportados por `sway` (sabemos que gdm funciona bastante bien).


================================================
FILE: README.fr.md
================================================
# sway

Sway est un compositeur [Wayland] compatible avec [i3]. Lisez la
[FAQ]. Rejoignez le [canal IRC] (#sway sur irc.libera.chat).

## Aide en français

[abdelq] fournit du support en français sur IRC et Github, dans le fuseau
horaire UTC-4 (EST).

## Signatures de nouvelles versions

Les nouvelles versions sont signées avec [E88F5E48] et publiées
[sur GitHub][versions GitHub].

## Installation

### À partir de paquets

Sway est disponible sur beaucoup de distributions. Essayez d'installer le
paquet "sway" pour la vôtre.

Si vous êtes intéressé à maintenir Sway pour votre distribution, passez sur le
canal IRC ou envoyez un e-mail à sir@cmpwn.com (en anglais seulement) pour des
conseils.

### Compilation depuis les sources

Consultez [cette page wiki][Configuration de développement] si vous souhaitez
compiler la révision HEAD de sway et wlroots pour tester ou développer.

Installez les dépendances :

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (optionnel : system tray)
* [scdoc] (optionnel : requis pour les pages man) \*
* git (optionnel : information de version) \*

_\* Requis uniquement pour la compilation_

Exécutez ces commandes :

    meson setup build
    ninja -C build
    sudo ninja -C build install

## Configuration

Si vous utilisez déjà i3, copiez votre configuration i3 vers
`~/.config/sway/config` et sway fonctionnera directement. Sinon, copiez
l'exemple de fichier de configuration vers `~/.config/sway/config`. Il se
trouve généralement dans `/etc/sway/config`. Exécutez `man 5 sway` pour lire la
documentation pour la configuration de sway.

## Exécution

Exécutez `sway` à partir d'un TTY ou d'un gestionnaires d'affichage.

[Wayland]: http://wayland.freedesktop.org/
[i3]: https://i3wm.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[canal IRC]: https://web.libera.chat/gamja/?channels=#sway
[abdelq]: https://github.com/abdelq
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[versions GitHub]: https://github.com/swaywm/sway/releases
[Configuration de développement]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.ge.md
================================================
# sway

sway არის [i3]-თავსებადი [Wayland]-ის კომპოზიტორი. მეტი ინფორმაციისთვის იხილეთ 
[FAQ]. დაუკავშირდით [IRC არხს][IRC channel] \(#sway irc.libera.chat-ზე).

## გამოშვების ხელმოწერები

გამოშვებები ხელმოწერილია [E88F5E48]-ით და გამოქვეყნებულია [GitHub-ზე][GitHub releases].

## ინსტალაცია

### რეპოზიტორიიდან

Sway არის ხელმისაწვდომი ბევრი დისტრიბუტაციისთვის. ცადეთ "sway" პაკეტის ინსტალაცია თქვენთვის.

### კოდის კომპილაცია

იხილეთ [ეს ვიკი გვერდი][Development setup] თუ გინდათ რომ ააწყოთ sway და wlroots სატესტოდ ან დეველოპმენტისთვის.

დააინსტალირეთ დამოკიდებულებები:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (ასევე არჩევითია: system tray)
* [scdoc] (ასევე არჩევითია: man pages) \*
* git (ასევე არჩევითია: version info) \*

_\* Compile-time dep_

გაუშვით ეს ბრძანებები:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

## კონფიგურაცია

თუ უკვე იყენებთ i3-ს, მაშინ დააკოპირე i3 კონფიგურაცია და ჩასვი `~/.config/sway/config` 
და უპრობლემოდ იმუშავებს პირდაპირ. წინააღმდეგ შემთხვევაში კონფიგურაციის ნიმუში ჩააკოპირეთ აქ: `~/.config/sway/config`. კომპიგურაციის ნიმუში ხშირ შემთხვევაში არის `/etc/sway/config`.
გაუშვი `man 5 sway` კონპიგურაციაზე ინფორმაციის მისაღებად.

## გაშვება

გაუშვი `sway` TTY-ისთვის. ზოგიერთმა ლოგინ მენეჯერმა შეიძლება იმუშავოს, მაგრამ არ
არის მხარდაჭერილი sway-სგან (როგორც წესი კარგად მუშაობს gdm).

[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[IRC channel]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.gr.md
================================================
# Sway

Το sway ένα [i3]-συμβατό [Wayland] compositor. Διαβάστε το [FAQ]. Μπείτε στο
[IRC channel] \(#sway on irc.libera.chat).

## Υπογραφές δημοσιεύσεων

Οι εκδόσεις είναι υπογεραμμένες με [E88F5E48] και δημοσιευμένες [στο GitHub][GitHub releases].

## Εγκατάσταση

### Από πακέτα

Το Sway είναι διαθέσιμο σε πολλά distributions. Δοκιμάστε εγκαταστώντας το "sway" package για
το δικό σας.

Εάν ενδιαφέρεστε για packaging του sway για το distribution σας, να πάτε στο IRC
channel ή στείλτε ένα email στο sir@cmpwn.com για συμβουλές.

### Compiling από πηγή

Τσεκάρετε [αυτό το wiki page][Development setup] εάμα θέλετε να κάνετε build το HEAD του
sway και wlroots γιά τεστάρισμα ή development.

Εγκατάσταση των dependencies:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (προαιρετικό: system tray)
* [scdoc] (προαιρετικό: man pages) \*
* git (προαιρετικό: πληροφορίες εκδώσεων) \*

_\*Compile-time dep_

Τρέξτε αυτά τα commands:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

## Configuration

Εάν ήδη χρησιμοποιήτε το i3, αντιγράψτε το i3 config σας στο `~/.config/sway/config` και
θα δουλέψει out of the box. Αλλιώς, αντιγράψτε το sample configuration αρχείο στο
`~/.config/sway/config`. Το οποίο συνήθως βρίσκεται στο `/etc/sway/config`.
Κάντε run `man 5 sway` για πληροφορίες τού configuration.

## Τρέχοντας

Τρέξτε `sway` από ένα TTY. Μερίκα display managers μπορεί να δουλέψουν αλλά δέν είναι συμβατά με
το sway (το gdm γνωρίζεται να δουλέβει σχετικά καλά).

[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[IRC channel]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc

================================================
FILE: README.hi.md
================================================
# sway

sway एक [i3](https://i3wm.org/)-अनुकूल
[Wayland](https://wayland.freedesktop.org/) Compositor है।
[FAQ](https://github.com/swaywm/sway/wiki) पढिये। [IRC
Channel](https://web.libera.chat/gamja/?channels=#sway)
(irc.libera.chat पर #sway) में भी जुडिये।

## रिलीज हस्ताक्षर

रिलीजें
[E88F5E48](https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48)
से साइन होतें हैं और [Github पर](https://github.com/swaywm/sway/releases) प्रकाशित होते हैं।

## इंस्टौलेशन

### पैकेजों के द्वारा

Sway कई distributions में उप्लब्ध है। आप अपने में "sway" नामक पैकेज इंस्टौल करके देख
सकते हैं।

### Source से compile करके

यदि आप परीक्षण और विकास के लिए sway और wlroots के नवीनतम संस्करण बनाना
चाहते हैं, तो [यह विकी
पृष्ठ](https://github.com/swaywm/sway/wiki/Development-Setup) देखें।

निर्भरताएं:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf (वैकल्पिक: system tray के लिये)
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (वैकल्पिक: man पृष्ठों के लिये)
  \*
* git (वैकल्पिक: संस्करण जानने के लिये)

_\* Compilation के समय आवश्यक_

ये commands चलाएं:

	meson setup build/
	ninja -C build/
	sudo ninja -C build/ install

## Configuration

अगर आप पहले से ही i3 का उपयोग करते हैं तो अपने i3 config को
`~/.config/sway/config` में copy कर लीजिये और वह बिना किसी परिवर्तन के काम
करेगा। अन्यथा, नमूने configuration file को `~/.config/sway/config` में copy
कर लीजिये। यह सामान्यतः `/etc/sway/config` में पाया जाता है। `man 5
sway` से आप configuration के बारे में जानकारी प्राप्त कर सकते हैं।

## चलाना

आप एक tty से `sway` को चला सकते हैं। कुछ display managers काम करते हैं परन्तु ये
sway के द्वारा समर्थित नहीं है (gdm के बारे में जाना गया है कि वह सही काम करता
है)।


================================================
FILE: README.hu.md
================================================
# sway

A Sway egy [i3]-kompatibilis [Wayland]-kompozitor. Olvasd el a [Gyarkan Ismételt Kérdéseket][FAQ]. Csatlakozz az [IRC-csatornához][IRC channel] \(`#sway` az `irc.libera.chat`-en).

## Csomagaláírások

A kiadott csomagok az [E88F5E48] kulccsal vannak aláírva, és [GitHubon][GitHub releases] publikálva.

## Telepítés

### Csomagból

A Sway sok disztribúció csomagkezelőjéből elérhető, próbáld meg a "sway"
csomagot telepíteni az általad használt eszközzel.

Ha szeretnél csomagot készíteni a saját disztribúciódhoz, ugorj be az IRC-
csatornára, vagy küldj levelet a sir@cmpwn.com címre tanácsokért.

### Fordítás forráskódból

Olvasd el [ezt a wikioldalt][Development setup], ha szeretnéd tesztelési vagy
fejlesztési célokból lefordítani az aktuális (HEAD) állapotát a `sway`-nek és a
`wlroots`-nak.

Telepítsd a függőségeket:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (opcionális: system tray)
* [scdoc] (opcionális: man pages) \*
* git (opcionális: version info) \*

_\*Fordításidejű függőség_

Futtasd ezeket a parancsokat:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## Konfiguráció

Ha előzőleg i3-at használtál, akkor átmásolhatod az i3-beállításaidat a
`~/.config/sway/config` file-ba és ugyanúgy működni fognak. Egyéb esetben másold
le kiindulási alapnak a mintát, ami általában az `etc/sway/config` elérési
útvonalon található.
Futtasd a `man 5 sway` parancsot további információért a konfigurációval
kapcsolatban.

## Futtatás

Futtasd a `sway` parancsot egy TTY-felületről. Néhány bejelentkezéskezelő
(display manager) működhet, de alapvetően nem támogatottak a sway által. (A
gdm-ről ismeretes, hogy egész jól működik.)

[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[IRC channel]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.ir.md
================================================
# sway

&rlm;sway یک کامپوزیتور الهام گرفته از [i3](https://i3wm.org/) بر روی [Wayland](http://wayland.freedesktop.org/) است. [سوال‌های متداول](https://github.com/swaywm/sway/wiki) را بخوانید. در [کانال
IRC](http://web.libera.chat/gamja/?channels=sway&uio=d4) عضو شوید (&lrm;#sway&rlm; در
irc.libera.chat).

برای حمایت از تیم توسعه sway به [صفحه
Patreon با نام کاربری SirCmpwn](https://patreon.com/sircmpwn) مراجعه کنید.

## امضای نسخه‌ها

امضای نسخه‌ها با [B22DA89A](http://pgp.mit.edu/pks/lookup?op=vindex&search=0x52CB6609B22DA89A) در [GitHub](https://github.com/swaywm/sway/releases) منتشر می‌شود.

## شیوه نصب

### از بسته‌های رسمی

&rlm;sway در بسته‌های رسمی توزیع‌های مختلف وجود دارد. بسته «sway» را نصب کنید. در صورتی که بسته رسمی وجود نداشت، برای آگاهی بیشتر درباره نصب روی توزیعتان به این [صفحه راهنما](https://github.com/swaywm/sway/wiki/Unsupported-packages) مراجعه کنید.

اگر به ایجاد بسته sway برای توزیعتان علاقه‌مند هستید، از کانال IRC استفاده کنید یا به sir@cmpwn.com ایمیل بزنید.

### کامپایل کردن کد

چنانچه می‌خواهید آخرین نسخه کد sway و wlroots را برای آزمایش یا توسعه بسازید به این [صفحه راهنما](https://github.com/swaywm/sway/wiki/Development-Setup) مراجعه کنید.

بسته‌های مورد نیاز:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (انتخابی: برای system tray)
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (انتخابی: برای صفحه‌های راهنما) \*
* git (انتخابی: برای اطلاع در خصوص نسخه‌ها) \*

_\*نیازمندی‌های زمان کامپایل برنامه_

این فرمان‌ها را اجرا کنید:

    meson setup build
    ninja -C build
    sudo ninja -C build install

### شخصی سازی و تنظیمات

اگر در حال حاضر از i3 استفاده می‌کنید، تنظیمات i3 خودتان را در فایل ‪`~/.config/sway/config`‬ کپی کنید و بدون نیاز به تغییر کار خواهد کرد. در غیر این‌صورت، فایل نمونه تنظیمات را استفاده کنید. این فایل عموما در ‪`/etc/sway/config`‬ قرار دارد. برای آگاهی بیشتر `man 5 sway` را اجرا کنید.

## اجرا

در محیط TTY کافیست `sway` را اجرا کنید. ممکن است ابزارهای مدیریت نمایشگری نیز برای این کار وجود داشته باشند اما از طرف sway پشتیبانی نمی‌شوند (gdm عملکرد خوبی در این زمینه دارد).


================================================
FILE: README.it.md
================================================
# sway

sway è un compositore di [Wayland] compatibile con [i3]. Leggi le [FAQ].
Unisciti al [canale IRC] \(#sway su irc.libera.chat).

## Firma delle versioni

Le versioni sono firmate con la chiave [E88F5E48] e sono pubblicate
[su GitHub][GitHub releases].

## Installazione

### Da un pacchetto

Sway è disponibile in molte distribuzioni, prova a installare il pacchetto
"sway" per la tua.

### Compilazione dei sorgenti

Consulta [questa pagina del wiki][Development setup] se vuoi compilare l'HEAD
di sway e wlroots per testarli o contribuire allo sviluppo.

Installa le dipendenze:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre
* json-c
* pango
* cairo
* gdk-pixbuf2 (opzionale: area di notifica)
* [scdoc] (opzionale: pagine del manuale) \*
* git (opzionale: informazioni sulla versione) \*

_\* Dipendenza necessaria per la compilazione_

Esegui questi comandi:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

## Configurazione

Se hai già usato i3, copia il tuo file di configurazione in
`~/.config/sway/config` e sway funzionerà immediatamente. Altrimenti, copia il
file d'esempio in `~/.config/sway/config`, generalmente è situato in
`/etc/sway/config`. Consulta `man 5 sway` per ulteriori informazioni sulla
configurazione.

## Esecuzione

Lancia `sway` da un TTY o da un display manager.

[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[canale IRC]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.ja.md
================================================
# sway

Swayは[i3](https://i3wm.org/)互換な[Wayland](http://wayland.freedesktop.org/)コンポジタです。
[FAQ](https://github.com/swaywm/sway/wiki)も合わせてご覧ください。
[IRC チャンネル](https://web.libera.chat/gamja/?channels=#sway) (irc.libera.chatの#sway)もあります。

[![](https://sr.ht/ICd5.png)](https://sr.ht/ICd5.png)

## 日本語サポート

SirCmpwnは、日本語でのサポートをIRCとGitHubで行います。タイムゾーンはUTC-4です。

## リリースの署名

Swayのリリースは[E88F5E48](https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48)で署名され、[GitHub](https://github.com/swaywm/sway/releases)で公開されています。

## インストール

### パッケージから

Swayは沢山のディストリビューションで提供されています。"sway"パッケージのインストールを試してください。パッケージが存在しない場合は、[このページ](https://github.com/swaywm/sway/wiki/Unsupported-packages)で、あなたのディストリビューションでのインストールに関する情報を調べてください。

あなたのディストリビューションにSwayのパッケージを提供したい場合は、SwayのIRCチャンネルを訪れるか、sir@cmpwn.comにメールを送り、相談してください。

### ソースコードからコンパイル

次の依存パッケージをインストールしてください:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (任意: システムイコンで必要です)
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (任意: manで必要です) \*
* git (任意: バージョン情報で必要です) \*

_\*コンパイル時の依存_

次のコマンドを実行してください:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## 設定

既にi3を使用している場合は、i3の設定ファイルを`~/.config/sway/config`にコピーすれば動きます。そうでない場合は、サンプルの設定ファイルを`~/.config/sway/config`にコピーしてください。サンプルの設定ファイルは、通常`/etc/sway/config`にあります。`man 5 sway`を実行することで、設定に関する情報を見ることができます。

## 実行

`sway`をTTYまたはディスプレイマネージャから実行してください。


================================================
FILE: README.ko.md
================================================
# sway

sway는 [i3](https://i3wm.org/)-호환 [Wayland](http://wayland.freedesktop.org/) 컴포지터입니다.
[FAQ](https://github.com/swaywm/sway/wiki)를 읽어보세요. [IRC 채널](https://web.libera.chat/gamja/?channels=#sway) (#sway on irc.libera.chat)도 있습니다.

## 릴리즈 서명

릴리즈는 [E88F5E48](https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48)에서 서명되고,
[GitHub에서](https://github.com/swaywm/sway/releases) 공개되고 있습니다.

## 설치

### 패키지를 통한 설치

Sway는 많은 배포판에서 이용할 수 있습니다. "sway" 패키지를 설치해 보세요.
만약 없다면, [위키 페이지](https://github.com/swaywm/sway/wiki/Unsupported-packages)를 확인하세요.
해당 배포판에 대한 설치 정보를 확인할 수 있습니다.

당신의 배포판에 sway 패키지를 제공하고 싶다면,
IRC 채널을 방문하거나 sir@cmpwn.com으로 이메일을 보내 상담 받으세요.

### 소스를 통한 컴파일

다음 의존 패키지들을 설치해 주세요:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (선택: system tray)
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (선택: man pages) \*
* git \*

_\*컴파일 떄 필요_

다음 명령을 실행하세요:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## 설정

i3를 이미 사용 중이라면, i3 config을 `~/.config/sway/config`로 복사하세요.
아니면, 샘플 구성 파일을 '~/.config/sway/config'에 복사할 수도 있습니다.
일반적으로 "/etc/sway/config"에 위치해 있습니다.
설정에 대한 정보를 보려면 "man 5 sway"를 실행하세요.

## 실행

TTY나 display manager에서 `sway`를 실행하세요.


================================================
FILE: README.md
================================================
# sway

**[English][en]** - [عربي][ar] - [Azərbaycanca][az] - [Česky][cs] - [Deutsch][de] - [Dansk][dk] - [Español][es] - [Français][fr] - [ქართული][ge] - [Ελληνικά][gr] - [हिन्दी][hi] - [Magyar][hu] - [فارسی][ir] - [Italiano][it] - [日本語][ja] - [한국어][ko] - [Nederlands][nl] - [Norsk][no] - [Polski][pl] - [Português][pt] - [Română][ro] - [Русский][ru] - [Српски][sr] - [Svenska][sv] - [Türkçe][tr] - [Українська][uk] - [中文-简体][zh-CN] - [中文-繁體][zh-TW]

sway is an [i3]-compatible [Wayland] compositor. Read the [FAQ]. Join the
[IRC channel] \(#sway on irc.libera.chat).

## Release Signatures

Releases are signed with [E88F5E48] and published [on GitHub][GitHub releases].

## Installation

### From Packages

Sway is available in many distributions. Try installing the "sway" package for
yours.

### Compiling from Source

Check out [this wiki page][Development setup] if you want to build the HEAD of
sway and wlroots for testing or development.

Install dependencies:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (optional: additional image formats for system tray)
* [swaybg] (optional: wallpaper)
* [scdoc] (optional: man pages) \*
* git (optional: version info) \*

_\* Compile-time dep_

Run these commands:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

## Configuration

If you already use i3, then copy your i3 config to `~/.config/sway/config` and
it'll work out of the box. Otherwise, copy the sample configuration file to
`~/.config/sway/config`. It is usually located at `/etc/sway/config`.
Run `man 5 sway` for information on the configuration.

## Running

Run `sway` from a TTY or from a display manager.

[en]: https://github.com/swaywm/sway#readme
[ar]: README.ar.md
[az]: README.az.md
[cs]: README.cs.md
[de]: README.de.md
[dk]: README.dk.md
[es]: README.es.md
[fr]: README.fr.md
[ge]: README.ge.md
[gr]: README.gr.md
[hi]: README.hi.md
[hu]: README.hu.md
[ir]: README.ir.md
[it]: README.it.md
[ja]: README.ja.md
[ko]: README.ko.md
[nl]: README.nl.md
[no]: README.no.md
[pl]: README.pl.md
[pt]: README.pt.md
[ro]: README.ro.md
[ru]: README.ru.md
[sr]: README.sr.md
[sv]: README.sv.md
[tr]: README.tr.md
[uk]: README.uk.md
[zh-CN]: README.zh-CN.md
[zh-TW]: README.zh-TW.md
[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[IRC channel]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[swaybg]: https://github.com/swaywm/swaybg/
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.nl.md
================================================
# sway

Sway is een [i3](https://i3wm.org/)-compatibele [Wayland](http://wayland.freedesktop.org/) compositor.
Lees de [FAQ](https://github.com/swaywm/sway/wiki). Word lid van het [IRC
kanaal](https://web.libera.chat/gamja/?channels=#sway) (#sway op
irc.libera.chat).

## Releasehandtekeningen

Releases worden ondertekend met [E88F5E48](https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48)
en gepubliceerd [op GitHub](https://github.com/swaywm/sway/releases).

## Installatie

### Via een pakket

Sway is beschikbaar in vele distributies. Probeer het "sway"-pakket te installeren met jouw pakketbeheerapplicatie. Als het niet beschikbaar is, bekijk dan [deze wikipagina](https://github.com/swaywm/sway/wiki/Unsupported-packages)
voor informatie over installatie in jouw distributie.

Als je geïnteresseerd bent in het maken van pakketten voor je distributie, stuur een bericht in het IRC-
kanaal of stuur een e-mail naar sir@cmpwn.com voor advies.

### Compilatie vanuit broncode

Afhankelijkheden installeren:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (optioneel: systeemtray)
* [scdoc](https://git.sr.ht/~ircmpwn/scdoc) (optioneel: manpagina's) \*
* git \*

_\* Compileerafhankelijkheden_

Voer deze opdrachten uit:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## Configuratie

Als je al i3 gebruikt, kopieer dan je i3-configuratie naar `~/.config/sway/config` en
het zal zonder verdere configuratie werken. Kopieer anders het voorbeeldconfiguratiebestand naar
`~/.config/sway/config`. Dit is meestal het bestand: `/etc/sway/config`.
Voer `man 5 sway` uit voor informatie over het configureren van sway.

## Uitvoeren

Voer `sway` vanaf een TTY uit. Sommige display-managers kunnen werken, maar worden niet ondersteund door
sway (van gdm is bekend dat het redelijk goed werkt).


================================================
FILE: README.no.md
================================================
# Sway

Sway er en [i3]-kompatibel [Wayland]-compositor. Les [Ofte stilte spørsmål].
Delta på [IRC-kanalen][IRC-kanal] \(#sway på irc.libera.chat).

## Signaturer

Utgivelser er signert med [E88F5E48] og publisert [på GitHub][GitHub releases].

## Installasjon

### Fra systempakker

Sway er tilgjengelig i mange distribusjoner. Prøv å installere pakken "sway"
fra din distro sine repoer.

### Kompilering fra kildekode

Se [denne wiki-siden][Oppsetting for utvikling] hvis du vil bygge fra HEAD-grenen av
sway og wlroots for testing eller utvikling.

Installer avhengigheter:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (valgfritt: støtte for ekstra bildeformater i system tray)
* [swaybg] (valgfritt: bakgrunnsbilde)
* [scdoc] (valgfritt: man pages) \*
* git (valgfritt: versjonsinformasjon) \*

_\* Kompileringsavhengigheter_

Kjør følgende kommandoer:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

## Konfigurasjon

Hvis du allerede bruker i3 kan du bare kopiere din i3-konfigurasjon til
`~/.config/sway/config`. Ellers skal du kopiere eksempelkonfigurasjonsfilen til
`~/.config/sway/config`. Eksempelfilen er normalt plasert i `/etc/sway/config`.
Kjør `man 5 sway` for å få opplysninger om konfigurasjonen.

## Kjøring

Kjør `sway` fra en TTY eller fra en display manager.

[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[Ofte stilte spørsmål]: https://github.com/swaywm/sway/wiki
[IRC-kanal]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Oppsetting for utvikling]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[swaybg]: https://github.com/swaywm/swaybg/
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.pl.md
================================================
# sway

sway jest kompozytorem [Wayland](http://wayland.freedesktop.org/) kompatybilnym z [i3](https://i3wm.org/).
Przeczytaj [FAQ](https://github.com/swaywm/sway/wiki). Dołącz do [kanału IRC](https://web.libera.chat/gamja/?channels=#sway)
(#sway na irc.libera.chat).

## Podpisy cyfrowe wydań

Wydania są podpisywane przy pomocy klucza [E88F5E48](https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48)
i publikowane [na GitHubie](https://github.com/swaywm/sway/releases).

## Instalacja

### Z pakietów

Sway jest dostępny w wielu dystybucjach. Spróbuj zainstalować pakiet "sway" w swoim
menedżerze pakietów. Jeśli nie jest dostępny, sprawdź [tę stronę wiki](https://github.com/swaywm/sway/wiki/Unsupported-packages)
aby uzyskać informacje dotyczące instalacji w swojej dystrybucji.

Jeśli chciałbyś stworzyć pakiet sway dla swojej dystrybucji, odwiedź kanał IRC lub wyślij email na
adres sir@cmpwn.com w celu uzyskania wskazówek.

### Kompilacja ze Źródła

Zainstaluj zależności:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (opcjonalnie: system tray)
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (opcjonalnie: strony pomocy man) \*
* git \*

_\*zależności kompilacji_

Wykonaj następujące polecenia:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## Konfiguracja

Jeśli już korzystasz z i3, skopiuj swoją konfigurację i3 do katalogu `~/.config/sway/config` i
zadziała od ręki. W przeciwnym razie skopiuj przykładowy plik konfiguracyjny do folderu
`~/.config/sway/config`; zazwyczaj znajduje się w `/etc/sway/config`.
Wykonaj polecenie `man 5 sway` aby uzyskać informacje dotyczące konfiguracji.

## Uruchamianie

Wykonaj polecenie `sway` z poziomu TTY lub menedżera wyświetlania.


================================================
FILE: README.pt.md
================================================
# sway

O sway é um compositor do [Wayland](http://wayland.freedesktop.org/) compatível com o [i3](https://i3wm.org/).
Leia o [FAQ](https://github.com/swaywm/sway/wiki). Junte-se ao [canal do    
IRC](https://web.libera.chat/gamja/?channels=#sway) (#sway em
irc.libera.chat).

## Assinatura das versões

As versões são assinadas com [E88F5E48](https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48)
e publicadas [no GitHub](https://github.com/swaywm/sway/releases).

## Instalação

### A partir de pacotes
O Sway está disponível em várias distribuições. Tente instalar o pacote "sway"
na sua. Caso não esteja disponível, verifique [esta wiki](https://github.com/swaywm/sway/wiki/Unsupported-packages)
para se informar a sobre a instalação para sua distribuição.

Se você está interessado em criar um pacote do sway para a sua distribuição, verifique canal do IRC
ou mande um email para sir@cmpwn.com para obter informações.

### Compilando a partir do código-fonte

Verifique [essa página da wiki](https://github.com/swaywm/sway/wiki/Development-Setup) se você quer compilar o HEAD do sway e o wlroots para testes ou desenvolvimento.

Instale as dependências:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (opcional: system tray)
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (opcional: man pages) \*
* git (opcional: informações de versão) \*

_\*Dependência de tempo de compilação_

Execute esses comandos:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## Configuração

Se você já utiliza o i3, então copie os seus arquivos de configuração para `~/.config/sway/config` e
tudo funcionará normalmente. Caso contrário, copie o arquivo de configuração de exemplo para
`~/.config/sway/config`. Normalmente, este arquivo está localizado em `/etc/sway/config`.
Execute `man 5 sway` para se informar sobre a configuração.

## Execução

Execute o comando `sway` de um TTY. Alguns gerenciadores de display (ou gerenciadores de login) podem funcionar mas alguns não são suportados
pelo sway (o gdm é conhecido por funcionar bem).


================================================
FILE: README.ro.md
================================================
# sway

sway este un compositor pentru [Wayland](http://wayland.freedesktop.org/) compatibil cu [i3](https://i3wm.org/).
Citiți [FAQ](https://github.com/swaywm/sway/wiki)-ul. Connectați-vă la canalul nostru [IRC](https://web.libera.chat/gamja/?channels=#sway) (#sway pe irc.libera.chat).

## Semnarea digitală

Noile versiuni sunt semnate cu [E88F5E48](https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48)
și postate [pe GitHub](https://github.com/swaywm/sway/releases).

## Instalare

### Din pachete (packages) 

sway este disponibil în multe distribuții. Încercați să instalați pachetul "sway" pe distribuția voastră. Dacă nu este disponibil, uitați-vă în [această pagină wiki](https://github.com/swaywm/sway/wiki/Unsupported-packages)
pentru informații a cum puteți să instalați pentru distribuția voastră.

Dacă sunteți interesați in a crea pachete pentru distribuția voastră, informați-ne prin IRC sau contactați prin email pe sir@cmpwn.com pentru ajutor.

### Compilare din sursă

Dependențe pentru instalare:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (opțional, dacă doriți să aveți system tray)
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (opțional, pentru paginile man) \*
* git (opțional, pentru informații de versiune) \*

*Dependențe doar pentru compilare*

Rulați aceste comenzi:

```
    meson setup build
    ninja -C build
    sudo ninja -C build install
```

## Configurare

Dacă folosiți deja i3, copiați fișierul de configurare din i3 în `~/.config/sway/config`, și va funcționa fără a necesita nici o modificare. In caz contrar, copiați exemplul de configurare (disponibil de obicei în `/etc/sway/config`) în `~/.config/sway/config`.
Folosiți comanda `man 5 sway` pentru informații despre configurare.

## Lansare

Folosiți comanda `sway` într-un TTY. Managerii de display nu sunt suportați de către Sway, dar unii pot functiona (se știe că gdm functioneazâ destul de bine).


================================================
FILE: README.ru.md
================================================
# sway

sway - это [i3]-совместимый композитор [Wayland].
Больше информации в [FAQ]. Присоединяйтесь к
[IRC-каналу][IRC channel] (#sway на
irc.libera.chat).

## Подписи релизов

Релизы подписываются ключом [E88F5E48] и публикуются [на GitHub][GitHub releases].

## Установка

### Из репозиториев

Sway доступен во многих дистрибутивах. Попробуйте установить пакет "sway".

Если вас интересует создание пакета sway для вашего дистрибутива, зайдите на [IRC-канал][IRC channel]
или отправьте письмо на sir@cmpwn.com за советом.

### Сборка из исходников

Посетите [эту страницу на вики][Development setup], если вы хотите построить последнюю версию
sway и wlroots для тестирования или разработки. 

Установите зависимости:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (опционально: для работы трея)
* [scdoc] (опционально: для man-страниц) \*
* git (опционально: для информации о версии) \*

_\*Зависимости для сборки_

Выполните эти команды:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## Настройка

Если вы уже используете i3, скопируйте ваш конфигурационный файл i3 в `~/.config/sway/config`, и
он сразу же заработает. В противном случае, скопируйте образец конфигурационного файла в
`~/.config/sway/config`. Обычно он располагается в `/etc/sway/config`.
Запустите `man 5 sway` для изучения информации о настройке.

## Запуск

Выполните команду `sway` прямо из TTY или дисплейного менеджера.

[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[IRC channel]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.sr.md
================================================
# sway

sway је [i3]-компатибилан [Wayland] композитор. Прочитајте [FAQ]. Придружите се
[IRC каналу] \(#sway на irc.libera.chat).

## Потписи Издања

Издања су потписана са [E88F5E48] и објављена [на GitHub-у][GitHub releases].

## Инсталација

### Из пакета

Sway је доступан у многим дистрибуцијама. Покушајте да инсталирате "sway" пакет за
вашу.

### Компајлирање из Извора

Погледајте [ову вики страницу][Development setup], ако желите да компајлирате HEAD верзију
sway-а и wlroots-а за тестирање или развој.

Инсталирајте зависности:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (опционо: додатни формати слика за системску траку)
* [swaybg] (опционо: позадина)
* [scdoc] (опционо: man странице) \*
* git (опционо: информације о верзији) \*

_\* Потребно само за компајлирање_

Покрените следеће команде:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

## Конфигурација

Ако већ користите i3, копирајте вашу i3 конфигурацију у `~/.config/sway/config` и
радиће одмах. У супротном, копирајте пример конфигурационе датотеке у
`~/.config/sway/config`. Обично се налази у `/etc/sway/config`.
Покрените `man 5 sway` за информације о конфигурацији.

## Покретање

Покрените `sway` из TTY-a или из менаџера приказа.

[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[IRC каналу]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[swaybg]: https://github.com/swaywm/swaybg/
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.sv.md
================================================
# sway

sway är en [i3]-kompatibel [Wayland] compositor. Läs våran [FAQ]-sida. Gå med i vår
[IRC-kanal] \(#sway på irc.libera.chat).

## Utgåvosignaturer

Utgåvor är signerade med [E88F5E48] och publicerade på [GitHub][GitHub releases].

## Installering

### Med pakethanterare

Sway är tillgänglig i många distributioner. Prova att installera "sway" med din distributions pakethanterare.

### Genom att kompilera från källkod

Kolla in [denna wiki-sida][Development setup] om du vill bygga sway och wlroots HEAD för testning eller utveckling.

Installera paket som sway behöver:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (valbar: systembricka)
* [scdoc] (valbar: manualer) \*
* git (valbar: versioninfo) \*

_\* Krav för kompilering_

Kör dessa kommandon:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

## Konfiguration

Ifall du redan använder i3 så kan du kopiera din konfigurationsfil till `~/.config/sway/config` och det kommer då att fungera som det ska.
Kopiera annars exemplarkonfigurationsfilen till `~/.config/sway/config`. Den ligger oftast i `/etc/sway/config`.
Kör `man 5 sway` för mer information kring konfigurationen.

## Att köra sway

Kör `sway` från en TTY. Vissa inloggningahanterare kan fungera men inte vara stödda av sway (gdm ska fungera hyfsat bra).

[en]: https://github.com/swaywm/sway#readme
[de]: README.de.md
[dk]: README.dk.md
[es]: README.es.md
[fr]: README.fr.md
[sv]: README.sv.md
[gr]: README.gr.md
[hu]: README.hu.md
[ir]: README.ir.md
[it]: README.it.md
[ja]: README.ja.md
[ko]: README.ko.md
[nl]: README.nl.md
[pl]: README.pl.md
[pt]: README.pt.md
[ro]: README.ro.md
[ru]: README.ru.md
[tr]: README.tr.md
[uk]: README.uk.md
[zh-CN]: README.zh-CN.md
[zh-TW]: README.zh-TW.md
[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[IRC-kanal]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.tr.md
================================================
# sway


Sway, [i3]-uyumlu bir [Wayland] dizgicisidir. [SSS][FAQ]'yi okuyun. 
[IRC kanalı][IRC channel]na katılın \(irc.libera.chat'te #sway (İngilizce)).

## Sürüm imzaları

Sürümler [E88F5E48] ile imzalandı ve [GitHub][GitHub releases]'da yayınlandı.

## Kurulum

### Paketler ile

Sway birçok dağıtımda mevcuttur. Sizinki için "sway" paketini yüklemeyi deneyin.

Dağıtımınız için sway'i paketlemekle ilgileniyorsanız, IRC kanalına uğrayın veya tavsiye için sir@cmpwn.com adresine bir e-posta gönderin.

### Kaynak koddan derleme

Test veya geliştirme için sway ve wlroots'un HEAD'ini oluşturmak istiyorsanız [bu wiki sayfası][Development setup]na göz atın.

Aşağıdaki bağımlılıkları yükleyin:

* meson \*
* [wlroots]
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (isteğe bağlı: system tray)
* [scdoc] (isteğe bağlı: man pages) \*
* git (isteğe bağlı: version info) \*

_\*Derleme-anı bağımlılıkları_

Şu komutları çalıştırın:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## Yapılandırma

Zaten i3 kullanıyorsanız, i3 yapılandırmanızı `~/.config/sway/config` konumuna kopyalayın ve kutudan çıktığı gibi çalışacaktır. Aksi takdirde, örnek yapılandırma dosyasını `~/.config/sway/config` konumuna kopyalayın. Genellikle `/etc/sway/config` konumunda bulunur.
Yapılandırma hakkında bilgi almak için `man 5 sway` komutunu çalıştırın.

## Çalıştırma

TTY'den `sway` çalıştırın. Bazı  görüntü yöneticileriyle(display manager) çalışabilir ama Sway tarafından desteklenmez. (gdm'nin oldukça iyi çalıştığı bilinmektedir.)

[i3]: https://i3wm.org/
[Wayland]: http://wayland.freedesktop.org/
[FAQ]: https://github.com/swaywm/sway/wiki
[IRC channel]: https://web.libera.chat/gamja/?channels=#sway
[E88F5E48]: https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48
[GitHub releases]: https://github.com/swaywm/sway/releases
[Development setup]: https://github.com/swaywm/sway/wiki/Development-Setup
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots
[scdoc]: https://git.sr.ht/~sircmpwn/scdoc


================================================
FILE: README.uk.md
================================================
# sway

Sway це сумісний з [i3](https://i3wm.org/) композитор [Wayland](http://wayland.freedesktop.org/).
Ознайомтесь з [ЧаПами](https://github.com/swaywm/sway/wiki). Приєднуйтесь до [спільноти в
IRC](https://web.libera.chat/gamja/?channels=#sway) (#sway на
irc.libera.chat).

## Підтримка українською мовою

Якщо ви хочете отримати підтримку українською мовою, можете звернутись до користувача
Hummer12007 у IRC-спільноті. Будьте терплячі, вам обов'язково допоможуть.

Наразі переклад Sway українською ще не завершено (він неповний), проте у вас є шанс долучитись,
детальніше див. [статус](https://github.com/swaywm/sway/issues/1318#issuecomment-322277382).

## Підписи випусків

Випуски підписані ключем [E88F5E48](https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48)
та публікуються на сторінці [GitHub](https://github.com/swaywm/sway/releases).

## Встановлення

### З пакунків

Sway доступний у багатьох дистрибутивах Linux (а також у FreeBSD).
Спробуйте встановити пакунок `sway` у вашому.
Якщо він недоступний, перегляньте цю [сторінку Wiki](https://github.com/swaywm/sway/wiki/Unsupported-packages)
для інформації щодо встановлення на вашому дистрибутиві.

Якщо ви готові та зацікавлені запакувати і підтримувати Sway у вашому
дистрибутиві, звертайтесь за порадами до нашого каналу в IRC або
пишіть на електронну пошту [sir@cmpwn.com](mailto:sir@cmpwn.com).

### З вихідного коду

Встановіть залежності:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (optional: system tray)
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (необов'язково, необхідно для сторінок man) \*
* git \*

_\*Лише для компіляції_

Виконайте ці команди:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## Налаштування

Якщо ви вже використовуєте i3, скопіюйте свій файл налаштувань
до `~/.config/sway/config`, він має запрацювати. Інакше, скопіюйте
туди файл-зразок (зазвичай знаходиться у `/etc/sway/config`), і налаштуйте під себе.

Більше інформації щодо налаштувань можете знайти, виконавши `man 5 sway`.

## Запуск

Виконайте `sway` у TTY. Деякі дисплейні менеджери (менеджери сеансу/стільниць)
можуть працювати, але офіційно не підтримуються (проте сумісніть із gdm достатньо висока).


================================================
FILE: README.zh-CN.md
================================================
# sway

sway 是和 [i3](https://i3wm.org/) 兼容的 [Wayland](http://wayland.freedesktop.org/) compositor。
 [查看FAQ](https://github.com/swaywm/sway/wiki)/ [加入IRC频道](https://web.libera.chat/gamja/?channels=#sway) (#sway on irc.libera.chat)

## 发行签名

每个发行版都以 [E88F5E48](https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48) 的密钥签名并发布在 [GitHub](https://github.com/swaywm/sway/releases)上。

## 安装

### 从包管理器安装

Sway 在很多发行版中可用。请尝试在你的发行版中安装 `sway` 。

### 从源码编译

如果想要构建最新版sway和wlroots用以测试和开发,请查看 [此wiki页面](https://github.com/swaywm/sway/wiki/Development-Setup)

安装如下依赖:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (可选的: system tray)
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (可选: man pages) \*
* git \*

_\*编译时依赖_

运行如下命令:

    meson setup build/
    ninja -C build/
    sudo ninja -C build/ install

## 配置

如果你已经在使用i3,直接复制i3配置文件到 `~/.config/sway/config`,这是开箱即用的。或者,你可以复制配置样例到`~/.config/sway/config`。它通常位于 `/etc/sway/config`。
运行 `man 5 sway` 获取关于配置的更多信息。

## 运行

从 TTY 中运行 `sway`。 某些显示管理器(Display Manager)也许可以工作但不被 sway 支持。
(已知 gdm 工作得非常好)。


================================================
FILE: README.zh-TW.md
================================================
# sway

sway 是一個與 [i3](https://i3wm.org/) 相容的 [Wayland](http://wayland.freedesktop.org/) compositor。
閱讀 [FAQ](https://github.com/swaywm/sway/wiki)。 加入 [IRC
頻道](https://web.libera.chat/gamja/?channels=#sway) (#sway on
irc.libera.chat)

## 發行簽章

所有發行的版本都會以 [E88F5E48](https://keys.openpgp.org/search?q=34FF9526CFEF0E97A340E2E40FDE7BE0E88F5E48) 簽署
並發佈於 [GitHub](https://github.com/swaywm/sway/releases)

## 安裝

### 從套件安裝

Sway 在許多發行版都有提供。請自己嘗試於你的發行版安裝 「sway」這個套件。
如果無法取得,請查看 [這個 wiki 頁面](https://github.com/swaywm/sway/wiki/Unsupported-packages)
以取得更多關於如何於你使用的發行版上安裝的資訊。

如果你想要為你使用的發行版包裝 sway,請到 IRC 頻道或是直接寄封信到 sir@cmpwn.com 來取得一些建議。

### 從原始碼編譯

相依套件:

* meson \*
* [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)
* wayland
* wayland-protocols \*
* pcre2
* json-c
* pango
* cairo
* gdk-pixbuf2 (選擇性: system tray)
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (選擇性: man pages) \*
* git \*

_\*編譯時相依_

執行這些指令:

    meson setup build
    ninja -C build
    sudo ninja -C build install

## 設定檔

如果你已經在使用 i3,你可以直接將你的 i3 設定檔複製到 `~/.config/sway/config` 然後就能直接使用。
或者你也可以把範例設定檔複製到 `~/.config/sway/config`。 它通常會在 `/etc/sway/config`。
執行 `man 5 sway` 來取得更多關於設定檔的資訊。

## 執行

在 TTY 執行 `sway`。有些 display manager 可能可以運作但 sway 不提供支援 (已知 gdm 運作的很好)


================================================
FILE: assets/LICENSE
================================================
Creative Commons Legal Code

CC0 1.0 Universal

    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
    HEREUNDER.

Statement of Purpose

The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator
and subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").

Certain owners wish to permanently relinquish those rights to a Work for
the purpose of contributing to a commons of creative, cultural and
scientific works ("Commons") that the public can reliably and without fear
of later claims of infringement build upon, modify, incorporate in other
works, reuse and redistribute as freely as possible in any form whatsoever
and for any purposes, including without limitation commercial purposes.
These owners may contribute to the Commons to promote the ideal of a free
culture and the further production of creative, cultural and scientific
works, or to gain reputation or greater distribution for their Work in
part through the use and efforts of others.

For these and/or other purposes and motivations, and without any
expectation of additional consideration or compensation, the person
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
is an owner of Copyright and Related Rights in the Work, voluntarily
elects to apply CC0 to the Work and publicly distribute the Work under its
terms, with knowledge of his or her Copyright and Related Rights in the
Work and the meaning and intended legal effect of CC0 on those rights.

1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not
limited to, the following:

  i. the right to reproduce, adapt, distribute, perform, display,
     communicate, and translate a Work;
 ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or
     likeness depicted in a Work;
 iv. rights protecting against unfair competition in regards to a Work,
     subject to the limitations in paragraph 4(a), below;
  v. rights protecting the extraction, dissemination, use and reuse of data
     in a Work;
 vi. database rights (such as those arising under Directive 96/9/EC of the
     European Parliament and of the Council of 11 March 1996 on the legal
     protection of databases, and under any national implementation
     thereof, including any amended or successor version of such
     directive); and
vii. other similar, equivalent or corresponding rights throughout the
     world based on applicable law or treaty, and any national
     implementations thereof.

2. Waiver. To the greatest extent permitted by, but not in contravention
of, applicable law, Affirmer hereby overtly, fully, permanently,
irrevocably and unconditionally waives, abandons, and surrenders all of
Affirmer's Copyright and Related Rights and associated claims and causes
of action, whether now known or unknown (including existing as well as
future claims and causes of action), in the Work (i) in all territories
worldwide, (ii) for the maximum duration provided by applicable law or
treaty (including future time extensions), (iii) in any current or future
medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
member of the public at large and to the detriment of Affirmer's heirs and
successors, fully intending that such Waiver shall not be subject to
revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.

3. Public License Fallback. Should any part of the Waiver for any reason
be judged legally invalid or ineffective under applicable law, then the
Waiver shall be preserved to the maximum extent permitted taking into
account Affirmer's express Statement of Purpose. In addition, to the
extent the Waiver is so judged Affirmer hereby grants to each affected
person a royalty-free, non transferable, non sublicensable, non exclusive,
irrevocable and unconditional license to exercise Affirmer's Copyright and
Related Rights in the Work (i) in all territories worldwide, (ii) for the
maximum duration provided by applicable law or treaty (including future
time extensions), (iii) in any current or future medium and for any number
of copies, and (iv) for any purpose whatsoever, including without
limitation commercial, advertising or promotional purposes (the
"License"). The License shall be deemed effective as of the date CC0 was
applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder
of the License, and in such case Affirmer hereby affirms that he or she
will not (i) exercise any of his or her remaining Copyright and Related
Rights in the Work or (ii) assert any associated claims and causes of
action with respect to the Work, in either case contrary to Affirmer's
express Statement of Purpose.

4. Limitations and Disclaimers.

 a. No trademark or patent rights held by Affirmer are waived, abandoned,
    surrendered, licensed or otherwise affected by this document.
 b. Affirmer offers the Work as-is and makes no representations or
    warranties of any kind concerning the Work, express, implied,
    statutory or otherwise, including without limitation warranties of
    title, merchantability, fitness for a particular purpose, non
    infringement, or the absence of latent or other defects, accuracy, or
    the present or absence of errors, whether or not discoverable, all to
    the greatest extent permissible under applicable law.
 c. Affirmer disclaims responsibility for clearing rights of other persons
    that may apply to the Work or any use thereof, including without
    limitation any person's Copyright and Related Rights in the Work.
    Further, Affirmer disclaims responsibility for obtaining any necessary
    consents, permissions or other rights required for any use of the
    Work.
 d. Affirmer understands and acknowledges that Creative Commons is not a
    party to this document and has no duty or obligation with respect to
    this CC0 or use of the Work.


================================================
FILE: client/meson.build
================================================
lib_sway_client = static_library(
	'sway-client',
	files(
		'pool-buffer.c',
	),
	dependencies: [
		cairo,
		pango,
		pangocairo,
		wayland_client
	],
	link_with: [lib_sway_common],
	include_directories: sway_inc
)


================================================
FILE: client/pool-buffer.c
================================================
#include <assert.h>
#include <cairo.h>
#include <errno.h>
#include <fcntl.h>
#include <pango/pangocairo.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <time.h>
#include <unistd.h>
#include <wayland-client.h>
#include "config.h"
#include "pool-buffer.h"
#include "util.h"

static int anonymous_shm_open(void) {
	int retries = 100;

	do {
		// try a probably-unique name
		struct timespec ts;
		clock_gettime(CLOCK_MONOTONIC, &ts);
		pid_t pid = getpid();
		char name[50];
		snprintf(name, sizeof(name), "/sway-%x-%x",
			(unsigned int)pid, (unsigned int)ts.tv_nsec);

		// shm_open guarantees that O_CLOEXEC is set
		int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600);
		if (fd >= 0) {
			shm_unlink(name);
			return fd;
		}

		--retries;
	} while (retries > 0 && errno == EEXIST);

	return -1;
}

static void buffer_release(void *data, struct wl_buffer *wl_buffer) {
	struct pool_buffer *buffer = data;
	buffer->busy = false;
}

static const struct wl_buffer_listener buffer_listener = {
	.release = buffer_release
};

static struct pool_buffer *create_buffer(struct wl_shm *shm,
		struct pool_buffer *buf, int32_t width, int32_t height,
		uint32_t format) {
	uint32_t stride = width * 4;
	size_t size = stride * height;

	int fd = anonymous_shm_open();
	if (fd == -1) {
		return NULL;
	}
	if (ftruncate(fd, size) < 0) {
		close(fd);
		return NULL;
	}
	void *data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	struct wl_shm_pool *pool = wl_shm_create_pool(shm, fd, size);
	buf->buffer = wl_shm_pool_create_buffer(pool, 0,
			width, height, stride, format);
	wl_shm_pool_destroy(pool);
	close(fd);

	buf->size = size;
	buf->width = width;
	buf->height = height;
	buf->data = data;
	buf->surface = cairo_image_surface_create_for_data(data,
			CAIRO_FORMAT_ARGB32, width, height, stride);
	buf->cairo = cairo_create(buf->surface);
	buf->pango = pango_cairo_create_context(buf->cairo);

	wl_buffer_add_listener(buf->buffer, &buffer_listener, buf);
	return buf;
}

void destroy_buffer(struct pool_buffer *buffer) {
	if (buffer->buffer) {
		wl_buffer_destroy(buffer->buffer);
	}
	if (buffer->cairo) {
		cairo_destroy(buffer->cairo);
	}
	if (buffer->surface) {
		cairo_surface_destroy(buffer->surface);
	}
	if (buffer->pango) {
		g_object_unref(buffer->pango);
	}
	if (buffer->data) {
		munmap(buffer->data, buffer->size);
	}
	memset(buffer, 0, sizeof(struct pool_buffer));
}

struct pool_buffer *get_next_buffer(struct wl_shm *shm,
		struct pool_buffer pool[static 2], uint32_t width, uint32_t height) {
	struct pool_buffer *buffer = NULL;

	for (size_t i = 0; i < 2; ++i) {
		if (pool[i].busy) {
			continue;
		}
		buffer = &pool[i];
	}

	if (!buffer) {
		return NULL;
	}

	if (buffer->width != width || buffer->height != height) {
		destroy_buffer(buffer);
	}

	if (!buffer->buffer) {
		if (!create_buffer(shm, buffer, width, height,
					WL_SHM_FORMAT_ARGB8888)) {
			return NULL;
		}
	}
	buffer->busy = true;
	return buffer;
}


================================================
FILE: common/cairo.c
================================================
#include <stdint.h>
#include <cairo.h>
#include "cairo_util.h"

void cairo_set_source_u32(cairo_t *cairo, uint32_t color) {
	cairo_set_source_rgba(cairo,
			(color >> (3*8) & 0xFF) / 255.0,
			(color >> (2*8) & 0xFF) / 255.0,
			(color >> (1*8) & 0xFF) / 255.0,
			(color >> (0*8) & 0xFF) / 255.0);
}

cairo_subpixel_order_t to_cairo_subpixel_order(enum wl_output_subpixel subpixel) {
	switch (subpixel) {
	case WL_OUTPUT_SUBPIXEL_HORIZONTAL_RGB:
		return CAIRO_SUBPIXEL_ORDER_RGB;
	case WL_OUTPUT_SUBPIXEL_HORIZONTAL_BGR:
		return CAIRO_SUBPIXEL_ORDER_BGR;
	case WL_OUTPUT_SUBPIXEL_VERTICAL_RGB:
		return CAIRO_SUBPIXEL_ORDER_VRGB;
	case WL_OUTPUT_SUBPIXEL_VERTICAL_BGR:
		return CAIRO_SUBPIXEL_ORDER_VBGR;
	default:
		return CAIRO_SUBPIXEL_ORDER_DEFAULT;
	}
	return CAIRO_SUBPIXEL_ORDER_DEFAULT;
}

cairo_surface_t *cairo_image_surface_scale(cairo_surface_t *image,
		int width, int height) {
	int image_width = cairo_image_surface_get_width(image);
	int image_height = cairo_image_surface_get_height(image);

	cairo_surface_t *new =
		cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
	cairo_t *cairo = cairo_create(new);
	cairo_scale(cairo, (double)width / image_width,
			(double)height / image_height);
	cairo_set_source_surface(cairo, image, 0, 0);

	cairo_paint(cairo);
	cairo_destroy(cairo);
	return new;
}


================================================
FILE: common/gesture.c
================================================
#include "gesture.h"

#include <math.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "log.h"
#include "stringop.h"

const uint8_t GESTURE_FINGERS_ANY = 0;

char *gesture_parse(const char *input, struct gesture *output) {
	// Clear output in case of failure
	output->type = GESTURE_TYPE_NONE;
	output->fingers = GESTURE_FINGERS_ANY;
	output->directions = GESTURE_DIRECTION_NONE;

	// Split input type, fingers and directions
	list_t *split = split_string(input, ":");
	if (split->length < 1 || split->length > 3) {
		return format_str(
				"expected <gesture>[:<fingers>][:direction], got %s",
				input);
	}

	// Parse gesture type
	if (strcmp(split->items[0], "hold") == 0) {
		output->type = GESTURE_TYPE_HOLD;
	} else if (strcmp(split->items[0], "pinch") == 0) {
		output->type = GESTURE_TYPE_PINCH;
	} else if (strcmp(split->items[0], "swipe") == 0) {
		output->type = GESTURE_TYPE_SWIPE;
	} else {
		return format_str("expected hold|pinch|swipe, got %s",
				(const char *)split->items[0]);
	}

	// Parse optional arguments
	if (split->length > 1) {
		char *next = split->items[1];

		// Try to parse as finger count (1-9)
		if (strlen(next) == 1 && '1' <= next[0] && next[0] <= '9') {
			output->fingers = atoi(next);

			// Move to next if available
			next = split->length == 3 ? split->items[2] : NULL;
		} else if (split->length == 3) {
			// Fail here if argument can only be finger count
			return format_str("expected 1-9, got %s", next);
		}

		// If there is an argument left, try to parse as direction
		if (next) {
			list_t *directions = split_string(next, "+");

			for (int i = 0; i < directions->length; ++i) {
				const char *item = directions->items[i];
				if (strcmp(item, "any") == 0) {
					continue;
				} else if (strcmp(item, "up") == 0) {
					output->directions |= GESTURE_DIRECTION_UP;
				} else if (strcmp(item, "down") == 0) {
					output->directions |= GESTURE_DIRECTION_DOWN;
				} else if (strcmp(item, "left") == 0) {
					output->directions |= GESTURE_DIRECTION_LEFT;
				} else if (strcmp(item, "right") == 0) {
					output->directions |= GESTURE_DIRECTION_RIGHT;
				} else if (strcmp(item, "inward") == 0) {
					output->directions |= GESTURE_DIRECTION_INWARD;
				} else if (strcmp(item, "outward") == 0) {
					output->directions |= GESTURE_DIRECTION_OUTWARD;
				} else if (strcmp(item, "clockwise") == 0) {
					output->directions |= GESTURE_DIRECTION_CLOCKWISE;
				} else if (strcmp(item, "counterclockwise") == 0) {
					output->directions |= GESTURE_DIRECTION_COUNTERCLOCKWISE;
				} else {
					return format_str("expected direction, got %s", item);
				}
			}
			list_free_items_and_destroy(directions);
		}
	} // if optional args

	list_free_items_and_destroy(split);

	return NULL;
}

const char *gesture_type_string(enum gesture_type type) {
	switch (type) {
	case GESTURE_TYPE_NONE:
		return "none";
	case GESTURE_TYPE_HOLD:
		return "hold";
	case GESTURE_TYPE_PINCH:
		return "pinch";
	case GESTURE_TYPE_SWIPE:
		return "swipe";
	}

	return NULL;
}

const char *gesture_direction_string(enum gesture_direction direction) {
	switch (direction) {
	case GESTURE_DIRECTION_NONE:
		return "none";
	case GESTURE_DIRECTION_UP:
		return "up";
	case GESTURE_DIRECTION_DOWN:
		return "down";
	case GESTURE_DIRECTION_LEFT:
		return "left";
	case GESTURE_DIRECTION_RIGHT:
		return "right";
	case GESTURE_DIRECTION_INWARD:
		return "inward";
	case GESTURE_DIRECTION_OUTWARD:
		return "outward";
	case GESTURE_DIRECTION_CLOCKWISE:
		return "clockwise";
	case GESTURE_DIRECTION_COUNTERCLOCKWISE:
		return "counterclockwise";
	}

	return NULL;
}

// Helper to turn combination of directions flags into string representation.
static char *gesture_directions_to_string(uint32_t directions) {
	char *result = NULL;

	for (uint8_t bit = 0; bit < 32; bit++) {
		uint32_t masked = directions & (1 << bit);
		if (masked) {
			const char *name = gesture_direction_string(masked);

			if (!name) {
				name = "unknown";
			}

			if (!result) {
				result = strdup(name);
			} else {
				char *new = format_str("%s+%s", result, name);
				free(result);
				result = new;
			}
		}
	}

	if(!result) {
		return strdup("any");
	}

	return result;
}

char *gesture_to_string(struct gesture *gesture) {
	char *directions = gesture_directions_to_string(gesture->directions);
	char *result = format_str("%s:%u:%s",
		gesture_type_string(gesture->type),
		gesture->fingers, directions);
	free(directions);
	return result;
}

bool gesture_check(struct gesture *target, enum gesture_type type, uint8_t fingers) {
	// Check that gesture type matches
	if (target->type != type) {
		return false;
	}

	// Check that finger count matches
	if (target->fingers != GESTURE_FINGERS_ANY && target->fingers != fingers) {
		return false;
	}

	return true;
}

bool gesture_match(struct gesture *target, struct gesture *to_match, bool exact) {
	// Check type and fingers
	if (!gesture_check(target, to_match->type, to_match->fingers)) {
		return false;
	}

	// Enforce exact matches ...
	if (exact && target->directions != to_match->directions) {
		return false;
	}

	// ... or ensure all target directions are matched
	return (target->directions & to_match->directions) == target->directions;
}

bool gesture_equal(struct gesture *a, struct gesture *b) {
	return a->type == b->type
		&& a->fingers == b->fingers
		&& a->directions == b->directions;
}

// Return count of set bits in directions bit field.
static uint8_t gesture_directions_count(uint32_t directions) {
	uint8_t count = 0;
	for (; directions; directions >>= 1) {
		count += directions & 1;
	}
	return count;
}

// Compare direction bit count of two direction.
static int8_t gesture_directions_compare(uint32_t a, uint32_t b) {
	return gesture_directions_count(a) - gesture_directions_count(b);
}

// Compare two direction based on their direction bit count
int8_t gesture_compare(struct gesture *a, struct gesture *b) {
	return gesture_directions_compare(a->directions, b->directions);
}

void gesture_tracker_begin(struct gesture_tracker *tracker,
		enum gesture_type type, uint8_t fingers) {
	tracker->type = type;
	tracker->fingers = fingers;

	tracker->dx = 0.0;
	tracker->dy = 0.0;
	tracker->scale = 1.0;
	tracker->rotation = 0.0;

	sway_log(SWAY_DEBUG, "begin tracking %s:%u:? gesture",
		gesture_type_string(type), fingers);
}

bool gesture_tracker_check(struct gesture_tracker *tracker, enum gesture_type type) {
	return tracker->type == type;
}

void gesture_tracker_update(struct gesture_tracker *tracker,
		double dx, double dy, double scale, double rotation) {
	if (tracker->type == GESTURE_TYPE_HOLD) {
		sway_assert(false, "hold does not update.");
		return;
	}

	tracker->dx += dx;
	tracker->dy += dy;

	if (tracker->type == GESTURE_TYPE_PINCH) {
		tracker->scale = scale;
		tracker->rotation += rotation;
	}

	sway_log(SWAY_DEBUG, "update tracking %s:%u:? gesture: %f %f %f %f",
			gesture_type_string(tracker->type),
			tracker->fingers,
			tracker->dx, tracker->dy,
			tracker->scale, tracker->rotation);
}

void gesture_tracker_cancel(struct gesture_tracker *tracker) {
	sway_log(SWAY_DEBUG, "cancel tracking %s:%u:? gesture",
			gesture_type_string(tracker->type), tracker->fingers);

	tracker->type = GESTURE_TYPE_NONE;
}

struct gesture *gesture_tracker_end(struct gesture_tracker *tracker) {
	struct gesture *result = calloc(1, sizeof(struct gesture));

	// Ignore gesture under some threshold
	// TODO: Make configurable
	const double min_rotation = 5;
	const double min_scale_delta = 0.1;

	// Determine direction
	switch(tracker->type) {
	// Gestures with scale and rotation
	case GESTURE_TYPE_PINCH:
		if (tracker->rotation > min_rotation) {
			result->directions |= GESTURE_DIRECTION_CLOCKWISE;
		}
		if (tracker->rotation < -min_rotation) {
			result->directions |= GESTURE_DIRECTION_COUNTERCLOCKWISE;
		}

		if (tracker->scale > (1.0 + min_scale_delta)) {
			result->directions |= GESTURE_DIRECTION_OUTWARD;
		}
		if (tracker->scale < (1.0 - min_scale_delta)) {
			result->directions |= GESTURE_DIRECTION_INWARD;
		}
		__attribute__ ((fallthrough));
	// Gestures with dx and dy
	case GESTURE_TYPE_SWIPE:
		if (fabs(tracker->dx) > fabs(tracker->dy)) {
			if (tracker->dx > 0) {
				result->directions |= GESTURE_DIRECTION_RIGHT;
			} else {
				result->directions |= GESTURE_DIRECTION_LEFT;
			}
		} else {
			if (tracker->dy > 0) {
				result->directions |= GESTURE_DIRECTION_DOWN;
			} else {
				result->directions |= GESTURE_DIRECTION_UP;
			}
		}
	// Gesture without any direction
	case GESTURE_TYPE_HOLD:
		break;
	// Not tracking any gesture
	case GESTURE_TYPE_NONE:
		sway_assert(false, "Not tracking any gesture.");
		return result;
	}

	result->type = tracker->type;
	result->fingers = tracker->fingers;

	char *description = gesture_to_string(result);
	sway_log(SWAY_DEBUG, "end tracking gesture: %s", description);
	free(description);

	tracker->type = GESTURE_TYPE_NONE;

	return result;
}


================================================
FILE: common/ipc-client.c
================================================
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include "ipc-client.h"
#include "log.h"

static const char ipc_magic[] = {'i', '3', '-', 'i', 'p', 'c'};

#define IPC_HEADER_SIZE (sizeof(ipc_magic) + 8)

char *get_socketpath(void) {
	const char *swaysock = getenv("SWAYSOCK");
	if (swaysock) {
		return strdup(swaysock);
	}
	char *line = NULL;
	size_t line_size = 0;
	FILE *fp = popen("sway --get-socketpath 2>/dev/null", "r");
	if (fp) {
		ssize_t nret = getline(&line, &line_size, fp);
		pclose(fp);
		if (nret > 0) {
			// remove trailing newline, if there is one
			if (line[nret - 1] == '\n') {
				line[nret - 1] = '\0';
			}
			return line;
		}
	}
	const char *i3sock = getenv("I3SOCK");
	if (i3sock) {
		free(line);
		return strdup(i3sock);
	}
	fp = popen("i3 --get-socketpath 2>/dev/null", "r");
	if (fp) {
		ssize_t nret = getline(&line, &line_size, fp);
		pclose(fp);
		if (nret > 0) {
			// remove trailing newline, if there is one
			if (line[nret - 1] == '\n') {
				line[nret - 1] = '\0';
			}
			return line;
		}
	}
	free(line);
	return NULL;
}

int ipc_open_socket(const char *socket_path) {
	struct sockaddr_un addr;
	int socketfd;
	if ((socketfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
		sway_abort("Unable to open Unix socket");
	}
	addr.sun_family = AF_UNIX;
	strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);
	addr.sun_path[sizeof(addr.sun_path) - 1] = 0;
	int l = sizeof(struct sockaddr_un);
	if (connect(socketfd, (struct sockaddr *)&addr, l) == -1) {
		sway_abort("Unable to connect to %s", socket_path);
	}
	return socketfd;
}

bool ipc_set_recv_timeout(int socketfd, struct timeval tv) {
	if (setsockopt(socketfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) == -1) {
		sway_log_errno(SWAY_ERROR, "Failed to set ipc recv timeout");
		return false;
	}
	return true;
}

struct ipc_response *ipc_recv_response(int socketfd) {
	char data[IPC_HEADER_SIZE];

	size_t total = 0;
	while (total < IPC_HEADER_SIZE) {
		ssize_t received = recv(socketfd, data + total, IPC_HEADER_SIZE - total, 0);
		if (received <= 0) {
			sway_abort("Unable to receive IPC response");
		}
		total += received;
	}

	struct ipc_response *response = malloc(sizeof(struct ipc_response));
	if (!response) {
		goto error_1;
	}

	memcpy(&response->size, data + sizeof(ipc_magic), sizeof(uint32_t));
	memcpy(&response->type, data + sizeof(ipc_magic) + sizeof(uint32_t), sizeof(uint32_t));

	char *payload = malloc(response->size + 1);
	if (!payload) {
		goto error_2;
	}

	total = 0;
	while (total < response->size) {
		ssize_t received = recv(socketfd, payload + total, response->size - total, 0);
		if (received < 0) {
			sway_abort("Unable to receive IPC response");
		}
		total += received;
	}
	payload[response->size] = '\0';
	response->payload = payload;

	return response;
error_2:
	free(response);
error_1:
	sway_log(SWAY_ERROR, "Unable to allocate memory for IPC response");
	return NULL;
}

void free_ipc_response(struct ipc_response *response) {
	free(response->payload);
	free(response);
}

char *ipc_single_command(int socketfd, uint32_t type, const char *payload, uint32_t *len) {
	char data[IPC_HEADER_SIZE];
	memcpy(data, ipc_magic, sizeof(ipc_magic));
	memcpy(data + sizeof(ipc_magic), len, sizeof(*len));
	memcpy(data + sizeof(ipc_magic) + sizeof(*len), &type, sizeof(type));

	if (write(socketfd, data, IPC_HEADER_SIZE) == -1) {
		sway_abort("Unable to send IPC header");
	}

	if (write(socketfd, payload, *len) == -1) {
		sway_abort("Unable to send IPC payload");
	}

	struct ipc_response *resp = ipc_recv_response(socketfd);
	char *response = resp->payload;
	*len = resp->size;
	free(resp);

	return response;
}


================================================
FILE: common/list.c
================================================
#include "list.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "log.h"

list_t *create_list(void) {
	list_t *list = malloc(sizeof(list_t));
	if (!list) {
		return NULL;
	}
	list->capacity = 10;
	list->length = 0;
	list->items = malloc(sizeof(void*) * list->capacity);
	return list;
}

static void list_resize(list_t *list) {
	if (list->length == list->capacity) {
		list->capacity *= 2;
		list->items = realloc(list->items, sizeof(void*) * list->capacity);
	}
}

void list_free(list_t *list) {
	if (list == NULL) {
		return;
	}
	free(list->items);
	free(list);
}

void list_add(list_t *list, void *item) {
	list_resize(list);
	list->items[list->length++] = item;
}

void list_insert(list_t *list, int index, void *item) {
	list_resize(list);
	memmove(&list->items[index + 1], &list->items[index], sizeof(void*) * (list->length - index));
	list->length++;
	list->items[index] = item;
}

void list_del(list_t *list, int index) {
	list->length--;
	memmove(&list->items[index], &list->items[index + 1], sizeof(void*) * (list->length - index));
}

void list_cat(list_t *list, list_t *source) {
	for (int i = 0; i < source->length; ++i) {
		list_add(list, source->items[i]);
	}
}

void list_qsort(list_t *list, int compare(const void *left, const void *right)) {
	qsort(list->items, list->length, sizeof(void *), compare);
}

int list_seq_find(list_t *list, int compare(const void *item, const void *data), const void *data) {
	for (int i = 0; i < list->length; i++) {
		void *item = list->items[i];
		if (compare(item, data) == 0) {
			return i;
		}
	}
	return -1;
}

int list_find(list_t *list, const void *item) {
	for (int i = 0; i < list->length; i++) {
		if (list->items[i] == item) {
			return i;
		}
	}
	return -1;
}

void list_swap(list_t *list, int src, int dest) {
	void *tmp = list->items[src];
	list->items[src] = list->items[dest];
	list->items[dest] = tmp;
}

void list_move_to_end(list_t *list, void *item) {
	int i;
	for (i = 0; i < list->length; ++i) {
		if (list->items[i] == item) {
			break;
		}
	}
	if (!sway_assert(i < list->length, "Item not found in list")) {
		return;
	}
	list_del(list, i);
	list_add(list, item);
}

static void list_rotate(list_t *list, int from, int to) {
	void *tmp = list->items[to];

	while (to > from) {
		list->items[to] = list->items[to - 1];
		to--;
	}

	list->items[from] = tmp;
}

static void list_inplace_merge(list_t *list, int left, int last, int mid, int compare(const void *a, const void *b)) {
	int right = mid + 1;

	if (compare(&list->items[mid], &list->items[right]) <= 0) {
		return;
	}

	while (left <= mid && right <= last) {
		if (compare(&list->items[left], &list->items[right]) <= 0) {
			left++;
		} else {
			list_rotate(list, left, right);
			left++;
			mid++;
			right++;
		}
	}
}

static void list_inplace_sort(list_t *list, int first, int last, int compare(const void *a, const void *b)) {
	if (first >= last) {
		return;
	} else if ((last - first) == 1) {
		if (compare(&list->items[first], &list->items[last]) > 0) {
			list_swap(list, first, last);
		}
	} else {
		int mid = (int)((last + first) / 2);
		list_inplace_sort(list, first, mid, compare);
		list_inplace_sort(list, mid + 1, last, compare);
		list_inplace_merge(list, first, last, mid, compare);
	}
}

void list_stable_sort(list_t *list, int compare(const void *a, const void *b)) {
	if (list->length > 1) {
		list_inplace_sort(list, 0, list->length - 1, compare);
	}
}

void list_free_items_and_destroy(list_t *list) {
	if (!list) {
		return;
	}

	for (int i = 0; i < list->length; ++i) {
		free(list->items[i]);
	}
	list_free(list);
}



================================================
FILE: common/log.c
================================================
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include "log.h"

static terminate_callback_t log_terminate = exit;

void _sway_abort(const char *format, ...) {
	va_list args;
	va_start(args, format);
	_sway_vlog(SWAY_ERROR, format, args);
	va_end(args);
	log_terminate(EXIT_FAILURE);
}

bool _sway_assert(bool condition, const char *format, ...) {
	if (condition) {
		return true;
	}

	va_list args;
	va_start(args, format);
	_sway_vlog(SWAY_ERROR, format, args);
	va_end(args);

#ifndef NDEBUG
	raise(SIGABRT);
#endif

	return false;
}

static bool colored = true;
static sway_log_importance_t log_importance = SWAY_ERROR;
static struct timespec start_time = {-1, -1};

static const char *verbosity_colors[] = {
	[SWAY_SILENT] = "",
	[SWAY_ERROR ] = "\x1B[1;31m",
	[SWAY_INFO  ] = "\x1B[1;34m",
	[SWAY_DEBUG ] = "\x1B[1;90m",
};

static const char *verbosity_headers[] = {
	[SWAY_SILENT] = "",
	[SWAY_ERROR] = "[ERROR]",
	[SWAY_INFO] = "[INFO]",
	[SWAY_DEBUG] = "[DEBUG]",
};

static void timespec_sub(struct timespec *r, const struct timespec *a,
		const struct timespec *b) {
	const long NSEC_PER_SEC = 1000000000;
	r->tv_sec = a->tv_sec - b->tv_sec;
	r->tv_nsec = a->tv_nsec - b->tv_nsec;
	if (r->tv_nsec < 0) {
		r->tv_sec--;
		r->tv_nsec += NSEC_PER_SEC;
	}
}

static void init_start_time(void) {
	if (start_time.tv_sec >= 0) {
		return;
	}
	clock_gettime(CLOCK_MONOTONIC, &start_time);
}

static void sway_log_stderr(sway_log_importance_t verbosity, const char *fmt,
		va_list args) {
	init_start_time();

	if (verbosity > log_importance) {
		return;
	}

	struct timespec ts = {0};
	clock_gettime(CLOCK_MONOTONIC, &ts);
	timespec_sub(&ts, &ts, &start_time);

	fprintf(stderr, "%02d:%02d:%02d.%03ld ", (int)(ts.tv_sec / 60 / 60),
		(int)(ts.tv_sec / 60 % 60), (int)(ts.tv_sec % 60),
		ts.tv_nsec / 1000000);

	unsigned c = (verbosity < SWAY_LOG_IMPORTANCE_LAST) ? verbosity :
		SWAY_LOG_IMPORTANCE_LAST - 1;

	if (colored && isatty(STDERR_FILENO)) {
		fprintf(stderr, "%s", verbosity_colors[c]);
	} else {
		fprintf(stderr, "%s ", verbosity_headers[c]);
	}

	vfprintf(stderr, fmt, args);

	if (colored && isatty(STDERR_FILENO)) {
		fprintf(stderr, "\x1B[0m");
	}
	fprintf(stderr, "\n");
}

void sway_log_init(sway_log_importance_t verbosity, terminate_callback_t callback) {
	init_start_time();

	if (verbosity < SWAY_LOG_IMPORTANCE_LAST) {
		log_importance = verbosity;
	}
	if (callback) {
		log_terminate = callback;
	}
}

void _sway_vlog(sway_log_importance_t verbosity, const char *fmt, va_list args) {
	sway_log_stderr(verbosity, fmt, args);
}

void _sway_log(sway_log_importance_t verbosity, const char *fmt, ...) {
	va_list args;
	va_start(args, fmt);
	sway_log_stderr(verbosity, fmt, args);
	va_end(args);
}


================================================
FILE: common/loop.c
================================================
#include <limits.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <poll.h>
#include <time.h>
#include <unistd.h>
#include "list.h"
#include "log.h"
#include "loop.h"

struct loop_fd_event {
	void (*callback)(int fd, short mask, void *data);
	void *data;
};

struct loop_timer {
	void (*callback)(void *data);
	void *data;
	struct timespec expiry;
};

struct loop {
	struct pollfd *fds;
	int fd_length;
	int fd_capacity;

	list_t *fd_events; // struct loop_fd_event
	list_t *timers; // struct loop_timer
};

struct loop *loop_create(void) {
	struct loop *loop = calloc(1, sizeof(struct loop));
	if (!loop) {
		sway_log(SWAY_ERROR, "Unable to allocate memory for loop");
		return NULL;
	}
	loop->fd_capacity = 10;
	loop->fds = malloc(sizeof(struct pollfd) * loop->fd_capacity);
	loop->fd_events = create_list();
	loop->timers = create_list();
	return loop;
}

void loop_destroy(struct loop *loop) {
	list_free_items_and_destroy(loop->fd_events);
	list_free_items_and_destroy(loop->timers);
	free(loop->fds);
	free(loop);
}

void loop_poll(struct loop *loop) {
	// Calculate next timer in ms
	int ms = INT_MAX;
	if (loop->timers->length) {
		struct timespec now;
		clock_gettime(CLOCK_MONOTONIC, &now);
		for (int i = 0; i < loop->timers->length; ++i) {
			struct loop_timer *timer = loop->timers->items[i];
			int timer_ms = (timer->expiry.tv_sec - now.tv_sec) * 1000;
			timer_ms += (timer->expiry.tv_nsec - now.tv_nsec) / 1000000;
			if (timer_ms < ms) {
				ms = timer_ms;
			}
		}
	}
	if (ms < 0) {
		ms = 0;
	}

	poll(loop->fds, loop->fd_length, ms);

	// Dispatch fds
	for (int i = 0; i < loop->fd_length; ++i) {
		struct pollfd pfd = loop->fds[i];
		struct loop_fd_event *event = loop->fd_events->items[i];

		// Always send these events
		unsigned events = pfd.events | POLLHUP | POLLERR;

		if (pfd.revents & events) {
			event->callback(pfd.fd, pfd.revents, event->data);
		}
	}

	// Dispatch timers
	if (loop->timers->length) {
		struct timespec now;
		clock_gettime(CLOCK_MONOTONIC, &now);
		for (int i = 0; i < loop->timers->length; ++i) {
			struct loop_timer *timer = loop->timers->items[i];
			bool expired = timer->expiry.tv_sec < now.tv_sec ||
				(timer->expiry.tv_sec == now.tv_sec &&
				 timer->expiry.tv_nsec < now.tv_nsec);
			if (expired) {
				timer->callback(timer->data);
				loop_remove_timer(loop, timer);
				--i;
			}
		}
	}
}

void loop_add_fd(struct loop *loop, int fd, short mask,
		void (*callback)(int fd, short mask, void *data), void *data) {
	struct loop_fd_event *event = calloc(1, sizeof(struct loop_fd_event));
	if (!event) {
		sway_log(SWAY_ERROR, "Unable to allocate memory for event");
		return;
	}
	event->callback = callback;
	event->data = data;
	list_add(loop->fd_events, event);

	struct pollfd pfd = {fd, mask, 0};

	if (loop->fd_length == loop->fd_capacity) {
		int capacity = loop->fd_capacity + 10;
		struct pollfd *tmp = realloc(loop->fds,
				sizeof(struct pollfd) * capacity);
		if (!tmp) {
			sway_log(SWAY_ERROR, "Unable to allocate memory for pollfd");
			return;
		}
		loop->fds = tmp;
		loop->fd_capacity = capacity;
	}

	loop->fds[loop->fd_length++] = pfd;
}

struct loop_timer *loop_add_timer(struct loop *loop, int ms,
		void (*callback)(void *data), void *data) {
	struct loop_timer *timer = calloc(1, sizeof(struct loop_timer));
	if (!timer) {
		sway_log(SWAY_ERROR, "Unable to allocate memory for timer");
		return NULL;
	}
	timer->callback = callback;
	timer->data = data;

	clock_gettime(CLOCK_MONOTONIC, &timer->expiry);
	timer->expiry.tv_sec += ms / 1000;

	long int nsec = (ms % 1000) * 1000000;
	if (timer->expiry.tv_nsec + nsec >= 1000000000) {
		timer->expiry.tv_sec++;
		nsec -= 1000000000;
	}
	timer->expiry.tv_nsec += nsec;

	list_add(loop->timers, timer);

	return timer;
}

bool loop_remove_fd(struct loop *loop, int fd) {
	for (int i = 0; i < loop->fd_length; ++i) {
		if (loop->fds[i].fd == fd) {
			free(loop->fd_events->items[i]);
			list_del(loop->fd_events, i);

			loop->fd_length--;
			memmove(&loop->fds[i], &loop->fds[i + 1],
					sizeof(struct pollfd) * (loop->fd_length - i));

			return true;
		}
	}
	return false;
}

bool loop_remove_timer(struct loop *loop, struct loop_timer *timer) {
	for (int i = 0; i < loop->timers->length; ++i) {
		if (loop->timers->items[i] == timer) {
			list_del(loop->timers, i);
			free(timer);
			return true;
		}
	}
	return false;
}


================================================
FILE: common/meson.build
================================================
lib_sway_common = static_library(
	'sway-common',
	files(
		'cairo.c',
		'gesture.c',
		'ipc-client.c',
		'log.c',
		'loop.c',
		'list.c',
		'pango.c',
		'stringop.c',
		'util.c'
	),
	dependencies: [
		cairo,
		pango,
		pangocairo,
		wayland_client.partial_dependency(compile_args: true)
	],
	include_directories: sway_inc
)


================================================
FILE: common/pango.c
================================================
#include <cairo.h>
#include <pango/pangocairo.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cairo_util.h"
#include "log.h"
#include "stringop.h"

size_t escape_markup_text(const char *src, char *dest) {
	size_t length = 0;
	if (dest) {
		dest[0] = '\0';
	}

	while (src[0]) {
		switch (src[0]) {
		case '&':
			length += 5;
			lenient_strcat(dest, "&amp;");
			break;
		case '<':
			length += 4;
			lenient_strcat(dest, "&lt;");
			break;
		case '>':
			length += 4;
			lenient_strcat(dest, "&gt;");
			break;
		case '\'':
			length += 6;
			lenient_strcat(dest, "&apos;");
			break;
		case '"':
			length += 6;
			lenient_strcat(dest, "&quot;");
			break;
		default:
			if (dest) {
				dest[length] = *src;
				dest[length + 1] = '\0';
			}
			length += 1;
		}
		src++;
	}
	return length;
}

PangoLayout *get_pango_layout(cairo_t *cairo, const PangoFontDescription *desc,
		const char *text, double scale, bool markup) {
	PangoLayout *layout = pango_cairo_create_layout(cairo);
	pango_context_set_round_glyph_positions(pango_layout_get_context(layout), false);

	PangoAttrList *attrs;
	if (markup) {
		char *buf;
		GError *error = NULL;
		if (pango_parse_markup(text, -1, 0, &attrs, &buf, NULL, &error)) {
			pango_layout_set_text(layout, buf, -1);
			free(buf);
		} else {
			sway_log(SWAY_ERROR, "pango_parse_markup '%s' -> error %s", text,
					error->message);
			g_error_free(error);
			markup = false; // fallback to plain text
		}
	}
	if (!markup) {
		attrs = pango_attr_list_new();
		pango_layout_set_text(layout, text, -1);
	}

	pango_attr_list_insert(attrs, pango_attr_scale_new(scale));
	pango_layout_set_font_description(layout, desc);
	pango_layout_set_single_paragraph_mode(layout, 1);
	pango_layout_set_attributes(layout, attrs);
	pango_attr_list_unref(attrs);
	return layout;
}

void get_text_size(cairo_t *cairo, const PangoFontDescription *desc, int *width, int *height,
		int *baseline, double scale, bool markup, const char *fmt, ...) {
	if (width) {
		*width = 0;
	}
	if (height) {
		*height = 0;
	}
	if (baseline) {
		*baseline = 0;
	}

	va_list args;
	va_start(args, fmt);
	char *buf = vformat_str(fmt, args);
	va_end(args);
	if (buf == NULL) {
		sway_log(SWAY_ERROR, "Failed to format string");
		return;
	}

	PangoLayout *layout = get_pango_layout(cairo, desc, buf, scale, markup);
	pango_cairo_update_layout(cairo, layout);
	cairo_status_t status = cairo_status(cairo);
	if (status != CAIRO_STATUS_SUCCESS) {
		sway_log(SWAY_ERROR, "pango_cairo_update_layout() failed: %s",
			cairo_status_to_string(status));
		goto out;
	}

	pango_layout_get_pixel_size(layout, width, height);
	if (baseline) {
		*baseline = pango_layout_get_baseline(layout) / PANGO_SCALE;
	}

out:
	g_object_unref(layout);
	free(buf);
}

void get_text_metrics(const PangoFontDescription *description, int *height, int *baseline) {
	cairo_t *cairo = cairo_create(NULL);
	PangoContext *pango = pango_cairo_create_context(cairo);
	pango_context_set_round_glyph_positions(pango, false);
	// When passing NULL as a language, pango uses the current locale.
	PangoFontMetrics *metrics = pango_context_get_metrics(pango, description, NULL);

	*baseline = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
	*height = *baseline + pango_font_metrics_get_descent(metrics) / PANGO_SCALE;

	pango_font_metrics_unref(metrics);
	g_object_unref(pango);
	cairo_destroy(cairo);
}

void render_text(cairo_t *cairo, const PangoFontDescription *desc,
		double scale, bool markup, const char *fmt, ...) {
	va_list args;
	va_start(args, fmt);
	char *buf = vformat_str(fmt, args);
	va_end(args);
	if (buf == NULL) {
		sway_log(SWAY_ERROR, "Failed to format string");
		return;
	}

	PangoLayout *layout = get_pango_layout(cairo, desc, buf, scale, markup);
	cairo_font_options_t *fo = cairo_font_options_create();
	cairo_get_font_options(cairo, fo);
	pango_cairo_context_set_font_options(pango_layout_get_context(layout), fo);
	cairo_font_options_destroy(fo);

	pango_cairo_update_layout(cairo, layout);
	cairo_status_t status = cairo_status(cairo);
	if (status != CAIRO_STATUS_SUCCESS) {
		sway_log(SWAY_ERROR, "pango_cairo_update_layout() failed: %s",
			cairo_status_to_string(status));
		goto out;
	}

	pango_cairo_show_layout(cairo, layout);

out:
	g_object_unref(layout);
	free(buf);
}


================================================
FILE: common/stringop.c
================================================
#include <ctype.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <wordexp.h>
#include "list.h"
#include "log.h"
#include "stringop.h"

static const char whitespace[] = " \f\n\r\t\v";

void strip_whitespace(char *str) {
	size_t len = strlen(str);
	size_t start = strspn(str, whitespace);
	memmove(str, &str[start], len + 1 - start);

	if (*str) {
		for (len -= start + 1; isspace(str[len]); --len) {}
		str[len + 1] = '\0';
	}
}

void strip_quotes(char *str) {
	bool in_str = false;
	bool in_chr = false;
	bool escaped = false;
	char *end = strchr(str,0);
	while (*str) {
		if (*str == '\'' && !in_str && !escaped) {
			in_chr = !in_chr;
			goto shift_over;
		} else if (*str == '\"' && !in_chr && !escaped) {
			in_str = !in_str;
			goto shift_over;
		} else if (*str == '\\') {
			escaped = !escaped;
			++str;
			continue;
		}
		escaped = false;
		++str;
		continue;
		shift_over:
		memmove(str, str+1, end-- - str);
	}
	*end = '\0';
}

char *lenient_strcat(char *dest, const char *src) {
	if (dest && src) {
		return strcat(dest, src);
	}
	return dest;
}

char *lenient_strncat(char *dest, const char *src, size_t len) {
	if (dest && src) {
		return strncat(dest, src, len);
	}
	return dest;
}

// strcmp that also handles null pointers.
int lenient_strcmp(const char *a, const char *b) {
	if (a == b) {
		return 0;
	} else if (!a) {
		return -1;
	} else if (!b) {
		return 1;
	} else {
		return strcmp(a, b);
	}
}

list_t *split_string(const char *str, const char *delims) {
	list_t *res = create_list();
	char *copy = strdup(str);

	char *token = strtok(copy, delims);
	while (token) {
		list_add(res, strdup(token));
		token = strtok(NULL, delims);
	}
	free(copy);
	return res;
}

char **split_args(const char *start, int *argc) {
	*argc = 0;
	int alloc = 2;
	char **argv = malloc(sizeof(char *) * alloc);
	bool in_token = false;
	bool in_string = false;
	bool in_char = false;
	bool in_brackets = false; // brackets are used for criteria
	bool escaped = false;
	const char *end = start;
	if (start) {
		while (*start) {
			if (!in_token) {
				start = (end += strspn(end, whitespace));
				in_token = true;
			}
			if (*end == '"' && !in_char && !escaped) {
				in_string = !in_string;
			} else if (*end == '\'' && !in_string && !escaped) {
				in_char = !in_char;
			} else if (*end == '[' && !in_string && !in_char && !in_brackets && !escaped) {
				in_brackets = true;
			} else if (*end == ']' && !in_string && !in_char && in_brackets && !escaped) {
				in_brackets = false;
			} else if (*end == '\\') {
				escaped = !escaped;
			} else if (*end == '\0' || (!in_string && !in_char && !in_brackets
						&& !escaped && strchr(whitespace, *end))) {
				goto add_token;
			}
			if (*end != '\\') {
				escaped = false;
			}
			++end;
			continue;
			add_token:
			if (end - start > 0) {
				char *token = malloc(end - start + 1);
				strncpy(token, start, end - start + 1);
				token[end - start] = '\0';
				argv[*argc] = token;
				if (++*argc + 1 == alloc) {
					argv = realloc(argv, (alloc *= 2) * sizeof(char *));
				}
			}
			in_token = false;
			escaped = false;
		}
	}
	argv[*argc] = NULL;
	return argv;
}

void free_argv(int argc, char **argv) {
	while (argc-- > 0) {
		free(argv[argc]);
	}
	free(argv);
}

int unescape_string(char *string) {
	/* TODO: More C string escapes */
	int len = strlen(string);
	int i;
	for (i = 0; string[i]; ++i) {
		if (string[i] == '\\') {
			switch (string[++i]) {
			case '0':
				string[i - 1] = '\0';
				return i - 1;
			case 'a':
				string[i - 1] = '\a';
				string[i] = '\0';
				break;
			case 'b':
				string[i - 1] = '\b';
				string[i] = '\0';
				break;
			case 'f':
				string[i - 1] = '\f';
				string[i] = '\0';
				break;
			case 'n':
				string[i - 1] = '\n';
				string[i] = '\0';
				break;
			case 'r':
				string[i - 1] = '\r';
				string[i] = '\0';
				break;
			case 't':
				string[i - 1] = '\t';
				string[i] = '\0';
				break;
			case 'v':
				string[i - 1] = '\v';
				string[i] = '\0';
				break;
			case '\\':
				string[i] = '\0';
				break;
			case '\'':
				string[i - 1] = '\'';
				string[i] = '\0';
				break;
			case '\"':
				string[i - 1] = '\"';
				string[i] = '\0';
				break;
			case '?':
				string[i - 1] = '?';
				string[i] = '\0';
				break;
			case 'x':
				{
					unsigned char c = 0;
					if (string[i+1] >= '0' && string[i+1] <= '9') {
						c = string[i+1] - '0';
						if (string[i+2] >= '0' && string[i+2] <= '9') {
							c *= 0x10;
							c += string[i+2] - '0';
							string[i+2] = '\0';
						}
						string[i+1] = '\0';
					}
					string[i] = '\0';
					string[i - 1] = c;
				}
			}
		}
	}
	// Shift characters over nullspaces
	int shift = 0;
	for (i = 0; i < len; ++i) {
		if (string[i] == 0) {
			shift++;
			continue;
		}
		string[i-shift] = string[i];
	}
	string[len - shift] = 0;
	return len - shift;
}

char *join_args(char **argv, int argc) {
	if (!sway_assert(argc > 0, "argc should be positive")) {
		return NULL;
	}
	int len = 0, i;
	for (i = 0; i < argc; ++i) {
		len += strlen(argv[i]) + 1;
	}
	char *res = malloc(len);
	len = 0;
	for (i = 0; i < argc; ++i) {
		strcpy(res + len, argv[i]);
		len += strlen(argv[i]);
		res[len++] = ' ';
	}
	res[len - 1] = '\0';
	return res;
}

static inline char *argsep_next_interesting(const char *src, const char *delim) {
	char *special = strpbrk(src, "\"'\\");
	char *next_delim = strpbrk(src, delim);
	if (!special) {
		return next_delim;
	}
	if (!next_delim) {
		return special;
	}
	return (next_delim < special) ? next_delim : special;
}

char *argsep(char **stringp, const char *delim, char *matched) {
	char *start = *stringp;
	char *end = start;
	bool in_string = false;
	bool in_char = false;
	bool escaped = false;
	char *interesting = NULL;

	while ((interesting = argsep_next_interesting(end, delim))) {
		if (escaped && interesting != end) {
			escaped = false;
		}
		if (*interesting == '"' && !in_char && !escaped) {
			in_string = !in_string;
			end = interesting + 1;
		} else if (*interesting == '\'' && !in_string && !escaped) {
			in_char = !in_char;
			end = interesting + 1;
		} else if (*interesting == '\\') {
			escaped = !escaped;
			end = interesting + 1;
		} else if (!in_string && !in_char && !escaped) {
			// We must have matched a separator
			end = interesting;
			if (matched) {
				*matched = *end;
			}
			if (end - start) {
				*(end++) = 0;
				*stringp = end;
				break;
			} else {
				end = ++start;
			}
		} else {
			end++;
		}
	}
	if (!interesting) {
		*stringp = NULL;
		if (matched) {
			*matched = '\0';
		}
	}
	return start;
}

bool expand_path(char **path) {
	wordexp_t p = {0};
	while (strstr(*path, "  ")) {
		*path = realloc(*path, strlen(*path) + 2);
		char *ptr = strstr(*path, "  ") + 1;
		memmove(ptr + 1, ptr, strlen(ptr) + 1);
		*ptr = '\\';
	}
	if (wordexp(*path, &p, 0) != 0 || p.we_wordv[0] == NULL) {
		wordfree(&p);
		return false;
	}
	free(*path);
	*path = join_args(p.we_wordv, p.we_wordc);
	wordfree(&p);
	return true;
}

char *vformat_str(const char *fmt, va_list args) {
	char *str = NULL;
	va_list args_copy;
	va_copy(args_copy, args);

	int len = vsnprintf(NULL, 0, fmt, args);
	if (len < 0) {
		sway_log_errno(SWAY_ERROR, "vsnprintf(\"%s\") failed", fmt);
		goto out;
	}

	str = malloc(len + 1);
	if (str == NULL) {
		sway_log_errno(SWAY_ERROR, "malloc() failed");
		goto out;
	}

	vsnprintf(str, len + 1, fmt, args_copy);

out:
	va_end(args_copy);
	return str;
}

char *format_str(const char *fmt, ...) {
	va_list args;
	va_start(args, fmt);
	char *str = vformat_str(fmt, args);
	va_end(args);
	return str;
}

bool has_prefix(const char *str, const char *prefix) {
	return strncmp(str, prefix, strlen(prefix)) == 0;
}


================================================
FILE: common/util.c
================================================
#include <ctype.h>
#include <fcntl.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <wayland-server-protocol.h>
#include "log.h"
#include "util.h"

int wrap(int i, int max) {
	return ((i % max) + max) % max;
}

bool parse_color(const char *color, uint32_t *result) {
	if (color[0] == '#') {
		++color;
	}
	int len = strlen(color);
	if ((len != 6 && len != 8) || !isxdigit(color[0]) || !isxdigit(color[1])) {
		return false;
	}
	char *ptr;
	uint32_t parsed = strtoul(color, &ptr, 16);
	if (*ptr != '\0') {
		return false;
	}
	*result = len == 6 ? ((parsed << 8) | 0xFF) : parsed;
	return true;
}

void color_to_rgba(float dest[static 4], uint32_t color) {
	dest[0] = ((color >> 24) & 0xff) / 255.0;
	dest[1] = ((color >> 16) & 0xff) / 255.0;
	dest[2] = ((color >> 8) & 0xff) / 255.0;
	dest[3] = (color & 0xff) / 255.0;
}

bool parse_boolean(const char *boolean, bool current) {
	if (strcasecmp(boolean, "1") == 0
			|| strcasecmp(boolean, "yes") == 0
			|| strcasecmp(boolean, "on") == 0
			|| strcasecmp(boolean, "true") == 0
			|| strcasecmp(boolean, "enable") == 0
			|| strcasecmp(boolean, "enabled") == 0
			|| strcasecmp(boolean, "active") == 0) {
		return true;
	} else if (strcasecmp(boolean, "toggle") == 0) {
		return !current;
	}
	// All other values are false to match i3
	return false;
}

float parse_float(const char *value) {
	errno = 0;
	char *end;
	float flt = strtof(value, &end);
	if (*end || errno) {
		sway_log(SWAY_DEBUG, "Invalid float value '%s', defaulting to NAN", value);
		return NAN;
	}
	return flt;
}

enum movement_unit parse_movement_unit(const char *unit) {
	if (strcasecmp(unit, "px") == 0) {
		return MOVEMENT_UNIT_PX;
	}
	if (strcasecmp(unit, "ppt") == 0) {
		return MOVEMENT_UNIT_PPT;
	}
	if (strcasecmp(unit, "default") == 0) {
		return MOVEMENT_UNIT_DEFAULT;
	}
	return MOVEMENT_UNIT_INVALID;
}

int parse_movement_amount(int argc, char **argv,
		struct movement_amount *amount) {
	if (!sway_assert(argc > 0, "Expected args in parse_movement_amount")) {
		amount->amount = 0;
		amount->unit = MOVEMENT_UNIT_INVALID;
		return 0;
	}

	char *err;
	amount->amount = (int)strtol(argv[0], &err, 10);
	if (*err) {
		// e.g. 10px
		amount->unit = parse_movement_unit(err);
		return 1;
	}
	if (argc == 1) {
		amount->unit = MOVEMENT_UNIT_DEFAULT;
		return 1;
	}
	// Try the second argument
	amount->unit = parse_movement_unit(argv[1]);
	if (amount->unit == MOVEMENT_UNIT_INVALID) {
		amount->unit = MOVEMENT_UNIT_DEFAULT;
		return 1;
	}
	return 2;
}

const char *sway_wl_output_subpixel_to_string(enum wl_output_subpixel subpixel) {
	switch (subpixel) {
	case WL_OUTPUT_SUBPIXEL_UNKNOWN:
		return "unknown";
	case WL_OUTPUT_SUBPIXEL_NONE:
		return "none";
	case WL_OUTPUT_SUBPIXEL_HORIZONTAL_RGB:
		return "rgb";
	case WL_OUTPUT_SUBPIXEL_HORIZONTAL_BGR:
		return "bgr";
	case WL_OUTPUT_SUBPIXEL_VERTICAL_RGB:
		return "vrgb";
	case WL_OUTPUT_SUBPIXEL_VERTICAL_BGR:
		return "vbgr";
	}
	sway_assert(false, "Unknown value for wl_output_subpixel.");
	return NULL;
}

bool sway_set_cloexec(int fd, bool cloexec) {
	int flags = fcntl(fd, F_GETFD);
	if (flags == -1) {
		sway_log_errno(SWAY_ERROR, "fcntl failed");
		return false;
	}
	if (cloexec) {
		flags = flags | FD_CLOEXEC;
	} else {
		flags = flags & ~FD_CLOEXEC;
	}
	if (fcntl(fd, F_SETFD, flags) == -1) {
		sway_log_errno(SWAY_ERROR, "fcntl failed");
		return false;
	}
	return true;
}

uint32_t get_current_time_in_msec(void) {
	struct timespec now;
	clock_gettime(CLOCK_MONOTONIC, &now);
	return now.tv_sec * 1000 + now.tv_nsec / 1000000;
}


================================================
FILE: completions/bash/sway
================================================
# sway(1) completion

_sway()
{
  local cur prev short long
  _get_comp_words_by_ref cur prev

  short=(
    -h
    -c
    -C
    -d
    -v
    -V
  )

  long=(
    --help
    --config
    --validate
    --debug
    --version
    --verbose
    --get-socketpath
  )

  case $prev in
    -c|--config)
      _filedir
      return
      ;;
  esac

  if [[ $cur == --* ]]; then
    COMPREPLY=($(compgen -W "${long[*]}" -- "$cur"))
  elif [[ $cur == -* ]]; then
    COMPREPLY=($(compgen -W "${short[*]}" -- "$cur"))
    COMPREPLY+=($(compgen -W "${long[*]}" -- "$cur"))
  else
    COMPREPLY=($(compgen -W "${short[*]}" -- "$cur"))
    COMPREPLY+=($(compgen -W "${long[*]}" -- "$cur"))
    COMPREPLY+=($(compgen -c -- "$cur"))
  fi

} &&
complete -F _sway sway


================================================
FILE: completions/bash/swaybar
================================================
# swaybar(1) completion

_swaybar()
{
  local cur prev short long
  _get_comp_words_by_ref cur prev

  short=(
    -h
    -v
    -s
    -b
    -d
  )

  long=(
    --help
    --version
    --socket
    --bar_id
    --debug
  )

  case $prev in
    -s|--socket)
      _filedir
      return
      ;;
    -b|--bar_id)
      bars=($(swaymsg -t get_bar_config | jq -r '.[]'))
      COMPREPLY=($(compgen -W "${bars[*]}" -- "$cur"))
      return
      ;;
  esac

  if [[ $cur == --* ]]; then
    COMPREPLY=($(compgen -W "${long[*]}" -- "$cur"))
  else
    COMPREPLY=($(compgen -W "${short[*]}" -- "$cur"))
    COMPREPLY+=($(compgen -W "${long[*]}" -- "$cur"))
  fi

} &&
complete -F _swaybar swaybar


================================================
FILE: completions/bash/swaymsg
================================================
# swaymsg(1) completion

_swaymsg()
{
  local cur prev types short long
  _get_comp_words_by_ref cur prev

  types=(
    'get_workspaces'
    'get_seats'
    'get_inputs'
    'get_outputs'
    'get_tree'
    'get_marks'
    'get_bar_config'
    'get_version'
    'get_binding_modes'
    'get_binding_state'
    'get_config'
    'send_tick'
    'subscribe'
  )

  short=(
    -h
    -m
    -p
    -q
    -r
    -s
    -t
    -v
  )

  long=(
    --help
    --monitor
    --pretty
    --quiet
    --raw
    --socket
    --type
    --version
  )

  case $prev in
    -s|--socket)
      _filedir
      return
      ;;
    -t|--type)
      COMPREPLY=($(compgen -W "${types[*]}" -- "$cur"))
      return
      ;;
  esac

  if [[ $cur == --* ]]; then
    COMPREPLY=($(compgen -W "${long[*]}" -- "$cur"))
  else
    COMPREPLY=($(compgen -W "${short[*]}" -- "$cur"))
    COMPREPLY+=($(compgen -W "${long[*]}" -- "$cur"))
  fi

} &&
complete -F _swaymsg swaymsg


================================================
FILE: completions/fish/sway.fish
================================================
# sway(1) completion

complete -f -c sway
complete -c sway -s h -l help --description "Show help message and quit."
complete -c sway -s c -l config --description "Specifies a config file." -r
complete -c sway -s C -l validate --description "Check the validity of the config file, then exit."
complete -c sway -s d -l debug --description "Enables full logging, including debug information."
complete -c sway -s v -l version --description "Show the version number and quit."
complete -c sway -s V -l verbose --description "Enables more verbose logging."
complete -c sway -l get-socketpath --description "Gets the IPC socket path and prints it, then exits."



================================================
FILE: completions/fish/swaymsg.fish
================================================
# swaymsg(1) completion

complete -f -c swaymsg
complete -c swaymsg -s h -l help --description "Show help message and quit."
complete -c swaymsg -s m -l monitor --description "Monitor subscribed events until killed."
complete -c swaymsg -s p -l pretty --description "Use pretty output even when not using a tty."
complete -c swaymsg -s q -l quiet --description "Sends the IPC message but does not print the response from sway."
complete -c swaymsg -s r -l raw --description "Use raw output even if using tty."
complete -c swaymsg -s s -l socket -r --description "Use the specified socket path. Otherwise, swaymsg will ask where the socket is (which is the value of $SWAYSOCK, then of $I3SOCK)."
complete -c swaymsg -s v -l version --description "Print the version (of swaymsg) and quit."

complete -c swaymsg -s t -l type -fr --description "Specify the type of IPC message."
complete -c swaymsg -s t -l type -fra 'get_workspaces' --description "Gets a JSON-encoded list of workspaces and their status."
complete -c swaymsg -s t -l type -fra 'get_inputs' --description "Gets a JSON-encoded list of current inputs."
complete -c swaymsg -s t -l type -fra 'get_outputs' --description "Gets a JSON-encoded list of current outputs."
complete -c swaymsg -s t -l type -fra 'get_tree' --description "Gets a JSON-encoded layout tree of all open windows, containers, outputs, workspaces, and so on."
complete -c swaymsg -s t -l type -fra 'get_marks' --description "Get a JSON-encoded list of marks."
complete -c swaymsg -s t -l type -fra 'get_bar_config' --description "Get a JSON-encoded configuration for swaybar."
complete -c swaymsg -s t -l type -fra 'get_version' --description "Get JSON-encoded version information for the running instance of sway."
complete -c swaymsg -s t -l type -fra 'get_binding_modes' --description "Gets a JSON-encoded list of currently configured binding modes."
complete -c swaymsg -s t -l type -fra 'get_binding_state' --description "Get JSON-encoded info about the current binding state."
complete -c swaymsg -s t -l type -fra 'get_config' --description "Gets a JSON-encoded copy of the current configuration."
complete -c swaymsg -s t -l type -fra 'get_seats' --description "Gets a JSON-encoded list of all seats, its properties and all assigned devices."
complete -c swaymsg -s t -l type -fra 'send_tick' --description "Sends a tick event to all subscribed clients."
complete -c swaymsg -s t -l type -fra 'subscribe' --description "Subscribe to a list of event types."


================================================
FILE: completions/fish/swaynag.fish
================================================
# swaynag
complete -f -c swaynag
complete -c swaynag -s C -l config -r --description 'The config file to use. Default: $HOME/.swaynag/config, $XDG_CONFIG_HOME/swaynag/config, and SYSCONFDIR/swaynag/config.'
complete -c swaynag -s d -l debug --description 'Enable debugging.'
complete -c swaynag -s e -l edge -fr --description 'Set the edge to use: top or bottom'
complete -c swaynag -s f -l font -r --description 'Set the font to use.'
complete -c swaynag -s h -l help --description 'Show help message and quit.'
complete -c swaynag -s b -l button -fr --description 'Create a button with a text and an action which is executed when pressed. Multiple buttons can be defined by providing the flag multiple times.'
complete -c swaynag -s l -l detailed-message --description 'Read a detailed message from stdin. A button to toggle details will be added. Details are shown in a scrollable multi-line text area.'
complete -c swaynag -s L -l detailed-button -fr --description 'Set the text for the button that toggles details. This has no effect if there is not a detailed message. The default is "Toggle details".'
complete -c swaynag -s m -l message -fr --description 'Set the message text.'
complete -c swaynag -s o -l output -fr --description 'Set the output to use.'
complete -c swaynag -s s -l dismiss-button -fr --description 'Sets the text for the dismiss nagbar button. The default is "X".'
complete -c swaynag -s t -l type -fr --description 'Set the message type. Two types are created by default "error" and "warning". Custom types can be defined in the config file.'
complete -c swaynag -s v -l version --description 'Show the version number and quit.'

# Appearance
complete -c swaynag -l background -fr --description 'Set the color of the background.'
complete -c swaynag -l border -fr --description 'Set the color of the border.'
complete -c swaynag -l border-bottom -fr --description 'Set the color of the bottom border.'
complete -c swaynag -l button-background -fr --description 'Set the color for the background for buttons.'
complete -c swaynag -l text -fr --description 'Set the text color.'
complete -c swaynag -l border-bottom-size -fr --description 'Set the thickness of the bottom border.'
complete -c swaynag -l message-padding -fr --description 'Set the padding for the message.'
complete -c swaynag -l details-border-size -fr --description 'Set the thickness for the details border.'
complete -c swaynag -l button-border-size -fr --description 'Set the thickness for the button border.'
complete -c swaynag -l button-gap -fr --description 'Set the size of the gap between buttons.'
complete -c swaynag -l button-dismiss-gap -fr --description 'Set the size of the gap between the dismiss button and another button.'
complete -c swaynag -l button-margin-right -fr --description 'Set the margin from the right of the dismiss button to edge.'
complete -c swaynag -l button-padding -fr --description 'Set the padding for the button text.'


================================================
FILE: completions/meson.build
================================================
if get_option('zsh-completions')
	zsh_files = files(
		'zsh/_sway',
		'zsh/_swaymsg',
	)
	zsh_install_dir = join_paths(datadir, 'zsh', 'site-functions')

	install_data(zsh_files, install_dir: zsh_install_dir)
endif

if get_option('bash-completions')
	bash_comp = dependency('bash-completion', required: false)

	bash_files = files(
		'bash/sway',
		'bash/swaymsg',
	)

	if get_option('swaybar')
		bash_files += files('bash/swaybar')
	endif

	if bash_comp.found()
		bash_install_dir = bash_comp.get_variable(
			pkgconfig: 'completionsdir',
			pkgconfig_define: ['datadir', datadir]
		)
	else
		bash_install_dir = join_paths(datadir, 'bash-completion', 'completions')
	endif

	install_data(bash_files, install_dir: bash_install_dir)
endif

if get_option('fish-completions')
	fish_comp = dependency('fish', required: false)

	fish_files = files(
		'fish/sway.fish',
		'fish/swaymsg.fish',
	)

	if get_option('swaynag')
		fish_files += files('fish/swaynag.fish')
	endif

	if fish_comp.found()
		fish_install_dir = fish_comp.get_variable(
			pkgconfig: 'completionsdir',
			pkgconfig_define: ['datadir', datadir]
		)
	else
		fish_install_dir = join_paths(datadir, 'fish', 'vendor_completions.d')
	endif

	install_data(fish_files, install_dir: fish_install_dir)
endif


================================================
FILE: completions/zsh/_sway
================================================
#compdef sway
#------------
# Description
# -----------
#
# Completion script for the sway window manager (http://swaywm.org)
#
# ---------------------------------------------
# Author
# -------
#
# * Seth Barberee <seth.barberee@gmail.com>
#
# -------------------------------
_arguments -s \
	'(-v --version)'{-v,--version}'[Show the version number and quit]' \
	'(-h --help)'{-h,--help}'[Show help message and quit]' \
	'(-c --config)'{-c,--config}'[Specify a config file]:files:_files' \
	'(-C --validate)'{-C,--validate}'[Check validity of the config file, then exit]' \
	'(-d --debug)'{-d,--debug}'[Enables full logging, including debug information]' \
	'(-V --verbose)'{-V,--verbose}'[Enables more verbose logging]' \
	'(--get-socketpath)'--get-socketpath'[Gets the IPC socket path and prints it, then exits]'


================================================
FILE: completions/zsh/_swaybar
================================================
#compdef swaybar
#
# Completion script for swaybar
#

local bars=($(swaymsg -t get_bar_config | jq -r '.[]'))

_arguments -s \
	'(-h --help)'{-h,--help}'[Show help message and quit]' \
	'(-v --version)'{-v,--version}'[Show version and quit]' \
	'(-s --socket)'{-s,--socket}'[Connect to sway via socket]:filename:_files' \
	'(-b --bar_id)'{-b,--bar-id}'[Bar ID for which to get the configuration]:filename:($bars)'\
	'(-d --debug)'{-d,--debug}'[Enable debugging]'


================================================
FILE: completions/zsh/_swaymsg
================================================
#compdef swaymsg
#-----------------
# Description
# -----------
#
# Completion script for swaymsg in sway wm (http://swaywm.org)
#
# ------------------------------------------------------
# Author
# --------
#
#  * Seth Barberee <seth.barberee@gmail.com>
#
#  -------------------------------------------

types=(
'get_workspaces'
'get_seats'
'get_inputs'
'get_outputs'
'get_tree'
'get_marks'
'get_bar_config'
'get_version'
'get_binding_modes'
'get_binding_state'
'get_config'
'send_tick'
'subscribe'
)

_arguments -s \
	'(-h --help)'{-h,--help}'[Show help message and quit]' \
	'(-m --monitor)'{-m,--monitor}'[Monitor until killed (-t SUBSCRIBE only)]' \
	'(-p --pretty)'{-p,--pretty}'[Use pretty output even when not using a tty]' \
	'(-q --quiet)'{-q,--quiet}'[Be quiet]' \
	'(-r --raw)'{-r,--raw}'[Use raw output even if using a tty]' \
	'(-s --socket)'{-s,--socket}'[Use the specified socket path]:files:_files' \
	'(-t --type)'{-t,--type}'[Specify the message type]:type:{_describe "type" types}' \
	'(-v --version)'{-v,--version}'[Show the version number and quit]'


================================================
FILE: config.in
================================================
# Default config for sway
#
# Copy this to ~/.config/sway/config and edit it to your liking.
#
# Read `man 5 sway` for a complete reference.

### Variables
#
# Logo key. Use Mod1 for Alt.
set $mod Mod4
# Home row direction keys, like vim
set $left h
set $down j
set $up k
set $right l
# Your preferred terminal emulator
set $term foot
# Your preferred application launcher
set $menu wmenu-run

### Output configuration
#
# Default wallpaper (more resolutions are available in @datadir@/backgrounds/sway/)
output * bg @datadir@/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill
#
# Example configuration:
#
#   output HDMI-A-1 resolution 1920x1080 position 1920,0
#
# You can get the names of your outputs by running: swaymsg -t get_outputs

### Idle configuration
#
# Example configuration:
#
# exec swayidle -w \
#          timeout 300 'swaylock -f -c 000000' \
#          timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \
#          before-sleep 'swaylock -f -c 000000'
#
# This will lock your screen after 300 seconds of inactivity, then turn off
# your displays after another 300 seconds, and turn your screens back on when
# resumed. It will also lock your screen before your computer goes to sleep.

### Input configuration
#
# Example configuration:
#
#   input type:touchpad {
#       dwt enabled
#       tap enabled
#       natural_scroll enabled
#       middle_emulation enabled
#   }
#
#   input type:keyboard {
#       xkb_layout "eu"
#   }
#
# You can also configure each device individually.
# Read `man 5 sway-input` for more information about this section.

### Key bindings
#
# Basics:
#
    # Start a terminal
    bindsym $mod+Return exec $term

    # Kill focused window
    bindsym $mod+Shift+q kill

    # Start your launcher
    bindsym $mod+d exec $menu

    # Drag floating windows by holding down $mod and left mouse button.
    # Resize them with right mouse button + $mod.
    # Despite the name, also works for non-floating windows.
    # Change normal to inverse to use left mouse button for resizing and right
    # mouse button for dragging.
    floating_modifier $mod normal

    # Reload the configuration file
    bindsym $mod+Shift+c reload

    # Exit sway (logs you out of your Wayland session)
    bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit'
#
# Moving around:
#
    # Move your focus around
    bindsym $mod+$left focus left
    bindsym $mod+$down focus down
    bindsym $mod+$up focus up
    bindsym $mod+$right focus right
    # Or use $mod+[up|down|left|right]
    bindsym $mod+Left focus left
    bindsym $mod+Down focus down
    bindsym $mod+Up focus up
    bindsym $mod+Right focus right

    # Move the focused window with the same, but add Shift
    bindsym $mod+Shift+$left move left
    bindsym $mod+Shift+$down move down
    bindsym $mod+Shift+$up move up
    bindsym $mod+Shift+$right move right
    # Ditto, with arrow keys
    bindsym $mod+Shift+Left move left
    bindsym $mod+Shift+Down move down
    bindsym $mod+Shift+Up move up
    bindsym $mod+Shift+Right move right
#
# Workspaces:
#
    # Switch to workspace
    bindsym $mod+1 workspace number 1
    bindsym $mod+2 workspace number 2
    bindsym $mod+3 workspace number 3
    bindsym $mod+4 workspace number 4
    bindsym $mod+5 workspace number 5
    bindsym $mod+6 workspace number 6
    bindsym $mod+7 workspace number 7
    bindsym $mod+8 workspace number 8
    bindsym $mod+9 workspace number 9
    bindsym $mod+0 workspace number 10
    # Move focused container to workspace
    bindsym $mod+Shift+1 move container to workspace number 1
    bindsym $mod+Shift+2 move container to workspace number 2
    bindsym $mod+Shift+3 move container to workspace number 3
    bindsym $mod+Shift+4 move container to workspace number 4
    bindsym $mod+Shift+5 move container to workspace number 5
    bindsym $mod+Shift+6 move container to workspace number 6
    bindsym $mod+Shift+7 move container to workspace number 7
    bindsym $mod+Shift+8 move container to workspace number 8
    bindsym $mod+Shift+9 move container to workspace number 9
    bindsym $mod+Shift+0 move container to workspace number 10
    # Note: workspaces can have any name you want, not just numbers.
    # We just use 1-10 as the default.
#
# Layout stuff:
#
    # You can "split" the current object of your focus with
    # $mod+b or $mod+v, for horizontal and vertical splits
    # respectively.
    bindsym $mod+b splith
    bindsym $mod+v splitv

    # Switch the current container between different layout styles
    bindsym $mod+s layout stacking
    bindsym $mod+w layout tabbed
    bindsym $mod+e layout toggle split

    # Make the current focus fullscreen
    bindsym $mod+f fullscreen

    # Toggle the current focus between tiling and floating mode
    bindsym $mod+Shift+space floating toggle

    # Swap focus between the tiling area and the floating area
    bindsym $mod+space focus mode_toggle

    # Move focus to the parent container
    bindsym $mod+a focus parent
#
# Scratchpad:
#
    # Sway has a "scratchpad", which is a bag of holding for windows.
    # You can send windows there and get them back later.

    # Move the currently focused window to the scratchpad
    bindsym $mod+Shift+minus move scratchpad

    # Show the next scratchpad window or hide the focused scratchpad window.
    # If there are multiple scratchpad windows, this command cycles through them.
    bindsym $mod+minus scratchpad show
#
# Resizing containers:
#
mode "resize" {
    # left will shrink the containers width
    # right will grow the containers width
    # up will shrink the containers height
    # down will grow the containers height
    bindsym $left resize shrink width 10px
    bindsym $down resize grow height 10px
    bindsym $up resize shrink height 10px
    bindsym $right resize grow width 10px

    # Ditto, with arrow keys
    bindsym Left resize shrink width 10px
    bindsym Down resize grow height 10px
    bindsym Up resize shrink height 10px
    bindsym Right resize grow width 10px

    # Return to default mode
    bindsym Return mode "default"
    bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"
#
# Utilities:
#
    # Special keys to adjust volume via PulseAudio
    bindsym --locked XF86AudioMute exec pactl set-sink-mute \@DEFAULT_SINK@ toggle
    bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume \@DEFAULT_SINK@ -5%
    bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume \@DEFAULT_SINK@ +5%
    bindsym --locked XF86AudioMicMute exec pactl set-source-mute \@DEFAULT_SOURCE@ toggle

    # Special keys to control media via playerctl
    bindsym --locked XF86AudioPlay exec playerctl play-pause
    bindsym --locked XF86AudioPause exec playerctl play-pause
    bindsym --locked XF86AudioPrev exec playerctl previous
    bindsym --locked XF86AudioNext exec playerctl next
    bindsym --locked XF86AudioStop exec playerctl stop

    # Special keys to adjust brightness via brightnessctl
    bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%-
    bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+

    # Special key to take a screenshot with grim
    bindsym Print exec grim

#
# Status Bar:
#
# Read `man 5 sway-bar` for more information about this section.
bar {
    position top

    # When the status_command prints a new line to stdout, swaybar updates.
    # The default just shows the current date and time.
    status_command while date +'%Y-%m-%d %X'; do sleep 1; done

    colors {
        statusline #ffffff
        background #323232
        inactive_workspace #32323200 #32323200 #5c5c5c
    }
}

include @sysconfdir@/sway/config.d/*


================================================
FILE: include/cairo_util.h
================================================
#ifndef _SWAY_CAIRO_UTIL_H
#define _SWAY_CAIRO_UTIL_H
#include "config.h"
#include <stdint.h>
#include <cairo.h>
#include <wayland-client-protocol.h>

void cairo_set_source_u32(cairo_t *cairo, uint32_t color);
cairo_subpixel_order_t to_cairo_subpixel_order(enum wl_output_subpixel subpixel);

cairo_surface_t *cairo_image_surface_scale(cairo_surface_t *image,
		int width, int height);

#endif


================================================
FILE: include/gesture.h
================================================
#ifndef _SWAY_GESTURE_H
#define _SWAY_GESTURE_H

#include <stdbool.h>
#include <stdint.h>

/**
 * A gesture type used in binding.
 */
enum gesture_type {
	GESTURE_TYPE_NONE = 0,
	GESTURE_TYPE_HOLD,
	GESTURE_TYPE_PINCH,
	GESTURE_TYPE_SWIPE,
};

// Turns single type enum value to constant string representation.
const char *gesture_type_string(enum gesture_type direction);

// Value to use to accept any finger count
extern const uint8_t GESTURE_FINGERS_ANY;

/**
 * A gesture direction used in binding.
 */
enum gesture_direction {
	GESTURE_DIRECTION_NONE = 0,
	// Directions based on delta x and y
	GESTURE_DIRECTION_UP = 1 << 0,
	GESTURE_DIRECTION_DOWN = 1 << 1,
	GESTURE_DIRECTION_LEFT = 1 << 2,
	GESTURE_DIRECTION_RIGHT = 1 << 3,
	// Directions based on scale
	GESTURE_DIRECTION_INWARD = 1 << 4,
	GESTURE_DIRECTION_OUTWARD = 1 << 5,
	// Directions based on rotation
	GESTURE_DIRECTION_CLOCKWISE = 1 << 6,
	GESTURE_DIRECTION_COUNTERCLOCKWISE = 1 << 7,
};

// Turns single direction enum value to constant string representation.
const char *gesture_direction_string(enum gesture_direction direction);

/**
 * Struct representing a pointer gesture
 */
struct gesture {
	enum gesture_type type;
	uint8_t fingers;
	uint32_t directions;
};

/**
 * Parses gesture from <gesture>[:<fingers>][:<directions>] string.
 *
 * Return NULL on success, otherwise error message string
 */
char *gesture_parse(const char *input, struct gesture *output);

// Turns gesture into string representation
char *gesture_to_string(struct gesture *gesture);

// Check if gesture is of certain type and finger count.
bool gesture_check(struct gesture *target,
		enum gesture_type type, uint8_t fingers);

// Check if a gesture target/binding is match by other gesture/input
bool gesture_match(struct gesture *target,
		struct gesture *to_match, bool exact);

// Returns true if gesture are exactly the same
bool gesture_equal(struct gesture *a, struct gesture *b);

// Compare distance between two matched target gestures.
int8_t gesture_compare(struct gesture *a, struct gesture *b);

// Small helper struct to track gestures over time
struct gesture_tracker {
	enum gesture_type type;
	uint8_t fingers;
	double dx, dy;
	double scale;
	double rotation;
};

// Begin gesture tracking
void gesture_tracker_begin(struct gesture_tracker *tracker,
		enum gesture_type type, uint8_t fingers);

// Check if the provides type is currently being tracked
bool gesture_tracker_check(struct gesture_tracker *tracker,
		enum gesture_type type);

// Update gesture track with new data point
void gesture_tracker_update(struct gesture_tracker *tracker, double dx,
		double dy, double scale, double rotation);

// Reset tracker
void gesture_tracker_cancel(struct gesture_tracker *tracker);

// Reset tracker and return gesture tracked
struct gesture *gesture_tracker_end(struct gesture_tracker *tracker);

#endif


================================================
FILE: include/ipc-client.h
================================================
#ifndef _SWAY_IPC_CLIENT_H
#define _SWAY_IPC_CLIENT_H

// arbitrary number, it's probably sufficient, higher number = more memory usage
#define JSON_MAX_DEPTH 512

#include <stdbool.h>
#include <stdint.h>
#include <sys/time.h>

#include "ipc.h"

/**
 * IPC response including type of IPC response, size of payload and the json
 * encoded payload string.
 */
struct ipc_response {
	uint32_t size;
	uint32_t type;
	char *payload;
};

/**
 * Gets the path to the IPC socket from sway.
 */
char *get_socketpath(void);
/**
 * Opens the sway socket.
 */
int ipc_open_socket(const char *socket_path);
/**
 * Issues a single IPC command and returns the buffer. len will be updated with
 * the length of the buffer returned from sway.
 */
char *ipc_single_command(int socketfd, uint32_t type, const char *payload, uint32_t *len);
/**
 * Receives a single IPC response and returns an ipc_response.
 */
struct ipc_response *ipc_recv_response(int socketfd);
/**
 * Free ipc_response struct
 */
void free_ipc_response(struct ipc_response *response);
/**
 * Sets the receive timeout for the IPC socket
 */
bool ipc_set_recv_timeout(int socketfd, struct timeval tv);

#endif


================================================
FILE: include/ipc.h
================================================
#ifndef _SWAY_IPC_H
#define _SWAY_IPC_H

#define event_mask(ev) (1 << (ev & 0x7F))

enum ipc_command_type {
	// i3 command types - see i3's I3_REPLY_TYPE constants
	IPC_COMMAND = 0,
	IPC_GET_WORKSPACES = 1,
	IPC_SUBSCRIBE = 2,
	IPC_GET_OUTPUTS = 3,
	IPC_GET_TREE = 4,
	IPC_GET_MARKS = 5,
	IPC_GET_BAR_CONFIG = 6,
	IPC_GET_VERSION = 7,
	IPC_GET_BINDING_MODES = 8,
	IPC_GET_CONFIG = 9,
	IPC_SEND_TICK = 10,
	IPC_SYNC = 11,
	IPC_GET_BINDING_STATE = 12,

	// sway-specific command types
	IPC_GET_INPUTS = 100,
	IPC_GET_SEATS = 101,

	// Events sent from sway to clients. Events have the highest bits set.
	IPC_EVENT_WORKSPACE = ((1<<31) | 0),
	IPC_EVENT_OUTPUT = ((1<<31) | 1),
	IPC_EVENT_MODE = ((1<<31) | 2),
	IPC_EVENT_WINDOW = ((1<<31) | 3),
	IPC_EVENT_BARCONFIG_UPDATE = ((1<<31) | 4),
	IPC_EVENT_BINDING = ((1<<31) | 5),
	IPC_EVENT_SHUTDOWN = ((1<<31) | 6),
	IPC_EVENT_TICK = ((1<<31) | 7),

	// sway-specific event types
	IPC_EVENT_BAR_STATE_UPDATE = ((1<<31) | 20),
	IPC_EVENT_INPUT = ((1<<31) | 21),
};

#endif


================================================
FILE: include/list.h
================================================
#ifndef _SWAY_LIST_H
#define _SWAY_LIST_H

typedef struct {
	int capacity;
	int length;
	void **items;
} list_t;

list_t *create_list(void);
void list_free(list_t *list);
void list_add(list_t *list, void *item);
void list_insert(list_t *list, int index, void *item);
void list_del(list_t *list, int index);
void list_cat(list_t *list, list_t *source);
// See qsort. Remember to use *_qsort functions as compare functions,
// because they dereference the left and right arguments first!
void list_qsort(list_t *list, int compare(const void *left, const void *right));
// Return index for first item in list that returns 0 for given compare
// function or -1 if none matches.
int list_seq_find(list_t *list, int compare(const void *item, const void *cmp_to), const void *cmp_to);
int list_find(list_t *list, const void *item);
// stable sort since qsort is not guaranteed to be stable
void list_stable_sort(list_t *list, int compare(const void *a, const void *b));
// swap two elements in a list
void list_swap(list_t *list, int src, int dest);
// move item to end of list
void list_move_to_end(list_t *list, void *item);

/* Calls `free` for each item in the list, then frees the list.
 * Do not use this to free lists of primitives or items that require more
 * complicated deallocation code.
 */
void list_free_items_and_destroy(list_t *list);
#endif


================================================
FILE: include/log.h
================================================
#ifndef _SWAY_LOG_H
#define _SWAY_LOG_H

#include <stdbool.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>

typedef enum {
	SWAY_SILENT = 0,
	SWAY_ERROR = 1,
	SWAY_INFO = 2,
	SWAY_DEBUG = 3,
	SWAY_LOG_IMPORTANCE_LAST,
} sway_log_importance_t;

#ifdef __GNUC__
#define ATTRIB_PRINTF(start, end) __attribute__((format(printf, start, end)))
#else
#define ATTRIB_PRINTF(start, end)
#endif

void error_handler(int sig);

typedef void (*terminate_callback_t)(int exit_code);

// Will log all messages less than or equal to `verbosity`
// The `terminate` callback is called by `sway_abort`
void sway_log_init(sway_log_importance_t verbosity, terminate_callback_t terminate);

void _sway_log(sway_log_importance_t verbosity, const char *format, ...) ATTRIB_PRINTF(2, 3);
void _sway_vlog(sway_log_importance_t verbosity, const char *format, va_list args) ATTRIB_PRINTF(2, 0);
void _sway_abort(const char *filename, ...) ATTRIB_PRINTF(1, 2);
bool _sway_assert(bool condition, const char* format, ...) ATTRIB_PRINTF(2, 3);

#ifdef SWAY_REL_SRC_DIR
// strip prefix from __FILE__, leaving the path relative to the project root
#define _SWAY_FILENAME ((const char *)__FILE__ + sizeof(SWAY_REL_SRC_DIR) - 1)
#else
#define _SWAY_FILENAME __FILE__
#endif

#define sway_log(verb, fmt, ...) \
	_sway_log(verb, "[%s:%d] " fmt, _SWAY_FILENAME, __LINE__, ##__VA_ARGS__)

#define sway_vlog(verb, fmt, args) \
	_sway_vlog(verb, "[%s:%d] " fmt, _SWAY_FILENAME, __LINE__, args)

#define sway_log_errno(verb, fmt, ...) \
	sway_log(verb, fmt ": %s", ##__VA_ARGS__, strerror(errno))

#define sway_abort(FMT, ...) \
	_sway_abort("[%s:%d] " FMT, _SWAY_FILENAME, __LINE__, ##__VA_ARGS__)

#define sway_assert(COND, FMT, ...) \
	_sway_assert(COND, "[%s:%d] %s:" FMT, _SWAY_FILENAME, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__)

#endif


================================================
FILE: include/loop.h
================================================
#ifndef _SWAY_LOOP_H
#define _SWAY_LOOP_H
#include <stdbool.h>

/**
 * This is an event loop system designed for sway clients, not sway itself.
 *
 * The loop consists of file descriptors and timers. Typically the Wayland
 * display's file descriptor will be one of the fds in the loop.
 */

struct loop;
struct loop_timer;

/**
 * Create an event loop.
 */
struct loop *loop_create(void);

/**
 * Destroy the event loop (eg. on program termination).
 */
void loop_destroy(struct loop *loop);

/**
 * Poll the event loop. This will block until one of the fds has data.
 */
void loop_poll(struct loop *loop);

/**
 * Add a file descriptor to the loop.
 */
void loop_add_fd(struct loop *loop, int fd, short mask,
		void (*func)(int fd, short mask, void *data), void *data);

/**
 * Add a timer to the loop.
 *
 * When the timer expires, the timer will be removed from the loop and freed.
 */
struct loop_timer *loop_add_timer(struct loop *loop, int ms,
		void (*callback)(void *data), void *data);

/**
 * Remove a file descriptor from the loop.
 */
bool loop_remove_fd(struct loop *loop, int fd);

/**
 * Remove a timer from the loop.
 */
bool loop_remove_timer(struct loop *loop, struct loop_timer *timer);

#endif


================================================
FILE: include/meson.build
================================================
configure_file(output: 'config.h',  configuration: conf_data)


================================================
FILE: include/pango.h
================================================
#ifndef _SWAY_PANGO_H
#define _SWAY_PANGO_H
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <cairo.h>
#include <pango/pangocairo.h>
#include "stringop.h"

/**
 * Utility function which escape characters a & < > ' ".
 *
 * The function returns the length of the escaped string, optionally writing the
 * escaped string to dest if provided.
 */
size_t escape_markup_text(const char *src, char *dest);
PangoLayout *get_pango_layout(cairo_t *cairo, const PangoFontDescription *desc,
		const char *text, double scale, bool markup);
void get_text_size(cairo_t *cairo, const PangoFontDescription *desc, int *width, int *height,
		int *baseline, double scale, bool markup, const char *fmt, ...) _SWAY_ATTRIB_PRINTF(8, 9);
void get_text_metrics(const PangoFontDescription *desc, int *height, int *baseline);
void render_text(cairo_t *cairo, PangoFontDescription *desc,
		double scale, bool markup, const char *fmt, ...) _SWAY_ATTRIB_PRINTF(5, 6);

#endif


================================================
FILE: include/pool-buffer.h
================================================
#ifndef _SWAY_BUFFERS_H
#define _SWAY_BUFFERS_H
#include <cairo.h>
#include <pango/pangocairo.h>
#include <stdbool.h>
#include <stdint.h>
#include <wayland-client.h>

struct pool_buffer {
	struct wl_buffer *buffer;
	cairo_surface_t *surface;
	cairo_t *cairo;
	PangoContext *pango;
	uint32_t width, height;
	void *data;
	size_t size;
	bool busy;
};

struct pool_buffer *get_next_buffer(struct wl_shm *shm,
		struct pool_buffer pool[static 2], uint32_t width, uint32_t height);
void destroy_buffer(struct pool_buffer *buffer);

#endif


================================================
FILE: include/stringop.h
================================================
#ifndef _SWAY_STRINGOP_H
#define _SWAY_STRINGOP_H

#include <stdbool.h>
#include <stddef.h>
#include "list.h"

#ifdef __GNUC__
#define _SWAY_ATTRIB_PRINTF(start, end) __attribute__((format(printf, start, end)))
#else
#define _SWAY_ATTRIB_PRINTF(start, end)
#endif

void strip_whitespace(char *str);
void strip_quotes(char *str);

// strcat that does nothing if dest or src is NULL
char *lenient_strcat(char *dest, const char *src);
char *lenient_strncat(char *dest, const char *src, size_t len);

// strcmp that also handles null pointers.
int lenient_strcmp(const char *a, const char *b);

// Simply split a string with delims, free with `list_free_items_and_destroy`
list_t *split_string(const char *str, const char *delims);

// Splits an argument string, keeping quotes intact
char **split_args(const char *str, int *argc);
void free_argv(int argc, char **argv);

int unescape_string(char *string);
char *join_args(char **argv, int argc);

// Split string into 2 by delim, handle quotes
char *argsep(char **stringp, const char *delim, char *matched_delim);

// Expand a path using shell replacements such as $HOME and ~
bool expand_path(char **path);

char *vformat_str(const char *fmt, va_list args) _SWAY_ATTRIB_PRINTF(1, 0);
char *format_str(const char *fmt, ...) _SWAY_ATTRIB_PRINTF(1, 2);

bool has_prefix(const char *str, const char *prefix);

#endif


================================================
FILE: include/sway/commands.h
================================================
#ifndef _SWAY_COMMANDS_H
#define _SWAY_COMMANDS_H

#include <wlr/util/edges.h>
#include "config.h"
#include "stringop.h"

struct sway_container;

typedef struct cmd_results *sway_cmd(int argc, char **argv);

struct cmd_handler {
	const char *command;
	sway_cmd *handle;
};

/**
 * Indicates the result of a command's execution.
 */
enum cmd_status {
	CMD_SUCCESS, 		/**< The command was successful */
	CMD_FAILURE,		/**< The command resulted in an error */
	CMD_INVALID, 		/**< Unknown command or parser error */
	CMD_DEFER,		/**< Command execution deferred */
	CMD_BLOCK,
	CMD_BLOCK_COMMANDS,
	CMD_BLOCK_END
};

/**
 * Stores the result of executing a command.
 */
struct cmd_results {
	enum cmd_status status;
	/**
	 * Human friendly error message, or NULL on success
	 */
	char *error;
};

enum expected_args {
	EXPECTED_AT_LEAST,
	EXPECTED_AT_MOST,
	EXPECTED_EQUAL_TO
};

struct cmd_results *checkarg(int argc, const char *name,
		enum expected_args type, int val);

const struct cmd_handler *find_handler(const char *line,
		const struct cmd_handler *cmd_handlers, size_t handlers_size);

/**
 * Parse and executes a command.
 *
 * If the command string contains criteria then the command will be executed on
 * all matching containers. Otherwise, it'll run on the `con` container. If
 * `con` is NULL then it'll run on the currently focused container.
 */
list_t *execute_command(char *command,  struct sway_seat *seat,
		struct sway_container *con);
/**
 * Parse and handles a command during config file loading.
 *
 * Do not use this under normal conditions.
 */
struct cmd_results *config_command(char *command, char **new_block);
/**
 * Parse and handle a sub command
 */
struct cmd_results *config_subcommand(char **argv, int argc,
		const struct cmd_handler *handlers, size_t handlers_size);
/*
 * Parses a command policy rule.
 */
struct cmd_results *config_commands_command(char *exec);
/**
 * Allocates a cmd_results object.
 */
struct cmd_results *cmd_results_new(enum cmd_status status, const char *error, ...) _SWAY_ATTRIB_PRINTF(2, 3);
/**
 * Frees a cmd_results object.
 */
void free_cmd_results(struct cmd_results *results);
/**
 * Serializes a list of cmd_results to a JSON string.
 *
 * Free the JSON string later on.
 */
char *cmd_results_to_json(list_t *res_list);

/**
 * TODO: Move this function and its dependent functions to container.c.
 */
void container_resize_tiled(struct sway_container *parent, uint32_t axis,
		int amount);

struct sway_container *container_find_resize_parent(struct sway_container *con,
		uint32_t edge);

/**
 * Handlers shared by exec and exec_always.
 */
sway_cmd cmd_exec_validate;
sway_cmd cmd_exec_process;

sway_cmd cmd_allow_tearing;
sway_cmd cmd_assign;
sway_cmd cmd_bar;
sway_cmd cmd_bindcode;
sway_cmd cmd_bindgesture;
sway_cmd cmd_bindswitch;
sway_cmd cmd_bindsym;
sway_cmd cmd_border;
sway_cmd cmd_client_noop;
sway_cmd cmd_client_focused;
sway_cmd cmd_client_focused_inactive;
sway_cmd cmd_client_focused_tab_title;
sway_cmd cmd_client_unfocused;
sway_cmd cmd_client_urgent;
sway_cmd cmd_client_placeholder;
sway_cmd cmd_client_background;
sway_cmd cmd_commands;
sway_cmd cmd_create_output;
sway_cmd cmd_default_border;
sway_cmd cmd_default_floating_border;
sway_cmd cmd_default_orientation;
sway_cmd cmd_exec;
sway_cmd cmd_exec_always;
sway_cmd cmd_exit;
sway_cmd cmd_floating;
sway_cmd cmd_floating_maximum_size;
sway_cmd cmd_floating_minimum_size;
sway_cmd cmd_floating_modifier;
sway_cmd cmd_floating_scroll;
sway_cmd cmd_focus;
sway_cmd cmd_focus_follows_mouse;
sway_cmd cmd_focus_on_window_activation;
sway_cmd cmd_focus_wrapping;
sway_cmd cmd_font;
sway_cmd cmd_for_window;
sway_cmd cmd_force_display_urgency_hint;
sway_cmd cmd_force_focus_wrapping;
sway_cmd cmd_fullscreen;
sway_cmd cmd_gaps;
sway_cmd cmd_hide_edge_borders;
sway_cmd cmd_include;
sway_cmd cmd_inhibit_idle;
sway_cmd cmd_input;
sway_cmd cmd_seat;
sway_cmd cmd_ipc;
sway_cmd cmd_kill;
sway_cmd cmd_layout;
sway_cmd cmd_log_colors;
sway_cmd cmd_mark;
sway_cmd cmd_max_render_time;
sway_cmd cmd_mode;
sway_cmd cmd_mouse_warping;
sway_cmd cmd_move;
sway_cmd cmd_new_float;
sway_cmd cmd_new_window;
sway_cmd cmd_nop;
sway_cmd cmd_opacity;
sway_cmd cmd_no_focus;
sway_cmd cmd_output;
sway_cmd cmd_permit;
sway_cmd cmd_popup_during_fullscreen;
sway_cmd cmd_primary_selection;
sway_cmd cmd_reject;
sway_cmd cmd_reload;
sway_cmd cmd_rename;
sway_cmd cmd_resize;
sway_cmd cmd_scratchpad;
sway_cmd cmd_seamless_mouse;
sway_cmd cmd_set;
sway_cmd cmd_shortcuts_inhibitor;
sway_cmd cmd_show_marks;
sway_cmd cmd_smart_borders;
sway_cmd cmd_smart_gaps;
sway_cmd cmd_split;
sway_cmd cmd_splith;
sway_cmd cmd_splitt;
sway_cmd cmd_splitv;
sway_cmd cmd_sticky;
sway_cmd cmd_swaybg_command;
sway_cmd cmd_swaynag_command;
sway_cmd cmd_swap;
sway_cmd cmd_tiling_drag;
sway_cmd cmd_tiling_drag_threshold;
sway_cmd cmd_title_align;
sway_cmd cmd_title_format;
sway_cmd cmd_titlebar_border_thickness;
sway_cmd cmd_titlebar_padding;
sway_cmd cmd_unbindcode;
sway_cmd cmd_unbindswitch;
sway_cmd cmd_unbindgesture;
sway_cmd cmd_unbindsym;
sway_cmd cmd_unmark;
sway_cmd cmd_urgent;
sway_cmd cmd_workspace;
sway_cmd cmd_workspace_layout;
sway_cmd cmd_ws_auto_back_and_forth;
sway_cmd cmd_xwayland;

sway_cmd bar_cmd_bindcode;
sway_cmd bar_cmd_binding_mode_indicator;
sway_cmd bar_cmd_bindsym;
sway_cmd bar_cmd_colors;
sway_cmd bar_cmd_font;
sway_cmd bar_cmd_gaps;
sway_cmd bar_cmd_mode;
sway_cmd bar_cmd_modifier;
sway_cmd bar_cmd_output;
sway_cmd bar_cmd_height;
sway_cmd bar_cmd_hidden_state;
sway_cmd bar_cmd_icon_theme;
sway_cmd bar_cmd_id;
sway_cmd bar_cmd_position;
sway_cmd bar_cmd_separator_symbol;
sway_cmd bar_cmd_status_command;
sway_cmd bar_cmd_status_edge_padding;
sway_cmd bar_cmd_status_padding;
sway_cmd bar_cmd_pango_markup;
sway_cmd bar_cmd_strip_workspace_numbers;
sway_cmd bar_cmd_strip_workspace_name;
sway_cmd bar_cmd_swaybar_command;
sway_cmd bar_cmd_tray_bindcode;
sway_cmd bar_cmd_tray_bindsym;
sway_cmd bar_cmd_tray_output;
sway_cmd bar_cmd_tray_padding;
sway_cmd bar_cmd_unbindcode;
sway_cmd bar_cmd_unbindsym;
sway_cmd bar_cmd_wrap_scroll;
sway_cmd bar_cmd_workspace_buttons;
sway_cmd bar_cmd_workspace_min_width;

sway_cmd bar_colors_cmd_active_workspace;
sway_cmd bar_colors_cmd_background;
sway_cmd bar_colors_cmd_focused_background;
sway_cmd bar_colors_cmd_binding_mode;
sway_cmd bar_colors_cmd_focused_workspace;
sway_cmd bar_colors_cmd_inactive_workspace;
sway_cmd bar_colors_cmd_separator;
sway_cmd bar_colors_cmd_focused_separator;
sway_cmd bar_colors_cmd_statusline;
sway_cmd bar_colors_cmd_focused_statusline;
sway_cmd bar_colors_cmd_urgent_workspace;

sway_cmd input_cmd_seat;
sway_cmd input_cmd_accel_profile;
sway_cmd input_cmd_calibration_matrix;
sway_cmd input_cmd_click_method;
sway_cmd input_cmd_clickfinger_button_map;
sway_cmd input_cmd_drag;
sway_cmd input_cmd_drag_lock;
sway_cmd input_cmd_dwt;
sway_cmd input_cmd_dwtp;
sway_cmd input_cmd_events;
sway_cmd input_cmd_left_handed;
sway_cmd input_cmd_map_from_region;
sway_cmd input_cmd_map_to_output;
sway_cmd input_cmd_map_to_region;
sway_cmd input_cmd_middle_emulation;
sway_cmd input_cmd_natural_scroll;
sway_cmd input_cmd_pointer_accel;
sway_cmd input_cmd_rotation_angle;
sway_cmd input_cmd_scroll_factor;
sway_cmd input_cmd_repeat_delay;
sway_cmd input_cmd_repeat_rate;
sway_cmd input_cmd_scroll_button;
sway_cmd input_cmd_scroll_button_lock;
sway_cmd input_cmd_scroll_method;
sway_cmd input_cmd_tap;
sway_cmd input_cmd_tap_button_map;
sway_cmd input_cmd_tool_mode;
sway_cmd input_cmd_xkb_capslock;
sway_cmd input_cmd_xkb_file;
sway_cmd input_cmd_xkb_layout;
sway_cmd input_cmd_xkb_model;
sway_cmd input_cmd_xkb_numlock;
sway_cmd input_cmd_xkb_options;
sway_cmd input_cmd_xkb_rules;
sway_cmd input_cmd_xkb_switch_layout;
sway_cmd input_cmd_xkb_variant;

sway_cmd output_cmd_adaptive_sync;
sway_cmd output_cmd_allow_tearing;
sway_cmd output_cmd_background;
sway_cmd output_cmd_color_profile;
sway_cmd output_cmd_disable;
sway_cmd output_cmd_dpms;
sway_cmd output_cmd_enable;
sway_cmd output_cmd_hdr;
sway_cmd output_cmd_max_render_time;
sway_cmd output_cmd_mode;
sway_cmd output_cmd_modeline;
sway_cmd output_cmd_position;
sway_cmd output_cmd_power;
sway_cmd output_cmd_render_bit_depth;
sway_cmd output_cmd_scale;
sway_cmd output_cmd_scale_filter;
sway_cmd output_cmd_subpixel;
sway_cmd output_cmd_toggle;
sway_cmd output_cmd_transform;
sway_cmd output_cmd_unplug;

sway_cmd seat_cmd_attach;
sway_cmd seat_cmd_cursor;
sway_cmd seat_cmd_fallback;
sway_cmd seat_cmd_hide_cursor;
sway_cmd seat_cmd_idle_inhibit;
sway_cmd seat_cmd_idle_wake;
sway_cmd seat_cmd_keyboard_grouping;
sway_cmd seat_cmd_pointer_constraint;
sway_cmd seat_cmd_shortcuts_inhibitor;
sway_cmd seat_cmd_xcursor_theme;

sway_cmd cmd_ipc_cmd;
sway_cmd cmd_ipc_events;
sway_cmd cmd_ipc_event_cmd;

#endif


================================================
FILE: include/sway/config.h
================================================
#ifndef _SWAY_CONFIG_H
#define _SWAY_CONFIG_H
#include <libinput.h>
#include <stdint.h>
#include <string.h>
#include <time.h>
#include <wlr/interfaces/wlr_switch.h>
#include <wlr/types/wlr_tablet_tool.h>
#include <wlr/util/box.h>
#include <wlr/render/color.h>
#include <xkbcommon/xkbcommon.h>
#include <xf86drmMode.h>
#include "../include/config.h"
#include "gesture.h"
#include "list.h"
#include "stringop.h"
#include "swaynag.h"
#include "tree/container.h"
#include "sway/input/tablet.h"
#include "sway/tree/root.h"
#include "wlr-layer-shell-unstable-v1-protocol.h"
#include <pango/pangocairo.h>

// TODO: Refactor this shit

/**
 * Describes a variable created via the `set` command.
 */
struct sway_variable {
	char *name;
	char *value;
};

enum binding_input_type {
	BINDING_KEYCODE,
	BINDING_KEYSYM,
	BINDING_MOUSECODE,
	BINDING_MOUSESYM,
	BINDING_SWITCH, // dummy, only used to call seat_execute_command
	BINDING_GESTURE // dummy, only used to call seat_execute_command
};

enum binding_flags {
	BINDING_RELEASE = 1 << 0,
	BINDING_LOCKED = 1 << 1, // keyboard only
	BINDING_BORDER = 1 << 2, // mouse only; trigger on container border
	BINDING_CONTENTS = 1 << 3, // mouse only; trigger on container contents
	BINDING_TITLEBAR = 1 << 4, // mouse only; trigger on container titlebar
	BINDING_CODE = 1 << 5, // keyboard only; convert keysyms into keycodes
	BINDING_RELOAD = 1 << 6, // switch only; (re)trigger binding on reload
	BINDING_INHIBITED = 1 << 7, // keyboard only: ignore shortcut inhibitor
	BINDING_NOREPEAT = 1 << 8, // keyboard only; do not trigger when repeating a held key
	BINDING_EXACT = 1 << 9, // gesture only; only trigger on exact match
};

/**
 * A key (or mouse) binding and an associated command.
 */
struct sway_binding {
	enum binding_input_type type;
	int order;
	char *input;
	uint32_t flags;
	list_t *keys; // sorted in ascending order
	list_t *syms; // sorted in ascending order; NULL if BINDING_CODE is not set
	uint32_t modifiers;
	xkb_layout_index_t group;
	char *command;
};

enum sway_switch_trigger {
	SWAY_SWITCH_TRIGGER_OFF,
	SWAY_SWITCH_TRIGGER_ON,
	SWAY_SWITCH_TRIGGER_TOGGLE,
};

/**
 * A laptop switch binding and an associated command.
 */
struct sway_switch_binding {
	enum wlr_switch_type type;
	enum sway_switch_trigger trigger;
	uint32_t flags;
	char *command;
};

/**
 * A gesture binding and an associated command.
 */
struct sway_gesture_binding {
	char *input;
	uint32_t flags;
	struct gesture gesture;
	char *command;
};

/**
 * Focus on window activation.
 */
enum sway_fowa {
	FOWA_SMART,
	FOWA_URGENT,
	FOWA_FOCUS,
	FOWA_NONE,
};

/**
 * A "mode" of keybindings created via the `mode` command.
 */
struct sway_mode {
	char *name;
	list_t *keysym_bindings;
	list_t *keycode_bindings;
	list_t *mouse_bindings;
	list_t *switch_bindings;
	list_t *gesture_bindings;
	bool pango;
};

struct input_config_mapped_from_region {
	double x1, y1;
	double x2, y2;
	bool mm;
};

struct calibration_matrix {
	bool configured;
	float matrix[6];
};

enum input_config_mapped_to {
	MAPPED_TO_DEFAULT,
	MAPPED_TO_OUTPUT,
	MAPPED_TO_REGION,
};

struct input_config_tool {
	enum wlr_tablet_tool_type type;
	enum sway_tablet_tool_mode mode;
};

/**
 * options for input devices
 */
struct input_config {
	char *identifier;
	const char *input_type;

	int accel_profile;
	struct calibration_matrix calibration_matrix;
	int click_method;
	int clickfinger_button_map;
	int drag;
	int drag_lock;
	int dwt;
	int dwtp;
	int left_handed;
	int middle_emulation;
	int natural_scroll;
	float pointer_accel;
	float rotation_angle;
	float scroll_factor;
	int repeat_delay;
	int repeat_rate;
	int scroll_button;
	int scroll_button_lock;
	int scroll_method;
	int send_events;
	int tap;
	int tap_button_map;

	char *xkb_layout;
	char *xkb_model;
	char *xkb_options;
	char *xkb_rules;
	char *xkb_variant;
	char *xkb_file;

	bool xkb_file_is_set;

	int xkb_numlock;
	int xkb_capslock;

	struct input_config_mapped_from_region *mapped_from_region;

	enum input_config_mapped_to mapped_to;
	char *mapped_to_output;
	struct wlr_box *mapped_to_region;

	list_t *tools;

	bool capturable;
	struct wlr_box region;
};

/**
 * Options for misc device configurations that happen in the seat block
 */
struct seat_attachment_config {
	char *identifier;
	// TODO other things are configured here for some reason
};

enum seat_config_hide_cursor_when_typing {
	HIDE_WHEN_TYPING_DEFAULT, // the default is currently disabled
	HIDE_WHEN_TYPING_ENABLE,
	HIDE_WHEN_TYPING_DISABLE,
};

enum seat_config_allow_constrain {
	CONSTRAIN_DEFAULT, // the default is currently enabled
	CONSTRAIN_ENABLE,
	CONSTRAIN_DISABLE,
};

enum seat_config_shortcuts_inhibit {
	SHORTCUTS_INHIBIT_DEFAULT, // the default is currently enabled
	SHORTCUTS_INHIBIT_ENABLE,
	SHORTCUTS_INHIBIT_DISABLE,
};

enum seat_keyboard_grouping {
	KEYBOARD_GROUP_DEFAULT, // the default is currently smart
	KEYBOARD_GROUP_NONE,
	KEYBOARD_GROUP_SMART, // keymap and repeat info
};

enum sway_input_idle_source {
	IDLE_SOURCE_KEYBOARD = 1 << 0,
	IDLE_SOURCE_POINTER = 1 << 1,
	IDLE_SOURCE_TOUCH = 1 << 2,
	IDLE_SOURCE_TABLET_PAD = 1 << 3,
	IDLE_SOURCE_TABLET_TOOL = 1 << 4,
	IDLE_SOURCE_SWITCH = 1 << 5,
};

/**
 * Options for multiseat and other misc device configurations
 */
struct seat_config {
	char *name;
	int fallback; // -1 means not set
	list_t *attachments; // list of seat_attachment configs
	int hide_cursor_timeout;
	enum seat_config_hide_cursor_when_typing hide_cursor_when_typing;
	enum seat_config_allow_constrain allow_constrain;
	enum seat_config_shortcuts_inhibit shortcuts_inhibit;
	enum seat_keyboard_grouping keyboard_grouping;
	uint32_t idle_inhibit_sources, idle_wake_sources;
	struct {
		char *name;
		int size;
	} xcursor_theme;
};

enum scale_filter_mode {
	SCALE_FILTER_DEFAULT, // the default is currently smart
	SCALE_FILTER_LINEAR,
	SCALE_FILTER_NEAREST,
	SCALE_FILTER_SMART,
};

enum render_bit_depth {
	RENDER_BIT_DEPTH_DEFAULT, // the default is currently 8 for SDR, 10 for HDR
	RENDER_BIT_DEPTH_6,
	RENDER_BIT_DEPTH_8,
	RENDER_BIT_DEPTH_10,
};

enum color_profile {
	COLOR_PROFILE_DEFAULT, // default is Transform with NULL color_transform
	COLOR_PROFILE_TRANSFORM, // use color_transform from output_config
	COLOR_PROFILE_TRANSFORM_WITH_DEVICE_PRIMARIES, // create transform from wlr_output
};

/**
 * Size and position configuration for a particular output.
 *
 * This is set via the `output` command.
 */
struct output_config {
	char *name;
	int enabled;
	int power;
	int width, height;
	float refresh_rate;
	int custom_mode;
	drmModeModeInfo drm_mode;
	int x, y;
	float scale;
	enum scale_filter_mode scale_filter;
	int32_t transform;
	enum wl_output_subpixel subpixel;
	int max_render_time; // In milliseconds
	int adaptive_sync;
	enum render_bit_depth render_bit_depth;
	enum color_profile color_profile;
	struct wlr_color_transform *color_transform;
	int allow_tearing;
	int hdr;

	char *background;
	char *background_option;
	char *background_fallback;
};

/**
 * Stores size of gaps for each side
 */
struct side_gaps {
	int top;
	int right;
	int bottom;
	int left;
};

enum smart_gaps_mode {
	SMART_GAPS_OFF,
	SMART_GAPS_ON,
	SMART_GAPS_INVERSE_OUTER,
};

/**
 * Stores configuration for a workspace, regardless of whether the workspace
 * exists.
 */
struct workspace_config {
	char *workspace;
	list_t *outputs;
	int gaps_inner;
	struct side_gaps gaps_outer;
};

enum pango_markup_config {
	PANGO_MARKUP_DISABLED = false,
	PANGO_MARKUP_ENABLED = true,
	PANGO_MARKUP_DEFAULT // The default is font dependent ("pango:" prefix)
};

struct bar_config {
	char *swaybar_command;
	struct wl_client *client;
	struct wl_listener client_destroy;

	/**
	 * One of "dock", "hide", "invisible"
	 *
	 * Always visible in dock mode. Visible only when modifier key is held in hide mode.
	 * Never visible in invisible mode.
	 */
	char *mode;
	/**
	 * One of "show" or "hide".
	 *
	 * In "show" mode, it will always be shown on top of the active workspace.
	 */
	char *hidden_state;
	bool visible_by_modifier; // only relevant in "hide" mode
	/**
	 * Id name used to identify the bar through IPC.
	 *
	 * Defaults to bar-x, where x corresponds to the position of the
	 * embedding bar block in the config file (bar-0, bar-1, ...).
	 */
	char *id;
	uint32_t modifier;
	list_t *outputs;
	char *position;
	list_t *bindings;
	char *status_command;
	enum pango_markup_config pango_markup;
	char *font;
	int height; // -1 not defined
	bool workspace_buttons;
	bool wrap_scroll;
	char *separator_symbol;
	bool strip_workspace_numbers;
	bool strip_workspace_name;
	bool binding_mode_indicator;
	bool verbose;
	struct side_gaps gaps;
	int status_padding;
	int status_edge_padding;
	uint32_t workspace_min_width;
	struct {
		char *background;
		char *statusline;
		char *separator;
		char *focused_background;
		char *focused_statusline;
		char *focused_separator;
		char *focused_workspace_border;
		char *focused_workspace_bg;
		char *focused_workspace_text;
		char *active_workspace_border;
		char *active_workspace_bg;
		char *active_workspace_text;
		char *inactive_workspace_border;
		char *inactive_workspace_bg;
		char *inactive_workspace_text;
		char *urgent_workspace_border;
		char *urgent_workspace_bg;
		char *urgent_workspace_text;
		char *binding_mode_border;
		char *binding_mode_bg;
		char *binding_mode_text;
	} colors;

#if HAVE_TRAY
	char *icon_theme;
	struct wl_list tray_bindings; // struct tray_binding::link
	list_t *tray_outputs; // char *
	int tray_padding;
#endif
};

struct bar_binding {
	uint32_t button;
	bool release;
	char *command;
};

#if HAVE_TRAY
struct tray_binding {
	uint32_t button;
	const char *command;
	struct wl_list link; // struct tray_binding::link
};
#endif

struct border_colors {
	float border[4];
	float background[4];
	float text[4];
	float indicator[4];
	float child_border[4];
};

enum edge_border_types {
	E_NONE, /**< Don't hide edge borders */
	E_VERTICAL, /**< hide vertical edge borders */
	E_HORIZONTAL, /**< hide horizontal edge borders */
	E_BOTH, /**< hide vertical and horizontal edge borders */
};

enum edge_border_smart_types {
	ESMART_OFF,
	ESMART_ON, /**< hide edges if precisely one window is present in workspace */
	ESMART_NO_GAPS, /**< hide edges if one window and gaps to edge is zero */
};

enum sway_popup_during_fullscreen {
	POPUP_SMART,
	POPUP_IGNORE,
	POPUP_LEAVE,
};

enum focus_follows_mouse_mode {
	FOLLOWS_NO,
	FOLLOWS_YES,
	FOLLOWS_ALWAYS,
};

enum focus_wrapping_mode {
	WRAP_NO,
	WRAP_YES,
	WRAP_FORCE,
	WRAP_WORKSPACE,
};

enum mouse_warping_mode {
	WARP_NO,
	WARP_OUTPUT,
	WARP_CONTAINER,
};

enum alignment {
	ALIGN_LEFT,
	ALIGN_CENTER,
	ALIGN_RIGHT,
};

enum xwayland_mode {
	XWAYLAND_MODE_DISABLED,
	XWAYLAND_MODE_LAZY,
	XWAYLAND_MODE_IMMEDIATE,
};

/**
 * The configuration struct. The result of loading a config file.
 */
struct sway_config {
	char *swaynag_command;
	struct swaynag_instance swaynag_config_errors;
	list_t *symbols;
	list_t *modes;
	list_t *bars;
	list_t *cmd_queue;
	list_t *workspace_configs;
	list_t *output_configs;
	list_t *input_configs;
	list_t *input_type_configs;
	list_t *seat_configs;
	list_t *criteria;
	list_t *no_focus;
	list_t *active_bar_modifiers;
	struct sway_mode *current_mode;
	struct bar_config *current_bar;
	uint32_t floating_mod;
	bool floating_mod_inverse;
	uint32_t dragging_key;
	uint32_t resizing_key;
	char *floating_scroll_up_cmd;
	char *floating_scroll_down_cmd;
	char *floating_scroll_left_cmd;
	char *floating_scroll_right_cmd;
	enum sway_container_layout default_orientation;
	enum sway_container_layout default_layout;
	char *font; // Used for IPC.
	PangoFontDescription *font_description; // Used internally for rendering and validating.
	int font_height;
	int font_baseline;
	bool pango_markup;
	int titlebar_border_thickness;
	int titlebar_h_padding;
	int titlebar_v_padding;
	size_t urgent_timeout;
	enum sway_fowa focus_on_window_activation;
	enum sway_popup_during_fullscreen popup_during_fullscreen;
	enum xwayland_mode xwayland;

	// swaybg
	char *swaybg_command;
	struct wl_client *swaybg_client;
	struct wl_listener swaybg_client_destroy;

	// Flags
	enum focus_follows_mouse_mode focus_follows_mouse;
	enum mouse_warping_mode mouse_warping;
	enum focus_wrapping_mode focus_wrapping;
	bool active;
	bool failed;
	bool reloading;
	bool reading;
	bool validating;
	bool auto_back_and_forth;
	bool show_marks;
	enum alignment title_align;
	bool primary_selection;

	bool tiling_drag;
	int tiling_drag_threshold;

	enum smart_gaps_mode smart_gaps;
	int gaps_inner;
	struct side_gaps gaps_outer;

	list_t *config_chain;
	bool user_config_path;
	const char *current_config_path;
	const char *current_config;
	int current_config_line_number;
	char *current_config_line;

	enum sway_container_border border;
	enum sway_container_border floating_border;
	int border_thickness;
	int floating_border_thickness;
	enum edge_border_types hide_edge_borders;
	enum edge_border_smart_types hide_edge_borders_smart;
	bool hide_lone_tab;

	// border colors
	struct {
		struct border_colors focused;
		struct border_colors focused_inactive;
		struct border_colors focused_tab_title;
		struct border_colors unfocused;
		struct border_colors urgent;
		struct border_colors placeholder;
		float background[4];
	} border_colors;

	bool has_focused_tab_title;

	// floating view
	int32_t floating_maximum_width;
	int32_t floating_maximum_height;
	int32_t floating_minimum_width;
	int32_t floating_minimum_height;

	// The keysym to keycode translation
	struct xkb_state *keysym_translation_state;

	// Context for command handlers
	struct {
		struct input_config *input_config;
		struct output_config *output_config;
		struct seat_config *seat_config;
		struct sway_seat *seat;
		struct sway_node *node;
		struct sway_container *container;
		struct sway_workspace *workspace;
		bool node_overridden; // True if the node is selected by means other than focus
		struct {
			int argc;
			char **argv;
		} leftovers;
	} handler_context;
};

/**
 * Loads the main config from the given path. is_active should be true when
 * reloading the config.
 */
bool load_main_config(const char *path, bool is_active, bool validating);

/**
 * Loads an included config. Can only be used after load_main_config.
 */
void load_include_configs(const char *path, struct sway_config *config,
		struct swaynag_instance *swaynag);

/**
 * Reads the config from the given FILE.
 */
bool read_config(FILE *file, struct sway_config *config,
		struct swaynag_instance *swaynag);

/**
 * Run the commands that were deferred when reading the config file.
 */
void run_deferred_commands(void);

/**
 * Run the binding commands that were deferred when initializing the inputs
 */
void run_deferred_bindings(void);

/**
 * Adds a warning entry to the swaynag instance used for errors.
 */
void config_add_swaynag_warning(char *fmt, ...) _SWAY_ATTRIB_PRINTF(1, 2);

/**
 * Free config struct
 */
void free_config(struct sway_config *config);

void free_sway_variable(struct sway_variable *var);

/**
 * Does variable replacement for a string based on the config's currently loaded variables.
 */
char *do_var_replacement(char *str);

int input_identifier_cmp(const void *item, const void *data);

struct input_config *new_input_config(const char* identifier);

void merge_input_config(struct input_config *dst, struct input_config *src);

struct input_config *store_input_config(struct input_config *ic, char **error);

void input_config_fill_rule_names(struct input_config *ic,
		struct xkb_rule_names *rules);

void free_input_config(struct input_config *ic);

int seat_name_cmp(const void *item, const void *data);

struct seat_config *new_seat_config(const char* name);

void merge_seat_config(struct seat_config *dst, struct seat_config *src);

struct seat_config *copy_seat_config(struct seat_config *seat);

void free_seat_config(struct seat_config *ic);

struct seat_attachment_config *seat_attachment_config_new(void);

struct seat_attachment_config *seat_config_get_attachment(
		struct seat_config *seat_config, char *identifier);

struct seat_config *store_seat_config(struct seat_config *seat);

int output_name_cmp(const void *item, const void *data);

void output_get_identifier(char *identifier, size_t len,
	struct sway_output *output);

const char *sway_output_scale_filter_to_string(enum scale_filter_mode scale_filter);

struct output_config *new_output_config(const char *name);

bool apply_output_configs(struct output_config **ocs, size_t ocs_len,
		bool test_only, bool degrade_to_off);

void apply_stored_output_configs(void);

/**
 * store_output_config stores a new output config. An output may be matched by
 * three different config types, in order of precedence: Identifier, name and
 * wildcard. When storing a config type of lower precedence, assume that the
 * user wants the config to take immediate effect by superseding (clearing) the
 * same values from higher presedence configuration.
 */
void store_output_config(struct output_config *oc);

struct output_config *find_output_config(struct sway_output *output);

void free_output_config(struct output_config *oc);

void request_modeset(void);
void force_modeset(void);
bool modeset_is_pending(void);

bool spawn_swaybg(void);

int workspace_output_cmp_workspace(const void *a, const void *b);

void free_sway_binding(struct sway_binding *sb);

void free_switch_binding(struct sway_switch_binding *binding);

void free_gesture_binding(struct sway_gesture_binding *binding);

void seat_execute_command(struct sway_seat *seat, struct sway_binding *binding);

void load_swaybar(struct bar_config *bar);

void load_swaybars(void);

struct bar_config *default_bar_config(void);

void free_bar_config(struct bar_config *bar);

void free_bar_binding(struct bar_binding *binding);

void free_workspace_config(struct workspace_config *wsc);

/**
 * Updates the value of config->font_height based on the metrics for title's
 * font as reported by pango.
 *
 * If the height has changed, all containers will be rearranged to take on the
 * new size.
 */
void config_update_font_height(void);

/**
 * Convert bindsym into bindcode using the first configured layout.
 * Return false in case the conversion is unsuccessful.
 */
bool translate_binding(struct sway_binding *binding);

void translate_keysyms(struct input_config *input_config);

void binding_add_translated(struct sway_binding *binding, list_t *bindings);

/* Global config singleton. */
extern struct sway_config *config;

#endif


================================================
FILE: include/sway/criteria.h
================================================
#ifndef _SWAY_CRITERIA_H
#define _SWAY_CRITERIA_H

#define PCRE2_CODE_UNIT_WIDTH 8
#include <pcre2.h>
#include "config.h"
#include "list.h"
#include "tree/view.h"

#if WLR_HAS_XWAYLAND
#include "sway/xwayland.h"
#endif

enum criteria_type {
	CT_COMMAND                 = 1 << 0,
	CT_ASSIGN_OUTPUT           = 1 << 1,
	CT_ASSIGN_WORKSPACE        = 1 << 2,
	CT_ASSIGN_WORKSPACE_NUMBER = 1 << 3,
	CT_NO_FOCUS                = 1 << 4,
};

enum pattern_type {
	PATTERN_PCRE2,
	PATTERN_FOCUSED,
};

struct pattern {
	enum pattern_type match_type;
	pcre2_code *regex;
};

struct criteria {
	enum criteria_type type;
	char *raw; // entire criteria string (for logging)
	char *cmdlist;
	char *target; // workspace or output name for `assign` criteria

	struct pattern *title;
	struct pattern *shell;
	struct pattern *app_id;
	struct pattern *con_mark;
	uint32_t con_id; // internal ID
#if WLR_HAS_XWAYLAND
	struct pattern *class;
	uint32_t id; // X11 window ID
	struct pattern *instance;
	struct pattern *window_role;
	enum atom_name window_type;
#endif
	bool all;
	bool floating;
	bool tiling;
	char urgent; // 'l' for latest or 'o' for oldest
	struct pattern *workspace;
	pid_t pid;
	struct pattern *sandbox_engine;
	struct pattern *sandbox_app_id;
	struct pattern *sandbox_instance_id;
	struct pattern *tag;
};

bool criteria_is_empty(struct criteria *criteria);
bool criteria_is_equal(struct criteria *left, struct criteria *right);

bool criteria_already_exists(struct criteria *criteria);

void criteria_destroy(struct criteria *criteria);

/**
 * Generate a criteria struct from a raw criteria string such as
 * [class="foo" instance="bar"] (brackets inclusive).
 *
 * The error argument is expected to be an address of a null pointer. If an
 * error is encountered, the function will return NULL and the pointer will be
 * changed to point to the error string. This string should be freed afterwards.
 */
struct criteria *criteria_parse(char *raw, char **error);

/**
 * Compile a list of criterias matching the given view.
 *
 * Criteria types can be bitwise ORed.
 */
list_t *criteria_for_view(struct sway_view *view, enum criteria_type types);

/**
 * Compile a list of containers matching the given criteria.
 */
list_t *criteria_get_containers(struct criteria *criteria);

#endif


================================================
FILE: include/sway/decoration.h
================================================
#ifndef _SWAY_DECORATION_H
#define _SWAY_DECORATION_H

#include <wlr/types/wlr_server_decoration.h>

struct sway_server_decoration {
	struct wlr_server_decoration *wlr_server_decoration;
	struct wl_list link;

	struct wl_listener destroy;
	struct wl_listener mode;
};

struct sway_server_decoration *decoration_from_surface(
	struct wlr_surface *surface);

#endif


================================================
FILE: include/sway/desktop/idle_inhibit_v1.h
================================================
#ifndef _SWAY_DESKTOP_IDLE_INHIBIT_V1_H
#define _SWAY_DESKTOP_IDLE_INHIBIT_V1_H
#include <wlr/types/wlr_idle_inhibit_v1.h>

enum sway_idle_inhibit_mode {
	INHIBIT_IDLE_APPLICATION,  // Application set inhibitor (when visible)
	INHIBIT_IDLE_FOCUS,  // User set inhibitor when focused
	INHIBIT_IDLE_FULLSCREEN,  // User set inhibitor when fullscreen + visible
	INHIBIT_IDLE_OPEN,  // User set inhibitor while open
	INHIBIT_IDLE_VISIBLE  // User set inhibitor when visible
};

struct sway_idle_inhibit_manager_v1 {
	struct wlr_idle_inhibit_manager_v1 *wlr_manager;
	struct wl_listener new_idle_inhibitor_v1;
	struct wl_listener manager_destroy;
	struct wl_list inhibitors;
};

struct sway_idle_inhibitor_v1 {
	struct wlr_idle_inhibitor_v1 *wlr_inhibitor;
	struct sway_view *view;
	enum sway_idle_inhibit_mode mode;

	struct wl_list link;
	struct wl_listener destroy;
};

bool sway_idle_inhibit_v1_is_active(
	struct sway_idle_inhibitor_v1 *inhibitor);

void sway_idle_inhibit_v1_check_active(void);

void sway_idle_inhibit_v1_user_inhibitor_register(struct sway_view *view,
		enum sway_idle_inhibit_mode mode);

struct sway_idle_inhibitor_v1 *sway_idle_inhibit_v1_user_inhibitor_for_view(
		struct sway_view *view);

struct sway_idle_inhibitor_v1 *sway_idle_inhibit_v1_application_inhibitor_for_view(
		struct sway_view *view);

void sway_idle_inhibit_v1_user_inhibitor_destroy(
		struct sway_idle_inhibitor_v1 *inhibitor);

bool sway_idle_inhibit_manager_v1_init(void);

#endif


================================================
FILE: include/sway/desktop/launcher.h
================================================
#ifndef _SWAY_LAUNCHER_H
#define _SWAY_LAUNCHER_H

#include <stdlib.h>
#include <wayland-server-core.h>
#include "sway/input/seat.h"

struct launcher_ctx {
	pid_t pid;
	char *fallback_name;
	struct wlr_xdg_activation_token_v1 *token;
	struct wl_listener token_destroy;
	struct sway_seat *seat;
	struct wl_listener seat_destroy;

	bool activated;
	bool had_focused_surface;

	struct sway_node *node;
	struct wl_listener node_destroy;

	struct wl_list link; // sway_server::pending_launcher_ctxs
};

struct launcher_ctx *launcher_ctx_find_pid(pid_t pid);

struct sway_workspace *launcher_ctx_get_workspace(struct launcher_ctx *ctx);

void launcher_ctx_consume(struct launcher_ctx *ctx);

void launcher_ctx_destroy(struct launcher_ctx *ctx);

struct launcher_ctx *launcher_ctx_create_internal(void);

struct launcher_ctx *launcher_ctx_create(
	struct wlr_xdg_activation_token_v1 *token, struct sway_node *node);

const char *launcher_ctx_get_token_name(struct launcher_ctx *ctx);

#endif


================================================
FILE: include/sway/desktop/transaction.h
================================================
#ifndef _SWAY_TRANSACTION_H
#define _SWAY_TRANSACTION_H
#include <stdint.h>
#include <stdbool.h>
#include <wlr/types/wlr_scene.h>

/**
 * Transactions enable us to perform atomic layout updates.
 *
 * A transaction contains a list of containers and their new state.
 * A state might contain a new size, or new border settings, or new parent/child
 * relationships.
 *
 * Committing a transaction makes sway notify of all the affected clients with
 * their new sizes. We then wait for all the views to respond with their new
 * surface sizes. When all are ready, or when a timeout has passed, we apply the
 * updates all at the same time.
 *
 * When we want to make adjustments to the layout, we change the pending state
 * in containers, mark them as dirty and call transaction_commit_dirty(). This
 * create and commits a transaction from the dirty containers.
 */

struct sway_transaction_instruction;
struct sway_view;

/**
 * Find all dirty containers, create and commit a transaction containing them,
 * and unmark them as dirty.
 */
void transaction_commit_dirty(void);

/*
 * Same as transaction_commit_dirty, but signalling that this is a
 * client-initiated change has already taken effect.
 */
void transaction_commit_dirty_client(void);

/**
 * Notify the transaction system that a view is ready for the new layout.
 *
 * When all views in the transaction are ready, the layout will be applied.
 *
 * A success boolean is returned denoting that this part of the transaction is
 * ready.
 */
bool transaction_notify_view_ready_by_serial(struct sway_view *view,
		uint32_t serial);

/**
 * Notify the transaction system that a view is ready for the new layout, but
 * identifying the instruction by geometry rather than by serial.
 *
 * This is used by xwayland views, as they don't have serials.
 *
 * A success boolean is returned denoting that this part of the transaction is
 * ready.
 */
bool transaction_notify_view_ready_by_geometry(struct sway_view *view,
		double x, double y, int width, int height);

void arrange_popups(struct wlr_scene_tree *popups);

#endif


================================================
FILE: include/sway/input/cursor.h
================================================
#ifndef _SWAY_INPUT_CURSOR_H
#define _SWAY_INPUT_CURSOR_H
#
Download .txt
gitextract_b61p9gre/

├── .builds/
│   ├── alpine.yml
│   ├── archlinux.yml
│   └── freebsd.yml
├── .editorconfig
├── .github/
│   └── ISSUE_TEMPLATE/
│       ├── bug_report.md
│       ├── config.yml
│       ├── enhancement.md
│       └── i3_compat.md
├── .gitignore
├── .mailmap
├── CONTRIBUTING.md
├── LICENSE
├── README.ar.md
├── README.az.md
├── README.cs.md
├── README.de.md
├── README.dk.md
├── README.es.md
├── README.fr.md
├── README.ge.md
├── README.gr.md
├── README.hi.md
├── README.hu.md
├── README.ir.md
├── README.it.md
├── README.ja.md
├── README.ko.md
├── README.md
├── README.nl.md
├── README.no.md
├── README.pl.md
├── README.pt.md
├── README.ro.md
├── README.ru.md
├── README.sr.md
├── README.sv.md
├── README.tr.md
├── README.uk.md
├── README.zh-CN.md
├── README.zh-TW.md
├── assets/
│   └── LICENSE
├── client/
│   ├── meson.build
│   └── pool-buffer.c
├── common/
│   ├── cairo.c
│   ├── gesture.c
│   ├── ipc-client.c
│   ├── list.c
│   ├── log.c
│   ├── loop.c
│   ├── meson.build
│   ├── pango.c
│   ├── stringop.c
│   └── util.c
├── completions/
│   ├── bash/
│   │   ├── sway
│   │   ├── swaybar
│   │   └── swaymsg
│   ├── fish/
│   │   ├── sway.fish
│   │   ├── swaymsg.fish
│   │   └── swaynag.fish
│   ├── meson.build
│   └── zsh/
│       ├── _sway
│       ├── _swaybar
│       └── _swaymsg
├── config.in
├── include/
│   ├── cairo_util.h
│   ├── gesture.h
│   ├── ipc-client.h
│   ├── ipc.h
│   ├── list.h
│   ├── log.h
│   ├── loop.h
│   ├── meson.build
│   ├── pango.h
│   ├── pool-buffer.h
│   ├── stringop.h
│   ├── sway/
│   │   ├── commands.h
│   │   ├── config.h
│   │   ├── criteria.h
│   │   ├── decoration.h
│   │   ├── desktop/
│   │   │   ├── idle_inhibit_v1.h
│   │   │   ├── launcher.h
│   │   │   └── transaction.h
│   │   ├── input/
│   │   │   ├── cursor.h
│   │   │   ├── input-manager.h
│   │   │   ├── keyboard.h
│   │   │   ├── libinput.h
│   │   │   ├── seat.h
│   │   │   ├── switch.h
│   │   │   ├── tablet.h
│   │   │   ├── text_input.h
│   │   │   └── text_input_popup.h
│   │   ├── ipc-json.h
│   │   ├── ipc-server.h
│   │   ├── layers.h
│   │   ├── lock.h
│   │   ├── output.h
│   │   ├── scene_descriptor.h
│   │   ├── server.h
│   │   ├── sway_text_node.h
│   │   ├── swaynag.h
│   │   ├── tree/
│   │   │   ├── arrange.h
│   │   │   ├── container.h
│   │   │   ├── node.h
│   │   │   ├── root.h
│   │   │   ├── view.h
│   │   │   └── workspace.h
│   │   ├── xdg_decoration.h
│   │   └── xwayland.h
│   ├── swaybar/
│   │   ├── bar.h
│   │   ├── config.h
│   │   ├── i3bar.h
│   │   ├── image.h
│   │   ├── input.h
│   │   ├── ipc.h
│   │   ├── render.h
│   │   ├── status_line.h
│   │   └── tray/
│   │       ├── host.h
│   │       ├── icon.h
│   │       ├── item.h
│   │       ├── tray.h
│   │       └── watcher.h
│   ├── swaynag/
│   │   ├── config.h
│   │   ├── render.h
│   │   ├── swaynag.h
│   │   └── types.h
│   └── util.h
├── meson.build
├── meson_options.txt
├── protocols/
│   ├── meson.build
│   ├── wlr-layer-shell-unstable-v1.xml
│   └── wlr-output-power-management-unstable-v1.xml
├── release.sh
├── sway/
│   ├── commands/
│   │   ├── allow_tearing.c
│   │   ├── assign.c
│   │   ├── bar/
│   │   │   ├── bind.c
│   │   │   ├── binding_mode_indicator.c
│   │   │   ├── colors.c
│   │   │   ├── font.c
│   │   │   ├── gaps.c
│   │   │   ├── height.c
│   │   │   ├── hidden_state.c
│   │   │   ├── icon_theme.c
│   │   │   ├── id.c
│   │   │   ├── mode.c
│   │   │   ├── modifier.c
│   │   │   ├── output.c
│   │   │   ├── pango_markup.c
│   │   │   ├── position.c
│   │   │   ├── separator_symbol.c
│   │   │   ├── status_command.c
│   │   │   ├── status_edge_padding.c
│   │   │   ├── status_padding.c
│   │   │   ├── strip_workspace_name.c
│   │   │   ├── strip_workspace_numbers.c
│   │   │   ├── swaybar_command.c
│   │   │   ├── tray_bind.c
│   │   │   ├── tray_output.c
│   │   │   ├── tray_padding.c
│   │   │   ├── workspace_buttons.c
│   │   │   ├── workspace_min_width.c
│   │   │   └── wrap_scroll.c
│   │   ├── bar.c
│   │   ├── bind.c
│   │   ├── border.c
│   │   ├── client.c
│   │   ├── create_output.c
│   │   ├── default_border.c
│   │   ├── default_floating_border.c
│   │   ├── default_orientation.c
│   │   ├── exec.c
│   │   ├── exec_always.c
│   │   ├── exit.c
│   │   ├── floating.c
│   │   ├── floating_minmax_size.c
│   │   ├── floating_modifier.c
│   │   ├── focus.c
│   │   ├── focus_follows_mouse.c
│   │   ├── focus_on_window_activation.c
│   │   ├── focus_wrapping.c
│   │   ├── font.c
│   │   ├── for_window.c
│   │   ├── force_display_urgency_hint.c
│   │   ├── force_focus_wrapping.c
│   │   ├── fullscreen.c
│   │   ├── gaps.c
│   │   ├── gesture.c
│   │   ├── hide_edge_borders.c
│   │   ├── include.c
│   │   ├── inhibit_idle.c
│   │   ├── input/
│   │   │   ├── accel_profile.c
│   │   │   ├── calibration_matrix.c
│   │   │   ├── click_method.c
│   │   │   ├── clickfinger_button_map.c
│   │   │   ├── drag.c
│   │   │   ├── drag_lock.c
│   │   │   ├── dwt.c
│   │   │   ├── dwtp.c
│   │   │   ├── events.c
│   │   │   ├── left_handed.c
│   │   │   ├── map_from_region.c
│   │   │   ├── map_to_output.c
│   │   │   ├── map_to_region.c
│   │   │   ├── middle_emulation.c
│   │   │   ├── natural_scroll.c
│   │   │   ├── pointer_accel.c
│   │   │   ├── repeat_delay.c
│   │   │   ├── repeat_rate.c
│   │   │   ├── rotation_angle.c
│   │   │   ├── scroll_button.c
│   │   │   ├── scroll_button_lock.c
│   │   │   ├── scroll_factor.c
│   │   │   ├── scroll_method.c
│   │   │   ├── tap.c
│   │   │   ├── tap_button_map.c
│   │   │   ├── tool_mode.c
│   │   │   ├── xkb_capslock.c
│   │   │   ├── xkb_file.c
│   │   │   ├── xkb_layout.c
│   │   │   ├── xkb_model.c
│   │   │   ├── xkb_numlock.c
│   │   │   ├── xkb_options.c
│   │   │   ├── xkb_rules.c
│   │   │   ├── xkb_switch_layout.c
│   │   │   └── xkb_variant.c
│   │   ├── input.c
│   │   ├── kill.c
│   │   ├── layout.c
│   │   ├── mark.c
│   │   ├── max_render_time.c
│   │   ├── mode.c
│   │   ├── mouse_warping.c
│   │   ├── move.c
│   │   ├── new_float.c
│   │   ├── new_window.c
│   │   ├── no_focus.c
│   │   ├── nop.c
│   │   ├── opacity.c
│   │   ├── output/
│   │   │   ├── adaptive_sync.c
│   │   │   ├── allow_tearing.c
│   │   │   ├── background.c
│   │   │   ├── color_profile.c
│   │   │   ├── disable.c
│   │   │   ├── dpms.c
│   │   │   ├── enable.c
│   │   │   ├── hdr.c
│   │   │   ├── max_render_time.c
│   │   │   ├── mode.c
│   │   │   ├── position.c
│   │   │   ├── power.c
│   │   │   ├── render_bit_depth.c
│   │   │   ├── scale.c
│   │   │   ├── scale_filter.c
│   │   │   ├── subpixel.c
│   │   │   ├── toggle.c
│   │   │   ├── transform.c
│   │   │   └── unplug.c
│   │   ├── output.c
│   │   ├── popup_during_fullscreen.c
│   │   ├── primary_selection.c
│   │   ├── reload.c
│   │   ├── rename.c
│   │   ├── resize.c
│   │   ├── scratchpad.c
│   │   ├── seat/
│   │   │   ├── attach.c
│   │   │   ├── cursor.c
│   │   │   ├── fallback.c
│   │   │   ├── hide_cursor.c
│   │   │   ├── idle.c
│   │   │   ├── keyboard_grouping.c
│   │   │   ├── pointer_constraint.c
│   │   │   ├── shortcuts_inhibitor.c
│   │   │   └── xcursor_theme.c
│   │   ├── seat.c
│   │   ├── set.c
│   │   ├── shortcuts_inhibitor.c
│   │   ├── show_marks.c
│   │   ├── smart_borders.c
│   │   ├── smart_gaps.c
│   │   ├── split.c
│   │   ├── sticky.c
│   │   ├── swap.c
│   │   ├── swaybg_command.c
│   │   ├── swaynag_command.c
│   │   ├── tiling_drag.c
│   │   ├── tiling_drag_threshold.c
│   │   ├── title_align.c
│   │   ├── title_format.c
│   │   ├── titlebar_border_thickness.c
│   │   ├── titlebar_padding.c
│   │   ├── unmark.c
│   │   ├── urgent.c
│   │   ├── workspace.c
│   │   ├── workspace_layout.c
│   │   ├── ws_auto_back_and_forth.c
│   │   └── xwayland.c
│   ├── commands.c
│   ├── config/
│   │   ├── bar.c
│   │   ├── input.c
│   │   ├── output.c
│   │   └── seat.c
│   ├── config.c
│   ├── criteria.c
│   ├── decoration.c
│   ├── desktop/
│   │   ├── idle_inhibit_v1.c
│   │   ├── launcher.c
│   │   ├── layer_shell.c
│   │   ├── output.c
│   │   ├── tearing.c
│   │   ├── transaction.c
│   │   ├── xdg_shell.c
│   │   └── xwayland.c
│   ├── input/
│   │   ├── cursor.c
│   │   ├── input-manager.c
│   │   ├── keyboard.c
│   │   ├── libinput.c
│   │   ├── seat.c
│   │   ├── seatop_default.c
│   │   ├── seatop_down.c
│   │   ├── seatop_move_floating.c
│   │   ├── seatop_move_tiling.c
│   │   ├── seatop_resize_floating.c
│   │   ├── seatop_resize_tiling.c
│   │   ├── switch.c
│   │   ├── tablet.c
│   │   └── text_input.c
│   ├── ipc-json.c
│   ├── ipc-server.c
│   ├── lock.c
│   ├── main.c
│   ├── meson.build
│   ├── realtime.c
│   ├── scene_descriptor.c
│   ├── server.c
│   ├── sway-bar.5.scd
│   ├── sway-input.5.scd
│   ├── sway-ipc.7.scd
│   ├── sway-output.5.scd
│   ├── sway.1.scd
│   ├── sway.5.scd
│   ├── sway_text_node.c
│   ├── swaynag.c
│   ├── tree/
│   │   ├── arrange.c
│   │   ├── container.c
│   │   ├── node.c
│   │   ├── output.c
│   │   ├── root.c
│   │   ├── view.c
│   │   └── workspace.c
│   ├── xdg_activation_v1.c
│   └── xdg_decoration.c
├── sway.desktop
├── swaybar/
│   ├── bar.c
│   ├── config.c
│   ├── i3bar.c
│   ├── image.c
│   ├── input.c
│   ├── ipc.c
│   ├── main.c
│   ├── meson.build
│   ├── render.c
│   ├── status_line.c
│   ├── swaybar-protocol.7.scd
│   └── tray/
│       ├── host.c
│       ├── icon.c
│       ├── item.c
│       ├── tray.c
│       └── watcher.c
├── swaymsg/
│   ├── main.c
│   ├── meson.build
│   └── swaymsg.1.scd
└── swaynag/
    ├── config.c
    ├── main.c
    ├── meson.build
    ├── render.c
    ├── swaynag.1.scd
    ├── swaynag.5.scd
    ├── swaynag.c
    └── types.c
Download .txt
Showing preview only (280K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3751 symbols across 298 files)

FILE: client/pool-buffer.c
  function anonymous_shm_open (line 17) | static int anonymous_shm_open(void) {
  function buffer_release (line 42) | static void buffer_release(void *data, struct wl_buffer *wl_buffer) {
  type wl_buffer_listener (line 47) | struct wl_buffer_listener
  type pool_buffer (line 51) | struct pool_buffer
  type wl_shm (line 51) | struct wl_shm
  type pool_buffer (line 52) | struct pool_buffer
  type wl_shm_pool (line 66) | struct wl_shm_pool
  function destroy_buffer (line 85) | void destroy_buffer(struct pool_buffer *buffer) {
  type pool_buffer (line 104) | struct pool_buffer
  type wl_shm (line 104) | struct wl_shm
  type pool_buffer (line 105) | struct pool_buffer
  type pool_buffer (line 106) | struct pool_buffer

FILE: common/cairo.c
  function cairo_set_source_u32 (line 5) | void cairo_set_source_u32(cairo_t *cairo, uint32_t color) {
  function cairo_subpixel_order_t (line 13) | cairo_subpixel_order_t to_cairo_subpixel_order(enum wl_output_subpixel s...
  function cairo_surface_t (line 29) | cairo_surface_t *cairo_image_surface_scale(cairo_surface_t *image,

FILE: common/gesture.c
  type gesture (line 14) | struct gesture
  type gesture_type (line 92) | enum gesture_type
  type gesture_direction (line 107) | enum gesture_direction
  type gesture (line 162) | struct gesture
  function gesture_check (line 171) | bool gesture_check(struct gesture *target, enum gesture_type type, uint8...
  function gesture_match (line 185) | bool gesture_match(struct gesture *target, struct gesture *to_match, boo...
  function gesture_equal (line 200) | bool gesture_equal(struct gesture *a, struct gesture *b) {
  function gesture_directions_count (line 207) | static uint8_t gesture_directions_count(uint32_t directions) {
  function gesture_directions_compare (line 216) | static int8_t gesture_directions_compare(uint32_t a, uint32_t b) {
  function gesture_compare (line 221) | int8_t gesture_compare(struct gesture *a, struct gesture *b) {
  function gesture_tracker_begin (line 225) | void gesture_tracker_begin(struct gesture_tracker *tracker,
  function gesture_tracker_check (line 239) | bool gesture_tracker_check(struct gesture_tracker *tracker, enum gesture...
  function gesture_tracker_update (line 243) | void gesture_tracker_update(struct gesture_tracker *tracker,
  function gesture_tracker_cancel (line 265) | void gesture_tracker_cancel(struct gesture_tracker *tracker) {
  type gesture (line 272) | struct gesture
  type gesture_tracker (line 272) | struct gesture_tracker
  type gesture (line 273) | struct gesture
  type gesture (line 273) | struct gesture

FILE: common/ipc-client.c
  function ipc_open_socket (line 55) | int ipc_open_socket(const char *socket_path) {
  function ipc_set_recv_timeout (line 71) | bool ipc_set_recv_timeout(int socketfd, struct timeval tv) {
  type ipc_response (line 79) | struct ipc_response
  type ipc_response (line 91) | struct ipc_response
  type ipc_response (line 91) | struct ipc_response
  function free_ipc_response (line 123) | void free_ipc_response(struct ipc_response *response) {
  type ipc_response (line 142) | struct ipc_response

FILE: common/list.c
  function list_t (line 7) | list_t *create_list(void) {
  function list_resize (line 18) | static void list_resize(list_t *list) {
  function list_free (line 25) | void list_free(list_t *list) {
  function list_add (line 33) | void list_add(list_t *list, void *item) {
  function list_insert (line 38) | void list_insert(list_t *list, int index, void *item) {
  function list_del (line 45) | void list_del(list_t *list, int index) {
  function list_cat (line 50) | void list_cat(list_t *list, list_t *source) {
  function list_qsort (line 56) | void list_qsort(list_t *list, int compare(const void *left, const void *...
  function list_seq_find (line 60) | int list_seq_find(list_t *list, int compare(const void *item, const void...
  function list_find (line 70) | int list_find(list_t *list, const void *item) {
  function list_swap (line 79) | void list_swap(list_t *list, int src, int dest) {
  function list_move_to_end (line 85) | void list_move_to_end(list_t *list, void *item) {
  function list_rotate (line 99) | static void list_rotate(list_t *list, int from, int to) {
  function list_inplace_merge (line 110) | static void list_inplace_merge(list_t *list, int left, int last, int mid...
  function list_inplace_sort (line 129) | static void list_inplace_sort(list_t *list, int first, int last, int com...
  function list_stable_sort (line 144) | void list_stable_sort(list_t *list, int compare(const void *a, const voi...
  function list_free_items_and_destroy (line 150) | void list_free_items_and_destroy(list_t *list) {

FILE: common/log.c
  function _sway_abort (line 11) | void _sway_abort(const char *format, ...) {
  function _sway_assert (line 19) | bool _sway_assert(bool condition, const char *format, ...) {
  type timespec (line 38) | struct timespec
  function timespec_sub (line 54) | static void timespec_sub(struct timespec *r, const struct timespec *a,
  function init_start_time (line 65) | static void init_start_time(void) {
  function sway_log_stderr (line 72) | static void sway_log_stderr(sway_log_importance_t verbosity, const char ...
  function sway_log_init (line 105) | void sway_log_init(sway_log_importance_t verbosity, terminate_callback_t...
  function _sway_vlog (line 116) | void _sway_vlog(sway_log_importance_t verbosity, const char *fmt, va_lis...
  function _sway_log (line 120) | void _sway_log(sway_log_importance_t verbosity, const char *fmt, ...) {

FILE: common/loop.c
  type loop_fd_event (line 13) | struct loop_fd_event {
  type loop_timer (line 18) | struct loop_timer {
  type loop (line 24) | struct loop {
  type loop (line 33) | struct loop
  type loop (line 34) | struct loop
  type loop (line 34) | struct loop
  type pollfd (line 40) | struct pollfd
  function loop_destroy (line 46) | void loop_destroy(struct loop *loop) {
  function loop_poll (line 53) | void loop_poll(struct loop *loop) {
  function loop_add_fd (line 105) | void loop_add_fd(struct loop *loop, int fd, short mask,
  type loop_timer (line 133) | struct loop_timer
  type loop (line 133) | struct loop
  type loop_timer (line 135) | struct loop_timer
  type loop_timer (line 135) | struct loop_timer
  function loop_remove_fd (line 158) | bool loop_remove_fd(struct loop *loop, int fd) {
  function loop_remove_timer (line 174) | bool loop_remove_timer(struct loop *loop, struct loop_timer *timer) {

FILE: common/pango.c
  function escape_markup_text (line 13) | size_t escape_markup_text(const char *src, char *dest) {
  function PangoLayout (line 53) | PangoLayout *get_pango_layout(cairo_t *cairo, const PangoFontDescription...
  function get_text_size (line 85) | void get_text_size(cairo_t *cairo, const PangoFontDescription *desc, int...
  function get_text_metrics (line 125) | void get_text_metrics(const PangoFontDescription *description, int *heig...
  function render_text (line 140) | void render_text(cairo_t *cairo, const PangoFontDescription *desc,

FILE: common/stringop.c
  function strip_whitespace (line 15) | void strip_whitespace(char *str) {
  function strip_quotes (line 26) | void strip_quotes(char *str) {
  function lenient_strcmp (line 67) | int lenient_strcmp(const char *a, const char *b) {
  function list_t (line 79) | list_t *split_string(const char *str, const char *delims) {
  function free_argv (line 145) | void free_argv(int argc, char **argv) {
  function unescape_string (line 152) | int unescape_string(char *string) {
  function expand_path (line 314) | bool expand_path(char **path) {
  function has_prefix (line 364) | bool has_prefix(const char *str, const char *prefix) {

FILE: common/util.c
  function wrap (line 12) | int wrap(int i, int max) {
  function parse_color (line 16) | bool parse_color(const char *color, uint32_t *result) {
  function color_to_rgba (line 33) | void color_to_rgba(float dest[static 4], uint32_t color) {
  function parse_boolean (line 40) | bool parse_boolean(const char *boolean, bool current) {
  function parse_float (line 56) | float parse_float(const char *value) {
  function parse_movement_unit (line 67) | enum movement_unit parse_movement_unit(const char *unit) {
  function parse_movement_amount (line 80) | int parse_movement_amount(int argc, char **argv,
  type wl_output_subpixel (line 108) | enum wl_output_subpixel
  function sway_set_cloexec (line 127) | bool sway_set_cloexec(int fd, bool cloexec) {
  function get_current_time_in_msec (line 145) | uint32_t get_current_time_in_msec(void) {

FILE: include/cairo_util.h
  type wl_output_subpixel (line 9) | enum wl_output_subpixel

FILE: include/gesture.h
  type gesture_type (line 10) | enum gesture_type {
  type gesture_type (line 18) | enum gesture_type
  type gesture_direction (line 26) | enum gesture_direction {
  type gesture_direction (line 42) | enum gesture_direction
  type gesture (line 47) | struct gesture {
  type gesture (line 58) | struct gesture
  type gesture (line 61) | struct gesture
  type gesture (line 64) | struct gesture
  type gesture_type (line 65) | enum gesture_type
  type gesture (line 68) | struct gesture
  type gesture (line 69) | struct gesture
  type gesture (line 72) | struct gesture
  type gesture (line 72) | struct gesture
  type gesture (line 75) | struct gesture
  type gesture (line 75) | struct gesture
  type gesture_tracker (line 78) | struct gesture_tracker {
  type gesture_tracker (line 87) | struct gesture_tracker
  type gesture_type (line 88) | enum gesture_type
  type gesture_tracker (line 91) | struct gesture_tracker
  type gesture_type (line 92) | enum gesture_type
  type gesture_tracker (line 95) | struct gesture_tracker
  type gesture_tracker (line 99) | struct gesture_tracker
  type gesture (line 102) | struct gesture
  type gesture_tracker (line 102) | struct gesture_tracker

FILE: include/ipc-client.h
  type ipc_response (line 17) | struct ipc_response {
  type ipc_response (line 39) | struct ipc_response
  type ipc_response (line 43) | struct ipc_response
  type timeval (line 47) | struct timeval

FILE: include/ipc.h
  type ipc_command_type (line 6) | enum ipc_command_type {

FILE: include/list.h
  type list_t (line 4) | typedef struct {

FILE: include/log.h
  type sway_log_importance_t (line 9) | typedef enum {

FILE: include/loop.h
  type loop (line 12) | struct loop
  type loop_timer (line 13) | struct loop_timer
  type loop (line 18) | struct loop
  type loop (line 23) | struct loop
  type loop (line 28) | struct loop
  type loop (line 33) | struct loop
  type loop_timer (line 41) | struct loop_timer
  type loop (line 41) | struct loop
  type loop (line 47) | struct loop
  type loop (line 52) | struct loop
  type loop_timer (line 52) | struct loop_timer

FILE: include/pool-buffer.h
  type pool_buffer (line 9) | struct pool_buffer {
  type pool_buffer (line 20) | struct pool_buffer
  type wl_shm (line 20) | struct wl_shm
  type pool_buffer (line 21) | struct pool_buffer
  type pool_buffer (line 22) | struct pool_buffer

FILE: include/sway/commands.h
  type sway_container (line 8) | struct sway_container
  type cmd_results (line 10) | struct cmd_results
  type cmd_handler (line 12) | struct cmd_handler {
  type cmd_status (line 20) | enum cmd_status {
  type cmd_results (line 33) | struct cmd_results {
  type expected_args (line 41) | enum expected_args {
  type cmd_results (line 47) | struct cmd_results
  type expected_args (line 48) | enum expected_args
  type cmd_handler (line 50) | struct cmd_handler
  type cmd_handler (line 51) | struct cmd_handler
  type sway_seat (line 60) | struct sway_seat
  type sway_container (line 61) | struct sway_container
  type cmd_results (line 67) | struct cmd_results
  type cmd_results (line 71) | struct cmd_results
  type cmd_handler (line 72) | struct cmd_handler
  type cmd_results (line 76) | struct cmd_results
  type cmd_results (line 80) | struct cmd_results
  type cmd_status (line 80) | enum cmd_status
  type cmd_results (line 84) | struct cmd_results
  type sway_container (line 95) | struct sway_container
  type sway_container (line 98) | struct sway_container
  type sway_container (line 98) | struct sway_container

FILE: include/sway/config.h
  type sway_variable (line 29) | struct sway_variable {
  type binding_input_type (line 34) | enum binding_input_type {
  type binding_flags (line 43) | enum binding_flags {
  type sway_binding (line 59) | struct sway_binding {
  type sway_switch_trigger (line 71) | enum sway_switch_trigger {
  type sway_switch_binding (line 80) | struct sway_switch_binding {
  type sway_gesture_binding (line 90) | struct sway_gesture_binding {
  type sway_fowa (line 100) | enum sway_fowa {
  type sway_mode (line 110) | struct sway_mode {
  type input_config_mapped_from_region (line 120) | struct input_config_mapped_from_region {
  type calibration_matrix (line 126) | struct calibration_matrix {
  type input_config_mapped_to (line 131) | enum input_config_mapped_to {
  type input_config_tool (line 137) | struct input_config_tool {
  type input_config (line 145) | struct input_config {
  type seat_attachment_config (line 199) | struct seat_attachment_config {
  type seat_config_hide_cursor_when_typing (line 204) | enum seat_config_hide_cursor_when_typing {
  type seat_config_allow_constrain (line 210) | enum seat_config_allow_constrain {
  type seat_config_shortcuts_inhibit (line 216) | enum seat_config_shortcuts_inhibit {
  type seat_keyboard_grouping (line 222) | enum seat_keyboard_grouping {
  type sway_input_idle_source (line 228) | enum sway_input_idle_source {
  type seat_config (line 240) | struct seat_config {
  type scale_filter_mode (line 256) | enum scale_filter_mode {
  type render_bit_depth (line 263) | enum render_bit_depth {
  type color_profile (line 270) | enum color_profile {
  type output_config (line 281) | struct output_config {
  type side_gaps (line 310) | struct side_gaps {
  type smart_gaps_mode (line 317) | enum smart_gaps_mode {
  type workspace_config (line 327) | struct workspace_config {
  type pango_markup_config (line 334) | enum pango_markup_config {
  type bar_config (line 340) | struct bar_config {
  type bar_binding (line 417) | struct bar_binding {
  type tray_binding (line 424) | struct tray_binding {
  type border_colors (line 431) | struct border_colors {
  type edge_border_types (line 439) | enum edge_border_types {
  type edge_border_smart_types (line 446) | enum edge_border_smart_types {
  type sway_popup_during_fullscreen (line 452) | enum sway_popup_during_fullscreen {
  type focus_follows_mouse_mode (line 458) | enum focus_follows_mouse_mode {
  type focus_wrapping_mode (line 464) | enum focus_wrapping_mode {
  type mouse_warping_mode (line 471) | enum mouse_warping_mode {
  type alignment (line 477) | enum alignment {
  type xwayland_mode (line 483) | enum xwayland_mode {
  type sway_config (line 492) | struct sway_config {
  type sway_config (line 621) | struct sway_config
  type swaynag_instance (line 622) | struct swaynag_instance
  type sway_config (line 627) | struct sway_config
  type swaynag_instance (line 628) | struct swaynag_instance
  type sway_config (line 648) | struct sway_config
  type sway_variable (line 650) | struct sway_variable
  type input_config (line 659) | struct input_config
  type input_config (line 661) | struct input_config
  type input_config (line 661) | struct input_config
  type input_config (line 663) | struct input_config
  type input_config (line 663) | struct input_config
  type input_config (line 665) | struct input_config
  type xkb_rule_names (line 666) | struct xkb_rule_names
  type input_config (line 668) | struct input_config
  type seat_config (line 672) | struct seat_config
  type seat_config (line 674) | struct seat_config
  type seat_config (line 674) | struct seat_config
  type seat_config (line 676) | struct seat_config
  type seat_config (line 676) | struct seat_config
  type seat_config (line 678) | struct seat_config
  type seat_attachment_config (line 680) | struct seat_attachment_config
  type seat_attachment_config (line 682) | struct seat_attachment_config
  type seat_config (line 683) | struct seat_config
  type seat_config (line 685) | struct seat_config
  type seat_config (line 685) | struct seat_config
  type sway_output (line 690) | struct sway_output
  type scale_filter_mode (line 692) | enum scale_filter_mode
  type output_config (line 694) | struct output_config
  type output_config (line 696) | struct output_config
  type output_config (line 708) | struct output_config
  type output_config (line 710) | struct output_config
  type sway_output (line 710) | struct sway_output
  type output_config (line 712) | struct output_config
  type sway_binding (line 722) | struct sway_binding
  type sway_switch_binding (line 724) | struct sway_switch_binding
  type sway_gesture_binding (line 726) | struct sway_gesture_binding
  type sway_seat (line 728) | struct sway_seat
  type sway_binding (line 728) | struct sway_binding
  type bar_config (line 730) | struct bar_config
  type bar_config (line 734) | struct bar_config
  type bar_config (line 736) | struct bar_config
  type bar_binding (line 738) | struct bar_binding
  type workspace_config (line 740) | struct workspace_config
  type sway_binding (line 755) | struct sway_binding
  type input_config (line 757) | struct input_config
  type sway_binding (line 759) | struct sway_binding
  type sway_config (line 762) | struct sway_config

FILE: include/sway/criteria.h
  type criteria_type (line 14) | enum criteria_type {
  type pattern_type (line 22) | enum pattern_type {
  type pattern (line 27) | struct pattern {
  type criteria (line 32) | struct criteria {
  type criteria (line 62) | struct criteria
  type criteria (line 63) | struct criteria
  type criteria (line 63) | struct criteria
  type criteria (line 65) | struct criteria
  type criteria (line 67) | struct criteria
  type criteria (line 77) | struct criteria
  type sway_view (line 84) | struct sway_view
  type criteria_type (line 84) | enum criteria_type
  type criteria (line 89) | struct criteria

FILE: include/sway/decoration.h
  type sway_server_decoration (line 6) | struct sway_server_decoration {
  type sway_server_decoration (line 14) | struct sway_server_decoration
  type wlr_surface (line 15) | struct wlr_surface

FILE: include/sway/desktop/idle_inhibit_v1.h
  type sway_idle_inhibit_mode (line 5) | enum sway_idle_inhibit_mode {
  type sway_idle_inhibit_manager_v1 (line 13) | struct sway_idle_inhibit_manager_v1 {
  type sway_idle_inhibitor_v1 (line 20) | struct sway_idle_inhibitor_v1 {
  type sway_idle_inhibitor_v1 (line 30) | struct sway_idle_inhibitor_v1
  type sway_view (line 34) | struct sway_view
  type sway_idle_inhibit_mode (line 35) | enum sway_idle_inhibit_mode
  type sway_idle_inhibitor_v1 (line 37) | struct sway_idle_inhibitor_v1
  type sway_view (line 38) | struct sway_view
  type sway_idle_inhibitor_v1 (line 40) | struct sway_idle_inhibitor_v1
  type sway_view (line 41) | struct sway_view
  type sway_idle_inhibitor_v1 (line 44) | struct sway_idle_inhibitor_v1

FILE: include/sway/desktop/launcher.h
  type launcher_ctx (line 8) | struct launcher_ctx {
  type launcher_ctx (line 25) | struct launcher_ctx
  type sway_workspace (line 27) | struct sway_workspace
  type launcher_ctx (line 27) | struct launcher_ctx
  type launcher_ctx (line 29) | struct launcher_ctx
  type launcher_ctx (line 31) | struct launcher_ctx
  type launcher_ctx (line 33) | struct launcher_ctx
  type launcher_ctx (line 35) | struct launcher_ctx
  type wlr_xdg_activation_token_v1 (line 36) | struct wlr_xdg_activation_token_v1
  type sway_node (line 36) | struct sway_node
  type launcher_ctx (line 38) | struct launcher_ctx

FILE: include/sway/desktop/transaction.h
  type sway_transaction_instruction (line 24) | struct sway_transaction_instruction
  type sway_view (line 25) | struct sway_view
  type sway_view (line 47) | struct sway_view
  type sway_view (line 59) | struct sway_view
  type wlr_scene_tree (line 62) | struct wlr_scene_tree

FILE: include/sway/input/cursor.h
  type sway_cursor (line 18) | struct sway_cursor {
  type sway_node (line 85) | struct sway_node
  type sway_node (line 87) | struct sway_node
  type sway_seat (line 88) | struct sway_seat
  type wlr_surface (line 89) | struct wlr_surface
  type sway_cursor (line 91) | struct sway_cursor
  type sway_cursor (line 92) | struct sway_cursor
  type sway_seat (line 92) | struct sway_seat
  type sway_cursor (line 99) | struct sway_cursor
  type sway_cursor (line 101) | struct sway_cursor
  type sway_node (line 101) | struct sway_node
  type sway_cursor (line 103) | struct sway_cursor
  type sway_input_idle_source (line 104) | enum sway_input_idle_source
  type sway_cursor (line 105) | struct sway_cursor
  type wlr_input_device (line 106) | struct wlr_input_device
  type sway_cursor (line 107) | struct sway_cursor
  type sway_cursor (line 108) | struct sway_cursor
  type sway_cursor (line 109) | struct sway_cursor
  type sway_cursor (line 111) | struct sway_cursor
  type wlr_input_device (line 112) | struct wlr_input_device
  type sway_cursor (line 115) | struct sway_cursor
  type wlr_input_device (line 116) | struct wlr_input_device
  type wl_pointer_button_state (line 117) | enum wl_pointer_button_state
  type sway_cursor (line 119) | struct sway_cursor
  type wlr_pointer_axis_event (line 120) | struct wlr_pointer_axis_event
  type sway_cursor (line 122) | struct sway_cursor
  type wl_client (line 123) | struct wl_client
  type sway_cursor (line 125) | struct sway_cursor
  type wlr_surface (line 126) | struct wlr_surface
  type wl_client (line 127) | struct wl_client
  type sway_cursor (line 129) | struct sway_cursor
  type sway_container (line 130) | struct sway_container
  type sway_cursor (line 132) | struct sway_cursor
  type sway_workspace (line 133) | struct sway_workspace
  type sway_cursor (line 136) | struct sway_cursor
  type wlr_pointer_constraint_v1 (line 137) | struct wlr_pointer_constraint_v1
  type wl_listener (line 148) | struct wl_listener

FILE: include/sway/input/input-manager.h
  type sway_server (line 11) | struct sway_server
  type sway_input_device (line 13) | struct sway_input_device {
  type sway_input_manager (line 21) | struct sway_input_manager {
  type sway_input_manager (line 40) | struct sway_input_manager
  type sway_server (line 40) | struct sway_server
  type sway_input_manager (line 42) | struct sway_input_manager
  type sway_node (line 44) | struct sway_node
  type sway_node (line 46) | struct sway_node
  type input_config (line 50) | struct input_config
  type sway_input_device (line 54) | struct sway_input_device
  type seat_config (line 58) | struct seat_config
  type sway_seat (line 60) | struct sway_seat
  type sway_seat (line 62) | struct sway_seat
  type sway_seat (line 73) | struct sway_seat
  type input_config (line 75) | struct input_config
  type sway_input_device (line 75) | struct sway_input_device
  type wlr_input_device (line 77) | struct wlr_input_device
  type sway_input_device (line 79) | struct sway_input_device

FILE: include/sway/input/keyboard.h
  type sway_shortcut_state (line 29) | struct sway_shortcut_state {
  type sway_keyboard (line 51) | struct sway_keyboard {
  type sway_keyboard_group (line 74) | struct sway_keyboard_group {
  type xkb_keymap (line 84) | struct xkb_keymap
  type input_config (line 84) | struct input_config
  type sway_keyboard (line 87) | struct sway_keyboard
  type sway_seat (line 87) | struct sway_seat
  type sway_seat_device (line 88) | struct sway_seat_device
  type sway_keyboard (line 90) | struct sway_keyboard
  type sway_keyboard (line 92) | struct sway_keyboard
  type sway_keyboard (line 94) | struct sway_keyboard

FILE: include/sway/input/libinput.h
  type sway_input_device (line 5) | struct sway_input_device
  type sway_input_device (line 8) | struct sway_input_device
  type sway_input_device (line 10) | struct sway_input_device
  type sway_input_device (line 12) | struct sway_input_device

FILE: include/sway/input/seat.h
  type sway_seat (line 15) | struct sway_seat
  type sway_seatop_impl (line 17) | struct sway_seatop_impl {
  type sway_seat_device (line 58) | struct sway_seat_device {
  type sway_seat_node (line 68) | struct sway_seat_node {
  type sway_drag (line 77) | struct sway_drag {
  type sway_seat (line 83) | struct sway_seat {
  type sway_pointer_constraint (line 137) | struct sway_pointer_constraint {
  type sway_keyboard_shortcuts_inhibitor (line 145) | struct sway_keyboard_shortcuts_inhibitor {
  type sway_seat (line 153) | struct sway_seat
  type sway_seat (line 155) | struct sway_seat
  type sway_seat (line 157) | struct sway_seat
  type sway_input_device (line 158) | struct sway_input_device
  type sway_seat (line 160) | struct sway_seat
  type sway_input_device (line 161) | struct sway_input_device
  type sway_seat (line 163) | struct sway_seat
  type sway_input_device (line 164) | struct sway_input_device
  type sway_seat (line 166) | struct sway_seat
  type sway_input_device (line 167) | struct sway_input_device
  type sway_seat (line 169) | struct sway_seat
  type sway_input_device (line 170) | struct sway_input_device
  type sway_seat (line 172) | struct sway_seat
  type sway_seat (line 174) | struct sway_seat
  type sway_node (line 174) | struct sway_node
  type sway_seat (line 176) | struct sway_seat
  type sway_container (line 177) | struct sway_container
  type sway_seat (line 179) | struct sway_seat
  type sway_workspace (line 180) | struct sway_workspace
  type sway_seat (line 188) | struct sway_seat
  type sway_node (line 188) | struct sway_node
  type sway_seat (line 190) | struct sway_seat
  type wlr_surface (line 191) | struct wlr_surface
  type sway_seat (line 193) | struct sway_seat
  type wlr_layer_surface_v1 (line 194) | struct wlr_layer_surface_v1
  type sway_seat (line 196) | struct sway_seat
  type wl_client (line 196) | struct wl_client
  type sway_node (line 198) | struct sway_node
  type sway_seat (line 198) | struct sway_seat
  type sway_workspace (line 200) | struct sway_workspace
  type sway_seat (line 200) | struct sway_seat
  type sway_workspace (line 205) | struct sway_workspace
  type sway_seat (line 205) | struct sway_seat
  type sway_container (line 207) | struct sway_container
  type sway_seat (line 207) | struct sway_seat
  type sway_node (line 218) | struct sway_node
  type sway_seat (line 218) | struct sway_seat
  type sway_node (line 219) | struct sway_node
  type sway_container (line 221) | struct sway_container
  type sway_seat (line 221) | struct sway_seat
  type sway_workspace (line 222) | struct sway_workspace
  type sway_container (line 228) | struct sway_container
  type sway_seat (line 228) | struct sway_seat
  type sway_node (line 229) | struct sway_node
  type sway_node (line 234) | struct sway_node
  type sway_seat (line 234) | struct sway_seat
  type sway_node (line 235) | struct sway_node
  type sway_seat (line 241) | struct sway_seat
  type sway_node (line 242) | struct sway_node
  type sway_seat (line 244) | struct sway_seat
  type seat_config (line 244) | struct seat_config
  type seat_config (line 246) | struct seat_config
  type sway_seat (line 246) | struct sway_seat
  type seat_config (line 248) | struct seat_config
  type sway_seat (line 250) | struct sway_seat
  type sway_input_idle_source (line 251) | enum sway_input_idle_source
  type sway_seat (line 253) | struct sway_seat
  type wlr_surface (line 253) | struct wlr_surface
  type sway_seat (line 255) | struct sway_seat
  type wlr_edges (line 257) | enum wlr_edges
  type sway_container (line 257) | struct sway_container
  type wlr_surface (line 258) | struct wlr_surface
  type sway_cursor (line 258) | struct sway_cursor
  type sway_seat (line 260) | struct sway_seat
  type sway_seat (line 262) | struct sway_seat
  type sway_container (line 262) | struct sway_container
  type sway_seat (line 265) | struct sway_seat
  type wlr_surface (line 266) | struct wlr_surface
  type sway_seat (line 268) | struct sway_seat
  type wlr_surface (line 268) | struct wlr_surface
  type wlr_touch_down_event (line 269) | struct wlr_touch_down_event
  type sway_seat (line 271) | struct sway_seat
  type sway_container (line 272) | struct sway_container
  type sway_seat (line 274) | struct sway_seat
  type sway_container (line 275) | struct sway_container
  type sway_seat (line 277) | struct sway_seat
  type sway_container (line 278) | struct sway_container
  type sway_seat (line 280) | struct sway_seat
  type sway_container (line 281) | struct sway_container
  type wlr_edges (line 281) | enum wlr_edges
  type sway_seat (line 283) | struct sway_seat
  type sway_container (line 284) | struct sway_container
  type wlr_edges (line 284) | enum wlr_edges
  type sway_container (line 286) | struct sway_container
  type sway_seat (line 286) | struct sway_seat
  type sway_workspace (line 287) | struct sway_workspace
  type sway_seat (line 289) | struct sway_seat
  type wl_pointer_button_state (line 290) | enum wl_pointer_button_state
  type sway_seat (line 292) | struct sway_seat
  type sway_seat (line 294) | struct sway_seat
  type wlr_input_device (line 295) | struct wlr_input_device
  type wl_pointer_button_state (line 296) | enum wl_pointer_button_state
  type sway_seat (line 298) | struct sway_seat
  type sway_seat (line 300) | struct sway_seat
  type wlr_pointer_axis_event (line 301) | struct wlr_pointer_axis_event
  type sway_seat (line 303) | struct sway_seat
  type sway_tablet_tool (line 304) | struct sway_tablet_tool
  type wlr_tablet_tool_tip_state (line 305) | enum wlr_tablet_tool_tip_state
  type sway_seat (line 307) | struct sway_seat
  type sway_tablet_tool (line 308) | struct sway_tablet_tool
  type sway_seat (line 310) | struct sway_seat
  type wlr_pointer_hold_begin_event (line 311) | struct wlr_pointer_hold_begin_event
  type sway_seat (line 312) | struct sway_seat
  type wlr_pointer_hold_end_event (line 313) | struct wlr_pointer_hold_end_event
  type sway_seat (line 315) | struct sway_seat
  type wlr_pointer_pinch_begin_event (line 316) | struct wlr_pointer_pinch_begin_event
  type sway_seat (line 317) | struct sway_seat
  type wlr_pointer_pinch_update_event (line 318) | struct wlr_pointer_pinch_update_event
  type sway_seat (line 319) | struct sway_seat
  type wlr_pointer_pinch_end_event (line 320) | struct wlr_pointer_pinch_end_event
  type sway_seat (line 322) | struct sway_seat
  type wlr_pointer_swipe_begin_event (line 323) | struct wlr_pointer_swipe_begin_event
  type sway_seat (line 324) | struct sway_seat
  type wlr_pointer_swipe_update_event (line 325) | struct wlr_pointer_swipe_update_event
  type sway_seat (line 326) | struct sway_seat
  type wlr_pointer_swipe_end_event (line 327) | struct wlr_pointer_swipe_end_event
  type sway_seat (line 329) | struct sway_seat
  type wlr_touch_motion_event (line 330) | struct wlr_touch_motion_event
  type sway_seat (line 332) | struct sway_seat
  type wlr_touch_up_event (line 333) | struct wlr_touch_up_event
  type sway_seat (line 335) | struct sway_seat
  type wlr_touch_down_event (line 336) | struct wlr_touch_down_event
  type sway_seat (line 338) | struct sway_seat
  type wlr_touch_cancel_event (line 339) | struct wlr_touch_cancel_event
  type sway_seat (line 341) | struct sway_seat
  type sway_seat (line 346) | struct sway_seat
  type sway_seat (line 353) | struct sway_seat
  type sway_container (line 353) | struct sway_container
  type sway_seat (line 355) | struct sway_seat
  type sway_keyboard_shortcuts_inhibitor (line 361) | struct sway_keyboard_shortcuts_inhibitor
  type sway_seat (line 362) | struct sway_seat
  type wlr_surface (line 363) | struct wlr_surface
  type sway_keyboard_shortcuts_inhibitor (line 369) | struct sway_keyboard_shortcuts_inhibitor
  type sway_seat (line 370) | struct sway_seat

FILE: include/sway/input/switch.h
  type sway_switch (line 6) | struct sway_switch {
  type sway_switch (line 15) | struct sway_switch
  type sway_seat (line 15) | struct sway_seat
  type sway_seat_device (line 16) | struct sway_seat_device
  type sway_switch (line 18) | struct sway_switch
  type sway_switch (line 20) | struct sway_switch

FILE: include/sway/input/tablet.h
  type sway_seat (line 5) | struct sway_seat
  type wlr_tablet_tool (line 6) | struct wlr_tablet_tool
  type sway_tablet (line 8) | struct sway_tablet {
  type sway_tablet_tool_mode (line 14) | enum sway_tablet_tool_mode {
  type sway_tablet_tool (line 19) | struct sway_tablet_tool {
  type sway_tablet_pad (line 31) | struct sway_tablet_pad {
  type sway_tablet (line 49) | struct sway_tablet
  type sway_seat (line 49) | struct sway_seat
  type sway_seat_device (line 50) | struct sway_seat_device
  type sway_tablet (line 52) | struct sway_tablet
  type sway_tablet (line 54) | struct sway_tablet
  type sway_tablet (line 56) | struct sway_tablet
  type wlr_tablet_tool (line 57) | struct wlr_tablet_tool
  type sway_tablet_pad (line 59) | struct sway_tablet_pad
  type sway_seat (line 59) | struct sway_seat
  type sway_seat_device (line 60) | struct sway_seat_device
  type sway_tablet_pad (line 62) | struct sway_tablet_pad
  type sway_tablet_pad (line 64) | struct sway_tablet_pad
  type sway_tablet_pad (line 66) | struct sway_tablet_pad
  type wlr_surface (line 67) | struct wlr_surface

FILE: include/sway/input/text_input.h
  type sway_input_method_relay (line 20) | struct sway_input_method_relay {
  type sway_text_input (line 41) | struct sway_text_input {
  type sway_seat (line 60) | struct sway_seat
  type sway_input_method_relay (line 61) | struct sway_input_method_relay
  type sway_input_method_relay (line 63) | struct sway_input_method_relay
  type sway_input_method_relay (line 66) | struct sway_input_method_relay
  type wlr_surface (line 67) | struct wlr_surface
  type sway_text_input (line 69) | struct sway_text_input
  type sway_input_method_relay (line 70) | struct sway_input_method_relay
  type wlr_text_input_v3 (line 71) | struct wlr_text_input_v3

FILE: include/sway/input/text_input_popup.h
  type sway_input_popup (line 6) | struct sway_input_popup {

FILE: include/sway/ipc-json.h
  type sway_output (line 12) | struct sway_output
  type sway_output_non_desktop (line 13) | struct sway_output_non_desktop
  type sway_node (line 14) | struct sway_node
  type sway_node (line 15) | struct sway_node
  type sway_input_device (line 16) | struct sway_input_device
  type sway_seat (line 17) | struct sway_seat
  type bar_config (line 18) | struct bar_config

FILE: include/sway/ipc-server.h
  type sway_server (line 9) | struct sway_server
  type sway_server (line 11) | struct sway_server
  type sockaddr_un (line 13) | struct sockaddr_un
  type sway_workspace (line 15) | struct sway_workspace
  type sway_workspace (line 16) | struct sway_workspace
  type sway_container (line 17) | struct sway_container
  type bar_config (line 18) | struct bar_config
  type bar_config (line 19) | struct bar_config
  type sway_binding (line 22) | struct sway_binding
  type sway_input_device (line 23) | struct sway_input_device

FILE: include/sway/layers.h
  type sway_layer_surface (line 8) | struct sway_layer_surface {
  type sway_layer_popup (line 28) | struct sway_layer_popup {
  type sway_output (line 39) | struct sway_output
  type wlr_layer_surface_v1 (line 41) | struct wlr_layer_surface_v1
  type wlr_surface (line 42) | struct wlr_surface
  type sway_output (line 44) | struct sway_output
  type sway_output (line 46) | struct sway_output

FILE: include/sway/output.h
  type sway_server (line 13) | struct sway_server
  type sway_container (line 14) | struct sway_container
  type sway_output_state (line 16) | struct sway_output_state {
  type sway_output (line 21) | struct sway_output {
  type sway_output_non_desktop (line 76) | struct sway_output_non_desktop {
  type sway_output (line 82) | struct sway_output
  type wlr_output (line 82) | struct wlr_output
  type sway_output (line 84) | struct sway_output
  type sway_output (line 86) | struct sway_output
  type sway_output (line 88) | struct sway_output
  type wlr_output (line 88) | struct wlr_output
  type sway_output (line 90) | struct sway_output
  type sway_output (line 90) | struct sway_output
  type wlr_direction (line 91) | enum wlr_direction
  type sway_output (line 93) | struct sway_output
  type wlr_scene_node (line 94) | struct wlr_scene_node
  type sway_output (line 96) | struct sway_output
  type sway_workspace (line 97) | struct sway_workspace
  type sway_output (line 99) | struct sway_output
  type sway_view (line 100) | struct sway_view
  type wlr_surface (line 100) | struct wlr_surface
  type wlr_box (line 100) | struct wlr_box
  type sway_output (line 103) | struct sway_output
  type sway_output (line 107) | struct sway_output
  type sway_output (line 110) | struct sway_output
  type sway_output (line 112) | struct sway_output
  type sway_output (line 114) | struct sway_output
  type sway_output (line 116) | struct sway_output
  type sway_workspace (line 118) | struct sway_workspace
  type sway_output (line 118) | struct sway_output
  type sway_output (line 120) | struct sway_output
  type sway_workspace (line 121) | struct sway_workspace
  type sway_output (line 123) | struct sway_output
  type sway_container (line 124) | struct sway_container
  type sway_workspace (line 126) | struct sway_workspace
  type sway_output (line 126) | struct sway_output
  type sway_workspace (line 127) | struct sway_workspace
  type sway_container (line 129) | struct sway_container
  type sway_output (line 129) | struct sway_output
  type sway_container (line 130) | struct sway_container
  type sway_output (line 132) | struct sway_output
  type wlr_box (line 132) | struct wlr_box
  type wlr_output (line 134) | struct wlr_output
  type sway_container_layout (line 136) | enum sway_container_layout
  type sway_output (line 137) | struct sway_output
  type wlr_direction (line 139) | enum wlr_direction
  type wlr_direction (line 139) | enum wlr_direction
  type wl_listener (line 141) | struct wl_listener
  type wl_listener (line 143) | struct wl_listener
  type wl_listener (line 145) | struct wl_listener
  type sway_output_non_desktop (line 148) | struct sway_output_non_desktop
  type wlr_output (line 148) | struct wlr_output
  type sway_server (line 150) | struct sway_server

FILE: include/sway/scene_descriptor.h
  type sway_scene_descriptor_type (line 13) | enum sway_scene_descriptor_type {
  type wlr_scene_node (line 24) | struct wlr_scene_node
  type sway_scene_descriptor_type (line 25) | enum sway_scene_descriptor_type
  type wlr_scene_node (line 27) | struct wlr_scene_node
  type sway_scene_descriptor_type (line 28) | enum sway_scene_descriptor_type
  type wlr_scene_node (line 30) | struct wlr_scene_node
  type sway_scene_descriptor_type (line 31) | enum sway_scene_descriptor_type

FILE: include/sway/server.h
  type sway_transaction (line 12) | struct sway_transaction
  type sway_session_lock (line 14) | struct sway_session_lock {
  type sway_server (line 27) | struct sway_server {
  type sway_server (line 153) | struct sway_server
  type sway_debug (line 155) | struct sway_debug {
  type sway_debug (line 161) | struct sway_debug
  type sway_server (line 167) | struct sway_server
  type sway_server (line 168) | struct sway_server
  type sway_server (line 169) | struct sway_server
  type sway_server (line 170) | struct sway_server
  type wl_listener (line 172) | struct wl_listener
  type wl_listener (line 174) | struct wl_listener
  type wl_listener (line 175) | struct wl_listener
  type sway_session_lock (line 177) | struct sway_session_lock
  type sway_output (line 178) | struct sway_output
  type sway_session_lock (line 179) | struct sway_session_lock
  type wlr_surface (line 180) | struct wlr_surface
  type wl_listener (line 181) | struct wl_listener
  type wl_listener (line 183) | struct wl_listener
  type wl_listener (line 185) | struct wl_listener
  type wl_listener (line 186) | struct wl_listener
  type wl_listener (line 187) | struct wl_listener
  type wl_listener (line 188) | struct wl_listener
  type wl_listener (line 190) | struct wl_listener
  type wl_listener (line 195) | struct wl_listener

FILE: include/sway/sway_text_node.h
  type sway_text_node (line 5) | struct sway_text_node {
  type sway_text_node (line 17) | struct sway_text_node
  type wlr_scene_tree (line 17) | struct wlr_scene_tree
  type sway_text_node (line 20) | struct sway_text_node
  type sway_text_node (line 22) | struct sway_text_node
  type sway_text_node (line 24) | struct sway_text_node
  type sway_text_node (line 26) | struct sway_text_node

FILE: include/sway/swaynag.h
  type swaynag_instance (line 6) | struct swaynag_instance {
  type swaynag_instance (line 20) | struct swaynag_instance
  type swaynag_instance (line 24) | struct swaynag_instance
  type swaynag_instance (line 28) | struct swaynag_instance

FILE: include/sway/tree/arrange.h
  type sway_output (line 4) | struct sway_output
  type sway_workspace (line 5) | struct sway_workspace
  type sway_container (line 6) | struct sway_container
  type sway_node (line 7) | struct sway_node
  type sway_container (line 9) | struct sway_container
  type sway_workspace (line 11) | struct sway_workspace
  type sway_output (line 13) | struct sway_output
  type sway_node (line 17) | struct sway_node

FILE: include/sway/tree/container.h
  type sway_view (line 10) | struct sway_view
  type sway_seat (line 11) | struct sway_seat
  type sway_container_layout (line 13) | enum sway_container_layout {
  type sway_container_border (line 21) | enum sway_container_border {
  type sway_fullscreen_mode (line 28) | enum sway_fullscreen_mode {
  type sway_root (line 34) | struct sway_root
  type sway_output (line 35) | struct sway_output
  type sway_workspace (line 36) | struct sway_workspace
  type sway_view (line 37) | struct sway_view
  type wlr_direction (line 39) | enum wlr_direction
  type sway_container_state (line 41) | struct sway_container_state {
  type sway_container (line 68) | struct sway_container {
  type sway_container (line 153) | struct sway_container
  type sway_view (line 153) | struct sway_view
  type sway_container (line 155) | struct sway_container
  type sway_container (line 157) | struct sway_container
  type sway_container (line 163) | struct sway_container
  type sway_container (line 163) | struct sway_container
  type sway_container (line 164) | struct sway_container
  type sway_container (line 166) | struct sway_container
  type sway_container (line 167) | struct sway_container
  type sway_container (line 172) | struct sway_container
  type sway_container (line 172) | struct sway_container
  type sway_container (line 177) | struct sway_container
  type sway_container (line 178) | struct sway_container
  type sway_container (line 180) | struct sway_container
  type sway_container (line 182) | struct sway_container
  type sway_container (line 182) | struct sway_container
  type sway_container (line 184) | struct sway_container
  type sway_container (line 186) | struct sway_container
  type sway_container (line 188) | struct sway_container
  type sway_container_layout (line 190) | enum sway_container_layout
  type sway_container (line 193) | struct sway_container
  type sway_container (line 203) | struct sway_container
  type wlr_box (line 204) | struct wlr_box
  type wlr_box (line 204) | struct wlr_box
  type sway_container (line 206) | struct sway_container
  type sway_container (line 208) | struct sway_container
  type sway_container (line 210) | struct sway_container
  type sway_container (line 212) | struct sway_container
  type sway_container (line 214) | struct sway_container
  type sway_container (line 222) | struct sway_container
  type sway_container (line 227) | struct sway_container
  type wlr_box (line 227) | struct wlr_box
  type sway_container (line 232) | struct sway_container
  type sway_output (line 238) | struct sway_output
  type sway_container (line 238) | struct sway_container
  type sway_container (line 243) | struct sway_container
  type sway_container (line 249) | struct sway_container
  type sway_container (line 251) | struct sway_container
  type sway_container (line 257) | struct sway_container
  type sway_container (line 259) | struct sway_container
  type sway_fullscreen_mode (line 260) | enum sway_fullscreen_mode
  type sway_container (line 265) | struct sway_container
  type sway_container (line 271) | struct sway_container
  type sway_container (line 272) | struct sway_container
  type sway_container (line 278) | struct sway_container
  type sway_container (line 284) | struct sway_container
  type sway_container_layout (line 286) | enum sway_container_layout
  type sway_container (line 286) | struct sway_container
  type sway_container (line 288) | struct sway_container
  type sway_container (line 290) | struct sway_container
  type sway_container (line 292) | struct sway_container
  type sway_container (line 294) | struct sway_container
  type sway_container (line 295) | struct sway_container
  type sway_container (line 297) | struct sway_container
  type sway_container (line 298) | struct sway_container
  type sway_container (line 303) | struct sway_container
  type sway_container (line 304) | struct sway_container
  type sway_container (line 306) | struct sway_container
  type sway_container (line 308) | struct sway_container
  type sway_container (line 309) | struct sway_container
  type sway_container (line 311) | struct sway_container
  type sway_container (line 311) | struct sway_container
  type sway_container (line 313) | struct sway_container
  type sway_container (line 313) | struct sway_container
  type sway_container_layout (line 314) | enum sway_container_layout
  type sway_container (line 316) | struct sway_container
  type sway_container (line 317) | struct sway_container
  type sway_container (line 322) | struct sway_container
  type sway_container (line 333) | struct sway_container
  type sway_container (line 335) | struct sway_container
  type sway_container (line 337) | struct sway_container
  type sway_container (line 339) | struct sway_container
  type sway_container (line 341) | struct sway_container
  type sway_container (line 343) | struct sway_container
  type sway_container (line 345) | struct sway_container
  type sway_container (line 347) | struct sway_container
  type sway_container (line 360) | struct sway_container
  type sway_container (line 362) | struct sway_container
  type sway_container (line 364) | struct sway_container
  type sway_container (line 366) | struct sway_container

FILE: include/sway/tree/node.h
  type sway_root (line 11) | struct sway_root
  type sway_output (line 12) | struct sway_output
  type sway_workspace (line 13) | struct sway_workspace
  type sway_container (line 14) | struct sway_container
  type sway_transaction_instruction (line 15) | struct sway_transaction_instruction
  type wlr_box (line 16) | struct wlr_box
  type sway_node_type (line 18) | enum sway_node_type {
  type sway_node (line 25) | struct sway_node {
  type sway_node (line 53) | struct sway_node
  type sway_node_type (line 53) | enum sway_node_type
  type sway_node_type (line 55) | enum sway_node_type
  type sway_node (line 61) | struct sway_node
  type sway_node (line 63) | struct sway_node
  type sway_node (line 65) | struct sway_node
  type sway_node (line 67) | struct sway_node
  type wlr_box (line 67) | struct wlr_box
  type sway_output (line 69) | struct sway_output
  type sway_node (line 69) | struct sway_node
  type sway_container_layout (line 71) | enum sway_container_layout
  type sway_node (line 71) | struct sway_node
  type sway_node (line 73) | struct sway_node
  type sway_node (line 73) | struct sway_node
  type sway_node (line 75) | struct sway_node
  type sway_node (line 77) | struct sway_node
  type sway_node (line 77) | struct sway_node
  type wlr_scene_tree (line 82) | struct wlr_scene_tree
  type wlr_scene_tree (line 87) | struct wlr_scene_tree
  type wlr_scene_tree (line 87) | struct wlr_scene_tree

FILE: include/sway/tree/root.h
  type sway_root (line 13) | struct sway_root
  type sway_root (line 15) | struct sway_root {
  type sway_root (line 77) | struct sway_root
  type wl_display (line 77) | struct wl_display
  type sway_root (line 79) | struct sway_root
  type sway_container (line 87) | struct sway_container
  type sway_workspace (line 88) | struct sway_workspace
  type sway_container (line 93) | struct sway_container
  type sway_container (line 98) | struct sway_container
  type sway_container (line 103) | struct sway_container
  type sway_workspace (line 105) | struct sway_workspace
  type sway_container (line 108) | struct sway_container
  type sway_output (line 111) | struct sway_output
  type sway_output (line 112) | struct sway_output
  type sway_workspace (line 114) | struct sway_workspace
  type sway_workspace (line 115) | struct sway_workspace
  type sway_container (line 117) | struct sway_container
  type sway_container (line 118) | struct sway_container
  type sway_root (line 120) | struct sway_root
  type wlr_box (line 120) | struct wlr_box

FILE: include/sway/tree/view.h
  type sway_container (line 15) | struct sway_container
  type sway_xdg_decoration (line 16) | struct sway_xdg_decoration
  type sway_view_type (line 18) | enum sway_view_type {
  type sway_view_prop (line 25) | enum sway_view_prop {
  type sway_view_tearing_mode (line 39) | enum sway_view_tearing_mode {
  type sway_view_impl (line 45) | struct sway_view_impl {
  type sway_view (line 65) | struct sway_view {
  type sway_xdg_shell_view (line 128) | struct sway_xdg_shell_view {
  type sway_xwayland_view (line 147) | struct sway_xwayland_view {
  type sway_xwayland_unmanaged (line 179) | struct sway_xwayland_unmanaged {
  type sway_popup_desc (line 197) | struct sway_popup_desc {
  type sway_xdg_popup (line 202) | struct sway_xdg_popup {
  type sway_view (line 219) | struct sway_view
  type sway_view (line 221) | struct sway_view
  type sway_view (line 223) | struct sway_view
  type sway_view (line 225) | struct sway_view
  type sway_view (line 227) | struct sway_view
  type sway_view (line 229) | struct sway_view
  type sway_view (line 231) | struct sway_view
  type sway_view (line 233) | struct sway_view
  type sway_view (line 235) | struct sway_view
  type sway_view (line 237) | struct sway_view
  type sway_view (line 239) | struct sway_view
  type sway_view (line 241) | struct sway_view
  type sway_view (line 243) | struct sway_view
  type sway_view (line 245) | struct sway_view
  type sway_view (line 248) | struct sway_view
  type sway_view (line 251) | struct sway_view
  type sway_view (line 259) | struct sway_view
  type sway_view (line 265) | struct sway_view
  type sway_view (line 267) | struct sway_view
  type sway_view (line 272) | struct sway_view
  type sway_seat (line 272) | struct sway_seat
  type sway_view (line 277) | struct sway_view
  type sway_view (line 282) | struct sway_view
  type sway_view (line 288) | struct sway_view
  type sway_view (line 290) | struct sway_view
  type sway_view (line 292) | struct sway_view
  type sway_view (line 294) | struct sway_view
  type sway_view (line 298) | struct sway_view
  type sway_view_type (line 298) | enum sway_view_type
  type sway_view_impl (line 299) | struct sway_view_impl
  type sway_view (line 301) | struct sway_view
  type sway_view (line 303) | struct sway_view
  type sway_view (line 314) | struct sway_view
  type wlr_surface (line 314) | struct wlr_surface
  type wlr_output (line 315) | struct wlr_output
  type sway_view (line 317) | struct sway_view
  type sway_view (line 319) | struct sway_view
  type sway_view (line 320) | struct sway_view
  type sway_view (line 322) | struct sway_view
  type wlr_xdg_surface (line 323) | struct wlr_xdg_surface
  type sway_view (line 325) | struct sway_view
  type wlr_xwayland_surface (line 326) | struct wlr_xwayland_surface
  type sway_view (line 328) | struct sway_view
  type wlr_surface (line 328) | struct wlr_surface
  type sway_view (line 330) | struct sway_view
  type sway_view (line 337) | struct sway_view
  type sway_view (line 343) | struct sway_view
  type sway_view (line 349) | struct sway_view
  type sway_view (line 351) | struct sway_view
  type sway_view (line 353) | struct sway_view
  type sway_view (line 355) | struct sway_view
  type sway_view (line 357) | struct sway_view
  type sway_view (line 359) | struct sway_view
  type sway_view (line 359) | struct sway_view
  type sway_view (line 361) | struct sway_view
  type launcher_ctx (line 361) | struct launcher_ctx
  type sway_view (line 363) | struct sway_view
  type sway_view (line 365) | struct sway_view
  type wl_listener (line 367) | struct wl_listener

FILE: include/sway/tree/workspace.h
  type sway_view (line 10) | struct sway_view
  type sway_workspace_state (line 12) | struct sway_workspace_state {
  type sway_workspace (line 25) | struct sway_workspace {
  type workspace_config (line 56) | struct workspace_config
  type sway_output (line 58) | struct sway_output
  type sway_workspace (line 60) | struct sway_workspace
  type sway_output (line 60) | struct sway_output
  type sway_workspace (line 63) | struct sway_workspace
  type sway_workspace (line 65) | struct sway_workspace
  type sway_workspace (line 67) | struct sway_workspace
  type sway_workspace (line 71) | struct sway_workspace
  type sway_workspace (line 72) | struct sway_workspace
  type sway_workspace (line 74) | struct sway_workspace
  type sway_workspace (line 76) | struct sway_workspace
  type sway_workspace (line 78) | struct sway_workspace
  type sway_workspace (line 80) | struct sway_workspace
  type sway_workspace (line 80) | struct sway_workspace
  type sway_workspace (line 82) | struct sway_workspace
  type sway_workspace (line 82) | struct sway_workspace
  type sway_workspace (line 84) | struct sway_workspace
  type sway_workspace (line 84) | struct sway_workspace
  type sway_workspace (line 86) | struct sway_workspace
  type sway_workspace (line 86) | struct sway_workspace
  type sway_workspace (line 88) | struct sway_workspace
  type sway_workspace (line 90) | struct sway_workspace
  type sway_workspace (line 92) | struct sway_workspace
  type sway_output (line 93) | struct sway_output
  type sway_output (line 93) | struct sway_output
  type sway_workspace (line 95) | struct sway_workspace
  type sway_output (line 96) | struct sway_output
  type sway_output (line 98) | struct sway_output
  type sway_workspace (line 99) | struct sway_workspace
  type sway_workspace (line 101) | struct sway_workspace
  type sway_workspace (line 103) | struct sway_workspace
  type sway_container (line 104) | struct sway_container
  type sway_container (line 106) | struct sway_container
  type sway_workspace (line 106) | struct sway_workspace
  type sway_container (line 107) | struct sway_container
  type sway_container (line 114) | struct sway_container
  type sway_workspace (line 114) | struct sway_workspace
  type sway_workspace (line 116) | struct sway_workspace
  type sway_container (line 117) | struct sway_container
  type sway_workspace (line 119) | struct sway_workspace
  type sway_container (line 121) | struct sway_container
  type sway_workspace (line 121) | struct sway_workspace
  type sway_container (line 122) | struct sway_container
  type sway_workspace (line 124) | struct sway_workspace
  type sway_container (line 125) | struct sway_container
  type sway_workspace (line 131) | struct sway_workspace
  type sway_container (line 132) | struct sway_container
  type sway_container (line 134) | struct sway_container
  type sway_workspace (line 134) | struct sway_workspace
  type sway_container (line 135) | struct sway_container
  type sway_workspace (line 137) | struct sway_workspace
  type sway_workspace (line 139) | struct sway_workspace
  type sway_container (line 141) | struct sway_container
  type sway_workspace (line 141) | struct sway_workspace
  type sway_container_layout (line 142) | enum sway_container_layout
  type sway_workspace (line 144) | struct sway_workspace
  type sway_workspace (line 146) | struct sway_workspace
  type wlr_box (line 146) | struct wlr_box
  type sway_workspace (line 148) | struct sway_workspace
  type sway_workspace (line 150) | struct sway_workspace
  type sway_workspace (line 158) | struct sway_workspace

FILE: include/sway/xdg_decoration.h
  type sway_xdg_decoration (line 6) | struct sway_xdg_decoration {
  type sway_xdg_decoration (line 16) | struct sway_xdg_decoration
  type wlr_surface (line 17) | struct wlr_surface
  type sway_xdg_decoration (line 19) | struct sway_xdg_decoration

FILE: include/sway/xwayland.h
  type atom_name (line 7) | enum atom_name {
  type sway_xwayland (line 22) | struct sway_xwayland {
  type wl_listener (line 29) | struct wl_listener

FILE: include/swaybar/bar.h
  type swaybar_config (line 11) | struct swaybar_config
  type swaybar_output (line 12) | struct swaybar_output
  type swaybar_tray (line 14) | struct swaybar_tray
  type swaybar_workspace (line 16) | struct swaybar_workspace
  type loop (line 17) | struct loop
  type swaybar (line 19) | struct swaybar {
  type swaybar_output (line 56) | struct swaybar_output {
  type swaybar_workspace (line 83) | struct swaybar_workspace {
  type swaybar (line 93) | struct swaybar
  type swaybar (line 94) | struct swaybar
  type swaybar (line 95) | struct swaybar
  type swaybar (line 97) | struct swaybar
  type swaybar (line 111) | struct swaybar
  type wl_list (line 112) | struct wl_list
  type swaybar_output (line 116) | struct swaybar_output

FILE: include/swaybar/config.h
  type box_colors (line 11) | struct box_colors {
  type box_size (line 17) | struct box_size {
  type config_output (line 22) | struct config_output {
  type swaybar_binding (line 27) | struct swaybar_binding {
  type swaybar_config (line 33) | struct swaybar_config {
  type tray_binding (line 86) | struct tray_binding {
  type tray_binding (line 92) | struct tray_binding
  type swaybar_config (line 95) | struct swaybar_config
  type swaybar_config (line 96) | struct swaybar_config
  type swaybar_binding (line 98) | struct swaybar_binding

FILE: include/swaybar/i3bar.h
  type i3bar_block (line 7) | struct i3bar_block {
  type i3bar_block (line 29) | struct i3bar_block
  type status_line (line 30) | struct status_line
  type hotspot_event_handling (line 31) | enum hotspot_event_handling
  type status_line (line 31) | struct status_line
  type i3bar_block (line 32) | struct i3bar_block

FILE: include/swaybar/input.h
  type swaybar (line 16) | struct swaybar
  type swaybar_output (line 17) | struct swaybar_output
  type swaybar_pointer (line 19) | struct swaybar_pointer {
  type touch_slot (line 29) | struct touch_slot {
  type swaybar_touch (line 37) | struct swaybar_touch {
  type hotspot_event_handling (line 42) | enum hotspot_event_handling {
  type swaybar_hotspot (line 47) | struct swaybar_hotspot {
  type swaybar_scroll_axis (line 57) | struct swaybar_scroll_axis {
  type swaybar_seat (line 63) | struct swaybar_seat {
  type wl_seat_listener (line 73) | struct wl_seat_listener
  type swaybar_seat (line 75) | struct swaybar_seat
  type wl_list (line 79) | struct wl_list
  type swaybar_seat (line 81) | struct swaybar_seat

FILE: include/swaybar/ipc.h
  type swaybar (line 6) | struct swaybar
  type swaybar (line 7) | struct swaybar
  type swaybar (line 8) | struct swaybar
  type swaybar (line 9) | struct swaybar
  type swaybar (line 10) | struct swaybar
  type swaybar_binding (line 10) | struct swaybar_binding

FILE: include/swaybar/render.h
  type swaybar_output (line 4) | struct swaybar_output
  type swaybar_output (line 6) | struct swaybar_output

FILE: include/swaybar/status_line.h
  type status_protocol (line 9) | enum status_protocol {
  type status_line (line 16) | struct status_line {
  type status_line (line 41) | struct status_line
  type status_line (line 42) | struct status_line
  type status_line (line 43) | struct status_line
  type status_line (line 44) | struct status_line

FILE: include/swaybar/tray/host.h
  type swaybar_tray (line 6) | struct swaybar_tray
  type swaybar_host (line 8) | struct swaybar_host {
  type swaybar_host (line 14) | struct swaybar_host
  type swaybar_tray (line 14) | struct swaybar_tray
  type swaybar_host (line 15) | struct swaybar_host

FILE: include/swaybar/tray/icon.h
  type icon_theme_subdir (line 6) | struct icon_theme_subdir {
  type icon_theme (line 21) | struct icon_theme {

FILE: include/swaybar/tray/item.h
  type swaybar_output (line 11) | struct swaybar_output
  type swaybar_pixmap (line 13) | struct swaybar_pixmap {
  type swaybar_sni_slot (line 18) | struct swaybar_sni_slot {
  type swaybar_sni (line 27) | struct swaybar_sni {
  type swaybar_sni (line 53) | struct swaybar_sni
  type swaybar_tray (line 53) | struct swaybar_tray
  type swaybar_sni (line 54) | struct swaybar_sni
  type swaybar_output (line 55) | struct swaybar_output
  type swaybar_sni (line 56) | struct swaybar_sni

FILE: include/swaybar/tray/tray.h
  type swaybar (line 17) | struct swaybar
  type swaybar_output (line 18) | struct swaybar_output
  type swaybar_watcher (line 19) | struct swaybar_watcher
  type swaybar_tray (line 21) | struct swaybar_tray {
  type swaybar_tray (line 37) | struct swaybar_tray
  type swaybar (line 37) | struct swaybar
  type swaybar_tray (line 38) | struct swaybar_tray
  type swaybar_output (line 40) | struct swaybar_output

FILE: include/swaybar/tray/watcher.h
  type swaybar_watcher (line 7) | struct swaybar_watcher {
  type swaybar_watcher (line 15) | struct swaybar_watcher
  type swaybar_watcher (line 16) | struct swaybar_watcher

FILE: include/swaynag/config.h
  type swaynag (line 6) | struct swaynag
  type swaynag_type (line 7) | struct swaynag_type
  type swaynag (line 11) | struct swaynag

FILE: include/swaynag/render.h
  type swaynag (line 5) | struct swaynag

FILE: include/swaynag/swaynag.h
  type swaynag (line 13) | struct swaynag
  type swaynag_action_type (line 15) | enum swaynag_action_type {
  type swaynag_pointer (line 21) | struct swaynag_pointer {
  type swaynag_seat (line 31) | struct swaynag_seat {
  type swaynag_output (line 39) | struct swaynag_output {
  type swaynag_button (line 48) | struct swaynag_button {
  type swaynag_details (line 60) | struct swaynag_details {
  type swaynag (line 78) | struct swaynag {
  type swaynag (line 105) | struct swaynag
  type swaynag (line 107) | struct swaynag
  type swaynag (line 109) | struct swaynag

FILE: include/swaynag/types.h
  type swaynag_type (line 8) | struct swaynag_type {
  type swaynag_type (line 36) | struct swaynag_type
  type swaynag_type (line 40) | struct swaynag_type
  type swaynag_type (line 42) | struct swaynag_type
  type swaynag_type (line 42) | struct swaynag_type
  type swaynag_type (line 44) | struct swaynag_type
  type swaynag_type (line 44) | struct swaynag_type
  type swaynag_type (line 46) | struct swaynag_type

FILE: include/util.h
  type movement_unit (line 8) | enum movement_unit {
  type movement_amount (line 15) | struct movement_amount {
  type movement_unit (line 23) | enum movement_unit
  type movement_amount (line 30) | struct movement_amount
  type wl_output_subpixel (line 60) | enum wl_output_subpixel

FILE: sway/commands.c
  type cmd_results (line 18) | struct cmd_results
  type expected_args (line 18) | enum expected_args
  type cmd_handler (line 44) | struct cmd_handler
  type cmd_handler (line 103) | struct cmd_handler
  type cmd_handler (line 114) | struct cmd_handler
  function handler_compare (line 145) | static int handler_compare(const void *_a, const void *_b) {
  type cmd_handler (line 151) | struct cmd_handler
  type cmd_handler (line 152) | struct cmd_handler
  type cmd_handler (line 156) | struct cmd_handler
  type cmd_handler (line 158) | struct cmd_handler
  type cmd_handler (line 159) | struct cmd_handler
  type cmd_handler (line 162) | struct cmd_handler
  type cmd_handler (line 163) | struct cmd_handler
  type cmd_handler (line 164) | struct cmd_handler
  type cmd_handler (line 165) | struct cmd_handler
  type cmd_handler (line 166) | struct cmd_handler
  type cmd_handler (line 175) | struct cmd_handler
  function set_config_node (line 181) | static void set_config_node(struct sway_node *node, bool node_overridden) {
  function list_t (line 205) | list_t *execute_command(char *_exec, struct sway_seat *seat,
  type cmd_results (line 343) | struct cmd_results
  type cmd_results (line 344) | struct cmd_results
  type cmd_handler (line 382) | struct cmd_handler
  type cmd_results (line 433) | struct cmd_results
  type cmd_handler (line 434) | struct cmd_handler
  type cmd_handler (line 439) | struct cmd_handler
  type cmd_results (line 452) | struct cmd_results
  type cmd_results (line 453) | struct cmd_results
  type cmd_handler (line 469) | struct cmd_handler
  type cmd_results (line 483) | struct cmd_results
  type cmd_status (line 483) | enum cmd_status
  type cmd_results (line 485) | struct cmd_results
  type cmd_results (line 485) | struct cmd_results
  function free_cmd_results (line 502) | void free_cmd_results(struct cmd_results *results) {
  type cmd_results (line 512) | struct cmd_results

FILE: sway/commands/allow_tearing.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results
  type sway_container (line 12) | struct sway_container
  type sway_view (line 19) | struct sway_view

FILE: sway/commands/assign.c
  type cmd_results (line 9) | struct cmd_results
  type cmd_results (line 10) | struct cmd_results
  type criteria (line 17) | struct criteria

FILE: sway/commands/bar.c
  type cmd_handler (line 10) | struct cmd_handler
  type cmd_handler (line 43) | struct cmd_handler
  function is_subcommand (line 49) | static bool is_subcommand(char *name) {
  type cmd_results (line 54) | struct cmd_results
  type cmd_results (line 55) | struct cmd_results
  type bar_config (line 63) | struct bar_config
  type cmd_results (line 99) | struct cmd_results

FILE: sway/commands/bar/bind.c
  type cmd_results (line 12) | struct cmd_results
  type bar_binding (line 12) | struct bar_binding
  type bar_binding (line 17) | struct bar_binding
  type cmd_results (line 38) | struct cmd_results
  type bar_binding (line 38) | struct bar_binding
  type bar_binding (line 42) | struct bar_binding
  type cmd_results (line 55) | struct cmd_results
  type cmd_results (line 63) | struct cmd_results
  type cmd_results (line 74) | struct cmd_results
  type bar_binding (line 79) | struct bar_binding
  type bar_binding (line 79) | struct bar_binding
  type cmd_results (line 115) | struct cmd_results
  type cmd_results (line 119) | struct cmd_results
  type cmd_results (line 123) | struct cmd_results
  type cmd_results (line 127) | struct cmd_results

FILE: sway/commands/bar/binding_mode_indicator.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results

FILE: sway/commands/bar/colors.c
  type cmd_handler (line 7) | struct cmd_handler
  type cmd_results (line 34) | struct cmd_results
  type cmd_results (line 36) | struct cmd_results
  type cmd_results (line 51) | struct cmd_results
  type cmd_results (line 53) | struct cmd_results
  type cmd_results (line 74) | struct cmd_results
  type cmd_results (line 75) | struct cmd_results
  type cmd_results (line 83) | struct cmd_results
  type cmd_results (line 92) | struct cmd_results
  type cmd_results (line 97) | struct cmd_results
  type cmd_results (line 102) | struct cmd_results
  type cmd_results (line 111) | struct cmd_results
  type cmd_results (line 120) | struct cmd_results
  type cmd_results (line 129) | struct cmd_results
  type cmd_results (line 134) | struct cmd_results
  type cmd_results (line 139) | struct cmd_results
  type cmd_results (line 144) | struct cmd_results
  type cmd_results (line 149) | struct cmd_results

FILE: sway/commands/bar/font.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/bar/gaps.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results

FILE: sway/commands/bar/height.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/bar/hidden_state.c
  type cmd_results (line 8) | struct cmd_results
  type bar_config (line 8) | struct bar_config
  type cmd_results (line 36) | struct cmd_results
  type cmd_results (line 37) | struct cmd_results
  type bar_config (line 61) | struct bar_config

FILE: sway/commands/bar/icon_theme.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results

FILE: sway/commands/bar/id.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results
  type bar_config (line 20) | struct bar_config

FILE: sway/commands/bar/mode.c
  type cmd_results (line 8) | struct cmd_results
  type bar_config (line 8) | struct bar_config
  type cmd_results (line 40) | struct cmd_results
  type cmd_results (line 41) | struct cmd_results
  type bar_config (line 65) | struct bar_config

FILE: sway/commands/bar/modifier.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results

FILE: sway/commands/bar/output.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results

FILE: sway/commands/bar/pango_markup.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results

FILE: sway/commands/bar/position.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/bar/separator_symbol.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results

FILE: sway/commands/bar/status_command.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/bar/status_edge_padding.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/bar/status_padding.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/bar/strip_workspace_name.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results

FILE: sway/commands/bar/strip_workspace_numbers.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results

FILE: sway/commands/bar/swaybar_command.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/bar/tray_bind.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 11) | struct cmd_results
  type tray_binding (line 16) | struct tray_binding
  type tray_binding (line 16) | struct tray_binding
  type tray_binding (line 61) | struct tray_binding
  type cmd_results (line 89) | struct cmd_results
  type cmd_results (line 93) | struct cmd_results

FILE: sway/commands/bar/tray_output.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 10) | struct cmd_results

FILE: sway/commands/bar/tray_padding.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 10) | struct cmd_results
  type bar_config (line 18) | struct bar_config

FILE: sway/commands/bar/workspace_buttons.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results

FILE: sway/commands/bar/workspace_min_width.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type bar_config (line 14) | struct bar_config

FILE: sway/commands/bar/wrap_scroll.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results

FILE: sway/commands/bind.c
  function free_sway_binding (line 21) | void free_sway_binding(struct sway_binding *binding) {
  function free_switch_binding (line 33) | void free_switch_binding(struct sway_switch_binding *binding) {
  function binding_switch_compare (line 44) | static bool binding_switch_compare(struct sway_switch_binding *binding_a,
  function binding_key_compare (line 64) | static bool binding_key_compare(struct sway_binding *binding_a,
  function key_qsort_cmp (line 107) | static int key_qsort_cmp(const void *keyp_a, const void *keyp_b) {
  type cmd_results (line 120) | struct cmd_results
  type binding_input_type (line 121) | enum binding_input_type
  type cmd_results (line 128) | struct cmd_results
  type cmd_results (line 144) | struct cmd_results
  type cmd_results (line 183) | struct cmd_results
  type cmd_results (line 209) | struct cmd_results
  type sway_switch_binding (line 210) | struct sway_switch_binding
  type sway_switch_binding (line 216) | struct sway_switch_binding
  type cmd_results (line 241) | struct cmd_results
  type sway_switch_binding (line 242) | struct sway_switch_binding
  type sway_switch_binding (line 246) | struct sway_switch_binding
  type sway_binding (line 266) | struct sway_binding
  type sway_binding (line 266) | struct sway_binding
  type sway_binding (line 269) | struct sway_binding
  type cmd_results (line 280) | struct cmd_results
  type sway_binding (line 280) | struct sway_binding
  type sway_binding (line 283) | struct sway_binding
  type cmd_results (line 304) | struct cmd_results
  type sway_binding (line 304) | struct sway_binding
  type sway_binding (line 308) | struct sway_binding
  type cmd_results (line 323) | struct cmd_results
  type cmd_results (line 334) | struct cmd_results
  type sway_binding (line 339) | struct sway_binding
  type sway_binding (line 339) | struct sway_binding
  type cmd_results (line 493) | struct cmd_results
  type cmd_results (line 502) | struct cmd_results
  type sway_switch_binding (line 506) | struct sway_switch_binding
  type sway_switch_binding (line 506) | struct sway_switch_binding
  type cmd_results (line 579) | struct cmd_results
  type cmd_results (line 583) | struct cmd_results
  type cmd_results (line 587) | struct cmd_results
  type cmd_results (line 591) | struct cmd_results
  type cmd_results (line 595) | struct cmd_results
  type cmd_results (line 599) | struct cmd_results
  function seat_execute_command (line 606) | void seat_execute_command(struct sway_seat *seat, struct sway_binding *b...
  type keycode_matches (line 658) | struct keycode_matches {
  function find_keycode (line 668) | static void find_keycode(struct xkb_keymap *keymap,
  function get_keycode_for_keysym (line 687) | static struct keycode_matches get_keycode_for_keysym(xkb_keysym_t keysym) {
  function translate_binding (line 700) | bool translate_binding(struct sway_binding *binding) {
  function binding_add_translated (line 753) | void binding_add_translated(struct sway_binding *binding,

FILE: sway/commands/border.c
  function set_border (line 15) | static void set_border(struct sway_container *con,
  function border_toggle (line 33) | static void border_toggle(struct sway_container *con) {
  type cmd_results (line 59) | struct cmd_results
  type cmd_results (line 60) | struct cmd_results
  type sway_container (line 65) | struct sway_container
  type sway_view (line 69) | struct sway_view

FILE: sway/commands/client.c
  function container_update_iterator (line 8) | static void container_update_iterator(struct sway_container *con, void *...
  type cmd_results (line 12) | struct cmd_results
  type border_colors (line 13) | struct border_colors
  type cmd_results (line 14) | struct cmd_results
  type border_colors (line 26) | struct border_colors
  type border_colors (line 50) | struct border_colors
  type cmd_results (line 59) | struct cmd_results
  type cmd_results (line 64) | struct cmd_results
  type cmd_results (line 69) | struct cmd_results
  type cmd_results (line 74) | struct cmd_results
  type cmd_results (line 79) | struct cmd_results
  type cmd_results (line 84) | struct cmd_results
  type cmd_results (line 85) | struct cmd_results

FILE: sway/commands/create_output.c
  function create_output (line 12) | static void create_output(struct wlr_backend *backend, void *data) {
  type cmd_results (line 36) | struct cmd_results

FILE: sway/commands/default_border.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/default_floating_border.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/default_orientation.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results

FILE: sway/commands/exec.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results

FILE: sway/commands/exec_always.c
  type cmd_results (line 17) | struct cmd_results
  type cmd_results (line 18) | struct cmd_results
  type cmd_results (line 28) | struct cmd_results
  type cmd_results (line 29) | struct cmd_results
  type launcher_ctx (line 49) | struct launcher_ctx
  type cmd_results (line 83) | struct cmd_results
  type cmd_results (line 84) | struct cmd_results

FILE: sway/commands/exit.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/floating.c
  type cmd_results (line 14) | struct cmd_results
  type cmd_results (line 15) | struct cmd_results
  type sway_container (line 23) | struct sway_container
  type sway_workspace (line 24) | struct sway_workspace

FILE: sway/commands/floating_minmax_size.c
  type cmd_results (line 16) | struct cmd_results
  type cmd_results (line 18) | struct cmd_results
  type cmd_results (line 44) | struct cmd_results
  type cmd_results (line 49) | struct cmd_results

FILE: sway/commands/floating_modifier.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/focus.c
  function get_direction_from_next_prev (line 17) | static bool get_direction_from_next_prev(struct sway_container *container,
  function parse_direction (line 61) | static bool parse_direction(const char *name,
  type sway_node (line 81) | struct sway_node
  type sway_output (line 82) | struct sway_output
  type wlr_direction (line 82) | enum wlr_direction
  type sway_seat (line 83) | struct sway_seat
  type sway_workspace (line 84) | struct sway_workspace
  type sway_container (line 91) | struct sway_container
  type sway_node (line 138) | struct sway_node
  type sway_container (line 139) | struct sway_container
  type sway_seat (line 139) | struct sway_seat
  type wlr_direction (line 140) | enum wlr_direction
  type sway_container (line 141) | struct sway_container
  type sway_container (line 142) | struct sway_container
  type sway_output (line 146) | struct sway_output
  type sway_output (line 147) | struct sway_output
  type sway_container_layout (line 161) | enum sway_container_layout
  type sway_container (line 188) | struct sway_container
  type sway_container (line 194) | struct sway_container
  type sway_container (line 198) | struct sway_container
  type sway_output (line 209) | struct sway_output
  type sway_output (line 210) | struct sway_output
  type sway_container (line 218) | struct sway_container
  type sway_node (line 226) | struct sway_node
  type sway_container (line 227) | struct sway_container
  type sway_seat (line 227) | struct sway_seat
  type wlr_direction (line 228) | enum wlr_direction
  type sway_container (line 232) | struct sway_container
  type sway_container (line 239) | struct sway_container
  type cmd_results (line 261) | struct cmd_results
  type sway_workspace (line 261) | struct sway_workspace
  type sway_seat (line 262) | struct sway_seat
  type sway_container (line 263) | struct sway_container
  type sway_container (line 270) | struct sway_container
  type cmd_results (line 294) | struct cmd_results
  type sway_seat (line 294) | struct sway_seat
  type sway_output (line 301) | struct sway_output
  type wlr_direction (line 304) | enum wlr_direction
  type sway_workspace (line 310) | struct sway_workspace
  type wlr_output (line 321) | struct wlr_output
  type cmd_results (line 339) | struct cmd_results
  type sway_seat (line 340) | struct sway_seat
  type sway_container (line 341) | struct sway_container
  type sway_node (line 345) | struct sway_node
  type cmd_results (line 353) | struct cmd_results
  type sway_seat (line 354) | struct sway_seat
  type sway_node (line 355) | struct sway_node
  type sway_node (line 356) | struct sway_node
  type cmd_results (line 364) | struct cmd_results
  type sway_node (line 372) | struct sway_node
  type sway_container (line 373) | struct sway_container
  type sway_workspace (line 374) | struct sway_workspace
  type sway_seat (line 375) | struct sway_seat
  type sway_container (line 391) | struct sway_container
  type wlr_direction (line 423) | enum wlr_direction
  type sway_output (line 441) | struct sway_output
  type sway_node (line 447) | struct sway_node
  type sway_node (line 457) | struct sway_node

FILE: sway/commands/focus_follows_mouse.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/focus_on_window_activation.c
  type cmd_results (line 3) | struct cmd_results
  type cmd_results (line 4) | struct cmd_results

FILE: sway/commands/focus_wrapping.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/font.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results

FILE: sway/commands/for_window.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type criteria (line 15) | struct criteria

FILE: sway/commands/force_display_urgency_hint.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results

FILE: sway/commands/force_focus_wrapping.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 14) | struct cmd_results

FILE: sway/commands/fullscreen.c
  type cmd_results (line 12) | struct cmd_results
  type cmd_results (line 13) | struct cmd_results
  type sway_container (line 21) | struct sway_container
  type sway_fullscreen_mode (line 49) | enum sway_fullscreen_mode

FILE: sway/commands/gaps.c
  type gaps_op (line 11) | enum gaps_op {
  type gaps_data (line 18) | struct gaps_data {
  function prevent_invalid_outer_gaps (line 31) | static void prevent_invalid_outer_gaps(void) {
  type cmd_results (line 49) | struct cmd_results
  type cmd_results (line 50) | struct cmd_results
  function apply_gaps_op (line 95) | static void apply_gaps_op(int *prop, enum gaps_op op, int amount) {
  function configure_gaps (line 112) | static void configure_gaps(struct sway_workspace *ws, void *_data) {
  type cmd_results (line 143) | struct cmd_results
  type cmd_results (line 144) | struct cmd_results
  type gaps_data (line 153) | struct gaps_data
  type cmd_results (line 212) | struct cmd_results
  type cmd_results (line 213) | struct cmd_results

FILE: sway/commands/gesture.c
  function free_gesture_binding (line 8) | void free_gesture_binding(struct sway_gesture_binding *binding) {
  function binding_gesture_equal (line 20) | static bool binding_gesture_equal(struct sway_gesture_binding *binding_a,
  type cmd_results (line 40) | struct cmd_results
  type sway_gesture_binding (line 41) | struct sway_gesture_binding
  type sway_gesture_binding (line 47) | struct sway_gesture_binding
  type cmd_results (line 75) | struct cmd_results
  type sway_gesture_binding (line 76) | struct sway_gesture_binding
  type sway_gesture_binding (line 79) | struct sway_gesture_binding
  type cmd_results (line 98) | struct cmd_results
  type cmd_results (line 106) | struct cmd_results
  type sway_gesture_binding (line 110) | struct sway_gesture_binding
  type sway_gesture_binding (line 110) | struct sway_gesture_binding
  type cmd_results (line 144) | struct cmd_results
  type cmd_results (line 158) | struct cmd_results
  type cmd_results (line 162) | struct cmd_results

FILE: sway/commands/hide_edge_borders.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 10) | struct cmd_results

FILE: sway/commands/include.c
  type cmd_results (line 4) | struct cmd_results
  type cmd_results (line 5) | struct cmd_results

FILE: sway/commands/inhibit_idle.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type sway_container (line 14) | struct sway_container
  type sway_idle_inhibit_mode (line 21) | enum sway_idle_inhibit_mode
  type sway_idle_inhibitor_v1 (line 37) | struct sway_idle_inhibitor_v1

FILE: sway/commands/input.c
  type cmd_handler (line 10) | struct cmd_handler
  type cmd_handler (line 47) | struct cmd_handler
  type cmd_results (line 52) | struct cmd_results
  type cmd_results (line 53) | struct cmd_results
  type cmd_results (line 65) | struct cmd_results
  type input_config (line 84) | struct input_config

FILE: sway/commands/input/accel_profile.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results
  type input_config (line 12) | struct input_config

FILE: sway/commands/input/calibration_matrix.c
  type cmd_results (line 10) | struct cmd_results
  type cmd_results (line 11) | struct cmd_results
  type input_config (line 15) | struct input_config

FILE: sway/commands/input/click_method.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type input_config (line 13) | struct input_config

FILE: sway/commands/input/clickfinger_button_map.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results
  type input_config (line 12) | struct input_config

FILE: sway/commands/input/drag.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type input_config (line 13) | struct input_config

FILE: sway/commands/input/drag_lock.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type input_config (line 13) | struct input_config

FILE: sway/commands/input/dwt.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type input_config (line 13) | struct input_config

FILE: sway/commands/input/dwtp.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type input_config (line 13) | struct input_config

FILE: sway/commands/input/events.c
  function toggle_supported_send_events_for_device (line 15) | static void toggle_supported_send_events_for_device(struct input_config ...
  function mode_for_name (line 53) | static int mode_for_name(const char *name) {
  function toggle_select_send_events_for_device (line 64) | static void toggle_select_send_events_for_device(struct input_config *ic,
  function toggle_send_events (line 86) | static void toggle_send_events(int argc, char **argv) {
  type cmd_results (line 119) | struct cmd_results
  type cmd_results (line 120) | struct cmd_results
  type input_config (line 124) | struct input_config

FILE: sway/commands/input/left_handed.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type input_config (line 13) | struct input_config

FILE: sway/commands/input/map_from_region.c
  function parse_coords (line 9) | static bool parse_coords(const char *str, double *x, double *y, bool *mm) {
  type cmd_results (line 45) | struct cmd_results
  type cmd_results (line 46) | struct cmd_results
  type input_config (line 50) | struct input_config
  type input_config_mapped_from_region (line 56) | struct input_config_mapped_from_region

FILE: sway/commands/input/map_to_output.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type input_config (line 13) | struct input_config

FILE: sway/commands/input/map_to_region.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results
  type input_config (line 11) | struct input_config
  type wlr_box (line 17) | struct wlr_box

FILE: sway/commands/input/middle_emulation.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type input_config (line 13) | struct input_config

FILE: sway/commands/input/natural_scroll.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type input_config (line 13) | struct input_config

FILE: sway/commands/input/pointer_accel.c
  type cmd_results (line 9) | struct cmd_results
  type cmd_results (line 10) | struct cmd_results
  type input_config (line 14) | struct input_config

FILE: sway/commands/input/repeat_delay.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results
  type input_config (line 12) | struct input_config

FILE: sway/commands/input/repeat_rate.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results
  type input_config (line 12) | struct input_config

FILE: sway/commands/input/rotation_angle.c
  type cmd_results (line 9) | struct cmd_results
  type cmd_results (line 10) | struct cmd_results
  type input_config (line 14) | struct input_config

FILE: sway/commands/input/scroll_button.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results
  type input_config (line 11) | struct input_config

FILE: sway/commands/input/scroll_button_lock.c
  type cmd_results (line 9) | struct cmd_results
  type cmd_results (line 10) | struct cmd_results
  type input_config (line 14) | struct input_config

FILE: sway/commands/input/scroll_factor.c
  type cmd_results (line 10) | struct cmd_results
  type cmd_results (line 11) | struct cmd_results
  type input_config (line 15) | struct input_config

FILE: sway/commands/input/scroll_method.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results
  type input_config (line 12) | struct input_config

FILE: sway/commands/input/tap.c
  type cmd_results (line 9) | struct cmd_results
  type cmd_results (line 10) | struct cmd_results
  type input_config (line 14) | struct input_config

FILE: sway/commands/input/tap_button_map.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results
  type input_config (line 12) | struct input_config

FILE: sway/commands/input/tool_mode.c
  function set_tool_mode (line 5) | static void set_tool_mode(struct input_config *ic,
  type cmd_results (line 23) | struct cmd_results
  type cmd_results (line 24) | struct cmd_results
  type input_config (line 29) | struct input_config
  type sway_tablet_tool_mode (line 34) | enum sway_tablet_tool_mode
  type wlr_tablet_tool_type (line 50) | enum wlr_tablet_tool_type

FILE: sway/commands/input/xkb_capslock.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type input_config (line 13) | struct input_config

FILE: sway/commands/input/xkb_file.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type input_config (line 13) | struct input_config

FILE: sway/commands/input/xkb_layout.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results
  type input_config (line 10) | struct input_config

FILE: sway/commands/input/xkb_model.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results
  type input_config (line 10) | struct input_config

FILE: sway/commands/input/xkb_numlock.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results
  type input_config (line 10) | struct input_config

FILE: sway/commands/input/xkb_options.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results
  type input_config (line 10) | struct input_config

FILE: sway/commands/input/xkb_rules.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results
  type input_config (line 10) | struct input_config

FILE: sway/commands/input/xkb_switch_layout.c
  type xkb_switch_layout_action (line 9) | struct xkb_switch_layout_action {
  function switch_layout (line 14) | static void switch_layout(struct wlr_keyboard *kbd, xkb_layout_index_t i...
  function xkb_layout_index_t (line 23) | static xkb_layout_index_t get_current_layout_index(struct wlr_keyboard *...
  function xkb_layout_index_t (line 37) | static xkb_layout_index_t get_layout_relative(struct wlr_keyboard *kbd, ...
  type cmd_results (line 43) | struct cmd_results
  type cmd_results (line 44) | struct cmd_results
  type input_config (line 48) | struct input_config
  type xkb_switch_layout_action (line 75) | struct xkb_switch_layout_action
  type xkb_switch_layout_action (line 77) | struct xkb_switch_layout_action
  type sway_input_device (line 87) | struct sway_input_device
  type wlr_keyboard (line 98) | struct wlr_keyboard
  type xkb_switch_layout_action (line 106) | struct xkb_switch_layout_action

FILE: sway/commands/input/xkb_variant.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results
  type input_config (line 10) | struct input_config

FILE: sway/commands/kill.c
  function close_container_iterator (line 9) | static void close_container_iterator(struct sway_container *con, void *d...
  type cmd_results (line 15) | struct cmd_results
  type sway_container (line 20) | struct sway_container
  type sway_workspace (line 21) | struct sway_workspace

FILE: sway/commands/layout.c
  function parse_layout_string (line 11) | static enum sway_container_layout parse_layout_string(char *s) {
  function toggle_split_layout (line 29) | static enum sway_container_layout toggle_split_layout(
  function get_layout_toggle (line 47) | static enum sway_container_layout get_layout_toggle(int argc, char **argv,
  function get_layout (line 96) | static enum sway_container_layout get_layout(int argc, char **argv,
  type cmd_results (line 117) | struct cmd_results
  type cmd_results (line 118) | struct cmd_results
  type sway_container (line 126) | struct sway_container
  type sway_workspace (line 127) | struct sway_workspace
  type sway_container (line 141) | struct sway_container
  type sway_container (line 143) | struct sway_container
  type sway_container (line 144) | struct sway_container
  type sway_container_layout (line 155) | enum sway_container_layout
  type sway_container_layout (line 156) | enum sway_container_layout

FILE: sway/commands/mark.c
  type cmd_results (line 15) | struct cmd_results
  type cmd_results (line 16) | struct cmd_results
  type sway_container (line 20) | struct sway_container

FILE: sway/commands/max_render_time.c
  type cmd_results (line 6) | struct cmd_results
  type sway_container (line 22) | struct sway_container
  type sway_view (line 28) | struct sway_view

FILE: sway/commands/mode.c
  type cmd_handler (line 11) | struct cmd_handler
  type cmd_results (line 23) | struct cmd_results
  type cmd_results (line 24) | struct cmd_results
  type sway_mode (line 43) | struct sway_mode
  type sway_mode (line 46) | struct sway_mode
  type sway_mode (line 54) | struct sway_mode
  type sway_mode (line 72) | struct sway_mode
  type cmd_results (line 84) | struct cmd_results

FILE: sway/commands/mouse_warping.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results

FILE: sway/commands/move.c
  type sway_output (line 30) | struct sway_output
  type sway_output (line 31) | struct sway_output
  type sway_workspace (line 33) | struct sway_workspace
  type wlr_direction (line 43) | enum wlr_direction
  type wlr_direction (line 51) | enum wlr_direction
  type wlr_output (line 61) | struct wlr_output
  function is_parallel (line 79) | static bool is_parallel(enum sway_container_layout layout,
  function workspace_focus_fullscreen (line 96) | static void workspace_focus_fullscreen(struct sway_workspace *workspace) {
  function container_move_to_container_from_direction (line 112) | static void container_move_to_container_from_direction(
  function container_move_to_workspace_from_direction (line 168) | static void container_move_to_workspace_from_direction(
  function container_move_to_workspace (line 198) | static void container_move_to_workspace(struct sway_container *container,
  function container_move_to_container (line 241) | static void container_move_to_container(struct sway_container *container,
  function container_move_to_next_output (line 277) | static bool container_move_to_next_output(struct sway_container *container,
  function container_move_in_direction (line 301) | static bool container_move_in_direction(struct sway_container *container,
  type cmd_results (line 417) | struct cmd_results
  type cmd_results (line 419) | struct cmd_results
  type cmd_results (line 421) | struct cmd_results
  type sway_node (line 427) | struct sway_node
  type sway_workspace (line 428) | struct sway_workspace
  type sway_container (line 429) | struct sway_container
  type sway_seat (line 443) | struct sway_seat
  type sway_container (line 444) | struct sway_container
  type sway_workspace (line 445) | struct sway_workspace
  type sway_output (line 446) | struct sway_output
  type sway_node (line 447) | struct sway_node
  type sway_workspace (line 452) | struct sway_workspace
  type sway_output (line 503) | struct sway_output
  type sway_container (line 516) | struct sway_container
  type sway_output (line 519) | struct sway_output
  type sway_container (line 527) | struct sway_container
  type sway_output (line 548) | struct sway_output
  type sway_workspace (line 549) | struct sway_workspace
  type sway_node (line 555) | struct sway_node
  type sway_output (line 567) | struct sway_output
  type sway_workspace (line 568) | struct sway_workspace
  type sway_workspace (line 584) | struct sway_workspace
  type sway_node (line 593) | struct sway_node
  function workspace_move_to_output (line 630) | static void workspace_move_to_output(struct sway_workspace *workspace,
  type cmd_results (line 664) | struct cmd_results
  type cmd_results (line 665) | struct cmd_results
  type sway_workspace (line 679) | struct sway_workspace
  type sway_output (line 684) | struct sway_output
  type sway_output (line 687) | struct sway_output
  type sway_seat (line 698) | struct sway_seat
  type cmd_results (line 704) | struct cmd_results
  type wlr_direction (line 705) | enum wlr_direction
  type sway_container (line 715) | struct sway_container
  type sway_workspace (line 744) | struct sway_workspace
  type sway_container (line 745) | struct sway_container
  type sway_workspace (line 759) | struct sway_workspace
  type cmd_results (line 779) | struct cmd_results
  type sway_container (line 780) | struct sway_container
  type sway_seat (line 781) | struct sway_seat
  type wlr_cursor (line 785) | struct wlr_cursor
  type wlr_output (line 791) | struct wlr_output
  type wlr_box (line 794) | struct wlr_box
  type cmd_results (line 816) | struct cmd_results
  type sway_container (line 817) | struct sway_container
  type sway_workspace (line 855) | struct sway_workspace
  type sway_seat (line 857) | struct sway_seat
  type movement_amount (line 871) | struct movement_amount
  type movement_amount (line 884) | struct movement_amount
  type sway_workspace (line 896) | struct sway_workspace
  type sway_seat (line 898) | struct sway_seat
  type cmd_results (line 953) | struct cmd_results
  type sway_node (line 954) | struct sway_node
  type sway_container (line 955) | struct sway_container
  type sway_workspace (line 956) | struct sway_workspace
  type cmd_results (line 995) | struct cmd_results
  type cmd_results (line 996) | struct cmd_results

FILE: sway/commands/new_float.c
  type cmd_results (line 5) | struct cmd_results

FILE: sway/commands/new_window.c
  type cmd_results (line 5) | struct cmd_results

FILE: sway/commands/no_focus.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results
  type criteria (line 14) | struct criteria

FILE: sway/commands/nop.c
  type cmd_results (line 3) | struct cmd_results

FILE: sway/commands/opacity.c
  type cmd_results (line 9) | struct cmd_results
  type cmd_results (line 10) | struct cmd_results
  type sway_container (line 15) | struct sway_container

FILE: sway/commands/output.c
  type cmd_handler (line 9) | struct cmd_handler
  type cmd_results (line 36) | struct cmd_results
  type cmd_results (line 37) | struct cmd_results
  type output_config (line 49) | struct output_config
  type sway_output (line 56) | struct sway_output

FILE: sway/commands/output/adaptive_sync.c
  type cmd_results (line 7) | struct cmd_results
  type sway_output (line 23) | struct sway_output

FILE: sway/commands/output/allow_tearing.c
  type cmd_results (line 5) | struct cmd_results

FILE: sway/commands/output/background.c
  function validate_color (line 19) | static bool validate_color(const char *color) {
  type cmd_results (line 29) | struct cmd_results
  type output_config (line 42) | struct output_config
  type cmd_results (line 80) | struct cmd_results
  type cmd_results (line 128) | struct cmd_results

FILE: sway/commands/output/color_profile.c
  function read_file_into_buf (line 10) | static bool read_file_into_buf(const char *path, void **buf, size_t *siz...
  type cmd_results (line 54) | struct cmd_results
  type color_profile (line 59) | enum color_profile
  type cmd_results (line 97) | struct cmd_results
  type wlr_color_transform (line 112) | struct wlr_color_transform

FILE: sway/commands/output/disable.c
  type cmd_results (line 4) | struct cmd_results

FILE: sway/commands/output/dpms.c
  type cmd_results (line 4) | struct cmd_results

FILE: sway/commands/output/enable.c
  type cmd_results (line 4) | struct cmd_results

FILE: sway/commands/output/hdr.c
  type cmd_results (line 7) | struct cmd_results
  type sway_output (line 23) | struct sway_output

FILE: sway/commands/output/max_render_time.c
  type cmd_results (line 5) | struct cmd_results

FILE: sway/commands/output/mode.c
  type cmd_results (line 5) | struct cmd_results
  type output_config (line 13) | struct output_config
  function parse_modeline (line 64) | static bool parse_modeline(char **argv, drmModeModeInfo *mode) {
  type cmd_results (line 100) | struct cmd_results
  type output_config (line 108) | struct output_config

FILE: sway/commands/output/position.c
  type cmd_results (line 5) | struct cmd_results

FILE: sway/commands/output/power.c
  type cmd_results (line 7) | struct cmd_results
  type sway_output (line 23) | struct sway_output

FILE: sway/commands/output/render_bit_depth.c
  type cmd_results (line 6) | struct cmd_results

FILE: sway/commands/output/scale.c
  type cmd_results (line 5) | struct cmd_results

FILE: sway/commands/output/scale_filter.c
  type cmd_results (line 7) | struct cmd_results
  type scale_filter_mode (line 17) | enum scale_filter_mode
  type output_config (line 28) | struct output_config

FILE: sway/commands/output/subpixel.c
  type cmd_results (line 7) | struct cmd_results
  type wl_output_subpixel (line 14) | enum wl_output_subpixel
  type output_config (line 30) | struct output_config

FILE: sway/commands/output/toggle.c
  type cmd_results (line 5) | struct cmd_results
  type output_config (line 10) | struct output_config
  type sway_output (line 17) | struct sway_output

FILE: sway/commands/output/transform.c
  function invert_rotation_direction (line 8) | static enum wl_output_transform invert_rotation_direction(
  type cmd_results (line 24) | struct cmd_results
  type wl_output_transform (line 32) | enum wl_output_transform
  type output_config (line 58) | struct output_config
  type sway_output (line 74) | struct sway_output
  type wlr_output (line 82) | struct wlr_output

FILE: sway/commands/output/unplug.c
  function is_backend_allowed (line 12) | static bool is_backend_allowed(struct wlr_backend *backend) {
  type cmd_results (line 30) | struct cmd_results
  type sway_output (line 40) | struct sway_output

FILE: sway/commands/popup_during_fullscreen.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results

FILE: sway/commands/primary_selection.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results

FILE: sway/commands/reload.c
  function title_bar_update_iterator (line 11) | static void title_bar_update_iterator(struct sway_container *con, void *...
  function do_reload (line 15) | static void do_reload(void *data) {
  type cmd_results (line 54) | struct cmd_results
  type cmd_results (line 55) | struct cmd_results

FILE: sway/commands/rename.c
  type cmd_results (line 19) | struct cmd_results
  type cmd_results (line 20) | struct cmd_results
  type sway_workspace (line 33) | struct sway_workspace
  type sway_workspace (line 83) | struct sway_workspace

FILE: sway/commands/resize.c
  function parse_resize_axis (line 19) | static uint32_t parse_resize_axis(const char *axis) {
  function is_horizontal (line 41) | static bool is_horizontal(uint32_t axis) {
  type sway_container (line 45) | struct sway_container
  type sway_container (line 45) | struct sway_container
  type sway_container_layout (line 47) | enum sway_container_layout
  function container_resize_tiled (line 66) | void container_resize_tiled(struct sway_container *con,
  type cmd_results (line 180) | struct cmd_results
  type movement_amount (line 181) | struct movement_amount
  type sway_container (line 182) | struct sway_container
  type cmd_results (line 237) | struct cmd_results
  type movement_amount (line 238) | struct movement_amount
  type sway_container (line 239) | struct sway_container
  type sway_container (line 249) | struct sway_container
  type cmd_results (line 286) | struct cmd_results
  type sway_container (line 286) | struct sway_container
  type movement_amount (line 287) | struct movement_amount
  type movement_amount (line 287) | struct movement_amount
  type sway_container (line 297) | struct sway_container
  type sway_container (line 318) | struct sway_container
  type cmd_results (line 341) | struct cmd_results
  type sway_container (line 341) | struct sway_container
  type movement_amount (line 342) | struct movement_amount
  type movement_amount (line 342) | struct movement_amount
  type cmd_results (line 412) | struct cmd_results
  type cmd_results (line 413) | struct cmd_results
  type movement_amount (line 422) | struct movement_amount
  type movement_amount (line 436) | struct movement_amount
  type sway_container (line 451) | struct sway_container
  type cmd_results (line 472) | struct cmd_results
  type movement_amount (line 483) | struct movement_amount
  type movement_amount (line 505) | struct movement_amount
  type sway_container (line 522) | struct sway_container
  type cmd_results (line 554) | struct cmd_results
  type sway_container (line 559) | struct sway_container
  type cmd_results (line 564) | struct cmd_results

FILE: sway/commands/scratchpad.c
  function scratchpad_toggle_auto (line 11) | static void scratchpad_toggle_auto(void) {
  function scratchpad_toggle_container (line 75) | static void scratchpad_toggle_container(struct sway_container *con) {
  type cmd_results (line 92) | struct cmd_results
  type cmd_results (line 93) | struct cmd_results
  type sway_container (line 109) | struct sway_container

FILE: sway/commands/seat.c
  type cmd_handler (line 11) | struct cmd_handler
  type cmd_handler (line 17) | struct cmd_handler
  type cmd_results (line 29) | struct cmd_results
  type cmd_results (line 30) | struct cmd_results
  type cmd_results (line 37) | struct cmd_results
  type cmd_results (line 38) | struct cmd_results
  type seat_config (line 43) | struct seat_config
  type cmd_results (line 53) | struct cmd_results
  type cmd_results (line 54) | struct cmd_results
  type cmd_results (line 73) | struct cmd_results

FILE: sway/commands/seat/attach.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results
  type seat_attachment_config (line 18) | struct seat_attachment_config

FILE: sway/commands/seat/cursor.c
  type cmd_results (line 10) | struct cmd_results
  type sway_cursor (line 10) | struct sway_cursor
  type cmd_results (line 17) | struct cmd_results
  type sway_cursor (line 17) | struct sway_cursor
  type cmd_results (line 42) | struct cmd_results
  type cmd_results (line 52) | struct cmd_results
  type cmd_results (line 53) | struct cmd_results
  type seat_config (line 57) | struct seat_config
  type sway_seat (line 67) | struct sway_seat
  type sway_seat (line 74) | struct sway_seat
  type cmd_results (line 86) | struct cmd_results
  type sway_cursor (line 86) | struct sway_cursor
  type wl_pointer_button_state (line 88) | enum wl_pointer_button_state
  type cmd_results (line 101) | struct cmd_results
  type wl_pointer_axis (line 108) | enum wl_pointer_axis
  type wlr_pointer_axis_event (line 114) | struct wlr_pointer_axis_event

FILE: sway/commands/seat/fallback.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results

FILE: sway/commands/seat/hide_cursor.c
  type cmd_results (line 10) | struct cmd_results
  type cmd_results (line 11) | struct cmd_results
  type seat_config (line 18) | struct seat_config
  type sway_seat (line 42) | struct sway_seat

FILE: sway/commands/seat/idle.c
  function parse_sources (line 22) | static uint32_t parse_sources(int argc, char **argv) {
  type cmd_results (line 41) | struct cmd_results
  type cmd_results (line 42) | struct cmd_results
  type cmd_results (line 58) | struct cmd_results
  type cmd_results (line 59) | struct cmd_results

FILE: sway/commands/seat/keyboard_grouping.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results
  type seat_config (line 15) | struct seat_config

FILE: sway/commands/seat/pointer_constraint.c
  type operation (line 9) | enum operation {
  type cmd_results (line 16) | struct cmd_results
  type cmd_results (line 17) | struct cmd_results
  type operation (line 25) | enum operation
  type seat_config (line 40) | struct seat_config
  type sway_seat (line 50) | struct sway_seat

FILE: sway/commands/seat/shortcuts_inhibitor.c
  type cmd_results (line 8) | struct cmd_results
  type seat_config (line 8) | struct seat_config
  type sway_seat (line 9) | struct sway_seat
  type sway_keyboard_shortcuts_inhibitor (line 10) | struct sway_keyboard_shortcuts_inhibitor
  type wlr_keyboard_shortcuts_inhibitor_v1 (line 28) | struct wlr_keyboard_shortcuts_inhibitor_v1
  type cmd_results (line 56) | struct cmd_results
  type cmd_results (line 57) | struct cmd_results
  type seat_config (line 63) | struct seat_config
  type sway_seat (line 79) | struct sway_seat
  type sway_seat (line 86) | struct sway_seat

FILE: sway/commands/seat/xcursor_theme.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results

FILE: sway/commands/set.c
  function compare_set_qsort (line 11) | static int compare_set_qsort(const void *_l, const void *_r) {
  function free_sway_variable (line 17) | void free_sway_variable(struct sway_variable *var) {
  type cmd_results (line 26) | struct cmd_results
  type cmd_results (line 27) | struct cmd_results
  type sway_variable (line 36) | struct sway_variable
  type sway_variable (line 49) | struct sway_variable

FILE: sway/commands/shortcuts_inhibitor.c
  type cmd_results (line 10) | struct cmd_results
  type cmd_results (line 11) | struct cmd_results
  type sway_container (line 16) | struct sway_container
  type sway_view (line 22) | struct sway_view
  type sway_seat (line 28) | struct sway_seat
  type sway_keyboard_shortcuts_inhibitor (line 30) | struct sway_keyboard_shortcuts_inhibitor

FILE: sway/commands/show_marks.c
  function title_bar_update_iterator (line 12) | static void title_bar_update_iterator(struct sway_container *con, void *...
  type cmd_results (line 16) | struct cmd_results
  type cmd_results (line 17) | struct cmd_results

FILE: sway/commands/smart_borders.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results

FILE: sway/commands/smart_gaps.c
  type cmd_results (line 11) | struct cmd_results
  type cmd_results (line 12) | struct cmd_results

FILE: sway/commands/split.c
  type cmd_results (line 12) | struct cmd_results
  type sway_container (line 13) | struct sway_container
  type sway_workspace (line 14) | struct sway_workspace
  type cmd_results (line 35) | struct cmd_results
  type sway_container (line 36) | struct sway_container
  type sway_workspace (line 37) | struct sway_workspace
  type cmd_results (line 53) | struct cmd_results
  type cmd_results (line 54) | struct cmd_results
  type sway_container (line 69) | struct sway_container
  type cmd_results (line 86) | struct cmd_results
  type cmd_results (line 87) | struct cmd_results
  type cmd_results (line 94) | struct cmd_results
  type cmd_results (line 95) | struct cmd_results
  type cmd_results (line 102) | struct cmd_results
  type cmd_results (line 103) | struct cmd_results
  type sway_container (line 108) | struct sway_container

FILE: sway/commands/sticky.c
  type cmd_results (line 15) | struct cmd_results
  type cmd_results (line 16) | struct cmd_results
  type sway_container (line 20) | struct sway_container
  type sway_workspace (line 31) | struct sway_workspace
  type sway_workspace (line 39) | struct sway_workspace

FILE: sway/commands/swap.c
  function test_con_id (line 16) | static bool test_con_id(struct sway_container *container, void *data) {
  function test_id (line 22) | static bool test_id(struct sway_container *container, void *data) {
  function test_mark (line 29) | static bool test_mark(struct sway_container *container, void *mark) {
  type cmd_results (line 37) | struct cmd_results
  type cmd_results (line 38) | struct cmd_results
  type sway_container (line 51) | struct sway_container
  type sway_container (line 52) | struct sway_container
  type sway_node (line 96) | struct sway_node
  type sway_node (line 97) | struct sway_node

FILE: sway/commands/swaybg_command.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/swaynag_command.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/tiling_drag.c
  type cmd_results (line 4) | struct cmd_results
  type cmd_results (line 5) | struct cmd_results

FILE: sway/commands/tiling_drag_threshold.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/title_align.c
  function arrange_title_bar_iterator (line 7) | static void arrange_title_bar_iterator(struct sway_container *con, void ...
  type cmd_results (line 11) | struct cmd_results
  type cmd_results (line 12) | struct cmd_results

FILE: sway/commands/title_format.c
  type cmd_results (line 9) | struct cmd_results
  type cmd_results (line 10) | struct cmd_results
  type sway_container (line 14) | struct sway_container

FILE: sway/commands/titlebar_border_thickness.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type sway_output (line 23) | struct sway_output
  type sway_workspace (line 24) | struct sway_workspace

FILE: sway/commands/titlebar_padding.c
  type cmd_results (line 8) | struct cmd_results
  type cmd_results (line 9) | struct cmd_results
  type sway_output (line 34) | struct sway_output

FILE: sway/commands/unmark.c
  function remove_mark (line 10) | static void remove_mark(struct sway_container *con) {
  function remove_all_marks_iterator (line 15) | static void remove_all_marks_iterator(struct sway_container *con, void *...
  type cmd_results (line 24) | struct cmd_results
  type sway_container (line 26) | struct sway_container

FILE: sway/commands/urgent.c
  type cmd_results (line 9) | struct cmd_results
  type cmd_results (line 10) | struct cmd_results
  type sway_container (line 14) | struct sway_container
  type sway_view (line 21) | struct sway_view

FILE: sway/commands/workspace.c
  type workspace_config (line 13) | struct workspace_config
  type workspace_config (line 14) | struct workspace_config
  type workspace_config (line 18) | struct workspace_config
  function free_workspace_config (line 33) | void free_workspace_config(struct workspace_config *wsc) {
  function prevent_invalid_outer_gaps (line 39) | static void prevent_invalid_outer_gaps(struct workspace_config *wsc) {
  type cmd_results (line 58) | struct cmd_results
  type cmd_results (line 65) | struct cmd_results
  type workspace_config (line 71) | struct workspace_config
  type cmd_results (line 124) | struct cmd_results
  type cmd_results (line 125) | struct cmd_results
  type workspace_config (line 154) | struct workspace_config
  type sway_seat (line 189) | struct sway_seat
  type sway_workspace (line 191) | struct sway_workspace

FILE: sway/commands/workspace_layout.c
  type cmd_results (line 5) | struct cmd_results
  type cmd_results (line 6) | struct cmd_results

FILE: sway/commands/ws_auto_back_and_forth.c
  type cmd_results (line 6) | struct cmd_results
  type cmd_results (line 7) | struct cmd_results

FILE: sway/commands/xwayland.c
  type cmd_results (line 7) | struct cmd_results
  type cmd_results (line 8) | struct cmd_results
  type xwayland_mode (line 14) | enum xwayland_mode

FILE: sway/config.c
  type sway_config (line 38) | struct sway_config
  type xkb_state (line 40) | struct xkb_state
  type xkb_rule_names (line 41) | struct xkb_rule_names
  type xkb_context (line 42) | struct xkb_context
  type xkb_keymap (line 43) | struct xkb_keymap
  function keysym_translation_state_destroy (line 56) | static void keysym_translation_state_destroy(
  function free_mode (line 65) | static void free_mode(struct sway_mode *mode) {
  function free_config (line 103) | void free_config(struct sway_config *config) {
  function destroy_removed_seats (line 185) | static void destroy_removed_seats(struct sway_config *old_config,
  function config_defaults (line 208) | static void config_defaults(struct sway_config *config) {
  function file_exists (line 362) | static bool file_exists(const char *path) {
  type config_path (line 384) | struct config_path {
  type config_path (line 389) | struct config_path
  function load_config (line 415) | static bool load_config(const char *path, struct sway_config *config,
  function load_main_config (line 446) | bool load_main_config(const char *file, bool is_active, bool validating) {
  function load_include_config (line 555) | static bool load_include_config(const char *path, struct sway_config *co...
  function load_include_configs (line 596) | void load_include_configs(const char *path, struct sway_config *config,
  function run_deferred_commands (line 626) | void run_deferred_commands(void) {
  function run_deferred_bindings (line 648) | void run_deferred_bindings(void) {
  function getline_with_cont (line 666) | static ssize_t getline_with_cont(char **lineptr, size_t *line_size, FILE...
  function detect_brace (line 696) | static int detect_brace(FILE *file) {
  function read_config (line 732) | bool read_config(FILE *file, struct sway_config *config,
  function config_add_swaynag_warning (line 871) | void config_add_swaynag_warning(char *fmt, ...) {
  type sway_variable (line 911) | struct sway_variable
  function workspace_output_cmp_workspace (line 945) | int workspace_output_cmp_workspace(const void *a, const void *b) {
  function config_update_font_height (line 951) | void config_update_font_height(void) {
  function translate_binding_list (line 961) | static void translate_binding_list(list_t *bindings, list_t *bindsyms,
  function translate_keysyms (line 983) | void translate_keysyms(struct input_config *input_config) {

FILE: sway/config/bar.c
  function free_bar_binding (line 22) | void free_bar_binding(struct bar_binding *binding) {
  function free_bar_config (line 30) | void free_bar_config(struct bar_config *bar) {
  type bar_config (line 86) | struct bar_config
  type bar_config (line 87) | struct bar_config
  type bar_config (line 88) | struct bar_config
  function handle_swaybar_client_destroy (line 184) | static void handle_swaybar_client_destroy(struct wl_listener *listener,
  function invoke_swaybar (line 192) | static void invoke_swaybar(struct bar_config *bar) {
  function load_swaybar (line 241) | void load_swaybar(struct bar_config *bar) {
  function load_swaybars (line 249) | void load_swaybars(void) {

FILE: sway/config/input.c
  type input_config (line 9) | struct input_config
  type input_config (line 10) | struct input_config
  type input_config (line 10) | struct input_config
  function merge_input_config (line 52) | void merge_input_config(struct input_config *dst, struct input_config *s...
  function validate_xkb_merge (line 191) | static bool validate_xkb_merge(struct input_config *dest,
  function validate_wildcard_on_all (line 209) | static bool validate_wildcard_on_all(struct input_config *wildcard,
  function merge_wildcard_on_all (line 234) | static void merge_wildcard_on_all(struct input_config *wildcard) {
  function validate_type_on_existing (line 250) | static bool validate_type_on_existing(struct input_config *type_wildcard,
  function merge_type_on_existing (line 269) | static void merge_type_on_existing(struct input_config *type_wildcard) {
  type input_config (line 285) | struct input_config
  type sway_input_device (line 286) | struct sway_input_device
  type input_config (line 296) | struct input_config
  type input_config (line 296) | struct input_config
  type input_config (line 311) | struct input_config
  type input_config (line 321) | struct input_config
  function input_config_fill_rule_names (line 371) | void input_config_fill_rule_names(struct input_config *ic,
  function free_input_config (line 380) | void free_input_config(struct input_config *ic) {
  function input_identifier_cmp (line 398) | int input_identifier_cmp(const void *item, const void *data) {

FILE: sway/config/output.c
  function output_get_identifier (line 31) | void output_get_identifier(char *identifier, size_t len,
  type scale_filter_mode (line 40) | enum scale_filter_mode
  type output_config (line 55) | struct output_config
  type output_config (line 56) | struct output_config
  type output_config (line 56) | struct output_config
  function supersede_output_config (line 87) | static void supersede_output_config(struct output_config *dst, struct ou...
  function merge_output_config (line 164) | static void merge_output_config(struct output_config *dst, struct output...
  function store_output_config (line 241) | void store_output_config(struct output_config *oc) {
  function set_mode (line 296) | static void set_mode(struct wlr_output *output, struct wlr_output_state ...
  function set_modeline (line 335) | static void set_modeline(struct wlr_output *output,
  function output_supports_hdr (line 351) | bool output_supports_hdr(struct wlr_output *output, const char **unsuppo...
  function set_hdr (line 366) | static void set_hdr(struct wlr_output *output, struct wlr_output_state *...
  function phys_size_is_aspect_ratio (line 392) | static bool phys_size_is_aspect_ratio(struct wlr_output *output) {
  function compute_default_scale (line 408) | static int compute_default_scale(struct wlr_output *output,
  function bit_depth_from_format (line 453) | static enum render_bit_depth bit_depth_from_format(uint32_t render_forma...
  function get_config_render_bit_depth (line 464) | static enum render_bit_depth get_config_render_bit_depth(const struct ou...
  function render_format_is_bgr (line 474) | static bool render_format_is_bgr(uint32_t fmt) {
  function output_config_is_disabling (line 478) | static bool output_config_is_disabling(struct output_config *oc) {
  function queue_output_config (line 482) | static void queue_output_config(struct output_config *oc,
  type config_output_state (line 567) | struct config_output_state {
  function config_output_state_finish (line 571) | static void config_output_state_finish(struct config_output_state *state) {
  type wlr_color_transform (line 575) | struct wlr_color_transform
  type wlr_output (line 575) | struct wlr_output
  type wlr_color_transform (line 576) | struct wlr_color_transform
  type wlr_color_primaries (line 577) | struct wlr_color_primaries
  type wlr_color_primaries (line 580) | struct wlr_color_primaries
  type wlr_color_transform (line 600) | struct wlr_color_transform
  type wlr_color_transform (line 604) | struct wlr_color_transform
  type wlr_color_transform (line 611) | struct wlr_color_transform
  type wlr_color_transform (line 613) | struct wlr_color_transform
  type wlr_color_transform (line 620) | struct wlr_color_transform
  type wlr_output (line 620) | struct wlr_output
  type output_config (line 621) | struct output_config
  function finalize_output_config (line 634) | static bool finalize_output_config(struct output_config *oc, struct sway...
  function output_update_position (line 694) | static void output_update_position(struct sway_output *output) {
  type output_config (line 705) | struct output_config
  type output_config (line 706) | struct output_config
  type sway_output (line 707) | struct sway_output
  type output_config (line 709) | struct output_config
  type output_config (line 720) | struct output_config
  type output_config (line 734) | struct output_config
  type sway_output (line 734) | struct sway_output
  type output_config (line 736) | struct output_config
  function config_has_manual_mode (line 740) | static bool config_has_manual_mode(struct output_config *oc) {
  type matched_output_config (line 755) | struct matched_output_config {
  type search_context (line 760) | struct search_context {
  function dump_output_state (line 768) | static void dump_output_state(struct wlr_output *wlr_output, struct wlr_...
  type search_context (line 801) | struct search_context
  function reset_output_state (line 803) | static void reset_output_state(struct wlr_output_state *state) {
  function clear_later_output_states (line 809) | static void clear_later_output_states(struct wlr_backend_output_state *s...
  function search_finish (line 823) | static bool search_finish(struct search_context *ctx, size_t output_idx) {
  function search_adaptive_sync (line 834) | static bool search_adaptive_sync(struct search_context *ctx, size_t outp...
  function search_mode (line 854) | static bool search_mode(struct search_context *ctx, size_t output_idx) {
  function search_render_format (line 892) | static bool search_render_format(struct search_context *ctx, size_t outp...
  function search_valid_config (line 933) | static bool search_valid_config(struct search_context *ctx, size_t outpu...
  function compare_matched_output_config_priority (line 965) | static int compare_matched_output_config_priority(const void *a, const v...
  function sort_output_configs_by_priority (line 991) | static void sort_output_configs_by_priority(
  function apply_resolved_output_configs (line 996) | static bool apply_resolved_output_configs(struct matched_output_config *...
  function apply_output_configs (line 1124) | bool apply_output_configs(struct output_config **ocs, size_t ocs_len,
  function apply_stored_output_configs (line 1155) | void apply_stored_output_configs(void) {
  function free_output_config (line 1160) | void free_output_config(struct output_config *oc) {
  function handle_swaybg_client_destroy (line 1172) | static void handle_swaybg_client_destroy(struct wl_listener *listener,
  function _spawn_swaybg (line 1181) | static bool _spawn_swaybg(char **command) {
  function spawn_swaybg (line 1232) | bool spawn_swaybg(void) {

FILE: sway/config/seat.c
  type seat_config (line 7) | struct seat_config
  type seat_config (line 8) | struct seat_config
  type seat_config (line 8) | struct seat_config
  function merge_wildcard_on_all (line 41) | static void merge_wildcard_on_all(struct seat_config *wildcard) {
  type seat_config (line 51) | struct seat_config
  type seat_config (line 51) | struct seat_config
  type seat_config (line 60) | struct seat_config
  type seat_config (line 69) | struct seat_config
  type seat_attachment_config (line 87) | struct seat_attachment_config
  type seat_attachment_config (line 88) | struct seat_attachment_config
  type seat_attachment_config (line 89) | struct seat_attachment_config
  function seat_attachment_config_free (line 97) | static void seat_attachment_config_free(
  type seat_attachment_config (line 103) | struct seat_attachment_config
  type seat_attachment_config (line 104) | struct seat_attachment_config
  type seat_attachment_config (line 105) | struct seat_attachment_config
  function merge_seat_attachment_config (line 115) | static void merge_seat_attachment_config(struct seat_attachment_config *...
  function merge_seat_config (line 120) | void merge_seat_config(struct seat_config *dest, struct seat_config *sou...
  type seat_config (line 184) | struct seat_config
  type seat_config (line 184) | struct seat_config
  type seat_config (line 185) | struct seat_config
  function free_seat_config (line 195) | void free_seat_config(struct seat_config *seat) {
  function seat_name_cmp (line 209) | int seat_name_cmp(const void *item, const void *data) {
  type seat_attachment_config (line 215) | struct seat_attachment_config
  type seat_config (line 216) | struct seat_config
  type seat_attachment_config (line 218) | struct seat_attachment_config

FILE: sway/criteria.c
  function criteria_is_empty (line 19) | bool criteria_is_empty(struct criteria *criteria) {
  function generate_regex (line 49) | static bool generate_regex(pcre2_code **regex, char *value) {
  function pattern_create (line 68) | static bool pattern_create(struct pattern **pattern, char *value) {
  function pattern_destroy (line 85) | static void pattern_destroy(struct pattern *pattern) {
  function criteria_destroy (line 94) | void criteria_destroy(struct criteria *criteria) {
  function regex_cmp (line 115) | static int regex_cmp(const char *item, const pcre2_code *regex) {
  function view_has_window_type (line 123) | static bool view_has_window_type(struct sway_view *view, enum atom_name ...
  function cmp_urgent (line 139) | static int cmp_urgent(const void *_a, const void *_b) {
  function find_urgent_iterator (line 156) | static void find_urgent_iterator(struct sway_container *con, void *data) {
  function has_container_criteria (line 164) | static bool has_container_criteria(struct criteria *criteria) {
  function criteria_matches_container (line 168) | static bool criteria_matches_container(struct criteria *criteria,
  function criteria_matches_view (line 193) | static bool criteria_matches_view(struct criteria *criteria,
  function list_t (line 483) | list_t *criteria_for_view(struct sway_view *view, enum criteria_type typ...
  type match_data (line 495) | struct match_data {
  function criteria_get_containers_iterator (line 500) | static void criteria_get_containers_iterator(struct sway_container *cont...
  function list_t (line 514) | list_t *criteria_get_containers(struct criteria *criteria) {
  function parse_window_type (line 525) | static enum atom_name parse_window_type(const char *type) {
  type criteria_token (line 551) | enum criteria_token {
  function token_from_name (line 578) | static enum criteria_token token_from_name(char *name) {
  function parse_token (line 625) | static bool parse_token(struct criteria *criteria, char *name, char *val...
  function skip_spaces (line 746) | static void skip_spaces(char **head) {
  function unescape (line 753) | static void unescape(char *value) {
  type criteria (line 780) | struct criteria
  type criteria (line 792) | struct criteria
  type criteria (line 792) | struct criteria
  function criteria_is_equal (line 876) | bool criteria_is_equal(struct criteria *left, struct criteria *right) {
  function criteria_already_exists (line 891) | bool criteria_already_exists(struct criteria *criteria) {

FILE: sway/decoration.c
  function server_decoration_handle_destroy (line 9) | static void server_decoration_handle_destroy(struct wl_listener *listener,
  function server_decoration_handle_mode (line 19) | static void server_decoration_handle_mode(struct wl_listener *listener,
  function handle_server_decoration (line 37) | void handle_server_decoration(struct wl_listener *listener, void *data) {
  type sway_server_decoration (line 56) | struct sway_server_decoration
  type wlr_surface (line 57) | struct wlr_surface
  type sway_server_decoration (line 58) | struct sway_server_decoration

FILE: sway/desktop/idle_inhibit_v1.c
  function destroy_inhibitor (line 12) | static void destroy_inhibitor(struct sway_idle_inhibitor_v1 *inhibitor) {
  function handle_destroy (line 19) | static void handle_destroy(struct wl_listener *listener, void *data) {
  function handle_idle_inhibitor_v1 (line 26) | void handle_idle_inhibitor_v1(struct wl_listener *listener, void *data) {
  function handle_manager_destroy (line 48) | void handle_manager_destroy(struct wl_listener *listener, void *data) {
  function sway_idle_inhibit_v1_user_inhibitor_register (line 56) | void sway_idle_inhibit_v1_user_inhibitor_register(struct sway_view *view,
  type sway_idle_inhibitor_v1 (line 76) | struct sway_idle_inhibitor_v1
  type sway_view (line 77) | struct sway_view
  type sway_idle_inhibit_manager_v1 (line 78) | struct sway_idle_inhibit_manager_v1
  type sway_idle_inhibitor_v1 (line 79) | struct sway_idle_inhibitor_v1
  type sway_idle_inhibitor_v1 (line 89) | struct sway_idle_inhibitor_v1
  type sway_view (line 90) | struct sway_view
  type sway_idle_inhibit_manager_v1 (line 91) | struct sway_idle_inhibit_manager_v1
  type sway_idle_inhibitor_v1 (line 92) | struct sway_idle_inhibitor_v1
  function sway_idle_inhibit_v1_user_inhibitor_destroy (line 102) | void sway_idle_inhibit_v1_user_inhibitor_destroy(
  function sway_idle_inhibit_v1_is_active (line 114) | bool sway_idle_inhibit_v1_is_active(struct sway_idle_inhibitor_v1 *inhib...
  function sway_idle_inhibit_v1_check_active (line 165) | void sway_idle_inhibit_v1_check_active(void) {
  function sway_idle_inhibit_manager_v1_init (line 177) | bool sway_idle_inhibit_manager_v1_init(void) {

FILE: sway/desktop/launcher.c
  function pid_t (line 19) | static pid_t get_parent_pid(pid_t child) {
  function launcher_ctx_consume (line 48) | void launcher_ctx_consume(struct launcher_ctx *ctx) {
  function launcher_ctx_destroy (line 64) | void launcher_ctx_destroy(struct launcher_ctx *ctx) {
  type launcher_ctx (line 79) | struct launcher_ctx
  type launcher_ctx (line 84) | struct launcher_ctx
  type launcher_ctx (line 88) | struct launcher_ctx
  type sway_workspace (line 104) | struct sway_workspace
  type launcher_ctx (line 105) | struct launcher_ctx
  type sway_workspace (line 106) | struct sway_workspace
  type sway_output (line 107) | struct sway_output
  function ctx_handle_node_destroy (line 142) | static void ctx_handle_node_destroy(struct wl_listener *listener, void *...
  function token_handle_destroy (line 178) | static void token_handle_destroy(struct wl_listener *listener, void *dat...
  type launcher_ctx (line 184) | struct launcher_ctx
  type wlr_xdg_activation_token_v1 (line 184) | struct wlr_xdg_activation_token_v1
  type sway_node (line 185) | struct sway_node
  type launcher_ctx (line 186) | struct launcher_ctx
  type launcher_ctx (line 186) | struct launcher_ctx
  type sway_workspace (line 189) | struct sway_workspace
  type sway_output (line 200) | struct sway_output
  function launch_ctx_handle_seat_destroy (line 235) | static void launch_ctx_handle_seat_destroy(struct wl_listener *listener,...
  type launcher_ctx (line 242) | struct launcher_ctx
  type sway_seat (line 243) | struct sway_seat
  type sway_workspace (line 244) | struct sway_workspace
  type wlr_xdg_activation_token_v1 (line 250) | struct wlr_xdg_activation_token_v1
  type launcher_ctx (line 253) | struct launcher_ctx
  type launcher_ctx (line 265) | struct launcher_ctx

FILE: sway/desktop/layer_shell.c
  type wlr_layer_surface_v1 (line 23) | struct wlr_layer_surface_v1
  type wlr_surface (line 24) | struct wlr_surface
  type wlr_layer_surface_v1 (line 25) | struct wlr_layer_surface_v1
  type wlr_xdg_surface (line 41) | struct wlr_xdg_surface
  function arrange_surface (line 56) | static void arrange_surface(struct sway_output *output, const struct wlr...
  function arrange_layers (line 79) | void arrange_layers(struct sway_output *output) {
  type wlr_scene_tree (line 141) | struct wlr_scene_tree
  type sway_output (line 141) | struct sway_output
  type zwlr_layer_shell_v1_layer (line 142) | enum zwlr_layer_shell_v1_layer
  type sway_layer_surface (line 158) | struct sway_layer_surface
  type wlr_scene_layer_surface_v1 (line 159) | struct wlr_scene_layer_surface_v1
  type sway_layer_surface (line 160) | struct sway_layer_surface
  type wlr_scene_tree (line 166) | struct wlr_scene_tree
  type sway_layer_surface (line 192) | struct sway_layer_surface
  type wl_client (line 193) | struct wl_client
  type sway_output (line 193) | struct sway_output
  type sway_output (line 195) | struct sway_output
  type wlr_scene_node (line 200) | struct wlr_scene_node
  type sway_layer_surface (line 202) | struct sway_layer_surface
  type wlr_layer_surface_v1 (line 208) | struct wlr_layer_surface_v1
  type wl_resource (line 209) | struct wl_resource
  function handle_node_destroy (line 219) | static void handle_node_destroy(struct wl_listener *listener, void *data) {
  function handle_surface_commit (line 259) | static void handle_surface_commit(struct wl_listener *listener, void *da...
  function handle_map (line 279) | static void handle_map(struct wl_listener *listener, void *data) {
  function handle_unmap (line 304) | static void handle_unmap(struct wl_listener *listener, void *data) {
  function popup_handle_destroy (line 317) | static void popup_handle_destroy(struct wl_listener *listener, void *dat...
  function popup_unconstrain (line 328) | static void popup_unconstrain(struct sway_layer_popup *popup) {
  function popup_handle_commit (line 353) | static void popup_handle_commit(struct wl_listener *listener, void *data) {
  function popup_handle_reposition (line 360) | static void popup_handle_reposition(struct wl_listener *listener, void *...
  type wl_listener (line 365) | struct wl_listener
  type sway_layer_popup (line 367) | struct sway_layer_popup
  type wlr_xdg_popup (line 367) | struct wlr_xdg_popup
  type sway_layer_surface (line 368) | struct sway_layer_surface
  type wlr_scene_tree (line 368) | struct wlr_scene_tree
  type sway_layer_popup (line 369) | struct sway_layer_popup
  function popup_handle_new_popup (line 396) | static void popup_handle_new_popup(struct wl_listener *listener, void *d...
  function handle_new_popup (line 403) | static void handle_new_popup(struct wl_listener *listener, void *data) {
  function handle_layer_shell_surface (line 410) | void handle_layer_shell_surface(struct wl_listener *listener, void *data) {
  function destroy_layers (line 500) | void destroy_layers(struct sway_output *output) {

FILE: sway/desktop/output.c
  function output_match_name_or_id (line 43) | bool output_match_name_or_id(struct sway_output *output,
  type sway_output (line 55) | struct sway_output
  type sway_output (line 57) | struct sway_output
  type sway_output (line 65) | struct sway_output
  type sway_output (line 66) | struct sway_output
  type sway_workspace (line 76) | struct sway_workspace
  type sway_output (line 76) | struct sway_output
  type sway_seat (line 77) | struct sway_seat
  type sway_node (line 78) | struct sway_node
  type send_frame_done_data (line 88) | struct send_frame_done_data {
  type buffer_timer (line 94) | struct buffer_timer {
  function handle_buffer_timer (line 99) | static int handle_buffer_timer(void *data) {
  function handle_buffer_timer_destroy (line 108) | static void handle_buffer_timer_destroy(struct wl_listener *listener,
  type buffer_timer (line 117) | struct buffer_timer
  type wlr_scene_surface (line 117) | struct wlr_scene_surface
  type wlr_scene_buffer (line 118) | struct wlr_scene_buffer
  type buffer_timer (line 120) | struct buffer_timer
  type buffer_timer (line 126) | struct buffer_timer
  function send_frame_done_iterator (line 146) | static void send_frame_done_iterator(struct wlr_scene_buffer *buffer,
  function get_scale_filter (line 193) | static enum wlr_scale_filter_mode get_scale_filter(struct sway_output *o...
  function output_configure_scene (line 212) | void output_configure_scene(struct sway_output *output,
  function output_can_tear (line 253) | static bool output_can_tear(struct sway_output *output) {
  function output_repaint_timer_handler (line 270) | static int output_repaint_timer_handler(void *data) {
  function handle_frame (line 313) | static void handle_frame(struct wl_listener *listener, void *user_data) {
  function update_output_manager_config (line 377) | void update_output_manager_config(struct sway_server *server) {
  function timer_modeset_handle (line 402) | static int timer_modeset_handle(void *data) {
  function request_modeset (line 411) | void request_modeset(void) {
  function modeset_is_pending (line 419) | bool modeset_is_pending(void) {
  function force_modeset (line 423) | void force_modeset(void) {
  function begin_destroy (line 431) | static void begin_destroy(struct sway_output *output) {
  function handle_destroy (line 459) | static void handle_destroy(struct wl_listener *listener, void *data) {
  function handle_layout_destroy (line 464) | static void handle_layout_destroy(struct wl_listener *listener, void *da...
  function handle_present (line 469) | static void handle_present(struct wl_listener *listener, void *data) {
  function handle_request_state (line 481) | static void handle_request_state(struct wl_listener *listener, void *dat...
  function handle_new_output (line 527) | void handle_new_output(struct wl_listener *listener, void *data) {
  type output_config (line 603) | struct output_config
  type wlr_output_configuration_head_v1 (line 604) | struct wlr_output_configuration_head_v1
  type output_config (line 605) | struct output_config
  type wlr_output_mode (line 616) | struct wlr_output_mode
  function output_manager_apply (line 634) | static void output_manager_apply(struct sway_server *server,
  function handle_output_manager_apply (line 690) | void handle_output_manager_apply(struct wl_listener *listener, void *dat...
  function handle_output_manager_test (line 698) | void handle_output_manager_test(struct wl_listener *listener, void *data) {
  function handle_output_power_manager_set_mode (line 706) | void handle_output_power_manager_set_mode(struct wl_listener *listener,

FILE: sway/desktop/tearing.c
  type sway_tearing_controller (line 8) | struct sway_tearing_controller {
  function handle_tearing_controller_set_hint (line 16) | static void handle_tearing_controller_set_hint(struct wl_listener *liste...
  function handle_tearing_controller_destroy (line 28) | static void handle_tearing_controller_destroy(struct wl_listener *listener,
  function handle_new_tearing_hint (line 38) | void handle_new_tearing_hint(struct wl_listener *listener,

FILE: sway/desktop/transaction.c
  type sway_transaction (line 21) | struct sway_transaction {
  type sway_transaction_instruction (line 29) | struct sway_transaction_instruction {
  type sway_transaction (line 42) | struct sway_transaction
  type sway_transaction (line 43) | struct sway_transaction
  type sway_transaction (line 44) | struct sway_transaction
  function transaction_destroy (line 52) | static void transaction_destroy(struct sway_transaction *transaction) {
  function copy_output_state (line 88) | static void copy_output_state(struct sway_output *output,
  function copy_workspace_state (line 101) | static void copy_workspace_state(struct sway_workspace *ws,
  function copy_container_state (line 139) | static void copy_container_state(struct sway_container *container,
  function transaction_add_node (line 168) | static void transaction_add_node(struct sway_transaction *transaction,
  function apply_output_state (line 215) | static void apply_output_state(struct sway_output *output,
  function apply_workspace_state (line 221) | static void apply_workspace_state(struct sway_workspace *ws,
  function apply_container_state (line 228) | static void apply_container_state(struct sway_container *container,
  function arrange_title_bar (line 256) | static void arrange_title_bar(struct sway_container *con,
  function disable_container (line 272) | static void disable_container(struct sway_container *con) {
  type sway_container (line 286) | struct sway_container
  function arrange_children (line 289) | static void arrange_children(enum sway_container_layout layout, list_t *...
  function arrange_container (line 392) | static void arrange_container(struct sway_container *con,
  function container_get_gaps (line 471) | static int container_get_gaps(struct sway_container *con) {
  function arrange_fullscreen (line 489) | static void arrange_fullscreen(struct wlr_scene_tree *tree,
  function arrange_workspace_floating (line 508) | static void arrange_workspace_floating(struct sway_workspace *ws) {
  function arrange_workspace_tiling (line 544) | static void arrange_workspace_tiling(struct sway_workspace *ws,
  function disable_workspace (line 551) | static void disable_workspace(struct sway_workspace *ws) {
  function arrange_output (line 570) | static void arrange_output(struct sway_output *output, int width, int he...
  function arrange_popups (line 623) | void arrange_popups(struct wlr_scene_tree *popups) {
  function arrange_root (line 637) | static void arrange_root(struct sway_root *root) {
  function transaction_apply (line 716) | static void transaction_apply(struct sway_transaction *transaction) {
  function transaction_progress (line 756) | static void transaction_progress(void) {
  function handle_timeout (line 777) | static int handle_timeout(void *data) {
  function should_configure (line 786) | static bool should_configure(struct sway_node *node,
  function transaction_commit (line 820) | static void transaction_commit(struct sway_transaction *transaction) {
  function transaction_commit_pending (line 876) | static void transaction_commit_pending(void) {
  function set_instruction_ready (line 887) | static void set_instruction_ready(
  function transaction_notify_view_ready_by_serial (line 915) | bool transaction_notify_view_ready_by_serial(struct sway_view *view,
  function transaction_notify_view_ready_by_geometry (line 926) | bool transaction_notify_view_ready_by_geometry(struct sway_view *view,
  function _transaction_commit_dirty (line 941) | static void _transaction_commit_dirty(bool server_request) {
  function transaction_commit_dirty (line 963) | void transaction_commit_dirty(void) {
  function transaction_commit_dirty_client (line 967) | void transaction_commit_dirty_client(void) {

FILE: sway/desktop/xdg_shell.c
  type sway_xdg_popup (line 22) | struct sway_xdg_popup
  type wlr_xdg_popup (line 23) | struct wlr_xdg_popup
  type sway_view (line 23) | struct sway_view
  type wlr_scene_tree (line 24) | struct wlr_scene_tree
  type wlr_scene_tree (line 24) | struct wlr_scene_tree
  function popup_handle_new_popup (line 26) | static void popup_handle_new_popup(struct wl_listener *listener, void *d...
  function popup_handle_destroy (line 33) | static void popup_handle_destroy(struct wl_listener *listener, void *dat...
  function popup_unconstrain (line 44) | static void popup_unconstrain(struct sway_xdg_popup *popup) {
  function popup_handle_surface_commit (line 68) | static void popup_handle_surface_commit(struct wl_listener *listener, vo...
  function popup_handle_reposition (line 75) | static void popup_handle_reposition(struct wl_listener *listener, void *...
  type sway_xdg_popup (line 80) | struct sway_xdg_popup
  type wlr_xdg_popup (line 80) | struct wlr_xdg_popup
  type sway_view (line 81) | struct sway_view
  type wlr_scene_tree (line 81) | struct wlr_scene_tree
  type wlr_scene_tree (line 82) | struct wlr_scene_tree
  type wlr_xdg_surface (line 83) | struct wlr_xdg_surface
  type sway_xdg_popup (line 85) | struct sway_xdg_popup
  type sway_xdg_popup (line 85) | struct sway_xdg_popup
  type sway_xdg_shell_view (line 124) | struct sway_xdg_shell_view
  type sway_xdg_shell_view (line 140) | struct sway_xdg_shell_view
  type sway_view (line 141) | struct sway_view
  type sway_xdg_shell_view (line 146) | struct sway_xdg_shell_view
  function get_constraints (line 149) | static void get_constraints(struct sway_view *view, double *min_width,
  type sway_view (line 159) | struct sway_view
  type sway_view_prop (line 160) | enum sway_view_prop
  type sway_xdg_shell_view (line 161) | struct sway_xdg_shell_view
  function configure (line 177) | static uint32_t configure(struct sway_view *view, double lx, double ly,
  function set_activated (line 188) | static void set_activated(struct sway_view *view, bool activated) {
  function set_tiled (line 195) | static void set_tiled(struct sway_view *view, bool tiled) {
  function set_fullscreen (line 214) | static void set_fullscreen(struct sway_view *view, bool fullscreen) {
  function set_resizing (line 221) | static void set_resizing(struct sway_view *view, bool resizing) {
  function wants_floating (line 228) | static bool wants_floating(struct sway_view *view) {
  function is_transient_for (line 237) | static bool is_transient_for(struct sway_view *child,
  function _close (line 252) | static void _close(struct sway_view *view) {
  function close_popups (line 259) | static void close_popups(struct sway_view *view) {
  function destroy (line 266) | static void destroy(struct sway_view *view) {
  type sway_view_impl (line 276) | struct sway_view_impl
  function handle_commit (line 291) | static void handle_commit(struct wl_listener *listener, void *data) {
  function handle_set_title (line 351) | static void handle_set_title(struct wl_listener *listener, void *data) {
  function handle_set_app_id (line 360) | static void handle_set_app_id(struct wl_listener *listener, void *data) {
  function handle_new_popup (line 369) | static void handle_new_popup(struct wl_listener *listener, void *data) {
  function handle_request_maximize (line 385) | static void handle_request_maximize(struct wl_listener *listener, void *...
  function handle_request_fullscreen (line 395) | static void handle_request_fullscreen(struct wl_listener *listener, void...
  function handle_request_move (line 426) | static void handle_request_move(struct wl_listener *listener, void *data) {
  function handle_request_resize (line 441) | static void handle_request_resize(struct wl_listener *listener, void *da...
  function handle_unmap (line 455) | static void handle_unmap(struct wl_listener *listener, void *data) {
  function handle_map (line 475) | static void handle_map(struct wl_listener *listener, void *data) {
  function handle_destroy (line 533) | static void handle_destroy(struct wl_listener *listener, void *data) {
  type sway_view (line 551) | struct sway_view
  type wlr_xdg_surface (line 552) | struct wlr_xdg_surface
  function handle_xdg_shell_toplevel (line 556) | void handle_xdg_shell_toplevel(struct wl_listener *listener, void *data) {
  function xdg_toplevel_tag_manager_v1_handle_set_tag (line 595) | void xdg_toplevel_tag_manager_v1_handle_set_tag(struct wl_listener *list...

FILE: sway/desktop/xwayland.c
  function unmanaged_handle_request_configure (line 38) | static void unmanaged_handle_request_configure(struct wl_listener *liste...
  function unmanaged_handle_set_geometry (line 48) | static void unmanaged_handle_set_geometry(struct wl_listener *listener, ...
  function unmanaged_handle_map (line 56) | static void unmanaged_handle_map(struct wl_listener *listener, void *dat...
  function unmanaged_handle_unmap (line 82) | static void unmanaged_handle_unmap(struct wl_listener *listener, void *d...
  function unmanaged_handle_request_activate (line 114) | static void unmanaged_handle_request_activate(struct wl_listener *listen...
  function unmanaged_handle_associate (line 130) | static void unmanaged_handle_associate(struct wl_listener *listener, voi...
  function unmanaged_handle_dissociate (line 140) | static void unmanaged_handle_dissociate(struct wl_listener *listener, vo...
  function unmanaged_handle_destroy (line 147) | static void unmanaged_handle_destroy(struct wl_listener *listener, void ...
  type wl_listener (line 159) | struct wl_listener
  type wl_listener (line 160) | struct wl_listener
  type sway_xwayland_view (line 162) | struct sway_xwayland_view
  type wlr_xwayland_surface (line 162) | struct wlr_xwayland_surface
  function unmanaged_handle_override_redirect (line 164) | static void unmanaged_handle_override_redirect(struct wl_listener *liste...
  type sway_xwayland_unmanaged (line 190) | struct sway_xwayland_unmanaged
  type wlr_xwayland_surface (line 191) | struct wlr_xwayland_surface
  type sway_xwayland_unmanaged (line 192) | struct sway_xwayland_unmanaged
  type sway_xwayland_unmanaged (line 193) | struct sway_xwayland_unmanaged
  type sway_xwayland_view (line 218) | struct sway_xwayland_view
  type sway_view (line 219) | struct sway_view
  type sway_xwayland_view (line 224) | struct sway_xwayland_view
  type sway_view (line 227) | struct sway_view
  type sway_view_prop (line 227) | enum sway_view_prop
  function get_int_prop (line 245) | static uint32_t get_int_prop(struct sway_view *view, enum sway_view_prop...
  function configure (line 267) | static uint32_t configure(struct sway_view *view, double lx, double ly, ...
  function set_activated (line 281) | static void set_activated(struct sway_view *view, bool activated) {
  function set_tiled (line 294) | static void set_tiled(struct sway_view *view, bool tiled) {
  function set_fullscreen (line 302) | static void set_fullscreen(struct sway_view *view, bool fullscreen) {
  function wants_floating (line 310) | static bool wants_floating(struct sway_view *view) {
  function handle_set_decorations (line 342) | static void handle_set_decorations(struct wl_listener *listener, void *d...
  function is_transient_for (line 352) | static bool is_transient_for(struct sway_view *child,
  function _close (line 367) | static void _close(struct sway_view *view) {
  function destroy (line 374) | static void destroy(struct sway_view *view) {
  function get_constraints (line 382) | static void get_constraints(struct sway_view *view, double *min_width,
  type sway_view_impl (line 401) | struct sway_view_impl
  function handle_commit (line 415) | static void handle_commit(struct wl_listener *listener, void *data) {
  function handle_destroy (line 456) | static void handle_destroy(struct wl_listener *listener, void *data) {
  function handle_unmap (line 488) | static void handle_unmap(struct wl_listener *listener, void *data) {
  function handle_surface_tree_destroy (line 511) | static void handle_surface_tree_destroy(struct wl_listener *listener, vo...
  function handle_map (line 517) | static void handle_map(struct wl_listener *listener, void *data) {
  type wl_listener (line 549) | struct wl_listener
  function handle_override_redirect (line 551) | static void handle_override_redirect(struct wl_listener *listener, void ...
  function handle_request_configure (line 578) | static void handle_request_configure(struct wl_listener *listener, void ...
  function handle_request_fullscreen (line 608) | static void handle_request_fullscreen(struct wl_listener *listener, void...
  function handle_request_minimize (line 622) | static void handle_request_minimize(struct wl_listener *listener, void *...
  function handle_request_move (line 637) | static void handle_request_move(struct wl_listener *listener, void *data) {
  function handle_request_resize (line 653) | static void handle_request_resize(struct wl_listener *listener, void *da...
  function handle_request_activate (line 669) | static void handle_request_activate(struct wl_listener *listener, void *...
  function handle_set_title (line 682) | static void handle_set_title(struct wl_listener *listener, void *data) {
  function handle_set_class (line 695) | static void handle_set_class(struct wl_listener *listener, void *data) {
  function handle_set_role (line 707) | static void handle_set_role(struct wl_listener *listener, void *data) {
  function handle_set_startup_id (line 719) | static void handle_set_startup_id(struct wl_listener *listener, void *da...
  function handle_set_window_type (line 744) | static void handle_set_window_type(struct wl_listener *listener, void *d...
  function handle_set_hints (line 756) | static void handle_set_hints(struct wl_listener *listener, void *data) {
  function handle_associate (line 776) | static void handle_associate(struct wl_listener *listener, void *data) {
  function handle_dissociate (line 787) | static void handle_dissociate(struct wl_listener *listener, void *data) {
  type sway_view (line 794) | struct sway_view
  type wlr_xwayland_surface (line 795) | struct wlr_xwayland_surface
  type sway_xwayland_view (line 799) | struct sway_xwayland_view
  type wlr_xwayland_surface (line 799) | struct wlr_xwayland_surface
  type sway_xwayland_view (line 803) | struct sway_xwayland_view
  type sway_xwayland_view (line 804) | struct sway_xwayland_view
  function handle_xwayland_surface (line 881) | void handle_xwayland_surface(struct wl_listener *listener, void *data) {
  function handle_xwayland_ready (line 893) | void handle_xwayland_ready(struct wl_listener *listener, void *data) {

FILE: sway/input/cursor.c
  type sway_node (line 39) | struct sway_node
  type sway_seat (line 40) | struct sway_seat
  type wlr_surface (line 41) | struct wlr_surface
  type wlr_scene_node (line 42) | struct wlr_scene_node
  type wlr_scene_node (line 44) | struct wlr_scene_node
  type wlr_scene_tree (line 46) | struct wlr_scene_tree
  type wlr_scene_buffer (line 63) | struct wlr_scene_buffer
  type wlr_scene_surface (line 65) | struct wlr_scene_surface
  type wlr_scene_node (line 74) | struct wlr_scene_node
  type sway_container (line 76) | struct sway_container
  type sway_view (line 80) | struct sway_view
  type sway_popup_desc (line 88) | struct sway_popup_desc
  type wlr_output (line 120) | struct wlr_output
  type sway_output (line 126) | struct sway_output
  type sway_workspace (line 132) | struct sway_workspace
  function cursor_rebase (line 140) | void cursor_rebase(struct sway_cursor *cursor) {
  function cursor_rebase_all (line 145) | void cursor_rebase_all(void) {
  function cursor_update_image (line 156) | void cursor_update_image(struct sway_cursor *cursor,
  function cursor_hide (line 177) | static void cursor_hide(struct sway_cursor *cursor) {
  function hide_notify (line 183) | static int hide_notify(void *data) {
  function cursor_get_timeout (line 189) | int cursor_get_timeout(struct sway_cursor *cursor) {
  function cursor_notify_key_press (line 206) | void cursor_notify_key_press(struct sway_cursor *cursor) {
  function idle_source_from_device (line 232) | static enum sway_input_idle_source idle_source_from_device(
  function cursor_handle_activity_from_idle_source (line 252) | void cursor_handle_activity_from_idle_source(struct sway_cursor *cursor,
  function cursor_handle_activity_from_device (line 263) | void cursor_handle_activity_from_device(struct sway_cursor *cursor,
  function cursor_unhide (line 269) | void cursor_unhide(struct sway_cursor *cursor) {
  function pointer_motion (line 290) | void pointer_motion(struct sway_cursor *cursor, uint32_t time_msec,
  function handle_pointer_motion_relative (line 324) | static void handle_pointer_motion_relative(
  function handle_pointer_motion_absolute (line 334) | static void handle_pointer_motion_absolute(
  function dispatch_cursor_button (line 352) | void dispatch_cursor_button(struct sway_cursor *cursor,
  function handle_pointer_button (line 362) | static void handle_pointer_button(struct wl_listener *listener, void *da...
  function dispatch_cursor_axis (line 381) | void dispatch_cursor_axis(struct sway_cursor *cursor,
  function handle_pointer_axis (line 386) | static void handle_pointer_axis(struct wl_listener *listener, void *data) {
  function handle_pointer_frame (line 393) | static void handle_pointer_frame(struct wl_listener *listener, void *dat...
  function handle_touch_down (line 398) | static void handle_touch_down(struct wl_listener *listener, void *data) {
  function handle_touch_up (line 417) | static void handle_touch_up(struct wl_listener *listener, void *data) {
  function handle_touch_cancel (line 435) | static void handle_touch_cancel(struct wl_listener *listener, void *data) {
  function handle_touch_motion (line 453) | static void handle_touch_motion(struct wl_listener *listener, void *data) {
  function handle_touch_frame (line 485) | static void handle_touch_frame(struct wl_listener *listener, void *data) {
  function apply_mapping_from_coord (line 503) | static double apply_mapping_from_coord(double low, double high, double v...
  function apply_mapping_from_region (line 511) | static void apply_mapping_from_region(struct wlr_input_device *device,
  function handle_tablet_tool_position (line 531) | static void handle_tablet_tool_position(struct sway_cursor *cursor,
  function handle_tool_axis (line 585) | static void handle_tool_axis(struct wl_listener *listener, void *data) {
  function handle_tool_tip (line 641) | static void handle_tool_tip(struct wl_listener *listener, void *data) {
  type sway_tablet (line 685) | struct sway_tablet
  type sway_cursor (line 685) | struct sway_cursor
  type wlr_input_device (line 686) | struct wlr_input_device
  type sway_tablet (line 687) | struct sway_tablet
  function handle_tool_proximity (line 696) | static void handle_tool_proximity(struct wl_listener *listener, void *da...
  function handle_tool_button (line 728) | static void handle_tool_button(struct wl_listener *listener, void *data) {
  function check_constraint_region (line 813) | static void check_constraint_region(struct sway_cursor *cursor) {
  function handle_constraint_commit (line 850) | static void handle_constraint_commit(struct wl_listener *listener,
  function handle_pointer_constraint_set_region (line 860) | static void handle_pointer_constraint_set_region(struct wl_listener *lis...
  function handle_request_pointer_set_cursor (line 869) | static void handle_request_pointer_set_cursor(struct wl_listener *listener,
  function handle_pointer_hold_begin (line 896) | static void handle_pointer_hold_begin(struct wl_listener *listener, void...
  function handle_pointer_hold_end (line 904) | static void handle_pointer_hold_end(struct wl_listener *listener, void *...
  function handle_pointer_pinch_begin (line 912) | static void handle_pointer_pinch_begin(struct wl_listener *listener, voi...
  function handle_pointer_pinch_update (line 920) | static void handle_pointer_pinch_update(struct wl_listener *listener, vo...
  function handle_pointer_pinch_end (line 928) | static void handle_pointer_pinch_end(struct wl_listener *listener, void ...
  function handle_pointer_swipe_begin (line 936) | static void handle_pointer_swipe_begin(struct wl_listener *listener, voi...
  function handle_pointer_swipe_update (line 944) | static void handle_pointer_swipe_update(struct wl_listener *listener, vo...
  function handle_pointer_swipe_end (line 952) | static void handle_pointer_swipe_end(struct wl_listener *listener, void ...
  function handle_image_surface_destroy (line 960) | static void handle_image_surface_destroy(struct wl_listener *listener,
  function set_image_surface (line 968) | static void set_image_surface(struct sway_cursor *cursor,
  function cursor_set_image (line 979) | void cursor_set_image(struct sway_cursor *cursor, const char *image,
  function cursor_set_image_surface (line 1002) | void cursor_set_image_surface(struct sway_cursor *cursor,
  function sway_cursor_destroy (line 1022) | void sway_cursor_destroy(struct sway_cursor *cursor) {
  type sway_cursor (line 1059) | struct sway_cursor
  type sway_seat (line 1059) | struct sway_seat
  type sway_cursor (line 1060) | struct sway_cursor
  type sway_cursor (line 1060) | struct sway_cursor
  type wlr_cursor (line 1065) | struct wlr_cursor
  function cursor_warp_to_container (line 1166) | void cursor_warp_to_container(struct sway_cursor *cursor,
  function cursor_warp_to_workspace (line 1190) | void cursor_warp_to_workspace(struct sway_cursor *cursor,
  function get_mouse_bindsym (line 1203) | uint32_t get_mouse_bindsym(const char *name, char **error) {
  function get_mouse_bindcode (line 1228) | uint32_t get_mouse_bindcode(const char *name, char **error) {
  function get_mouse_button (line 1249) | uint32_t get_mouse_button(const char *name, char **error) {
  function warp_to_constraint_cursor_hint (line 1273) | static void warp_to_constraint_cursor_hint(struct sway_cursor *cursor) {
  function handle_constraint_destroy (line 1298) | void handle_constraint_destroy(struct wl_listener *listener, void *data) {
  function handle_pointer_constraint (line 1320) | void handle_pointer_constraint(struct wl_listener *listener, void *data) {
  function sway_cursor_constrain (line 1341) | void sway_cursor_constrain(struct sway_cursor *cursor,
  function handle_request_set_cursor_shape (line 1396) | void handle_request_set_cursor_shape(struct wl_listener *listener, void ...

FILE: sway/input/input-manager.c
  type input_config (line 30) | struct input_config
  type seat_config (line 31) | struct seat_config
  type sway_seat (line 33) | struct sway_seat
  type sway_seat (line 34) | struct sway_seat
  type sway_seat (line 41) | struct sway_seat
  type sway_seat (line 45) | struct sway_seat
  type sway_seat (line 46) | struct sway_seat
  type sway_seat (line 56) | struct sway_seat
  type wlr_seat (line 56) | struct wlr_seat
  type sway_seat (line 57) | struct sway_seat
  type wlr_input_device (line 68) | struct wlr_input_device
  type libinput_device (line 72) | struct libinput_device
  function device_is_touchpad (line 94) | static bool device_is_touchpad(struct sway_input_device *device) {
  type sway_input_device (line 110) | struct sway_input_device
  function apply_input_type_config (line 132) | static void apply_input_type_config(struct sway_input_device *input_devi...
  type sway_input_device (line 163) | struct sway_input_device
  type wlr_input_device (line 164) | struct wlr_input_device
  type sway_input_device (line 165) | struct sway_input_device
  function input_has_seat_fallback_configuration (line 174) | static bool input_has_seat_fallback_configuration(void) {
  function input_manager_verify_fallback_seat (line 187) | void input_manager_verify_fallback_seat(void) {
  function handle_device_destroy (line 199) | static void handle_device_destroy(struct wl_listener *listener, void *da...
  function handle_new_input (line 224) | static void handle_new_input(struct wl_listener *listener, void *data) {
  function handle_keyboard_shortcuts_inhibitor_destroy (line 293) | static void handle_keyboard_shortcuts_inhibitor_destroy(
  function handle_keyboard_shortcuts_inhibit_new_inhibitor (line 306) | static void handle_keyboard_shortcuts_inhibit_new_inhibitor(
  function handle_virtual_keyboard (line 366) | void handle_virtual_keyboard(struct wl_listener *listener, void *data) {
  function handle_virtual_pointer (line 398) | void handle_virtual_pointer(struct wl_listener *listener, void *data) {
  function handle_transient_seat_manager_create_seat (line 435) | static void handle_transient_seat_manager_create_seat(
  type sway_input_manager (line 449) | struct sway_input_manager
  type sway_server (line 449) | struct sway_server
  type sway_input_manager (line 450) | struct sway_input_manager
  type sway_input_manager (line 451) | struct sway_input_manager
  function input_manager_finish (line 496) | void input_manager_finish(struct sway_input_manager *input) {
  function input_manager_has_focus (line 504) | bool input_manager_has_focus(struct sway_node *node) {
  function input_manager_set_focus (line 515) | void input_manager_set_focus(struct sway_node *node) {
  function retranslate_keysyms (line 526) | static void retranslate_keysyms(struct input_config *input_config) {
  function input_manager_configure_input (line 552) | static void input_manager_configure_input(
  function input_manager_configure_all_input_mappings (line 568) | void input_manager_configure_all_input_mappings(void) {
  function input_manager_apply_input_config (line 585) | void input_manager_apply_input_config(struct input_config *input_config) {
  function input_manager_reset_input (line 602) | void input_manager_reset_input(struct sway_input_device *input_device) {
  function input_manager_reset_all_inputs (line 612) | void input_manager_reset_all_inputs(void) {
  function input_manager_apply_seat_config (line 636) | void input_manager_apply_seat_config(struct seat_config *seat_config) {
  function input_manager_configure_xcursor (line 705) | void input_manager_configure_xcursor(void) {
  type input_config (line 712) | struct input_config
  type sway_input_device (line 712) | struct sway_input_device
  type input_config (line 713) | struct input_config
  type input_config (line 714) | struct input_config

FILE: sway/input/keyboard.c
  type modifier_key (line 24) | struct modifier_key {
  function get_modifier_mask_by_name (line 41) | uint32_t get_modifier_mask_by_name(const char *name) {
  type modifier_key (line 54) | struct modifier_key
  function get_modifier_names (line 63) | int get_modifier_names(const char **names, uint32_t modifier_masks) {
  function state_erase_key (line 80) | static bool state_erase_key(struct sway_shortcut_state *state,
  function state_add_key (line 108) | static void state_add_key(struct sway_shortcut_state *state,
  function update_shortcut_state (line 132) | static bool update_shortcut_state(struct sway_shortcut_state *state,
  function get_active_binding (line 158) | static void get_active_binding(const struct sway_shortcut_state *state,
  function keyboard_execute_compositor_binding (line 267) | static bool keyboard_execute_compositor_binding(struct sway_keyboard *ke...
  function keyboard_execute_pointer_keysyms (line 287) | static bool keyboard_execute_pointer_keysyms(struct sway_keyboard *keybo...
  function keyboard_keysyms_translated (line 326) | static size_t keyboard_keysyms_translated(struct sway_keyboard *keyboard,
  function keyboard_keysyms_raw (line 347) | static size_t keyboard_keysyms_raw(struct sway_keyboard *keyboard,
  function sway_keyboard_disarm_key_repeat (line 358) | void sway_keyboard_disarm_key_repeat(struct sway_keyboard *keyboard) {
  type key_info (line 368) | struct key_info {
  function update_keyboard_state (line 381) | static void update_keyboard_state(struct sway_keyboard *keyboard,
  type wlr_input_method_keyboard_grab_v2 (line 419) | struct wlr_input_method_keyboard_grab_v2
  type sway_keyboard (line 420) | struct sway_keyboard
  type wlr_input_method_v2 (line 421) | struct wlr_input_method_v2
  type wlr_virtual_keyboard_v1 (line 423) | struct wlr_virtual_keyboard_v1
  function handle_key_event (line 433) | static void handle_key_event(struct sway_keyboard *keyboard,
  function handle_keyboard_key (line 588) | static void handle_keyboard_key(struct wl_listener *listener, void *data) {
  function handle_keyboard_group_key (line 594) | static void handle_keyboard_group_key(struct wl_listener *listener,
  function handle_keyboard_group_enter (line 601) | static void handle_keyboard_group_enter(struct wl_listener *listener,
  function handle_keyboard_group_leave (line 615) | static void handle_keyboard_group_leave(struct wl_listener *listener,
  function handle_keyboard_repeat (line 655) | static int handle_keyboard_repeat(void *data) {
  function determine_bar_visibility (line 672) | static void determine_bar_visibility(uint32_t modifiers) {
  function handle_modifier_event (line 693) | static void handle_modifier_event(struct sway_keyboard *keyboard) {
  function handle_keyboard_modifiers (line 721) | static void handle_keyboard_modifiers(struct wl_listener *listener,
  function handle_keyboard_group_modifiers (line 728) | static void handle_keyboard_group_modifiers(struct wl_listener *listener,
  type sway_keyboard (line 735) | struct sway_keyboard
  type sway_seat (line 735) | struct sway_seat
  type sway_seat_device (line 736) | struct sway_seat_device
  type sway_keyboard (line 737) | struct sway_keyboard
  type sway_keyboard (line 738) | struct sway_keyboard
  function handle_xkb_context_log (line 756) | static void handle_xkb_context_log(struct xkb_context *context,
  type xkb_keymap (line 781) | struct xkb_keymap
  type input_config (line 781) | struct input_config
  type xkb_context (line 783) | struct xkb_context
  type xkb_keymap (line 790) | struct xkb_keymap
  type xkb_rule_names (line 811) | struct xkb_rule_names
  function repeat_info_match (line 825) | static bool repeat_info_match(struct sway_keyboard *a, struct wlr_keyboa...
  function destroy_empty_wlr_keyboard_group (line 830) | static void destroy_empty_wlr_keyboard_group(void *data) {
  function sway_keyboard_group_remove (line 834) | static void sway_keyboard_group_remove(struct sway_keyboard *keyboard) {
  function sway_keyboard_group_remove_invalid (line 865) | static void sway_keyboard_group_remove_invalid(struct sway_keyboard *key...
  function sway_keyboard_group_add (line 891) | static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
  function sway_keyboard_set_layout (line 1001) | static void sway_keyboard_set_layout(struct sway_keyboard *keyboard,
  function sway_keyboard_configure (line 1077) | void sway_keyboard_configure(struct sway_keyboard *keyboard) {
  function sway_keyboard_destroy (line 1129) | void sway_keyboard_destroy(struct sway_keyboard *keyboard) {

FILE: sway/input/libinput.c
  function log_status (line 12) | static void log_status(enum libinput_config_status status) {
  function set_send_events (line 19) | static bool set_send_events(struct libinput_device *device, uint32_t mod...
  function set_tap (line 28) | static bool set_tap(struct libinput_device *device,
  function set_tap_button_map (line 39) | static bool set_tap_button_map(struct libinput_device *device,
  function set_tap_drag (line 50) | static bool set_tap_drag(struct libinput_device *device,
  function set_tap_drag_lock (line 61) | static bool set_tap_drag_lock(struct libinput_device *device,
  function set_accel_speed (line 72) | static bool set_accel_speed(struct libinput_device *device, double speed) {
  function set_rotation_angle (line 82) | static bool set_rotation_angle(struct libinput_device *device, double an...
  function set_accel_profile (line 92) | static bool set_accel_profile(struct libinput_device *device,
  function set_natural_scroll (line 103) | static bool set_natural_scroll(struct libinput_device *d, bool n) {
  function set_left_handed (line 113) | static bool set_left_handed(struct libinput_device *device, bool left) {
  function set_click_method (line 123) | static bool set_click_method(struct libinput_device *device,
  function set_clickfinger_button_map (line 135) | static bool set_clickfinger_button_map(struct libinput_device *device,
  function set_middle_emulation (line 145) | static bool set_middle_emulation(struct libinput_device *dev,
  function set_scroll_method (line 156) | static bool set_scroll_method(struct libinput_device *device,
  function set_scroll_button (line 168) | static bool set_scroll_button(struct libinput_device *dev, uint32_t butt...
  function set_scroll_button_lock (line 179) | static bool set_scroll_button_lock(struct libinput_device *dev,
  function set_dwt (line 191) | static bool set_dwt(struct libinput_device *device, bool dwt) {
  function set_dwtp (line 201) | static bool set_dwtp(struct libinput_device *device, bool dwtp) {
  function set_calibration_matrix (line 211) | static bool set_calibration_matrix(struct libinput_device *dev, float ma...
  function configure_send_events (line 232) | static bool configure_send_events(struct libinput_device *device,
  function sway_input_configure_libinput_device (line 252) | bool sway_input_configure_libinput_device(struct sway_input_device *inpu...
  function sway_input_configure_libinput_device_send_events (line 322) | void sway_input_configure_libinput_device_send_events(
  function sway_input_reset_libinput_device (line 338) | void sway_input_reset_libinput_device(struct sway_input_device *input_de...
  function sway_udev_device_is_builtin (line 394) | static bool sway_udev_device_is_builtin(struct udev_device *udev_device) {
  function sway_libinput_device_is_builtin (line 407) | bool sway_libinput_device_is_builtin(struct sway_input_device *sway_devi...

FILE: sway/input/seat.c
  function seat_device_destroy (line 38) | static void seat_device_destroy(struct sway_seat_device *seat_device) {
  function seat_node_destroy (line 53) | static void seat_node_destroy(struct sway_seat_node *seat_node) {
  function seat_destroy (line 69) | void seat_destroy(struct sway_seat *seat) {
  function handle_seat_destroy (line 73) | static void handle_seat_destroy(struct wl_listener *listener, void *data) {
  function seat_idle_notify_activity (line 106) | void seat_idle_notify_activity(struct sway_seat *seat,
  function seat_send_activate (line 117) | static void seat_send_activate(struct sway_node *node, struct sway_seat ...
  type sway_keyboard (line 133) | struct sway_keyboard
  type sway_seat (line 134) | struct sway_seat
  type wlr_keyboard (line 134) | struct wlr_keyboard
  type sway_seat_device (line 135) | struct sway_seat_device
  type sway_input_device (line 137) | struct sway_input_device
  type sway_keyboard_group (line 145) | struct sway_keyboard_group
  type sway_input_device (line 147) | struct sway_input_device
  function seat_keyboard_notify_enter (line 156) | static void seat_keyboard_notify_enter(struct sway_seat *seat,
  function seat_tablet_pads_set_focus (line 173) | static void seat_tablet_pads_set_focus(struct sway_seat *seat,
  function seat_send_focus (line 186) | static void seat_send_focus(struct sway_node *node, struct sway_seat *se...
  function seat_for_each_node (line 211) | void seat_for_each_node(struct sway_seat *seat,
  type sway_container (line 219) | struct sway_container
  type sway_seat (line 219) | struct sway_seat
  type sway_node (line 220) | struct sway_node
  type sway_seat_node (line 224) | struct sway_seat_node
  type sway_node (line 226) | struct sway_node
  function handle_seat_node_destroy (line 234) | static void handle_seat_node_destroy(struct wl_listener *listener, void ...
  type sway_seat_node (line 327) | struct sway_seat_node
  type sway_seat (line 328) | struct sway_seat
  type sway_node (line 328) | struct sway_node
  type sway_seat_node (line 334) | struct sway_seat_node
  type sway_seat_node (line 341) | struct sway_seat_node
  function handle_new_node (line 356) | static void handle_new_node(struct wl_listener *listener, void *data) {
  function drag_icon_update_position (line 362) | static void drag_icon_update_position(struct sway_seat *seat, struct wlr...
  function drag_icons_update_position (line 382) | void drag_icons_update_position(struct sway_seat *seat) {
  function drag_handle_destroy (line 389) | static void drag_handle_destroy(struct wl_listener *listener, void *data) {
  function handle_request_start_drag (line 414) | static void handle_request_start_drag(struct wl_listener *listener,
  function handle_start_drag (line 440) | static void handle_start_drag(struct wl_listener *listener, void *data) {
  function handle_request_set_selection (line 476) | static void handle_request_set_selection(struct wl_listener *listener,
  function handle_request_set_primary_selection (line 484) | static void handle_request_set_primary_selection(struct wl_listener *lis...
  function collect_focus_iter (line 492) | static void collect_focus_iter(struct sway_node *node, void *data) {
  function collect_focus_workspace_iter (line 502) | static void collect_focus_workspace_iter(struct sway_workspace *workspace,
  function collect_focus_container_iter (line 507) | static void collect_focus_container_iter(struct sway_container *container,
  type sway_seat (line 512) | struct sway_seat
  type sway_seat (line 513) | struct sway_seat
  type sway_seat (line 513) | struct sway_seat
  type sway_seat (line 593) | struct sway_seat
  type sway_node (line 594) | struct sway_node
  function seat_update_capabilities (line 604) | static void seat_update_capabilities(struct sway_seat *seat) {
  function seat_reset_input_config (line 642) | static void seat_reset_input_config(struct sway_seat *seat,
  type sway_output (line 657) | struct sway_output
  function is_touch_or_tablet_tool (line 670) | static bool is_touch_or_tablet_tool(struct sway_seat_device *seat_device) {
  function seat_apply_input_mapping (line 680) | static void seat_apply_input_mapping(struct sway_seat *seat,
  function seat_configure_pointer (line 776) | static void seat_configure_pointer(struct sway_seat *seat,
  function seat_configure_keyboard (line 785) | static void seat_configure_keyboard(struct sway_seat *seat,
  function seat_configure_switch (line 809) | static void seat_configure_switch(struct sway_seat *seat,
  function seat_configure_touch (line 817) | static void seat_configure_touch(struct sway_seat *seat,
  function seat_configure_tablet_tool (line 823) | static void seat_configure_tablet_tool(struct sway_seat *seat,
  function seat_configure_tablet_pad (line 833) | static void seat_configure_tablet_pad(struct sway_seat *seat,
  type sway_seat_device (line 841) | struct sway_seat_device
  type sway_seat (line 841) | struct sway_seat
  type sway_input_device (line 842) | struct sway_input_device
  type sway_seat_device (line 843) | struct sway_seat_device
  type sway_keyboard_group (line 850) | struct sway_keyboard_group
  function seat_configure_device (line 860) | void seat_configure_device(struct sway_seat *seat,
  function seat_configure_device_mapping (line 891) | void seat_configure_device_mapping(struct sway_seat *seat,
  function seat_reset_device (line 901) | void seat_reset_device(struct sway_seat *seat,
  function seat_add_device (line 931) | void seat_add_device(struct sway_seat *seat,
  function seat_remove_device (line 957) | void seat_remove_device(struct sway_seat *seat,
  function xcursor_manager_is_named (line 973) | static bool xcursor_manager_is_named(const struct wlr_xcursor_manager *m...
  function seat_configure_xcursor (line 979) | void seat_configure_xcursor(struct sway_seat *seat) {
  function seat_is_input_allowed (line 1064) | bool seat_is_input_allowed(struct sway_seat *seat,
  function send_unfocus (line 1072) | static void send_unfocus(struct sway_container *con, void *data) {
  function seat_send_unfocus (line 1079) | static void seat_send_unfocus(struct sway_node *node, struct sway_seat *...
  function handle_urgent_timeout (line 1090) | static int handle_urgent_timeout(void *data) {
  function set_workspace (line 1097) | static void set_workspace(struct sway_seat *seat,
  function seat_set_raw_focus (line 1115) | void seat_set_raw_focus(struct sway_seat *seat, struct sway_node *node) {
  function seat_set_workspace_focus (line 1129) | static void seat_set_workspace_focus(struct sway_seat *seat, struct sway...
  function seat_set_focus (line 1262) | void seat_set_focus(struct sway_seat *seat, struct sway_node *node) {
  function seat_set_focus_container (line 1280) | void seat_set_focus_container(struct sway_seat *seat,
  function seat_set_focus_workspace (line 1285) | void seat_set_focus_workspace(struct sway_seat *seat,
  function seat_set_focus_surface (line 1290) | void seat_set_focus_surface(struct sway_seat *seat,
  function seat_set_focus_layer (line 1308) | void seat_set_focus_layer(struct sway_seat *seat,
  function seat_unfocus_unless_client (line 1335) | void seat_unfocus_unless_client(struct sway_seat *seat, struct wl_client...
  type sway_node (line 1364) | struct sway_node
  type sway_seat (line 1364) | struct sway_seat
  type sway_node (line 1365) | struct sway_node
  type sway_seat_node (line 1369) | struct sway_seat_node
  type sway_container (line 1381) | struct sway_container
  type sway_seat (line 1381) | struct sway_seat
  type sway_workspace (line 1382) | struct sway_workspace
  type sway_seat_node (line 1386) | struct sway_seat_node
  type sway_node (line 1388) | struct sway_node
  type sway_container (line 1398) | struct sway_container
  type sway_seat (line 1398) | struct sway_seat
  type sway_workspace (line 1399) | struct sway_workspace
  type sway_seat_node (line 1403) | struct sway_seat_node
  type sway_node (line 1405) | struct sway_node
  type sway_node (line 1415) | struct sway_node
  type sway_seat (line 1415) | struct sway_seat
  type sway_node (line 1416) | struct sway_node
  type sway_seat_node (line 1420) | struct sway_seat_node
  type sway_node (line 1422) | struct sway_node
  type sway_workspace (line 1428) | struct sway_workspace
  type sway_node (line 1438) | struct sway_node
  type sway_seat (line 1438) | struct sway_seat
  type sway_seat_node (line 1444) | struct sway_seat_node
  type sway_workspace (line 1449) | struct sway_workspace
  type sway_seat (line 1449) | struct sway_seat
  type sway_node (line 1450) | struct sway_node
  type sway_workspace (line 1463) | struct sway_workspace
  type sway_seat (line 1463) | struct sway_seat
  type sway_seat_node (line 1464) | struct sway_seat_node
  type sway_node (line 1466) | struct sway_node
  type sway_container (line 1477) | struct sway_container
  type sway_seat (line 1477) | struct sway_seat
  type sway_node (line 1478) | struct sway_node
  function seat_apply_config (line 1485) | void seat_apply_config(struct sway_seat *seat,
  type seat_config (line 1503) | struct seat_config
  type sway_seat (line 1503) | struct sway_seat
  type seat_config (line 1504) | struct seat_config
  type seat_config (line 1515) | struct seat_config
  type seat_config (line 1516) | struct seat_config
  function seat_pointer_notify_button (line 1527) | void seat_pointer_notify_button(struct sway_seat *seat, uint32_t time_msec,
  function seat_consider_warp_to_focus (line 1533) | void seat_consider_warp_to_focus(struct sway_seat *seat) {
  function seatop_unref (line 1557) | void seatop_unref(struct sway_seat *seat, struct sway_container *con) {
  function seatop_button (line 1563) | void seatop_button(struct sway_seat *seat, uint32_t time_msec,
  function seatop_pointer_motion (line 1571) | void seatop_pointer_motion(struct sway_seat *seat, uint32_t time_msec) {
  function seatop_pointer_axis (line 1577) | void seatop_pointer_axis(struct sway_seat *seat,
  function seatop_touch_motion (line 1584) | void seatop_touch_motion(struct sway_seat *seat, struct wlr_touch_motion...
  function seatop_touch_up (line 1591) | void seatop_touch_up(struct sway_seat *seat, struct wlr_touch_up_event *...
  function seatop_touch_down (line 1597) | void seatop_touch_down(struct sway_seat *seat, struct wlr_touch_down_eve...
  function seatop_touch_cancel (line 1604) | void seatop_touch_cancel(struct sway_seat *seat, struct wlr_touch_cancel...
  function seatop_tablet_tool_tip (line 1610) | void seatop_tablet_tool_tip(struct sway_seat *seat,
  function seatop_tablet_tool_motion (line 1618) | void seatop_tablet_tool_motion(struct sway_seat *seat,
  function seatop_hold_begin (line 1627) | void seatop_hold_begin(struct sway_seat *seat,
  function seatop_hold_end (line 1634) | void seatop_hold_end(struct sway_seat *seat,
  function seatop_pinch_begin (line 1641) | void seatop_pinch_begin(struct sway_seat *seat,
  function seatop_pinch_update (line 1648) | void seatop_pinch_update(struct sway_seat *seat,
  function seatop_pinch_end (line 1655) | void seatop_pinch_end(struct sway_seat *seat,
  function seatop_swipe_begin (line 1662) | void seatop_swipe_begin(struct sway_seat *seat,
  function seatop_swipe_update (line 1669) | void seatop_swipe_update(struct sway_seat *seat,
  function seatop_swipe_end (line 1676) | void seatop_swipe_end(struct sway_seat *seat,
  function seatop_rebase (line 1683) | void seatop_rebase(struct sway_seat *seat, uint32_t time_msec) {
  function seatop_end (line 1689) | void seatop_end(struct sway_seat *seat) {
  function seatop_allows_set_cursor (line 1698) | bool seatop_allows_set_cursor(struct sway_seat *seat) {
  type sway_keyboard_shortcuts_inhibitor (line 1702) | struct sway_keyboard_shortcuts_inhibitor
  type sway_seat (line 1704) | struct sway_seat
  type wlr_surface (line 1705) | struct wlr_surface
  type sway_keyboard_shortcuts_inhibitor (line 1706) | struct sway_keyboard_shortcuts_inhibitor
  type sway_keyboard_shortcuts_inhibitor (line 1716) | struct sway_keyboard_shortcuts_inhibitor
  type sway_seat (line 1718) | struct sway_seat

FILE: sway/input/seatop_default.c
  type seatop_default_event (line 24) | struct seatop_default_event {
  function edge_is_external (line 39) | static bool edge_is_external(struct sway_container *cont, enum wlr_edges...
  function find_edge (line 77) | static enum wlr_edges find_edge(struct sway_container *cont,
  function find_resize_edge (line 111) | enum wlr_edges find_resize_edge(struct sway_container *cont,
  type sway_binding (line 124) | struct sway_binding
  type seatop_default_event (line 125) | struct seatop_default_event
  type sway_binding (line 133) | struct sway_binding
  type sway_binding (line 135) | struct sway_binding
  function state_erase_button (line 174) | static void state_erase_button(struct seatop_default_event *e,
  function state_add_button (line 195) | static void state_add_button(struct seatop_default_event *e, uint32_t bu...
  function handle_tablet_tool_tip (line 216) | static void handle_tablet_tool_tip(struct sway_seat *seat,
  function trigger_pointer_button_binding (line 293) | static bool trigger_pointer_button_binding(struct sway_seat *seat,
  function handle_button (line 332) | static void handle_button(struct sway_seat *seat, uint32_t time_msec,
  function check_focus_follows_mouse (line 538) | static void check_focus_follows_mouse(struct sway_seat *seat,
  function handle_pointer_motion (line 602) | static void handle_pointer_motion(struct sway_seat *seat, uint32_t time_...
  function handle_tablet_tool_motion (line 630) | static void handle_tablet_tool_motion(struct sway_seat *seat,
  function handle_touch_down (line 660) | static void handle_touch_down(struct sway_seat *seat,
  function wl_axis_to_button (line 694) | static uint32_t wl_axis_to_button(struct wlr_pointer_axis_event *event) {
  function handle_pointer_axis (line 706) | static void handle_pointer_axis(struct sway_seat *seat,
  function gesture_binding_check (line 811) | static bool gesture_binding_check(list_t *bindings, enum gesture_type type,
  type sway_gesture_binding (line 844) | struct sway_gesture_binding
  type gesture (line 845) | struct gesture
  type sway_gesture_binding (line 846) | struct sway_gesture_binding
  type sway_gesture_binding (line 850) | struct sway_gesture_binding
  type sway_gesture_binding (line 898) | struct sway_gesture_binding
  type gesture_tracker (line 899) | struct gesture_tracker
  type sway_input_device (line 899) | struct sway_input_device
  type gesture (line 906) | struct gesture
  type sway_gesture_binding (line 907) | struct sway_gesture_binding
  function gesture_binding_execute (line 916) | static void gesture_binding_execute(struct sway_seat *seat,
  function handle_hold_begin (line 932) | static void handle_hold_begin(struct sway_seat *seat,
  function handle_hold_end (line 950) | static void handle_hold_end(struct sway_seat *seat,
  function handle_pinch_begin (line 977) | static void handle_pinch_begin(struct sway_seat *seat,
  function handle_pinch_update (line 995) | static void handle_pinch_update(struct sway_seat *seat,
  function handle_pinch_end (line 1013) | static void handle_pinch_end(struct sway_seat *seat,
  function handle_swipe_begin (line 1040) | static void handle_swipe_begin(struct sway_seat *seat,
  function handle_swipe_update (line 1058) | static void handle_swipe_update(struct sway_seat *seat,
  function handle_swipe_end (line 1075) | static void handle_swipe_end(struct sway_seat *seat,
  function handle_rebase (line 1105) | static void handle_rebase(struct sway_seat *seat, uint32_t time_msec) {
  type sway_seatop_impl (line 1124) | struct sway_seatop_impl
  function seatop_begin_default (line 1143) | void seatop_begin_default(struct sway_seat *seat) {

FILE: sway/input/seatop_down.c
  type seatop_touch_point_event (line 11) | struct seatop_touch_point_event {
  type seatop_down_event (line 18) | struct seatop_down_event {
  function handle_touch_motion (line 28) | static void handle_touch_motion(struct sway_seat *seat,
  function handle_touch_up (line 53) | static void handle_touch_up(struct sway_seat *seat,
  function handle_touch_down (line 73) | static void handle_touch_down(struct sway_seat *seat,
  function handle_touch_cancel (line 107) | static void handle_touch_cancel(struct sway_seat *seat,
  function handle_pointer_axis (line 133) | static void handle_pointer_axis(struct sway_seat *seat,
  function handle_button (line 148) | static void handle_button(struct sway_seat *seat, uint32_t time_msec,
  function handle_pointer_motion (line 158) | static void handle_pointer_motion(struct sway_seat *seat, uint32_t time_...
  function handle_tablet_tool_tip (line 169) | static void handle_tablet_tool_tip(struct sway_seat *seat,
  function handle_tablet_tool_motion (line 178) | static void handle_tablet_tool_motion(struct sway_seat *seat,
  function handle_destroy (line 190) | static void handle_destroy(struct wl_listener *listener, void *data) {
  function handle_unref (line 198) | static void handle_unref(struct sway_seat *seat, struct sway_container *...
  function handle_end (line 205) | static void handle_end(struct sway_seat *seat) {
  type sway_seatop_impl (line 210) | struct sway_seatop_impl
  function seatop_begin_down (line 225) | void seatop_begin_down(struct sway_seat *seat, struct sway_container *con,
  function seatop_begin_touch_down (line 235) | void seatop_begin_touch_down(struct sway_seat *seat,
  function seatop_begin_down_on_surface (line 242) | void seatop_begin_down_on_surface(struct sway_seat *seat,

FILE: sway/input/seatop_move_floating.c
  type seatop_move_floating_event (line 6) | struct seatop_move_floating_event {
  function finalize_move (line 11) | static void finalize_move(struct sway_seat *seat) {
  function handle_button (line 22) | static void handle_button(struct sway_seat *seat, uint32_t time_msec,
  function handle_tablet_tool_tip (line 30) | static void handle_tablet_tool_tip(struct sway_seat *seat,
  function handle_pointer_motion (line 37) | static void handle_pointer_motion(struct sway_seat *seat, uint32_t time_...
  function handle_unref (line 44) | static void handle_unref(struct sway_seat *seat, struct sway_container *...
  type sway_seatop_impl (line 51) | struct sway_seatop_impl
  function seatop_begin_move_floating (line 58) | void seatop_begin_move_floating(struct sway_seat *seat,

FILE: sway/input/seatop_move_tiling.c
  type seatop_move_tiling_event (line 21) | struct seatop_move_tiling_event {
  function handle_end (line 32) | static void handle_end(struct sway_seat *seat) {
  function handle_motion_prethreshold (line 38) | static void handle_motion_prethreshold(struct sway_seat *seat) {
  function resize_box (line 62) | static void resize_box(struct wlr_box *box, enum wlr_edges edge,
  function split_border (line 88) | static void split_border(double pos, int offset, int len, int n_children,
  function split_titlebar (line 117) | static bool split_titlebar(struct sway_node *node, struct sway_container...
  function update_indicator (line 155) | static void update_indicator(struct seatop_move_tiling_event *e, struct ...
  function handle_motion_postthreshold (line 160) | static void handle_motion_postthreshold(struct sway_seat *seat) {
  function handle_pointer_motion (line 305) | static void handle_pointer_motion(struct sway_seat *seat, uint32_t time_...
  function is_parallel (line 315) | static bool is_parallel(enum sway_container_layout layout,
  function finalize_move (line 322) | static void finalize_move(struct sway_seat *seat) {
  function handle_button (line 406) | static void handle_button(struct sway_seat *seat, uint32_t time_msec,
  function handle_tablet_tool_tip (line 414) | static void handle_tablet_tool_tip(struct sway_seat *seat,
  function handle_unref (line 422) | static void handle_unref(struct sway_seat *seat, struct sway_container *...
  type sway_seatop_impl (line 432) | struct sway_seatop_impl
  function seatop_begin_move_tiling_threshold (line 440) | void seatop_begin_move_tiling_threshold(struct sway_seat *seat,
  function seatop_begin_move_tiling (line 475) | void seatop_begin_move_tiling(struct sway_seat *seat,

FILE: sway/input/seatop_resize_floating.c
  type seatop_resize_floating_event (line 12) | struct seatop_resize_floating_event {
  function handle_button (line 21) | static void handle_button(struct sway_seat *seat, uint32_t time_msec,
  function handle_pointer_motion (line 35) | static void handle_pointer_motion(struct sway_seat *seat, uint32_t time_...
  function handle_unref (line 148) | static void handle_unref(struct sway_seat *seat, struct sway_container *...
  type sway_seatop_impl (line 155) | struct sway_seatop_impl
  function seatop_begin_resize_floating (line 161) | void seatop_begin_resize_floating(struct sway_seat *seat,

FILE: sway/input/seatop_resize_tiling.c
  type seatop_resize_tiling_event (line 11) | struct seatop_resize_tiling_event {
  type sway_container (line 29) | struct sway_container
  type sway_container (line 30) | struct sway_container
  function handle_button (line 46) | static void handle_button(struct sway_seat *seat, uint32_t time_msec,
  function handle_pointer_motion (line 75) | static void handle_pointer_motion(struct sway_seat *seat, uint32_t time_...
  function handle_unref (line 106) | static void handle_unref(struct sway_seat *seat, struct sway_container *...
  type sway_seatop_impl (line 113) | struct sway_seatop_impl
  function seatop_begin_resize_tiling (line 119) | void seatop_begin_resize_tiling(struct sway_seat *seat,

FILE: sway/input/switch.c
  type sway_switch (line 6) | struct sway_switch
  type sway_seat (line 6) | struct sway_seat
  type sway_seat_device (line 7) | struct sway_seat_device
  type sway_switch (line 8) | struct sway_switch
  type sway_switch (line 9) | struct sway_switch
  function sway_switch_trigger_test (line 23) | static bool sway_switch_trigger_test(enum sway_switch_trigger trigger,
  function execute_binding (line 36) | static void execute_binding(struct sway_switch *sway_switch) {
  function handle_switch_toggle (line 78) | static void handle_switch_toggle(struct wl_listener *listene
Condensed preview — 378 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,053K chars).
[
  {
    "path": ".builds/alpine.yml",
    "chars": 1284,
    "preview": "image: alpine/edge\npackages:\n  - cairo-dev\n  - eudev-dev\n  - gdk-pixbuf-dev\n  - json-c-dev\n  - lcms2-dev\n  - libdisplay-"
  },
  {
    "path": ".builds/archlinux.yml",
    "chars": 717,
    "preview": "image: archlinux\npackages:\n  - cairo\n  - gdk-pixbuf2\n  - json-c\n  - lcms2\n  - libdisplay-info\n  - libegl\n  - libinput\n  "
  },
  {
    "path": ".builds/freebsd.yml",
    "chars": 894,
    "preview": "image: freebsd/latest\npackages:\n- devel/basu\n- devel/json-c\n- devel/libevdev\n- devel/meson\n- devel/pcre2\n- devel/pkgconf"
  },
  {
    "path": ".editorconfig",
    "chars": 315,
    "preview": "# For the full list of code style requirements, see CONTRIBUTING.md\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1834,
    "preview": "---\nname: Bugs\nabout: Crashes and other bugs\nlabels: 'bug'\n\n---\n\n### Please read the following before submitting:\n- Plea"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 159,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Questions\n    url: \"https://libera.chat\"\n    about: \"Please ask que"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/enhancement.md",
    "chars": 356,
    "preview": "---\nname: Enhancements\nabout: New functionality\nlabels: 'enhancement'\n\n---\n\n### Please read the following before submitt"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/i3_compat.md",
    "chars": 601,
    "preview": "---\nname: i3 Compatibility\nabout: Sway behaves differently from or lacks i3 functionality\nlabels: 'i3-compat'\n\n---\n\n### "
  },
  {
    "path": ".gitignore",
    "chars": 145,
    "preview": "install_manifest.txt\n*.swp\n*.o\n*.a\nbin/\ntest/\nbuild/\nbuild-*/\n.cache/\n.lvimrc\nconfig-debug\nwayland-*-protocol.*\n/subproj"
  },
  {
    "path": ".mailmap",
    "chars": 51,
    "preview": "Ronan Pigott <ronan@rjp.ie> <rpigott@berkeley.edu>\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 8537,
    "preview": "# Contributing to sway\n\nContributing just involves sending a pull request. You will probably be more\nsuccessful with you"
  },
  {
    "path": "LICENSE",
    "chars": 1061,
    "preview": "Copyright (c) 2016-2017 Drew DeVault\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nth"
  },
  {
    "path": "README.ar.md",
    "chars": 2288,
    "preview": "# sway\n\nsway \n\nهو مدير للمجموعات المركبة لـ[Wayland] متوافق مع [i3] -\n\nإقرأ [الأسئلة الشائعة](https://github.com/swaywm/"
  },
  {
    "path": "README.az.md",
    "chars": 2048,
    "preview": "# sway\n\nsway [i3]-ə uyğun [Wayland] kompozitorudur. [Tez-tez verilən sualları] oxuyun. \n[IRC kanalına] qoşulun (\"irc.lib"
  },
  {
    "path": "README.cs.md",
    "chars": 2463,
    "preview": "# sway\n\nsway je [waylandový][Wayland] kompozitor kompatibilní s [i3]. Přečtěte si\n[FAQ (anglicky)][FAQ]. Připojte se na "
  },
  {
    "path": "README.de.md",
    "chars": 2253,
    "preview": "# Sway\nSway ist ein [i3]-kompatibler [Wayland]-Compositor. Lies die [FAQ]. Tritt dem [IRC Channel] bei (#sway on irc.lib"
  },
  {
    "path": "README.dk.md",
    "chars": 1894,
    "preview": "# Sway\n\nSway er en [i3]-kompatibel [Wayland] compositor. Læs [Ofte stillede spørgsmål].\nDeltag på [IRC kanalen][IRC kana"
  },
  {
    "path": "README.es.md",
    "chars": 1896,
    "preview": "# sway\n\nsway es un compositor de [Wayland](http://wayland.freedesktop.org/) compatible con [i3](https://i3wm.org/).\nLea "
  },
  {
    "path": "README.fr.md",
    "chars": 2264,
    "preview": "# sway\n\nSway est un compositeur [Wayland] compatible avec [i3]. Lisez la\n[FAQ]. Rejoignez le [canal IRC] (#sway sur irc."
  },
  {
    "path": "README.ge.md",
    "chars": 1910,
    "preview": "# sway\n\nsway არის [i3]-თავსებადი [Wayland]-ის კომპოზიტორი. მეტი ინფორმაციისთვის იხილეთ \n[FAQ]. დაუკავშირდით [IRC არხს][I"
  },
  {
    "path": "README.gr.md",
    "chars": 2048,
    "preview": "# Sway\n\nΤο sway ένα [i3]-συμβατό [Wayland] compositor. Διαβάστε το [FAQ]. Μπείτε στο\n[IRC channel] \\(#sway on irc.libera"
  },
  {
    "path": "README.hi.md",
    "chars": 1773,
    "preview": "# sway\n\nsway एक [i3](https://i3wm.org/)-अनुकूल\n[Wayland](https://wayland.freedesktop.org/) Compositor है।\n[FAQ](https://"
  },
  {
    "path": "README.hu.md",
    "chars": 2226,
    "preview": "# sway\n\nA Sway egy [i3]-kompatibilis [Wayland]-kompozitor. Olvasd el a [Gyarkan Ismételt Kérdéseket][FAQ]. Csatlakozz az"
  },
  {
    "path": "README.ir.md",
    "chars": 2155,
    "preview": "# sway\n\n&rlm;sway یک کامپوزیتور الهام گرفته از [i3](https://i3wm.org/) بر روی [Wayland](http://wayland.freedesktop.org/)"
  },
  {
    "path": "README.it.md",
    "chars": 1842,
    "preview": "# sway\n\nsway è un compositore di [Wayland] compatibile con [i3]. Leggi le [FAQ].\nUnisciti al [canale IRC] \\(#sway su irc"
  },
  {
    "path": "README.ja.md",
    "chars": 1478,
    "preview": "# sway\n\nSwayは[i3](https://i3wm.org/)互換な[Wayland](http://wayland.freedesktop.org/)コンポジタです。\n[FAQ](https://github.com/swayw"
  },
  {
    "path": "README.ko.md",
    "chars": 1293,
    "preview": "# sway\n\nsway는 [i3](https://i3wm.org/)-호환 [Wayland](http://wayland.freedesktop.org/) 컴포지터입니다.\n[FAQ](https://github.com/sw"
  },
  {
    "path": "README.md",
    "chars": 2819,
    "preview": "# sway\n\n**[English][en]** - [عربي][ar] - [Azərbaycanca][az] - [Česky][cs] - [Deutsch][de] - [Dansk][dk] - [Español][es] "
  },
  {
    "path": "README.nl.md",
    "chars": 1944,
    "preview": "# sway\n\nSway is een [i3](https://i3wm.org/)-compatibele [Wayland](http://wayland.freedesktop.org/) compositor.\nLees de ["
  },
  {
    "path": "README.no.md",
    "chars": 1930,
    "preview": "# Sway\n\nSway er en [i3]-kompatibel [Wayland]-compositor. Les [Ofte stilte spørsmål].\nDelta på [IRC-kanalen][IRC-kanal] \\"
  },
  {
    "path": "README.pl.md",
    "chars": 1839,
    "preview": "# sway\n\nsway jest kompozytorem [Wayland](http://wayland.freedesktop.org/) kompatybilnym z [i3](https://i3wm.org/).\nPrzec"
  },
  {
    "path": "README.pt.md",
    "chars": 2176,
    "preview": "# sway\n\nO sway é um compositor do [Wayland](http://wayland.freedesktop.org/) compatível com o [i3](https://i3wm.org/).\nL"
  },
  {
    "path": "README.ro.md",
    "chars": 2030,
    "preview": "# sway\n\nsway este un compositor pentru [Wayland](http://wayland.freedesktop.org/) compatibil cu [i3](https://i3wm.org/)."
  },
  {
    "path": "README.ru.md",
    "chars": 1976,
    "preview": "# sway\n\nsway - это [i3]-совместимый композитор [Wayland].\nБольше информации в [FAQ]. Присоединяйтесь к\n[IRC-каналу][IRC "
  },
  {
    "path": "README.sr.md",
    "chars": 1839,
    "preview": "# sway\n\nsway је [i3]-компатибилан [Wayland] композитор. Прочитајте [FAQ]. Придружите се\n[IRC каналу] \\(#sway на irc.libe"
  },
  {
    "path": "README.sv.md",
    "chars": 2296,
    "preview": "# sway\n\nsway är en [i3]-kompatibel [Wayland] compositor. Läs våran [FAQ]-sida. Gå med i vår\n[IRC-kanal] \\(#sway på irc.l"
  },
  {
    "path": "README.tr.md",
    "chars": 2071,
    "preview": "# sway\n\n\nSway, [i3]-uyumlu bir [Wayland] dizgicisidir. [SSS][FAQ]'yi okuyun. \n[IRC kanalı][IRC channel]na katılın \\(irc."
  },
  {
    "path": "README.uk.md",
    "chars": 2324,
    "preview": "# sway\n\nSway це сумісний з [i3](https://i3wm.org/) композитор [Wayland](http://wayland.freedesktop.org/).\nОзнайомтесь з "
  },
  {
    "path": "README.zh-CN.md",
    "chars": 1156,
    "preview": "# sway\n\nsway 是和 [i3](https://i3wm.org/) 兼容的 [Wayland](http://wayland.freedesktop.org/) compositor。\n [查看FAQ](https://gith"
  },
  {
    "path": "README.zh-TW.md",
    "chars": 1238,
    "preview": "# sway\n\nsway 是一個與 [i3](https://i3wm.org/) 相容的 [Wayland](http://wayland.freedesktop.org/) compositor。\n閱讀 [FAQ](https://gi"
  },
  {
    "path": "assets/LICENSE",
    "chars": 7048,
    "preview": "Creative Commons Legal Code\n\nCC0 1.0 Universal\n\n    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE\n"
  },
  {
    "path": "client/meson.build",
    "chars": 215,
    "preview": "lib_sway_client = static_library(\n\t'sway-client',\n\tfiles(\n\t\t'pool-buffer.c',\n\t),\n\tdependencies: [\n\t\tcairo,\n\t\tpango,\n\t\tpa"
  },
  {
    "path": "client/pool-buffer.c",
    "chars": 2995,
    "preview": "#include <assert.h>\n#include <cairo.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <pango/pangocairo.h>\n#include <std"
  },
  {
    "path": "common/cairo.c",
    "chars": 1330,
    "preview": "#include <stdint.h>\n#include <cairo.h>\n#include \"cairo_util.h\"\n\nvoid cairo_set_source_u32(cairo_t *cairo, uint32_t color"
  },
  {
    "path": "common/gesture.c",
    "chars": 8968,
    "preview": "#include \"gesture.h\"\n\n#include <math.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#"
  },
  {
    "path": "common/ipc-client.c",
    "chars": 3735,
    "preview": "#include <stdio.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/socket.h>\n#include <sys/un."
  },
  {
    "path": "common/list.c",
    "chars": 3594,
    "preview": "#include \"list.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include \"log.h\"\n\nlist_t *create_list(void)"
  },
  {
    "path": "common/log.c",
    "chars": 2792,
    "preview": "#include <signal.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n#include <unistd.h>\n#in"
  },
  {
    "path": "common/loop.c",
    "chars": 4401,
    "preview": "#include <limits.h>\n#include <string.h>\n#include <stdbool.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <poll.h>\n#i"
  },
  {
    "path": "common/meson.build",
    "chars": 325,
    "preview": "lib_sway_common = static_library(\n\t'sway-common',\n\tfiles(\n\t\t'cairo.c',\n\t\t'gesture.c',\n\t\t'ipc-client.c',\n\t\t'log.c',\n\t\t'lo"
  },
  {
    "path": "common/pango.c",
    "chars": 4353,
    "preview": "#include <cairo.h>\n#include <pango/pangocairo.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <"
  },
  {
    "path": "common/stringop.c",
    "chars": 7739,
    "preview": "#include <ctype.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#"
  },
  {
    "path": "common/util.c",
    "chars": 3585,
    "preview": "#include <ctype.h>\n#include <fcntl.h>\n#include <math.h>\n#include <time.h>\n#include <stdlib.h>\n#include <string.h>\n#inclu"
  },
  {
    "path": "completions/bash/sway",
    "chars": 754,
    "preview": "# sway(1) completion\n\n_sway()\n{\n  local cur prev short long\n  _get_comp_words_by_ref cur prev\n\n  short=(\n    -h\n    -c\n "
  },
  {
    "path": "completions/bash/swaybar",
    "chars": 693,
    "preview": "# swaybar(1) completion\n\n_swaybar()\n{\n  local cur prev short long\n  _get_comp_words_by_ref cur prev\n\n  short=(\n    -h\n  "
  },
  {
    "path": "completions/bash/swaymsg",
    "chars": 952,
    "preview": "# swaymsg(1) completion\n\n_swaymsg()\n{\n  local cur prev types short long\n  _get_comp_words_by_ref cur prev\n\n  types=(\n   "
  },
  {
    "path": "completions/fish/sway.fish",
    "chars": 656,
    "preview": "# sway(1) completion\n\ncomplete -f -c sway\ncomplete -c sway -s h -l help --description \"Show help message and quit.\"\ncomp"
  },
  {
    "path": "completions/fish/swaymsg.fish",
    "chars": 2494,
    "preview": "# swaymsg(1) completion\n\ncomplete -f -c swaymsg\ncomplete -c swaymsg -s h -l help --description \"Show help message and qu"
  },
  {
    "path": "completions/fish/swaynag.fish",
    "chars": 2955,
    "preview": "# swaynag\ncomplete -f -c swaynag\ncomplete -c swaynag -s C -l config -r --description 'The config file to use. Default: $"
  },
  {
    "path": "completions/meson.build",
    "chars": 1263,
    "preview": "if get_option('zsh-completions')\n\tzsh_files = files(\n\t\t'zsh/_sway',\n\t\t'zsh/_swaymsg',\n\t)\n\tzsh_install_dir = join_paths(d"
  },
  {
    "path": "completions/zsh/_sway",
    "chars": 816,
    "preview": "#compdef sway\n#------------\n# Description\n# -----------\n#\n# Completion script for the sway window manager (http://swaywm"
  },
  {
    "path": "completions/zsh/_swaybar",
    "chars": 463,
    "preview": "#compdef swaybar\n#\n# Completion script for swaybar\n#\n\nlocal bars=($(swaymsg -t get_bar_config | jq -r '.[]'))\n\n_argument"
  },
  {
    "path": "completions/zsh/_swaymsg",
    "chars": 1072,
    "preview": "#compdef swaymsg\n#-----------------\n# Description\n# -----------\n#\n# Completion script for swaymsg in sway wm (http://swa"
  },
  {
    "path": "config.in",
    "chars": 7814,
    "preview": "# Default config for sway\n#\n# Copy this to ~/.config/sway/config and edit it to your liking.\n#\n# Read `man 5 sway` for a"
  },
  {
    "path": "include/cairo_util.h",
    "chars": 394,
    "preview": "#ifndef _SWAY_CAIRO_UTIL_H\n#define _SWAY_CAIRO_UTIL_H\n#include \"config.h\"\n#include <stdint.h>\n#include <cairo.h>\n#includ"
  },
  {
    "path": "include/gesture.h",
    "chars": 2875,
    "preview": "#ifndef _SWAY_GESTURE_H\n#define _SWAY_GESTURE_H\n\n#include <stdbool.h>\n#include <stdint.h>\n\n/**\n * A gesture type used in"
  },
  {
    "path": "include/ipc-client.h",
    "chars": 1160,
    "preview": "#ifndef _SWAY_IPC_CLIENT_H\n#define _SWAY_IPC_CLIENT_H\n\n// arbitrary number, it's probably sufficient, higher number = mo"
  },
  {
    "path": "include/ipc.h",
    "chars": 1016,
    "preview": "#ifndef _SWAY_IPC_H\n#define _SWAY_IPC_H\n\n#define event_mask(ev) (1 << (ev & 0x7F))\n\nenum ipc_command_type {\n\t// i3 comma"
  },
  {
    "path": "include/list.h",
    "chars": 1352,
    "preview": "#ifndef _SWAY_LIST_H\n#define _SWAY_LIST_H\n\ntypedef struct {\n\tint capacity;\n\tint length;\n\tvoid **items;\n} list_t;\n\nlist_t"
  },
  {
    "path": "include/log.h",
    "chars": 1818,
    "preview": "#ifndef _SWAY_LOG_H\n#define _SWAY_LOG_H\n\n#include <stdbool.h>\n#include <stdarg.h>\n#include <string.h>\n#include <errno.h>"
  },
  {
    "path": "include/loop.h",
    "chars": 1215,
    "preview": "#ifndef _SWAY_LOOP_H\n#define _SWAY_LOOP_H\n#include <stdbool.h>\n\n/**\n * This is an event loop system designed for sway cl"
  },
  {
    "path": "include/meson.build",
    "chars": 62,
    "preview": "configure_file(output: 'config.h',  configuration: conf_data)\n"
  },
  {
    "path": "include/pango.h",
    "chars": 968,
    "preview": "#ifndef _SWAY_PANGO_H\n#define _SWAY_PANGO_H\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <cairo"
  },
  {
    "path": "include/pool-buffer.h",
    "chars": 533,
    "preview": "#ifndef _SWAY_BUFFERS_H\n#define _SWAY_BUFFERS_H\n#include <cairo.h>\n#include <pango/pangocairo.h>\n#include <stdbool.h>\n#i"
  },
  {
    "path": "include/stringop.h",
    "chars": 1361,
    "preview": "#ifndef _SWAY_STRINGOP_H\n#define _SWAY_STRINGOP_H\n\n#include <stdbool.h>\n#include <stddef.h>\n#include \"list.h\"\n\n#ifdef __"
  },
  {
    "path": "include/sway/commands.h",
    "chars": 8781,
    "preview": "#ifndef _SWAY_COMMANDS_H\n#define _SWAY_COMMANDS_H\n\n#include <wlr/util/edges.h>\n#include \"config.h\"\n#include \"stringop.h\""
  },
  {
    "path": "include/sway/config.h",
    "chars": 18451,
    "preview": "#ifndef _SWAY_CONFIG_H\n#define _SWAY_CONFIG_H\n#include <libinput.h>\n#include <stdint.h>\n#include <string.h>\n#include <ti"
  },
  {
    "path": "include/sway/criteria.h",
    "chars": 2284,
    "preview": "#ifndef _SWAY_CRITERIA_H\n#define _SWAY_CRITERIA_H\n\n#define PCRE2_CODE_UNIT_WIDTH 8\n#include <pcre2.h>\n#include \"config.h"
  },
  {
    "path": "include/sway/decoration.h",
    "chars": 364,
    "preview": "#ifndef _SWAY_DECORATION_H\n#define _SWAY_DECORATION_H\n\n#include <wlr/types/wlr_server_decoration.h>\n\nstruct sway_server_"
  },
  {
    "path": "include/sway/desktop/idle_inhibit_v1.h",
    "chars": 1476,
    "preview": "#ifndef _SWAY_DESKTOP_IDLE_INHIBIT_V1_H\n#define _SWAY_DESKTOP_IDLE_INHIBIT_V1_H\n#include <wlr/types/wlr_idle_inhibit_v1."
  },
  {
    "path": "include/sway/desktop/launcher.h",
    "chars": 985,
    "preview": "#ifndef _SWAY_LAUNCHER_H\n#define _SWAY_LAUNCHER_H\n\n#include <stdlib.h>\n#include <wayland-server-core.h>\n#include \"sway/i"
  },
  {
    "path": "include/sway/desktop/transaction.h",
    "chars": 2080,
    "preview": "#ifndef _SWAY_TRANSACTION_H\n#define _SWAY_TRANSACTION_H\n#include <stdint.h>\n#include <stdbool.h>\n#include <wlr/types/wlr"
  },
  {
    "path": "include/sway/input/cursor.h",
    "chars": 4670,
    "preview": "#ifndef _SWAY_INPUT_CURSOR_H\n#define _SWAY_INPUT_CURSOR_H\n#include <stdbool.h>\n#include <stdint.h>\n#include <wlr/types/w"
  },
  {
    "path": "include/sway/input/input-manager.h",
    "chars": 2493,
    "preview": "#ifndef _SWAY_INPUT_INPUT_MANAGER_H\n#define _SWAY_INPUT_INPUT_MANAGER_H\n#include <libinput.h>\n#include <wlr/types/wlr_ke"
  },
  {
    "path": "include/sway/input/keyboard.h",
    "chars": 2748,
    "preview": "#ifndef _SWAY_INPUT_KEYBOARD_H\n#define _SWAY_INPUT_KEYBOARD_H\n\n#include \"sway/input/seat.h\"\n\n#define SWAY_KEYBOARD_PRESS"
  },
  {
    "path": "include/sway/input/libinput.h",
    "chars": 425,
    "preview": "#ifndef _SWAY_INPUT_LIBINPUT_H\n#define _SWAY_INPUT_LIBINPUT_H\n#include \"sway/input/input-manager.h\"\n\nbool sway_input_con"
  },
  {
    "path": "include/sway/input/seat.h",
    "chars": 12549,
    "preview": "#ifndef _SWAY_INPUT_SEAT_H\n#define _SWAY_INPUT_SEAT_H\n\n#include <wlr/types/wlr_keyboard_shortcuts_inhibit_v1.h>\n#include"
  },
  {
    "path": "include/sway/input/switch.h",
    "chars": 553,
    "preview": "#ifndef _SWAY_INPUT_SWITCH_H\n#define _SWAY_INPUT_SWITCH_H\n\n#include \"sway/input/seat.h\"\n\nstruct sway_switch {\n\tstruct sw"
  },
  {
    "path": "include/sway/input/tablet.h",
    "chars": 1712,
    "preview": "#ifndef _SWAY_INPUT_TABLET_H\n#define _SWAY_INPUT_TABLET_H\n#include <wlr/types/wlr_layer_shell_v1.h>\n\nstruct sway_seat;\ns"
  },
  {
    "path": "include/sway/input/text_input.h",
    "chars": 2613,
    "preview": "#ifndef _SWAY_INPUT_TEXT_INPUT_H\n#define _SWAY_INPUT_TEXT_INPUT_H\n\n#include <wlr/types/wlr_text_input_v3.h>\n#include <wl"
  },
  {
    "path": "include/sway/input/text_input_popup.h",
    "chars": 561,
    "preview": "#ifndef _SWAY_INPUT_TEXT_INPUT_POPUP_H\n#define _SWAY_INPUT_TEXT_INPUT_POPUP_H\n\n#include \"sway/tree/view.h\"\n\nstruct sway_"
  },
  {
    "path": "include/sway/ipc-json.h",
    "chars": 751,
    "preview": "#ifndef _SWAY_IPC_JSON_H\n#define _SWAY_IPC_JSON_H\n#include <json.h>\n#include \"sway/output.h\"\n#include \"sway/tree/contain"
  },
  {
    "path": "include/sway/ipc-server.h",
    "chars": 858,
    "preview": "#ifndef _SWAY_IPC_SERVER_H\n#define _SWAY_IPC_SERVER_H\n#include <sys/socket.h>\n#include \"sway/config.h\"\n#include \"sway/in"
  },
  {
    "path": "include/sway/layers.h",
    "chars": 1121,
    "preview": "#ifndef _SWAY_LAYERS_H\n#define _SWAY_LAYERS_H\n#include <stdbool.h>\n#include <wlr/types/wlr_compositor.h>\n#include <wlr/t"
  },
  {
    "path": "include/sway/lock.h",
    "chars": 77,
    "preview": "#ifndef _SWAY_LOCK_H\n#define _SWAY_LOCK_H\n\nvoid arrange_locks(void);\n\n#endif\n"
  },
  {
    "path": "include/sway/output.h",
    "chars": 4575,
    "preview": "#ifndef _SWAY_OUTPUT_H\n#define _SWAY_OUTPUT_H\n#include <time.h>\n#include <unistd.h>\n#include <wayland-server-core.h>\n#in"
  },
  {
    "path": "include/sway/scene_descriptor.h",
    "chars": 1038,
    "preview": "/**\n * Across a wayland compositor, there are multiple shells: It can be\n * a toplevel, or a layer_shell, or even someth"
  },
  {
    "path": "include/sway/server.h",
    "chars": 6690,
    "preview": "#ifndef _SWAY_SERVER_H\n#define _SWAY_SERVER_H\n#include <stdbool.h>\n#include <wayland-server-core.h>\n#include \"config.h\"\n"
  },
  {
    "path": "include/sway/sway_text_node.h",
    "chars": 704,
    "preview": "#ifndef _SWAY_BUFFER_H\n#define _SWAY_BUFFER_H\n#include <wlr/types/wlr_scene.h>\n\nstruct sway_text_node {\n\tint width;\n\tint"
  },
  {
    "path": "include/sway/swaynag.h",
    "chars": 940,
    "preview": "#ifndef _SWAY_SWAYNAG_H\n#define _SWAY_SWAYNAG_H\n#include <wayland-server-core.h>\n#include \"stringop.h\"\n\nstruct swaynag_i"
  },
  {
    "path": "include/sway/tree/arrange.h",
    "chars": 379,
    "preview": "#ifndef _SWAY_ARRANGE_H\n#define _SWAY_ARRANGE_H\n\nstruct sway_output;\nstruct sway_workspace;\nstruct sway_container;\nstruc"
  },
  {
    "path": "include/sway/tree/container.h",
    "chars": 10354,
    "preview": "#ifndef _SWAY_CONTAINER_H\n#define _SWAY_CONTAINER_H\n#include <stdint.h>\n#include <sys/types.h>\n#include <wlr/types/wlr_c"
  },
  {
    "path": "include/sway/tree/node.h",
    "chars": 2337,
    "preview": "#ifndef _SWAY_NODE_H\n#define _SWAY_NODE_H\n#include <wayland-server-core.h>\n#include <stdbool.h>\n#include <wlr/types/wlr_"
  },
  {
    "path": "include/sway/tree/root.h",
    "chars": 3301,
    "preview": "#ifndef _SWAY_ROOT_H\n#define _SWAY_ROOT_H\n#include <wayland-server-core.h>\n#include <wayland-util.h>\n#include <wlr/confi"
  },
  {
    "path": "include/sway/tree/view.h",
    "chars": 10395,
    "preview": "#ifndef _SWAY_VIEW_H\n#define _SWAY_VIEW_H\n#include <wayland-server-core.h>\n#include <wlr/config.h>\n#include <wlr/types/w"
  },
  {
    "path": "include/sway/tree/workspace.h",
    "chars": 4746,
    "preview": "#ifndef _SWAY_WORKSPACE_H\n#define _SWAY_WORKSPACE_H\n\n#include <stdbool.h>\n#include <wlr/types/wlr_scene.h>\n#include \"swa"
  },
  {
    "path": "include/sway/xdg_decoration.h",
    "chars": 475,
    "preview": "#ifndef _SWAY_XDG_DECORATION_H\n#define _SWAY_XDG_DECORATION_H\n\n#include <wlr/types/wlr_xdg_decoration_v1.h>\n\nstruct sway"
  },
  {
    "path": "include/sway/xwayland.h",
    "chars": 670,
    "preview": "#ifndef SWAY_XWAYLAND_H\n#define SWAY_XWAYLAND_H\n\n#include <wlr/xwayland.h>\n#include <xcb/xproto.h>\n\nenum atom_name {\n\tNE"
  },
  {
    "path": "include/swaybar/bar.h",
    "chars": 3080,
    "preview": "#ifndef _SWAYBAR_BAR_H\n#define _SWAYBAR_BAR_H\n#include <wayland-client.h>\n#include \"config.h\"\n#include \"input.h\"\n#includ"
  },
  {
    "path": "include/swaybar/config.h",
    "chars": 2047,
    "preview": "#ifndef _SWAYBAR_CONFIG_H\n#define _SWAYBAR_CONFIG_H\n#include <stdbool.h>\n#include <stdint.h>\n#include <wayland-client.h>"
  },
  {
    "path": "include/swaybar/i3bar.h",
    "chars": 870,
    "preview": "#ifndef _SWAYBAR_I3BAR_H\n#define _SWAYBAR_I3BAR_H\n\n#include \"input.h\"\n#include \"status_line.h\"\n\nstruct i3bar_block {\n\tst"
  },
  {
    "path": "include/swaybar/image.h",
    "chars": 125,
    "preview": "#ifndef _SWAYBAR_IMAGE_H\n#define _SWAYBAR_IMAGE_H\n#include <cairo.h>\n\ncairo_surface_t *load_image(const char *path);\n\n#e"
  },
  {
    "path": "include/swaybar/input.h",
    "chars": 1820,
    "preview": "#ifndef _SWAYBAR_INPUT_H\n#define _SWAYBAR_INPUT_H\n\n#include <wayland-client.h>\n#include <stdbool.h>\n#include \"list.h\"\n\n#"
  },
  {
    "path": "include/swaybar/ipc.h",
    "chars": 383,
    "preview": "#ifndef _SWAYBAR_IPC_H\n#define _SWAYBAR_IPC_H\n#include <stdbool.h>\n#include \"swaybar/bar.h\"\n\nbool ipc_initialize(struct "
  },
  {
    "path": "include/swaybar/render.h",
    "chars": 135,
    "preview": "#ifndef _SWAYBAR_RENDER_H\n#define _SWAYBAR_RENDER_H\n\nstruct swaybar_output;\n\nvoid render_frame(struct swaybar_output *ou"
  },
  {
    "path": "include/swaybar/status_line.h",
    "chars": 903,
    "preview": "#ifndef _SWAYBAR_STATUS_LINE_H\n#define _SWAYBAR_STATUS_LINE_H\n#include <json.h>\n#include <stdint.h>\n#include <stdio.h>\n#"
  },
  {
    "path": "include/swaybar/tray/host.h",
    "chars": 338,
    "preview": "#ifndef _SWAYBAR_TRAY_HOST_H\n#define _SWAYBAR_TRAY_HOST_H\n\n#include <stdbool.h>\n\nstruct swaybar_tray;\n\nstruct swaybar_ho"
  },
  {
    "path": "include/swaybar/tray/icon.h",
    "chars": 955,
    "preview": "#ifndef _SWAYBAR_TRAY_ICON_H\n#define _SWAYBAR_TRAY_ICON_H\n\n#include \"list.h\"\n\nstruct icon_theme_subdir {\n\tchar *name;\n\ti"
  },
  {
    "path": "include/swaybar/tray/item.h",
    "chars": 1218,
    "preview": "#ifndef _SWAYBAR_TRAY_ITEM_H\n#define _SWAYBAR_TRAY_ITEM_H\n\n#include <cairo.h>\n#include <stdbool.h>\n#include <stdint.h>\n#"
  },
  {
    "path": "include/swaybar/tray/tray.h",
    "chars": 937,
    "preview": "#ifndef _SWAYBAR_TRAY_TRAY_H\n#define _SWAYBAR_TRAY_TRAY_H\n\n#include \"config.h\"\n#if HAVE_LIBSYSTEMD\n#include <systemd/sd-"
  },
  {
    "path": "include/swaybar/tray/watcher.h",
    "chars": 354,
    "preview": "#ifndef _SWAYBAR_TRAY_WATCHER_H\n#define _SWAYBAR_TRAY_WATCHER_H\n\n#include \"swaybar/tray/tray.h\"\n#include \"list.h\"\n\nstruc"
  },
  {
    "path": "include/swaynag/config.h",
    "chars": 371,
    "preview": "#ifndef _SWAYNAG_CONFIG_H\n#define _SWAYNAG_CONFIG_H\n#include \"swaynag/swaynag.h\"\n#include \"list.h\"\n\nint swaynag_parse_op"
  },
  {
    "path": "include/swaynag/render.h",
    "chars": 134,
    "preview": "#ifndef _SWAYNAG_RENDER_H\n#define _SWAYNAG_RENDER_H\n#include \"swaynag/swaynag.h\"\n\nvoid render_frame(struct swaynag *sway"
  },
  {
    "path": "include/swaynag/swaynag.h",
    "chars": 2138,
    "preview": "#ifndef _SWAYNAG_SWAYNAG_H\n#define _SWAYNAG_SWAYNAG_H\n#include <stdint.h>\n#include <strings.h>\n#include \"list.h\"\n#includ"
  },
  {
    "path": "include/swaynag/types.h",
    "chars": 1137,
    "preview": "#ifndef _SWAYNAG_TYPES_H\n#define _SWAYNAG_TYPES_H\n\n#include <stdint.h>\n#include <pango/pangocairo.h>\n#include \"list.h\"\n\n"
  },
  {
    "path": "include/util.h",
    "chars": 1641,
    "preview": "#ifndef _SWAY_UTIL_H\n#define _SWAY_UTIL_H\n\n#include <stdint.h>\n#include <stdbool.h>\n#include <wayland-server-protocol.h>"
  },
  {
    "path": "meson.build",
    "chars": 7299,
    "preview": "project(\n\t'sway',\n\t'c',\n\tversion: '1.12-dev',\n\tlicense: 'MIT',\n\tmeson_version: '>=1.3',\n\tdefault_options: [\n\t\t'c_std=c11"
  },
  {
    "path": "meson_options.txt",
    "chars": 1075,
    "preview": "option('default-wallpaper', type: 'boolean', value: true, description: 'Install the default wallpaper.')\noption('zsh-com"
  },
  {
    "path": "protocols/meson.build",
    "chars": 1194,
    "preview": "wl_protocol_dir = wayland_protos.get_variable('pkgdatadir')\n\nwayland_scanner_dep = dependency('wayland-scanner', native:"
  },
  {
    "path": "protocols/wlr-layer-shell-unstable-v1.xml",
    "chars": 19325,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<protocol name=\"wlr_layer_shell_unstable_v1\">\n  <copyright>\n    Copyright © 2017 "
  },
  {
    "path": "protocols/wlr-output-power-management-unstable-v1.xml",
    "chars": 5596,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<protocol name=\"wlr_output_power_management_unstable_v1\">\n  <copyright>\n    Copyr"
  },
  {
    "path": "release.sh",
    "chars": 775,
    "preview": "#!/bin/sh -eu\n\nprev=$(git describe --tags --abbrev=0)\nnext=$(meson rewrite kwargs info project / | jq -r '.kwargs[\"proje"
  },
  {
    "path": "sway/commands/allow_tearing.c",
    "chars": 713,
    "preview": "#include <sway/commands.h>\n#include \"sway/config.h\"\n#include \"sway/tree/view.h\"\n#include \"util.h\"\n\nstruct cmd_results *c"
  },
  {
    "path": "sway/commands/assign.c",
    "chars": 1430,
    "preview": "#include <stdio.h>\n#include <string.h>\n#include \"sway/commands.h\"\n#include \"sway/criteria.h\"\n#include \"list.h\"\n#include "
  },
  {
    "path": "sway/commands/bar/bind.c",
    "chars": 3832,
    "preview": "#include <libevdev/libevdev.h>\n#include <stdlib.h>\n#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#"
  },
  {
    "path": "sway/commands/bar/binding_mode_indicator.c",
    "chars": 746,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n#include \"util.h\"\n\nstruct cmd_resul"
  },
  {
    "path": "sway/commands/bar/colors.c",
    "chars": 5088,
    "preview": "#include <string.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n#include \"util.h\"\n\n// Must be in alphabetical order for "
  },
  {
    "path": "sway/commands/bar/font.c",
    "chars": 879,
    "preview": "#include <string.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n#include \"stringop.h\"\n\nstruct cmd_results *bar_cmd_font("
  },
  {
    "path": "sway/commands/bar/gaps.c",
    "chars": 1459,
    "preview": "#include <stdlib.h>\n#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"sway/ipc-server.h\"\n#in"
  },
  {
    "path": "sway/commands/bar/height.c",
    "chars": 578,
    "preview": "#include <stdlib.h>\n#include <string.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n\nstruct cmd_results *bar_cmd_height("
  },
  {
    "path": "sway/commands/bar/hidden_state.c",
    "chars": 2238,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/ipc-server.h"
  },
  {
    "path": "sway/commands/bar/icon_theme.c",
    "chars": 648,
    "preview": "#include <string.h>\n#include \"config.h\"\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"log.h\"\n\nstruct cmd"
  },
  {
    "path": "sway/commands/bar/id.c",
    "chars": 1070,
    "preview": "#include <string.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n\nstruct cmd_results *bar_cmd_id(int argc, char **argv) {"
  },
  {
    "path": "sway/commands/bar/mode.c",
    "chars": 2176,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/ipc-server.h"
  },
  {
    "path": "sway/commands/bar/modifier.c",
    "chars": 1160,
    "preview": "#include <string.h>\n#include \"sway/commands.h\"\n#include \"sway/input/keyboard.h\"\n#include \"log.h\"\n#include \"stringop.h\"\n\n"
  },
  {
    "path": "sway/commands/bar/output.c",
    "chars": 1244,
    "preview": "#include <stdbool.h>\n#include <string.h>\n#include \"sway/commands.h\"\n#include \"list.h\"\n#include \"log.h\"\n\nstruct cmd_resul"
  },
  {
    "path": "sway/commands/bar/pango_markup.c",
    "chars": 675,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n#include \"util.h\"\n\nstruct cmd_resul"
  },
  {
    "path": "sway/commands/bar/position.c",
    "chars": 735,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n\nstruct cmd_results *bar_cmd_positi"
  },
  {
    "path": "sway/commands/bar/separator_symbol.c",
    "chars": 550,
    "preview": "#include <string.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n\nstruct cmd_results *bar_cmd_separator_symbol(int argc, "
  },
  {
    "path": "sway/commands/bar/status_command.c",
    "chars": 691,
    "preview": "#include <string.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n#include \"stringop.h\"\n\nstruct cmd_results *bar_cmd_statu"
  },
  {
    "path": "sway/commands/bar/status_edge_padding.c",
    "chars": 692,
    "preview": "#include <stdlib.h>\n#include <string.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n\nstruct cmd_results *bar_cmd_status_"
  },
  {
    "path": "sway/commands/bar/status_padding.c",
    "chars": 667,
    "preview": "#include <stdlib.h>\n#include <string.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n\nstruct cmd_results *bar_cmd_status_"
  },
  {
    "path": "sway/commands/bar/strip_workspace_name.c",
    "chars": 781,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n#include \"util.h\"\n\nstruct cmd_resul"
  },
  {
    "path": "sway/commands/bar/strip_workspace_numbers.c",
    "chars": 799,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n#include \"util.h\"\n\nstruct cmd_resul"
  },
  {
    "path": "sway/commands/bar/swaybar_command.c",
    "chars": 538,
    "preview": "#include <string.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n#include \"stringop.h\"\n\nstruct cmd_results *bar_cmd_swayb"
  },
  {
    "path": "sway/commands/bar/tray_bind.c",
    "chars": 2593,
    "preview": "#include <strings.h>\n#include \"config.h\"\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/input/cursor"
  },
  {
    "path": "sway/commands/bar/tray_output.c",
    "chars": 1382,
    "preview": "#include <string.h>\n#include \"config.h\"\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"list.h\"\n#include \""
  },
  {
    "path": "sway/commands/bar/tray_padding.c",
    "chars": 1113,
    "preview": "#include <stdlib.h>\n#include <strings.h>\n#include \"config.h\"\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#includ"
  },
  {
    "path": "sway/commands/bar/workspace_buttons.c",
    "chars": 708,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n#include \"util.h\"\n\nstruct cmd_resul"
  },
  {
    "path": "sway/commands/bar/workspace_min_width.c",
    "chars": 988,
    "preview": "#include <stdlib.h>\n#include <strings.h>\n#include \"config.h\"\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#includ"
  },
  {
    "path": "sway/commands/bar/wrap_scroll.c",
    "chars": 666,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"log.h\"\n#include \"util.h\"\n\nstruct cmd_resul"
  },
  {
    "path": "sway/commands/bar.c",
    "chars": 4101,
    "preview": "#include <stdio.h>\n#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include"
  },
  {
    "path": "sway/commands/bind.c",
    "chars": 22046,
    "preview": "#include <libevdev/libevdev.h>\n#include <linux/input-event-codes.h>\n#include <string.h>\n#include <strings.h>\n#include <x"
  },
  {
    "path": "sway/commands/border.c",
    "chars": 2952,
    "preview": "#include \"log.h\"\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/input/cursor.h\"\n#include \"sway/input"
  },
  {
    "path": "sway/commands/client.c",
    "chars": 2958,
    "preview": "#include \"log.h\"\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/output.h\"\n#include \"sway/tree/contai"
  },
  {
    "path": "sway/commands/create_output.c",
    "chars": 1162,
    "preview": "#include <wlr/config.h>\n#include <wlr/backend/headless.h>\n#include <wlr/backend/multi.h>\n#include <wlr/backend/wayland.h"
  },
  {
    "path": "sway/commands/default_border.c",
    "chars": 764,
    "preview": "#include \"log.h\"\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/tree/container.h\"\n\nstruct cmd_result"
  },
  {
    "path": "sway/commands/default_floating_border.c",
    "chars": 848,
    "preview": "#include \"log.h\"\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/tree/container.h\"\n\nstruct cmd_result"
  },
  {
    "path": "sway/commands/default_orientation.c",
    "chars": 669,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n\nstruct cmd_results *cmd_default_orientation(int arg"
  },
  {
    "path": "sway/commands/exec.c",
    "chars": 500,
    "preview": "#include <string.h>\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"log.h\"\n#include \"stringop.h\"\n\nstruct c"
  },
  {
    "path": "sway/commands/exec_always.c",
    "chars": 2202,
    "preview": "#include <stdlib.h>\n#include <stdint.h>\n#include <string.h>\n#include <sys/wait.h>\n#include <unistd.h>\n#include <signal.h"
  },
  {
    "path": "sway/commands/exit.c",
    "chars": 335,
    "preview": "#include <stddef.h>\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/server.h\"\n\nstruct cmd_results *cm"
  },
  {
    "path": "sway/commands/floating.c",
    "chars": 1882,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"sway/input/seat.h\"\n#include \"sway/ipc-serv"
  },
  {
    "path": "sway/commands/floating_minmax_size.c",
    "chars": 1458,
    "preview": "#include <errno.h>\n#include <math.h>\n#include <stdbool.h>\n#include <stdlib.h>\n#include <string.h>\n#include <strings.h>\n#"
  },
  {
    "path": "sway/commands/floating_modifier.c",
    "chars": 921,
    "preview": "#include \"strings.h\"\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/input/keyboard.h\"\n\nstruct cmd_re"
  },
  {
    "path": "sway/commands/focus.c",
    "chars": 14107,
    "preview": "#include <float.h>\n#include <strings.h>\n#include <wlr/types/wlr_output_layout.h>\n#include \"log.h\"\n#include \"sway/command"
  },
  {
    "path": "sway/commands/focus_follows_mouse.c",
    "chars": 700,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"util.h\"\n\nstruct cmd_results *cmd_focus_fol"
  },
  {
    "path": "sway/commands/focus_on_window_activation.c",
    "chars": 801,
    "preview": "#include \"sway/commands.h\"\n\nstruct cmd_results *cmd_focus_on_window_activation(int argc, char **argv) {\n\tstruct cmd_resu"
  },
  {
    "path": "sway/commands/focus_wrapping.c",
    "chars": 668,
    "preview": "#include <strings.h>\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"util.h\"\n\nstruct cmd_results *cmd_focu"
  },
  {
    "path": "sway/commands/font.c",
    "chars": 1432,
    "preview": "#include <string.h>\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"log.h\"\n#include \"stringop.h\"\n#include "
  },
  {
    "path": "sway/commands/for_window.c",
    "chars": 1030,
    "preview": "#include <string.h>\n#include \"sway/commands.h\"\n#include \"sway/criteria.h\"\n#include \"list.h\"\n#include \"log.h\"\n#include \"s"
  },
  {
    "path": "sway/commands/force_display_urgency_hint.c",
    "chars": 752,
    "preview": "#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include <errno.h>\n\nstruct cmd_results *cmd_force_display_urgency_hi"
  },
  {
    "path": "sway/commands/force_focus_wrapping.c",
    "chars": 724,
    "preview": "#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"log.h\"\n#include \"util.h\"\n\nstruct cmd_results *cmd_force_fo"
  },
  {
    "path": "sway/commands/fullscreen.c",
    "chars": 1581,
    "preview": "#include <strings.h>\n#include \"log.h\"\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/tree/arrange.h\""
  },
  {
    "path": "sway/commands/gaps.c",
    "chars": 6660,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/tree/arrange"
  },
  {
    "path": "sway/commands/gesture.c",
    "chars": 4520,
    "preview": "#include \"sway/config.h\"\n\n#include \"gesture.h\"\n#include \"log.h\"\n#include \"stringop.h\"\n#include \"sway/commands.h\"\n\nvoid f"
  },
  {
    "path": "sway/commands/hide_edge_borders.c",
    "chars": 1421,
    "preview": "#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/tree/arrange.h\"\n#include \"sway/tree/view.h\"\n\nstruct c"
  },
  {
    "path": "sway/commands/include.c",
    "chars": 444,
    "preview": "#include \"sway/commands.h\"\n#include \"sway/config.h\"\n\nstruct cmd_results *cmd_include(int argc, char **argv) {\n\tstruct cm"
  },
  {
    "path": "sway/commands/inhibit_idle.c",
    "chars": 1492,
    "preview": "#include <string.h>\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/desktop/idle_inhibit_v1.h\"\n#inclu"
  },
  {
    "path": "sway/commands/input/accel_profile.c",
    "chars": 835,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/config.h\"\n#include \"sway/commands.h\"\n#include \"sway/input/input-"
  },
  {
    "path": "sway/commands/input/calibration_matrix.c",
    "chars": 964,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/config.h\"\n#include \"sway/commands.h\"\n#include \"sway/input/input-"
  },
  {
    "path": "sway/commands/input/click_method.c",
    "chars": 986,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/commands.h\"\n#include \"sway/config.h\"\n#include \"sway/input/input-"
  },
  {
    "path": "sway/commands/input/clickfinger_button_map.c",
    "chars": 865,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/config.h\"\n#include \"sway/commands.h\"\n#include \"sway/input/input-"
  },
  {
    "path": "sway/commands/input/drag.c",
    "chars": 659,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/config.h\"\n#include \"sway/commands.h\"\n#include \"sway/input/input-"
  },
  {
    "path": "sway/commands/input/drag_lock.c",
    "chars": 861,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/config.h\"\n#include \"sway/commands.h\"\n#include \"sway/input/input-"
  },
  {
    "path": "sway/commands/input/dwt.c",
    "chars": 653,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/config.h\"\n#include \"sway/commands.h\"\n#include \"sway/input/input-"
  },
  {
    "path": "sway/commands/input/dwtp.c",
    "chars": 659,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/config.h\"\n#include \"sway/commands.h\"\n#include \"sway/input/input-"
  },
  {
    "path": "sway/commands/input/events.c",
    "chars": 4935,
    "preview": "#include <limits.h>\n#include <string.h>\n#include <strings.h>\n#include <wlr/config.h>\n#include \"sway/config.h\"\n#include \""
  },
  {
    "path": "sway/commands/input/left_handed.c",
    "chars": 585,
    "preview": "#include <string.h>\n#include <strings.h>\n#include \"sway/config.h\"\n#include \"sway/commands.h\"\n#include \"sway/input/input-"
  },
  {
    "path": "sway/commands/input/map_from_region.c",
    "chars": 2194,
    "preview": "#include <stdbool.h>\n#include <string.h>\n#include <strings.h>\n#include \"log.h\"\n#include \"sway/commands.h\"\n#include \"sway"
  }
]

// ... and 178 more files (download for full content)

About this extraction

This page contains the full source code of the swaywm/sway GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 378 files (1.8 MB), approximately 520.1k tokens, and a symbol index with 3751 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!