#ifndef _COMPIZ_ANIMATION_H #define _COMPIZ_ANIMATION_H #define ANIMATION_ABIVERSION 20080824 typedef enum { WindowEventOpen = 0, WindowEventClose, WindowEventMinimize, WindowEventUnminimize, WindowEventShade, WindowEventUnshade, WindowEventFocus, WindowEventNum, WindowEventNone } WindowEvent; typedef enum { AnimEventOpen = 0, AnimEventClose, AnimEventMinimize, AnimEventShade, AnimEventFocus, AnimEventNum } AnimEvent; typedef struct _AnimEffectProperties { void (*updateWindowAttribFunc) (CompWindow *, WindowPaintAttrib *); void (*prePaintWindowFunc) (CompWindow *); void (*postPaintWindowFunc) (CompWindow *); void (*animStepFunc) (CompWindow *, float time); Bool (*initFunc) (CompWindow *); void (*initGridFunc) (CompWindow *, int *, int *); void (*addCustomGeometryFunc) (CompWindow *, int, Box *, int, CompMatrix *); void (*drawCustomGeometryFunc) (CompWindow *); Bool (*letOthersDrawGeomsFunc) (CompWindow *); void (*updateWinTransformFunc) (CompWindow *, CompTransform *); Bool (*prePrepPaintScreenFunc) (CompWindow *, int msSinceLastPaint); void (*postPrepPaintScreenFunc) (CompWindow *); void (*updateBBFunc) (CompOutput *, CompWindow *, Box *); void (*cleanupFunc) (CompWindow *); void (*refreshFunc) (CompWindow *, Bool animInitialized); Bool (*zoomToIconFunc) (CompWindow *); Bool modelAnimIs3D; // TRUE if anim uses model and 3d coords Bool useQTexCoord; // TRUE if effect needs Q texture coordinates void *extraProperties; } AnimEffectProperties; typedef struct _AnimEffectInfo { char *name; // name of the animation effect, e.g. "animationpack:Implode" // to be set to TRUE for the window event animation list(s) that // the new animation (value) should be added to // (0: open, 1: close, 2: minimize, 3: shade, 4: focus) Bool usedForEvents[AnimEventNum]; AnimEffectProperties properties; } AnimEffectInfo; typedef const AnimEffectInfo * AnimEffect; typedef struct _ExtensionPluginInfo { unsigned int nEffects; AnimEffect *effects; // Plugin options to be used in "effect options" strings unsigned int nEffectOptions; CompOption *effectOptions; // Non-window functions void (*prePaintOutputFunc) (CompScreen *s, CompOutput *output); } ExtensionPluginInfo; // Window properties common to multiple animation effects typedef struct _AnimWindowCommon { float animTotalTime; float animRemainingTime; float timestep; // to be used in updateWindowAttribFunc int animOverrideProgressDir; // 0: default dir, 1: forward, 2: backward WindowEvent curWindowEvent; AnimEffect curAnimEffect; FragmentAttrib curPaintAttrib; Region drawRegion; Bool useDrawRegion; XRectangle icon; GLushort storedOpacity; CompTransform transform; Bool usingTransform; // whether transform matrix is used for the current effect float transformStartProgress; float transformProgress; } AnimWindowCommon; typedef enum { AnimDirectionDown = 0, AnimDirectionUp, AnimDirectionLeft, AnimDirectionRight, AnimDirectionRandom, AnimDirectionAuto } AnimDirection; #define LAST_ANIM_DIRECTION 5 typedef void (*UpdateBBProc) (CompOutput *output, CompWindow * w, Box *BB); // Base functions for extension plugins to call typedef struct _AnimBaseFunctions { void (*addExtension) (CompScreen *s, ExtensionPluginInfo *extensionPluginInfo); void (*removeExtension) (CompScreen *s, ExtensionPluginInfo *extensionPluginInfo); CompOptionValue * (*getPluginOptVal) (CompWindow *w, ExtensionPluginInfo *extensionPluginInfo, int optionId); Bool (*getMousePointerXY) (CompScreen *s, short *x, short *y); UpdateBBProc updateBBScreen; UpdateBBProc updateBBWindow; UpdateBBProc modelUpdateBB; UpdateBBProc compTransformUpdateBB; Bool (*defaultAnimInit) (CompWindow * w); void (*defaultAnimStep) (CompWindow * w, float time); float (*defaultAnimProgress) (CompWindow *w); float (*sigmoidAnimProgress) (CompWindow *w); float (*decelerateProgress) (float progress); AnimDirection (*getActualAnimDirection) (CompWindow * w, AnimDirection dir, Bool openDir); void (*expandBoxWithBox) (Box *target, Box *source); void (*expandBoxWithPoint) (Box *target, float fx, float fy); void (*prepareTransform) (CompScreen *s, CompOutput *output, CompTransform *resultTransform, CompTransform *transform); AnimWindowCommon * (*getAnimWindowCommon) (CompWindow *w); Bool (*returnTrue) (CompWindow *w); void (*postAnimationCleanup) (CompWindow *w); } AnimBaseFunctions; #define OPTION_GETTERS(extensionBaseFunctions, \ extensionPluginInfo, firstEffectOption) \ static inline CompOptionValue * \ animGetOptVal (CompWindow *w, \ int optionId) \ { \ return (extensionBaseFunctions)->getPluginOptVal \ (w, (extensionPluginInfo), optionId - (firstEffectOption)); \ } \ \ inline Bool \ animGetB (CompWindow *w, \ int optionId) \ { \ return animGetOptVal (w, optionId)->b; \ } \ \ inline int \ animGetI (CompWindow *w, \ int optionId) \ { \ return animGetOptVal (w, optionId)->i; \ } \ \ inline float \ animGetF (CompWindow *w, \ int optionId) \ { \ return animGetOptVal (w, optionId)->f; \ } \ \ inline char * \ animGetS (CompWindow *w, \ int optionId) \ { \ return animGetOptVal (w, optionId)->s; \ } \ \ inline unsigned short * \ animGetC (CompWindow *w, \ int optionId) \ { \ return animGetOptVal (w, optionId)->c; \ } #define OPTION_GETTERS_HDR \ \ inline Bool \ animGetB (CompWindow *w, \ int optionId); \ \ inline int \ animGetI (CompWindow *w, \ int optionId); \ \ inline float \ animGetF (CompWindow *w, \ int optionId); \ \ inline char * \ animGetS (CompWindow *w, \ int optionId); \ \ inline unsigned short * \ animGetC (CompWindow *w, \ int optionId); #define WIN_X(w) ((w)->attrib.x - (w)->output.left) #define WIN_Y(w) ((w)->attrib.y - (w)->output.top) #define WIN_W(w) ((w)->width + (w)->output.left + (w)->output.right) #define WIN_H(w) ((w)->height + (w)->output.top + (w)->output.bottom) #define BORDER_X(w) ((w)->attrib.x - (w)->input.left) #define BORDER_Y(w) ((w)->attrib.y - (w)->input.top) #define BORDER_W(w) ((w)->width + (w)->input.left + (w)->input.right) #define BORDER_H(w) ((w)->height + (w)->input.top + (w)->input.bottom) #define RAND_FLOAT() ((float)rand() / RAND_MAX) #define sigmoid(fx) (1.0f/(1.0f+exp(-5.0f*2*((fx)-0.5)))) #define sigmoid2(fx, s) (1.0f/(1.0f+exp(-(s)*2*((fx)-0.5)))) #define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption)) // ratio of perceived length of animation compared to real duration // to make it appear to have the same speed with other animation effects #define SPRINGY_ZOOM_PERCEIVED_T 0.55f #define NONSPRINGY_ZOOM_PERCEIVED_T 0.6f #define ZOOM_PERCEIVED_T 0.75f typedef struct _xy_pair { float x, y; } Point, Vector; typedef struct { float x1, x2, y1, y2; } Boxf; typedef struct _xyz_tuple { float x, y, z; } Point3d, Vector3d; #endif