00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <xcb/xcb.h>
00012 #include <err.h>
00013
00014 #include "data.h"
00015
00016 #ifndef _UTIL_H
00017 #define _UTIL_H
00018
00019 #define die(...) errx(EXIT_FAILURE, __VA_ARGS__);
00020 #define exit_if_null(pointer, ...) { if (pointer == NULL) die(__VA_ARGS__); }
00021 #define STARTS_WITH(string, needle) (strncasecmp(string, needle, strlen(needle)) == 0)
00022 #define CIRCLEQ_NEXT_OR_NULL(head, elm, field) (CIRCLEQ_NEXT(elm, field) != CIRCLEQ_END(head) ? \
00023 CIRCLEQ_NEXT(elm, field) : NULL)
00024 #define CIRCLEQ_PREV_OR_NULL(head, elm, field) (CIRCLEQ_PREV(elm, field) != CIRCLEQ_END(head) ? \
00025 CIRCLEQ_PREV(elm, field) : NULL)
00026 #define FOR_TABLE(workspace) \
00027 for (int cols = 0; cols < (workspace)->cols; cols++) \
00028 for (int rows = 0; rows < (workspace)->rows; rows++)
00029 #define FREE(pointer) do { \
00030 if (pointer != NULL) { \
00031 free(pointer); \
00032 pointer = NULL; \
00033 } \
00034 } \
00035 while (0)
00036
00037 TAILQ_HEAD(keyvalue_table_head, keyvalue_element);
00038 extern struct keyvalue_table_head by_parent;
00039 extern struct keyvalue_table_head by_child;
00040
00041 int min(int a, int b);
00042 int max(int a, int b);
00043
00049 bool update_if_necessary(uint32_t *destination, const uint32_t new_value);
00050
00056 void *smalloc(size_t size);
00057
00063 void *scalloc(size_t size);
00064
00070 char *sstrdup(const char *str);
00071
00076 bool table_put(struct keyvalue_table_head *head, uint32_t key, void *value);
00077
00083 void *table_remove(struct keyvalue_table_head *head, uint32_t key);
00084
00090 void *table_get(struct keyvalue_table_head *head, uint32_t key);
00091
00102 void start_application(const char *command);
00103
00109 void check_error(xcb_connection_t *conn, xcb_void_cookie_t cookie,
00110 char *err_message);
00111
00119 char *convert_utf8_to_ucs2(char *input, int *real_strlen);
00120
00126 Client *get_last_focused_client(xcb_connection_t *conn, Container *container,
00127 Client *exclude);
00128
00135 void set_focus(xcb_connection_t *conn, Client *client, bool set_anyways);
00136
00142 void leave_stack_mode(xcb_connection_t *conn, Container *container);
00143
00149 void switch_layout_mode(xcb_connection_t *conn, Container *container, int mode);
00150
00157 Client *get_matching_client(xcb_connection_t *conn,
00158 const char *window_classtitle, Client *specific);
00159
00160
00161
00162
00163
00164
00165 void i3_restart();
00166
00167 #if defined(__OpenBSD__)
00168
00169 void *memmem(const void *l, size_t l_len, const void *s, size_t s_len);
00170 #endif
00171
00172 #endif