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