add .prompt and .title file handling - lchat - A line oriented chat front end f… | |
git clone git://git.suckless.org/lchat | |
Log | |
Files | |
Refs | |
README | |
--- | |
commit 3a2446ff8f1e0d30bf3b1ee02617e15020bc829a | |
parent 595d8b5e4d763305139cbd482a8c469f9e926494 | |
Author: Jan Klemkow <[email protected]> | |
Date: Mon, 11 Jan 2016 21:49:31 +0100 | |
add .prompt and .title file handling | |
add the possibility to set prompt and window title by file. | |
Diffstat: | |
M lchat.1 | 6 +++++- | |
M lchat.c | 52 +++++++++++++++++++++++++++--… | |
2 files changed, 51 insertions(+), 7 deletions(-) | |
--- | |
diff --git a/lchat.1 b/lchat.1 | |
@@ -49,7 +49,7 @@ as prompt for the input line. | |
.It Fl t Ar title | |
Use | |
.Ar title | |
-as title terminal window. | |
+as title for the terminal window. | |
In a | |
.Xr tmux 1 | |
or | |
@@ -84,6 +84,10 @@ If this file exists and has executable permissions, it is us… | |
program for the output lines. | |
This program should read raw lines from stdin and outputs filtered or | |
transformed lines to stdout. | |
+.It .prompt | |
+contains the prompt string. | |
+.It .title | |
+contains the terminal window title. | |
.El | |
.Sh SEE ALSO | |
.Xr tail 1 , | |
diff --git a/lchat.c b/lchat.c | |
@@ -51,6 +51,35 @@ exit_handler(void) | |
err(EXIT_FAILURE, "tcsetattr"); | |
} | |
+static char * | |
+read_file_line(const char *file) | |
+{ | |
+ FILE *fh; | |
+ char buf[BUFSIZ]; | |
+ char *line = NULL; | |
+ char *nl = NULL; | |
+ | |
+ if (access(file, R_OK) == -1) | |
+ return NULL; | |
+ | |
+ if ((fh = fopen(file, "r")) == NULL) | |
+ err(EXIT_FAILURE, "fopen"); | |
+ | |
+ if (fgets(buf, sizeof buf, fh) == NULL) | |
+ err(EXIT_FAILURE, "fgets"); | |
+ | |
+ if (fclose(fh) == EOF) | |
+ err(EXIT_FAILURE, "fclose"); | |
+ | |
+ if ((nl = strchr(buf, '\n')) != NULL) /* delete new line */ | |
+ *nl = '\0'; | |
+ | |
+ if ((line = strdup(buf)) == NULL) | |
+ err(EXIT_FAILURE ,"strdup"); | |
+ | |
+ return line; | |
+} | |
+ | |
static bool | |
bell_match(const char *str, const char *regex_file) | |
{ | |
@@ -114,7 +143,12 @@ main(int argc, char *argv[]) | |
bool bell_flag = true; | |
char *bell_file = ".bellmatch"; | |
size_t history_len = 5; | |
- char *prompt = ">"; | |
+ char *prompt = read_file_line(".prompt"); | |
+ char *title = read_file_line(".title"); | |
+ | |
+ if (prompt == NULL) /* set default prompt */ | |
+ prompt = ">"; | |
+ | |
size_t prompt_len = strlen(prompt); | |
size_t loverhang = 0; | |
char *dir = "."; | |
@@ -149,11 +183,9 @@ main(int argc, char *argv[]) | |
err(EXIT_FAILURE, "strdup"); | |
prompt_len = strlen(prompt); | |
break; | |
- case 't': /* set optarg to terminal's window title */ | |
- if (strcmp(getenv("TERM"), "screen") == 0) | |
- printf("\033k%s\033\\", optarg); | |
- else | |
- printf("\033]0;%s\a", optarg); | |
+ case 't': | |
+ if ((title = strdup(optarg)) == NULL) | |
+ err(EXIT_FAILURE, "strdup"); | |
break; | |
case 'h': | |
default: | |
@@ -182,6 +214,14 @@ main(int argc, char *argv[]) | |
if (isatty(fd) == 0) | |
err(EXIT_FAILURE, "isatty"); | |
+ /* set optarg to terminal's window title */ | |
+ if (title != NULL) { | |
+ if (strcmp(getenv("TERM"), "screen") == 0) | |
+ printf("\033k%s\033\\", title); | |
+ else | |
+ printf("\033]0;%s\a", title); | |
+ } | |
+ | |
/* preprate terminal reset on exit */ | |
if (tcgetattr(fd, &origin_term) == -1) | |
err(EXIT_FAILURE, "tcgetattr"); |