1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-19 20:38:08 +01:00
Files
wmaker/src/WindowMaker.h
Carlos R. Mafra 5da2fcb7e3 apercu: Make preview size a configuration option
Since the resolution of the Retina display tends to make everything small,
the default apercu preview size (twice the icon size) couldn't be used to
distinguish the window contents without tiring too much my eyes.

Therefore, let's make the apercu size a configurable option. You can set
it through the ApercuSize variable with

$ wdwrite WindowMaker ApercuSize 4

in multiples of the icon size (in this case the apercu size will be four
times the icon size).

The default size remains 2 (twice the icon size).
2014-08-20 18:11:37 +01:00

656 lines
19 KiB
C

/*
* Window Maker window manager
*
* Copyright (c) 1997-2003 Alfredo K. Kojima
*
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef WINDOWMAKER_H_
#define WINDOWMAKER_H_
#include "wconfig.h"
#include <assert.h>
#include <limits.h>
#include <WINGs/WINGs.h>
/* class codes */
typedef enum {
WCLASS_UNKNOWN = 0,
WCLASS_WINDOW = 1, /* managed client windows */
WCLASS_MENU = 2, /* root menus */
WCLASS_APPICON = 3,
WCLASS_DUMMYWINDOW = 4, /* window that holds window group leader */
WCLASS_MINIWINDOW = 5,
WCLASS_DOCK_ICON = 6,
WCLASS_PAGER = 7,
WCLASS_TEXT_INPUT = 8,
WCLASS_FRAME = 9
} WClassType;
/*
* generic window levels (a superset of the N*XTSTEP ones)
* Applications should use levels between WMDesktopLevel and
* WMScreensaverLevel anything boyond that range is allowed,
* but discouraged.
*/
enum {
WMBackLevel = INT_MIN+1, /* Very lowest level */
WMDesktopLevel = -1000, /* Lowest level of normal use */
WMSunkenLevel = -1,
WMNormalLevel = 0,
WMFloatingLevel = 3,
WMDockLevel = 5,
WMSubmenuLevel = 15,
WMMainMenuLevel = 20,
WMStatusLevel = 21,
WMModalLevel = 100,
WMPopUpLevel = 101,
WMScreensaverLevel = 1000,
WMOuterSpaceLevel = INT_MAX
};
/*
* WObjDescriptor will be used by the event dispatcher to
* send events to a particular object through the methods in the
* method table. If all objects of the same class share the
* same methods, the class method table should be used, otherwise
* a new method table must be created for each object.
* It is also assigned to find the parent structure of a given
* window (like the WWindow or WMenu for a button)
*/
typedef struct WObjDescriptor {
void *self; /* the object that will be called */
/* event handlers */
void (*handle_expose)(struct WObjDescriptor *sender, XEvent *event);
void (*handle_mousedown)(struct WObjDescriptor *sender, XEvent *event);
void (*handle_enternotify)(struct WObjDescriptor *sender, XEvent *event);
void (*handle_leavenotify)(struct WObjDescriptor *sender, XEvent *event);
WClassType parent_type; /* type code of the parent */
void *parent; /* parent object (WWindow or WMenu) */
} WObjDescriptor;
/* internal buttons */
#define WBUT_CLOSE 0
#define WBUT_BROKENCLOSE 1
#define WBUT_ICONIFY 2
#define WBUT_KILL 3
#ifdef XKB_BUTTON_HINT
#define WBUT_XKBGROUP1 4
#define WBUT_XKBGROUP2 5
#define WBUT_XKBGROUP3 6
#define WBUT_XKBGROUP4 7
#define PRED_BPIXMAPS 8 /* reserved for 4 groups */
#else
#define PRED_BPIXMAPS 4 /* count of WBUT icons */
#endif /* XKB_BUTTON_HINT */
/* Mouse cursors */
typedef enum {
WCUR_NORMAL,
WCUR_MOVE,
WCUR_RESIZE,
WCUR_TOPLEFTRESIZE,
WCUR_TOPRIGHTRESIZE,
WCUR_BOTTOMLEFTRESIZE,
WCUR_BOTTOMRIGHTRESIZE,
WCUR_VERTICALRESIZE,
WCUR_HORIZONRESIZE,
WCUR_WAIT,
WCUR_ARROW,
WCUR_QUESTION,
WCUR_TEXT,
WCUR_SELECT,
WCUR_ROOT,
WCUR_EMPTY,
/* Count of the number of cursors defined */
WCUR_LAST
} w_cursor;
/* geometry displays */
#define WDIS_NEW 0 /* new style */
#define WDIS_CENTER 1 /* center of screen */
#define WDIS_TOPLEFT 2 /* top left corner of screen */
#define WDIS_FRAME_CENTER 3 /* center of the frame */
#define WDIS_NONE 4
/* keyboard input focus mode */
#define WKF_CLICK 0
#define WKF_SLOPPY 2
/* colormap change mode */
#define WCM_CLICK 0
#define WCM_POINTER 1
/* window placement mode */
#define WPM_MANUAL 0
#define WPM_CASCADE 1
#define WPM_SMART 2
#define WPM_RANDOM 3
#define WPM_AUTO 4
#define WPM_CENTER 5
/* text justification */
#define WTJ_CENTER 0
#define WTJ_LEFT 1
#define WTJ_RIGHT 2
/* iconification styles */
#define WIS_ZOOM 0
#define WIS_TWIST 1
#define WIS_FLIP 2
#define WIS_NONE 3
#define WIS_RANDOM 4 /* secret */
/* switchmenu actions */
#define ACTION_ADD 0
#define ACTION_REMOVE 1
#define ACTION_CHANGE 2
#define ACTION_CHANGE_WORKSPACE 3
#define ACTION_CHANGE_STATE 4
/* speeds */
#define SPEED_ULTRAFAST 0
#define SPEED_FAST 1
#define SPEED_MEDIUM 2
#define SPEED_SLOW 3
#define SPEED_ULTRASLOW 4
/* window states */
#define WS_FOCUSED 0
#define WS_UNFOCUSED 1
#define WS_PFOCUSED 2
/* clip title colors */
#define CLIP_NORMAL 0
#define CLIP_COLLAPSED 1
/* icon yard position */
#define IY_VERT 1
#define IY_HORIZ 0
#define IY_TOP 2
#define IY_BOTTOM 0
#define IY_RIGHT 4
#define IY_LEFT 0
/* menu styles */
#define MS_NORMAL 0
#define MS_SINGLE_TEXTURE 1
#define MS_FLAT 2
/* workspace actions */
#define WA_NONE 0
#define WA_SELECT_WINDOWS 1
#define WA_OPEN_APPMENU 2
#define WA_OPEN_WINLISTMENU 3
#define WA_SWITCH_WORKSPACES 4
/* workspace display position */
#define WD_NONE 0
#define WD_CENTER 1
#define WD_TOP 2
#define WD_BOTTOM 3
#define WD_TOPLEFT 4
#define WD_TOPRIGHT 5
#define WD_BOTTOMLEFT 6
#define WD_BOTTOMRIGHT 7
/* titlebar style */
#define TS_NEW 0
#define TS_OLD 1
#define TS_NEXT 2
/* workspace border position */
#define WB_NONE 0
#define WB_LEFTRIGHT 1
#define WB_TOPBOTTOM 2
#define WB_ALLDIRS (WB_LEFTRIGHT|WB_TOPBOTTOM)
/* program states */
typedef enum {
WSTATE_NORMAL = 0,
WSTATE_NEED_EXIT = 1,
WSTATE_NEED_RESTART = 2,
WSTATE_EXITING = 3,
WSTATE_RESTARTING = 4,
WSTATE_MODAL = 5,
WSTATE_NEED_REREAD = 6
} wprog_state;
#define WCHECK_STATE(chk_state) (w_global.program.state == (chk_state))
#define WCHANGE_STATE(nstate) {\
if (w_global.program.state == WSTATE_NORMAL\
|| (nstate) != WSTATE_MODAL) \
w_global.program.state = (nstate); \
if (w_global.program.signal_state != 0)\
w_global.program.state = w_global.program.signal_state;\
}
/* only call inside signal handlers, with signals blocked */
#define SIG_WCHANGE_STATE(nstate) {\
w_global.program.signal_state = (nstate);\
w_global.program.state = (nstate);\
}
/* Flags for the Window Maker state when restarting/crash situations */
#define WFLAGS_NONE (0)
#define WFLAGS_CRASHED (1<<0)
/* notifications */
#ifdef MAINFILE
#define NOTIFICATION(n) const char WN##n [] = #n
#else
#define NOTIFICATION(n) extern const char WN##n []
#endif
NOTIFICATION(WindowAppearanceSettingsChanged);
NOTIFICATION(IconAppearanceSettingsChanged);
NOTIFICATION(IconTileSettingsChanged);
NOTIFICATION(MenuAppearanceSettingsChanged);
NOTIFICATION(MenuTitleAppearanceSettingsChanged);
/* appearance settings clientdata flags */
enum {
WFontSettings = 1 << 0,
WTextureSettings = 1 << 1,
WColorSettings = 1 << 2
};
typedef struct {
int x1, y1;
int x2, y2;
} WArea;
typedef struct WCoord {
int x, y;
} WCoord;
extern struct WPreferences {
char *pixmap_path; /* : separated list of paths to find pixmaps */
char *icon_path; /* : separated list of paths to find icons */
WMArray *fallbackWMs; /* fallback window manager list */
char *logger_shell; /* shell to log child stdi/o */
RImage *button_images; /* titlebar button images */
char smooth_workspace_back;
signed char size_display; /* display type for resize geometry */
signed char move_display; /* display type for move geometry */
signed char window_placement; /* window placement mode */
signed char colormap_mode; /* colormap focus mode */
signed char focus_mode; /* window focusing mode */
char opaque_move; /* update window position during move */
char opaque_resize; /* update window position during resize */
char opaque_move_resize_keyboard; /* update window position during move,resize with keyboard */
char wrap_menus; /* wrap menus at edge of screen */
char scrollable_menus; /* let them be scrolled */
char vi_key_menus; /* use h/j/k/l to select */
char align_menus; /* align menu with their parents */
char use_saveunders; /* turn on SaveUnders for menus, icons etc. */
char no_window_over_dock;
char no_window_over_icons;
WCoord window_place_origin; /* Offset for windows placed on screen */
char constrain_window_size; /* don't let windows get bigger than screen */
char windows_cycling; /* windoze cycling */
char circ_raise; /* raise window after Alt-tabbing */
char ignore_focus_click;
char open_transients_with_parent; /* open transient window in same workspace as parent */
signed char title_justification; /* titlebar text alignment */
int window_title_clearance;
int window_title_min_height;
int window_title_max_height;
int menu_title_clearance;
int menu_title_min_height;
int menu_title_max_height;
int menu_text_clearance;
char multi_byte_text;
#ifdef KEEP_XKB_LOCK_STATUS
char modelock;
#endif
char no_dithering; /* use dithering or not */
char no_animations; /* enable/disable animations */
char no_autowrap; /* wrap workspace when window is moved to the edge */
char highlight_active_app; /* show the focused app by highlighting its icon */
char auto_arrange_icons; /* automagically arrange icons */
char icon_box_position; /* position to place icons */
signed char iconification_style; /* position to place icons */
char disable_root_mouse; /* disable button events in root window */
char auto_focus; /* focus window when it's mapped */
char *icon_back_file; /* background image for icons */
WCoord *root_menu_pos; /* initial position of the root menu*/
WCoord *app_menu_pos;
WCoord *win_menu_pos;
signed char icon_yard; /* aka iconbox */
int raise_delay; /* delay for autoraise. 0 is disabled */
int cmap_size; /* size of dithering colormap in colors per channel */
int icon_size; /* size of the icon */
signed char menu_style; /* menu decoration style */
signed char workspace_name_display_position;
unsigned int modifier_mask; /* mask to use as kbd modifier */
char *modifier_labels[7]; /* Names of the modifiers */
unsigned int supports_tiff; /* Use tiff files */
char ws_advance; /* Create new workspace and advance */
char ws_cycle; /* Cycle existing workspaces */
char save_session_on_exit; /* automatically save session on exit */
char sticky_icons; /* If miniwindows will be onmipresent */
char dont_confirm_kill; /* do not confirm Kill application */
char disable_miniwindows;
char dont_blink; /* do not blink icon selection */
/* Appearance options */
char new_style; /* Use newstyle buttons */
char superfluous; /* Use superfluous things */
/* root window mouse bindings */
signed char mouse_button1; /* action for left mouse button */
signed char mouse_button2; /* action for middle mouse button */
signed char mouse_button3; /* action for right mouse button */
signed char mouse_wheel; /* action for mouse wheel */
/* balloon text */
char window_balloon;
char miniwin_title_balloon;
char miniwin_apercu_balloon;
char appicon_balloon;
char help_balloon;
/* some constants */
int dblclick_time; /* double click delay time in ms */
/* animate menus */
signed char menu_scroll_speed; /* how fast menus are scrolled */
/* animate icon sliding */
signed char icon_slide_speed; /* icon slide animation speed */
/* shading animation */
signed char shade_speed;
/* bouncing animation */
char bounce_appicons_when_urgent;
char raise_appicons_when_bouncing;
char do_not_make_appicons_bounce;
int edge_resistance;
int resize_increment;
char attract;
unsigned int workspace_border_size; /* Size in pixels of the workspace border */
char workspace_border_position; /* Where to leave a workspace border */
char single_click; /* single click to lauch applications */
int history_lines; /* history of "Run..." dialog */
char cycle_active_head_only; /* Cycle only windows on the active head */
char cycle_ignore_minimized; /* Ignore minimized windows when cycling */
char strict_windoze_cycle; /* don't close switch panel when shift is released */
char panel_only_open; /* Only open the switch panel; don't switch */
char apercu_size; /* Size of apercu preview as a multiple of icon size */
/* All delays here are in ms. 0 means instant auto-action. */
int clip_auto_raise_delay; /* Delay after which the clip will be raised when entered */
int clip_auto_lower_delay; /* Delay after which the clip will be lowered when leaved */
int clip_auto_expand_delay; /* Delay after which the clip will expand when entered */
int clip_auto_collapse_delay; /* Delay after which the clip will collapse when leaved */
RImage *swtileImage;
RImage *swbackImage[9];
int show_clip_title;
struct {
unsigned int nodock:1; /* don't display the dock */
unsigned int noclip:1; /* don't display the clip */
unsigned int clip_merged_in_dock:1; /* disable clip, dock gets its workspace switching functionality */
unsigned int nodrawer:1; /* don't use drawers */
unsigned int wrap_appicons_in_dock:1; /* Whether to wrap appicons when Dock is moved up and down */
unsigned int noupdates:1; /* don't require ~/GNUstep (-static) */
unsigned int noautolaunch:1; /* don't autolaunch apps */
unsigned int norestore:1; /* don't restore session */
#ifndef HAVE_INOTIFY
unsigned int nopolling:1; /* don't poll the defaults database for changes */
#endif
unsigned int restarting:2;
} flags; /* internal flags */
/* Map table between w_cursor and actual X id */
Cursor cursor[WCUR_LAST];
} wPreferences;
/****** Global Variables ******/
extern Display *dpy;
extern struct wmaker_global_variables {
/* Tracking of the state of the program */
struct {
wprog_state state;
wprog_state signal_state;
} program;
/* locale to use. NULL==POSIX or C */
const char *locale;
/* Tracking of X events timestamps */
struct {
/* ts of the last event we received */
Time last_event;
/* ts on the last time we did XSetInputFocus() */
Time focus_change;
} timestamp;
/* Global Domains, for storing dictionaries */
struct {
/* Note: you must #include <defaults.h> if you want to use them */
struct WDDomain *wmaker;
struct WDDomain *window_attr;
struct WDDomain *root_menu;
} domain;
/* Screens related */
int screen_count;
/* Workspace related */
struct {
struct WWorkspace **array; /* data for the workspaces */
int count; /* number of workspaces */
int current; /* current workspace number */
int last_used; /* last used workspace number */
WMFont *font_for_name; /* used during workspace switch */
/*
* Ignore Workspace Change:
* this variable is used to prevent workspace switch while certain
* operations are ongoing.
*/
Bool ignore_change;
/* Menus */
struct WMenu *menu; /* workspace operation */
struct WMenu *submenu; /* workspace list for window_menu */
} workspace;
/* Clip related */
struct {
struct WAppIcon *icon; /* The clip main icon, or the dock's, if they are merged */
struct WMenu *menu; /* Menu for clips */
struct WMenu *submenu; /* Workspace list for clips */
struct WMenu *opt_menu; /* Options for Clip */
struct WMenu *ws_menu; /* workspace menu for clip */
} clip;
/* Dock related */
struct {
struct WMenu *pos_menu; /* menu for position of the dock */
struct WMenu *drawer_menu; /* menu for the drawers */
} dock;
#ifdef HAVE_INOTIFY
struct {
int fd_event_queue; /* Inotify's queue file descriptor */
int wd_defaults; /* Watch Descriptor for the 'Defaults' configuration file */
} inotify;
#endif
/* definition for X Atoms */
struct {
/* Window-Manager related */
struct {
Atom state;
Atom change_state;
Atom protocols;
Atom take_focus;
Atom delete_window;
Atom save_yourself;
Atom client_leader;
Atom colormap_windows;
Atom colormap_notify;
Atom ignore_focus_events;
} wm;
/* GNUStep related */
struct {
Atom wm_attr;
Atom wm_miniaturize_window;
Atom wm_resizebar;
Atom titlebar_state;
} gnustep;
/* WindowMaker specific */
struct {
Atom menu;
Atom wm_protocols;
Atom state;
Atom wm_function;
Atom noticeboard;
Atom command;
Atom icon_size;
Atom icon_tile;
} wmaker;
} atom;
/* X Contexts */
struct {
XContext client_win;
XContext app_win;
XContext stack;
} context;
/* X Extensions */
struct {
#ifdef USE_XSHAPE
struct {
Bool supported;
int event_base;
} shape;
#endif
#ifdef KEEP_XKB_LOCK_STATUS
struct {
Bool supported;
int event_base;
} xkb;
#endif
#ifdef USE_RANDR
struct {
Bool supported;
int event_base;
} randr;
#endif
/*
* If no extension were activated, we would end up with an empty
* structure, which old compilers may not appreciate, so let's
* work around this with a simple:
*/
int dummy;
} xext;
/* Session related */
WMPropList *session_state;
/* Keyboard and shortcuts */
struct {
/*
* Bit-mask to hide special key modifiers which we don't want to
* impact the shortcuts (typically: CapsLock, NumLock, ScrollLock)
*/
unsigned int modifiers_mask;
WMArray *windows[MAX_WINDOW_SHORTCUTS];
} shortcut;
/* Application related */
struct WAppIcon *app_icon_list; /* list of all aplication icons */
} w_global;
/****** Notifications ******/
extern const char WMNManaged[];
extern const char WMNUnmanaged[];
extern const char WMNChangedWorkspace[];
extern const char WMNChangedState[];
extern const char WMNChangedFocus[];
extern const char WMNChangedStacking[];
extern const char WMNChangedName[];
extern const char WMNWorkspaceCreated[];
extern const char WMNWorkspaceDestroyed[];
extern const char WMNWorkspaceChanged[];
extern const char WMNWorkspaceNameChanged[];
extern const char WMNResetStacking[];
#endif