commit
ec60e24f75
@ -1,159 +1,147 @@
|
|||||||
/////
|
|
||||||
vim:set ts=4 sw=4 tw=82 noet:
|
|
||||||
/////
|
|
||||||
sway-bar(5)
|
sway-bar(5)
|
||||||
============
|
|
||||||
|
|
||||||
Name
|
# NAME
|
||||||
----
|
|
||||||
sway-bar - bar configuration file and commands
|
sway-bar - bar configuration file and commands
|
||||||
|
|
||||||
Description
|
# DESCRIPTION
|
||||||
-----------
|
|
||||||
|
|
||||||
Sway allows configuring swaybar in the sway configuration file.
|
Sway allows configuring swaybar in the sway configuration file. Swaybar
|
||||||
Swaybar commands must be used inside a _bar { }_ block in the config file.
|
commands must be used inside a _bar { }_ block in the config file.
|
||||||
|
|
||||||
|
# COMMANDS
|
||||||
|
|
||||||
Commands
|
*status\_command* <status command>
|
||||||
--------
|
Executes the bar _status command_ with _sh -c_. Each line of text printed
|
||||||
|
to stdout from this command will be displayed in the status area of the
|
||||||
|
bar. You may also use the i3bar JSON protocol:
|
||||||
|
|
||||||
**status_command** <status command>::
|
|
||||||
Executes the bar _status command_ with _sh -c_. Each line of text printed to
|
|
||||||
stdout from this command will be displayed in the status area of the bar. You
|
|
||||||
may also use the i3bar JSON protocol:
|
|
||||||
+
|
|
||||||
https://i3wm.org/docs/i3bar-protocol.html
|
https://i3wm.org/docs/i3bar-protocol.html
|
||||||
|
|
||||||
**pango_markup** <enabled|disabled>::
|
*pango\_markup* enabled|disabled
|
||||||
Enables or disables pango markup for status lines. This has no effect on
|
Enables or disables pango markup for status lines. This has no effect on
|
||||||
status lines using the i3bar JSON protocol.
|
status lines using the i3bar JSON protocol.
|
||||||
|
|
||||||
**id** <bar_id>::
|
*id* <bar\_id>
|
||||||
Sets the ID of the bar.
|
Sets the ID of the bar.
|
||||||
|
|
||||||
**position** <top|bottom>::
|
*position* top|bottom
|
||||||
Sets position of the bar. Default is _bottom_.
|
Sets position of the bar. Default is _bottom_.
|
||||||
|
|
||||||
**output** <output>::
|
*output* <output>
|
||||||
Restrict the bar to a certain output, can be specified multiple times. If the
|
Restrict the bar to a certain output, can be specified multiple times. If
|
||||||
output command is omitted, the bar will be displayed on all outputs.
|
the output command is omitted, the bar will be displayed on all outputs.
|
||||||
|
|
||||||
**swaybar_command** <command>::
|
*swaybar\_command* <command>
|
||||||
Executes custom bar command, default is _swaybar_.
|
Executes custom bar command. Default is _swaybar_.
|
||||||
|
|
||||||
**font** <font>::
|
*font* <font>
|
||||||
Specifies the font to be used in the bar.
|
Specifies the font to be used in the bar.
|
||||||
|
|
||||||
**separator_symbol** <symbol>::
|
*separator\_symbol* <symbol>
|
||||||
Specifies the separator symbol to separate blocks on the bar.
|
Specifies the separator symbol to separate blocks on the bar.
|
||||||
|
|
||||||
**wrap_scroll** <yes|no>::
|
*wrap\_scroll* yes|no
|
||||||
Enables or disables wrapping when scrolling through workspaces with the
|
Enables or disables wrapping when scrolling through workspaces with the
|
||||||
scroll wheel. Default is _no_.
|
scroll wheel. Default is _no_.
|
||||||
|
|
||||||
**workspace_buttons** <yes|no>::
|
*workspace\_buttons* yes|no
|
||||||
Enables or disables workspace buttons on the bar. Default is _yes_.
|
Enables or disables workspace buttons on the bar. Default is _yes_.
|
||||||
|
|
||||||
**strip_workspace_numbers** <yes|no>::
|
*strip\_workspace\_numbers* yes|no
|
||||||
If set to _yes_, then workspace numbers will be omitted from the workspace
|
If set to _yes_, then workspace numbers will be omitted from the workspace
|
||||||
button and only the custom name will be shown. Default is _no_.
|
button and only the custom name will be shown. Default is _no_.
|
||||||
|
|
||||||
**binding_mode_indicator** <yes|no>::
|
*binding\_mode\_indicator* yes|no
|
||||||
Enable or disable binding mode indicator. Default is _yes_.
|
Enable or disable binding mode indicator. Default is _yes_.
|
||||||
|
|
||||||
**height** <height>::
|
*height* <height>
|
||||||
Sets the height of the bar. Default height will match the font size.
|
Sets the height of the bar. Default height will match the font size.
|
||||||
|
|
||||||
Tray
|
## TRAY
|
||||||
----
|
|
||||||
|
Swaybar provides a system tray where third-party applications may place icons.
|
||||||
|
The following commands configure the tray.
|
||||||
|
|
||||||
Swaybar provides a system tray where programs such as NetworkManager, VLC,
|
The _button_ argument in all cases is a platform-specific button code. On Linux
|
||||||
Pidgin, etc. can place little icons. The following commands configure
|
you can find a list of these at linux/input-event-codes.h.
|
||||||
interaction with the tray or individual icons.
|
|
||||||
The _button_ argument in all following commands is a Linux input event code as
|
|
||||||
defined in linux/input-event-codes.h. This is because wayland defines button
|
|
||||||
codes in this manner.
|
|
||||||
|
|
||||||
**activate_button** <button>::
|
*activate\_button* <button>
|
||||||
Sets the button to be used for the _activate_ (primary click) tray item
|
Sets the button to be used for the _activate_ (primary click) tray item
|
||||||
event. The default is BTN_LEFT (0x110).
|
event. The default is BTN\_LEFT (0x110).
|
||||||
|
|
||||||
**context_button** <button>::
|
*context\_button* <button>
|
||||||
Sets the button to be used for the _context menu_ (right click) tray item
|
Sets the button to be used for the _context menu_ (right click) tray item
|
||||||
event. The default is BTN_RIGHT (0x111).
|
event. The default is BTN\_RIGHT (0x111).
|
||||||
|
|
||||||
**secondary_button** <button>::
|
*secondary\_button* <button>
|
||||||
Sets the button to be used for the _secondary_ (middle click) tray item
|
Sets the button to be used for the _secondary_ (middle click) tray item
|
||||||
event. The default is BTN_MIDDLE (0x112).
|
event. The default is BTN\_MIDDLE (0x112).
|
||||||
|
|
||||||
**tray_output** none|all|<name>::
|
*tray\_output* none|all|<output>
|
||||||
Sets the output that the tray will appear on or none. Unlike i3bar, swaybar
|
Sets the output that the tray will appear on or none. Unlike i3bar, swaybar
|
||||||
should be able to show icons on any number of bars and outputs without
|
is able to show icons on any number of bars and outputs without races.
|
||||||
races. Because of this, the default value for this is _all_.
|
The default is _all_.
|
||||||
|
|
||||||
**tray_padding** <px> [px]::
|
*tray\_padding* <px> [px]
|
||||||
Sets the pixel padding of the system tray. This padding will surround the
|
Sets the pixel padding of the system tray. This padding will surround the
|
||||||
tray on all sides and between each item. The default value for _px_ is 2.
|
tray on all sides and between each item. The default value for _px_ is 2.
|
||||||
|
|
||||||
**icon_theme** <name>::
|
*icon\_theme* <name>
|
||||||
Sets the icon theme that sway will look for item icons in. This option has
|
Sets the icon theme that sway will look for item icons in. This option has
|
||||||
no default value, because sway will always default to the fallback theme,
|
no default value, because sway will always default to the fallback theme,
|
||||||
hicolor.
|
hicolor.
|
||||||
|
|
||||||
Colors
|
## COLORS
|
||||||
------
|
|
||||||
|
|
||||||
Colors are defined within a _colors { }_ block inside a _bar { }_ block. Colors
|
Colors are defined within a _colors { }_ block inside a _bar { }_ block. Colors
|
||||||
must be defined in hex. i.e. _#rrggbb_ or _#rrggbbaa_ when including the alpha
|
must be defined in hex: _#RRGGBB_ or _#RRGGBBAA_.
|
||||||
channel.
|
|
||||||
|
|
||||||
**background** <color>::
|
*background* <color>
|
||||||
Background color of the bar.
|
Background color of the bar.
|
||||||
|
|
||||||
**statusline** <color>::
|
*statusline* <color>
|
||||||
Text color to be used for the statusline.
|
Text color to be used for the statusline.
|
||||||
|
|
||||||
**separator** <color>::
|
*separator* <color>
|
||||||
Text color to be used for the separator.
|
Text color to be used for the separator.
|
||||||
|
|
||||||
**focused_background** <color>::
|
*focused\_background* <color>
|
||||||
Background color of the bar on the currently focused monitor output. If not
|
Background color of the bar on the currently focused monitor output. If not
|
||||||
used, the color will be taken from _background_.
|
used, the color will be taken from _background_.
|
||||||
|
|
||||||
**focused_statusline** <color>::
|
*focused\_statusline* <color>
|
||||||
Text color to be used for the statusline on the currently focused monitor
|
Text color to be used for the statusline on the currently focused monitor
|
||||||
output. If not used, the color will be taken from _statusline_.
|
output. If not used, the color will be taken from _statusline_.
|
||||||
|
|
||||||
**focused_separator** <color>::
|
*focused\_separator* <color>
|
||||||
Text color to be used for the separator on the currently focused monitor
|
Text color to be used for the separator on the currently focused monitor
|
||||||
output. If not used, the color will be taken from _separator_.
|
output. If not used, the color will be taken from _separator_.
|
||||||
|
|
||||||
**focused_workspace** <border> <background> <text>::
|
*focused\_workspace* <border> <background> <text>
|
||||||
Border, background and text color for a workspace button when the workspace
|
Border, background and text color for a workspace button when the workspace
|
||||||
has focus.
|
has focus.
|
||||||
|
|
||||||
**active_workspace** <border> <background> <text>::
|
*active\_workspace* <border> <background> <text>
|
||||||
Border, background and text color for a workspace button when the workspace is
|
Border, background and text color for a workspace button when the workspace
|
||||||
active (visible) on some output, but the focus is on another one. You can only
|
is active (visible) on some output, but the focus is on another one. You
|
||||||
tell this apart from the focused workspace when you are using multiple
|
can only tell this apart from the focused workspace when you are using
|
||||||
monitors.
|
multiple monitors.
|
||||||
|
|
||||||
**inactive_workspace** <border> <background> <text>::
|
*inactive\_workspace* <border> <background> <text>
|
||||||
Border, background and text color for a workspace button when the workspace
|
Border, background and text color for a workspace button when the workspace
|
||||||
does not have focus and is not active (visible) on any output. This will be
|
does not have focus and is not active (visible) on any output. This will be
|
||||||
the case for most workspaces.
|
the case for most workspaces.
|
||||||
|
|
||||||
**urgent_workspace** <border> <background> <text>::
|
*urgent\_workspace* <border> <background> <text>
|
||||||
Border, background and text color for a workspace button when the workspace
|
Border, background and text color for a workspace button when the workspace
|
||||||
contains a window with the urgency hint set.
|
contains a window with the urgency hint set.
|
||||||
|
|
||||||
**binding_mode** <border> <background> <text>::
|
*binding\_mode* <border> <background> <text>
|
||||||
Border, background and text color for the binding mode indicator. If not used,
|
Border, background and text color for the binding mode indicator. If not used,
|
||||||
the colors will be taken from _urgent_workspace_.
|
the colors will be taken from _urgent\_workspace_.
|
||||||
|
|
||||||
|
# SEE ALSO
|
||||||
|
|
||||||
See Also
|
*sway*(5)
|
||||||
--------
|
|
||||||
|
|
||||||
**sway**(5)
|
|
@ -1,239 +0,0 @@
|
|||||||
/////
|
|
||||||
vim:set ts=4 sw=4 tw=82 noet:
|
|
||||||
/////
|
|
||||||
sway-security (7)
|
|
||||||
=================
|
|
||||||
|
|
||||||
Name
|
|
||||||
----
|
|
||||||
sway-security - Guidelines for securing your sway install
|
|
||||||
|
|
||||||
Security Overview
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
**Sway is NOT secure**. We are working on it but do not trust that we have it all
|
|
||||||
figured out yet. The following man page is provisional.
|
|
||||||
|
|
||||||
Securing sway requires careful configuration of your environment, the sort that's
|
|
||||||
usually best suited to a distribution maintainer who wants to ship a secure sway
|
|
||||||
environment in their distribution. Sway provides a number of means of securing it but
|
|
||||||
you must make a few changes external to sway first.
|
|
||||||
|
|
||||||
Configuration of security features is limited to files in the security directory
|
|
||||||
(this is likely /etc/sway/security.d/*, but depends on your installation prefix).
|
|
||||||
Files in this directory must be owned by root:root and chmod 644 or 444. The default
|
|
||||||
security configuration is installed to /etc/sway/security.d/00-defaults, and
|
|
||||||
should not be modified - it will be updated with the latest recommended security
|
|
||||||
defaults between releases. To override the defaults, you should add more files to
|
|
||||||
this directory.
|
|
||||||
|
|
||||||
Environment security
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
LD_PRELOAD is a mechanism designed to ruin the security of your system. There are
|
|
||||||
a number of strategies for dealing with this, but they all suck a little. In order
|
|
||||||
of most practical to least practical:
|
|
||||||
|
|
||||||
1. Only run important programs via exec. Sway's exec command will ensure that
|
|
||||||
LD_PRELOAD is unset when running programs.
|
|
||||||
|
|
||||||
2. Remove LD_PRELOAD support from your dynamic loader (requires patching libc).
|
|
||||||
This may break programs that rely on LD_PRELOAD for legitimate functionality,
|
|
||||||
but this is the most effective solution.
|
|
||||||
|
|
||||||
3. Use static linking for important programs. Of course statically linked programs
|
|
||||||
are unaffected by the dynamic linking security dumpster fire.
|
|
||||||
|
|
||||||
Note that should you choose method 1, you MUST ensure that sway itself isn't
|
|
||||||
compromised by LD_PRELOAD. It probably isn't, but you can be sure by setting
|
|
||||||
/usr/bin/sway to a+s (setuid), which will instruct the dynamic linker not to
|
|
||||||
permit LD_PRELOAD for it (and will also run it as root, which sway will shortly
|
|
||||||
drop). You could also statically link sway itself.
|
|
||||||
|
|
||||||
Note that LD_LIBRARY_PATH has all of these problems, and the same solutions.
|
|
||||||
|
|
||||||
Read your log
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Sway does sanity checks and prints big red warnings to stderr if they fail. Read
|
|
||||||
them.
|
|
||||||
|
|
||||||
Feature policies
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Certain sway features are security sensitive and may be configured with security
|
|
||||||
policies. These features are:
|
|
||||||
|
|
||||||
**background**::
|
|
||||||
Permission for a program to become the background.
|
|
||||||
|
|
||||||
**fullscreen**::
|
|
||||||
Permission to become fullscreen. Note that users can always make a window
|
|
||||||
fullscreen themselves with the fullscreen command.
|
|
||||||
|
|
||||||
**ipc**::
|
|
||||||
Permission to connect to sway's IPC socket.
|
|
||||||
|
|
||||||
**keyboard**::
|
|
||||||
Permission to receive keyboard events (only while they are focused).
|
|
||||||
|
|
||||||
**lock**::
|
|
||||||
Permission for a program to act as a screen locker. This involves becoming
|
|
||||||
fullscreen (on all outputs) and receiving _all_ keyboard and mouse input for
|
|
||||||
the duration of the process.
|
|
||||||
|
|
||||||
**mouse**::
|
|
||||||
Permission to receive mouse events (only while the mouse is over them).
|
|
||||||
|
|
||||||
**panel**::
|
|
||||||
Permission for a program to stick its windows to the sides of the screen.
|
|
||||||
|
|
||||||
**screenshot**::
|
|
||||||
Permission to take screenshots or record the screen.
|
|
||||||
|
|
||||||
By default, no permissions are granted (though saner defaults are provided in
|
|
||||||
/etc/sway/config.d/security). You can use the following configuration options to control
|
|
||||||
a program's access:
|
|
||||||
|
|
||||||
**permit** <executable> <features...>::
|
|
||||||
Permits <executable> to use <features> (each feature separated by a space).
|
|
||||||
<executable> may be * to affect the default policy, or the full path to the
|
|
||||||
executable file.
|
|
||||||
|
|
||||||
**reject** <executable> <features...>::
|
|
||||||
Disallows <executable> from using <features> (each feature separated by a space).
|
|
||||||
<executable> may be * to affect the default policy, or the full path to the
|
|
||||||
executable file.
|
|
||||||
|
|
||||||
Note that policy enforcement requires procfs to be mounted at /proc and the sway
|
|
||||||
process to be able to access _/proc/[pid]/exe_ (see **procfs(5)** for details on
|
|
||||||
this access - setcap cap_sys_ptrace=eip /usr/bin/sway should do the trick). If
|
|
||||||
sway is unable to read _/proc/[pid]/exe_, it will apply the default policy.
|
|
||||||
|
|
||||||
To work correctly, sway's own programs require the following permissions:
|
|
||||||
|
|
||||||
- swaybg: background
|
|
||||||
- swaylock: lock, keyboard
|
|
||||||
- swaybar: panel, mouse, ipc
|
|
||||||
- swaygrab: screenshot, ipc
|
|
||||||
|
|
||||||
When you first declare a policy for an executable, it will inherit the default
|
|
||||||
policy. Further changes to the default policy will not retroactively affect which
|
|
||||||
permissions an earlier policy inherits. You must explicitly reject any features
|
|
||||||
from the default policy that you do not want an executable to receive permission
|
|
||||||
for.
|
|
||||||
|
|
||||||
Command policies
|
|
||||||
----------------
|
|
||||||
|
|
||||||
You can also control the context from which a command may execute. The different
|
|
||||||
contexts you can control are:
|
|
||||||
|
|
||||||
**config**::
|
|
||||||
Can be run from your config file.
|
|
||||||
|
|
||||||
**binding**::
|
|
||||||
Can be run from bindsym or bindcode commands.
|
|
||||||
|
|
||||||
**ipc**::
|
|
||||||
Can be run by IPC clients.
|
|
||||||
|
|
||||||
**criteria**::
|
|
||||||
Can be run when evaluating window criteria.
|
|
||||||
|
|
||||||
**all**::
|
|
||||||
Shorthand for granting permission in all contexts.
|
|
||||||
|
|
||||||
By default a command is allowed to execute in any context. To configure this, open
|
|
||||||
a commands block and fill it with policies:
|
|
||||||
|
|
||||||
commands {
|
|
||||||
<name> <contexts...>
|
|
||||||
...
|
|
||||||
}
|
|
||||||
|
|
||||||
For example, you could do this to limit the use of the focus command to just
|
|
||||||
binding and criteria:
|
|
||||||
|
|
||||||
commands {
|
|
||||||
focus binding criteria
|
|
||||||
}
|
|
||||||
|
|
||||||
Setting a command policy overwrites any previous policy that was in place.
|
|
||||||
|
|
||||||
IPC policies
|
|
||||||
------------
|
|
||||||
|
|
||||||
Disabling IPC access via swaymsg is encouraged if you intend to secure the IPC
|
|
||||||
socket, because any program that can execute swaymsg could circumvent its own
|
|
||||||
security policy by simply invoking swaymsg.
|
|
||||||
|
|
||||||
You can configure which features of IPC are available for particular clients:
|
|
||||||
|
|
||||||
ipc <executable> {
|
|
||||||
...
|
|
||||||
}
|
|
||||||
|
|
||||||
You may use * for <executable> to configure the default policy for all clients.
|
|
||||||
Configuring IPC policies for specific executables is not supported on FreeBSD, and
|
|
||||||
the default policy will be applied to all IPC connections.
|
|
||||||
|
|
||||||
The following commands are available within this block:
|
|
||||||
|
|
||||||
**bar-config** <enabled|disabled>::
|
|
||||||
Controls GET_BAR_CONFIG (required for swaybar to work at all).
|
|
||||||
|
|
||||||
**command** <enabled|disabled>::
|
|
||||||
Controls executing sway commands via IPC.
|
|
||||||
|
|
||||||
**inputs** <enabled|disabled>::
|
|
||||||
Controls GET_INPUTS (input device information).
|
|
||||||
|
|
||||||
**marks** <enabled|disabled>::
|
|
||||||
Controls GET_MARKS.
|
|
||||||
|
|
||||||
**outputs** <enabled|disabled>::
|
|
||||||
Controls GET_OUTPUTS.
|
|
||||||
|
|
||||||
**tree** <enabled|disabled>::
|
|
||||||
Controls GET_TREE.
|
|
||||||
|
|
||||||
**workspaces** <enabled|disabled>::
|
|
||||||
Controls GET_WORKSPACES.
|
|
||||||
|
|
||||||
You can also control which IPC events can be raised with an events block:
|
|
||||||
|
|
||||||
ipc <executable> {
|
|
||||||
events {
|
|
||||||
...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
The following commands are valid within an IPC events block:
|
|
||||||
|
|
||||||
**binding** <enabled|disabled>::
|
|
||||||
Controls keybinding notifications (disabled by default).
|
|
||||||
|
|
||||||
**input** <enabled|disabled>::
|
|
||||||
Controls input device hotplugging notifications.
|
|
||||||
|
|
||||||
**mode** <enabled|disabled>::
|
|
||||||
Controls output hotplugging notifications.
|
|
||||||
|
|
||||||
**output** <enabled|disabled>::
|
|
||||||
Controls output hotplugging notifications.
|
|
||||||
|
|
||||||
**window** <enabled|disabled>::
|
|
||||||
Controls window event notifications.
|
|
||||||
|
|
||||||
**workspace** <enabled|disabled>::
|
|
||||||
Controls workspace notifications.
|
|
||||||
|
|
||||||
In each of these blocks, you may use * (as in "* enabled" or "* disabled") to
|
|
||||||
control access to every feature at once.
|
|
||||||
|
|
||||||
Authors
|
|
||||||
-------
|
|
||||||
Maintained by Drew DeVault <sir@cmpwn.com>, who is assisted by other open
|
|
||||||
source contributors. For more information about sway development, see
|
|
||||||
<https://github.com/swaywm/sway>.
|
|
@ -0,0 +1,95 @@
|
|||||||
|
sway(1)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
sway - SirCmpwn's Wayland window manager
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
|
||||||
|
*sway* [options...] [command]
|
||||||
|
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
*-h, --help*
|
||||||
|
Show help message and quit.
|
||||||
|
|
||||||
|
*-c, --config* <config>
|
||||||
|
Specifies a config file.
|
||||||
|
|
||||||
|
*-C, --validate*
|
||||||
|
Check the validity of the config file, then exit.
|
||||||
|
|
||||||
|
*-d, --debug*
|
||||||
|
Enables full logging, including debug information.
|
||||||
|
|
||||||
|
*-v, --version*
|
||||||
|
Show the version number and quit.
|
||||||
|
|
||||||
|
*-V, --verbose*
|
||||||
|
Enables more verbose logging.
|
||||||
|
|
||||||
|
*--get-socketpath*
|
||||||
|
Gets the IPC socket path and prints it, then exits.
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
sway was created to fill the need of an i3-like window manager for Wayland. The
|
||||||
|
upstream i3 developers have no intention of porting i3 to Wayland, and projects
|
||||||
|
proposed by others ended up as vaporware. Many thanks to the i3 folks for
|
||||||
|
providing such a great piece of software, so good that your users would rather
|
||||||
|
write an entirely new window manager from scratch that behaved _exactly_ like i3
|
||||||
|
rather than switch to something else.
|
||||||
|
|
||||||
|
You can run sway directly from a tty, or via a Wayland-compatible login manager.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
sway searches for a config file in the following locations, in this order:
|
||||||
|
|
||||||
|
. ~/.sway/config
|
||||||
|
. $XDG\_CONFIG\_HOME/sway/config (suggested location)
|
||||||
|
. ~/.i3/config
|
||||||
|
. $XDG\_CONFIG\_HOME/i3/config
|
||||||
|
. /etc/sway/config
|
||||||
|
. /etc/i3/config
|
||||||
|
|
||||||
|
If unset, $XDG\_CONFIG\_HOME defaults to *~/.config*.
|
||||||
|
|
||||||
|
An error is raised when no config file is found. The recommended default
|
||||||
|
configuration is usually installed to */etc/sway/config*; you are encouraged to
|
||||||
|
copy this to *~/.config/sway/config* and edit it from there.
|
||||||
|
|
||||||
|
For information on the config file format, see *sway*(5).
|
||||||
|
|
||||||
|
# IPC COMMANDS
|
||||||
|
|
||||||
|
Though *swaymsg*(1) is generally preferred, you may run *sway* _command_ to
|
||||||
|
send _command_ to the running instance of sway. You can also issue commands
|
||||||
|
with *i3-msg*(1) or even with *i3*(1).
|
||||||
|
|
||||||
|
# ENVIRONMENT
|
||||||
|
|
||||||
|
The following environment variables have an effect on sway:
|
||||||
|
|
||||||
|
_SWAY\_CURSOR\_THEME_
|
||||||
|
Specifies the name of the cursor theme to use.
|
||||||
|
|
||||||
|
_SWAY\_CURSOR\_SIZE_
|
||||||
|
Specifies the size of the cursor to use.
|
||||||
|
|
||||||
|
_SWAYSOCK_
|
||||||
|
Specifies the path to the sway IPC socket.
|
||||||
|
|
||||||
|
_XKB\_DEFAULT\_RULES_, _XKB\_DEFAULT\_MODEL_, _XKB\_DEFAULT\_LAYOUT_,
|
||||||
|
_XKB\_DEFAULT\_VARIANT_, _XKB\_DEFAULT\_OPTIONS_
|
||||||
|
Configures the xkb keyboard settings. See *xkeyboard-config*(7).
|
||||||
|
|
||||||
|
# AUTHORS
|
||||||
|
|
||||||
|
Maintained by Drew DeVault <sir@cmpwn.com>, who is assisted by other open
|
||||||
|
source contributors. For more information about sway development, see
|
||||||
|
<https://github.com/swaywm/sway>.
|
||||||
|
|
||||||
|
# SEE ALSO
|
||||||
|
|
||||||
|
*sway*(5) *swaymsg*(1) *swaygrab*(1) *sway-input*(5) *sway-bar*(5)
|
@ -1,109 +0,0 @@
|
|||||||
/////
|
|
||||||
vim:set ft=asciidoc ts=4 sw=4 tw=82 noet:
|
|
||||||
/////
|
|
||||||
:quotes.~:
|
|
||||||
|
|
||||||
sway (1)
|
|
||||||
========
|
|
||||||
|
|
||||||
Name
|
|
||||||
----
|
|
||||||
sway - SirCmpwn's Wayland window manager
|
|
||||||
|
|
||||||
Synopsis
|
|
||||||
--------
|
|
||||||
'sway' [options] [command]
|
|
||||||
|
|
||||||
Options
|
|
||||||
-------
|
|
||||||
|
|
||||||
*-h, --help*::
|
|
||||||
Show help message and quit.
|
|
||||||
|
|
||||||
*-c, \--config* <config>::
|
|
||||||
Specifies a config file.
|
|
||||||
|
|
||||||
*-C, \--validate*::
|
|
||||||
Check the validity of the config file, then exit.
|
|
||||||
|
|
||||||
*-d, --debug*::
|
|
||||||
Enables full logging, including debug information.
|
|
||||||
|
|
||||||
*-v, \--version*::
|
|
||||||
Show the version number and quit.
|
|
||||||
|
|
||||||
*-V, --verbose*::
|
|
||||||
Enables more verbose logging.
|
|
||||||
|
|
||||||
*--get-socketpath*::
|
|
||||||
Gets the IPC socket path and prints it, then exits.
|
|
||||||
|
|
||||||
Description
|
|
||||||
-----------
|
|
||||||
|
|
||||||
sway was created to fill the need of an i3-like window manager for Wayland. The
|
|
||||||
upstream i3 developers have no intention of porting i3 to Wayland, and projects
|
|
||||||
proposed by others ended up as vaporware. Many thanks to the i3 folks for
|
|
||||||
providing such a great piece of software, so good that your users would rather
|
|
||||||
write an entirely new window manager from scratch that behaved _exactly_ like i3
|
|
||||||
rather than switch to something else.
|
|
||||||
|
|
||||||
Launch sway directly from a tty or via your favorite Wayland-compatible login
|
|
||||||
manager.
|
|
||||||
|
|
||||||
Commands
|
|
||||||
--------
|
|
||||||
|
|
||||||
If sway is currently running, you may run _sway [command]_ to send _command_ to
|
|
||||||
the running instance of sway. The same commands you would use in the config file
|
|
||||||
are valid here (see **sway**(5)). For compatibility reasons, you may also issue
|
|
||||||
commands with **swaymsg**(1) or **i3-msg**(1) (or even with **i3**(1), probably).
|
|
||||||
|
|
||||||
Configuration
|
|
||||||
-------------
|
|
||||||
|
|
||||||
The path to a config file can be given via the _-c_ parameter, else
|
|
||||||
sway searches for it in the following locations:
|
|
||||||
- ~/.sway/config
|
|
||||||
- $XDG_CONFIG_HOME/sway/config (suggested location)
|
|
||||||
- ~/.i3/config
|
|
||||||
- $XDG_CONFIG_HOME/i3/config (XDG_HOME )
|
|
||||||
- /etc/sway/config
|
|
||||||
- /etc/i3/config
|
|
||||||
|
|
||||||
In /etc/sway/config the standard config file is installed.
|
|
||||||
An error is raised when no config file is found.
|
|
||||||
|
|
||||||
To write your own configuration, it's suggested that you copy the default config file to
|
|
||||||
the location of your choosing and start there.
|
|
||||||
|
|
||||||
For information on the config file format, see **sway**(5).
|
|
||||||
|
|
||||||
Environment
|
|
||||||
-----------
|
|
||||||
|
|
||||||
The following environment variables have an effect on sway:
|
|
||||||
|
|
||||||
*SWAY_CURSOR_THEME*::
|
|
||||||
Specifies the name of the cursor theme to use.
|
|
||||||
|
|
||||||
*SWAY_CURSOR_SIZE*::
|
|
||||||
Specifies the size of the cursor to use.
|
|
||||||
|
|
||||||
*SWAYSOCK*::
|
|
||||||
Specifies the path to the sway IPC socket.
|
|
||||||
|
|
||||||
*XKB_DEFAULT_RULES*, *XKB_DEFAULT_MODEL*, *XKB_DEFAULT_LAYOUT*, *XKB_DEFAULT_VARIANT*, *XKB_DEFAULT_OPTIONS*::
|
|
||||||
Configures the xkb keyboard settings. See xkeyboard-config(7).
|
|
||||||
|
|
||||||
Authors
|
|
||||||
-------
|
|
||||||
|
|
||||||
Maintained by Drew DeVault <sir@cmpwn.com>, who is assisted by other open
|
|
||||||
source contributors. For more information about sway development, see
|
|
||||||
<https://github.com/swaywm/sway>.
|
|
||||||
|
|
||||||
See Also
|
|
||||||
--------
|
|
||||||
|
|
||||||
**sway**(5) **swaymsg**(1) **swaygrab**(1) **sway-input**(5) **sway-bar**(5)
|
|
@ -0,0 +1,582 @@
|
|||||||
|
sway(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
sway - configuration file and commands
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
A sway configuration file is a list of sway commands that are executed by sway
|
||||||
|
on startup. These commands usually consist of setting your preferences and
|
||||||
|
setting key bindings. An example config is likely present in /etc/sway/config
|
||||||
|
for you to check out.
|
||||||
|
|
||||||
|
Lines in the configuration file might be extended through multiple lines by
|
||||||
|
adding a '\\' character at the end of line. e.g.:
|
||||||
|
|
||||||
|
```
|
||||||
|
bindsym Shift+XF86AudioRaiseVolume exec \\
|
||||||
|
pactl set-sink-volume @DEFAULT_SINK@ -1%
|
||||||
|
```
|
||||||
|
|
||||||
|
These commands can be executed in your config file, via *swaymsg*(1), or via
|
||||||
|
the bindsym command.
|
||||||
|
|
||||||
|
# COMMAND CONVENTIONS
|
||||||
|
|
||||||
|
Commands are split into several arguments using spaces. You can enclose
|
||||||
|
arguments with quotation marks (*"..."* or *'...'*) to add spaces to a single
|
||||||
|
argument. You may also run several commands in order by separating each with
|
||||||
|
*,* or *;*.
|
||||||
|
|
||||||
|
Throughout the documentation, *|* is used to distinguish between arguments for
|
||||||
|
which you may only select one. *[...]* is used for optional arguments, and
|
||||||
|
*<...>* for arguments where you are expected to supply some value.
|
||||||
|
|
||||||
|
# COMMANDS
|
||||||
|
|
||||||
|
The following commands may only be used in the configuration file.
|
||||||
|
|
||||||
|
*bar {* <commands...> *}*
|
||||||
|
_commands..._ after *{* will be interpreted as bar commands. For
|
||||||
|
details, see *sway-bar*(5). A newline is required between *{* and the
|
||||||
|
first command, and *}* must be alone on a line.
|
||||||
|
|
||||||
|
*default\_orientation* horizontal|vertical|auto
|
||||||
|
Sets the default container layout for tiled containers.
|
||||||
|
|
||||||
|
*include* <path>
|
||||||
|
Includes another file from _path_. _path_ can be either a full path or a
|
||||||
|
path relative to the parent config, and expands shell syntax (see
|
||||||
|
*wordexp*(3) for details). The same include file can only be included once;
|
||||||
|
subsequent attempts will be ignored.
|
||||||
|
|
||||||
|
*set* <name> <value>
|
||||||
|
Sets variable $_name_ to _value_. You can use the new variable in the
|
||||||
|
arguments of future commands.
|
||||||
|
|
||||||
|
*swaybg\_command* <command>
|
||||||
|
Executes custom background _command_. Default is _swaybg_. Refer to
|
||||||
|
*output* below for more information.
|
||||||
|
|
||||||
|
The following commands cannot be used directly in the configuration file.
|
||||||
|
They are expected to be used with *bindsym* or at runtime through *swaymsg*(1).
|
||||||
|
|
||||||
|
*border* normal|pixel [<n>]
|
||||||
|
Set border style for focused window. _normal_ includes a border of
|
||||||
|
thickness _n_ and a title bar. _pixel_ is a border without title bar _n_
|
||||||
|
pixels thick. Default is _normal_ with border thickness 2.
|
||||||
|
|
||||||
|
*border* none|toggle
|
||||||
|
Set border style for focused window to _none_ or _toggle_ between the
|
||||||
|
available border styles: _normal_, _pixel_, _none_.
|
||||||
|
|
||||||
|
*exit*
|
||||||
|
Exit sway and end your Wayland session.
|
||||||
|
|
||||||
|
*floating* enable|disable|toggle
|
||||||
|
Make focused view floating, non-floating, or the opposite of what it is now.
|
||||||
|
|
||||||
|
*focus* up|right|down|left
|
||||||
|
Moves focus to the next container in the specified direction.
|
||||||
|
|
||||||
|
*focus* child
|
||||||
|
Moves focus to the last-focused child of the focused container.
|
||||||
|
|
||||||
|
*focus* parent
|
||||||
|
Moves focus to the parent of the focused container.
|
||||||
|
|
||||||
|
*focus* output up|right|down|left
|
||||||
|
Moves focus to the next output in the specified direction.
|
||||||
|
|
||||||
|
*focus* output <name>
|
||||||
|
Moves focus to the named output.
|
||||||
|
|
||||||
|
*focus* mode\_toggle
|
||||||
|
Moves focus between the floating and tiled layers.
|
||||||
|
|
||||||
|
*fullscreen*
|
||||||
|
Toggles fullscreen for the focused view.
|
||||||
|
|
||||||
|
*layout* splith|splitv|stacking|tabbed
|
||||||
|
Sets the layout mode of the focused container.
|
||||||
|
|
||||||
|
*layout* toggle split
|
||||||
|
Switches the focused container between the splitv and splith layouts.
|
||||||
|
|
||||||
|
*move* left|right|up|down [<px>]
|
||||||
|
Moves the focused container in the direction specified. If the container,
|
||||||
|
the optional _px_ argument specifies how many pixels to move the container.
|
||||||
|
If unspecified, the default is 10 pixels. Pixels are ignored when moving
|
||||||
|
tiled containers.
|
||||||
|
|
||||||
|
*move* container|window to workspace <name>
|
||||||
|
Moves the focused container to the specified workspace.
|
||||||
|
|
||||||
|
*move* container|window to workspace prev|next
|
||||||
|
Moves the focused container to the previous or next workspace on this
|
||||||
|
output, or if no workspaces remain, the previous or next output.
|
||||||
|
|
||||||
|
*move* container|window to workspace prev\_on\_output|next\_on\_output
|
||||||
|
Moves the focused container to the previous or next workspace on this
|
||||||
|
output, wrapping around if already at the first or last workspace.
|
||||||
|
|
||||||
|
*move* container|window|workspace to output <name>
|
||||||
|
Moves the focused container or workspace to the specified output.
|
||||||
|
|
||||||
|
*move* container|window|workspace to output up|right|down|left
|
||||||
|
Moves the focused container or workspace to next output in the specified
|
||||||
|
direction.
|
||||||
|
|
||||||
|
*move* [to] scratchpad
|
||||||
|
Moves the focused window to the scratchpad.
|
||||||
|
|
||||||
|
*reload*
|
||||||
|
Reloads the sway config file and applies any changes.
|
||||||
|
|
||||||
|
*resize* shrink|grow width|height [<amount>] [px|ppt]
|
||||||
|
Resizes the currently focused container by _amount_, specified in pixels or
|
||||||
|
percentage points. If omitted, floating containers are resized in px and
|
||||||
|
tiled containers by ppt. If omitted, the default _amount_ is 10.
|
||||||
|
|
||||||
|
*resize set* <width> [px] <height> [px]
|
||||||
|
Sets the width and height of the currently focused container to _width_
|
||||||
|
pixels and _height_ pixels. The [px] parameters are optional and have no
|
||||||
|
effect. This command only accepts a size in pixels. Width and height may be
|
||||||
|
specified in either order.
|
||||||
|
|
||||||
|
*scratchpad show*
|
||||||
|
Shows a window from the scratchpad. Repeatedly using this command will
|
||||||
|
cycle through the windows in the scratchpad.
|
||||||
|
|
||||||
|
*split* vertical|v|horizontal|h|toggle|t
|
||||||
|
Splits the current container, vertically or horizontally. When _toggle_ is
|
||||||
|
specified, the current container is split opposite to the parent
|
||||||
|
container's layout.
|
||||||
|
|
||||||
|
*splith*
|
||||||
|
Equivalent to *split horizontal*
|
||||||
|
|
||||||
|
*splitv*
|
||||||
|
Equivalent to *split vertical*
|
||||||
|
|
||||||
|
*splitt*
|
||||||
|
Equivalent to *split toggle*
|
||||||
|
|
||||||
|
*sticky* enable|disable|toggle
|
||||||
|
"Sticks" a floating window to the current output so that it shows up on all
|
||||||
|
workspaces.
|
||||||
|
|
||||||
|
The following commands may be used either in the configuration file or at
|
||||||
|
runtime.
|
||||||
|
|
||||||
|
*assign* <criteria> [→] <workspace>
|
||||||
|
Assigns views matching _criteria_ (see *CRITERIA* for details) to
|
||||||
|
_workspace_. The → (U+2192) is optional and cosmetic. This command is
|
||||||
|
equivalent to:
|
||||||
|
|
||||||
|
for\_window <criteria> move container to workspace <workspace>
|
||||||
|
|
||||||
|
*bindsym* <key combo> <command>
|
||||||
|
Binds _key combo_ to execute the sway command _command_ when pressed. You
|
||||||
|
may use XKB key names here (*xev*(1) is a good tool for discovering these).
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
# Execute firefox when alt, shift, and f are pressed together
|
||||||
|
bindsym Mod1+Shift+f exec firefox
|
||||||
|
|
||||||
|
*bindcode* <code> <command> is also available for binding with key codes
|
||||||
|
instead of key names.
|
||||||
|
|
||||||
|
*client.<class>* <border> <background> <text> <indicator> <child\_border>
|
||||||
|
Configures the color of window borders and title bars. All 5 colors are
|
||||||
|
required, with the exception of *client.background*, which requires exactly
|
||||||
|
one. Colors may be specified in hex, either as _#RRGGBB_ or _#RRGGBBAA_.
|
||||||
|
|
||||||
|
The available classes are:
|
||||||
|
|
||||||
|
*client.background*
|
||||||
|
Ignored (present for i3 compatibility).
|
||||||
|
|
||||||
|
*client.focused*
|
||||||
|
The window that has focus.
|
||||||
|
|
||||||
|
*client.focused\_inactive*
|
||||||
|
The most recently focused view within a container which is not focused.
|
||||||
|
|
||||||
|
*client.placeholder*
|
||||||
|
Ignored (present for i3 compatibility).
|
||||||
|
|
||||||
|
*client.unfocused*
|
||||||
|
A view that does not have focus.
|
||||||
|
|
||||||
|
*client.urgent*
|
||||||
|
A view with an urgency hint. *Note*: This is not currently implemented.
|
||||||
|
|
||||||
|
The meaning of each color is:
|
||||||
|
|
||||||
|
_border_
|
||||||
|
The border around the title bar.
|
||||||
|
|
||||||
|
_background_
|
||||||
|
The background of the title bar.
|
||||||
|
|
||||||
|
_text_
|
||||||
|
The text color of the title bar.
|
||||||
|
|
||||||
|
_indicator_
|
||||||
|
The color used to indicate where a new view will open. In a tiled
|
||||||
|
container, this would paint the right border of the current view if a
|
||||||
|
new view would be opened to the right.
|
||||||
|
|
||||||
|
_child\_border_
|
||||||
|
The border around the view itself.
|
||||||
|
|
||||||
|
The default colors are:
|
||||||
|
|
||||||
|
[- *class*
|
||||||
|
:[ _border_
|
||||||
|
:[ _background_
|
||||||
|
:[ _text_
|
||||||
|
:[ _indicator_
|
||||||
|
:[ _child\_border_
|
||||||
|
|[ *background*
|
||||||
|
: n/a
|
||||||
|
: #ffffff
|
||||||
|
: n/a
|
||||||
|
: n/a
|
||||||
|
: n/a
|
||||||
|
| *focused*
|
||||||
|
: #4c7899
|
||||||
|
: #285577
|
||||||
|
: #ffffff
|
||||||
|
: #2e9ef4
|
||||||
|
: #285577
|
||||||
|
| *focused\_inactive*
|
||||||
|
: #333333
|
||||||
|
: #5f676a
|
||||||
|
: #ffffff
|
||||||
|
: #484e50
|
||||||
|
: #5f676a
|
||||||
|
| *unfocused*
|
||||||
|
: #333333
|
||||||
|
: #222222
|
||||||
|
: #888888
|
||||||
|
: #292d2e
|
||||||
|
: #222222
|
||||||
|
| *urgent*
|
||||||
|
: #2f343a
|
||||||
|
: #900000
|
||||||
|
: #ffffff
|
||||||
|
: #900000
|
||||||
|
: #900000
|
||||||
|
| *placeholder*
|
||||||
|
: #000000
|
||||||
|
: #0c0c0c
|
||||||
|
: #ffffff
|
||||||
|
: #000000
|
||||||
|
: #0c0c0c
|
||||||
|
|
||||||
|
*debuglog* on|off|toggle
|
||||||
|
Enables, disables or toggles debug logging. _toggle_ cannot be used in the
|
||||||
|
configuration file.
|
||||||
|
|
||||||
|
*default\_border* normal|none|pixel [<n>]
|
||||||
|
Set default border style for new tiled windows.
|
||||||
|
|
||||||
|
*default\_floating\_border* normal|none|pixel [<n>]
|
||||||
|
Set default border style for new floating windows. This only applies to
|
||||||
|
windows that are spawned in floating mode, not windows that become floating
|
||||||
|
afterwards.
|
||||||
|
|
||||||
|
*exec* <shell command>
|
||||||
|
Executes _shell command_ with sh.
|
||||||
|
|
||||||
|
*exec\_always* <shell command>
|
||||||
|
Like *exec*, but the shell command will be executed _again_ after *reload*.
|
||||||
|
|
||||||
|
*floating\_maximum\_size* <width> x <height>
|
||||||
|
Specifies the maximum size of floating windows. -1 x -1 removes the upper
|
||||||
|
limit.
|
||||||
|
|
||||||
|
*floating\_minimum\_size* <width> x <height>
|
||||||
|
Specifies the minimum size of floating windows. The default is 75 x 50.
|
||||||
|
|
||||||
|
*floating\_modifier* <modifier> [normal|inverse]
|
||||||
|
When the _modifier_ key is held down, you may hold left click to move
|
||||||
|
windows, and right click to resize them. If _inverse_ is specified, left
|
||||||
|
click is used for resizing and right click for moving.
|
||||||
|
|
||||||
|
*floating\_scroll* up|right|down|left [command]
|
||||||
|
Sets a command to be executed when the mouse wheel is scrolled in the
|
||||||
|
specified direction while holding the floating modifier. Resets the
|
||||||
|
command, when given no arguments.
|
||||||
|
|
||||||
|
*focus\_follows\_mouse* yes|no
|
||||||
|
If set to _yes_, moving your mouse over a window will focus that window.
|
||||||
|
|
||||||
|
*font* <font>
|
||||||
|
Sets font for use in title bars in Pango format.
|
||||||
|
|
||||||
|
*for\_window* <criteria> <command>
|
||||||
|
Whenever a window that matches _criteria_ appears, run list of commands.
|
||||||
|
See *CRITERIA* for more details.
|
||||||
|
|
||||||
|
*gaps* edge\_gaps on|off|toggle
|
||||||
|
When _on_, gaps will be added between windows and workspace edges if the
|
||||||
|
inner gap is nonzero. When _off_, gaps will only be added between views.
|
||||||
|
_toggle_ cannot be used in the configuration file.
|
||||||
|
|
||||||
|
*gaps* <amount>
|
||||||
|
Sets _amount_ pixels of gap between windows and around each workspace.
|
||||||
|
|
||||||
|
*gaps* inner|outer <amount>
|
||||||
|
Sets default _amount_ pixels of _inner_ or _outer_ gap, where the former
|
||||||
|
affects spacing between views and the latter affects the space around each
|
||||||
|
workspace.
|
||||||
|
|
||||||
|
*gaps* inner|outer all|workspace|current set|plus|minus <amount>
|
||||||
|
Changes the gaps for the _inner_ or _outer_ gap. _all_ changes the gaps for
|
||||||
|
all views or workspace, _workspace_ changes gaps for all views in current
|
||||||
|
workspace (or current workspace), and _current_ changes gaps for the current
|
||||||
|
view or workspace.
|
||||||
|
|
||||||
|
*hide\_edge\_borders* none|vertical|horizontal|both|smart
|
||||||
|
Hides window borders adjacent to the screen edges. Default is _none_.
|
||||||
|
|
||||||
|
*input* <input\_device> *{* <commands...> *}*
|
||||||
|
_commands..._ after *{* will be interpreted as input commands applying to
|
||||||
|
the specified input device. For details, see *sway-input*(5). A newline is
|
||||||
|
required between *{* and the first command, and *}* must be alone on a
|
||||||
|
line.
|
||||||
|
|
||||||
|
\* may be used in lieu of a specific device name to configure all input
|
||||||
|
devices. A list of input device names may be obtained via *swaymsg -t
|
||||||
|
get\_inputs*.
|
||||||
|
|
||||||
|
*seat* <seat> *{* <commands...> *}*
|
||||||
|
_commands..._ after *{* will be interpreted as seat commands applying to
|
||||||
|
the specified seat. For details, see *sway-input*(5). A newline is required
|
||||||
|
between *{* and the first command, and *}* must be alone on a line.
|
||||||
|
|
||||||
|
*seat* <seat> cursor move|set <x> <y>
|
||||||
|
Move specified seat's cursor relative to current position or wrap to
|
||||||
|
absolute coordinates (with respect to the global coordinate space).
|
||||||
|
Specifying either value as 0 will not update that coordinate.
|
||||||
|
|
||||||
|
*seat* <seat> cursor press|release left|right|1|2|3...
|
||||||
|
Simulate pressing (or releasing) the specified mouse button on the
|
||||||
|
specified seat.
|
||||||
|
|
||||||
|
*kill*
|
||||||
|
Kills (closes) the currently focused container and all of its children.
|
||||||
|
|
||||||
|
*smart\_gaps* on|off
|
||||||
|
If smart\_gaps are _on_ gaps will only be enabled if a workspace has more
|
||||||
|
than one child.
|
||||||
|
|
||||||
|
*mark* --add|--replace [--toggle] <identifier>
|
||||||
|
Marks are arbitrary labels that can be used to identify certain windows and
|
||||||
|
then jump to them at a later time. By default, *mark* sets _identifier_ as
|
||||||
|
the only mark on a window. _--add_ will instead add _identifier_ to the
|
||||||
|
list of current marks. If _--toggle_ is specified mark will remove
|
||||||
|
_identifier_ if it is already marked.
|
||||||
|
|
||||||
|
*mode* <mode>
|
||||||
|
Switches to the specified mode. The default mode _default_.
|
||||||
|
|
||||||
|
*mode* <mode> *{* <commands...> *}*
|
||||||
|
_commands..._ after *{* will be added to the specified mode. A newline is
|
||||||
|
required between *{* and the first command, and *}* must be alone on a
|
||||||
|
line. Only *bindsym* and *bindcode* commands are permitted in mode blocks.
|
||||||
|
|
||||||
|
*mouse\_warping* output|none
|
||||||
|
If _output_ is specified, the mouse will be moved to new outputs as you
|
||||||
|
move focus between them. Default is _output_.
|
||||||
|
|
||||||
|
*no\_focus* <criteria>
|
||||||
|
Prevents windows matching <criteria> from being focused automatically when
|
||||||
|
they're created. This has no effect on the first window in a workspace.
|
||||||
|
|
||||||
|
*output* <name> mode|resolution|res <WIDTHxHEIGHT>[@<RATE>[Hz]]
|
||||||
|
Configures the specified output to use the given mode. Modes are a
|
||||||
|
combination of width and height (in pixels) and a refresh rate that your
|
||||||
|
display can be configured to use. For a list of available modes for each
|
||||||
|
output, use *swaymsg -t get\_outputs*.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
output HDMI-A-1 mode 1920x1080
|
||||||
|
|
||||||
|
output HDMI-A-1 mode 1920x1080@60Hz
|
||||||
|
|
||||||
|
*output* <name> position|pos <X,Y>
|
||||||
|
Places the specified output at the specific position in the global
|
||||||
|
coordinate space.
|
||||||
|
|
||||||
|
*output* <name> scale <factor>
|
||||||
|
Scales the specified output by the specified scale _factor_. An integer is
|
||||||
|
recommended, but fractional values are also supported. If a fractional
|
||||||
|
value are specified, be warned that it is not possible to faithfully
|
||||||
|
represent the contents of your windows - they will be rendered at the next
|
||||||
|
highest integral scale factor and downscaled. You may be better served by
|
||||||
|
setting an integral scale factor and adjusting the font size of your
|
||||||
|
applications to taste.
|
||||||
|
|
||||||
|
*output* <name> background|bg <file> <mode>
|
||||||
|
Sets the wallpaper for the given output to the specified file, using the
|
||||||
|
given scaling mode (one of "stretch", "fill", "fit", "center", "tile").
|
||||||
|
|
||||||
|
**output** <name> background|bg <color> solid\_color
|
||||||
|
Sets the background of the given output to the specified color. _color_
|
||||||
|
should be specified as _#RRGGBB_. Alpha is not supported.
|
||||||
|
|
||||||
|
**output** <name> transform <transform>
|
||||||
|
Sets the background transform to the given value. Can be one of "90", "180",
|
||||||
|
"270" for rotation; or "flipped", "flipped-90", "flipped-180", "flipped-270"
|
||||||
|
to apply a rotation and flip, or "normal" to apply no transform.
|
||||||
|
|
||||||
|
*output* <name> disable|enable
|
||||||
|
Enables or disables the specified output (all outputs are enabled by
|
||||||
|
default).
|
||||||
|
|
||||||
|
*NOTES FOR THE OUTPUT COMMANDS*
|
||||||
|
|
||||||
|
You may combine output commands into one, like so:
|
||||||
|
|
||||||
|
output HDMI-A-1 mode 1920x1080 pos 1920,0 bg ~/wallpaper.png stretch
|
||||||
|
|
||||||
|
You can get a list of output names with *swaymsg -t get\_outputs*. You may also
|
||||||
|
match any output by using the output name "\*". Be sure to add this output
|
||||||
|
config after the others, or it will be matched instead of the others.
|
||||||
|
|
||||||
|
*show\_marks* on|off
|
||||||
|
If *show\_marks* is on, marks will be displayed in the window borders.
|
||||||
|
Any mark that starts with an underscore will not be drawn even if the
|
||||||
|
option is on. The default is _on_.
|
||||||
|
|
||||||
|
*opacity* <value>
|
||||||
|
Set the opacity of the window between 0 (completely transparent) and 1
|
||||||
|
(completely opaque).
|
||||||
|
|
||||||
|
*unmark* [<identifier>]
|
||||||
|
*unmark* will remove _identifier_ from the list of current marks on a
|
||||||
|
window. If _identifier_ is omitted, all marks are removed.
|
||||||
|
|
||||||
|
*workspace* [number] <name>
|
||||||
|
Switches to the specified workspace. The string "number" is optional and is
|
||||||
|
used to sort workspaces.
|
||||||
|
|
||||||
|
*workspace* prev|next
|
||||||
|
Switches to the next workspace on the current output or on the next output
|
||||||
|
if currently on the last workspace.
|
||||||
|
|
||||||
|
*workspace* prev\_on\_output|next\_on\_output
|
||||||
|
Switches to the next workspace on the current output.
|
||||||
|
|
||||||
|
*workspace* <name> output <output>
|
||||||
|
Specifies that workspace _name_ should be shown on the specified _output_.
|
||||||
|
|
||||||
|
*workspace\_auto\_back\_and\_forth* yes|no
|
||||||
|
When _yes_, repeating a workspace switch command will switch back to the
|
||||||
|
prior workspace. For example, if you are currently on workspace 1,
|
||||||
|
switch to workspace 2, then invoke the "workspace 2" command again, you
|
||||||
|
will be returned to workspace 1. Default is _no_.
|
||||||
|
|
||||||
|
*workspace\_layout* default|stacking|tabbed
|
||||||
|
Specifies the initial layout for new workspaces.
|
||||||
|
|
||||||
|
# CRITERIA
|
||||||
|
|
||||||
|
A criteria is a string in the form of, for example:
|
||||||
|
|
||||||
|
```
|
||||||
|
[class="[Rr]egex.*" title="some title"]
|
||||||
|
```
|
||||||
|
|
||||||
|
The string contains one or more (space separated) attribute/value pairs. They
|
||||||
|
are used by some commands to choose which views to execute actions on. All
|
||||||
|
attributes must match for the criteria to match.
|
||||||
|
|
||||||
|
Criteria may be used with either the *for\_window* or *assign* commands to
|
||||||
|
specify operations to perform on new views. A criteria may also be used to
|
||||||
|
perform specific commands (ones that normally act upon one window) on all views
|
||||||
|
that match that criteria. For example:
|
||||||
|
|
||||||
|
Focus on a window with the mark "IRC":
|
||||||
|
|
||||||
|
```
|
||||||
|
[con_mark="IRC"] focus
|
||||||
|
```
|
||||||
|
|
||||||
|
Kill all windows with the title "Emacs":
|
||||||
|
|
||||||
|
```
|
||||||
|
[class="Emacs"] kill
|
||||||
|
```
|
||||||
|
|
||||||
|
Mark all Firefox windows with "Browser":
|
||||||
|
|
||||||
|
```
|
||||||
|
[class="Firefox"] mark Browser
|
||||||
|
```
|
||||||
|
|
||||||
|
The following attributes may be matched with:
|
||||||
|
|
||||||
|
*app\_id*
|
||||||
|
Compare value against the app id. Can be a regular expression. If value is
|
||||||
|
\_\_focused\_\_, then the app id must be the same as that of the currently
|
||||||
|
focused window.
|
||||||
|
|
||||||
|
*class*
|
||||||
|
Compare value against the window class. Can be a regular expression. If
|
||||||
|
value is \_\_focused\_\_, then the window class must be the same as that of
|
||||||
|
the currently focused window.
|
||||||
|
|
||||||
|
*con\_id*
|
||||||
|
Compare against the internal container ID, which you can find via IPC.
|
||||||
|
|
||||||
|
*con\_mark*
|
||||||
|
Compare against the window marks. Can be a regular expression.
|
||||||
|
|
||||||
|
*floating*
|
||||||
|
Matches floating windows.
|
||||||
|
|
||||||
|
*id*
|
||||||
|
Compare value against the X11 window ID. Must be numeric.
|
||||||
|
|
||||||
|
*instance*
|
||||||
|
Compare value against the window instance. Can be a regular expression. If
|
||||||
|
value is \_\_focused\_\_, then the window instance must be the same as that
|
||||||
|
of the currently focused window.
|
||||||
|
|
||||||
|
*tiling*
|
||||||
|
Matches tiling windows.
|
||||||
|
|
||||||
|
*title*
|
||||||
|
Compare against the window title. Can be a regular expression. If value is
|
||||||
|
\_\_focused\_\_, then the window title must be the same as that of the
|
||||||
|
currently focused window.
|
||||||
|
|
||||||
|
*urgent*
|
||||||
|
Compares the urgent state of the window. Can be "latest" or "oldest".
|
||||||
|
|
||||||
|
*window\_role*
|
||||||
|
Compare against the window role (WM\_WINDOW\_ROLE). Can be a regular
|
||||||
|
expression. If value is \_\_focused\_\_, then the window role must be the
|
||||||
|
same as that of the currently focused window.
|
||||||
|
|
||||||
|
*window\_type*
|
||||||
|
Compare against the window type (\_NET\_WM\_WINDOW\_TYPE). Possible values
|
||||||
|
are normal, dialog, utility, toolbar, splash, menu, dropdown\_menu,
|
||||||
|
popup\_menu, tooltip and notification.
|
||||||
|
|
||||||
|
*workspace*
|
||||||
|
Compare against the workspace name for this view. Can be a regular
|
||||||
|
expression. If the value is \_\_focused\_\_, then all the views on the
|
||||||
|
currently focused workspace matches.
|
||||||
|
|
||||||
|
# SEE ALSO
|
||||||
|
|
||||||
|
*sway*(1) *sway-input*(5) *sway-bar*(5)
|
@ -1,521 +0,0 @@
|
|||||||
/////
|
|
||||||
vim:set ts=4 sw=4 tw=82 noet:
|
|
||||||
/////
|
|
||||||
sway (5)
|
|
||||||
========
|
|
||||||
|
|
||||||
Name
|
|
||||||
----
|
|
||||||
sway - configuration file and commands
|
|
||||||
|
|
||||||
Description
|
|
||||||
-----------
|
|
||||||
|
|
||||||
A sway configuration file is a list of sway commands that are executed by sway
|
|
||||||
on startup. These commands usually consist of setting your preferences and
|
|
||||||
setting key bindings. An example config is likely present in /etc/sway/config
|
|
||||||
for you to check out.
|
|
||||||
|
|
||||||
Lines in the configuration file might be extended through multiple lines by
|
|
||||||
adding a '\' character at the end of line. e.g.:
|
|
||||||
|
|
||||||
bindsym Shift+XF86AudioRaiseVolume exec pactl set-sink-volume \
|
|
||||||
$(pactl list sinks | grep -B 1 RUNNING | sed '1q;d' | sed 's/[^0-9]\+//g') +5%
|
|
||||||
|
|
||||||
These commands can be executed in your config file, via **swaymsg**(1), or via
|
|
||||||
the bindsym command.
|
|
||||||
|
|
||||||
Commands
|
|
||||||
--------
|
|
||||||
|
|
||||||
The following commands may only be used in the configuration file.
|
|
||||||
|
|
||||||
**bar** <block of commands>::
|
|
||||||
Append _{_ to this command, the following lines will be commands that
|
|
||||||
configure **swaybar**, and _}_ on its own line to close the block.
|
|
||||||
+
|
|
||||||
See **sway-bar**(5) for details.
|
|
||||||
|
|
||||||
**default_orientation** <horizontal|vertical|auto>::
|
|
||||||
Sets the default container layout for tiled containers.
|
|
||||||
|
|
||||||
**set** <name> <value>::
|
|
||||||
Sets variable $name to _value_. You can use the new variable in the arguments
|
|
||||||
of future commands.
|
|
||||||
|
|
||||||
**swaybg_command** <command>::
|
|
||||||
Executes custom bg command, default is _swaybg_.
|
|
||||||
|
|
||||||
The following commands cannot be used directly in the configuration file.
|
|
||||||
They are expected to be used with **bindsym** or at runtime through **swaymsg**(1).
|
|
||||||
|
|
||||||
**border** <normal|pixel> [<n>]::
|
|
||||||
Set border style for focused window. _normal_ includes a border of thickness
|
|
||||||
_n_ and a title bar. _pixel_ is a border without title bar _n_ pixels thick.
|
|
||||||
Default is _normal_ with border thickness 2.
|
|
||||||
|
|
||||||
**border** <none|toggle>::
|
|
||||||
Set border style for focused window to _none_ or _toggle_ between the
|
|
||||||
available border styles: _normal_, _pixel_, _none_.
|
|
||||||
|
|
||||||
**exit**::
|
|
||||||
Exit sway and end your Wayland session.
|
|
||||||
|
|
||||||
**floating** <enable|disable|toggle>::
|
|
||||||
Make focused view floating, non-floating, or the opposite of what it is now.
|
|
||||||
|
|
||||||
**focus** <direction>::
|
|
||||||
Direction may be one of _up_, _down_, _left_, _right_, _next_, _prev_,
|
|
||||||
_parent_, or _child_. The directional focus commands will move the focus
|
|
||||||
in that direction. The _next_ and _prev_ directions will focus the next,
|
|
||||||
respectively previous, element in the current container. The parent
|
|
||||||
focus command will change the focus to the parent of the currently
|
|
||||||
focused container, which is useful, for example, to open a sibling of
|
|
||||||
the parent container, or to move the entire container around.
|
|
||||||
|
|
||||||
**focus** output <direction|name>::
|
|
||||||
Direction may be one of _up_, _down_, _left_, _right_. The directional focus
|
|
||||||
commands will move the focus to the output in that direction. When name is
|
|
||||||
given, the focus is changed to the output with that name.
|
|
||||||
|
|
||||||
**focus** mode_toggle::
|
|
||||||
Toggles focus between floating view and tiled view.
|
|
||||||
|
|
||||||
**fullscreen**::
|
|
||||||
Toggles fullscreen status for the focused view.
|
|
||||||
|
|
||||||
**layout** <mode>::
|
|
||||||
Sets the layout mode of the focused container. _mode_ can be one of _splith_,
|
|
||||||
_splitv_, _toggle split_, _stacking_, _tabbed_.
|
|
||||||
|
|
||||||
**layout** auto <mode>::
|
|
||||||
Sets layout to one of the auto modes, i.e. one of _left_, _right_, _top_,
|
|
||||||
or _bottom_.
|
|
||||||
|
|
||||||
**layout** auto <next|prev>::
|
|
||||||
Cycles between available auto layouts.
|
|
||||||
|
|
||||||
**layout** auto [master|ncol] [inc|set] <n>::
|
|
||||||
Modify the number of master elements, respectively slave columns, in the
|
|
||||||
focused container. <n> can be a positive or negative integer. These commands
|
|
||||||
only have an effect if the focused container uses one of the "auto" layouts.
|
|
||||||
|
|
||||||
**layout** toggle split::
|
|
||||||
Cycles between available split layouts.
|
|
||||||
|
|
||||||
**move** <left|right|up|down> <[px]>::
|
|
||||||
Moves the focused container _left_, _right_, _up_, or _down_. If the window
|
|
||||||
is floating it moves it _px_ in that direction, defaulting to 10. Tiled
|
|
||||||
containers are moved the same regardless of the _px_ argument.
|
|
||||||
|
|
||||||
**move** <next|prev|first>::
|
|
||||||
Moving to _prev_ or _next_ swaps the container with its sibling in the same
|
|
||||||
container. Move _first_ exchanges the focused element in an auto layout with
|
|
||||||
the first element, i.e. promotes the focused element to master position.
|
|
||||||
|
|
||||||
**move** <container|window> to workspace <name>::
|
|
||||||
Moves the focused container to the workspace identified by _name_.
|
|
||||||
_name_ may be a special workspace name. See **workspace**.
|
|
||||||
|
|
||||||
**move** <container|window|workspace> to output <name|direction>::
|
|
||||||
Moves the focused container or workspace to the output identified by _name_ or
|
|
||||||
_direction_. _direction_ may be one of _up_, _down_, _left_, _right_.
|
|
||||||
|
|
||||||
**move** [to] scratchpad::
|
|
||||||
Moves the focused window to the scratchpad.
|
|
||||||
|
|
||||||
**reload**::
|
|
||||||
Reloads the sway config file without restarting sway.
|
|
||||||
|
|
||||||
**resize** <shrink|grow> <width|height> [<amount>] [px|ppt]::
|
|
||||||
Resizes the currently focused container or view by _amount_. _amount_ is
|
|
||||||
optional: the default value is 10 (either px or ppt depending on the view type).
|
|
||||||
The [px|ppt] parameter is optional. _px_ specifies that _amount_ refers to pixels;
|
|
||||||
_ppt_ specifies that _amount_ refers to percentage points of the current
|
|
||||||
size. Floating views use px by default (but can use ppt if specified); tiled
|
|
||||||
views use ppt by default (but can use px if specified).
|
|
||||||
|
|
||||||
**resize set** <width> [px] <height> [px]::
|
|
||||||
Sets the width and height of the currently focused container to _width_ pixels
|
|
||||||
and _height_ pixels. The [px] parameters are optional and have no effect. This
|
|
||||||
command only accepts a size in pixels.
|
|
||||||
|
|
||||||
**resize set** <width|height> <amount> [px] [<width|height> <amount> [px]]::
|
|
||||||
Sets the _width_ and/or _height_ of the currently focused container to
|
|
||||||
_amount_. The [px] parameters are optional and have no effect. This command
|
|
||||||
only accepts a size in pixels.
|
|
||||||
|
|
||||||
**scratchpad show**::
|
|
||||||
Shows a window from the scratchpad. Repeatedly using this command will cycle
|
|
||||||
through the windows in the scratchpad.
|
|
||||||
|
|
||||||
**split** <vertical|v|horizontal|h|toggle|t>::
|
|
||||||
Splits the current container, vertically or horizontally. If toggled, then the
|
|
||||||
current container is split opposite to the parent container.
|
|
||||||
|
|
||||||
**splith**::
|
|
||||||
Equivalent to **split horizontal**.
|
|
||||||
|
|
||||||
**splitv**::
|
|
||||||
Equivalent to **split vertical**.
|
|
||||||
|
|
||||||
**splitt**::
|
|
||||||
Equivalent to **split toggle**.
|
|
||||||
|
|
||||||
**sticky** <enable|disable|toggle>::
|
|
||||||
"Sticks" a floating window to the current output so that it shows up on all
|
|
||||||
workspaces.
|
|
||||||
|
|
||||||
The following commands may be used either in the configuration file
|
|
||||||
or triggered at runtime.
|
|
||||||
|
|
||||||
**assign** <criteria> [→] <workspace>::
|
|
||||||
Assigns views matching _criteria_ (see **Criteria** section below) to
|
|
||||||
_workspace_. The → (U+2192) is optional and purely for aesthetics. This
|
|
||||||
command is exactly equivalent to "for_window <criteria> move container to
|
|
||||||
workspace <workspace>".
|
|
||||||
|
|
||||||
**bindsym** <key combo> <command>::
|
|
||||||
Binds _key combo_ to execute _command_ when pressed. You may use XKB key
|
|
||||||
names here (**xev**(1) is a good tool for discovering them). An example
|
|
||||||
bindsym command would be **bindsym Mod1+Shift+f exec firefox**, which would
|
|
||||||
execute Firefox if the alt, shift, and F keys are pressed together. Any
|
|
||||||
valid sway command is eligible to be bound to a key combo.
|
|
||||||
+
|
|
||||||
**bindcode** <code> <command> is also available for binding with key codes
|
|
||||||
instead of key names.
|
|
||||||
|
|
||||||
**client**.<color_class> <border> <background> <text> <indicator> <child_border>::
|
|
||||||
The client commands control the colors of the view borders and title bars. All
|
|
||||||
client commands _require_ five color values. (The one exception is
|
|
||||||
**client.background** which _requires_ one color value.) If you only want to
|
|
||||||
specify a subset, supply default colors for all the others. Colors must be
|
|
||||||
defined in hex. i.e. _#rrggbb_ or _#rrggbbaa_, when including the alpha
|
|
||||||
channel.
|
|
||||||
+
|
|
||||||
The command tokens are:
|
|
||||||
**color_class**::: Specifies the view to which the colors apply.
|
|
||||||
**client.background**:::: The color a view will be painted, underneath the
|
|
||||||
client itself. This will only be visible if a client does not fully
|
|
||||||
cover its allocated view space. This command only requires one color. _Note_:
|
|
||||||
This is not currently implemented.
|
|
||||||
**client.focused**:::: The view that has focus.
|
|
||||||
**client.focused_inactive**:::: A view that has focus within its
|
|
||||||
container, but the container is not focused.
|
|
||||||
**client.placeholder**:::: Used when drawing placeholder view contents.
|
|
||||||
Only background and text colors are used. _Note_: This is not
|
|
||||||
currently implemented.
|
|
||||||
**client.unfocused**:::: A view that does not have focus.
|
|
||||||
**client.urgent**:::: A view with an urgency hint. _Note_: This is not
|
|
||||||
currently implemented.
|
|
||||||
**border**::: The border around the title bar.
|
|
||||||
**background**::: The background of the title bar.
|
|
||||||
**text**::: The text color of the title bar.
|
|
||||||
**indicator**::: The color used to indicate where a new view will open. In a
|
|
||||||
tiled container, this would paint the right border of the current view if
|
|
||||||
a new view would be opened to the right.
|
|
||||||
**child_border**::: The border around the view itself.
|
|
||||||
|
|
||||||
+
|
|
||||||
The default colors are:
|
|
||||||
+
|
|
||||||
--
|
|
||||||
[options="header"]
|
|
||||||
|===========================================================================
|
|
||||||
|color_class |border |background |text |indicator |child_border
|
|
||||||
|background |n/a |#ffffff |n/a |n/a |n/a
|
|
||||||
|focused |#4c7899 |#285577 |#ffffff |#2e9ef4 |#285577
|
|
||||||
|focused_inactive |#333333 |#5f676a |#ffffff |#484e50 |#5f676a
|
|
||||||
|unfocused |#333333 |#222222 |#888888 |#292d2e |#222222
|
|
||||||
|urgent |#2f343a |#900000 |#ffffff |#900000 |#900000
|
|
||||||
|placeholder |#000000 |#0c0c0c |#ffffff |#000000 |#0c0c0c
|
|
||||||
|===========================================================================
|
|
||||||
--
|
|
||||||
|
|
||||||
**debuglog** <on|off|toggle>::
|
|
||||||
Enables, disables or toggles debug logging. The toggle argument cannot be used
|
|
||||||
in the configuration file.
|
|
||||||
|
|
||||||
**default_border** <normal|none|pixel> [<n>]::
|
|
||||||
Set default border style for new windows. This command was previously called
|
|
||||||
**new_window**. While **new_window** still works, it is considered deprecated
|
|
||||||
and support for it will be removed in the future.
|
|
||||||
|
|
||||||
**default_floating_border** <normal|none|pixel> [<n>]::
|
|
||||||
Set default border style for new floating windows. This only applies to
|
|
||||||
windows that are spawned in floating mode, not windows that become floating
|
|
||||||
after the fact. This command was previously called **new_float**. While
|
|
||||||
**new_float** still works, it is considered deprecated and support for it will
|
|
||||||
be removed in the future.
|
|
||||||
|
|
||||||
**exec** <shell command>::
|
|
||||||
Executes _shell command_ with sh.
|
|
||||||
|
|
||||||
**exec_always** <shell command>::
|
|
||||||
Like exec, but the shell command will be executed _again_ after *reload* or
|
|
||||||
*restart* is executed.
|
|
||||||
|
|
||||||
**floating_maximum_size** <width> x <height>::
|
|
||||||
Specifies the maximum size of floating windows.
|
|
||||||
Uses the container size as default.
|
|
||||||
-1 x -1 will remove any restriction on size.
|
|
||||||
0 x 0 has the same behavior as not setting any value.
|
|
||||||
If in conflict, this option has precedence over floating_minimum_size.
|
|
||||||
|
|
||||||
**floating_minimum_size** <width> x <height>::
|
|
||||||
Specifies the minimum size of floating windows.
|
|
||||||
Default parameters are 75 x 50.
|
|
||||||
-1 and 0 are invalid parameters, default will be used instead.
|
|
||||||
|
|
||||||
**floating_modifier** <modifier> [normal|inverse]::
|
|
||||||
When the _modifier_ key is held down, you may hold left click to move floating
|
|
||||||
windows, and right click to resize them. Unlike i3, this modifier may also be
|
|
||||||
used to resize and move windows that are tiled. With the _inverse_ mode
|
|
||||||
enabled, left click is used for resizing and right click for dragging. The
|
|
||||||
mode parameter is optional and defaults to _normal_ if it isn't defined.
|
|
||||||
|
|
||||||
**floating_scroll** <up|down|left|right> [command]::
|
|
||||||
Sets a command to be executed when the mouse wheel is scrolled in the
|
|
||||||
specified direction while holding the floating modifier. Resets the command,
|
|
||||||
when given no arguments.
|
|
||||||
|
|
||||||
**focus_follows_mouse** <yes|no>::
|
|
||||||
If set to _yes_, moving your mouse over a window will focus that window.
|
|
||||||
|
|
||||||
**font** <font>::
|
|
||||||
Sets font for use in title bars. Generally the format is something like "Name
|
|
||||||
Style Size" e.g. "Deja Vu Sans Book 12". You can also use Pango font
|
|
||||||
descriptions with "pango:font".
|
|
||||||
|
|
||||||
**for_window** <criteria> <command>::
|
|
||||||
Whenever a window that matches _criteria_ appears, run list of commands. See
|
|
||||||
**Criteria** section below.
|
|
||||||
|
|
||||||
**gaps** edge_gaps <on|off|toggle>::
|
|
||||||
Whether or not to add gaps between views and workspace edges if amount of
|
|
||||||
inner gap is not zero. When _off_, no gap is added where the view is aligned to
|
|
||||||
the workspace edge, effectively creating gaps only between views. The toggle
|
|
||||||
argument cannot be used in the configuration file.
|
|
||||||
|
|
||||||
**gaps** <amount>::
|
|
||||||
Sets default _amount_ pixels as the gap between each view, and around each
|
|
||||||
workspace.
|
|
||||||
|
|
||||||
**gaps** <inner|outer> <amount>::
|
|
||||||
Sets default _amount_ pixels as the _inner_ or _outer_ gap, where the former
|
|
||||||
affects spacing between views and the latter affects the space around each
|
|
||||||
workspace.
|
|
||||||
|
|
||||||
**gaps** <inner|outer> <all|workspace|current> <set|plus|minus> <amount>::
|
|
||||||
Changes the gaps for the _inner_ or _outer_ gap. _all_ changes the gaps for
|
|
||||||
all views or workspace, _workspace_ changes gaps for all views in current
|
|
||||||
workspace (or current workspace), and _current_ changes gaps for the current
|
|
||||||
view or workspace.
|
|
||||||
|
|
||||||
**hide_edge_borders** <none|vertical|horizontal|both|smart>::
|
|
||||||
Hide window borders adjacent to the screen edges. Default is _none_.
|
|
||||||
|
|
||||||
**input** <input_device> <block of commands>::
|
|
||||||
Append _{_ to this command, the following lines will be commands to configure
|
|
||||||
the named input device, and _}_ on its own line will close the block.
|
|
||||||
+
|
|
||||||
**input * <block of commands>** may be used to match all input devices.
|
|
||||||
+
|
|
||||||
See **sway-input**(5) for details.
|
|
||||||
|
|
||||||
**seat** <seat_name> <block of commands>::
|
|
||||||
Append _{_ to this command, the following lines will be commands to configure
|
|
||||||
the named seat, and _}_ on its own line will close the block.
|
|
||||||
See **sway-input**(5) for details.
|
|
||||||
|
|
||||||
**seat** <seat_name> cursor <move|set> <x> <y>::
|
|
||||||
Move cursor relatively to current position or set to absolute screen position.
|
|
||||||
A value of 0 causes the axis to be ignored in both commands.
|
|
||||||
|
|
||||||
**seat** <seat_name> cursor <press|release> <left|right|1|2|3...>::
|
|
||||||
Simulate press of mouse button specified by left, right, or numerical code.
|
|
||||||
|
|
||||||
**kill**::
|
|
||||||
Kills (force-closes) the currently-focused container and all of its children.
|
|
||||||
|
|
||||||
**smart_gaps** <on|off>::
|
|
||||||
If smart_gaps are _on_ then gaps will only be enabled if a workspace has more
|
|
||||||
than one child container.
|
|
||||||
|
|
||||||
**mark** \<--add|--replace> \<--toggle> <identifier>::
|
|
||||||
Marks are arbitrary labels that can be used to identify certain windows and
|
|
||||||
then jump to them at a later time. By default, the **mark** command sets
|
|
||||||
_identifier_ as the only mark on a window. By specifying _--add_, mark will
|
|
||||||
add _identifier_ to the list of current marks. If _--toggle_ is specified mark
|
|
||||||
will remove _identifier_ if it is already a label. Marks may be found by using
|
|
||||||
a criteria. See the **Criteria** section below.
|
|
||||||
|
|
||||||
**mode** <mode_name>::
|
|
||||||
Switches to the given mode_name. The default mode is simply _default_. To
|
|
||||||
create a new mode append _{_ to this command, the following lines
|
|
||||||
will be keybindings for that mode, and _}_ on its own line to close the block.
|
|
||||||
|
|
||||||
**mouse_warping** <output|none>::
|
|
||||||
When _output_: place mouse at center of newly focused window when changing
|
|
||||||
output. When _none_: don't move mouse.
|
|
||||||
|
|
||||||
**no_focus** <criteria>::
|
|
||||||
Prevents windows matching <criteria> from being focused automatically when
|
|
||||||
they're created. This does not apply to the first window in a workspace.
|
|
||||||
|
|
||||||
**output** <name> mode|resolution|res <WIDTHxHEIGHT>[@<RATE>[Hz]]::
|
|
||||||
Configures the specified output to use the given mode. Modes are a combination
|
|
||||||
of width and height (in pixels) and a refresh rate that your display can be
|
|
||||||
configured to use. For a list of available modes, use swaymsg -t get_outputs.
|
|
||||||
+
|
|
||||||
Examples:
|
|
||||||
+
|
|
||||||
output HDMI-A-1 mode 1920x1080
|
|
||||||
+
|
|
||||||
output HDMI-A-1 mode 1920x1080@60Hz
|
|
||||||
|
|
||||||
**output** <name> position|pos <X,Y>::
|
|
||||||
Configures the specified output to be arranged at the given position.
|
|
||||||
|
|
||||||
**output** <name> scale <I>::
|
|
||||||
Configures the specified output to be scaled up by the specified integer
|
|
||||||
scaling factor (usually 2 for HiDPI screens). Fractional scaling is supported.
|
|
||||||
|
|
||||||
**output** <name> background|bg <file> <mode>::
|
|
||||||
Sets the wallpaper for the given output to the specified file, using the given
|
|
||||||
scaling mode (one of "stretch", "fill", "fit", "center", "tile").
|
|
||||||
|
|
||||||
**output** <name> background|bg <color> solid_color::
|
|
||||||
Sets the background of the given output to the specified color. _color_ should
|
|
||||||
be specified as an _#rrggbb_ (no alpha) color.
|
|
||||||
|
|
||||||
**output** <name> transform <transform>::
|
|
||||||
Sets the background transform to the given value. Can be one of "90", "180",
|
|
||||||
"270" for rotation; or "flipped", "flipped-90", "flipped-180", "flipped-270"
|
|
||||||
to apply a rotation and flip, or "normal" to apply no transform.
|
|
||||||
|
|
||||||
**output** <name> disable::
|
|
||||||
Disables the specified output.
|
|
||||||
|
|
||||||
**NOTES FOR THE OUTPUT COMMAND**::
|
|
||||||
You may combine output commands into one, like so:
|
|
||||||
+
|
|
||||||
output HDMI-A-1 mode 1920x1080 pos 1920,0 bg ~/wallpaper.png stretch
|
|
||||||
+
|
|
||||||
You can get a list of output names like so:
|
|
||||||
+
|
|
||||||
swaymsg -t get_outputs
|
|
||||||
+
|
|
||||||
You may also match any output by using the output name "*". Be sure to add
|
|
||||||
this output config after the others, or it will be matched instead of the
|
|
||||||
others.
|
|
||||||
|
|
||||||
**seamless_mouse** <on|off>::
|
|
||||||
Change output seamlessly when pointer touches edge of output. Outputs need to
|
|
||||||
be configured with perfectly aligned adjacent positions for this option to
|
|
||||||
have any effect.
|
|
||||||
|
|
||||||
**show_marks** <on|off>::
|
|
||||||
If **show_marks** is on then marks will be showed in the window decoration.
|
|
||||||
However, any mark that starts with an underscore will not be drawn even if the
|
|
||||||
option is on. The default option is _on_.
|
|
||||||
|
|
||||||
**opacity** <value>::
|
|
||||||
Set the opacity of the window between 0 (completely transparent) and 1
|
|
||||||
(completely opaque).
|
|
||||||
|
|
||||||
**unmark** <identifier>::
|
|
||||||
**Unmark** will remove _identifier_ from the list of current marks on a window. If
|
|
||||||
no _identifier_ is specified, then **unmark** will remove all marks.
|
|
||||||
|
|
||||||
**workspace** [number] <name>::
|
|
||||||
Switches to the specified workspace. The string "number" is optional. The
|
|
||||||
workspace _name_, if unquoted, may not contain the string "output", as sway
|
|
||||||
will assume that the command is moving a workspace to an output, as described
|
|
||||||
below.
|
|
||||||
|
|
||||||
**workspace** <prev|next>::
|
|
||||||
Switches to the next workspace on the current output or on the next output
|
|
||||||
if currently on the last workspace.
|
|
||||||
|
|
||||||
**workspace** <prev_on_output|next_on_output>::
|
|
||||||
Switches to the next workspace on the current output.
|
|
||||||
|
|
||||||
**workspace** <name> output <output>::
|
|
||||||
Specifies that the workspace named _name_ should appear on the specified
|
|
||||||
_output_.
|
|
||||||
|
|
||||||
**workspace_auto_back_and_forth** <yes|no>::
|
|
||||||
When _yes_, repeating a workspace switch command will switch back to the
|
|
||||||
prior workspace. For example, if you are currently on workspace 1,
|
|
||||||
switch to workspace 2, then invoke the "workspace 2" command again, you
|
|
||||||
will be returned to workspace 1. Defaults to _no_.
|
|
||||||
|
|
||||||
**workspace_layout** <default|stacking|tabbed|auto|auto left|auto right|auto
|
|
||||||
top|auto bottom>:: Specifies the start layout for new workspaces.
|
|
||||||
|
|
||||||
**include** <path>::
|
|
||||||
Includes a sub config file by _path_. _path_ can be either a full path or a
|
|
||||||
path relative to the parent config.
|
|
||||||
|
|
||||||
Criteria
|
|
||||||
--------
|
|
||||||
|
|
||||||
A criteria is a string in the form of e.g.:
|
|
||||||
|
|
||||||
[class="[Rr]egex.*" title="some title"]
|
|
||||||
|
|
||||||
The string contains one or more (space separated) attribute/value pairs. They
|
|
||||||
are used by some commands to choose which views to execute actions on. All attributes
|
|
||||||
must match for the criteria to match.
|
|
||||||
|
|
||||||
Criteria may be used with either the **for_window** or **assign** commands to
|
|
||||||
specify operations to perform on new views. A criteria may also be used to
|
|
||||||
perform specific commands (ones that normally act upon one window) on all views
|
|
||||||
that match that criteria. For example:
|
|
||||||
|
|
||||||
Focus on a window with the mark "IRC":
|
|
||||||
[con_mark="IRC"] focus
|
|
||||||
|
|
||||||
Kill all windows with the title "Emacs":
|
|
||||||
[class="Emacs"] kill
|
|
||||||
|
|
||||||
Mark all Firefox windows with "Browser":
|
|
||||||
[class="Firefox"] mark Browser
|
|
||||||
|
|
||||||
Currently supported attributes:
|
|
||||||
|
|
||||||
**class**::
|
|
||||||
Compare value against the window class. Can be a regular expression. If value
|
|
||||||
is _focused_, then the window class must be the same as that of the currently
|
|
||||||
focused window.
|
|
||||||
|
|
||||||
**con_id**::
|
|
||||||
Compare against the internal container ID, which you can find via IPC.
|
|
||||||
|
|
||||||
**con_mark**::
|
|
||||||
Compare against the window marks. Can be a regular expression.
|
|
||||||
|
|
||||||
**floating**::
|
|
||||||
Matches against floating windows.
|
|
||||||
|
|
||||||
**id**::
|
|
||||||
Compare value against the app id. Can be a regular expression.
|
|
||||||
|
|
||||||
**title**::
|
|
||||||
Compare against the window title. Can be a regular expression. If value is
|
|
||||||
_focused_ then the window title must be the same as that of the currently
|
|
||||||
focused window.
|
|
||||||
|
|
||||||
**tiling**::
|
|
||||||
Matches against tiling windows.
|
|
||||||
|
|
||||||
**workspace**::
|
|
||||||
Compare against the workspace name for this view. Can be a regular expression.
|
|
||||||
If the value is _focused_, then all the views on the currently focused workspace
|
|
||||||
matches.
|
|
||||||
|
|
||||||
See Also
|
|
||||||
--------
|
|
||||||
|
|
||||||
**sway**(1) **sway-input**(5) **sway-bar**(5)
|
|
@ -1,144 +0,0 @@
|
|||||||
#define _XOPEN_SOURCE 700
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "log.h"
|
|
||||||
#include "ipc-client.h"
|
|
||||||
#include "swaygrab/json.h"
|
|
||||||
|
|
||||||
static json_object *tree;
|
|
||||||
|
|
||||||
void init_json_tree(int socketfd) {
|
|
||||||
uint32_t len = 0;
|
|
||||||
char *res = ipc_single_command(socketfd, IPC_GET_TREE, NULL, &len);
|
|
||||||
struct json_tokener *tok = json_tokener_new_ex(256);
|
|
||||||
if (!tok) {
|
|
||||||
sway_abort("Unable to get json tokener.");
|
|
||||||
}
|
|
||||||
tree = json_tokener_parse_ex(tok, res, len);
|
|
||||||
if (!tree || tok->err != json_tokener_success) {
|
|
||||||
sway_abort("Unable to parse IPC response as JSON: %s", json_tokener_error_desc(tok->err));
|
|
||||||
}
|
|
||||||
json_object *success;
|
|
||||||
json_object_object_get_ex(tree, "success", &success);
|
|
||||||
if (success && !json_object_get_boolean(success)) {
|
|
||||||
json_object *error;
|
|
||||||
json_object_object_get_ex(tree, "error", &error);
|
|
||||||
sway_abort("IPC request failed: %s", json_object_get_string(error));
|
|
||||||
}
|
|
||||||
json_object_put(success);
|
|
||||||
json_tokener_free(tok);
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_json_tree() {
|
|
||||||
json_object_put(tree);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool is_focused(json_object *c) {
|
|
||||||
json_object *focused;
|
|
||||||
json_object_object_get_ex(c, "focused", &focused);
|
|
||||||
return json_object_get_boolean(focused);
|
|
||||||
}
|
|
||||||
|
|
||||||
static json_object *get_focused_container_r(json_object *c) {
|
|
||||||
json_object *name;
|
|
||||||
json_object_object_get_ex(c, "name", &name);
|
|
||||||
if (is_focused(c)) {
|
|
||||||
return c;
|
|
||||||
} else {
|
|
||||||
json_object *nodes, *node, *child;
|
|
||||||
json_object_object_get_ex(c, "nodes", &nodes);
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < json_object_array_length(nodes); i++) {
|
|
||||||
node = json_object_array_get_idx(nodes, i);
|
|
||||||
|
|
||||||
if ((child = get_focused_container_r(node))) {
|
|
||||||
return child;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
json_object_object_get_ex(c, "floating_nodes", &nodes);
|
|
||||||
for (i = 0; i < json_object_array_length(nodes); i++) {
|
|
||||||
node = json_object_array_get_idx(nodes, i);
|
|
||||||
|
|
||||||
if ((child = get_focused_container_r(node))) {
|
|
||||||
return child;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
json_object *get_focused_container() {
|
|
||||||
return get_focused_container_r(tree);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *get_focused_output() {
|
|
||||||
json_object *outputs, *output, *name;
|
|
||||||
json_object_object_get_ex(tree, "nodes", &outputs);
|
|
||||||
if (!outputs) {
|
|
||||||
sway_abort("Unabled to get focused output. No nodes in tree.");
|
|
||||||
}
|
|
||||||
for (int i = 0; i < json_object_array_length(outputs); i++) {
|
|
||||||
output = json_object_array_get_idx(outputs, i);
|
|
||||||
|
|
||||||
if (get_focused_container_r(output)) {
|
|
||||||
json_object_object_get_ex(output, "name", &name);
|
|
||||||
return strdup(json_object_get_string(name));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *create_payload(const char *output, struct wlc_geometry *g) {
|
|
||||||
char *payload_str = malloc(256);
|
|
||||||
json_object *payload = json_object_new_object();
|
|
||||||
|
|
||||||
json_object_object_add(payload, "output", json_object_new_string(output));
|
|
||||||
json_object_object_add(payload, "x", json_object_new_int(g->origin.x));
|
|
||||||
json_object_object_add(payload, "y", json_object_new_int(g->origin.y));
|
|
||||||
json_object_object_add(payload, "w", json_object_new_int(g->size.w));
|
|
||||||
json_object_object_add(payload, "h", json_object_new_int(g->size.h));
|
|
||||||
|
|
||||||
snprintf(payload_str, 256, "%s", json_object_to_json_string(payload));
|
|
||||||
return strdup(payload_str);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct wlc_geometry *get_container_geometry(json_object *container) {
|
|
||||||
struct wlc_geometry *geo = malloc(sizeof(struct wlc_geometry));
|
|
||||||
json_object *rect, *x, *y, *w, *h;
|
|
||||||
|
|
||||||
json_object_object_get_ex(container, "rect", &rect);
|
|
||||||
json_object_object_get_ex(rect, "x", &x);
|
|
||||||
json_object_object_get_ex(rect, "y", &y);
|
|
||||||
json_object_object_get_ex(rect, "width", &w);
|
|
||||||
json_object_object_get_ex(rect, "height", &h);
|
|
||||||
|
|
||||||
geo->origin.x = json_object_get_int(x);
|
|
||||||
geo->origin.y = json_object_get_int(y);
|
|
||||||
geo->size.w = json_object_get_int(w);
|
|
||||||
geo->size.h = json_object_get_int(h);
|
|
||||||
|
|
||||||
return geo;
|
|
||||||
}
|
|
||||||
|
|
||||||
json_object *get_output_container(const char *output) {
|
|
||||||
json_object *outputs, *json_output, *name;
|
|
||||||
json_object_object_get_ex(tree, "nodes", &outputs);
|
|
||||||
|
|
||||||
for (int i = 0; i < json_object_array_length(outputs); i++) {
|
|
||||||
json_output = json_object_array_get_idx(outputs, i);
|
|
||||||
json_object_object_get_ex(json_output, "name", &name);
|
|
||||||
|
|
||||||
if (strcmp(json_object_get_string(name), output) == 0) {
|
|
||||||
return json_output;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
@ -1,298 +0,0 @@
|
|||||||
#define _XOPEN_SOURCE 700
|
|
||||||
#define _POSIX_C_SOURCE 199309L
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <json-c/json.h>
|
|
||||||
#include "log.h"
|
|
||||||
#include "ipc-client.h"
|
|
||||||
#include "util.h"
|
|
||||||
#include "swaygrab/json.h"
|
|
||||||
|
|
||||||
void sway_terminate(int exit_code) {
|
|
||||||
exit(exit_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
void grab_and_apply_magick(const char *file, const char *payload,
|
|
||||||
int socketfd, int raw) {
|
|
||||||
uint32_t len = strlen(payload);
|
|
||||||
char *pixels = ipc_single_command(socketfd,
|
|
||||||
IPC_SWAY_GET_PIXELS, payload, &len);
|
|
||||||
uint32_t *u32pixels = (uint32_t *)(pixels + 1);
|
|
||||||
uint32_t width = u32pixels[0];
|
|
||||||
uint32_t height = u32pixels[1];
|
|
||||||
len -= 9;
|
|
||||||
pixels += 9;
|
|
||||||
|
|
||||||
if (width == 0 || height == 0) {
|
|
||||||
// indicates geometry was clamped by WLC because it was outside of the output's area
|
|
||||||
json_object *obj = json_tokener_parse(payload);
|
|
||||||
json_object *output;
|
|
||||||
json_object_object_get_ex(obj, "output", &output);
|
|
||||||
const char *name = json_object_get_string(output);
|
|
||||||
json_object_put(obj);
|
|
||||||
sway_abort("Unknown output %s.", name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (raw) {
|
|
||||||
fwrite(pixels, 1, len, stdout);
|
|
||||||
fflush(stdout);
|
|
||||||
free(pixels - 9);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
char size[10 + 1 + 10 + 2 + 1]; // int32_t are max 10 digits
|
|
||||||
sprintf(size, "%dx%d+0", width, height);
|
|
||||||
|
|
||||||
pid_t child;
|
|
||||||
int fd[2];
|
|
||||||
pipe(fd);
|
|
||||||
|
|
||||||
if ((child = fork()) < 0) {
|
|
||||||
sway_log(L_ERROR, "Swaygrab failed to fork.");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
} else if (child != 0) {
|
|
||||||
close(fd[0]);
|
|
||||||
write(fd[1], pixels, len);
|
|
||||||
close(fd[1]);
|
|
||||||
free(pixels - 9);
|
|
||||||
waitpid(child, NULL, 0);
|
|
||||||
} else {
|
|
||||||
close(fd[1]);
|
|
||||||
if (dup2(fd[0], 0) != 0) {
|
|
||||||
sway_log(L_ERROR, "Could not fdup the pipe");
|
|
||||||
}
|
|
||||||
close(fd[0]);
|
|
||||||
execlp("convert", "convert", "-depth", "8", "-size", size, "rgba:-", "-flip", file, NULL);
|
|
||||||
sway_log(L_ERROR, "Swaygrab could not run convert.");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void grab_and_apply_movie_magic(const char *file, const char *payload,
|
|
||||||
int socketfd, int raw, int framerate) {
|
|
||||||
if (raw) {
|
|
||||||
sway_log(L_ERROR, "Raw capture data is not yet supported. Proceeding with ffmpeg normally.");
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t len = strlen(payload);
|
|
||||||
char *pixels = ipc_single_command(socketfd,
|
|
||||||
IPC_SWAY_GET_PIXELS, payload, &len);
|
|
||||||
uint32_t *u32pixels = (uint32_t *)(pixels + 1);
|
|
||||||
uint32_t width = u32pixels[0];
|
|
||||||
uint32_t height = u32pixels[1];
|
|
||||||
pixels += 9;
|
|
||||||
|
|
||||||
if (width == 0 || height == 0) {
|
|
||||||
// indicates geometry was clamped by WLC because it was outside of the output's area
|
|
||||||
json_object *obj = json_tokener_parse(payload);
|
|
||||||
json_object *output;
|
|
||||||
json_object_object_get_ex(obj, "output", &output);
|
|
||||||
const char *name = json_object_get_string(output);
|
|
||||||
json_object_put(obj);
|
|
||||||
sway_abort("Unknown output %s.", name);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *ffmpeg_opts = getenv("SWAYGRAB_FFMPEG_OPTS");
|
|
||||||
if(!ffmpeg_opts) {
|
|
||||||
ffmpeg_opts = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *fmt = "ffmpeg %s -f rawvideo -framerate %d "
|
|
||||||
"-video_size %dx%d -pixel_format argb "
|
|
||||||
"-i pipe:0 -r %d -vf vflip %s";
|
|
||||||
char *cmd = malloc(strlen(fmt) - 8 /*args*/
|
|
||||||
+ strlen(ffmpeg_opts) + numlen(width) + numlen(height)
|
|
||||||
+ numlen(framerate) * 2 + strlen(file) + 1);
|
|
||||||
sprintf(cmd, fmt, ffmpeg_opts, framerate, width, height, framerate, file);
|
|
||||||
|
|
||||||
long ns = (long)(1000000000 * (1.0 / framerate));
|
|
||||||
struct timespec start, finish, ts;
|
|
||||||
ts.tv_sec = 0;
|
|
||||||
|
|
||||||
FILE *f = popen(cmd, "w");
|
|
||||||
fwrite(pixels, 1, len, f);
|
|
||||||
free(pixels - 9);
|
|
||||||
int sleep = 0;
|
|
||||||
while (sleep != -1) {
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &start);
|
|
||||||
len = strlen(payload);
|
|
||||||
pixels = ipc_single_command(socketfd,
|
|
||||||
IPC_SWAY_GET_PIXELS, payload, &len);
|
|
||||||
pixels += 9;
|
|
||||||
len -= 9;
|
|
||||||
|
|
||||||
fwrite(pixels, 1, len, f);
|
|
||||||
|
|
||||||
free(pixels - 9);
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &finish);
|
|
||||||
ts.tv_nsec = ns;
|
|
||||||
double fts = (double)finish.tv_sec + 1.0e-9*finish.tv_nsec;
|
|
||||||
double sts = (double)start.tv_sec + 1.0e-9*start.tv_nsec;
|
|
||||||
long diff = (fts - sts) * 1000000000;
|
|
||||||
ts.tv_nsec = ns - diff;
|
|
||||||
if (ts.tv_nsec < 0) {
|
|
||||||
ts.tv_nsec = 0;
|
|
||||||
}
|
|
||||||
sleep = nanosleep(&ts, NULL);
|
|
||||||
}
|
|
||||||
fflush(f);
|
|
||||||
|
|
||||||
fclose(f);
|
|
||||||
free(cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *default_filename(const char *extension) {
|
|
||||||
int ext_len = strlen(extension);
|
|
||||||
int len = 28 + ext_len; // format: "2015-12-17-180040_swaygrab.ext"
|
|
||||||
char *filename = malloc(len * sizeof(char));
|
|
||||||
time_t t = time(NULL);
|
|
||||||
|
|
||||||
struct tm *lt = localtime(&t);
|
|
||||||
strftime(filename, len, "%Y-%m-%d-%H%M%S_swaygrab.", lt);
|
|
||||||
strncat(filename, extension, ext_len);
|
|
||||||
|
|
||||||
return filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
static int capture = 0, raw = 0;
|
|
||||||
char *socket_path = NULL;
|
|
||||||
char *output = NULL;
|
|
||||||
int framerate = 30;
|
|
||||||
bool grab_focused = false;
|
|
||||||
|
|
||||||
init_log(L_INFO);
|
|
||||||
|
|
||||||
static struct option long_options[] = {
|
|
||||||
{"help", no_argument, NULL, 'h'},
|
|
||||||
{"capture", no_argument, NULL, 'c'},
|
|
||||||
{"output", required_argument, NULL, 'o'},
|
|
||||||
{"version", no_argument, NULL, 'v'},
|
|
||||||
{"socket", required_argument, NULL, 's'},
|
|
||||||
{"raw", no_argument, NULL, 'r'},
|
|
||||||
{"rate", required_argument, NULL, 'R'},
|
|
||||||
{"focused", no_argument, NULL, 'f'},
|
|
||||||
{0, 0, 0, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
const char *usage =
|
|
||||||
"Usage: swaygrab [options] [file]\n"
|
|
||||||
"\n"
|
|
||||||
" -h, --help Show help message and quit.\n"
|
|
||||||
" -c, --capture Capture video.\n"
|
|
||||||
" -o, --output <output> Output source.\n"
|
|
||||||
" -v, --version Show the version number and quit.\n"
|
|
||||||
" -s, --socket <socket> Use the specified socket.\n"
|
|
||||||
" -R, --rate <rate> Specify framerate (default: 30)\n"
|
|
||||||
" -r, --raw Write raw rgba data to stdout.\n"
|
|
||||||
" -f, --focused Grab the focused container.\n";
|
|
||||||
|
|
||||||
int c;
|
|
||||||
while (1) {
|
|
||||||
int option_index = 0;
|
|
||||||
c = getopt_long(argc, argv, "hco:vs:R:rf", long_options, &option_index);
|
|
||||||
if (c == -1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
switch (c) {
|
|
||||||
case 'f':
|
|
||||||
grab_focused = true;
|
|
||||||
break;
|
|
||||||
case 's': // Socket
|
|
||||||
socket_path = strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 'r':
|
|
||||||
raw = 1;
|
|
||||||
break;
|
|
||||||
case 'o': // output
|
|
||||||
output = strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
capture = 1;
|
|
||||||
break;
|
|
||||||
case 'R': // Frame rate
|
|
||||||
framerate = atoi(optarg);
|
|
||||||
break;
|
|
||||||
case 'v':
|
|
||||||
fprintf(stdout, "sway version " SWAY_VERSION "\n");
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "%s", usage);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!socket_path) {
|
|
||||||
socket_path = get_socketpath();
|
|
||||||
if (!socket_path) {
|
|
||||||
sway_abort("Unable to retrieve socket path");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char *file = NULL;
|
|
||||||
if (raw) {
|
|
||||||
if (optind >= argc + 1) {
|
|
||||||
sway_abort("Invalid usage. See `man swaygrab` %d %d", argc, optind);
|
|
||||||
}
|
|
||||||
} else if (optind < argc) {
|
|
||||||
file = strdup(argv[optind]);
|
|
||||||
}
|
|
||||||
|
|
||||||
int socketfd = ipc_open_socket(socket_path);
|
|
||||||
free(socket_path);
|
|
||||||
|
|
||||||
init_json_tree(socketfd);
|
|
||||||
|
|
||||||
struct wlc_geometry *geo;
|
|
||||||
|
|
||||||
if (grab_focused) {
|
|
||||||
output = get_focused_output();
|
|
||||||
json_object *con = get_focused_container();
|
|
||||||
json_object *name;
|
|
||||||
json_object_object_get_ex(con, "name", &name);
|
|
||||||
geo = get_container_geometry(con);
|
|
||||||
free(con);
|
|
||||||
} else {
|
|
||||||
if (!output) {
|
|
||||||
output = get_focused_output();
|
|
||||||
}
|
|
||||||
geo = get_container_geometry(get_output_container(output));
|
|
||||||
// the geometry of the output in the get_tree response is relative to a global (0, 0).
|
|
||||||
// we need it to be relative to itself, so set origin to (0, 0) always.
|
|
||||||
geo->origin.x = 0;
|
|
||||||
geo->origin.y = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *payload = create_payload(output, geo);
|
|
||||||
|
|
||||||
free(geo);
|
|
||||||
|
|
||||||
if (!file) {
|
|
||||||
if (!capture) {
|
|
||||||
file = default_filename("png");
|
|
||||||
} else {
|
|
||||||
file = default_filename("webm");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!capture) {
|
|
||||||
grab_and_apply_magick(file, payload, socketfd, raw);
|
|
||||||
} else {
|
|
||||||
grab_and_apply_movie_magic(file, payload, socketfd, raw, framerate);
|
|
||||||
}
|
|
||||||
|
|
||||||
free_json_tree();
|
|
||||||
free(output);
|
|
||||||
free(file);
|
|
||||||
close(socketfd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
/////
|
|
||||||
vim:set ts=4 sw=4 tw=82 noet:
|
|
||||||
/////
|
|
||||||
:quotes.~:
|
|
||||||
|
|
||||||
swaygrab (1)
|
|
||||||
============
|
|
||||||
|
|
||||||
Name
|
|
||||||
----
|
|
||||||
swaygrab - Grab image data from the current sway session.
|
|
||||||
|
|
||||||
Synopsis
|
|
||||||
--------
|
|
||||||
'swaygrab' [options] [file]
|
|
||||||
|
|
||||||
Grabs pixels from an output and writes them to _file_. The image will be passed to
|
|
||||||
ImageMagick convert for processing.
|
|
||||||
|
|
||||||
Options
|
|
||||||
-------
|
|
||||||
|
|
||||||
*-h, --help*::
|
|
||||||
Show help message and quit.
|
|
||||||
|
|
||||||
*-c, \--capture*::
|
|
||||||
Captures multiple frames as video and passes them into ffmpeg. Continues until
|
|
||||||
you send SIGTERM (ctrl+c) to swaygrab.
|
|
||||||
|
|
||||||
*-o, \--output* <output>::
|
|
||||||
Use the specified _output_. If no output is defined the currently focused
|
|
||||||
output in sway will be used.
|
|
||||||
|
|
||||||
*-v, \--version*::
|
|
||||||
Print the version (of swaymsg) and quit.
|
|
||||||
|
|
||||||
*-s, --socket* <path>::
|
|
||||||
Use the specified socket path. Otherwise, swaymsg will ask sway where the
|
|
||||||
socket is (which is the value of $SWAYSOCK, then of $I3SOCK).
|
|
||||||
|
|
||||||
*-R, --rate* <rate>::
|
|
||||||
Specify a framerate (in frames per second). Used in combination with -c.
|
|
||||||
Default is 30. Must be an integer.
|
|
||||||
|
|
||||||
*-r, --raw*::
|
|
||||||
Instead of invoking ImageMagick or ffmpeg, dump raw rgba data to stdout.
|
|
||||||
|
|
||||||
*-f, --focused*::
|
|
||||||
Capture only the currently focused container.
|
|
||||||
|
|
||||||
Environment Variables
|
|
||||||
---------------------
|
|
||||||
swaygrab reads the following environment variables.
|
|
||||||
|
|
||||||
*SWAYGRAB_FFMPEG_OPTS*::
|
|
||||||
Pass additional arguments to FFmpeg when starting a capture.
|
|
||||||
|
|
||||||
Examples
|
|
||||||
--------
|
|
||||||
|
|
||||||
swaygrab output.png::
|
|
||||||
Grab the contents of currently focused output and write to output.png.
|
|
||||||
|
|
||||||
swaygrab -c -o HDMI-A-1 output.webm::
|
|
||||||
Capture a webm of HDMI-A-1.
|
|
||||||
|
|
||||||
SWAYGRAB_FFMPEG_OPTS="-f alsa -i pulse" swaygrab -c::
|
|
||||||
Capture the focused output and encode audio from the default recording
|
|
||||||
device.
|
|
||||||
|
|
||||||
Authors
|
|
||||||
-------
|
|
||||||
|
|
||||||
Maintained by Drew DeVault <sir@cmpwn.com>, who is assisted by other open
|
|
||||||
source contributors. For more information about sway development, see
|
|
||||||
<https://github.com/swaywm/sway>.
|
|
@ -0,0 +1,103 @@
|
|||||||
|
swaylock(1)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
swaylock - Screen locker for Wayland
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
|
||||||
|
_swaylock_ [options...]
|
||||||
|
|
||||||
|
Locks your Wayland session.
|
||||||
|
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
*-h, --help*
|
||||||
|
Show help message and quit.
|
||||||
|
|
||||||
|
*-c, --color* <rrggbb[aa]>
|
||||||
|
Turn the screen into the given color. If -i is used, this sets the
|
||||||
|
background of the image to the given color. Defaults to white (FFFFFF), or
|
||||||
|
transparent (00000000) if an image is in use.
|
||||||
|
|
||||||
|
*-f, --daemonize*
|
||||||
|
Fork into the background after spawning. Note: this is the default behavior
|
||||||
|
of i3lock.
|
||||||
|
|
||||||
|
*-i, --image* [<output>:]<path>
|
||||||
|
Display the given image, optionally only on the given output. Use -c to set
|
||||||
|
a background color.
|
||||||
|
|
||||||
|
*--scaling*
|
||||||
|
Scaling mode for images: _stretch_, _fill_, _fit_, _center_, or _tile_.
|
||||||
|
|
||||||
|
*-t, --tiling*
|
||||||
|
Same as --scaling=tile.
|
||||||
|
|
||||||
|
*-u, --no-unlock-indicator*
|
||||||
|
Disable the unlock indicator.
|
||||||
|
|
||||||
|
*-v, --version*
|
||||||
|
Show the version number and quit.
|
||||||
|
|
||||||
|
# APPEARANCE
|
||||||
|
|
||||||
|
*--bshlcolor* <rrggbb[aa]>
|
||||||
|
Sets the color of backspace highlight segments.
|
||||||
|
|
||||||
|
*--font* <font>
|
||||||
|
Sets the font of the text inside the indicator.
|
||||||
|
|
||||||
|
*--insidecolor* <rrggbb[aa]>
|
||||||
|
Sets the color of the inside of the indicator when typing or idle.
|
||||||
|
|
||||||
|
*--insidevercolor* <rrggbb[aa]>
|
||||||
|
Sets the color of the inside of the indicator when verifying.
|
||||||
|
|
||||||
|
*--insidewrongcolor* <rrggbb[aa]>
|
||||||
|
Sets the color of the inside of the indicator when invalid.
|
||||||
|
|
||||||
|
*--keyhlcolor* <rrggbb[aa]>
|
||||||
|
Sets the color of keypress highlight segments.
|
||||||
|
|
||||||
|
*--linecolor* <rrggbb[aa]>
|
||||||
|
Sets the color of the lines that separate the inside and outside of the
|
||||||
|
indicator.
|
||||||
|
|
||||||
|
*-s, --line-uses-inside*
|
||||||
|
Use the color of the inside of the indicator for the line separating the
|
||||||
|
inside and outside of the indicator.
|
||||||
|
|
||||||
|
*-r, --line-uses-ring*
|
||||||
|
Use the outer ring's color for the line separating the inside and outside of
|
||||||
|
the indicator.
|
||||||
|
|
||||||
|
*--ringcolor* <rrggbb[aa]>
|
||||||
|
Sets the color of the outside of the indicator when typing or idle.
|
||||||
|
|
||||||
|
*--ringvercolor* <rrggbb[aa]>
|
||||||
|
Sets the color of the outside of the indicator when verifying.
|
||||||
|
|
||||||
|
*--ringwrongcolor* <rrggbb[aa]>
|
||||||
|
Sets the color of the outside of the indicator when invalid.
|
||||||
|
|
||||||
|
*--separatorcolor* <rrggbb[aa]>
|
||||||
|
Sets the color of the lines that seperate highlight segments.
|
||||||
|
|
||||||
|
*--textcolor* <rrggbb[aa]>
|
||||||
|
Sets the color of the text inside the indicator.
|
||||||
|
|
||||||
|
*--indicator-radius* <radius>
|
||||||
|
Sets the radius of the indicator to _radius_ pixels. The default value is
|
||||||
|
50.
|
||||||
|
|
||||||
|
*--indicator-thickness* <thickness>
|
||||||
|
Sets the thickness of the indicator to _thickness_ pixels. The default value
|
||||||
|
is 10.
|
||||||
|
|
||||||
|
# AUTHORS
|
||||||
|
|
||||||
|
Maintained by Drew DeVault <sir@cmpwn.com>, who is assisted by other open
|
||||||
|
source contributors. For more information about sway development, see
|
||||||
|
https://github.com/swaywm/sway.
|
||||||
|
|
@ -0,0 +1,66 @@
|
|||||||
|
swaymsg(1)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
swaymsg - Send messages to a running instance of sway over the IPC socket.
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
|
||||||
|
_swaymsg_ [options...] [message]
|
||||||
|
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
*-h, --help*
|
||||||
|
Show help message and quit.
|
||||||
|
|
||||||
|
*-q, --quiet*
|
||||||
|
Sends the IPC message but does not print the response from sway.
|
||||||
|
|
||||||
|
*-r, --raw*
|
||||||
|
Use raw output even if using a tty.
|
||||||
|
|
||||||
|
*-s, --socket* <path>
|
||||||
|
Use the specified socket path. Otherwise, swaymsg will ask sway where the
|
||||||
|
socket is (which is the value of $SWAYSOCK, then of $I3SOCK).
|
||||||
|
|
||||||
|
*-t, --type* <type>
|
||||||
|
Specify the type of IPC message. See below.
|
||||||
|
|
||||||
|
*-v, --version*
|
||||||
|
Print the version (of swaymsg) and quit.
|
||||||
|
|
||||||
|
# IPC MESSAGE TYPES
|
||||||
|
|
||||||
|
*<command>*
|
||||||
|
The message is a sway command (the same commands you can bind to keybindings
|
||||||
|
in your sway config file). It will be executed immediately.
|
||||||
|
|
||||||
|
See **sway**(5) for a list of commands.
|
||||||
|
|
||||||
|
*get\_workspaces*
|
||||||
|
Gets a JSON-encoded list of workspaces and their status.
|
||||||
|
|
||||||
|
*get\_inputs*
|
||||||
|
Gets a JSON-encoded list of current inputs.
|
||||||
|
|
||||||
|
*get\_outputs*
|
||||||
|
Gets a JSON-encoded list of current outputs.
|
||||||
|
|
||||||
|
*get\_tree*
|
||||||
|
Gets a JSON-encoded layout tree of all open windows, containers, outputs,
|
||||||
|
workspaces, and so on.
|
||||||
|
|
||||||
|
*get\_marks*
|
||||||
|
Get a JSON-encoded list of marks.
|
||||||
|
|
||||||
|
*get\_bar\_config*
|
||||||
|
Get a JSON-encoded configuration for swaybar.
|
||||||
|
|
||||||
|
*get\_version*
|
||||||
|
Get JSON-encoded version information for the running instance of sway.
|
||||||
|
|
||||||
|
*get\_clipboard*
|
||||||
|
Get JSON-encoded information about the clipboard.
|
||||||
|
Returns the current clipboard mime-types if called without
|
||||||
|
arguments, otherwise returns the clipboard data in the requested
|
||||||
|
formats. Encodes the data using base64 for non-text mime types.
|
Loading…
Reference in new issue