converted more mixed tab/space indentations to tabs. only whitespace changes.
[blender.git] / source / blender / editors / transform / transform.c
index 63287f8..c710312 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * $Id$
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  * ***** END GPL LICENSE BLOCK *****
  */
 
+/** \file blender/editors/transform/transform.c
+ *  \ingroup edtransform
+ */
+
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 
 #include "RNA_access.h"
 
-//#include "BIF_editview.h"            /* arrows_move_cursor   */
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
-//#include "BIF_mywindow.h"
-//#include "BIF_resources.h"
-//#include "BIF_screen.h"
-//#include "BIF_space.h"                       /* undo                                 */
-//#include "BIF_toets.h"                       /* persptoetsen                 */
-//#include "BIF_mywindow.h"            /* warp_pointer                 */
-//#include "BIF_toolbox.h"                     /* notice                               */
-//#include "BIF_editmesh.h"
-//#include "BIF_editsima.h"
-//#include "BIF_editparticle.h"
 
 #include "BKE_nla.h"
-//#include "BKE_bad_level_calls.h"/* popmenu and error */
 #include "BKE_bmesh.h"
 #include "BKE_context.h"
 #include "BKE_constraint.h"
@@ -73,8 +66,6 @@
 #include "BKE_pointcache.h"
 #include "BKE_unit.h"
 
-//#include "BSE_view.h"
-
 #include "ED_image.h"
 #include "ED_keyframing.h"
 #include "ED_screen.h"
 
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
 #include "BLI_editVert.h"
 #include "BLI_ghash.h"
 #include "BLI_linklist.h"
 
-
 #include "UI_resources.h"
 
 //#include "blendef.h"
 #include "transform.h"
 
 void drawTransformApply(const struct bContext *C, struct ARegion *ar, void *arg);
+int doEdgeSlide(TransInfo *t, float perc);
 
 /* ************************** SPACE DEPENDANT CODE **************************** */
 
@@ -337,7 +329,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t)
        }
 }
 
-static void viewRedrawPost(TransInfo *t)
+static void viewRedrawPost(bContext *C, TransInfo *t)
 {
        ED_area_headerprint(t->sa, NULL);
        
@@ -345,6 +337,10 @@ static void viewRedrawPost(TransInfo *t)
                /* if autokeying is enabled, send notifiers that keyframes were added */
                if (IS_AUTOKEY_ON(t->scene))
                        WM_main_add_notifier(NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
+               
+               /* XXX temp, first hack to get auto-render in compositor work (ton) */
+               WM_event_add_notifier(C, NC_SCENE|ND_TRANSFORM_DONE, CTX_data_scene(C));
+
        }
        
 #if 0 // TRANSFORM_FIX_ME
@@ -371,7 +367,7 @@ static void viewRedrawPost(TransInfo *t)
 
 /* ************************** TRANSFORMATIONS **************************** */
 
-void BIF_selectOrientation() {
+void BIF_selectOrientation(void) {
 #if 0 // TRANSFORM_FIX_ME
        short val;
        char *str_menu = BIF_menustringTransformOrientation("Orientation");
@@ -541,9 +537,6 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
        WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, TFM_MODAL_ADD_SNAP);
        WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, KM_ALT, 0, TFM_MODAL_REMOVE_SNAP);
 
-       WM_modalkeymap_add_item(keymap, UPARROWKEY, KM_PRESS, 0, 0, NUM_MODAL_INCREMENT_UP);
-       WM_modalkeymap_add_item(keymap, DOWNARROWKEY, KM_PRESS, 0, 0, NUM_MODAL_INCREMENT_DOWN);
-       
        WM_modalkeymap_add_item(keymap, PAGEUPKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP);
        WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN);
        WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP);
@@ -560,7 +553,7 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
 
 int transformEvent(TransInfo *t, wmEvent *event)
 {
-       float mati[3][3] = {{1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}};
+       float mati[3][3]= MAT3_UNITY;
        char cmode = constraintModeToChar(t);
        int handled = 1;
 
@@ -574,7 +567,9 @@ int transformEvent(TransInfo *t, wmEvent *event)
                t->mval[0] = event->x - t->ar->winrct.xmin;
                t->mval[1] = event->y - t->ar->winrct.ymin;
 
-               t->redraw |= TREDRAW_SOFT;
+               // t->redraw |= TREDRAW_SOFT; /* Use this for soft redraw. Might cause flicker in object mode */
+               t->redraw |= TREDRAW_HARD;
+
 
                if (t->state == TRANS_STARTING) {
                        t->state = TRANS_RUNNING;
@@ -604,20 +599,22 @@ int transformEvent(TransInfo *t, wmEvent *event)
                                break;
                        case TFM_MODAL_ROTATE:
                                /* only switch when... */
-                               if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
-                                       
-                                       resetTransRestrictions(t);
-                                       
-                                       if (t->mode == TFM_ROTATION) {
-                                               restoreTransObjects(t);
-                                               initTrackball(t);
-                                       }
-                                       else {
-                                               restoreTransObjects(t);
-                                               initRotation(t);
+                               if(!(t->options & CTX_TEXTURE)) {
+                                       if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
+                                               
+                                               resetTransRestrictions(t);
+                                               
+                                               if (t->mode == TFM_ROTATION) {
+                                                       restoreTransObjects(t);
+                                                       initTrackball(t);
+                                               }
+                                               else {
+                                                       restoreTransObjects(t);
+                                                       initRotation(t);
+                                               }
+                                               initSnapping(t, NULL); // need to reinit after mode change
+                                               t->redraw |= TREDRAW_HARD;
                                        }
-                                       initSnapping(t, NULL); // need to reinit after mode change
-                                       t->redraw |= TREDRAW_HARD;
                                }
                                break;
                        case TFM_MODAL_RESIZE:
@@ -736,6 +733,8 @@ int transformEvent(TransInfo *t, wmEvent *event)
                        case TFM_MODAL_PROPSIZE_UP:
                                if(t->flag & T_PROP_EDIT) {
                                        t->prop_size*= 1.1f;
+                                       if(t->spacetype==SPACE_VIEW3D && t->persp != RV3D_ORTHO)
+                                               t->prop_size= MIN2(t->prop_size, ((View3D *)t->view)->far);
                                        calculatePropRatio(t);
                                }
                                t->redraw |= TREDRAW_HARD;
@@ -855,20 +854,22 @@ int transformEvent(TransInfo *t, wmEvent *event)
                        break;
                case RKEY:
                        /* only switch when... */
-                       if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
+                       if(!(t->options & CTX_TEXTURE)) {
+                               if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
 
-                               resetTransRestrictions(t);
+                                       resetTransRestrictions(t);
 
-                               if (t->mode == TFM_ROTATION) {
-                                       restoreTransObjects(t);
-                                       initTrackball(t);
-                               }
-                               else {
-                                       restoreTransObjects(t);
-                                       initRotation(t);
+                                       if (t->mode == TFM_ROTATION) {
+                                               restoreTransObjects(t);
+                                               initTrackball(t);
+                                       }
+                                       else {
+                                               restoreTransObjects(t);
+                                               initRotation(t);
+                                       }
+                                       initSnapping(t, NULL); // need to reinit after mode change
+                                       t->redraw |= TREDRAW_HARD;
                                }
-                               initSnapping(t, NULL); // need to reinit after mode change
-                               t->redraw |= TREDRAW_HARD;
                        }
                        break;
                case CKEY:
@@ -972,6 +973,8 @@ int transformEvent(TransInfo *t, wmEvent *event)
                case PADPLUSKEY:
                        if(event->alt && t->flag & T_PROP_EDIT) {
                                t->prop_size *= 1.1f;
+                               if(t->spacetype==SPACE_VIEW3D && t->persp != RV3D_ORTHO)
+                                       t->prop_size= MIN2(t->prop_size, ((View3D *)t->view)->far);
                                calculatePropRatio(t);
                        }
                        t->redraw= 1;
@@ -1050,7 +1053,6 @@ int transformEvent(TransInfo *t, wmEvent *event)
                // Snapping events
                t->redraw |= handleSnapping(t, event);
 
-               //arrows_move_cursor(event->type);
        }
        else if (event->val==KM_RELEASE) {
                switch (event->type){
@@ -1223,6 +1225,15 @@ static void drawArc(float size, float angle_start, float angle_end, int segments
        glEnd();
 }
 
+static int helpline_poll(bContext *C)
+{
+       ARegion *ar= CTX_wm_region(C);
+       
+       if(ar && ar->regiontype==RGN_TYPE_WINDOW)
+               return 1;
+       return 0;
+}
+
 static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
 {
        TransInfo *t = (TransInfo*)customdata;
@@ -1261,7 +1272,7 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
                                glEnd();
 
                                glTranslatef(mval[0], mval[1], 0);
-                               glRotatef(-180 / M_PI * atan2f(cent[0] - t->mval[0], cent[1] - t->mval[1]), 0, 0, 1);
+                               glRotatef(-RAD2DEGF(atan2f(cent[0] - t->mval[0], cent[1] - t->mval[1])), 0, 0, 1);
 
                                setlinestyle(0);
                                glLineWidth(3.0);
@@ -1295,8 +1306,8 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
                                        float dx = t->mval[0] - cent[0], dy = t->mval[1] - cent[1];
                                        float angle = atan2f(dy, dx);
                                        float dist = sqrtf(dx*dx + dy*dy);
-                                       float delta_angle = MIN2(15 / dist, M_PI/4);
-                                       float spacing_angle = MIN2(5 / dist, M_PI/12);
+                                       float delta_angle = MIN2(15.0f / dist, (float)M_PI/4.0f);
+                                       float spacing_angle = MIN2(5.0f / dist, (float)M_PI/12.0f);
                                        UI_ThemeColor(TH_WIRE);
 
                                        setlinestyle(3);
@@ -1315,14 +1326,14 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
                                        glPushMatrix();
 
                                        glTranslatef(cosf(angle - delta_angle) * dist, sinf(angle - delta_angle) * dist, 0);
-                                       glRotatef(180 / M_PI * (angle - delta_angle), 0, 0, 1);
+                                       glRotatef(RAD2DEGF(angle - delta_angle), 0, 0, 1);
 
                                        drawArrowHead(DOWN, 5);
 
                                        glPopMatrix();
 
                                        glTranslatef(cosf(angle + delta_angle) * dist, sinf(angle + delta_angle) * dist, 0);
-                                       glRotatef(180 / M_PI * (angle + delta_angle), 0, 0, 1);
+                                       glRotatef(RAD2DEGF(angle + delta_angle), 0, 0, 1);
 
                                        drawArrowHead(UP, 5);
 
@@ -1331,20 +1342,20 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
                                }
                                case HLP_TRACKBALL:
                                {
-                                       char col[3], col2[3];
+                                       unsigned char col[3], col2[3];
                                        UI_GetThemeColor3ubv(TH_GRID, col);
 
                                        glTranslatef(mval[0], mval[1], 0);
 
                                        glLineWidth(3.0);
 
-                                       UI_make_axis_color(col, col2, 'x');
+                                       UI_make_axis_color(col, col2, 'X');
                                        glColor3ubv((GLubyte *)col2);
 
                                        drawArrow(RIGHT, 5, 10, 5);
                                        drawArrow(LEFT, 5, 10, 5);
 
-                                       UI_make_axis_color(col, col2, 'y');
+                                       UI_make_axis_color(col, col2, 'Y');
                                        glColor3ubv((GLubyte *)col2);
 
                                        drawArrow(UP, 5, 10, 5);
@@ -1358,7 +1369,7 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
        }
 }
 
-void drawTransformView(const struct bContext *C, struct ARegion *UNUSED(ar), void *arg)
+static void drawTransformView(const struct bContext *C, struct ARegion *UNUSED(ar), void *arg)
 {
        TransInfo *t = arg;
 
@@ -1367,12 +1378,14 @@ void drawTransformView(const struct bContext *C, struct ARegion *UNUSED(ar), voi
        drawSnapping(C, t);
 }
 
-void drawTransformPixel(const struct bContext *UNUSED(C), struct ARegion *UNUSED(ar), void *UNUSED(arg))
+#if 0
+static void drawTransformPixel(const struct bContext *UNUSED(C), struct ARegion *UNUSED(ar), void *UNUSED(arg))
 {
 //     TransInfo *t = arg;
 //
 //     drawHelpline(C, t->mval[0], t->mval[1], t);
 }
+#endif
 
 void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
 {
@@ -1496,6 +1509,10 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
 
        t->state = TRANS_STARTING;
 
+       if(RNA_struct_find_property(op->ptr, "texture_space"))
+               if(RNA_boolean_get(op->ptr, "texture_space"))
+                       options |= CTX_TEXTURE;
+       
        t->options = options;
 
        t->mode = mode;
@@ -1531,7 +1548,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
                t->draw_handle_apply = ED_region_draw_cb_activate(t->ar->type, drawTransformApply, t, REGION_DRAW_PRE_VIEW);
                t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
                //t->draw_handle_pixel = ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, REGION_DRAW_POST_PIXEL);
-               t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), NULL, drawHelpline, t);
+               t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), helpline_poll, drawHelpline, t);
        }
        else if(t->spacetype == SPACE_IMAGE) {
                unit_m3(t->spacemtx);
@@ -1633,11 +1650,6 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
                break;
        case TFM_EDGE_SLIDE:
                initEdgeSlide(t);
-               if(t->state == TRANS_CANCEL)
-               {
-                       postTrans(C, t);
-                       return 0;
-               }
                break;
        case TFM_BONE_ROLL:
                initBoneRoll(t);
@@ -1651,6 +1663,16 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
        case TFM_TIME_SCALE:
                initTimeScale(t);
                break;
+       case TFM_TIME_DUPLICATE:
+               /* same as TFM_TIME_EXTEND, but we need the mode info for later 
+                * so that duplicate-culling will work properly
+                */
+               if ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)
+                       initTranslation(t);
+               else
+                       initTimeTranslate(t);
+               t->mode = mode;
+               break;
        case TFM_TIME_EXTEND:
                /* now that transdata has been made, do like for TFM_TIME_TRANSLATE (for most Animation
                 * Editors because they have only 1D transforms for time values) or TFM_TRANSLATION
@@ -1682,6 +1704,13 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
                break;
        }
 
+       if(t->state == TRANS_CANCEL)
+       {
+               postTrans(C, t);
+               return 0;
+       }
+
+
        /* overwrite initial values if operator supplied a non-null vector */
        if (RNA_property_is_set(op->ptr, "value"))
        {
@@ -1783,6 +1812,10 @@ int transformEnd(bContext *C, TransInfo *t)
                /* handle restoring objects */
                if(t->state == TRANS_CANCEL)
                {
+                       /* exception, edge slide transformed UVs too */
+                       if(t->mode==TFM_EDGE_SLIDE)
+                               doEdgeSlide(t, 0.0f);
+                       
                        exit_code = OPERATOR_CANCELLED;
                        restoreTransObjects(t); // calls recalcData()
                }
@@ -1798,7 +1831,7 @@ int transformEnd(bContext *C, TransInfo *t)
                postTrans(C, t);
 
                /* send events out for redraws */
-               viewRedrawPost(t);
+               viewRedrawPost(C, t);
 
                /*  Undo as last, certainly after special_trans_update! */
 
@@ -1888,7 +1921,7 @@ static void protectedAxisAngleBits(short protectflag, float axis[3], float *angl
                eulO_to_axis_angle( axis, angle,eul, EULER_ORDER_DEFAULT);
                
                /* when converting to axis-angle, we need a special exception for the case when there is no axis */
-               if (IS_EQ(axis[0], axis[1]) && IS_EQ(axis[1], axis[2])) {
+               if (IS_EQF(axis[0], axis[1]) && IS_EQF(axis[1], axis[2])) {
                        /* for now, rotate around y-axis then (so that it simply becomes the roll) */
                        axis[1]= 1.0f;
                }
@@ -1915,23 +1948,29 @@ static void protectedQuaternionBits(short protectflag, float *quat, float *oldqu
        }
        else {
                /* quaternions get limited with euler... (compatability mode) */
-               float eul[3], oldeul[3], quat1[4];
-               
-               QUATCOPY(quat1, quat);
-               quat_to_eul( eul,quat);
-               quat_to_eul( oldeul,oldquat);
-               
+               float eul[3], oldeul[3], nquat[4], noldquat[4];
+               float qlen;
+
+               qlen= normalize_qt_qt(nquat, quat);
+               normalize_qt_qt(noldquat, oldquat);
+
+               quat_to_eul(eul, nquat);
+               quat_to_eul(oldeul, noldquat);
+
                if (protectflag & OB_LOCK_ROTX)
                        eul[0]= oldeul[0];
                if (protectflag & OB_LOCK_ROTY)
                        eul[1]= oldeul[1];
                if (protectflag & OB_LOCK_ROTZ)
                        eul[2]= oldeul[2];
-               
+
                eul_to_quat( quat,eul);
+
+               /* restore original quat size */
+               mul_qt_fl(quat, qlen);
                
                /* quaternions flip w sign to accumulate rotations correctly */
-               if ( (quat1[0]<0.0f && quat[0]>0.0f) || (quat1[0]>0.0f && quat[0]<0.0f) ) {
+               if ( (nquat[0]<0.0f && quat[0]>0.0f) || (nquat[0]>0.0f && quat[0]<0.0f) ) {
                        mul_qt_fl(quat, -1.0f);
                }
        }
@@ -1943,7 +1982,7 @@ static void constraintTransLim(TransInfo *UNUSED(t), TransData *td)
 {
        if (td->con) {
                bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_LOCLIMIT);
-               bConstraintOb cob= {0};
+               bConstraintOb cob= {NULL};
                bConstraint *con;
                
                /* Make a temporary bConstraintOb for using these limit constraints
@@ -2011,8 +2050,7 @@ static void constraintob_from_transdata(bConstraintOb *cob, TransData *td)
                           we don't necessarily end up with a rotation matrix, and
                           then conversion back to quat gives a different result */
                        float quat[4];
-                       copy_qt_qt(quat, td->ext->quat);
-                       normalize_qt(quat);
+                       normalize_qt_qt(quat, td->ext->quat);
                        quat_to_mat4(cob->matrix, quat);
                }
                else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) {
@@ -2100,7 +2138,7 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
 {
        if (td->con && td->ext) {
                bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_SIZELIMIT);
-               bConstraintOb cob= {0};
+               bConstraintOb cob= {NULL};
                bConstraint *con;
                
                /* Make a temporary bConstraintOb for using these limit constraints
@@ -2174,7 +2212,7 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
 
 /* ************************** WARP *************************** */
 
-void postInputWarp(TransInfo *t, float values[3])
+static void postInputWarp(TransInfo *t, float values[3])
 {
        mul_v3_fl(values, (float)(M_PI * 2));
 
@@ -2199,8 +2237,8 @@ void initWarp(TransInfo *t)
        t->idx_max = 0;
        t->num.idx_max = 0;
        t->snap[0] = 0.0f;
-       t->snap[1] = 5.0f / 180 * M_PI;
-       t->snap[2] = 1.0f / 180 * M_PI;
+       t->snap[1] = 5.0f / 180.0f * (float)M_PI;
+       t->snap[2] = 1.0f / 180.0f * (float)M_PI;
        
        t->num.increment = 1.0f;
 
@@ -2223,7 +2261,7 @@ void initWarp(TransInfo *t)
 
        mid_v3_v3v3(t->center, min, max);
 
-       if (max[0] == min[0]) max[0] += 0.1; /* not optimal, but flipping is better than invalid garbage (i.e. division by zero!) */
+       if (max[0] == min[0]) max[0] += 0.1f; /* not optimal, but flipping is better than invalid garbage (i.e. division by zero!) */
        t->val= (max[0]-min[0])/2.0f; /* t->val is X dimension projected boundbox */
 }
 
@@ -2234,10 +2272,10 @@ int handleEventWarp(TransInfo *t, wmEvent *event)
        if (event->type == MIDDLEMOUSE && event->val==KM_PRESS)
        {
                // Use customData pointer to signal warp direction
-               if      (t->customData == 0)
+               if      (t->customData == NULL)
                        t->customData = (void*)1;
                else
-                       t->customData = 0;
+                       t->customData = NULL;
                
                status = 1;
        }
@@ -2287,11 +2325,11 @@ int Warp(TransInfo *t, short UNUSED(mval[2]))
                
                sprintf(str, "Warp: %s", c);
 
-               circumfac = circumfac / 180 * M_PI;
+               circumfac = DEG2RADF(circumfac);
        }
        else {
                /* default header print */
-               sprintf(str, "Warp: %.3f", circumfac * 180 / M_PI);
+               sprintf(str, "Warp: %.3f", RAD2DEGF(circumfac));
        }
        
        t->values[0] = circumfac;
@@ -2343,7 +2381,7 @@ int Warp(TransInfo *t, short UNUSED(mval[2]))
 
 /* ************************** SHEAR *************************** */
 
-void postInputShear(TransInfo *UNUSED(t), float values[3])
+static void postInputShear(TransInfo *UNUSED(t), float values[3])
 {
        mul_v3_fl(values, 0.05f);
 }
@@ -2375,7 +2413,7 @@ int handleEventShear(TransInfo *t, wmEvent *event)
        if (event->type == MIDDLEMOUSE && event->val==KM_PRESS)
        {
                // Use customData pointer to signal Shear direction
-               if      (t->customData == 0)
+               if      (t->customData == NULL)
                {
                        initMouseInputMode(t, &t->mouse, INPUT_VERTICAL_ABSOLUTE);
                        t->customData = (void*)1;
@@ -2383,7 +2421,7 @@ int handleEventShear(TransInfo *t, wmEvent *event)
                else
                {
                        initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_ABSOLUTE);
-                       t->customData = 0;
+                       t->customData = NULL;
                }
                
                status = 1;
@@ -2427,7 +2465,7 @@ int Shear(TransInfo *t, short UNUSED(mval[2]))
        unit_m3(smat);
        
        // Custom data signals shear direction
-       if (t->customData == 0)
+       if (t->customData == NULL)
                smat[1][0] = value;
        else
                smat[0][1] = value;
@@ -2497,6 +2535,7 @@ void initResize(TransInfo *t)
 
 static void headerResize(TransInfo *t, float vec[3], char *str) {
        char tvec[60];
+       char *spos= str;
        if (hasNumInput(&t->num)) {
                outputNumInput(&(t->num), tvec);
        }
@@ -2509,21 +2548,27 @@ static void headerResize(TransInfo *t, float vec[3], char *str) {
        if (t->con.mode & CON_APPLY) {
                switch(t->num.idx_max) {
                case 0:
-                       sprintf(str, "Scale: %s%s %s", &tvec[0], t->con.text, t->proptext);
+                       spos += sprintf(spos, "Scale: %s%s %s", &tvec[0], t->con.text, t->proptext);
                        break;
                case 1:
-                       sprintf(str, "Scale: %s : %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
+                       spos += sprintf(spos, "Scale: %s : %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
                        break;
                case 2:
-                       sprintf(str, "Scale: %s : %s : %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
+                       spos += sprintf(spos, "Scale: %s : %s : %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
                }
        }
        else {
                if (t->flag & T_2D_EDIT)
-                       sprintf(str, "Scale X: %s   Y: %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
+                       spos += sprintf(spos, "Scale X: %s   Y: %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
                else
-                       sprintf(str, "Scale X: %s   Y: %s  Z: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
+                       spos += sprintf(spos, "Scale X: %s   Y: %s  Z: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
        }
+       
+       if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED)) {
+               spos += sprintf(spos, " Proportional size: %.2f", t->prop_size);
+       }
+
+       (void)spos;
 }
 
 #define SIGN(a)                (a<-FLT_EPSILON?1:a>FLT_EPSILON?2:3)
@@ -2822,7 +2867,7 @@ int ToSphere(TransInfo *t, short UNUSED(mval[2]))
 /* ************************** ROTATION *************************** */
 
 
-void postInputRotation(TransInfo *t, float values[3])
+static void postInputRotation(TransInfo *t, float values[3])
 {
        if ((t->con.mode & CON_APPLY) && t->con.applyRot) {
                t->con.applyRot(t, NULL, t->axis, values);
@@ -2890,7 +2935,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
                
                
                if(td->flag & TD_USEQUAT) {
-                       mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+                       mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
                        mat3_to_quat( quat,fmat);       // Actual transform
                        
                        if(td->ext->quat){
@@ -2957,7 +3002,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
                if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
                        /* euler or quaternion/axis-angle? */
                        if (td->ext->rotOrder == ROT_MODE_QUAT) {
-                               mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+                               mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
                                
                                mat3_to_quat( quat,fmat);       // Actual transform
                                
@@ -2972,7 +3017,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
                                
                                axis_angle_to_quat(iquat, td->ext->irotAxis, td->ext->irotAngle);
                                
-                               mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+                               mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
                                mat3_to_quat( quat,fmat);       // Actual transform
                                mul_qt_qtqt(tquat, quat, iquat);
                                
@@ -3027,7 +3072,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
                if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
                        /* euler or quaternion? */
                           if ((td->ext->rotOrder == ROT_MODE_QUAT) || (td->flag & TD_USEQUAT)) {
-                               mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+                               mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
                                mat3_to_quat( quat,fmat);       // Actual transform
                                
                                mul_qt_qtqt(td->ext->quat, quat, td->ext->iquat);
@@ -3040,7 +3085,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
                                
                                axis_angle_to_quat(iquat, td->ext->irotAxis, td->ext->irotAngle);
                                
-                               mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+                               mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
                                mat3_to_quat( quat,fmat);       // Actual transform
                                mul_qt_qtqt(tquat, quat, iquat);
                                
@@ -3106,12 +3151,10 @@ static void applyRotation(TransInfo *t, float angle, float axis[3])
 
 int Rotation(TransInfo *t, short UNUSED(mval[2]))
 {
-       char str[64];
+       char str[128];
        
        float final;
-       
-       float mat[3][3];
-       
+
        final = t->values[0];
        
        applyNDofInput(&t->ndof, &final);
@@ -3135,23 +3178,18 @@ int Rotation(TransInfo *t, short UNUSED(mval[2]))
                outputNumInput(&(t->num), c);
                
                sprintf(str, "Rot: %s %s %s", &c[0], t->con.text, t->proptext);
-               
+
                /* Clamp between -180 and 180 */
-               while (final >= 180.0)
-                       final -= 360.0;
-               
-               while (final <= -180.0)
-                       final += 360.0;
-               
-               final *= (float)(M_PI / 180.0);
+               final= angle_wrap_rad(DEG2RADF(final));
        }
        else {
-               sprintf(str, "Rot: %.2f%s %s", 180.0*final/M_PI, t->con.text, t->proptext);
+               sprintf(str, "Rot: %.2f%s %s", RAD2DEGF(final), t->con.text, t->proptext);
        }
        
+       if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED))
+               sprintf(str, "%s Proportional size: %.2f", str, t->prop_size);
+       
        t->values[0] = final;
-
-       vec_rot_to_mat3( mat, t->axis, final);
        
        applyRotation(t, final, t->axis);
        
@@ -3245,11 +3283,11 @@ int Trackball(TransInfo *t, short UNUSED(mval[2]))
 
                sprintf(str, "Trackball: %s %s %s", &c[0], &c[20], t->proptext);
 
-               phi[0] *= (float)(M_PI / 180.0);
-               phi[1] *= (float)(M_PI / 180.0);
+               phi[0] = DEG2RADF(phi[0]);
+               phi[1] = DEG2RADF(phi[1]);
        }
        else {
-               sprintf(str, "Trackball: %.2f %.2f %s", 180.0*phi[0]/M_PI, 180.0*phi[1]/M_PI, t->proptext);
+               sprintf(str, "Trackball: %.2f %.2f %s", RAD2DEGF(phi[0]), RAD2DEGF(phi[1]), t->proptext);
        }
 
        vec_rot_to_mat3( smat,axis1, phi[0]);
@@ -3323,7 +3361,7 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
                applyAspectRatio(t, dvec);
 
                dist = len_v3(vec);
-               if(t->scene->unit.system) {
+               if(!(t->flag & T_2D_EDIT) && t->scene->unit.system) {
                        int i, do_split= t->scene->unit.flag & USER_UNIT_OPT_SPLIT ? 1:0;
 
                        for(i=0; i<3; i++)
@@ -3336,9 +3374,9 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
                }
        }
 
-       if(t->scene->unit.system)
+       if(!(t->flag & T_2D_EDIT) && t->scene->unit.system)
                bUnit_AsString(distvec, sizeof(distvec), dist*t->scene->unit.scale_length, 4, t->scene->unit.system, B_UNIT_LENGTH, t->scene->unit.flag & USER_UNIT_OPT_SPLIT, 0);
-       else if( dist > 1e10 || dist < -1e10 )  /* prevent string buffer overflow */
+       else if( dist > 1e10f || dist < -1e10f )        /* prevent string buffer overflow */
                sprintf(distvec, "%.4e", dist);
        else
                sprintf(distvec, "%.4f", dist);
@@ -3372,6 +3410,9 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
                else
                        sprintf(str, "Dx: %s   Dy: %s  Dz: %s (%s)%s %s  %s", &tvec[0], &tvec[20], &tvec[40], distvec, t->con.text, t->proptext, &autoik[0]);
        }
+       
+       if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED))
+               sprintf(str, "%s Proportional size: %.2f", str, t->prop_size);
 }
 
 static void applyTranslation(TransInfo *t, float vec[3]) {
@@ -3601,10 +3642,10 @@ int Tilt(TransInfo *t, short UNUSED(mval[2]))
 
                sprintf(str, "Tilt: %s %s", &c[0], t->proptext);
 
-               final *= (float)(M_PI / 180.0);
+               final = DEG2RADF(final);
        }
        else {
-               sprintf(str, "Tilt: %.2f %s", 180.0*final/M_PI, t->proptext);
+               sprintf(str, "Tilt: %.2f %s", RAD2DEGF(final), t->proptext);
        }
 
        for(i = 0 ; i < t->total; i++, td++) {
@@ -3856,7 +3897,7 @@ int Bevel(TransInfo *t, short UNUSED(mval[2]))
        float distance,d;
        int i;
        char str[128];
-       char *mode;
+       const char *mode;
        TransData *td = t->data;
 
        mode = (G.editBMesh->options & BME_BEVEL_VERT) ? "verts only" : "normal";
@@ -4060,6 +4101,7 @@ void initBoneSize(TransInfo *t)
        t->idx_max = 2;
        t->num.idx_max = 2;
        t->num.flag |= NUM_NULL_ONE;
+       t->num.flag |= NUM_AFFECT_ALL;
        t->snap[0] = 0.0f;
        t->snap[1] = 0.1f;
        t->snap[2] = t->snap[1] * 0.1f;
@@ -4253,7 +4295,7 @@ static int createSlideVerts(TransInfo *t)
        int  uvlay_tot= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
        int uvlay_idx;
        TransDataSlideUv *slideuvs=NULL, *suv=NULL, *suv_last=NULL;
-       RegionView3D *v3d = t->ar->regiondata;
+       RegionView3D *v3d = t->ar ? t->ar->regiondata : NULL; /* background mode support */
        float projectMat[4][4];
        float start[3] = {0.0f, 0.0f, 0.0f}, end[3] = {0.0f, 0.0f, 0.0f};
        float vec[3];
@@ -4443,11 +4485,11 @@ static int createSlideVerts(TransInfo *t)
                        for(eed=em->edges.first;eed;eed=eed->next) {
                                if(editedge_containsVert(eed, ev)) {
                                        if(!(eed->f & SELECT)) {
-                                                if(!tempsv->up) {
-                                                        tempsv->up = eed;
-                                                } else if (!(tempsv->down)) {
-                                                        tempsv->down = eed;
-                                                }
+                                               if(!tempsv->up) {
+                                                       tempsv->up = eed;
+                                               } else if (!(tempsv->down)) {
+                                                       tempsv->down = eed;
+                                               }
                                        }
                                }
                        }
@@ -4459,33 +4501,33 @@ static int createSlideVerts(TransInfo *t)
                                        for(efa = em->faces.first;efa;efa=efa->next) {
                                                if(editface_containsEdge(efa, eed)) {
                                                        if(editedge_containsVert(efa->e1, ev) && efa->e1 != eed) {
-                                                                if(!tempsv->up) {
-                                                                        tempsv->up = efa->e1;
-                                                                } else if (!(tempsv->down)) {
-                                                                        tempsv->down = efa->e1;
-                                                                }
+                                                               if(!tempsv->up) {
+                                                                       tempsv->up = efa->e1;
+                                                               } else if (!(tempsv->down)) {
+                                                                       tempsv->down = efa->e1;
+                                                               }
                                                        }
                                                        if(editedge_containsVert(efa->e2, ev) && efa->e2 != eed) {
-                                                                if(!tempsv->up) {
-                                                                        tempsv->up = efa->e2;
-                                                                } else if (!(tempsv->down)) {
-                                                                        tempsv->down = efa->e2;
-                                                                }
+                                                               if(!tempsv->up) {
+                                                                       tempsv->up = efa->e2;
+                                                               } else if (!(tempsv->down)) {
+                                                                       tempsv->down = efa->e2;
+                                                               }
                                                        }
                                                        if(editedge_containsVert(efa->e3, ev) && efa->e3 != eed) {
-                                                                if(!tempsv->up) {
-                                                                        tempsv->up = efa->e3;
-                                                                } else if (!(tempsv->down)) {
-                                                                        tempsv->down = efa->e3;
-                                                                }
+                                                               if(!tempsv->up) {
+                                                                       tempsv->up = efa->e3;
+                                                               } else if (!(tempsv->down)) {
+                                                                       tempsv->down = efa->e3;
+                                                               }
                                                        }
                                                        if(efa->e4) {
                                                                if(editedge_containsVert(efa->e4, ev) && efa->e4 != eed) {
-                                                                        if(!tempsv->up) {
-                                                                                tempsv->up = efa->e4;
-                                                                        } else if (!(tempsv->down)) {
-                                                                                tempsv->down = efa->e4;
-                                                                        }
+                                                                       if(!tempsv->up) {
+                                                                               tempsv->up = efa->e4;
+                                                                       } else if (!(tempsv->down)) {
+                                                                               tempsv->down = efa->e4;
+                                                                       }
                                                                }
                                                        }
 
@@ -4505,7 +4547,7 @@ static int createSlideVerts(TransInfo *t)
                look = look->next;
        }
 
-       // make sure the UPs nad DOWNs are 'faceloops'
+       // make sure the UPs and DOWNs are 'faceloops'
        // Also find the nearest slidevert to the cursor
 
        look = vertlist;
@@ -4522,7 +4564,7 @@ static int createSlideVerts(TransInfo *t)
                        return 0;
                }
 
-               if(me->drawflag & ME_DRAW_EDGELEN) {
+               if(me->drawflag & ME_DRAWEXTRA_EDGELEN) {
                        if(!(tempsv->up->f & SELECT)) {
                                tempsv->up->f |= SELECT;
                                tempsv->up->f2 |= 16;
@@ -4544,7 +4586,7 @@ static int createSlideVerts(TransInfo *t)
                        sv = BLI_ghash_lookup(vertgh, ev);
 
                        if(sv) {
-                               float co[3], co2[3], vec[3];
+                               float co[3], co2[3], tvec[3];
 
                                ev = (EditVert*)look->link;
 
@@ -4561,12 +4603,12 @@ static int createSlideVerts(TransInfo *t)
                                }
 
                                if (ev == tempsv->up->v1) {
-                                       sub_v3_v3v3(vec, co, co2);
+                                       sub_v3_v3v3(tvec, co, co2);
                                } else {
-                                       sub_v3_v3v3(vec, co2, co);
+                                       sub_v3_v3v3(tvec, co2, co);
                                }
 
-                               add_v3_v3(start, vec);
+                               add_v3_v3(start, tvec);
 
                                if (v3d) {
                                        view3d_project_float(t->ar, tempsv->down->v1->co, co, projectMat);
@@ -4574,12 +4616,12 @@ static int createSlideVerts(TransInfo *t)
                                }
 
                                if (ev == tempsv->down->v1) {
-                                       sub_v3_v3v3(vec, co2, co);
+                                       sub_v3_v3v3(tvec, co2, co);
                                } else {
-                                       sub_v3_v3v3(vec, co, co2);
+                                       sub_v3_v3v3(tvec, co, co2);
                                }
 
-                               add_v3_v3(end, vec);
+                               add_v3_v3(end, tvec);
 
                                totvec += 1.0f;
                                nearest = (EditVert*)look->link;
@@ -4592,7 +4634,7 @@ static int createSlideVerts(TransInfo *t)
        }
 
        add_v3_v3(start, end);
-       mul_v3_fl(start, 0.5*(1.0/totvec));
+       mul_v3_fl(start, 0.5f*(1.0f/totvec));
        VECCOPY(vec, start);
        start[0] = t->mval[0];
        start[1] = t->mval[1];
@@ -4661,7 +4703,7 @@ static int createSlideVerts(TransInfo *t)
                                                        uv_new = tf->uv[k];
 
                                                        if (ev->tmp.l) {
-                                                               if (fabs(suv->origuv[0]-uv_new[0]) > 0.0001 || fabs(suv->origuv[1]-uv_new[1])) {
+                                                               if (fabs(suv->origuv[0]-uv_new[0]) > 0.0001f || fabs(suv->origuv[1]-uv_new[1]) > 0.0001f) {
                                                                        ev->tmp.l = -1; /* Tag as invalid */
                                                                        BLI_linklist_free(suv->fuv_list,NULL);
                                                                        suv->fuv_list = NULL;
@@ -4736,7 +4778,7 @@ void freeSlideVerts(TransInfo *t)
        Mesh *me = t->obedit->data;
        int uvlay_idx;
 
-       if(me->drawflag & ME_DRAW_EDGELEN) {
+       if(me->drawflag & ME_DRAWEXTRA_EDGELEN) {
                TransDataSlideVert *tempsv;
                LinkNode *look = sld->vertlist;
                GHash *vertgh = sld->vhash;
@@ -4820,18 +4862,16 @@ int doEdgeSlide(TransInfo *t, float perc)
        LinkNode *vertlist=sld->vertlist, *look;
        GHash *vertgh = sld->vhash;
        TransDataSlideVert *tempsv;
-       float len = 0.0f;
+       float len;
        int prop=1, flip=0;
        /* UV correction vars */
        GHash **uvarray= sld->uvhash;
        int  uvlay_tot= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
        int uvlay_idx;
-       TransDataSlideUv *suv=sld->slideuv;
+       TransDataSlideUv *suv;
        float uv_tmp[2];
        LinkNode *fuv_link;
 
-       len = 0.0f;
-
        tempsv = BLI_ghash_lookup(vertgh,nearest);
 
        centerVert = editedge_getSharedVert(tempsv->up, tempsv->down);
@@ -4878,8 +4918,8 @@ int doEdgeSlide(TransInfo *t, float perc)
                        tempsv = BLI_ghash_lookup(vertgh,ev);
                        edgelen = len_v3v3(editedge_getOtherVert(tempsv->up,ev)->co,editedge_getOtherVert(tempsv->down,ev)->co);
                        newlen = (edgelen != 0.0f)? (len / edgelen): 0.0f;
-                       if(newlen > 1.0) {newlen = 1.0;}
-                       if(newlen < 0.0) {newlen = 0.0;}
+                       if(newlen > 1.0f) {newlen = 1.0;}
+                       if(newlen < 0.0f) {newlen = 0.0;}
                        if(flip == 0) {
                                interp_v3_v3v3(ev->co, editedge_getOtherVert(tempsv->down,ev)->co, editedge_getOtherVert(tempsv->up,ev)->co, fabs(newlen));
                                if (uvlay_tot) { // XXX scene->toolsettings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT) {
@@ -5002,10 +5042,10 @@ int BoneRoll(TransInfo *t, short UNUSED(mval[2]))
 
                sprintf(str, "Roll: %s", &c[0]);
 
-               final *= (float)(M_PI / 180.0);
+               final = DEG2RADF(final);
        }
        else {
-               sprintf(str, "Roll: %.2f", 180.0*final/M_PI);
+               sprintf(str, "Roll: %.2f", RAD2DEGF(final));
        }
 
        /* set roll values */
@@ -5313,8 +5353,8 @@ int SeqSlide(TransInfo *t, short UNUSED(mval[2]))
                applyNumInput(&t->num, t->values);
        }
 
-       t->values[0] = floor(t->values[0] + 0.5);
-       t->values[1] = floor(t->values[1] + 0.5);
+       t->values[0] = floor(t->values[0] + 0.5f);
+       t->values[1] = floor(t->values[1] + 0.5f);
 
        headerSeqSlide(t, t->values, str);
        applySeqSlide(t, t->values);
@@ -5413,7 +5453,7 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d,
        /* snap key to nearest frame? */
        if (autosnap == SACTSNAP_FRAME) {
                const Scene *scene= t->scene;
-               const short doTime= 0; //XXX doesn't work - getAnimEdit_DrawTime(t);
+               const short doTime= 0; //getAnimEdit_DrawTime(t); // NOTE: this works, but may be confusing behaviour given the option's label, hence disabled
                const double secf= FPS;
                double val;
                
@@ -5472,6 +5512,11 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d,
 
 void initTimeTranslate(TransInfo *t)
 {
+       /* this tool is only really available in the Action Editor... */
+       if (t->spacetype != SPACE_ACTION) {
+               t->state = TRANS_CANCEL;
+       }
+
        t->mode = TFM_TIME_TRANSLATE;
        t->transform = TimeTranslate;
 
@@ -5620,8 +5665,11 @@ void initTimeSlide(TransInfo *t)
 
                /* set flag for drawing stuff */
                saction->flag |= SACTION_MOVING;
+       } else {
+               t->state = TRANS_CANCEL;
        }
 
+
        t->mode = TFM_TIME_SLIDE;
        t->transform = TimeSlide;
        t->flag |= T_FREE_CUSTOMDATA;
@@ -5728,7 +5776,7 @@ int TimeSlide(TransInfo *t, short mval[2])
        /* handle numeric-input stuff */
        t->vec[0] = 2.0f*(cval[0]-sval[0]) / (maxx-minx);
        applyNumInput(&t->num, &t->vec[0]);
-       t->values[0] = (maxx-minx) * t->vec[0] / 2.0 + sval[0];
+       t->values[0] = (maxx-minx) * t->vec[0] / 2.0f + sval[0];
 
        headerTimeSlide(t, sval[0], str);
        applyTimeSlide(t, sval[0]);
@@ -5746,6 +5794,13 @@ void initTimeScale(TransInfo *t)
 {
        int center[2];
 
+       /* this tool is only really available in the Action Editor
+        * AND NLA Editor (for strip scaling)
+        */
+       if (ELEM(t->spacetype, SPACE_ACTION, SPACE_NLA) == 0) {
+               t->state = TRANS_CANCEL;
+       }
+
        t->mode = TFM_TIME_SCALE;
        t->transform = TimeScale;
 
@@ -5855,9 +5910,9 @@ void BIF_TransformSetUndo(char *UNUSED(str))
 }
 
 
-void NDofTransform()
-{
 #if 0 // TRANSFORM_FIX_ME
+static void NDofTransform(void)
+{
        float fval[7];
        float maxval = 50.0f; // also serves as threshold
        int axis = -1;
@@ -5902,5 +5957,5 @@ void NDofTransform()
                initTransform(mode, CTX_NDOF);
                Transform();
        }
-#endif
 }
+#endif