X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Futil.h;h=064a4792d8cb4a4635352a5bfae91ac51ee10e90;hb=fb9978b97533c5987f9af428ce58f6f0733e5ff5;hp=4100089bdb6e78c09fe63efd6608497a28631fe3;hpb=fcc5ce516b6bf7e2ff63052e10018f8fef47f838;p=i3%2Fi3 diff --git a/include/util.h b/include/util.h index 4100089b..064a4792 100644 --- a/include/util.h +++ b/include/util.h @@ -3,18 +3,20 @@ * * i3 - an improved dynamic tiling window manager * - * (c) 2009 Michael Stapelberg and contributors + * © 2009 Michael Stapelberg and contributors * * See file LICENSE for license information. * */ #include +#include #include "data.h" #ifndef _UTIL_H #define _UTIL_H +#define die(...) errx(EXIT_FAILURE, __VA_ARGS__); #define exit_if_null(pointer, ...) { if (pointer == NULL) die(__VA_ARGS__); } #define STARTS_WITH(string, needle) (strncasecmp(string, needle, strlen(needle)) == 0) #define CIRCLEQ_NEXT_OR_NULL(head, elm, field) (CIRCLEQ_NEXT(elm, field) != CIRCLEQ_END(head) ? \ @@ -22,37 +24,106 @@ #define CIRCLEQ_PREV_OR_NULL(head, elm, field) (CIRCLEQ_PREV(elm, field) != CIRCLEQ_END(head) ? \ CIRCLEQ_PREV(elm, field) : NULL) #define FOR_TABLE(workspace) \ - for (int cols = 0; cols < workspace->cols; cols++) \ - for (int rows = 0; rows < workspace->rows; rows++) + for (int cols = 0; cols < (workspace)->cols; cols++) \ + for (int rows = 0; rows < (workspace)->rows; rows++) #define FREE(pointer) do { \ - if (pointer == NULL) { \ + if (pointer != NULL) { \ free(pointer); \ pointer = NULL; \ } \ } \ while (0) -/* ##__VA_ARGS__ means: leave out __VA_ARGS__ completely if it is empty, that is, - delete the preceding comma */ -#define LOG(fmt, ...) slog("%s:%s:%d - " fmt, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) - +#define CALL(obj, member, ...) obj->member(obj, ## __VA_ARGS__) int min(int a, int b); int max(int a, int b); -void slog(char *fmt, ...); -void die(char *fmt, ...); +bool rect_contains(Rect rect, uint32_t x, uint32_t y); +Rect rect_add(Rect a, Rect b); + +/** + * Updates *destination with new_value and returns true if it was changed or false + * if it was the same + * + */ +bool update_if_necessary(uint32_t *destination, const uint32_t new_value); + +/** + * Safe-wrapper around malloc which exits if malloc returns NULL (meaning that + * there is no more memory available) + * + */ void *smalloc(size_t size); + +/** + * Safe-wrapper around calloc which exits if malloc returns NULL (meaning that + * there is no more memory available) + * + */ void *scalloc(size_t size); + +/** + * Safe-wrapper around realloc which exits if realloc returns NULL (meaning + * that there is no more memory available). + * + */ +void *srealloc(void *ptr, size_t size); + +/** + * Safe-wrapper around strdup which exits if malloc returns NULL (meaning that + * there is no more memory available) + * + */ char *sstrdup(const char *str); + +/** + * Starts the given application by passing it through a shell. We use double + * fork to avoid zombie processes. As the started application’s parent exits + * (immediately), the application is reparented to init (process-id 1), which + * correctly handles childs, so we don’t have to do it :-). + * + * The shell is determined by looking for the SHELL environment variable. If + * it does not exist, /bin/sh is used. + * + */ void start_application(const char *command); -void check_error(xcb_connection_t *conn, xcb_void_cookie_t cookie, char *err_message); + +/** + * Checks a generic cookie for errors and quits with the given message if + * there was an error. + * + */ +void check_error(xcb_connection_t *conn, xcb_void_cookie_t cookie, + char *err_message); + +/** + * Converts the given string to UCS-2 big endian for use with + * xcb_image_text_16(). The amount of real glyphs is stored in real_strlen, a + * buffer containing the UCS-2 encoded string (16 bit per glyph) is + * returned. It has to be freed when done. + * + */ char *convert_utf8_to_ucs2(char *input, int *real_strlen); -void remove_client_from_container(xcb_connection_t *conn, Client *client, Container *container); -void set_focus(xcb_connection_t *conn, Client *client); -void leave_stack_mode(xcb_connection_t *conn, Container *container); -void switch_layout_mode(xcb_connection_t *conn, Container *container, int mode); -void warp_pointer_into(xcb_connection_t *conn, Client *client); -void toggle_fullscreen(xcb_connection_t *conn, Client *client); -void kill_window(xcb_connection_t *conn, Client *window); + +/* + * This function resolves ~ in pathnames. + * It may resolve wildcards in the first part of the path, but if no match + * or multiple matches are found, it just returns a copy of path as given. + * + */ +char *resolve_tilde(const char *path); + +/* + * Checks if the given path exists by calling stat(). + * + */ +bool path_exists(const char *path); + +/* + * Restart i3 in-place + * appends -a to argument list to disable autostart + * + */ +void i3_restart(bool forget_layout); #endif