diff options
-rw-r--r-- | CMakeLists.txt | 26 | ||||
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | config | 11 | ||||
-rw-r--r-- | include/stringop.h | 4 | ||||
-rw-r--r-- | sway.1.txt | 84 | ||||
-rw-r--r-- | sway.5.txt | 90 | ||||
-rw-r--r-- | sway/commands.c | 6 | ||||
-rw-r--r-- | sway/config.c | 9 | ||||
-rw-r--r-- | sway/readline.c | 13 | ||||
-rw-r--r-- | sway/stringop.c | 52 |
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 +) @@ -31,6 +31,7 @@ Dependencies: * cmake * [wlc](https://github.com/Cloudef/wlc) * xwayland +* asciidoc Compiling: @@ -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) { |