aboutsummaryrefslogtreecommitdiffstats
path: root/src/defs.h
blob: 142dcac2a269e8bfecefc8992911fcb3d03595e0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#pragma once
#include <X11/Xlib.h>
#define VERSION "tilite ver. 1.0"
#define AUTHOR "(C) Lance Borden 2026"
#define LICENSE "Licensed under the GPL v3.0"

#define MF_MIN 0.05f
#define MF_MAX 0.95f
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define UDIST(a, b) abs((int)(a) - (int)(b))
#define CLAMP(x, lo, hi) (((x) < (lo)) ? (lo) : ((x) > (hi)) ? (hi) : (x))

#define MAX_BINDS 256
#define MAX_CLIENTS 99
#define MAX_SCRATCHPADS 32
#define MAX_ITEMS 256
#define MIN_WINDOW_SIZE 20
#define PATH_MAX 4096

/* workspaces */
#define TYPE_WS_CHANGE 0
#define TYPE_WS_MOVE 1
/* fn/cmd */
#define TYPE_FUNC 2
#define TYPE_CMD 3

#define NUM_WORKSPACES 9
#define WORKSPACE_NAMES                                                        \
	"1"                                                                        \
	"\0"                                                                       \
	"2"                                                                        \
	"\0"                                                                       \
	"3"                                                                        \
	"\0"                                                                       \
	"4"                                                                        \
	"\0"                                                                       \
	"5"                                                                        \
	"\0"                                                                       \
	"6"                                                                        \
	"\0"                                                                       \
	"7"                                                                        \
	"\0"                                                                       \
	"8"                                                                        \
	"\0"                                                                       \
	"9"                                                                        \
	"\0"

typedef enum { DRAG_NONE, DRAG_MOVE, DRAG_RESIZE, DRAG_SWAP } DragMode;
typedef void (*event_t)(XEvent *);

typedef union {
	const char **cmd;
	void (*fn)(void);
	int ws;
} action_t;

typedef struct {
	int mods;
	KeySym keysym;
	KeyCode keycode;
	action_t action;
	int type;
} binding_t;

typedef struct client_t {
	Window win;
	int x, y, w, h;
	int orig_x, orig_y, orig_w, orig_h;
	int ws;
	Bool fixed;
	Bool floating;
	Bool fullscreen;
	Bool mapped;
	pid_t pid;
	struct client_t *next;
} client_t;

typedef struct {
	int modkey;
	int gaps;
	int border_width;
	long border_foc_col;
	long border_ufoc_col;
	long border_swap_col;
	int motion_throttle;
	int snap_distance;
	int n_binds;
	int move_window_amt;
	int resize_window_amt;
	Bool new_win_focus;
	Bool warp_cursor;
	Bool floating_on_top;
	binding_t binds[MAX_ITEMS];
	char *to_run[MAX_ITEMS];
} config_t;

typedef struct {
	const char *name;
	void (*fn)(void);
} command_t;

typedef enum {
	ATOM_NET_ACTIVE_WINDOW,
	ATOM_NET_CURRENT_DESKTOP,
	ATOM_NET_SUPPORTED,
	ATOM_NET_WM_STATE,
	ATOM_NET_WM_STATE_FULLSCREEN,
	ATOM_WM_STATE,
	ATOM_NET_WM_WINDOW_TYPE,
	ATOM_NET_WORKAREA,
	ATOM_WM_DELETE_WINDOW,
	ATOM_NET_WM_STRUT,
	ATOM_NET_WM_STRUT_PARTIAL,
	ATOM_NET_SUPPORTING_WM_CHECK,
	ATOM_NET_WM_NAME,
	ATOM_UTF8_STRING,
	ATOM_NET_WM_DESKTOP,
	ATOM_NET_CLIENT_LIST,
	ATOM_NET_FRAME_EXTENTS,
	ATOM_NET_NUMBER_OF_DESKTOPS,
	ATOM_NET_DESKTOP_NAMES,
	ATOM_NET_WM_PID,
	ATOM_NET_WM_WINDOW_TYPE_DOCK,
	ATOM_NET_WM_WINDOW_TYPE_UTILITY,
	ATOM_NET_WM_WINDOW_TYPE_DIALOG,
	ATOM_NET_WM_WINDOW_TYPE_TOOLBAR,
	ATOM_NET_WM_WINDOW_TYPE_SPLASH,
	ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU,
	ATOM_NET_WM_WINDOW_TYPE_MENU,
	ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU,
	ATOM_NET_WM_WINDOW_TYPE_TOOLTIP,
	ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION,
	ATOM_NET_WM_STATE_MODAL,
	ATOM_WM_PROTOCOLS,
	ATOM_COUNT
} atom_type_t;

const char **build_argv(const char *cmd);
client_t *add_client(Window w, int ws);
void apply_fullscreen(client_t *c, Bool on);
void change_workspace(int ws);
int check_parent(pid_t p, pid_t c);
int clean_mask(int mask);
void close_focused(void);
client_t *find_client(Window w);
Window find_toplevel(Window w);
void focus_next(void);
void focus_prev(void);
pid_t get_parent_process(pid_t c);
pid_t get_pid(Window w);
int get_workspace_for_window(Window w);
void grab_button(Mask button, Mask mod, Window w, Bool owner_events,
				 Mask masks);
void grab_keys(void);
void hdl_button(XEvent *xev);
void hdl_button_release(XEvent *xev);
void hdl_client_msg(XEvent *xev);
void hdl_config_ntf(XEvent *xev);
void hdl_config_req(XEvent *xev);
void hdl_dummy(XEvent *xev);
void hdl_destroy_ntf(XEvent *xev);
void hdl_keypress(XEvent *xev);
void hdl_mapping_ntf(XEvent *xev);
void hdl_map_req(XEvent *xev);
void hdl_motion(XEvent *xev);
void hdl_property_ntf(XEvent *xev);
void hdl_unmap_ntf(XEvent *xev);
void init_defaults(void);
Bool is_child_proc(pid_t pid1, pid_t pid2);
void move_focused_next(void);
void move_focused_prev(void);
void move_to_workspace(int ws);
void move_win_down(void);
void move_win_left(void);
void move_win_right(void);
void move_win_up(void);
void other_wm(void);
int other_wm_err(Display *d, XErrorEvent *ee);
long parse_col(const char *hex);
void quit(void);
void resize_win_down(void);
void resize_win_left(void);
void resize_win_right(void);
void resize_win_up(void);
void run(void);
void scan_existing_windows(void);
void select_input(Window w, Mask masks);
void send_wm_take_focus(Window w);
void setup(void);
void setup_atoms(void);
void set_frame_extents(Window w);
void set_input_focus(client_t *c, Bool raise_win, Bool warp);
void set_wm_state(Window w, long state);
int snap_coordinate(int pos, int size, int screen_size, int snap_dist);
void spawn(const char *const *argv);
void swap_clients(client_t *a, client_t *b);
void tile(void);
void toggle_floating(void);
void toggle_floating_global(void);
void toggle_fullscreen(void);
void toggle_monocle(void);
void update_borders(void);
void update_client_desktop_properties(void);
void update_modifier_masks(void);
void update_net_client_list(void);
void update_struts(void);
void update_workarea(void);
void warp_cursor(client_t *c);
Bool window_has_ewmh_state(Window w, Atom state);
void window_set_ewmh_state(Window w, Atom state, Bool add);
int xerr(Display *d, XErrorEvent *ee);
void xev_case(XEvent *xev);