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