commit 2845e91cce752793dfebfac761c4b1ae7c25b023
parent 236104387a38581c2d7e0b50dd208d6f2db4e312
Author: lumidify <nobody@lumidify.org>
Date: Thu, 31 Dec 2020 20:34:13 +0100
Clean up headers a bit
Diffstat:
11 files changed, 114 insertions(+), 94 deletions(-)
diff --git a/button.c b/button.c
@@ -25,11 +25,13 @@
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
+#include <stdarg.h>
+
#include <X11/Xlib.h>
#include <X11/Xutil.h>
-#include "util.h"
-#include "khash.h"
+
#include "ltk.h"
+#include "util.h"
#include "text.h"
#include "button.h"
@@ -242,12 +244,12 @@ ltk_button_cmd_create(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- if (!ltk_widget_id_free(window, tokens[1])) {
+ if (!ltk_widget_id_free(tokens[1])) {
*errstr = "Widget ID already taken.\n";
return 1;
}
button = ltk_button_create(window, tokens[1], tokens[3]);
- ltk_set_widget(window, button, tokens[1]);
+ ltk_set_widget(button, tokens[1]);
return 0;
}
diff --git a/color.c b/color.c
@@ -1,5 +1,6 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
+
#include "defs.h"
#include "util.h"
#include "color.h"
diff --git a/color.h b/color.h
@@ -1,4 +1,5 @@
#include "defs.h"
+
#ifdef USE_XFT
#include <X11/Xft/Xft.h>
#endif
diff --git a/draw.c b/draw.c
@@ -23,12 +23,14 @@
#include <stdio.h>
#include <stdlib.h>
-#include <stdint.h>
#include <string.h>
+#include <stdarg.h>
+
#include <X11/Xlib.h>
#include <X11/Xutil.h>
-#include "util.h"
+
#include "ltk.h"
+#include "util.h"
#include "draw.h"
static void ltk_draw_draw(ltk_draw *draw);
@@ -200,7 +202,7 @@ ltk_draw_cmd_clear(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- draw = ltk_get_widget(window, tokens[1], LTK_DRAW, errstr);
+ draw = ltk_get_widget(tokens[1], LTK_DRAW, errstr);
if (!draw) return 1;
ltk_draw_clear(window, draw);
@@ -218,7 +220,7 @@ ltk_draw_cmd_set_color(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- draw = ltk_get_widget(window, tokens[1], LTK_DRAW, errstr);
+ draw = ltk_get_widget(tokens[1], LTK_DRAW, errstr);
if (!draw) return 1;
ltk_draw_set_color(window, draw, tokens[3]);
@@ -238,7 +240,7 @@ ltk_draw_cmd_line(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- draw = ltk_get_widget(window, tokens[1], LTK_DRAW, errstr);
+ draw = ltk_get_widget(tokens[1], LTK_DRAW, errstr);
if (!draw) return 1;
x1 = strtonum(tokens[3], 0, 100000, &errstr_num);
if (errstr_num) {
@@ -278,7 +280,7 @@ ltk_draw_cmd_rect(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- draw = ltk_get_widget(window, tokens[1], LTK_DRAW, errstr);
+ draw = ltk_get_widget(tokens[1], LTK_DRAW, errstr);
if (!draw) return 1;
x = strtonum(tokens[3], 0, 100000, &errstr_num);
if (errstr_num) {
@@ -324,7 +326,7 @@ ltk_draw_cmd_create(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- if (!ltk_widget_id_free(window, tokens[1])) {
+ if (!ltk_widget_id_free(tokens[1])) {
*errstr = "Widget ID already taken.\n";
return 1;
}
@@ -339,7 +341,7 @@ ltk_draw_cmd_create(
return 1;
}
draw = ltk_draw_create(window, tokens[1], w, h, tokens[5]);
- ltk_set_widget(window, draw, tokens[1]);
+ ltk_set_widget(draw, tokens[1]);
return 0;
}
diff --git a/grid.c b/grid.c
@@ -26,12 +26,13 @@
#include <stdio.h>
#include <stdlib.h>
-#include <stdint.h>
+#include <stdarg.h>
+
#include <X11/Xlib.h>
#include <X11/Xutil.h>
-#include "util.h"
-#include "khash.h"
+
#include "ltk.h"
+#include "util.h"
#include "grid.h"
static void ltk_grid_set_row_weight(ltk_grid *grid, int row, int weight);
@@ -383,8 +384,8 @@ ltk_grid_cmd_add(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- grid = ltk_get_widget(window, tokens[1], LTK_GRID, errstr);
- widget = ltk_get_widget(window, tokens[3], LTK_WIDGET, errstr);
+ grid = ltk_get_widget(tokens[1], LTK_GRID, errstr);
+ widget = ltk_get_widget(tokens[3], LTK_WIDGET, errstr);
if (!grid || !widget) return 1;
row = strtonum(tokens[4], 0, grid->rows - 1, &errstr_num);
if (errstr_num) {
@@ -427,8 +428,8 @@ ltk_grid_cmd_ungrid(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- grid = ltk_get_widget(window, tokens[1], LTK_GRID, errstr);
- widget = ltk_get_widget(window, tokens[3], LTK_WIDGET, errstr);
+ grid = ltk_get_widget(tokens[1], LTK_GRID, errstr);
+ widget = ltk_get_widget(tokens[3], LTK_WIDGET, errstr);
if (!grid || !widget) return 1;
return ltk_grid_ungrid(window, widget, grid, errstr);
}
@@ -447,7 +448,7 @@ ltk_grid_cmd_create(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- if (!ltk_widget_id_free(window, tokens[1])) {
+ if (!ltk_widget_id_free(tokens[1])) {
*errstr = "Widget ID already taken.\n";
return 1;
}
@@ -462,7 +463,7 @@ ltk_grid_cmd_create(
return 1;
}
grid = ltk_grid_create(window, tokens[1], rows, columns);
- ltk_set_widget(window, grid, tokens[1]);
+ ltk_set_widget(grid, tokens[1]);
return 0;
}
@@ -481,7 +482,7 @@ ltk_grid_cmd_set_row_weight(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- grid = ltk_get_widget(window, tokens[1], LTK_GRID, errstr);
+ grid = ltk_get_widget(tokens[1], LTK_GRID, errstr);
if (!grid) return 1;
row = strtonum(tokens[3], 0, grid->rows, &errstr_num);
if (errstr_num) {
@@ -512,7 +513,7 @@ ltk_grid_cmd_set_column_weight(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- grid = ltk_get_widget(window, tokens[1], LTK_GRID, errstr);
+ grid = ltk_get_widget(tokens[1], LTK_GRID, errstr);
if (!grid) return 1;
column = strtonum(tokens[3], 0, grid->columns, &errstr_num);
if (errstr_num) {
diff --git a/ltk.h b/ltk.h
@@ -24,12 +24,7 @@
#ifndef _LTK_H_
#define _LTK_H_
-#include <stdarg.h>
-
-/* FIXME: standardize the includes... */
-/* Requires the following includes: <X11/Xlib.h>, <X11/Xutil.h> */
-
-#include "khash.h"
+/* Requires the following includes: <X11/Xlib.h>, <X11/Xutil.h>, <stdarg.h> */
typedef enum {
LTK_EVENT_RESIZE = 1 << 0,
@@ -105,8 +100,6 @@ typedef struct {
XColor bg;
} ltk_window_theme;
-typedef struct ltk_button_theme ltk_button_theme;
-
struct ltk_event_queue {
ltk_event_type event_type;
char *data;
@@ -114,7 +107,15 @@ struct ltk_event_queue {
struct ltk_event_queue *next;
};
-KHASH_MAP_INIT_STR(widget, ltk_widget *)
+/*
+ Historical note concerning ltk_window: This code was originally copied
+ from my previous attempt at creating a GUI library, which was meant to
+ be a regular C library and support multiple windows. Since this version
+ of LTK doesn't support multiple windows (well, the calling script can
+ just run more instances of ltkd if needed), having an ltk_window struct
+ passed around is kind of unnecessary. I'm too lazy to change that now,
+ though, so it's just going to stay that way.
+*/
typedef struct ltk_window {
Display *dpy;
@@ -131,7 +132,6 @@ typedef struct ltk_window {
ltk_rect dirty_rect;
struct ltk_event_queue *first_event;
struct ltk_event_queue *last_event;
- khash_t(widget) *widget_hash;
} ltk_window;
void ltk_window_invalidate_rect(ltk_window *window, ltk_rect rect);
@@ -151,9 +151,8 @@ void ltk_fill_widget_defaults(ltk_widget *widget, const char *id, ltk_window * w
void ltk_widget_mouse_press_event(ltk_widget *widget, XEvent event);
void ltk_widget_mouse_release_event(ltk_widget *widget, XEvent event);
void ltk_widget_motion_notify_event(ltk_widget *widget, XEvent event);
-int ltk_check_widget_id_free(ltk_window *window, const char *id);
-ltk_widget *ltk_get_widget(ltk_window *window, const char *id,
- ltk_widget_type type, char **errstr);
-void ltk_set_widget(ltk_window *window, ltk_widget *widget, const char *id);
+int ltk_check_widget_id_free(const char *id);
+ltk_widget *ltk_get_widget(const char *id, ltk_widget_type type, char **errstr);
+void ltk_set_widget(ltk_widget *widget, const char *id);
#endif
diff --git a/ltkd.c b/ltkd.c
@@ -21,29 +21,33 @@
* SOFTWARE.
*/
+#include <time.h>
#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
#include <stdlib.h>
#include <string.h>
-#include <stdint.h>
-#include <fcntl.h>
+#include <stdarg.h>
#include <unistd.h>
-#include <time.h>
-#include <errno.h>
#include <signal.h>
+
+#include <sys/un.h>
#include <sys/stat.h>
#include <sys/select.h>
#include <sys/socket.h>
-#include <sys/un.h>
+
#include <X11/Xlib.h>
#include <X11/Xutil.h>
-#include "util.h"
-#include "khash.h"
+
#include "ini.h"
-#include "text.h"
+#include "khash.h"
+
#include "ltk.h"
+#include "util.h"
+#include "text.h"
#include "grid.h"
-#include "button.h"
#include "draw.h"
+#include "button.h"
#define MAX_SOCK_CONNS 20
#define READ_BLK_SIZE 128
@@ -74,15 +78,18 @@ static struct ltk_sock_info {
struct token_list tokens; /* current tokens */
} sockets[MAX_SOCK_CONNS];
+KHASH_MAP_INIT_STR(widget, ltk_widget *)
+static khash_t(widget) *widget_hash = NULL;
+
static int ltk_mainloop(ltk_window *window);
static char *get_sock_path(char *basedir, Window id);
static FILE *open_log(char *dir);
static void daemonize(void);
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_gui(ltk_window *window);
-static void ltk_cleanup_nongui(void);
+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);
@@ -130,6 +137,9 @@ int main(int argc, char *argv[]) {
ltk_logfile = open_log(ltk_dir);
if (!ltk_logfile) ltk_fatal_errno("Unable to open log file.\n");
+ widget_hash = kh_init(widget);
+ if (!widget_hash) ltk_fatal_errno("Unable to initialize widget hash table.\n");
+
/* FIXME: set window size properly - I only run it in a tiling WM
anyways, so it doesn't matter, but still... */
main_window = ltk_create_window(title, 0, 0, 500, 500);
@@ -248,8 +258,7 @@ ltk_mainloop(ltk_window *window) {
}
- ltk_cleanup_gui(window);
- ltk_cleanup_nongui();
+ ltk_cleanup();
return 0;
}
@@ -331,7 +340,7 @@ open_log(char *dir) {
}
static void
-ltk_cleanup_nongui(void) {
+ltk_cleanup(void) {
if (listenfd >= 0)
close(listenfd);
if (ltk_dir)
@@ -353,11 +362,11 @@ ltk_cleanup_nongui(void) {
if (sockets[i].tokens.tokens)
free(sockets[i].tokens.tokens);
}
-}
-static void
-ltk_cleanup_gui(ltk_window *window) {
- ltk_destroy_window(window);
+ if (widget_hash)
+ ltk_destroy_widget_hash();
+ if (main_window)
+ ltk_destroy_window(main_window);
}
void
@@ -376,7 +385,7 @@ ltk_set_root_widget_cmd(
*errstr = "Invalid number of arguments.\n";
return 1;
}
- widget = ltk_get_widget(window, tokens[1], LTK_WIDGET, errstr);
+ widget = ltk_get_widget(tokens[1], LTK_WIDGET, errstr);
if (!widget) return 1;
window->root_widget = widget;
int w = widget->rect.w;
@@ -444,9 +453,7 @@ ltk_fatal(const char *format, ...) {
va_start(args, format);
print_log("Fatal", format, args);
va_end(args);
- ltk_cleanup_nongui();
- if (main_window)
- ltk_cleanup_gui(main_window);
+ ltk_cleanup();
exit(1);
};
@@ -594,8 +601,6 @@ ltk_create_window(const char *title, int x, int y, unsigned int w, unsigned int
window->dirty_rect.x = 0;
window->dirty_rect.y = 0;
- window->widget_hash = kh_init(widget);
-
XClearWindow(window->dpy, window->xwindow);
XMapRaised(window->dpy, window->xwindow);
XSelectInput(window->dpy, window->xwindow,
@@ -607,17 +612,21 @@ ltk_create_window(const char *title, int x, int y, unsigned int w, unsigned int
}
static void
-ltk_destroy_window(ltk_window *window) {
+ltk_destroy_widget_hash(void) {
khint_t k;
ltk_widget *ptr;
- XDestroyWindow(window->dpy, window->xwindow);
- for (k = kh_begin(window->widget_hash); k != kh_end(window->widget_hash); k++) {
- if (kh_exist(window->widget_hash, k)) {
- ptr = kh_value(window->widget_hash, k);
+ for (k = kh_begin(widget_hash); k != kh_end(widget_hash); k++) {
+ if (kh_exist(widget_hash, k)) {
+ ptr = kh_value(widget_hash, k);
ptr->destroy(ptr, 1);
}
}
- kh_destroy(widget, window->widget_hash);
+ kh_destroy(widget, widget_hash);
+}
+
+static void
+ltk_destroy_window(ltk_window *window) {
+ XDestroyWindow(window->dpy, window->xwindow);
ltk_cleanup_text();
XCloseDisplay(window->dpy);
if (window->theme.font)
@@ -696,8 +705,8 @@ ltk_window_remove_active_widget(ltk_window *window) {
}
void
-ltk_window_set_active_widget(ltk_window *window, ltk_widget *widget) {
- window->active_widget = widget;
+ltk_window_set_active_widget(ltk_widget *widget) {
+ widget->window->active_widget = widget;
ltk_widget *parent = widget->parent;
widget->state = LTK_ACTIVE;
while (parent) {
@@ -795,7 +804,7 @@ ltk_widget_motion_notify_event(ltk_widget *widget, XEvent event) {
/* FIXME: do this properly */
if (widget->window->active_widget != widget && !widget->motion_notify) {
ltk_window_remove_active_widget(widget->window);
- ltk_window_set_active_widget(widget->window, widget);
+ ltk_window_set_active_widget(widget);
}
if (widget->needs_redraw)
ltk_window_invalidate_rect(widget->window, widget->rect);
@@ -831,26 +840,25 @@ ltk_handle_event(ltk_window *window, XEvent event) {
}
int
-ltk_widget_id_free(ltk_window *window, const char *id) {
+ltk_widget_id_free(const char *id) {
khint_t k;
- k = kh_get(widget, window->widget_hash, id);
- if (k != kh_end(window->widget_hash)) {
+ k = kh_get(widget, widget_hash, id);
+ if (k != kh_end(widget_hash)) {
return 0;
}
return 1;
}
ltk_widget *
-ltk_get_widget(ltk_window *window, const char *id, ltk_widget_type type,
- char **errstr) {
+ltk_get_widget(const char *id, ltk_widget_type type, char **errstr) {
khint_t k;
ltk_widget *widget;
- k = kh_get(widget, window->widget_hash, id);
- if (k == kh_end(window->widget_hash)) {
+ k = kh_get(widget, widget_hash, id);
+ if (k == kh_end(widget_hash)) {
*errstr = "Widget with given ID doesn't exist.\n";
return NULL;
}
- widget = kh_value(window->widget_hash, k);
+ widget = kh_value(widget_hash, k);
if (type != LTK_WIDGET && widget->type != type) {
*errstr = "Widget with given ID has wrong type.\n";
return NULL;
@@ -859,7 +867,7 @@ ltk_get_widget(ltk_window *window, const char *id, ltk_widget_type type,
}
void
-ltk_set_widget(ltk_window *window, ltk_widget *widget, const char *id) {
+ltk_set_widget(ltk_widget *widget, const char *id) {
int ret;
khint_t k;
/* apparently, khash requires the string to stay accessible */
@@ -867,16 +875,16 @@ ltk_set_widget(ltk_window *window, ltk_widget *widget, const char *id) {
char *tmp = strdup(id);
if (!tmp)
ltk_fatal_errno("Unable to add widget to hash table.\n");
- k = kh_put(widget, window->widget_hash, tmp, &ret);
- kh_value(window->widget_hash, k) = widget;
+ k = kh_put(widget, widget_hash, tmp, &ret);
+ kh_value(widget_hash, k) = widget;
}
void
-ltk_remove_widget(ltk_window *window, const char *id) {
+ltk_remove_widget(const char *id) {
khint_t k;
- k = kh_get(widget, window->widget_hash, id);
- if (k != kh_end(window->widget_hash)) {
- kh_del(widget, window->widget_hash, k);
+ k = kh_get(widget, widget_hash, id);
+ if (k != kh_end(widget_hash)) {
+ kh_del(widget, widget_hash, k);
}
}
diff --git a/text.h b/text.h
@@ -1,6 +1,3 @@
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <stdint.h>
#include "defs.h"
#include "color.h"
diff --git a/text_line.h b/text_line.h
@@ -26,7 +26,7 @@
/*
Requires the following includes:
-<X11/Xlib.h>, <X11/Xutil.h>, <stdint.h>, "text_common.h",
+<X11/Xlib.h>, <X11/Xutil.h>, <stdint.h>
*/
typedef struct {
diff --git a/text_pango.c b/text_pango.c
@@ -2,13 +2,17 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
+#include <stdarg.h>
+
+#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
-#include <X11/Xos.h>
+
#include <pango/pangoxft.h>
+
+#include "ltk.h"
#include "util.h"
#include "text.h"
-#include "ltk.h"
struct LtkTextLine {
char *text;
diff --git a/text_stb.c b/text_stb.c
@@ -25,14 +25,19 @@
#include <stdlib.h>
#include <stdint.h>
#include <limits.h>
+#include <stdarg.h>
+
#include <X11/Xlib.h>
#include <X11/Xutil.h>
-#include "stb_truetype.h" /* http://nothings.org/stb/stb_truetype.h */
-#include "khash.h"
+
#include <fontconfig/fontconfig.h>
+
+#include "khash.h"
+#include "stb_truetype.h" /* http://nothings.org/stb/stb_truetype.h */
+
+#include "ltk.h"
#include "util.h"
#include "text.h"
-#include "ltk.h"
typedef struct {
stbtt_fontinfo info;