tornavis/source/blender/windowmanager/WM_types.h

682 lines
21 KiB
C

/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* 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.
*
* The Original Code is Copyright (C) 2007 Blender Foundation.
* All rights reserved.
*
*
* Contributor(s): Blender Foundation
*
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/windowmanager/WM_types.h
* \ingroup wm
*/
#ifndef __WM_TYPES_H__
#define __WM_TYPES_H__
/**
* Overview of WM structs
* ======================
*
* <pre>
* > wmWindowManager (window manager stores a list of windows)
* > > wmWindow (window has an active screen)
* > > > bScreen (link to ScrAreas via 'areabase')
* > > > > ScrArea (stores multiple spaces via space links via 'spacedata')
* > > > > > SpaceLink (base struct for space data for all different space types)
* > > > > ScrArea (stores multiple regions via 'regionbase')
* > > > > > ARegion
* </pre>
*
* Window Layout
* =============
*
* <pre>
* wmWindow -> bScreen
* +----------------------------------------------------------+
* |+-----------------------------------------+-------------+ |
* ||ScrArea (links to 3D view) |ScrArea | |
* ||+-------++----------+-------------------+|(links to | |
* |||ARegion|| |ARegion (quad view)|| properties) | |
* |||(tools)|| | || | |
* ||| || | || | |
* ||| || | || | |
* ||| || | || | |
* ||| |+----------+-------------------+| | |
* ||| || | || | |
* ||| || | || | |
* ||| || | || | |
* ||| || | || | |
* ||| || | || | |
* ||+-------++----------+-------------------+| | |
* |+-----------------------------------------+-------------+ |
* +----------------------------------------------------------+
* </pre>
*
* Space Data
* ==========
*
* <pre>
* ScrArea's store a list of space data (SpaceLinks), each of unique type.
* The first one is the displayed in the UI, others are added as needed.
*
* +----------------------------+ <-- sa->spacedata.first;
* | |
* | |---+ <-- other inactive SpaceLink's stored.
* | | |
* | | |---+
* | | | |
* | | | |
* | | | |
* | | | |
* +----------------------------+ | |
* | | |
* +-----------------------------+ |
* | |
* +------------------------------+
* </pre>
*
* A common way to get the space from the ScrArea:
* <pre>
* if (sa->spacetype == SPACE_VIEW3D) {
* View3D *v3d = sa->spacedata.first;
* ...
* }
* </pre>
*/
#ifdef __cplusplus
extern "C" {
#endif
struct bContext;
struct wmEvent;
struct wmWindowManager;
struct uiLayout;
struct wmOperator;
struct ImBuf;
#include "RNA_types.h"
#include "DNA_listBase.h"
#include "BLI_compiler_attrs.h"
/* exported types for WM */
#include "wm_cursors.h"
#include "wm_event_types.h"
/* ************** wmOperatorType ************************ */
/* flag */
#define OPTYPE_REGISTER 1 /* register operators in stack after finishing */
#define OPTYPE_UNDO 2 /* do undo push after after */
#define OPTYPE_BLOCKING 4 /* let blender grab all input from the WM (X11) */
#define OPTYPE_MACRO 8
#define OPTYPE_GRAB_POINTER 16 /* grabs the cursor and optionally enables continuous cursor wrapping */
#define OPTYPE_PRESET 32 /* show preset menu */
#define OPTYPE_INTERNAL 64 /* some operators are mainly for internal use
* and don't make sense to be accessed from the
* search menu, even if poll() returns true.
* currently only used for the search toolbox */
#define OPTYPE_LOCK_BYPASS 128 /* Allow operator to run when interface is locked */
/* context to call operator in for WM_operator_name_call */
/* rna_ui.c contains EnumPropertyItem's of these, keep in sync */
enum {
/* if there's invoke, call it, otherwise exec */
WM_OP_INVOKE_DEFAULT,
WM_OP_INVOKE_REGION_WIN,
WM_OP_INVOKE_REGION_CHANNELS,
WM_OP_INVOKE_REGION_PREVIEW,
WM_OP_INVOKE_AREA,
WM_OP_INVOKE_SCREEN,
/* only call exec */
WM_OP_EXEC_DEFAULT,
WM_OP_EXEC_REGION_WIN,
WM_OP_EXEC_REGION_CHANNELS,
WM_OP_EXEC_REGION_PREVIEW,
WM_OP_EXEC_AREA,
WM_OP_EXEC_SCREEN
};
/* ************** wmKeyMap ************************ */
/* modifier */
#define KM_SHIFT 1
#define KM_CTRL 2
#define KM_ALT 4
#define KM_OSKEY 8
/* means modifier should be pressed 2nd */
#define KM_SHIFT2 16
#define KM_CTRL2 32
#define KM_ALT2 64
#define KM_OSKEY2 128
/* KM_MOD_ flags for wmKeyMapItem and wmEvent.alt/shift/oskey/ctrl */
/* note that KM_ANY and KM_NOTHING are used with these defines too */
#define KM_MOD_FIRST 1
#define KM_MOD_SECOND 2
/* type: defined in wm_event_types.c */
#define KM_TEXTINPUT -2
/* val */
#define KM_ANY -1
#define KM_NOTHING 0
#define KM_PRESS 1
#define KM_RELEASE 2
#define KM_CLICK 3
#define KM_DBL_CLICK 4
/* ************** UI Handler ***************** */
#define WM_UI_HANDLER_CONTINUE 0
#define WM_UI_HANDLER_BREAK 1
/* ************** Notifiers ****************** */
typedef struct wmNotifier {
struct wmNotifier *next, *prev;
struct wmWindowManager *wm;
struct wmWindow *window;
int swinid; /* can't rely on this, notifiers can be added without context, swinid of 0 */
unsigned int category, data, subtype, action;
void *reference;
} wmNotifier;
/* 4 levels
*
* 0xFF000000; category
* 0x00FF0000; data
* 0x0000FF00; data subtype (unused?)
* 0x000000FF; action
*/
/* category */
#define NOTE_CATEGORY 0xFF000000
#define NC_WM (1<<24)
#define NC_WINDOW (2<<24)
#define NC_SCREEN (3<<24)
#define NC_SCENE (4<<24)
#define NC_OBJECT (5<<24)
#define NC_MATERIAL (6<<24)
#define NC_TEXTURE (7<<24)
#define NC_LAMP (8<<24)
#define NC_GROUP (9<<24)
#define NC_IMAGE (10<<24)
#define NC_BRUSH (11<<24)
#define NC_TEXT (12<<24)
#define NC_WORLD (13<<24)
#define NC_ANIMATION (14<<24)
#define NC_SPACE (15<<24)
#define NC_GEOM (16<<24)
#define NC_NODE (17<<24)
#define NC_ID (18<<24)
#define NC_LOGIC (19<<24)
#define NC_MOVIECLIP (20<<24)
#define NC_MASK (21<<24)
#define NC_GPENCIL (22<<24)
#define NC_LINESTYLE (23<<24)
#define NC_CAMERA (24<<24)
/* data type, 256 entries is enough, it can overlap */
#define NOTE_DATA 0x00FF0000
/* NC_WM windowmanager */
#define ND_FILEREAD (1<<16)
#define ND_FILESAVE (2<<16)
#define ND_DATACHANGED (3<<16)
#define ND_HISTORY (4<<16)
#define ND_JOB (5<<16)
#define ND_UNDO (6<<16)
/* NC_SCREEN screen */
#define ND_SCREENBROWSE (1<<16)
#define ND_SCREENDELETE (2<<16)
#define ND_SCREENCAST (3<<16)
#define ND_ANIMPLAY (4<<16)
#define ND_GPENCIL (5<<16)
#define ND_EDITOR_CHANGED (6<<16) /*sent to new editors after switching to them*/
#define ND_SCREENSET (7<<16)
#define ND_SKETCH (8<<16)
/* NC_SCENE Scene */
#define ND_SCENEBROWSE (1<<16)
#define ND_MARKERS (2<<16)
#define ND_FRAME (3<<16)
#define ND_RENDER_OPTIONS (4<<16)
#define ND_NODES (5<<16)
#define ND_SEQUENCER (6<<16)
#define ND_OB_ACTIVE (7<<16)
#define ND_OB_SELECT (8<<16)
#define ND_OB_VISIBLE (9<<16)
#define ND_OB_RENDER (10<<16)
#define ND_MODE (11<<16)
#define ND_RENDER_RESULT (12<<16)
#define ND_COMPO_RESULT (13<<16)
#define ND_KEYINGSET (14<<16)
#define ND_TOOLSETTINGS (15<<16)
#define ND_LAYER (16<<16)
#define ND_FRAME_RANGE (17<<16)
#define ND_TRANSFORM_DONE (18<<16)
#define ND_WORLD (92<<16)
#define ND_LAYER_CONTENT (101<<16)
/* NC_OBJECT Object */
#define ND_TRANSFORM (18<<16)
#define ND_OB_SHADING (19<<16)
#define ND_POSE (20<<16)
#define ND_BONE_ACTIVE (21<<16)
#define ND_BONE_SELECT (22<<16)
#define ND_DRAW (23<<16)
#define ND_MODIFIER (24<<16)
#define ND_KEYS (25<<16)
#define ND_CONSTRAINT (26<<16)
#define ND_PARTICLE (27<<16)
#define ND_POINTCACHE (28<<16)
#define ND_PARENT (29<<16)
#define ND_LOD (30<<16)
#define ND_DRAW_RENDER_VIEWPORT (31<<16) /* for camera & sequencer viewport update, also /w NC_SCENE */
/* NC_MATERIAL Material */
#define ND_SHADING (30<<16)
#define ND_SHADING_DRAW (31<<16)
#define ND_SHADING_LINKS (32<<16)
#define ND_SHADING_PREVIEW (33<<16)
/* NC_LAMP Lamp */
#define ND_LIGHTING (40<<16)
#define ND_LIGHTING_DRAW (41<<16)
#define ND_SKY (42<<16)
/* NC_WORLD World */
#define ND_WORLD_DRAW (45<<16)
/* NC_TEXT Text */
#define ND_CURSOR (50<<16)
#define ND_DISPLAY (51<<16)
/* NC_ANIMATION Animato */
#define ND_KEYFRAME (70<<16)
#define ND_KEYFRAME_PROP (71<<16)
#define ND_ANIMCHAN (72<<16)
#define ND_NLA (73<<16)
#define ND_NLA_ACTCHANGE (74<<16)
#define ND_FCURVES_ORDER (75<<16)
/* NC_GPENCIL */
#define ND_GPENCIL_EDITMODE (85<<16)
/* NC_GEOM Geometry */
/* Mesh, Curve, MetaBall, Armature, .. */
#define ND_SELECT (90<<16)
#define ND_DATA (91<<16)
#define ND_VERTEX_GROUP (92<<16)
/* NC_NODE Nodes */
/* NC_SPACE */
#define ND_SPACE_CONSOLE (1<<16) /* general redraw */
#define ND_SPACE_INFO_REPORT (2<<16) /* update for reports, could specify type */
#define ND_SPACE_INFO (3<<16)
#define ND_SPACE_IMAGE (4<<16)
#define ND_SPACE_FILE_PARAMS (5<<16)
#define ND_SPACE_FILE_LIST (6<<16)
#define ND_SPACE_NODE (7<<16)
#define ND_SPACE_OUTLINER (8<<16)
#define ND_SPACE_VIEW3D (9<<16)
#define ND_SPACE_PROPERTIES (10<<16)
#define ND_SPACE_TEXT (11<<16)
#define ND_SPACE_TIME (12<<16)
#define ND_SPACE_GRAPH (13<<16)
#define ND_SPACE_DOPESHEET (14<<16)
#define ND_SPACE_NLA (15<<16)
#define ND_SPACE_SEQUENCER (16<<16)
#define ND_SPACE_NODE_VIEW (17<<16)
#define ND_SPACE_CHANGED (18<<16) /*sent to a new editor type after it's replaced an old one*/
#define ND_SPACE_CLIP (19<<16)
/* subtype, 256 entries too */
#define NOTE_SUBTYPE 0x0000FF00
/* subtype scene mode */
#define NS_MODE_OBJECT (1<<8)
#define NS_EDITMODE_MESH (2<<8)
#define NS_EDITMODE_CURVE (3<<8)
#define NS_EDITMODE_SURFACE (4<<8)
#define NS_EDITMODE_TEXT (5<<8)
#define NS_EDITMODE_MBALL (6<<8)
#define NS_EDITMODE_LATTICE (7<<8)
#define NS_EDITMODE_ARMATURE (8<<8)
#define NS_MODE_POSE (9<<8)
#define NS_MODE_PARTICLE (10<<8)
/* subtype 3d view editing */
#define NS_VIEW3D_GPU (16<<8)
/* action classification */
#define NOTE_ACTION (0x000000FF)
#define NA_EDITED 1
#define NA_EVALUATED 2
#define NA_ADDED 3
#define NA_REMOVED 4
#define NA_RENAME 5
#define NA_SELECTED 6
#define NA_PAINTING 7
/* ************** Gesture Manager data ************** */
/* wmGesture->type */
#define WM_GESTURE_TWEAK 0
#define WM_GESTURE_LINES 1
#define WM_GESTURE_RECT 2
#define WM_GESTURE_CROSS_RECT 3
#define WM_GESTURE_LASSO 4
#define WM_GESTURE_CIRCLE 5
#define WM_GESTURE_STRAIGHTLINE 6
/* wmGesture is registered to window listbase, handled by operator callbacks */
/* tweak gesture is builtin feature */
typedef struct wmGesture {
struct wmGesture *next, *prev;
int event_type; /* event->type */
int mode; /* for modal callback */
int type; /* gesture type define */
int swinid; /* initial subwindow id where it started */
int points; /* optional, amount of points stored */
int size; /* optional, maximum amount of points stored */
void *customdata;
/* customdata for border is a recti */
/* customdata for circle is recti, (xmin, ymin) is center, xmax radius */
/* customdata for lasso is short array */
/* customdata for straight line is a recti: (xmin,ymin) is start, (xmax, ymax) is end */
/* free pointer to use for operator allocs (if set, its freed on exit)*/
void *userdata;
} wmGesture;
/* ************** wmEvent ************************ */
/* each event should have full modifier state */
/* event comes from eventmanager and from keymap */
typedef struct wmEvent {
struct wmEvent *next, *prev;
short type; /* event code itself (short, is also in keymap) */
short val; /* press, release, scrollvalue */
int x, y; /* mouse pointer position, screen coord */
int mval[2]; /* region mouse position, name convention pre 2.5 :) */
char utf8_buf[6]; /* from, ghost if utf8 is enabled for the platform,
* BLI_str_utf8_size() must _always_ be valid, check
* when assigning s we don't need to check on every access after */
char ascii; /* from ghost, fallback if utf8 isn't set */
char pad;
/* previous state, used for double click and the 'click' */
short prevtype;
short prevval;
int prevx, prevy;
double prevclicktime;
int prevclickx, prevclicky;
/* modifier states */
short shift, ctrl, alt, oskey; /* oskey is apple or windowskey, value denotes order of pressed */
short keymodifier; /* rawkey modifier */
/* set in case a KM_PRESS went by unhandled */
short check_click;
/* keymap item, set by handler (weak?) */
const char *keymap_idname;
/* tablet info, only use when the tablet is active */
struct wmTabletData *tablet_data;
/* custom data */
short custom; /* custom data type, stylus, 6dof, see wm_event_types.h */
short customdatafree;
int pad2;
void *customdata; /* ascii, unicode, mouse coords, angles, vectors, dragdrop info */
} wmEvent;
/* ************** custom wmEvent data ************** */
typedef struct wmTabletData {
int Active; /* 0=EVT_TABLET_NONE, 1=EVT_TABLET_STYLUS, 2=EVT_TABLET_ERASER */
float Pressure; /* range 0.0 (not touching) to 1.0 (full pressure) */
float Xtilt; /* range 0.0 (upright) to 1.0 (tilted fully against the tablet surface) */
float Ytilt; /* as above */
} wmTabletData;
typedef enum { /* motion progress, for modal handlers */
P_NOT_STARTED,
P_STARTING, /* <-- */
P_IN_PROGRESS, /* <-- only these are sent for NDOF motion*/
P_FINISHING, /* <-- */
P_FINISHED
} wmProgress;
typedef struct wmNDOFMotionData {
/* awfully similar to GHOST_TEventNDOFMotionData... */
/* Each component normally ranges from -1 to +1, but can exceed that.
* These use blender standard view coordinates, with positive rotations being CCW about the axis. */
float tvec[3]; /* translation */
float rvec[3]; /* rotation: */
/* axis = (rx,ry,rz).normalized */
/* amount = (rx,ry,rz).magnitude [in revolutions, 1.0 = 360 deg] */
float dt; /* time since previous NDOF Motion event */
wmProgress progress; /* is this the first event, the last, or one of many in between? */
} wmNDOFMotionData;
typedef struct wmTimer {
struct wmTimer *next, *prev;
struct wmWindow *win; /* window this timer is attached to (optional) */
double timestep; /* set by timer user */
int event_type; /* set by timer user, goes to event system */
void *customdata; /* set by timer user, to allow custom values */
double duration; /* total running time in seconds */
double delta; /* time since previous step in seconds */
double ltime; /* internal, last time timer was activated */
double ntime; /* internal, next time we want to activate the timer */
double stime; /* internal, when the timer started */
int sleep; /* internal, put timers to sleep when needed */
} wmTimer;
typedef struct wmOperatorType {
const char *name; /* text for ui, undo */
const char *idname; /* unique identifier */
const char *translation_context;
const char *description; /* tooltips and python docs */
/* this callback executes the operator without any interactive input,
* parameters may be provided through operator properties. cannot use
* any interface code or input device state.
* - see defines below for return values */
int (*exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT;
/* this callback executes on a running operator whenever as property
* is changed. It can correct its own properties or report errors for
* invalid settings in exceptional cases.
* Boolean return value, True denotes a change has been made and to redraw */
bool (*check)(struct bContext *, struct wmOperator *);
/* for modal temporary operators, initially invoke is called. then
* any further events are handled in modal. if the operation is
* canceled due to some external reason, cancel is called
* - see defines below for return values */
int (*invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT;
void (*cancel)(struct bContext *, struct wmOperator *);
int (*modal)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT;
/* verify if the operator can be executed in the current context, note
* that the operator might still fail to execute even if this return true */
int (*poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT;
/* optional panel for redo and repeat, autogenerated if not set */
void (*ui)(struct bContext *, struct wmOperator *);
/* rna for properties */
struct StructRNA *srna;
/* previous settings - for initializing on re-use */
struct IDProperty *last_properties;
/* Default rna property to use for generic invoke functions.
* menus, enum search... etc. Example: Enum 'type' for a Delete menu */
PropertyRNA *prop;
/* struct wmOperatorTypeMacro */
ListBase macro;
/* pointer to modal keymap, do not free! */
struct wmKeyMap *modalkeymap;
/* python needs the operator type as well */
int (*pyop_poll)(struct bContext *, struct wmOperatorType *ot) ATTR_WARN_UNUSED_RESULT;
/* RNA integration */
ExtensionRNA ext;
/* Flag last for padding */
short flag;
} wmOperatorType;
#ifdef WITH_INPUT_IME
/* *********** Input Method Editor (IME) *********** */
/* similar to GHOST_TEventImeData */
typedef struct wmIMEData {
size_t result_len, composite_len;
char *str_result; /* utf8 encoding */
char *str_composite; /* utf8 encoding */
int cursor_pos; /* cursor position in the IME composition. */
int sel_start; /* beginning of the selection */
int sel_end; /* end of the selection */
bool is_ime_composing;
} wmIMEData;
#endif
/* **************** Paint Cursor ******************* */
typedef void (*wmPaintCursorDraw)(struct bContext *C, int, int, void *customdata);
/* ****************** Messages ********************* */
enum {
WM_LOG_DEBUG = 0,
WM_LOG_INFO = 1000,
WM_LOG_WARNING = 2000,
WM_ERROR_UNDEFINED = 3000,
WM_ERROR_INVALID_INPUT = 3001,
WM_ERROR_INVALID_CONTEXT = 3002,
WM_ERROR_OUT_OF_MEMORY = 3003
};
typedef struct wmReport {
struct wmReport *next, *prev;
const char *typestr;
char *message;
int type;
} wmReport;
/* *************** Drag and drop *************** */
#define WM_DRAG_ID 0
#define WM_DRAG_RNA 1
#define WM_DRAG_PATH 2
#define WM_DRAG_NAME 3
#define WM_DRAG_VALUE 4
#define WM_DRAG_COLOR 5
typedef enum wmDragFlags {
WM_DRAG_NOP = 0,
WM_DRAG_FREE_DATA = 1,
} wmDragFlags;
/* note: structs need not exported? */
typedef struct wmDrag {
struct wmDrag *next, *prev;
int icon, type; /* type, see WM_DRAG defines above */
void *poin;
char path[1024]; /* FILE_MAX */
double value;
struct ImBuf *imb; /* if no icon but imbuf should be drawn around cursor */
float scale;
int sx, sy;
char opname[200]; /* if set, draws operator name*/
unsigned int flags;
} wmDrag;
/* dropboxes are like keymaps, part of the screen/area/region definition */
/* allocation and free is on startup and exit */
typedef struct wmDropBox {
struct wmDropBox *next, *prev;
/* test if the dropbox is active, then can print optype name */
int (*poll)(struct bContext *, struct wmDrag *, const wmEvent *);
/* before exec, this copies drag info to wmDrop properties */
void (*copy)(struct wmDrag *, struct wmDropBox *);
/* if poll survives, operator is called */
wmOperatorType *ot; /* not saved in file, so can be pointer */
struct IDProperty *properties; /* operator properties, assigned to ptr->data and can be written to a file */
struct PointerRNA *ptr; /* rna pointer to access properties */
short opcontext; /* default invoke */
} wmDropBox;
/* *************** migrated stuff, clean later? ************** */
typedef struct RecentFile {
struct RecentFile *next, *prev;
char *filepath;
} RecentFile;
#ifdef __cplusplus
}
#endif
#endif /* __WM_TYPES_H__ */