aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt26
-rw-r--r--README.md1
-rw-r--r--config11
-rw-r--r--include/stringop.h4
-rw-r--r--sway.1.txt84
-rw-r--r--sway.5.txt90
-rw-r--r--sway/commands.c6
-rw-r--r--sway/config.c9
-rw-r--r--sway/readline.c13
-rw-r--r--sway/stringop.c52
10 files changed, 249 insertions, 47 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 27839b1d..b4bdf756 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -43,3 +43,29 @@ INSTALL(
FILES ${PROJECT_SOURCE_DIR}/config
DESTINATION /etc/sway/
)
+
+ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/sway.1
+ COMMAND a2x --no-xmllint --doctype manpage --format manpage
+ -D ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${CMAKE_CURRENT_SOURCE_DIR}/sway.1.txt
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/sway.1.txt
+)
+
+ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/sway.5
+ COMMAND a2x --no-xmllint --doctype manpage --format manpage
+ -D ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${CMAKE_CURRENT_SOURCE_DIR}/sway.5.txt
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/sway.5.txt
+)
+
+ADD_CUSTOM_TARGET(man ALL
+ DEPENDS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/sway.1
+ DEPENDS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/sway.5)
+
+INSTALL(
+ FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/sway.1
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man/man1
+)
+
+INSTALL(
+ FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/sway.5
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man/man5
+)
diff --git a/README.md b/README.md
index 43a63c25..8c312984 100644
--- a/README.md
+++ b/README.md
@@ -31,6 +31,7 @@ Dependencies:
* cmake
* [wlc](https://github.com/Cloudef/wlc)
* xwayland
+* asciidoc
Compiling:
diff --git a/config b/config
index 154f33ca..1e94973c 100644
--- a/config
+++ b/config
@@ -9,10 +9,13 @@
### Variables
-
-set $mod Mod4 # Logo key. Use Mod1 for Alt.
-set $term urxvt # Your preferred terminal emulator
-set $menu dmenu_run # Your preferred application launcher
+#
+# Logo key. Use Mod1 for Alt.
+set $mod Mod4
+# Your preferred terminal emulator
+set $term urxvt
+# Your preferred application launcher
+set $menu dmenu_run
### Key bindings
#
diff --git a/include/stringop.h b/include/stringop.h
index a5346829..03387345 100644
--- a/include/stringop.h
+++ b/include/stringop.h
@@ -2,8 +2,8 @@
#define _SWAY_STRINGOP_H
#include "list.h"
-char *strip_whitespace(char *str, int *trimmed_start);
-char *strip_comments(char *str);
+void strip_whitespace(char *str);
+void strip_comments(char *str);
list_t *split_string(const char *str, const char *delims);
void free_flat_list(list_t *list);
char *code_strchr(const char *string, char delimiter);
diff --git a/sway.1.txt b/sway.1.txt
new file mode 100644
index 00000000..36586e1d
--- /dev/null
+++ b/sway.1.txt
@@ -0,0 +1,84 @@
+/////
+vim:set ts=4 sw=4 tw=82 noet:
+/////
+:quotes.~:
+
+sway (1)
+========
+
+Name
+----
+sway - SirCmpwn's Wayland window manager
+
+Synopsis
+--------
+'sway' [options] [command]
+
+Options
+-------
+
+*-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 may run sway from an ongoing x11 session to run it within x. Otherwise, you
+can run sway on a tty and it will use your outputs directly.
+
+*Important note for nvidia users*: The proprietary nvidia driver does _not_ have
+support for Wayland as of 2015-08-17. Use nouveau.
+
+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 compatability reasons, you may also issue
+commands with **sway-msg**(1) or **i3-msg**(1) (or even with **i3**(1), probably).
+
+Configuration
+-------------
+
+If _-c_ is not specified, sway will look in several locations for your config
+file. The default one is provided at /etc/sway/config. The suggested location for
+your config file is ~/.config/sway/config. ~/.sway/config will also work, and the
+rest of the usual XDG config locations are supported. If no sway config is found,
+sway will attempt to load an i3 config from all the config locations i3 supports.
+If still nothing is found, you will receive an error.
+
+For information on the config file format, see **sway**(5).
+
+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/SirCmpwn/sway>.
+
+See Also
+--------
+
+**sway**(5)
diff --git a/sway.5.txt b/sway.5.txt
new file mode 100644
index 00000000..9f92dfe8
--- /dev/null
+++ b/sway.5.txt
@@ -0,0 +1,90 @@
+/////
+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 exected 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.
+
+All of these commands may be issued at runtime through **sway-msg**(1).
+
+Commands
+--------
+
+**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.
+
+**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.
+
+**exit**::
+ Exit sway and end your Wayland session.
+
+**floating** toggle::
+ Toggles the "floating" status of the focused view.
+
+**focus** <direction>::
+ Direction may be one of _up_, _down_, _left_, _right_, or _parent_. The
+ directional focus commands will move the focus in that direction. 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_follows_mouse** <yes|no>::
+ If set to _yes_, the currently focused view will change as you move your
+ mouse around the screen to the view that ends up underneath your mouse.
+
+**kill**::
+ Closes the currently focused view.
+
+**layout** <mode>::
+ Sets the layout mode of the focused container. _mode_ can be one of _splith_,
+ _splitv_, or _toggle split_.
+
+**reload**::
+ Reloads the sway config file without restarting sway.
+
+**set** <name> <value>::
+ Creates a substitution for _value_ that can be used with $_name_ in other
+ commands.
+
+**split** <vertical|horizontal>::
+ Splits the current container, vertically or horiziontally. The letters "h" and
+ "v" can be used instead of the full words "vertical" or "horizontal".
+
+**splith**::
+ Equivalent to **split horizontal**.
+
+**splitv**::
+ Equivalent to **split vertical**.
+
+**fullscreen**:
+ Toggles fullscreen status for the focused view.
+
+**workspace** <name>:
+ Switches to the specified 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_.
diff --git a/sway/commands.c b/sway/commands.c
index 548cb8ed..7e9169e8 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -504,7 +504,7 @@ static char **split_directive(char *line, int *argc) {
if (!*line) return parts;
int in_string = 0, in_character = 0;
- int i, j, _;
+ int i, j;
for (i = 0, j = 0; line[i]; ++i) {
if (line[i] == '\\') {
++i;
@@ -517,7 +517,7 @@ static char **split_directive(char *line, int *argc) {
char *item = malloc(i - j + 1);
strncpy(item, line + j, i - j);
item[i - j] = '\0';
- item = strip_whitespace(item, &_);
+ strip_whitespace(item);
if (item[0] == '\0') {
free(item);
} else {
@@ -535,7 +535,7 @@ static char **split_directive(char *line, int *argc) {
char *item = malloc(i - j + 1);
strncpy(item, line + j, i - j);
item[i - j] = '\0';
- item = strip_whitespace(item, &_);
+ strip_whitespace(item);
if (*argc == capacity) {
capacity++;
parts = realloc(parts, sizeof(char *) * capacity);
diff --git a/sway/config.c b/sway/config.c
index 4125f4cd..95d605a3 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -40,7 +40,7 @@ static char* get_config_path() {
} else {
name = "/sway/config";
temp = malloc(strlen(xdg_config_home) + strlen(name) + 1);
- strcpy(temp, home);
+ strcpy(xdg_config_home, home);
strcat(temp, name);
}
if (exists(temp)) {
@@ -93,7 +93,7 @@ static char* get_config_path() {
} else {
name = "/i3/config";
temp = malloc(strlen(xdg_config_home) + strlen(name) + 1);
- strcpy(temp, home);
+ strcpy(xdg_config_home, home);
strcat(temp, name);
}
if (exists(temp)) {
@@ -186,10 +186,9 @@ bool read_config(FILE *file, bool is_active) {
int temp_depth = 0; // Temporary: skip all config sections with depth
while (!feof(file)) {
- int _;
char *line = read_line(file);
- line = strip_whitespace(line, &_);
- line = strip_comments(line);
+ strip_comments(line);
+ strip_whitespace(line);
if (!line[0]) {
goto _continue;
}
diff --git a/sway/readline.c b/sway/readline.c
index be8c35cc..dfdc3fe8 100644
--- a/sway/readline.c
+++ b/sway/readline.c
@@ -3,7 +3,7 @@
#include <stdio.h>
char *read_line(FILE *file) {
- int i = 0, length = 0, size = 128;
+ int length = 0, size = 128;
char *string = malloc(size);
if (!string) {
return NULL;
@@ -16,21 +16,20 @@ char *read_line(FILE *file) {
if (c == '\r') {
continue;
}
- if (i == size) {
- string = realloc(string, length *= 2);
+ if (length == size) {
+ string = realloc(string, size *= 2);
if (!string) {
return NULL;
}
}
- string[i++] = (char)c;
- length++;
+ string[length++] = c;
}
- if (i + 1 != size) {
+ if (length + 1 == size) {
string = realloc(string, length + 1);
if (!string) {
return NULL;
}
}
- string[i] = '\0';
+ string[length] = '\0';
return string;
}
diff --git a/sway/stringop.c b/sway/stringop.c
index 1dff97bf..00cc32b8 100644
--- a/sway/stringop.c
+++ b/sway/stringop.c
@@ -1,37 +1,38 @@
-#include "stringop.h"
#include <stdlib.h>
#include <stdio.h>
+#include <strings.h>
+#include <ctype.h>
+#include "stringop.h"
#include "string.h"
#include "list.h"
-#include <strings.h>
/* Note: This returns 8 characters for trimmed_start per tab character. */
-char *strip_whitespace(char *_str, int *trimmed_start) {
- *trimmed_start = 0;
- if (*_str == '\0')
- return _str;
- char *strold = _str;
- while (*_str == ' ' || *_str == '\t') {
- if (*_str == '\t') {
- *trimmed_start += 8;
- } else {
- *trimmed_start += 1;
+void strip_whitespace(char *str) {
+ int shift = 0;
+ int bpair = 1;
+ int in_str = 0, in_ch = 0;
+ while (*str) {
+ str[-shift] = str[0];
+ if (*str == '"' && !in_ch) {
+ in_str = !in_str;
+ } else if (*str == '\'' && !in_str) {
+ in_ch = !in_ch;
+ } else if (!in_ch && !in_str) {
+ if (isblank(*str)) {
+ if (bpair) {
+ ++shift;
+ }
+ bpair=1;
+ } else {
+ bpair = 0;
+ }
}
- _str++;
+ ++str;
}
- char *str = malloc(strlen(_str) + 1);
- strcpy(str, _str);
- free(strold);
- int i;
- for (i = 0; str[i] != '\0'; ++i);
- do {
- i--;
- } while (i >= 0 && (str[i] == ' ' || str[i] == '\t'));
- str[i + 1] = '\0';
- return str;
+ str[-shift-bpair] = 0;
}
-char *strip_comments(char *str) {
+void strip_comments(char *str) {
int in_string = 0, in_character = 0;
int i = 0;
while (str[i] != '\0') {
@@ -40,14 +41,13 @@ char *strip_comments(char *str) {
} else if (str[i] == '\'' && !in_string) {
in_character = !in_character;
} else if (!in_character && !in_string) {
- if (str[i] == '#' && i == 0) {
+ if (str[i] == '#') {
str[i] = '\0';
break;
}
}
++i;
}
- return str;
}
list_t *split_string(const char *str, const char *delims) {