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