ltk

Socket-based GUI for X11 (WIP)
git clone git://lumidify.org/ltk.git (fast, but not encrypted)
git clone https://lumidify.org/git/ltk.git (encrypted, but very slow)
Log | Files | Refs | README | LICENSE

commit 16fa6bfa5bfc26126ac712ac03528914b0d651f9
parent ad0cb56260b44997474ce30b98f0d96013b84073
Author: lumidify <nobody@lumidify.org>
Date:   Sat, 20 Feb 2021 20:32:24 +0100

Move diagnostic functions to util

Diffstat:
MMakefile | 6+++---
Mcolor.c | 4++--
Mltk.h | 4----
Mltkc.c | 49++++++++++++++++++++++++++++++++-----------------
Mltkd.c | 81+++++++++++++++++++------------------------------------------------------------
Mmemory.c | 2+-
Mtext_pango.c | 2+-
Mutil.c | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
Mutil.h | 10++++++++--
9 files changed, 121 insertions(+), 112 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,14 +1,14 @@ include config.mk -OBJ += strtonum.o memory.o color.o util.o ltkd.o ini.o grid.o box.o scrollbar.o button.o label.o draw.o +OBJ += strtonum.o util.o memory.o color.o ltkd.o ini.o grid.o box.o scrollbar.o button.o label.o draw.o all: ltkd ltkc ltkd: $(OBJ) $(CC) -o $@ $(OBJ) $(LDFLAGS) -ltkc: ltkc.o util.o - $(CC) -o $@ ltkc.o util.o +ltkc: ltkc.o util.o memory.o + $(CC) -o $@ ltkc.o util.o memory.o %.o: %.c $(CC) -c -o $@ $< $(CFLAGS) diff --git a/color.c b/color.c @@ -1,3 +1,4 @@ +#include <stdarg.h> #include <X11/Xlib.h> #include <X11/Xutil.h> @@ -8,8 +9,7 @@ void ltk_color_create(Display *dpy, int screen, Colormap cm, const char *hex, LtkColor *col) { if (!XParseColor(dpy, cm, hex, &col->xcolor)) { /* FIXME: better error reporting!!! */ - /* FIXME: remove obsolete ltk_err function */ - ltk_err("ltk_color_create"); + ltk_fatal("ltk_color_create"); } XAllocColor(dpy, cm, &col->xcolor); /* FIXME: replace with XftColorAllocValue; error checking */ diff --git a/ltk.h b/ltk.h @@ -154,10 +154,6 @@ typedef struct ltk_window { ltk_rect ltk_rect_intersect(ltk_rect r1, ltk_rect r2); ltk_rect ltk_rect_union(ltk_rect r1, ltk_rect r2); void ltk_window_invalidate_rect(ltk_window *window, ltk_rect rect); -void ltk_warn(const char *format, ...); -void ltk_fatal(const char *format, ...); -void ltk_warn_errno(const char *format, ...); -void ltk_fatal_errno(const char *format, ...); int ltk_create_xcolor(ltk_window *window, const char *hex, XColor *col); void ltk_queue_event(ltk_window *window, ltk_event_type type, const char *id, const char *data); int ltk_collide_rect(ltk_rect rect, int x, int y); diff --git a/ltkc.c b/ltkc.c @@ -1,6 +1,6 @@ /* * This file is part of the Lumidify ToolKit (LTK) - * Copyright (c) 2020 lumidify <nobody@lumidify.org> + * Copyright (c) 2021 lumidify <nobody@lumidify.org> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,6 +24,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <stdarg.h> #include <stddef.h> #include <unistd.h> #include <time.h> @@ -32,6 +33,7 @@ #include <sys/socket.h> #include <sys/un.h> #include "util.h" +#include "memory.h" #define BLK_SIZE 128 @@ -44,8 +46,12 @@ static struct { int out_alloc; } io_buffers; +static char *ltk_dir = NULL; +static char *sock_path = NULL; +static int sockfd = -1; + int main(int argc, char *argv[]) { - int sockfd, maxrfd, maxwfd; + int maxrfd, maxwfd; int infd = fileno(stdin); int outfd = fileno(stdout); struct sockaddr_un un; @@ -53,7 +59,6 @@ int main(int argc, char *argv[]) { struct timeval tv, tv_master; tv_master.tv_sec = 0; tv_master.tv_usec = 20000; - char *ltk_dir = NULL, *sock_path = NULL; int path_size; if (argc != 2) { @@ -69,11 +74,7 @@ int main(int argc, char *argv[]) { /* 7 because of "/", ".sock", and '\0' */ path_size = strlen(ltk_dir) + strlen(argv[1]) + 7; - sock_path = malloc(path_size); - if (!sock_path) { - (void)fprintf(stderr, "Unable to allocate memory for socket path.\n"); - return 1; - } + sock_path = ltk_malloc(path_size); snprintf(sock_path, path_size, "%s/%s.sock", ltk_dir, argv[1]); if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { @@ -92,14 +93,10 @@ int main(int argc, char *argv[]) { return -2; } - io_buffers.in_buffer = malloc(BLK_SIZE); - if (!io_buffers.in_buffer) - return 1; + io_buffers.in_buffer = ltk_malloc(BLK_SIZE); io_buffers.in_alloc = BLK_SIZE; - io_buffers.out_buffer = malloc(BLK_SIZE); - if (!io_buffers.out_buffer) - return 1; + io_buffers.out_buffer = ltk_malloc(BLK_SIZE); io_buffers.out_alloc = BLK_SIZE; FD_ZERO(&rallfds); @@ -190,9 +187,27 @@ int main(int argc, char *argv[]) { } } - close(sockfd); - free(ltk_dir); - free(sock_path); + ltk_cleanup(); return 0; } + +void +ltk_log_msg(const char *mode, const char *format, va_list args) { + fprintf(stderr, "ltkc %s: ", mode); + vfprintf(stderr, format, args); +} + +void +ltk_cleanup() { + if (sockfd >= 0) + close(sockfd); + if (ltk_dir) + ltk_free(ltk_dir); + if (sock_path) + ltk_free(sock_path); + if (io_buffers.in_buffer) + ltk_free(io_buffers.in_buffer); + if (io_buffers.out_buffer) + ltk_free(io_buffers.out_buffer); +} diff --git a/ltkd.c b/ltkd.c @@ -1,3 +1,4 @@ +/* FIXME Figure out how to properly print window id */ /* FIXME: PROPERLY CLEANUP ALL THEMES */ /* FIXME: error checking in tokenizer (is this necessary?) */ /* FIXME: parsing doesn't work properly with bs? */ @@ -99,7 +100,6 @@ static ltk_window *ltk_create_window(const char *title, int x, int y, unsigned int w, unsigned int h); static void ltk_destroy_widget_hash(void); static void ltk_destroy_window(ltk_window *window); -static void ltk_cleanup(void); static void ltk_redraw_window(ltk_window *window); static void ltk_window_other_event(ltk_window *window, XEvent event); static void ltk_handle_event(ltk_window *window, XEvent event); @@ -352,7 +352,7 @@ open_log(char *dir) { return f; } -static void +void ltk_cleanup(void) { if (listenfd >= 0) close(listenfd); @@ -387,6 +387,23 @@ ltk_quit(ltk_window *window) { running = 0; } +void +ltk_log_msg(const char *mode, const char *format, va_list args) { + char logtime[25]; /* FIXME: This should always be big enough, right? */ + time_t clock; + struct tm *timeptr; + + time(&clock); + timeptr = localtime(&clock); + strftime(&logtime, 25, "%Y-%m-%d %H:%M:%S", timeptr); + + if (main_window) + fprintf(stderr, "%s ltkd(%d) %s: ", logtime, main_window->xwindow, mode); + else + fprintf(stderr, "%s ltkd(?) %s: ", logtime, mode); + vfprintf(stderr, format, args); +} + static int ltk_set_root_widget_cmd( ltk_window *window, @@ -441,66 +458,6 @@ ltk_window_invalidate_rect(ltk_window *window, ltk_rect rect) { window->dirty_rect = ltk_rect_union(rect, window->dirty_rect); } -static void -print_log(const char *mode, const char *format, va_list args) { - char logtime[25]; /* FIXME: This should always be big enough, right? */ - FILE *errfile = ltk_logfile; - time_t clock; - struct tm *timeptr; - - time(&clock); - timeptr = localtime(&clock); - strftime(&logtime, 25, "%Y-%m-%d %H:%M:%S", timeptr); - - if (!errfile) - errfile = stderr; - - if (main_window) - fprintf(errfile, "%s ltkd(%d) %s: ", logtime, main_window->xwindow, mode); - else - fprintf(errfile, "%s ltkd(?) %s: ", logtime, mode); - vfprintf(errfile, format, args); -} - -void -ltk_warn(const char *format, ...) { - va_list args; - va_start(args, format); - print_log("Warning", format, args); - va_end(args); -} - -void -ltk_fatal(const char *format, ...) { - va_list args; - va_start(args, format); - print_log("Fatal", format, args); - va_end(args); - ltk_cleanup(); - - exit(1); -}; - -void -ltk_warn_errno(const char *format, ...) { - va_list args; - char *errstr = strerror(errno); - va_start(args, format); - print_log("Warning", format, args); - va_end(args); - ltk_warn("system error: %s\n", errstr); -} - -void -ltk_fatal_errno(const char *format, ...) { - va_list args; - char *errstr = strerror(errno); - va_start(args, format); - print_log("Fatal", format, args); - va_end(args); - ltk_fatal("system error: %s\n", errstr); -} - /* FIXME: Proper error checking by calling functions */ int ltk_create_xcolor(ltk_window *window, const char *hex, XColor *col) { diff --git a/memory.c b/memory.c @@ -29,7 +29,7 @@ #include <string.h> #include <stdint.h> #include "color.h" -#include "ltk.h" +#include "util.h" char * ltk_strdup_impl(const char *s) { diff --git a/text_pango.c b/text_pango.c @@ -60,7 +60,7 @@ ltk_text_line_set_width(LtkTextLine *tl, int width) { LtkTextLine * ltk_text_line_create(Window window, uint16_t font_size, char *text, int width) { if (!tm.context) - ltk_err("ltk_text_line_create (pango): text not initialized yet"); + ltk_fatal("ltk_text_line_create (pango): text not initialized yet"); LtkTextLine *line = ltk_malloc(sizeof(LtkTextLine)); line->text = text; line->font_size = font_size; diff --git a/util.c b/util.c @@ -1,6 +1,6 @@ /* * This file is part of the Lumidify ToolKit (LTK) - * Copyright (c) 2020 lumidify <nobody@lumidify.org> + * Copyright (c) 2021 lumidify <nobody@lumidify.org> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -26,13 +26,12 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <stdarg.h> -void -ltk_err(const char *msg) { - perror(msg); - exit(1); -} +#include "util.h" +#include "memory.h" +/* FIXME: Should these functions really fail on memory error? */ char * ltk_read_file(const char *path, unsigned long *len) { FILE *f; @@ -42,8 +41,7 @@ ltk_read_file(const char *path, unsigned long *len) { fseek(f, 0, SEEK_END); *len = ftell(f); fseek(f, 0, SEEK_SET); - file_contents = malloc(*len + 1); - if (!file_contents) return NULL; + file_contents = ltk_malloc(*len + 1); fread(file_contents, 1, *len, f); file_contents[*len] = '\0'; fclose(f); @@ -52,15 +50,12 @@ ltk_read_file(const char *path, unsigned long *len) { } /* If `needed` is larger than `*alloc_size`, resize `*str` to - `max(needed, *alloc_size * 2)`. - Returns 1 on error, 0 otherwise. If an error occurs, `*str` and - `*alloc_size` are not modified. */ + `max(needed, *alloc_size * 2)`. Aborts program on error. */ int ltk_grow_string(char **str, int *alloc_size, int needed) { if (needed <= *alloc_size) return 0; int new_size = needed > (*alloc_size * 2) ? needed : (*alloc_size * 2); - char *new = realloc(*str, new_size); - if (!new) return 1; + char *new = ltk_realloc(*str, new_size); *str = new; *alloc_size = new_size; return 0; @@ -79,18 +74,22 @@ ltk_setup_directory(void) { dir_orig = getenv("LTKDIR"); if (dir_orig) { - dir = strdup(dir_orig); + dir = ltk_strdup(dir_orig); + /* if (!dir) return NULL; + */ } else { uid = getuid(); pw = getpwuid(uid); if (!pw) return NULL; len = strlen(pw->pw_dir); - dir = malloc(len + 6); + dir = ltk_malloc(len + 6); + /* if (!dir) return NULL; + */ strcpy(dir, pw->pw_dir); strcpy(dir + len, "/.ltk"); } @@ -105,8 +104,7 @@ ltk_setup_directory(void) { /* Concatenate the two given strings and return the result. This allocates new memory for the result string, unlike - the actual strcat. - Returns NULL on error. */ + the actual strcat. Aborts program on error */ char * ltk_strcat_useful(const char *str1, const char *str2) { int len1, len2; @@ -114,11 +112,48 @@ ltk_strcat_useful(const char *str1, const char *str2) { len1 = strlen(str1); len2 = strlen(str2); - ret = malloc(len1 + len2 + 1); - if (!ret) - return NULL; + ret = ltk_malloc(len1 + len2 + 1); strcpy(ret, str1); strcpy(ret + len1, str2); return ret; } + +void +ltk_warn(const char *format, ...) { + va_list args; + va_start(args, format); + ltk_log_msg("Warning", format, args); + va_end(args); +} + +void +ltk_fatal(const char *format, ...) { + va_list args; + va_start(args, format); + ltk_log_msg("Fatal", format, args); + va_end(args); + ltk_cleanup(); + + exit(1); +}; + +void +ltk_warn_errno(const char *format, ...) { + va_list args; + char *errstr = strerror(errno); + va_start(args, format); + ltk_log_msg("Warning", format, args); + va_end(args); + ltk_warn("system error: %s\n", errstr); +} + +void +ltk_fatal_errno(const char *format, ...) { + va_list args; + char *errstr = strerror(errno); + va_start(args, format); + ltk_log_msg("Fatal", format, args); + va_end(args); + ltk_fatal("system error: %s\n", errstr); +} diff --git a/util.h b/util.h @@ -1,6 +1,6 @@ /* * This file is part of the Lumidify ToolKit (LTK) - * Copyright (c) 2020 lumidify <nobody@lumidify.org> + * Copyright (c) 2021 lumidify <nobody@lumidify.org> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -21,14 +21,20 @@ * SOFTWARE. */ +/* Requires: <stdarg.h> */ + #ifndef __OpenBSD__ long long strtonum(const char *numstr, long long minval, long long maxval, const char **errstrp); #endif -void ltk_err(const char *msg); char *ltk_read_file(const char *path, unsigned long *len); int ltk_grow_string(char **str, int *alloc_size, int needed); char *ltk_setup_directory(void); char *ltk_strcat_useful(const char *str1, const char *str2); + +/* Note: these are actually implemented in ltkd.c and ltkc.c (they are just + declared here so they can be used by the utility functions */ +void ltk_log_msg(const char *mode, const char *format, va_list args); +void ltk_cleanup(void);