1 /* -*-c-*- */
2 #ifndef IN_FVWMICONMAN_H
3 #define IN_FVWMICONMAN_H
4 
5 #include <assert.h>
6 #include <stdio.h>
7 
8 #include "libs/ftime.h"
9 
10 #include <X11/Xlib.h>
11 #include <X11/Intrinsic.h>
12 
13 #include "libs/fvwmlib.h"
14 #include "libs/Flocale.h"
15 #include "libs/Picture.h"
16 #include "libs/Colorset.h"
17 #include "libs/Bindings.h"
18 #include "libs/charmap.h"
19 #include "libs/modifiers.h"
20 
21 #include "debug.h"
22 #include "fvwm/fvwm.h"
23 #include "libs/vpacket.h"
24 #include "libs/FTips.h"
25 
26 #ifndef DEFAULT_ACTION
27 #define DEFAULT_ACTION "Iconify"
28 #endif
29 
30 #define MAX_ARGS 3
31 
32 #ifdef TRACE_MEMUSE
33 
34 #define MALLOC_MAGIC 0xdeadbeaf
35 
36 #define SET_BIT(field,bit)   ((field) |= (bit))
37 #define CLEAR_BIT(field,bit) ((field) &= ~(bit))
38 
39 #define SET_BIT_TO_VAL(field,bit,val) ((val) ? SET_BIT (field,bit) : CLEAR_BIT (field, bit))
40 
41 extern long MemUsed;
42 
43 struct malloc_header {
44 	unsigned long magic, len;
45 };
46 
47 #endif
48 
49 #ifdef HAVE_DMALLOC_H
50 #include <dmalloc.h>
51 #endif
52 
53 extern void PrintMemuse(void);
54 
55 typedef unsigned long Ulong;
56 typedef unsigned char Uchar;
57 
58 typedef signed char Schar;
59 
60 typedef enum {
61 	SHOW_GLOBAL,
62 	SHOW_DESKTOP,
63 	SHOW_PAGE,
64 	SHOW_SCREEN,
65 	NO_SHOW_DESKTOP,  /* "!desk" Show windows not on the current desk */
66 	NO_SHOW_PAGE,     /* "!page" Show windows not on the current page */
67 	NO_SHOW_SCREEN,   /* "!screen" Show windows not on the current screen */
68 } Resolution;
69 
70 typedef enum {
71 	REVERSE_NONE,
72 	REVERSE_ICON,
73 	REVERSE_NORMAL,
74 } Reverse;
75 
76 typedef enum {
77 	BUTTON_FLAT,
78 	BUTTON_UP,
79 	BUTTON_DOWN,
80 	BUTTON_EDGEUP,
81 	BUTTON_EDGEDOWN,
82 } ButtonState;
83 
84 /* The clicks must be the first three elements in this type, X callbacks
85 	depend on it! */
86 typedef enum {
87 	SELECT,
88 	MOUSE,
89 	KEYPRESS,
90 	NUM_ACTIONS
91 } Action;
92 
93 
94 typedef enum {
95 	DEFAULT = 0,
96 	FOCUS_CONTEXT = 1,
97 	SELECT_CONTEXT = 2,
98 	/* had better be FOCUS_CONTEXT | SELECT_CONTEXT */
99 	FOCUS_SELECT_CONTEXT = 3,
100 	PLAIN_CONTEXT = 4,
101 	TITLE_CONTEXT = 5,
102 	ICON_CONTEXT = 6,
103 	ICON_SELECT_CONTEXT = 7,
104 	NUM_CONTEXTS
105 } Contexts;
106 
107 typedef enum {
108 	NO_NAME       = 0,
109 	TITLE_NAME    = 1,
110 	ICON_NAME     = 2,
111 	RESOURCE_NAME = 4,
112 	CLASS_NAME    = 8,
113 	ALL_NAME      = 15
114 } NameType;
115 
116 typedef struct win_list {
117 	int n;
118 	struct win_data *head, *tail;
119 } WinList;
120 
121 typedef struct string_list {
122 	NameType type;
123 	char *string;
124 	struct string_list *next;
125 } StringEl;
126 
127 typedef struct {
128 	Uchar mask;
129 	StringEl *list;
130 } StringList;
131 
132 typedef enum {
133 	NoArg,
134 	IntArg,
135 	StringArg,
136 	ButtonArg,
137 	WindowArg,
138 	ManagerArg,
139 	JmpArg
140 } BuiltinArgType;
141 
142 typedef enum {
143 	NoButton,
144 	SelectButton,
145 	FocusButton,
146 	AbsoluteButton,
147 	UpButton,
148 	DownButton,
149 	LeftButton,
150 	RightButton,
151 	NextButton,
152 	PrevButton,
153 } ButtonType; /* doubles for manager too */
154 
155 typedef struct {
156 	int offset;
157 	ButtonType base;
158 } ButtonValue;
159 
160 typedef struct builtin_arg {
161 	BuiltinArgType type;
162 	union {
163 		char *string_value;
164 		ButtonValue button_value;
165 		int int_value;
166 	} value;
167 } BuiltinArg;
168 
169 typedef struct Function {
170 	int (*func)(int numargs, BuiltinArg *args);
171 	int numargs;
172 	BuiltinArg args[MAX_ARGS];
173 	struct Function *next;
174 	struct Function *prev;
175 } Function;
176 
177 typedef struct win_data {
178 	struct button *button;
179 	/* stuff shadowed in the Button structure */
180 	FvwmPicture pic;
181 	FvwmPicture old_pic;
182 	Uchar iconified, state;
183 
184 	Ulong desknum;
185 	long x, y, width, height;
186 	rectangle icon_g;
187 	rectangle real_g; /* geometry of the client possibliy shaded */
188 	Ulong app_id;
189 	/* Ulong fvwm_flags; */
190 	window_flags flags;
191 	struct win_data *win_prev, *win_next;
192 	struct win_manager *manager;
193 	int app_id_set : 1;
194 	int geometry_set : 1;
195 	Uchar complete;
196 
197 	/* this data must be freed */
198 	char *display_string; /* what gets shown in the manager window */
199 	char *resname;
200 	char *classname;
201 	char *titlename;
202 	char *iconname;
203 	char *visible_name;
204 	char *visible_icon_name;
205 } WinData;
206 
207 #define WINDATA_ICONIFIED(win) ((win)->iconified)
208 
209 typedef struct button {
210 	int index;      /* index into button array */
211 	int x, y, w, h; /* current coords of button */
212 	struct {
213 		int dirty_flags;
214 		FvwmPicture pic;
215 		WinData *win;
216 		char *display_string;
217 		int x, y, w, h;
218 		Uchar iconified, state;
219 		int ex, ey, ew, eh; /* expose damage relatively the main win */
220 	} drawn_state;
221 } Button;
222 
223 typedef struct button_array {
224 	int dirty_flags;
225 	int num_buttons, drawn_num_buttons; /* size of buttons array */
226 	int num_windows, drawn_num_windows; /* number of windows with buttons */
227 	Button **buttons;
228 } ButtonArray;
229 
230 typedef enum {
231 	GROW_HORIZ = 1,
232 	GROW_VERT  = 2,
233 	GROW_UP    = 4,
234 	GROW_DOWN  = 8,
235 	GROW_LEFT  = 16,
236 	GROW_RIGHT = 32,
237 	GROW_FIXED = 64,
238 } GrowDirection;
239 
240 typedef struct {
241 	/* Things which we can change go in here.
242 	 * Things like border width go in WinManager */
243 	int x, y, width, height;
244 	int gravity_x, gravity_y; /* anchor point for window's gravity */
245 	unsigned int rows, cols;
246 	int boxheight, boxwidth;
247 	GrowDirection dir;
248 } ManGeometry;
249 
250 typedef struct {
251 	int num_rects;
252 	XRectangle rects[2];
253 } ShapeState;
254 
255 typedef enum {
256 	SortNone,          /* no sorting */
257 	SortId,            /* sort by window id */
258 	SortName,          /* case insensitive name sorting */
259 	SortNameCase,      /* case sensitive name sorting */
260 	SortWeighted,      /* custom sort order */
261 } SortType;
262 
263 typedef struct {
264 	char *resname;
265 	char *classname;
266 	char *titlename;
267 	char *iconname;
268 	int weight;
269 } WeightedSort;
270 
271 typedef struct win_manager {
272 	unsigned int magic;
273 	int index;
274 
275 	/* .fvwm2rc options or things set as a result of options */
276 	Resolution res;
277 	Reverse rev;
278 	Pixel backcolor[NUM_CONTEXTS], forecolor[NUM_CONTEXTS];
279 	Pixel hicolor[NUM_CONTEXTS], shadowcolor[NUM_CONTEXTS];
280 	GC hiContext[NUM_CONTEXTS], backContext[NUM_CONTEXTS],
281 		reliefContext[NUM_CONTEXTS];
282 	GC shadowContext[NUM_CONTEXTS], flatContext[NUM_CONTEXTS];
283 	FlocaleFont *FButtonFont;
284 	int draw_icons;
285 	int shaped;
286 	StringList show;
287 	StringList dontshow;
288 	Binding *bindings[NUM_ACTIONS];
289 	char *fontname;
290 	int colorsets[NUM_CONTEXTS];
291 	Pixmap pixmap[NUM_CONTEXTS];
292 	char *backColorName[NUM_CONTEXTS];
293 	char *foreColorName[NUM_CONTEXTS];
294 	ButtonState buttonState[NUM_CONTEXTS];
295 	char *geometry_str, *button_geometry_str;
296 	int max_button_width;
297 	int max_button_width_columns;
298 	char *titlename, *iconname;
299 	char *formatstring;
300 	NameType format_depend;
301 	Uchar followFocus;
302 	Uchar usewinlist;
303 	SortType sort;
304 	WeightedSort *weighted_sorts;
305 	int weighted_sorts_len, weighted_sorts_size;
306 	char *AnimCommand;
307 	Uchar showonlyiconic;
308   	Uchar showonlyfocused;
309 	Uchar shownoiconic;
310 	Uchar showtransient;
311 	rectangle managed_g;    /* dimensions of managed screen portion */
312 	int relief_thickness;	/* relief thickness for each non-flat button */
313 #define TIPS_NEVER  0
314 #define TIPS_ALWAYS 1
315 #define TIPS_NEEDED 2
316 	int tips;
317 	char *tips_fontname;
318 	char *tips_formatstring;
319 	ftips_config *tips_conf;
320 
321 	/* X11 state */
322 	Window theWindow, theFrame;
323 	long sizehints_flags;
324 	int gravity;
325 	int fontheight, fontwidth;
326 	int win_title, win_border;
327 	int off_x, off_y;
328 	Uchar cursor_in_window;
329 	Uchar window_up;
330 	Uchar can_draw;  /* = 0 until we get our first ConfigureNotify */
331 
332 	/* button state */
333 	int dirty_flags;
334 	ManGeometry geometry, drawn_geometry;
335 	Button *select_button, *focus_button, *tipped_button;
336 	Uchar window_mapped, drawn_mapping;
337 	ShapeState shape, drawn_shape;
338 	ButtonArray buttons;
339 
340 	/* fvwm state */
341 	int we_are_drawing, configures_expected;
342 	Bool swallowed;
343 	Window swallower_win;
344 	struct
345 	{
346 		unsigned is_shaded : 1;
347 		unsigned needs_resize_after_unshade : 1;
348 	} flags;
349 } WinManager;
350 
351 #define MANAGER_EMPTY(man) ((man)->buttons.num_windows == 0)
352 
353 typedef struct {
354 	Ulong desknum;
355 	Ulong x, y;             /* of the view window */
356 	WinManager *managers;
357 	int num_managers;
358 	int transient;
359 	WinData *focus_win;
360 	WinData *select_win;
361 	int got_window_list;
362 } GlobalData;
363 
364 typedef struct {
365 	char *name;
366 	ButtonState state;
367 	char *forecolor[2]; /* 0 is mono, 1 is color */
368 	char *backcolor[2]; /* 0 is mono, 1 is color */
369 } ContextDefaults;
370 
371 
372 extern char *contextNames[NUM_CONTEXTS];
373 
374 extern GlobalData globals;
375 extern int fvwm_fd[2];
376 extern int x_fd;
377 extern Display *theDisplay;
378 extern char *MyName;
379 extern char *Module;
380 extern int ModuleLen;
381 extern ContextDefaults contextDefaults[];
382 extern int mods_unused;
383 
384 extern void ReadFvwmPipe(void);
385 extern void Free (void *p);
386 extern void ShutMeDown (int flag) __attribute__ ((__noreturn__));
387 extern RETSIGTYPE DeadPipe (int nothing);
388 extern char *copy_string (char **target, const char *src);
389 
390 extern void init_globals (void);
391 extern int allocate_managers (int num);
392 extern int expand_weighted_sorts (void);
393 
394 extern WinData *new_windata (void);
395 extern void free_windata (WinData *p);
396 extern int check_win_complete (WinData *p);
397 int check_resolution(WinManager *man, WinData *win);
398 extern WinManager *figure_win_manager (WinData *win, Uchar mask);
399 extern void init_winlists (void);
400 extern void delete_win_hashtab (WinData *win);
401 extern void insert_win_hashtab (WinData *win);
402 extern WinData *find_win_hashtab (Ulong id);
403 extern void walk_hashtab (void (*func)(void *));
404 extern int accumulate_walk_hashtab (int (*func)(void *));
405 extern void print_stringlist (StringList *list);
406 extern void add_to_stringlist (StringList *list, char *s);
407 extern void update_window_stuff (WinManager *man);
408 extern void print_managers (void);
409 
410 extern WinManager *find_windows_manager (Window win);
411 extern int win_in_viewport (WinData *win);
412 extern WinData *id_to_win(Ulong id);
413 
414 #endif /* IN_FVWMICONMAN_H */
415