aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Zandr Martin <zandrmartin@users.noreply.github.com>2016-06-11 09:33:24 -0500
committerLibravatar GitHub <noreply@github.com>2016-06-11 09:33:24 -0500
commit66caee645cc276bf747ae492df02c08d978ee90d (patch)
tree034b3d95fd283d934462df8740430cc53786f105
parentclean up pid/workspace stuff (diff)
parentMany improvements to man pages (diff)
downloadsway-66caee645cc276bf747ae492df02c08d978ee90d.tar.gz
sway-66caee645cc276bf747ae492df02c08d978ee90d.tar.zst
sway-66caee645cc276bf747ae492df02c08d978ee90d.zip
Merge branch 'master' into assign-command
-rw-r--r--common/readline.c7
-rw-r--r--sway/commands.c26
-rw-r--r--sway/config.c5
-rw-r--r--sway/sway-bar.5.txt11
-rw-r--r--sway/sway-input.5.txt5
-rw-r--r--sway/sway.1.txt13
-rw-r--r--sway/sway.5.txt110
7 files changed, 113 insertions, 64 deletions
diff --git a/common/readline.c b/common/readline.c
index 76ed6926..5106172c 100644
--- a/common/readline.c
+++ b/common/readline.c
@@ -5,17 +5,24 @@
5char *read_line(FILE *file) { 5char *read_line(FILE *file) {
6 size_t length = 0, size = 128; 6 size_t length = 0, size = 128;
7 char *string = malloc(size); 7 char *string = malloc(size);
8 char lastChar = '\0';
8 if (!string) { 9 if (!string) {
9 return NULL; 10 return NULL;
10 } 11 }
11 while (1) { 12 while (1) {
12 int c = getc(file); 13 int c = getc(file);
14 if (c == '\n' && lastChar == '\\'){
15 --length; // Ignore last character.
16 lastChar = '\0';
17 continue;
18 }
13 if (c == EOF || c == '\n' || c == '\0') { 19 if (c == EOF || c == '\n' || c == '\0') {
14 break; 20 break;
15 } 21 }
16 if (c == '\r') { 22 if (c == '\r') {
17 continue; 23 continue;
18 } 24 }
25 lastChar = c;
19 if (length == size) { 26 if (length == size) {
20 char *new_string = realloc(string, size *= 2); 27 char *new_string = realloc(string, size *= 2);
21 if (!new_string) { 28 if (!new_string) {
diff --git a/sway/commands.c b/sway/commands.c
index 08920c1c..3a6b2af5 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -1639,7 +1639,7 @@ static struct cmd_results *cmd_output(int argc, char **argv) {
1639 } 1639 }
1640 char *src = join_args(argv + i, argc - i - 1); 1640 char *src = join_args(argv + i, argc - i - 1);
1641 char *mode = argv[argc - 1]; 1641 char *mode = argv[argc - 1];
1642 if (wordexp(src, &p, 0) != 0) { 1642 if (wordexp(src, &p, 0) != 0 || p.we_wordv[0] == NULL) {
1643 return cmd_results_new(CMD_INVALID, "output", "Invalid syntax (%s)", src); 1643 return cmd_results_new(CMD_INVALID, "output", "Invalid syntax (%s)", src);
1644 } 1644 }
1645 free(src); 1645 free(src);
@@ -1699,9 +1699,13 @@ static struct cmd_results *cmd_output(int argc, char **argv) {
1699 swayc_t *cont = NULL; 1699 swayc_t *cont = NULL;
1700 for (int i = 0; i < root_container.children->length; ++i) { 1700 for (int i = 0; i < root_container.children->length; ++i) {
1701 cont = root_container.children->items[i]; 1701 cont = root_container.children->items[i];
1702 if (cont->name && strcmp(cont->name, output->name) == 0) { 1702 if (cont->name && ((strcmp(cont->name, output->name) == 0) || (strcmp(output->name, "*") == 0))) {
1703 apply_output_config(output, cont); 1703 apply_output_config(output, cont);
1704 break; 1704
1705 if (strcmp(output->name, "*") != 0) {
1706 // stop looking if the output config isn't applicable to all outputs
1707 break;
1708 }
1705 } 1709 }
1706 } 1710 }
1707 } 1711 }
@@ -2153,12 +2157,26 @@ static int compare_set_qsort(const void *_l, const void *_r) {
2153} 2157}
2154 2158
2155static struct cmd_results *cmd_set(int argc, char **argv) { 2159static struct cmd_results *cmd_set(int argc, char **argv) {
2160 char *tmp;
2161 int size;
2156 struct cmd_results *error = NULL; 2162 struct cmd_results *error = NULL;
2157 if (!config->reading) return cmd_results_new(CMD_FAILURE, "set", "Can only be used in config file."); 2163 if (!config->reading) return cmd_results_new(CMD_FAILURE, "set", "Can only be used in config file.");
2158 if ((error = checkarg(argc, "set", EXPECTED_AT_LEAST, 2))) { 2164 if ((error = checkarg(argc, "set", EXPECTED_AT_LEAST, 2))) {
2159 return error; 2165 return error;
2160 } 2166 }
2161 2167
2168 if (argv[0][0] != '$') {
2169 sway_log(L_INFO, "Warning: variable '%s' doesn't start with $", argv[0]);
2170
2171 size = asprintf(&tmp, "%s%s", "$", argv[0]);
2172 if (size == -1) {
2173 return cmd_results_new(CMD_FAILURE, "set", "Not possible to create variable $'%s'", argv[0]);
2174 }
2175
2176 argv[0] = strdup(tmp);
2177 free(tmp);
2178 }
2179
2162 struct sway_variable *var = NULL; 2180 struct sway_variable *var = NULL;
2163 // Find old variable if it exists 2181 // Find old variable if it exists
2164 int i; 2182 int i;
@@ -3040,7 +3058,7 @@ static struct cmd_results *bar_cmd_swaybar_command(int argc, char **argv) {
3040} 3058}
3041 3059
3042static struct cmd_results *bar_cmd_tray_output(int argc, char **argv) { 3060static struct cmd_results *bar_cmd_tray_output(int argc, char **argv) {
3043 sway_log(L_ERROR, "warning: tray_output is not supported on wayland"); 3061 sway_log(L_ERROR, "Warning: tray_output is not supported on wayland");
3044 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 3062 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
3045} 3063}
3046 3064
diff --git a/sway/config.c b/sway/config.c
index 321534ed..07b1f2f7 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -403,6 +403,11 @@ static bool load_include_config(const char *path, const char *parent_dir, struct
403 char *real_path = realpath(full_path, NULL); 403 char *real_path = realpath(full_path, NULL);
404 free(full_path); 404 free(full_path);
405 405
406 if (real_path == NULL) {
407 sway_log(L_DEBUG, "%s not found.", path);
408 return false;
409 }
410
406 // check if config has already been included 411 // check if config has already been included
407 int j; 412 int j;
408 for (j = 0; j < config->config_chain->length; ++j) { 413 for (j = 0; j < config->config_chain->length; ++j) {
diff --git a/sway/sway-bar.5.txt b/sway/sway-bar.5.txt
index d0727440..dc4a673c 100644
--- a/sway/sway-bar.5.txt
+++ b/sway/sway-bar.5.txt
@@ -19,10 +19,15 @@ Commands
19-------- 19--------
20 20
21**status_command** <status command>:: 21**status_command** <status command>::
22 Executes the bar _status command_ with _sh -c_. 22 Executes the bar _status command_ with _sh -c_. Each line of text printed to
23 stdout from this command will be displayed in the status area of the bar. You
24 can also use the i3bar JSON protocol:
25 +
26 https://i3wm.org/docs/i3bar-protocol.html
23 27
24**pango_markup** <enabled|disabled>:: 28**pango_markup** <enabled|disabled>::
25 Enables or disables pango markup for plaintext statuslines. 29 Enables or disables pango markup for status lines. This has no effect on
30 status lines using the i3bar JSON protocol.
26 31
27**id** <bar_id>:: 32**id** <bar_id>::
28 Sets the ID of the bar. 33 Sets the ID of the bar.
@@ -112,4 +117,4 @@ channel.
112See Also 117See Also
113-------- 118--------
114 119
115**sway**(5) **sway-input**(5) 120**sway**(5)
diff --git a/sway/sway-input.5.txt b/sway/sway-input.5.txt
index c2637830..2ac878cd 100644
--- a/sway/sway-input.5.txt
+++ b/sway/sway-input.5.txt
@@ -37,7 +37,8 @@ Commands
37 Enables or disables middle click emulation. 37 Enables or disables middle click emulation.
38 38
39**input** <identifier> natural_scroll <enabled|disabled>:: 39**input** <identifier> natural_scroll <enabled|disabled>::
40 Enables or disables natural scrolling for the specified input device. 40 Enables or disables natural (inverted) scrolling for the specified input
41 device.
41 42
42**input** <identifier> pointer_accel <[-1,1]>:: 43**input** <identifier> pointer_accel <[-1,1]>::
43 Changes the pointer acceleration for the specified input device. 44 Changes the pointer acceleration for the specified input device.
@@ -51,4 +52,4 @@ Commands
51See Also 52See Also
52-------- 53--------
53 54
54**sway**(5) **sway-bar**(5) 55**sway**(5)
diff --git a/sway/sway.1.txt b/sway/sway.1.txt
index 1243c354..f62e27f4 100644
--- a/sway/sway.1.txt
+++ b/sway/sway.1.txt
@@ -52,7 +52,7 @@ You may run sway from an ongoing x11 session to run it within x. Otherwise, you
52can run sway on a tty and it will use your outputs directly. 52can run sway on a tty and it will use your outputs directly.
53 53
54*Important note for nvidia users*: The proprietary nvidia driver does _not_ have 54*Important note for nvidia users*: The proprietary nvidia driver does _not_ have
55support for Wayland as of 2016-03-27. Use nouveau. 55support for Wayland as of 2016-06-10. Use nouveau.
56 56
57Commands 57Commands
58-------- 58--------
@@ -60,7 +60,7 @@ Commands
60If sway is currently running, you may run _sway [command]_ to send _command_ to 60If sway is currently running, you may run _sway [command]_ to send _command_ to
61the running instance of sway. The same commands you would use in the config file 61the running instance of sway. The same commands you would use in the config file
62are valid here (see **sway**(5)). For compatibility reasons, you may also issue 62are valid here (see **sway**(5)). For compatibility reasons, you may also issue
63commands with **sway-msg**(1) or **i3-msg**(1) (or even with **i3**(1), probably). 63commands with **swaymsg**(1) or **i3-msg**(1) (or even with **i3**(1), probably).
64 64
65Configuration 65Configuration
66------------- 66-------------
@@ -69,11 +69,14 @@ If _-c_ is not specified, sway will look in several locations for your config
69file. The suggested location for your config file is ~/.config/sway/config. 69file. The suggested location for your config file is ~/.config/sway/config.
70~/.sway/config will also work, and the rest of the usual XDG config locations 70~/.sway/config will also work, and the rest of the usual XDG config locations
71are supported. If no sway config is found, sway will attempt to load an i3 71are supported. If no sway config is found, sway will attempt to load an i3
72config from all the config locations i3 supports. At last, sway looks for a 72config from all the config locations i3 supports. Sway looks for a config file in
73config file in a fallback directory, which is /etc/sway/ by default. A standard 73a fallback directory as a last resort, which is /etc/sway/ by default. A standard
74configuration file is installed at this location. If still nothing is found, 74configuration file is installed at this location. If still nothing is found,
75you will receive an error. 75you will receive an error.
76 76
77To write your own config, it's suggested that you copy the default config file to
78the location of your choosing and start there.
79
77For information on the config file format, see **sway**(5). 80For information on the config file format, see **sway**(5).
78 81
79Authors 82Authors
@@ -86,4 +89,4 @@ source contributors. For more information about sway development, see
86See Also 89See Also
87-------- 90--------
88 91
89**sway**(5) **swaymsg**(1) **swaygrab**(1) **sway-input** (5) **sway-bar** (5) 92**sway**(5) **swaymsg**(1) **swaygrab**(1) **sway-input**(5) **sway-bar**(5)
diff --git a/sway/sway.5.txt b/sway/sway.5.txt
index bd2de12d..00806112 100644
--- a/sway/sway.5.txt
+++ b/sway/sway.5.txt
@@ -16,7 +16,13 @@ on startup. These commands usually consist of setting your preferences and
16setting key bindings. An example config is likely present in /etc/sway/config 16setting key bindings. An example config is likely present in /etc/sway/config
17for you to check out. 17for you to check out.
18 18
19These commands can be executed in your config file, via **sway-msg**(1), or via 19Lines in the configuration file might be extended through multiple lines by
20adding a '\' character at the end of line. e.g.:
21
22 bindsym Shift+XF86AudioRaiseVolume exec pactl set-sink-volume \
23 $(pactl list sinks | grep -B 1 RUNNING | sed '1q;d' | sed 's/[^0-9]\+//g') +5%
24
25These commands can be executed in your config file, via **swaymsg**(1), or via
20the bindsym command. 26the bindsym command.
21 27
22Commands 28Commands
@@ -30,53 +36,28 @@ The following commands may only be used in the configuration file.
30 + 36 +
31 See **sway-bar**(5) for details. 37 See **sway-bar**(5) for details.
32 38
33**input** <input device> <block of commands>::
34 Append _{_ to this command, the following lines will be commands to configure
35 the named input device, and _}_ on its own line will close the block.
36 +
37 See **sway-input**(5) for details.
38
39**set** <name> <value>:: 39**set** <name> <value>::
40 Creates a substitution for _value_ that can be used with $_name_ in other 40 Sets variable $name to _value_. You can use the new variable in the arguments
41 commands. 41 of future commands.
42 42
43The following commands cannot be used directly in the configuration file. 43The following commands cannot be used directly in the configuration file.
44They are expected to be used with **bindsym** or at runtime through **swaymsg**(1). 44They are expected to be used with **bindsym** or at runtime through **swaymsg**(1).
45 45
46**border** <normal|pixel> [<n>]:: 46**border** <normal|pixel> [<n>]::
47 Set border style for focused window. _normal_ includes a border of thickness 47 Set border style for focused window. _normal_ includes a border of thickness
48 _n_ and a title bar. _pixel_ is just the border without title bar. Default is 48 _n_ and a title bar. _pixel_ is a border without title bar _n_ pixels thick.
49 _normal_ with border thickness 2. 49 Default is _normal_ with border thickness 2.
50 50
51**border** <none|toggle>:: 51**border** <none|toggle>::
52 Set border style for focused window to _none_ or _toggle_ between the 52 Set border style for focused window to _none_ or _toggle_ between the
53 available border styles: _normal_, _pixel_, _none_. 53 available border styles: _normal_, _pixel_, _none_.
54 54
55**new_window** <normal|none|pixel> [<n>]::
56 Set default border style for new windows.
57
58**new_float** <normal|none|pixel> [<n>]::
59 Set default border style for new floating windows. This does only apply to
60 windows that are spawned in floating mode.
61
62**exit**:: 55**exit**::
63 Exit sway and end your Wayland session. 56 Exit sway and end your Wayland session.
64 57
65**floating** <enable|disable|toggle>:: 58**floating** <enable|disable|toggle>::
66 Make focused view floating, non-floating, or the opposite of what it is now. 59 Make focused view floating, non-floating, or the opposite of what it is now.
67 60
68**floating_maximum_size** <width> x <height>::
69 Specifies the maximum dimensions of floating windows.
70 Uses the container dimensions as default.
71 -1 x -1 will remove any restriction on dimentions.
72 0 x 0 has the same behavior as not setting any value.
73 If in conflict this option has precedence over floating_minimum_size.
74
75**floating_minimum_size** <width> x <height>::
76 Specifies the minimum dimensions of floating windows.
77 Default parameters are 75 x 50.
78 -1 and 0 are invalid parameters, default will be used instead.
79
80**focus** <direction>:: 61**focus** <direction>::
81 Direction may be one of _up_, _down_, _left_, _right_, or _parent_. The 62 Direction may be one of _up_, _down_, _left_, _right_, or _parent_. The
82 directional focus commands will move the focus in that direction. The parent 63 directional focus commands will move the focus in that direction. The parent
@@ -95,9 +76,6 @@ They are expected to be used with **bindsym** or at runtime through **swaymsg**(
95**fullscreen**:: 76**fullscreen**::
96 Toggles fullscreen status for the focused view. 77 Toggles fullscreen status for the focused view.
97 78
98**hide_edge_borders** <none|vertical|horizontal|both>::
99 Hide window borders adjacent to the screen edges. Default is _none_.
100
101**layout** <mode>:: 79**layout** <mode>::
102 Sets the layout mode of the focused container. _mode_ can be one of _splith_, 80 Sets the layout mode of the focused container. _mode_ can be one of _splith_,
103 _splitv_, _toggle split_, _stacking_ or _tabbed_. 81 _splitv_, _toggle split_, _stacking_ or _tabbed_.
@@ -134,8 +112,8 @@ They are expected to be used with **bindsym** or at runtime through **swaymsg**(
134 Equivalent to **split toggle**. 112 Equivalent to **split toggle**.
135 113
136**sticky** <enable|disable|toggle>:: 114**sticky** <enable|disable|toggle>::
137 If enabled and the windows is floating it will always be present on the active 115 "Sticks" a floating window to the current output so that it shows up on all
138 workspace on that output. 116 workspaces.
139 117
140The following commands may be used either in the configuration file 118The following commands may be used either in the configuration file
141or triggered at runtime. 119or triggered at runtime.
@@ -149,7 +127,7 @@ or triggered at runtime.
149**bindsym** <key combo> <command>:: 127**bindsym** <key combo> <command>::
150 Binds _key combo_ to execute _command_ when pressed. You may use XKB key 128 Binds _key combo_ to execute _command_ when pressed. You may use XKB key
151 names here (**xev**(1) is a good tool for discovering them). An example 129 names here (**xev**(1) is a good tool for discovering them). An example
152 bindsym command would be _bindsym Mod1+Shift+f exec firefox_, which would 130 bindsym command would be **bindsym Mod1+Shift+f exec firefox**, which would
153 execute Firefox if the alt, shift, and F keys are pressed together. Any 131 execute Firefox if the alt, shift, and F keys are pressed together. Any
154 valid sway command is eligible to be bound to a key combo. 132 valid sway command is eligible to be bound to a key combo.
155 + 133 +
@@ -195,18 +173,18 @@ The default colors are:
195[options="header"] 173[options="header"]
196|=========================================================================== 174|===========================================================================
197|color_class |border |background |text |indicator |child_border 175|color_class |border |background |text |indicator |child_border
198|background |n/a |#ffffffff |n/a |n/a |n/a 176|background |n/a |#ffffff |n/a |n/a |n/a
199|focused |#4c7899ff |#285577ff |#ffffffff |#2e9ef4ff |#285577ff 177|focused |#4c7899 |#285577 |#ffffff |#2e9ef4 |#285577
200|focused_inactive |#333333ff |#5f676aff |#ffffffff |#484e50ff |#5f676aff 178|focused_inactive |#333333 |#5f676a |#ffffff |#484e50 |#5f676a
201|unfocused |#333333ff |#222222ff |#888888ff |#292d2eff |#222222ff 179|unfocused |#333333 |#222222 |#888888 |#292d2e |#222222
202|urgent |#2f343aff |#900000ff |#ffffffff |#900000ff |#900000ff 180|urgent |#2f343a |#900000 |#ffffff |#900000 |#900000
203|placeholder |#000000ff |#0c0c0cff |#ffffffff |#000000ff |#0c0c0cff 181|placeholder |#000000 |#0c0c0c |#ffffff |#000000 |#0c0c0c
204|=========================================================================== 182|===========================================================================
205-- 183--
206 184
207**debuglog** <on|off|toggle>:: 185**debuglog** <on|off|toggle>::
208 Enables, disables or toggles logging for debug. The toggle argument cannot 186 Enables, disables or toggles debug logging. The toggle argument cannot be used
209 be used in the configuration file. 187 in the configuration file.
210 188
211**exec** <shell command>:: 189**exec** <shell command>::
212 Executes _shell command_ with sh. 190 Executes _shell command_ with sh.
@@ -215,21 +193,32 @@ The default colors are:
215 Like exec, but the shell command will be executed _again_ after *reload* or 193 Like exec, but the shell command will be executed _again_ after *reload* or
216 *restart* is executed. 194 *restart* is executed.
217 195
196**floating_maximum_size** <width> x <height>::
197 Specifies the maximum dimensions of floating windows.
198 Uses the container dimensions as default.
199 -1 x -1 will remove any restriction on dimentions.
200 0 x 0 has the same behavior as not setting any value.
201 If in conflict this option has precedence over floating_minimum_size.
202
203**floating_minimum_size** <width> x <height>::
204 Specifies the minimum dimensions of floating windows.
205 Default parameters are 75 x 50.
206 -1 and 0 are invalid parameters, default will be used instead.
207
218**floating_modifier** <modifier> [normal|inverse]:: 208**floating_modifier** <modifier> [normal|inverse]::
219 When the _modifier_ key is held down, you may use left click to drag floating 209 When the _modifier_ key is held down, you may hold left click to move floating
220 windows, and right click to resize them. Unlike i3, this modifier may also be 210 windows, and right click to resize them. Unlike i3, this modifier may also be
221 used to resize and move windows that are tiled. With the _inverse_ mode 211 used to resize and move windows that are tiled. With the _inverse_ mode
222 enabled, left click is used for resizing and right click for dragging. The 212 enabled, left click is used for resizing and right click for dragging. The
223 mode paramenter is optional and defaults to _normal_ if it isn't defined. 213 mode paramenter is optional and defaults to _normal_ if it isn't defined.
224 214
225**floating_scroll** <up|down|left|right> [command]:: 215**floating_scroll** <up|down|left|right> [command]::
226 Sets the command to be executed on scrolling in the specified 216 Sets a command to be executed when the mouse wheel is scrolled in the
227 direction while holding the floating modifier. Resets the 217 specified direction while holding the floating modifier. Resets the command,
228 command, when given no arguments. 218 when given no arguments.
229 219
230**focus_follows_mouse** <yes|no>:: 220**focus_follows_mouse** <yes|no>::
231 If set to _yes_, the currently focused view will change as you move your 221 If set to _yes_, moving your mouse over a window will focus that window.
232 mouse around the screen to the view that ends up underneath your mouse.
233 222
234**for_window** <criteria> <command>:: 223**for_window** <criteria> <command>::
235 Whenever a window that matches _criteria_ appears, run list of commands. See 224 Whenever a window that matches _criteria_ appears, run list of commands. See
@@ -256,6 +245,15 @@ The default colors are:
256 workspace (or current workspace), and _current_ changes gaps for the current 245 workspace (or current workspace), and _current_ changes gaps for the current
257 view or workspace. 246 view or workspace.
258 247
248**hide_edge_borders** <none|vertical|horizontal|both>::
249 Hide window borders adjacent to the screen edges. Default is _none_.
250
251**input** <input device> <block of commands>::
252 Append _{_ to this command, the following lines will be commands to configure
253 the named input device, and _}_ on its own line will close the block.
254 +
255 See **sway-input**(5) for details.
256
259**smart_gaps** <on|off>:: 257**smart_gaps** <on|off>::
260 If smart_gaps are _on_ then gaps will only be enabled if a workspace has more 258 If smart_gaps are _on_ then gaps will only be enabled if a workspace has more
261 than one child container. 259 than one child container.
@@ -269,8 +267,20 @@ The default colors are:
269 When _output_: place mouse at center of newly focused window when changing 267 When _output_: place mouse at center of newly focused window when changing
270 output. When _none_: don't move mouse. 268 output. When _none_: don't move mouse.
271 269
270**new_window** <normal|none|pixel> [<n>]::
271 Set default border style for new windows.
272
273**new_float** <normal|none|pixel> [<n>]::
274 Set default border style for new floating windows. This only applies to
275 windows that are spawned in floating mode, not windows that become floating
276 after the fact.
277
272**output** <name> <resolution|res> <WIDTHxHEIGHT>:: 278**output** <name> <resolution|res> <WIDTHxHEIGHT>::
273 Configures the specified output to use the given resolution. 279 Configures the specified output to use the given resolution.
280 +
281 _Note_: sway does not currently support modesetting. Your output's native
282 resolution will be used and the screen will be scaled from the resolution
283 specified to your native resolution.
274 284
275**output** <name> <position|pos> <X,Y>:: 285**output** <name> <position|pos> <X,Y>::
276 Configures the specified output to be arranged at the given position. 286 Configures the specified output to be arranged at the given position.