-#ifndef __LABWC_THEME_DIR_H
-#define __LABWC_THEME_DIR_H
+#ifndef __LABWC_DIR_H
+#define __LABWC_DIR_H
+
+char *config_dir(void);
/**
* theme_dir - find theme directory containing theme @theme_name
*/
char *theme_dir(const char *theme_name);
-#endif /* __LABWC_THEME_DIR_H */
+#endif /* __LABWC_DIR_H */
+++ /dev/null
-#ifndef __LABWC_CONFIG_DIR_H
-#define __LABWC_CONFIG_DIR_H
-
-char *config_dir(void);
-
-#endif /* __LABWC_CONFIG_DIR_H */
--- /dev/null
+/*
+ * Find the configuration and theme directories
+ *
+ * Copyright Johan Malm 2020
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+#include <glib.h>
+
+#include "common/dir.h"
+
+struct dir {
+ const char *prefix;
+ const char *path;
+};
+
+/* clang-format off */
+static struct dir config_dirs[] = {
+ { "XDG_CONFIG_HOME", "labwc" },
+ { "HOME", ".config/labwc" },
+ { "XDG_CONFIG_DIRS", "labwc" },
+ { NULL, "/etc/xdg/labwc" },
+ { "XDG_CONFIG_HOME", "openbox" },
+ { "HOME", ".config/openbox" },
+ { "XDG_CONFIG_DIRS", "openbox" },
+ { NULL, "/etc/xdg/openbox" },
+ { NULL, NULL }
+};
+
+static struct dir theme_dirs[] = {
+ { "XDG_DATA_HOME", "themes" },
+ { "HOME", ".local/share/themes" },
+ { "HOME", ".themes" },
+ { "XDG_DATA_DIRS", "themes" },
+ { NULL, "/usr/share/themes" },
+ { NULL, "/usr/local/share/themes" },
+ { NULL, "opt/share/themes" },
+ { NULL, NULL }
+};
+/* clang-format on */
+
+static bool isdir(const char *path)
+{
+ struct stat st;
+ return (!stat(path, &st) && S_ISDIR(st.st_mode));
+}
+
+struct ctx {
+ void (*build_path_fn)(struct ctx *ctx, char *prefix, const char *path);
+ char *buf;
+ size_t len;
+ struct dir *dirs;
+ const char *theme_name;
+};
+
+static void build_config_path(struct ctx *ctx, char *prefix, const char *path)
+{
+ if (!prefix)
+ snprintf(ctx->buf, ctx->len, "%s", path);
+ else
+ snprintf(ctx->buf, ctx->len, "%s/%s", prefix, path);
+}
+
+static void build_theme_path(struct ctx *ctx, char *prefix, const char *path)
+{
+ if (!prefix)
+ snprintf(ctx->buf, ctx->len, "%s/%s/openbox-3", path,
+ ctx->theme_name);
+ else
+ snprintf(ctx->buf, ctx->len, "%s/%s/%s/openbox-3", prefix, path,
+ ctx->theme_name);
+}
+
+char *find_dir(struct ctx *ctx)
+{
+ char *debug = getenv("LABWC_DEBUG_DIR_CONFIG_AND_THEME");
+
+ for (int i = 0; ctx->dirs[i].path; i++) {
+ struct dir d = ctx->dirs[i];
+ if (!d.prefix) {
+ /* handle /etc/xdg... */
+ ctx->build_path_fn(ctx, NULL, d.path);
+ if (debug)
+ fprintf(stderr, "DEBUG: %s\n", ctx->buf);
+ if (isdir(ctx->buf))
+ return ctx->buf;
+ } else {
+ /* handle $HOME/.config/... and $XDG_* */
+ char *prefix = getenv(d.prefix);
+ if (!prefix)
+ continue;
+ gchar **prefixes = g_strsplit(prefix, ":", -1);
+ for (gchar **p = prefixes; *p; p++) {
+ ctx->build_path_fn(ctx, *p, d.path);
+ if (debug)
+ fprintf(stderr, "DEBUG: %s\n",
+ ctx->buf);
+ if (isdir(ctx->buf))
+ return ctx->buf;
+ }
+ }
+ }
+ /* no directory was found */
+ ctx->buf[0] = '.';
+ ctx->buf[1] = '\0';
+ return ctx->buf;
+}
+
+char *config_dir(void)
+{
+ static char buf[4096] = { 0 };
+ if (buf[0] != '\0')
+ return buf;
+ struct ctx ctx = { .build_path_fn = build_config_path,
+ .buf = buf,
+ .len = sizeof(buf),
+ .dirs = config_dirs };
+ return find_dir(&ctx);
+}
+
+char *theme_dir(const char *theme_name)
+{
+ static char buf[4096] = { 0 };
+ if (buf[0] != '\0')
+ return buf;
+ struct ctx ctx = { .build_path_fn = build_theme_path,
+ .buf = buf,
+ .len = sizeof(buf),
+ .dirs = theme_dirs,
+ .theme_name = theme_name };
+ return find_dir(&ctx);
+}
labwc_sources += files(
'buf.c',
+ 'dir.c',
'font.c',
'grab-file.c',
'spawn.c',
+++ /dev/null
-/*
- * Find the labwc configuration directory
- *
- * Copyright Johan Malm 2020
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <stdbool.h>
-#include <glib.h>
-
-#include "config/config-dir.h"
-
-struct dir {
- const char *prefix;
- const char *path;
-};
-
-/* clang-format off */
-static struct dir config_dirs[] = {
- { "XDG_CONFIG_HOME", "labwc" },
- { "HOME", ".config/labwc" },
- { "XDG_CONFIG_DIRS", "labwc" },
- { NULL, "/etc/xdg/labwc" },
- { "XDG_CONFIG_HOME", "openbox" },
- { "HOME", ".config/openbox" },
- { "XDG_CONFIG_DIRS", "openbox" },
- { NULL, "/etc/xdg/openbox" },
- { NULL, NULL }
-};
-/* clang-format on */
-
-static bool isdir(const char *path)
-{
- struct stat st;
- return (!stat(path, &st) && S_ISDIR(st.st_mode));
-}
-
-char *config_dir(void)
-{
- static char buf[4096] = { 0 };
- if (buf[0] != '\0')
- return buf;
-
- for (int i = 0; config_dirs[i].path; i++) {
- struct dir d = config_dirs[i];
- if (!d.prefix) {
- /* handle /etc/xdg... */
- snprintf(buf, sizeof(buf), "%s", d.path);
- if (isdir(buf))
- return buf;
- } else {
- /* handle $HOME/.config/... and $XDG_* */
- char *prefix = getenv(d.prefix);
- if (!prefix)
- continue;
- gchar **prefixes = g_strsplit(prefix, ":", -1);
- for (gchar **p = prefixes; *p; p++) {
- snprintf(buf, sizeof(buf), "%s/%s", *p, d.path);
- if (isdir(buf))
- return buf;
- }
- }
- }
- /* no config directory was found */
- buf[0] = '.';
- buf[1] = '\0';
- return buf;
-}
labwc_sources += files(
- 'config-dir.c',
'rcxml.c',
'keybind.c',
)
#include "config/rcxml.h"
#include "config/keybind.h"
-#include "config/config-dir.h"
+#include "common/dir.h"
#include "common/bug-on.h"
#include "common/font.h"
labwc_sources += files(
'theme.c',
- 'theme-dir.c',
)
subdir('xbm')
+++ /dev/null
-/*
- * Find the openbox theme directory
- *
- * Copyright Johan Malm 2020
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <stdbool.h>
-#include <glib.h>
-
-struct dir {
- const char *prefix;
- const char *path;
-};
-
-/* clang-format off */
-static struct dir theme_dirs[] = {
- { "XDG_DATA_HOME", "themes" },
- { "HOME", ".local/share/themes" },
- { "HOME", ".themes" },
- { "XDG_DATA_DIRS", "themes" },
- { NULL, "/usr/share/themes" },
- { NULL, "/usr/local/share/themes" },
- { NULL, "opt/share/themes" },
- { NULL, NULL }
-};
-/* clang-format on */
-
-static bool isdir(const char *path)
-{
- struct stat st;
- return (!stat(path, &st) && S_ISDIR(st.st_mode));
-}
-
-char *theme_dir(const char *theme_name)
-{
- static char buf[4096] = { 0 };
- if (buf[0] != '\0')
- return buf;
-
- for (int i = 0; theme_dirs[i].path; i++) {
- struct dir d = theme_dirs[i];
- if (!d.prefix) {
- snprintf(buf, sizeof(buf), "%s/%s/openbox-3", d.path,
- theme_name);
- if (isdir(buf))
- return buf;
- } else {
- char *prefix = getenv(d.prefix);
- if (!prefix)
- continue;
- gchar **prefixes = g_strsplit(prefix, ":", -1);
- for (gchar **p = prefixes; *p; p++) {
- snprintf(buf, sizeof(buf),
- "%s/%s/%s/openbox-3", *p, d.path,
- theme_name);
- if (isdir(buf))
- return buf;
- }
- }
- }
- /* no config directory was found */
- buf[0] = '.';
- buf[1] = '\0';
- return buf;
-}
#include <glib.h>
#include "theme/theme.h"
-#include "theme/theme-dir.h"
+#include "common/dir.h"
static int hex_to_dec(char c)
{
#include "theme/theme.h"
#include "theme/xbm/xbm.h"
#include "theme/xbm/parse.h"
-#include "theme/theme-dir.h"
#include "config/rcxml.h"
+#include "common/dir.h"
#include "common/grab-file.h"
/* built-in 6x6 buttons */
sources: files(
'../src/config/rcxml.c',
'../src/config/keybind.c',
- '../src/config/config-dir.c',
+ '../src/common/dir.c',
'../src/common/buf.c',
'../src/common/font.c',
),
--- /dev/null
+CFLAGS += -g -Wall -I../../include
+CFLAGS += `pkg-config --cflags glib-2.0`
+LDFLAGS += `pkg-config --libs glib-2.0`
+
+all:
+ $(CC) $(CFLAGS) -o dir-list dir-list.c ../../src/common/dir.c $(LDFLAGS)
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "common/dir.h"
+
+int main()
+{
+ setenv("LABWC_DEBUG_DIR_CONFIG_AND_THEME", "1", 1);
+ setenv("XDG_CONFIG_HOME", "/a:/bbb:/ccccc:/etc/foo", 1);
+ printf("%s\n", config_dir());
+ printf("%s\n", theme_dir("Numix"));
+}
CFLAGS += $(ASAN_FLAGS)
LDFLAGS += $(ASAN_FLAGS) -fuse-ld=gold
LDFLAGS += `xml2-config --libs`
-LDFLAGS += `pkg-config --cflags --libs glib-2.0 wayland-server xkbcommon`
+LDFLAGS += `pkg-config --cflags --libs glib-2.0 cairo pangocairo wayland-server xkbcommon`
PROGS = rcxml-print-nodenames
SRC = \
rcxml-print-nodenames.c \
../../src/config/rcxml.c \
- ../../src/config/config-dir.c \
+ ../../src/common/dir.c \
../../src/common/buf.c \
+ ../../src/common/font.c \
../../src/config/keybind.c
SRCS = \
theme-helper.c \
../../src/theme/theme.c \
- ../../src/theme/theme-dir.c
+ ../../src/common/dir.c
all:
gcc $(CFLAGS) -o theme-helper $(SRCS) $(LDFLAGS)
ASAN += -fsanitize=address
PROGS = xbm-tokenize xbm-parse
-DEP_TOKENIZE = ../../src/common/buf.c ../../src/theme/xbm/tokenize.c
-DEP_PARSE = $(DEP_TOKENIZE) ../../src/theme/xbm/parse.c
+
+DEP_TOKENIZE = \
+ ../../src/common/buf.c \
+ ../../src/theme/xbm/tokenize.c
+
+DEP_PARSE = $(DEP_TOKENIZE) \
+ ../../src/theme/xbm/parse.c \
+ ../../src/common/grab-file.c
all: $(PROGS)
#include <cairo.h>
#include "theme/xbm/parse.h"
+#include "common/grab-file.h"
int main(int argc, char **argv)
{
return 1;
}
- char *buffer = xbm_read_file(argv[1]);
+ char *buffer = grab_file(argv[1]);
if (!buffer)
exit(EXIT_FAILURE);
- tokens = xbm_tokenize(buffer);
+ tokens = tokenize_xbm(buffer);
free(buffer);
- struct pixmap pixmap = xbm_create_pixmap(tokens);
+ struct pixmap pixmap = parse_xbm_tokens(tokens);
free(tokens);
cairo_surface_t *g_surface;
#include <stdlib.h>
#include <string.h>
-#include "buf.h"
+#include "common/buf.h"
#include "theme/xbm/tokenize.h"
/* Read file into buffer, because it's easier to tokenize that way */
char *buffer = read_file(argv[1]);
if (!buffer)
exit(EXIT_FAILURE);
- tokens = xbm_tokenize(buffer);
+ tokens = tokenize_xbm(buffer);
free(buffer);
for (struct token *t = tokens; t->type; t++)
printf("%s\n", t->name);