summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorP.P.A <adolphs@moselle.moe>2023-07-08 12:57:04 +0200
committerP.P.A <adolphs@moselle.moe>2023-07-08 12:57:04 +0200
commit6f0517618f413be22695ef2466995dc09c22391b (patch)
treedd3b887a91d6b83bdb7c16f5336a9f8684ac6282
parentac5a5e7a1cc72b0bdfe2e3373be3893d7fafc608 (diff)
workingdir
-rw-r--r--st.18
-rw-r--r--x.c13
-rw-r--r--x.c.orig78
3 files changed, 91 insertions, 8 deletions
diff --git a/st.1 b/st.1
index 39120b4..b82beb3 100644
--- a/st.1
+++ b/st.1
@@ -6,6 +6,8 @@ st \- simple terminal
.RB [ \-aiv ]
.RB [ \-c
.IR class ]
+.RB [ \-d
+.IR path ]
.RB [ \-f
.IR font ]
.RB [ \-g
@@ -30,6 +32,8 @@ st \- simple terminal
.RB [ \-aiv ]
.RB [ \-c
.IR class ]
+.RB [ \-d
+.IR path ]
.RB [ \-f
.IR font ]
.RB [ \-g
@@ -58,6 +62,10 @@ disable alternate screens in terminal
.BI \-c " class"
defines the window class (default $TERM).
.TP
+.BI \-d " path"
+changes the working directory to
+.IR path .
+.TP
.BI \-f " font"
defines the
.I font
diff --git a/x.c b/x.c
index b78c6bf..377f1df 100644
--- a/x.c
+++ b/x.c
@@ -268,6 +268,7 @@ static char *opt_io = NULL;
static char *opt_line = NULL;
static char *opt_name = NULL;
static char *opt_title = NULL;
+static char *opt_dir = NULL;
static uint buttons; /* bit field of pressed buttons */
static int cursorblinks = 0;
@@ -2124,12 +2125,12 @@ config_init(void)
void
usage(void)
{
- die("usage: %s [-aiv] [-c class] [-f font] [-g geometry]"
- " [-n name] [-o file]\n"
+ die("usage: %s [-aiv] [-c class] [-d path] [-f font]"
+ " [-g geometry] [-n name] [-o file]\n"
" [-T title] [-t title] [-w windowid]"
" [[-e] command [args ...]]\n"
- " %s [-aiv] [-c class] [-f font] [-g geometry]"
- " [-n name] [-o file]\n"
+ " %s [-aiv] [-c class] [-d path] [-f font]"
+ " [-g geometry] [-n name] [-o file]\n"
" [-T title] [-t title] [-w windowid] -l line"
" [stty_args ...]\n", argv0, argv0);
}
@@ -2184,6 +2185,9 @@ main(int argc, char *argv[])
case 'v':
die("%s " VERSION "\n", argv0);
break;
+ case 'd':
+ opt_dir = EARGF(usage());
+ break;
default:
usage();
} ARGEND;
@@ -2208,6 +2212,7 @@ run:
xinit(cols, rows);
xsetenv();
selinit();
+ chdir(opt_dir);
run();
return 0;
diff --git a/x.c.orig b/x.c.orig
index f909106..b78c6bf 100644
--- a/x.c.orig
+++ b/x.c.orig
@@ -14,6 +14,7 @@
#include <X11/keysym.h>
#include <X11/Xft/Xft.h>
#include <X11/XKBlib.h>
+#include <X11/Xresource.h>
char *argv0;
#include "arg.h"
@@ -46,6 +47,19 @@ typedef struct {
signed char appcursor; /* application cursor */
} Key;
+/* Xresources preferences */
+enum resource_type {
+ STRING = 0,
+ INTEGER = 1,
+ FLOAT = 2
+};
+
+typedef struct {
+ char *name;
+ enum resource_type type;
+ void *dst;
+} ResourcePref;
+
/* X modifiers */
#define XK_ANY_MOD UINT_MAX
#define XK_NO_MOD 0
@@ -871,8 +885,8 @@ xclear(int x1, int y1, int x2, int y2)
void
xhints(void)
{
- XClassHint class = {opt_name ? opt_name : termname,
- opt_class ? opt_class : termname};
+ XClassHint class = {opt_name ? opt_name : "st",
+ opt_class ? opt_class : "St"};
XWMHints wm = {.flags = InputHint, .input = 1};
XSizeHints *sizeh;
@@ -1149,8 +1163,6 @@ xinit(int cols, int rows)
XWindowAttributes attr;
XVisualInfo vis;
- if (!(xw.dpy = XOpenDisplay(NULL)))
- die("can't open display\n");
xw.scr = XDefaultScreen(xw.dpy);
if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) {
@@ -2056,6 +2068,59 @@ run(void)
}
}
+int
+resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst)
+{
+ char **sdst = dst;
+ int *idst = dst;
+ float *fdst = dst;
+
+ char fullname[256];
+ char fullclass[256];
+ char *type;
+ XrmValue ret;
+
+ snprintf(fullname, sizeof(fullname), "%s.%s",
+ opt_name ? opt_name : "st", name);
+ snprintf(fullclass, sizeof(fullclass), "%s.%s",
+ opt_class ? opt_class : "St", name);
+ fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0';
+
+ XrmGetResource(db, fullname, fullclass, &type, &ret);
+ if (ret.addr == NULL || strncmp("String", type, 64))
+ return 1;
+
+ switch (rtype) {
+ case STRING:
+ *sdst = ret.addr;
+ break;
+ case INTEGER:
+ *idst = strtoul(ret.addr, NULL, 10);
+ break;
+ case FLOAT:
+ *fdst = strtof(ret.addr, NULL);
+ break;
+ }
+ return 0;
+}
+
+void
+config_init(void)
+{
+ char *resm;
+ XrmDatabase db;
+ ResourcePref *p;
+
+ XrmInitialize();
+ resm = XResourceManagerString(xw.dpy);
+ if (!resm)
+ return;
+
+ db = XrmGetStringDatabase(resm);
+ for (p = resources; p < resources + LEN(resources); p++)
+ resource_load(db, p->name, p->type, p->dst);
+}
+
void
usage(void)
{
@@ -2132,6 +2197,11 @@ run:
setlocale(LC_CTYPE, "");
XSetLocaleModifiers("");
+
+ if(!(xw.dpy = XOpenDisplay(NULL)))
+ die("Can't open display\n");
+
+ config_init();
cols = MAX(cols, 1);
rows = MAX(rows, 1);
tnew(cols, rows);