/* This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FVWM_H #define FVWM_H /**************************************************************************** * This module is based on Twm, but has been siginificantly modified * by Rob Nation ****************************************************************************/ /*****************************************************************************/ /** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ /** Salt Lake City, Utah **/ /** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ /** Cambridge, Massachusetts **/ /** **/ /** All Rights Reserved **/ /** **/ /** Permission to use, copy, modify, and distribute this software and **/ /** its documentation for any purpose and without fee is hereby **/ /** granted, provided that the above copyright notice appear in all **/ /** copies and that both that copyright notice and this permis- **/ /** sion notice appear in supporting documentation, and that the **/ /** names of Evans & Sutherland and M.I.T. not be used in advertising **/ /** in publicity pertaining to distribution of the software without **/ /** specific, written prior permission. **/ /** **/ /** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ /** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ /** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ /** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ /** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ /** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ /** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ /** OR PERFORMANCE OF THIS SOFTWARE. **/ /*****************************************************************************/ /*********************************************************************** * fvwm include file ***********************************************************************/ /* * Fvwm trivia: There were 97 commands in the fvwm command table * when the F_CMD_ARGS macro was written. * dje 12/19/98. */ #include #include #include #include #include #include "window_flags.h" /* Macro for args passed to fvwm commands... */ #define F_CMD_ARGS XEvent *eventp, Window w, FvwmWindow *tmp_win,\ unsigned long context,char *action, int *Module #define F_PASS_ARGS eventp, w, tmp_win, context, action, Module #define F_EXEC_ARGS char *action, FvwmWindow *tmp_win, XEvent *eventp,\ unsigned long context, int Module #define F_PASS_EXEC_ARGS action, tmp_win, eventp, context, *Module #define FUNC_FLAGS_TYPE unsigned char typedef struct { /* pointer to the event that caused the function */ XEvent *eventp; /* the fvwm window structure */ struct FvwmWindow *tmp_win; /* the action to execute */ char *action; char **args; /* the context in which the button was pressed */ unsigned long context; int module; /* If tmp_win is NULL, the is_window_unmanaged flag may be set along with * this field to indicate the function should run with an unmanaged window. */ Window win; struct { FUNC_FLAGS_TYPE exec; unsigned do_save_tmpwin : 1; unsigned is_window_unmanaged : 1; } flags; } exec_func_args_type; /* Allow GCC extensions to work, if you have GCC */ #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ # define __attribute__(x) # endif /* The __-protected variants of `format' and `printf' attributes are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) # define __format__ format # define __printf__ printf # endif #endif #ifndef WithdrawnState #define WithdrawnState 0 #endif #if RETSIGTYPE != void #define SIGNAL_RETURN return 0 #else #define SIGNAL_RETURN return #endif #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #define NULLSTR ((char *) NULL) /* For 1 style statement, there can be any number of IconBoxes. The name list points at the first one in the chain. */ typedef struct icon_boxes_struct { struct icon_boxes_struct *next; /* next icon_boxes or zero */ unsigned int use_count; int IconBox[4]; /* x/y x/y for iconbox */ int IconScreen; /* Xinerama screen */ short IconGrid[2]; /* x incr, y incr */ char IconSign[4]; /* because of -0, need to save */ unsigned is_orphan : 1; unsigned IconFlags : 3; /* some bits */ /* IconFill only takes 3 bits. Defaults are top, left, vert co-ord first */ /* eg: t l = 0,0,0; l t = 0,0,1; b r = 1,1,0 */ #define ICONFILLBOT (1<<0) #define ICONFILLRGT (1<<1) #define ICONFILLHRZ (1<<2) } icon_boxes; typedef struct { Pixel fore; Pixel back; } ColorPair; typedef struct { Pixel fore; Pixel back; Pixel hilight; Pixel shadow; } color_quad; #ifdef USEDECOR struct FvwmDecor; /* definition in screen.h */ #endif typedef struct { /* common flags (former flags in bits 0-12) */ unsigned is_sticky : 1; unsigned has_icon_font : 1; unsigned has_window_font : 1; /* static flags that do not change dynamically after the window has been * created */ struct { unsigned do_circulate_skip : 1; unsigned do_circulate_skip_icon : 1; unsigned do_circulate_skip_shaded : 1; unsigned do_grab_focus_when_created : 1; unsigned do_grab_focus_when_transient_created : 1; unsigned do_iconify_window_groups : 1; unsigned do_ignore_gnome_hints : 1; unsigned do_ignore_icon_boxes : 1; unsigned do_ignore_restack : 1; unsigned do_use_window_group_hint : 1; unsigned do_lower_transient : 1; unsigned do_not_show_on_map : 1; unsigned do_not_pass_click_focus_click : 1; unsigned do_not_raise_click_focus_click : 1; unsigned do_raise_mouse_focus_click : 1; unsigned do_raise_transient : 1; unsigned do_resize_opaque : 1; unsigned do_shrink_windowshade : 1; unsigned do_stack_transient_parent : 1; unsigned do_start_iconic : 1; unsigned do_window_list_skip : 1; #define FOCUS_MOUSE 0x0 #define FOCUS_CLICK 0x1 #define FOCUS_SLOPPY 0x2 #define FOCUS_NEVER 0x3 #define FOCUS_MASK 0x3 unsigned focus_mode : 2; unsigned has_bottom_title : 1; unsigned has_depressable_border : 1; unsigned has_mwm_border : 1; unsigned has_mwm_buttons : 1; unsigned has_mwm_override : 1; unsigned has_no_icon_title : 1; unsigned has_override_size : 1; unsigned has_stippled_title : 1; unsigned icon_override : 2; #define NO_ACTIVE_ICON_OVERRIDE 0 #define ICON_OVERRIDE 1 #define NO_ICON_OVERRIDE 2 #define ICON_OVERRIDE_MASK 3 unsigned is_fixed : 1; unsigned is_icon_sticky : 1; unsigned is_icon_suppressed : 1; unsigned is_lenient : 1; unsigned use_icon_position_hint : 1; } s; } common_flags_type; typedef struct { common_flags_type common; unsigned does_wm_delete_window : 1; unsigned does_wm_take_focus : 1; unsigned do_delete_icon_moved : 1; /* delete is_icon_moved flag after * evaluating it for the first time */ unsigned do_iconify_after_map : 1; unsigned do_reuse_destroyed : 1; /* Reuse this struct, don't free it, * when destroying/recapturing window. */ unsigned has_border : 1; /* Is this decorated with border*/ unsigned has_icon_changed : 1; /* Icon change is pending */ unsigned has_title : 1; /* Is this decorated with title */ unsigned is_decor_changed : 1; /* ChangeDecor was used for window */ unsigned is_deiconify_pending : 1; /* Sent an XUnmapWindow for deiconifying, * but didn't receive a UnmapNotify yet.*/ unsigned is_focused_on_other_desk : 1; /* window had the focus when the desk * was switched. */ /* set if the window was mapped and got focused but the focus change was not * announced to the modules yet. */ unsigned is_focus_change_broadcast_pending : 1; unsigned is_fully_visible : 1; /* is the window fully visible */ unsigned is_iconified : 1; /* is it an icon now? */ unsigned is_iconified_by_parent : 1; /* To prevent iconified transients in a * parent icon from counting for Next */ unsigned is_icon_entered : 1; /* is the pointer over the icon? */ unsigned is_icon_font_loaded : 1; unsigned is_icon_moved : 1; /* has the icon been moved by the user? */ unsigned is_icon_ours : 1; /* is the icon window supplied by the app? */ unsigned is_icon_shaped : 1; /* is the icon shaped? */ unsigned is_icon_unmapped : 1; /* was the icon unmapped, even though the * window is still iconified (Transients) */ unsigned is_in_transient_subtree : 1; /* temporary flag used in stack.c */ unsigned is_mapped : 1; /* is it mapped? */ unsigned is_map_pending : 1; /* Sent an XMapWindow, but didn't receive a * MapNotify yet.*/ unsigned is_maximized : 1; /* is the window maximized? */ unsigned is_name_changed : 1; /* Set if the client changes its WM_NAME. * The source of twm contains an explanation * why we need this information. */ unsigned is_partially_visible : 1; /* is the window partially visible */ unsigned is_pixmap_ours : 1; /* is the icon pixmap ours to free? */ unsigned is_placed_wb3 : 1; unsigned is_placed_by_fvwm : 1; /* fvwm2 place the window itself */ unsigned is_scheduled_for_destroy : 1; /* mark window to be destroyed after * last complex func has finished. */ unsigned is_scheduled_for_raise : 1; /* mark window to be raised after * function execution. */ unsigned is_size_inc_set : 1; unsigned is_style_deleted : 1; unsigned is_transient : 1; /* is it a transient window? */ unsigned is_window_drawn_once : 1; unsigned is_viewport_moved : 1; /* To prevent double move in MoveViewport.*/ unsigned is_window_being_moved_opaque : 1; unsigned is_window_border_drawn : 1; /* 0 at first, set to 1 after border has * been drawn once */ unsigned is_window_font_loaded : 1; unsigned is_window_shaded : 1; unsigned using_default_icon_font : 1; unsigned using_default_window_font : 1; #define ICON_HINT_NEVER 0 #define ICON_HINT_ONCE 1 #define ICON_HINT_MULTIPLE 2 unsigned was_icon_hint_provided : 2; unsigned was_icon_name_provided : 1; } window_flags; /* Window mask for Circulate and Direction functions */ typedef struct WindowConditionMask { struct { unsigned do_accept_focus : 1; unsigned needs_current_desk : 1; unsigned needs_current_page : 1; unsigned needs_current_global_page : 1; unsigned needs_name : 1; unsigned needs_not_name : 1; unsigned use_circulate_hit : 1; unsigned use_circulate_hit_icon : 1; unsigned use_circulate_hit_shaded : 1; unsigned use_do_accept_focus : 1; } my_flags; window_flags flags; window_flags flag_mask; char *name; int layer; } WindowConditionMask; /* only style.c and add_window.c are allowed to access this struct!! */ typedef struct { common_flags_type common; unsigned do_decorate_transient : 1; /* old placement flags */ #define PLACE_DUMB 0x0 #define PLACE_SMART 0x1 #define PLACE_CLEVER 0x2 #define PLACE_CLEVERNESS_MASK 0x3 #define PLACE_RANDOM 0x4 /* new placements value, try to get a minimal backward compatibility with * the old flags: Dumb+Active=Manual, Dumb+Random=Cascade, Smart+Random= * TileCascade, Smart+Active=TileManual, Random+Smart+Clever=MINOVERLAP * which is the original Clever placement code, Active+Smart+Clever= * MINOVERLAPPERCENT which is the "new" Clever placement code and was * the original Clever placement code. Now the original placement code * said: Active/Random+Dumb+Clever=Active/Random+Dumb (with Dumb Clever * is ignored); These represent the not use value: 0x2=Active+Dumb+Clever, * 0x6=Random+Dumb+Clever */ #define PLACE_MANUAL 0x0 #define PLACE_TILEMANUAL 0x1 #define PLACE_MANUAL_B 0x2 #define PLACE_MINOVERLAPPERCENT 0x3 #define PLACE_CASCADE 0x4 #define PLACE_TILECASCADE 0x5 #define PLACE_CASCADE_B 0x6 #define PLACE_MINOVERLAP 0x7 #define PLACE_MASK 0x7 unsigned placement_mode : 3; unsigned do_save_under : 1; unsigned do_start_lowered : 1; unsigned has_border_width : 1; unsigned has_color_back : 1; unsigned has_color_fore : 1; unsigned has_color_back_hi : 1; unsigned has_color_fore_hi : 1; unsigned has_decor : 1; unsigned has_handle_width : 1; unsigned has_icon : 1; unsigned has_icon_boxes : 1; unsigned has_max_window_size : 1; unsigned has_window_shade_steps : 1; #ifdef MINI_ICONS unsigned has_mini_icon : 1; #endif unsigned has_mwm_decor : 1; unsigned has_mwm_functions : 1; unsigned has_no_border : 1; unsigned has_no_title : 1; unsigned has_ol_decor : 1; #if 0 unsigned has_condition_mask : 1; #endif unsigned is_button_disabled : NUMBER_OF_BUTTONS; #define BACKINGSTORE_DEFAULT 0 #define BACKINGSTORE_ON 1 #define BACKINGSTORE_OFF 2 #define BACKINGSTORE_MASK 0x3 unsigned use_backing_store : 2; unsigned use_parent_relative : 1; unsigned use_colorset : 1; unsigned use_colorset_hi : 1; unsigned use_border_colorset : 1; unsigned use_border_colorset_hi : 1; unsigned use_layer : 1; unsigned use_no_pposition : 1; unsigned use_no_usposition : 1; unsigned use_no_transient_pposition : 1; unsigned use_no_transient_usposition : 1; unsigned use_start_on_desk : 1; unsigned use_start_on_page_for_transient : 1; unsigned use_start_on_screen : 1; unsigned manual_placement_honors_starts_on_page : 1; unsigned capture_honors_starts_on_page : 1; unsigned recapture_honors_starts_on_page : 1; } style_flags; /* only style.c and add_window.c are allowed to access this struct!! */ typedef struct window_style { struct window_style *next; struct window_style *prev; char *name; #if 0 WindowConditionMask *condition_mask; #endif char *icon_name; #ifdef MINI_ICONS char *mini_icon_name; #endif #ifdef USEDECOR char *decor_name; #endif char *icon_font; char *window_font; char *fore_color_name; char *back_color_name; char *fore_color_name_hi; char *back_color_name_hi; int colorset; int colorset_hi; int border_colorset; int border_colorset_hi; short border_width; short handle_width; /* resize handle width */ int layer; int start_desk; int start_page_x; int start_page_y; int start_screen; int max_window_width; int max_window_height; int shade_anim_steps; icon_boxes *icon_boxes; style_flags flags; style_flags flag_mask; style_flags change_mask; unsigned has_style_changed : 1; } window_style; /* for each window that is on the display, one of these structures * is allocated and linked into a list */ typedef struct FvwmWindow { char *name; /* name of the window */ char *icon_name; /* name of the icon */ #ifdef I18N_MB char **name_list; /* window name list */ char **icon_name_list; /* icon name list */ #endif struct FvwmWindow *next; /* next fvwm window */ struct FvwmWindow *prev; /* prev fvwm window */ struct FvwmWindow *stack_next; /* next (lower) fvwm window in stacking * order*/ struct FvwmWindow *stack_prev; /* prev (higher) fvwm window in stacking * order */ Window w; /* the child window */ int old_bw; /* border width before reparenting */ Window frame; /* the frame window */ Window decor_w; /* parent of decoration windows */ Window Parent; /* Ugly Ugly Ugly - it looks like you * HAVE to reparent the app window into * a window whose size = app window, * or else you can't keep xv and matlab * happy at the same time! */ Window title_w; /* the title bar window */ Window sides[4]; Window corners[4]; /* Corner pieces */ window_flags flags; int nr_left_buttons; int nr_right_buttons; Window button_w[NUMBER_OF_BUTTONS]; #define BUTTON_INDEX(b) (((b) == 0) ? (NUMBER_OF_BUTTONS - 1) : ((b) - 1)) #ifdef USEDECOR struct FvwmDecor *decor; #endif Window icon_w; /* the icon window */ Window icon_pixmap_w; /* the icon window */ int wShaped; /* is this a shaped window */ Pixmap title_background_pixmap; Pixmap button_background_pixmap[NUMBER_OF_BUTTONS]; short boundary_width; short corner_width; short visual_corner_width; rectangle title_g; short title_top_height; /* title height/0 for top/bottom titles */ rectangle icon_g; /* geometry of the icon window */ short icon_border_width; int icon_xl_loc; /* icon label window x coordinate */ int icon_t_width; /* width of the icon title window */ int icon_p_width; /* width of the icon pixmap window */ int icon_p_height; /* height of the icon pixmap window */ Pixmap iconPixmap; /* pixmap for the icon */ int iconDepth; /* Drawable depth for the icon */ Pixmap icon_maskPixmap; /* pixmap for the icon mask */ FvwmFont title_font; FvwmFont icon_font; XWindowAttributes attr; /* the child window attributes */ XSizeHints hints; /* normal hints */ XWMHints *wmhints; /* WM hints */ XClassHint class; int Desk; /* Tells which desktop this window is on */ int FocusDesk; /* Where (if at all) was it focussed */ int DeIconifyDesk; /* Desk to deiconify to, for StubbornIcons */ Window transientfor; #ifdef MINI_ICONS char *mini_pixmap_file; Picture *mini_icon; #endif char *icon_bitmap_file; rectangle frame_g; rectangle normal_g; /* absolute geometry when not maximized */ rectangle max_g; /* maximized window geometry */ size_rect max_g_defect; /* defect between maximized geometry before and * after constraining size. */ position max_offset; /* original delta between normalized and * maximized window, used to keep unmaximized * window at same screen position */ int *mwm_hints; int ol_hints; int functions; Window *cmap_windows; /* Colormap windows property */ int number_cmap_windows; /* Should generally be 0 */ color_quad colors; color_quad hicolors; color_quad border_colors; color_quad border_hicolors; unsigned long buttons; icon_boxes *IconBoxes; /* zero or more iconboxes */ int default_layer; int layer; int max_window_width; int max_window_height; int shade_anim_steps; unsigned char grabbed_buttons; #define FM_NO_INPUT 0 #define FM_PASSIVE 1 #define FM_LOCALLY_ACTIVE 2 #define FM_GLOBALLY_ACTIVE 3 unsigned char focus_model; unsigned char initial_backing_store; /* multi purpose scratch structure */ struct { void *p; int i; } scratch; } FvwmWindow; /* include this down here because FvwmWindows must be defined when including * this header file. */ #include "fvwmdebug.h" void SetMWM_INFO(Window window); #endif /* _FVWM_ */