merge with trunk r39216
authorXiao Xiangquan <xiaoxiangquan@gmail.com>
Wed, 10 Aug 2011 14:32:03 +0000 (14:32 +0000)
committerXiao Xiangquan <xiaoxiangquan@gmail.com>
Wed, 10 Aug 2011 14:32:03 +0000 (14:32 +0000)
58 files changed:
1  2 
SConstruct
intern/ghost/intern/GHOST_NDOFManager.h
intern/ghost/intern/GHOST_SystemSDL.cpp
release/scripts/startup/bl_operators/image.py
release/scripts/startup/bl_operators/object_align.py
release/scripts/startup/bl_operators/wm.py
release/scripts/startup/bl_ui/properties_data_curve.py
release/scripts/startup/bl_ui/properties_data_empty.py
release/scripts/startup/bl_ui/properties_material.py
release/scripts/startup/bl_ui/properties_particle.py
release/scripts/startup/bl_ui/properties_world.py
release/scripts/startup/bl_ui/space_info.py
release/scripts/startup/bl_ui/space_node.py
release/scripts/startup/bl_ui/space_userpref.py
release/scripts/startup/bl_ui/space_userpref_keymap.py
release/scripts/startup/bl_ui/space_view3d.py
release/scripts/startup/bl_ui/space_view3d_toolbar.py
source/blender/editors/curve/editcurve.c
source/blender/editors/curve/editfont.c
source/blender/editors/gpencil/gpencil_paint.c
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_layout.c
source/blender/editors/interface/interface_regions.c
source/blender/editors/interface/interface_style.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/interface/interface_utils.c
source/blender/editors/object/object_edit.c
source/blender/editors/object/object_relations.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/sculpt_paint/paint_image.c
source/blender/editors/space_file/file_ops.c
source/blender/editors/space_image/image_ops.c
source/blender/editors/space_node/node_edit.c
source/blender/editors/space_sequencer/sequencer_edit.c
source/blender/editors/space_view3d/view3d_edit.c
source/blender/editors/space_view3d/view3d_fly.c
source/blender/editors/space_view3d/view3d_header.c
source/blender/editors/space_view3d/view3d_select.c
source/blender/editors/space_view3d/view3d_view.c
source/blender/editors/transform/CMakeLists.txt
source/blender/editors/transform/transform.c
source/blender/editors/transform/transform_ops.c
source/blender/makesrna/RNA_access.h
source/blender/makesrna/intern/CMakeLists.txt
source/blender/makesrna/intern/rna_ID.c
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_action.c
source/blender/makesrna/intern/rna_curve.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_userdef.c
source/blender/makesrna/intern/rna_wm.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_files.c
source/blender/windowmanager/intern/wm_init_exit.c
source/blender/windowmanager/intern/wm_operators.c
source/blender/windowmanager/intern/wm_window.c

diff --cc SConstruct
Simple merge
  #define _GHOST_NDOFMANAGER_H_
  
  #include "GHOST_System.h"
- #include "GHOST_IWindow.h"
  
  
 -// #define DEBUG_NDOF_MOTION
 -// #define DEBUG_NDOF_BUTTONS
  
+ typedef enum {
+       NDOF_UnknownDevice, // <-- motion will work fine, buttons are ignored
+       // current devices
+       NDOF_SpaceNavigator,
+       NDOF_SpaceExplorer,
+       NDOF_SpacePilotPro,
+       // older devices
+       NDOF_SpacePilot
+       } NDOF_DeviceT;
+ // NDOF device button event types
+ typedef enum {
+       // used internally, never sent
+       NDOF_BUTTON_NONE,
+       // these two are available from any 3Dconnexion device
+       NDOF_BUTTON_MENU,
+       NDOF_BUTTON_FIT,
+       // standard views
+       NDOF_BUTTON_TOP,
+       NDOF_BUTTON_BOTTOM,
+       NDOF_BUTTON_LEFT,
+       NDOF_BUTTON_RIGHT,
+       NDOF_BUTTON_FRONT,
+       NDOF_BUTTON_BACK,
+       // more views
+       NDOF_BUTTON_ISO1,
+       NDOF_BUTTON_ISO2,
+       // 90 degree rotations
+       // these don't all correspond to physical buttons
+       NDOF_BUTTON_ROLL_CW,
+       NDOF_BUTTON_ROLL_CCW,
+       NDOF_BUTTON_SPIN_CW,
+       NDOF_BUTTON_SPIN_CCW,
+       NDOF_BUTTON_TILT_CW,
+       NDOF_BUTTON_TILT_CCW,
+       // device control
+       NDOF_BUTTON_ROTATE,
+       NDOF_BUTTON_PANZOOM,
+       NDOF_BUTTON_DOMINANT,
+       NDOF_BUTTON_PLUS,
+       NDOF_BUTTON_MINUS,
+       // general-purpose buttons
+       // users can assign functions via keymap editor
+       NDOF_BUTTON_1,
+       NDOF_BUTTON_2,
+       NDOF_BUTTON_3,
+       NDOF_BUTTON_4,
+       NDOF_BUTTON_5,
+       NDOF_BUTTON_6,
+       NDOF_BUTTON_7,
+       NDOF_BUTTON_8,
+       NDOF_BUTTON_9,
+       NDOF_BUTTON_10,
+       } NDOF_ButtonT;
  class GHOST_NDOFManager
  {
  public:
@@@ -20,8 -20,8 +20,9 @@@
  
  import bpy
  from mathutils import Vector
 +from blf import gettext as _
  
  def GlobalBB_LQ(bb_world):
  
      # Initialize the variables with the 8th vertex
@@@ -361,8 -361,8 +361,8 @@@ class DATA_PT_paragraph(CurveButtonsPan
          col.prop(text, "offset_y", text="Y")
  
  
- class DATA_PT_textboxes(CurveButtonsPanel, bpy.types.Panel):
+ class DATA_PT_text_boxes(CurveButtonsPanel, bpy.types.Panel):
 -    bl_label = "Text Boxes"
 +    bl_label = _("Text Boxes")
  
      @classmethod
      def poll(cls, context):
@@@ -38,19 -38,17 +38,17 @@@ class DATA_PT_empty(DataButtonsPanel, b
  
          ob = context.object
  
 -        layout.prop(ob, "empty_draw_type", text="Display")
 +        layout.prop(ob, "empty_draw_type", text=_("Display"))
  
          if ob.empty_draw_type == 'IMAGE':
-             # layout.template_image(ob, "data", None)
              layout.template_ID(ob, "data", open="image.open", unlink="image.unlink")
  
-             row = layout.row(align=True)
-             row.prop(ob, "color", text=_("Transparency"), index=3, slider=True)
 -            layout.prop(ob, "color", text="Transparency", index=3, slider=True)
++            layout.prop(ob, "color", text=_("Transparency"), index=3, slider=True)
              row = layout.row(align=True)
 -            row.prop(ob, "empty_image_offset", text="Offset X", index=0)
 -            row.prop(ob, "empty_image_offset", text="Offset Y", index=1)
 +            row.prop(ob, "empty_image_offset", text=_("Offset X"), index=0)
 +            row.prop(ob, "empty_image_offset", text=_("Offset Y"), index=1)
  
 -        layout.prop(ob, "empty_draw_size", text="Size")
 +        layout.prop(ob, "empty_draw_size", text=_("Size"))
  
  if __name__ == "__main__":  # only for live edit.
      bpy.utils.register_module(__name__)
@@@ -239,23 -239,25 +239,25 @@@ class MATERIAL_PT_diffuse(MaterialButto
              col.prop(mat, "darkness")
          elif mat.diffuse_shader == 'TOON':
              row = col.row()
 -            row.prop(mat, "diffuse_toon_size", text="Size")
 -            row.prop(mat, "diffuse_toon_smooth", text="Smooth")
 +            row.prop(mat, "diffuse_toon_size", text=_("Size"))
 +            row.prop(mat, "diffuse_toon_smooth", text=_("Smooth"))
          elif mat.diffuse_shader == 'FRESNEL':
              row = col.row()
 -            row.prop(mat, "diffuse_fresnel", text="Fresnel")
 -            row.prop(mat, "diffuse_fresnel_factor", text="Factor")
 +            row.prop(mat, "diffuse_fresnel", text=_("Fresnel"))
 +            row.prop(mat, "diffuse_fresnel_factor", text=_("Factor"))
  
          if mat.use_diffuse_ramp:
-             layout.separator()
-             layout.template_color_ramp(mat, "diffuse_ramp", expand=True)
-             layout.separator()
+             col = layout.column()
+             col.active = (not mat.use_shadeless)
+             col.separator()
+             col.template_color_ramp(mat, "diffuse_ramp", expand=True)
+             col.separator()
  
-             row = layout.row()
+             row = col.row()
 -            row.prop(mat, "diffuse_ramp_input", text="Input")
 -            row.prop(mat, "diffuse_ramp_blend", text="Blend")
 +            row.prop(mat, "diffuse_ramp_input", text=_("Input"))
 +            row.prop(mat, "diffuse_ramp_blend", text=_("Blend"))
  
-             layout.prop(mat, "diffuse_ramp_factor", text=_("Factor"))
 -            col.prop(mat, "diffuse_ramp_factor", text="Factor")
++            col.prop(mat, "diffuse_ramp_factor", text=_("Factor"))
  
  
  class MATERIAL_PT_specular(MaterialButtonsPanel, bpy.types.Panel):
@@@ -461,9 -460,9 +461,9 @@@ class PARTICLE_PT_physics(ParticleButto
          if part.physics_type != 'NO':
              col = row.column(align=True)
              col.prop(part, "mass")
 -            col.prop(part, "use_multiply_size_mass", text="Multiply mass with size")
 +            col.prop(part, "use_multiply_size_mass", text=_("Multiply mass with size"))
  
-         if part.physics_type in ('NEWTON', 'FLUID'):
+         if part.physics_type in {'NEWTON', 'FLUID'}:
              split = layout.split()
  
              col = split.column()
@@@ -352,8 -351,8 +352,8 @@@ class INFO_MT_help(bpy.types.Menu)
  
          layout = self.layout
  
 -        layout.operator("wm.url_open", text="Manual", icon='HELP').url = 'http://wiki.blender.org/index.php/Doc:Manual'
 -        layout.operator("wm.url_open", text="Release Log", icon='URL').url = 'http://www.blender.org/development/release-logs/blender-259/'
 +        layout.operator("wm.url_open", text=_("Manual"), icon='HELP').url = 'http://wiki.blender.org/index.php/Doc:Manual'
-         layout.operator("wm.url_open", text=_("Release Log"), icon='URL').url = 'http://www.blender.org/development/release-logs/blender-257/'
++        layout.operator("wm.url_open", text=_("Release Log"), icon='URL').url = 'http://www.blender.org/development/release-logs/blender-259/'
  
          layout.separator()
  
@@@ -755,9 -755,34 +755,34 @@@ class USERPREF_PT_file(bpy.types.Panel)
  from bl_ui.space_userpref_keymap import InputKeyMapPanel
  
  
 -    bl_label = "3D Mouse Settings"
+ class USERPREF_MT_ndof_settings(bpy.types.Menu):
+     # accessed from the window keybindings in C (only)
++    bl_label = _("3D Mouse Settings")
+     def draw(self, context):
+         layout = self.layout
+         input_prefs = context.user_preferences.inputs
+         layout.separator()
+         layout.prop(input_prefs, "ndof_sensitivity")
+         if context.space_data.type == 'VIEW_3D':
+             layout.separator()
+             layout.prop(input_prefs, "ndof_show_guide")
+             layout.separator()
+             layout.label(text="orbit options")
+             layout.prop(input_prefs, "ndof_orbit_invert_axes")
+             layout.separator()
+             layout.label(text="fly options")
+             layout.prop(input_prefs, "ndof_fly_helicopter", icon='NDOF_FLY')
+             layout.prop(input_prefs, "ndof_lock_horizon", icon='NDOF_DOM')
  class USERPREF_PT_input(bpy.types.Panel, InputKeyMapPanel):
      bl_space_type = 'USER_PREFERENCES'
 -    bl_label = "Input"
 +    bl_label = _("Input")
  
      @classmethod
      def poll(cls, context):
@@@ -1047,9 -1074,12 +1074,12 @@@ class USERPREF_PT_addons(bpy.types.Pane
  class WM_OT_addon_enable(bpy.types.Operator):
      "Enable an addon"
      bl_idname = "wm.addon_enable"
 -    bl_label = "Enable Add-On"
 +    bl_label = _("Enable Add-On")
  
-     module = StringProperty(name=_("Module"), description=_("Module name of the addon to enable"))
+     module = StringProperty(
 -            name="Module",
 -            description="Module name of the addon to enable",
++            name=_("Module"),
++            description=_("Module name of the addon to enable"),
+             )
  
      def execute(self, context):
          mod = addon_utils.enable(self.module)
@@@ -190,10 -188,10 +190,10 @@@ class InputKeyMapPanel
  
          if km.is_modal:
              row.label(text="", icon='LINKED')
-         if km.is_user_defined:
+         if km.is_user_modified:
 -            row.operator("wm.keymap_restore", text="Restore")
 +            row.operator("wm.keymap_restore", text=_("Restore"))
          else:
-             row.operator("wm.keymap_edit", text=_("Edit"))
+             row.label()
  
          if km.show_expanded_children:
              if children:
                  # "Add New" at end of keymap item list
                  col = self.indented_layout(col, level + 1)
                  subcol = col.split(percentage=0.2).column()
-                 subcol.enabled = km.is_user_defined
 -                subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN')
 +                subcol.operator("wm.keyitem_add", text=_("Add New"), icon='ZOOMIN')
  
              col.separator()
  
                  row.label()
                  row.label()
  
-                 if km.is_user_defined:
+                 if km.is_user_modified:
 -                    row.operator("wm.keymap_restore", text="Restore")
 +                    row.operator("wm.keymap_restore", text=_("Restore"))
                  else:
-                     row.operator("wm.keymap_edit", text=_("Edit"))
+                     row.label()
  
                  for kmi in filtered_items:
                      self.draw_kmi(display_keymaps, kc, km, kmi, col, 1)
                  # "Add New" at end of keymap item list
                  col = self.indented_layout(layout, 1)
                  subcol = col.split(percentage=0.2).column()
-                 subcol.enabled = km.is_user_defined
 -                subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN')
 +                subcol.operator("wm.keyitem_add", text=_("Add New"), icon='ZOOMIN')
  
      def draw_hierarchy(self, display_keymaps, layout):
          for entry in KM_HIERARCHY:
@@@ -87,9 -87,10 +88,10 @@@ class VIEW3D_PT_tools_objectmode(View3D
          if active_object and active_object.type == 'MESH':
  
              col = layout.column(align=True)
 -            col.label(text="Shading:")
 +            col.label(text=_("Shading:"))
-             col.operator("object.shade_smooth", text=_("Smooth"))
-             col.operator("object.shade_flat", text=_("Flat"))
+             row = col.row(align=True)
 -            row.operator("object.shade_smooth", text="Smooth")
 -            row.operator("object.shade_flat", text="Flat")
++            row.operator("object.shade_smooth", text=_("Smooth"))
++            row.operator("object.shade_flat", text=_("Flat"))
  
          draw_keyframing_tools(context, layout)
  
@@@ -4132,8 -4134,9 +4134,9 @@@ static uiBlock *menu_add_shortcut(bCont
        wmKeyMapItem *kmi;
        PointerRNA ptr;
        uiLayout *layout;
 -      uiStyle *style= U.uistyles.first;
 +      uiStyle *style= UI_GetStyle();
        IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
+       int kmi_id;
        
        /* XXX this guess_opname can potentially return a different keymap than being found on adding later... */
        km = WM_keymap_guess_opname(C, but->optype->idname);            
@@@ -404,10 -415,7 +415,7 @@@ static void template_ID(bContext *C, ui
  
                        sprintf(str, "%d", id->us);
  
-                       if(id->us<10)
-                               but= uiDefBut(block, BUT, 0, str, 0,0,UI_UNIT_X,UI_UNIT_Y, NULL, 0, 0, 0, 0, _("Displays number of users of this data. Click to make a single-user copy."));
-                       else
-                               but= uiDefBut(block, BUT, 0, str, 0,0,UI_UNIT_X+10,UI_UNIT_Y, NULL, 0, 0, 0, 0, _("Displays number of users of this data. Click to make a single-user copy."));
 -                      but= uiDefBut(block, BUT, 0, str, 0,0,UI_UNIT_X + ((id->us < 10) ? 0:10), UI_UNIT_Y, NULL, 0, 0, 0, 0, "Displays number of users of this data. Click to make a single-user copy.");
++                      but= uiDefBut(block, BUT, 0, str, 0,0,UI_UNIT_X + ((id->us < 10) ? 0:10), UI_UNIT_Y, NULL, 0, 0, 0, 0, _("Displays number of users of this data. Click to make a single-user copy."));
  
                        uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_ALONE));
                        if(!id_copy(id, NULL, 1 /* test only */) || (idfrom && idfrom->lib) || !editable)
@@@ -436,9 -434,66 +436,66 @@@ void IMAGE_OT_view_zoom(wmOperatorType 
        
        /* properties */
        RNA_def_float(ot->srna, "factor", 0.0f, 0.0f, FLT_MAX,
 -              "Factor", "Zoom factor, values higher than 1.0 zoom in, lower values zoom out.", -FLT_MAX, FLT_MAX);
 +              _("Factor"), _("Zoom factor, values higher than 1.0 zoom in, lower values zoom out."), -FLT_MAX, FLT_MAX);
  }
  
+ /********************** NDOF operator *********************/
+ /* Combined pan/zoom from a 3D mouse device.
+  * Z zooms, XY pans
+  * "view" (not "paper") control -- user moves the viewpoint, not the image being viewed
+  * that explains the negative signs in the code below
+  */
+ static int view_ndof_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
+ {
+       if (event->type != NDOF_MOTION)
+               return OPERATOR_CANCELLED;
+       else {
+               SpaceImage *sima= CTX_wm_space_image(C);
+               ARegion *ar= CTX_wm_region(C);
+               wmNDOFMotionData* ndof = (wmNDOFMotionData*) event->customdata;
+               float dt = ndof->dt;
+               /* tune these until it feels right */
+               const float zoom_sensitivity = 0.5f; // 50% per second (I think)
+               const float pan_sensitivity = 300.f; // screen pixels per second
+               float pan_x = pan_sensitivity * dt * ndof->tvec[0] / sima->zoom;
+               float pan_y = pan_sensitivity * dt * ndof->tvec[1] / sima->zoom;
+               /* "mouse zoom" factor = 1 + (dx + dy) / 300
+                * what about "ndof zoom" factor? should behave like this:
+                * at rest -> factor = 1
+                * move forward -> factor > 1
+                * move backward -> factor < 1
+                */
+               float zoom_factor = 1.f + zoom_sensitivity * dt * -ndof->tvec[2];
+               if (U.ndof_flag & NDOF_ZOOM_INVERT)
+                       zoom_factor = -zoom_factor;
+               sima_zoom_set_factor(sima, ar, zoom_factor);
+               sima->xof += pan_x;
+               sima->yof += pan_y;
+               ED_region_tag_redraw(ar);       
+               return OPERATOR_FINISHED;
+       }
+ }
+ void IMAGE_OT_view_ndof(wmOperatorType *ot)
+ {
+       /* identifiers */
+       ot->name= "NDOF Pan/Zoom";
+       ot->idname= "IMAGE_OT_view_ndof";
+       
+       /* api callbacks */
+       ot->invoke= view_ndof_invoke;
+ }
  /********************** view all operator *********************/
  
  /* Updates the fields of the View2D member of the SpaceImage struct.
@@@ -1836,12 -1834,11 +1836,11 @@@ static int sequencer_separate_images_ex
  void SEQUENCER_OT_images_separate(wmOperatorType *ot)
  {
        /* identifiers */
 -      ot->name= "Separate Images";
 +      ot->name= _("Separate Images");
        ot->idname= "SEQUENCER_OT_images_separate";
 -      ot->description="On image sequences strips, it return a strip for each image";
 +      ot->description=_("On image sequences strips, it return a strip for each image");
        
        /* api callbacks */
-       ot->invoke= WM_operator_props_popup;
        ot->exec= sequencer_separate_images_exec;
        ot->poll= sequencer_edit_poll;
        
@@@ -109,9 -109,9 +112,9 @@@ void fly_modal_keymap(wmKeyConfig *keyc
        wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "View3D Fly Modal");
  
        /* this function is called for each spacetype, only needs to add map once */
-       if(keymap) return;
+       if (keymap) return;
  
 -      keymap= WM_modalkeymap_add(keyconf, "View3D Fly Modal", modal_items);
 +      keymap= WM_modalkeymap_add(keyconf, "View3D Fly Modal", RNA_enum_items_gettexted(modal_items));
  
        /* items for modal map */
        WM_modalkeymap_add_item(keymap, ESCKEY,    KM_PRESS, KM_ANY, 0, FLY_MODAL_CANCEL);
@@@ -278,11 -276,12 +278,12 @@@ static char *view3d_modeselect_pup(Scen
        static char formatstr[] = "|%s %%x%d %%i%d";
        char *str = string;
  
 -      str += sprintf(str, "Mode: %%t");
 +      str += sprintf(str, _("Mode: %%t"));
        
 -      str += sprintf(str, formatstr, "Object Mode", OB_MODE_OBJECT, ICON_OBJECT_DATA);
 +      str += sprintf(str, formatstr, _("Object Mode"), OB_MODE_OBJECT, ICON_OBJECT_DATA);
        
-       if(ob==NULL) return string;
+       if(ob==NULL || ob->data==NULL) return string;
+       if(ob->id.lib || ((ID *)ob->data)->lib) return string;
        
        /* if active object is editable */
        if ( ((ob->type == OB_MESH)
@@@ -495,11 -502,16 +504,16 @@@ void Transform_Properties(struct wmOper
        
        if (flags & P_OPTIONS)
        {
 -              RNA_def_boolean(ot->srna, "texture_space", 0, "Edit Object data texture space", "");
 +              RNA_def_boolean(ot->srna, "texture_space", 0, _("Edit Object data texture space"), "");
        }
  
+       if (flags & P_CORRECT_UV)
+       {
+               RNA_def_boolean(ot->srna, "correct_uv", 0, "Correct UV coords when transforming", "");
+       }
        // Add confirm method all the time. At the end because it's not really that important and should be hidden only in log, not in keymap edit
 -      /*prop =*/ RNA_def_boolean(ot->srna, "release_confirm", 0, "Confirm on Release", "Always confirm operation when releasing button");
 +      /*prop =*/ RNA_def_boolean(ot->srna, "release_confirm", 0, _("Confirm on Release"), _("Always confirm operation when releasing button"));
        //RNA_def_property_flag(prop, PROP_HIDDEN);
  }
  
@@@ -743,9 -755,9 +757,9 @@@ void TRANSFORM_OT_edge_slide(struct wmO
        ot->cancel  = transform_cancel;
        ot->poll   = ED_operator_editmesh;
  
 -      RNA_def_float_factor(ot->srna, "value", 0, -1.0f, 1.0f, "Factor", "", -1.0f, 1.0f);
 +      RNA_def_float_factor(ot->srna, "value", 0, -1.0f, 1.0f, _("Factor"), "", -1.0f, 1.0f);
  
-       Transform_Properties(ot, P_MIRROR|P_SNAP);
+       Transform_Properties(ot, P_MIRROR|P_SNAP|P_CORRECT_UV);
  }
  
  void TRANSFORM_OT_edge_crease(struct wmOperatorType *ot)
Simple merge
@@@ -250,11 -242,7 +250,11 @@@ blender_include_dirs_sys
  )
  
  add_executable(makesrna ${SRC} ${SRC_RNA_INC} ${SRC_DNA_INC})
 -target_link_libraries(makesrna bf_dna)
 +if (WITH_INTERNATIONAL) 
-       target_link_libraries(makesrna bf_dna ${GETTEXT_LIB} ${PLATFORM_LINKFLAGS})
++      target_link_libraries(makesrna bf_dna ${GETTEXT_LIB})
 +else()
 +      target_link_libraries(makesrna bf_dna)
 +endif()
  
  # Output rna_*_gen.c
  # note (linux only): with crashes try add this after COMMAND: valgrind --leak-check=full --track-origins=yes
  #include "RNA_access.h"
  #include "RNA_define.h"
  
 +#include "BLF_api.h"
 +
  #include "DNA_ID.h"
  #include "DNA_vfont_types.h"
+ #include "DNA_material_types.h"
  #include "DNA_object_types.h"
  
  #include "WM_types.h"
@@@ -3252,7 -3251,7 +3252,7 @@@ void RNA_def_scene(BlenderRNA *brna
        RNA_def_property_int_sdna(prop, NULL, "r.cfra");
        RNA_def_property_range(prop, MINAFRAME, MAXFRAME);
        RNA_def_property_int_funcs(prop, NULL, "rna_Scene_current_frame_set", NULL);
-       RNA_def_property_ui_text(prop, N_("Current Frame"), N_("Current Frame"));
 -      RNA_def_property_ui_text(prop, "Current Frame", "Current Frame, to update animation data from python frame_set() instead");
++      RNA_def_property_ui_text(prop, N_("Current Frame"), N_("Current Frame, to update animation data from python frame_set() instead"));
        RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
        RNA_def_property_update(prop, NC_SCENE|ND_FRAME, "rna_Scene_frame_update");
        
@@@ -2741,18 -2743,44 +2748,44 @@@ static void rna_def_userdef_input(Blend
        prop= RNA_def_property(srna, "drag_threshold", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "dragthreshold");
        RNA_def_property_range(prop, 3, 40);
 -      RNA_def_property_ui_text(prop, "Drag Threshold", "Amount of pixels you have to drag before dragging UI items happens");
 +      RNA_def_property_ui_text(prop, N_("Drag Threshold"), N_("Amount of pixels you have to drag before dragging UI items happens"));
-       
-       prop= RNA_def_property(srna, "ndof_pan_speed", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, "ndof_pan");
-       RNA_def_property_range(prop, 0, 200);
-       RNA_def_property_ui_text(prop, N_("NDof Pan Speed"), N_("The overall panning speed of an NDOF device, as percent of standard"));
  
-       prop= RNA_def_property(srna, "ndof_rotate_speed", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, "ndof_rotate");
-       RNA_def_property_range(prop, 0, 200);
-       RNA_def_property_ui_text(prop, N_("NDof Rotation Speed"), N_("The overall rotation speed of an NDOF device, as percent of standard"));
-       
+       /* 3D mouse settings */
+       /* global options */
+       prop= RNA_def_property(srna, "ndof_sensitivity", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_range(prop, 0.25f, 4.0f);
 -      RNA_def_property_ui_text(prop, "Sensitivity", "Overall sensitivity of the 3D Mouse");
++      RNA_def_property_ui_text(prop, N_("Sensitivity"), N_("Overall sensitivity of the 3D Mouse"));
+       prop= RNA_def_property(srna, "ndof_zoom_updown", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_ZOOM_UPDOWN);
 -      RNA_def_property_ui_text(prop, "Zoom = Up/Down", "Zoom using up/down on the device (otherwise forward/backward)");
++      RNA_def_property_ui_text(prop, N_("Zoom = Up/Down"), N_("Zoom using up/down on the device (otherwise forward/backward)"));
+       prop= RNA_def_property(srna, "ndof_zoom_invert", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_ZOOM_INVERT);
 -      RNA_def_property_ui_text(prop, "Invert Zoom", "Zoom using opposite direction"); 
++      RNA_def_property_ui_text(prop, N_("Invert Zoom"), N_("Zoom using opposite direction")); 
+       /* 3D view */
+       prop= RNA_def_property(srna, "ndof_show_guide", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_SHOW_GUIDE);
 -      RNA_def_property_ui_text(prop, "Show Navigation Guide", "Display the center and axis during rotation");
++      RNA_def_property_ui_text(prop, N_("Show Navigation Guide"), N_("Display the center and axis during rotation"));
+       /* TODO: update description when fly-mode visuals are in place  ("projected position in fly mode")*/
+       /* 3D view: orbit */
+       prop= RNA_def_property(srna, "ndof_orbit_invert_axes", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_ORBIT_INVERT_AXES);
 -      RNA_def_property_ui_text(prop, "Invert Axes", "Toggle between moving the viewpoint or moving the scene being viewed");
++      RNA_def_property_ui_text(prop, N_("Invert Axes"), N_("Toggle between moving the viewpoint or moving the scene being viewed"));
+       /* in 3Dx docs, this is called 'object mode' vs. 'target camera mode' */
+       /* 3D view: fly */
+       prop= RNA_def_property(srna, "ndof_lock_horizon", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_LOCK_HORIZON);
 -      RNA_def_property_ui_text(prop, "Lock Horizon", "Keep horizon level while flying with 3D Mouse");
++      RNA_def_property_ui_text(prop, N_("Lock Horizon"), N_("Keep horizon level while flying with 3D Mouse"));
+       prop= RNA_def_property(srna, "ndof_fly_helicopter", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_FLY_HELICOPTER);
 -      RNA_def_property_ui_text(prop, "Helicopter Mode", "Device up/down directly controls your Z position");
++      RNA_def_property_ui_text(prop, N_("Helicopter Mode"), N_("Device up/down directly controls your Z position"));
        prop= RNA_def_property(srna, "mouse_double_click_time", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "dbl_click_time");
        RNA_def_property_range(prop, 1, 1000);
        prop= RNA_def_property(srna, "wheel_scroll_lines", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "wheellinescroll");
        RNA_def_property_range(prop, 0, 32);
 -      RNA_def_property_ui_text(prop, "Wheel Scroll Lines", "The number of lines scrolled at a time with the mouse wheel");
 +      RNA_def_property_ui_text(prop, N_("Wheel Scroll Lines"), N_("The number of lines scrolled at a time with the mouse wheel"));
        
-       /* U.keymaps - custom keymaps that have been edited from default configs */
-       prop= RNA_def_property(srna, "edited_keymaps", PROP_COLLECTION, PROP_NONE);
-       RNA_def_property_collection_sdna(prop, NULL, "keymaps", NULL);
-       RNA_def_property_struct_type(prop, "KeyMap");
-       RNA_def_property_ui_text(prop, N_("Edited Keymaps"), "");
-       
        prop= RNA_def_property(srna, "active_keyconfig", PROP_STRING, PROP_DIRPATH);
        RNA_def_property_string_sdna(prop, NULL, "keyconfigstr");
 -      RNA_def_property_ui_text(prop, "Key Config", "The name of the active key configuration");
 +      RNA_def_property_ui_text(prop, N_("Key Config"), N_("The name of the active key configuration"));
  }
  
  static void rna_def_userdef_filepaths(BlenderRNA *brna)
@@@ -102,12 -100,52 +102,52 @@@ EnumPropertyItem event_mouse_type_items
        {0, NULL, 0, NULL, NULL}};
  
  EnumPropertyItem event_timer_type_items[]= {
 -      {TIMER, "TIMER", 0, "Timer", ""},
 -      {TIMER0, "TIMER0", 0, "Timer 0", ""},
 -      {TIMER1, "TIMER1", 0, "Timer 1", ""},
 -      {TIMER2, "TIMER2", 0, "Timer 2", ""},
 +      {TIMER, "TIMER", 0, N_("Timer"), ""},
 +      {TIMER0, "TIMER0", 0, N_("Timer 0"), ""},
 +      {TIMER1, "TIMER1", 0, N_("Timer 1"), ""},
 +      {TIMER2, "TIMER2", 0, N_("Timer 2"), ""},
        {0, NULL, 0, NULL, NULL}};
  
+ EnumPropertyItem event_ndof_type_items[]= {
+       /* buttons on all 3dconnexion devices */
+       {NDOF_BUTTON_MENU, "NDOF_BUTTON_MENU", 0, "Menu", ""},
+       {NDOF_BUTTON_FIT, "NDOF_BUTTON_FIT", 0, "Fit", ""},
+       /* view buttons */
+       {NDOF_BUTTON_TOP, "NDOF_BUTTON_TOP", 0, "Top", ""},
+       {NDOF_BUTTON_BOTTOM, "NDOF_BUTTON_BOTTOM", 0, "Bottom", ""},
+       {NDOF_BUTTON_LEFT, "NDOF_BUTTON_LEFT", 0, "Left", ""},
+       {NDOF_BUTTON_RIGHT, "NDOF_BUTTON_RIGHT", 0, "Right", ""},
+       {NDOF_BUTTON_FRONT, "NDOF_BUTTON_FRONT", 0, "Front", ""},
+       {NDOF_BUTTON_BACK, "NDOF_BUTTON_BACK", 0, "Back", ""},
+       /* more views */
+       {NDOF_BUTTON_ISO1, "NDOF_BUTTON_ISO1", 0, "ISO 1", ""},
+       {NDOF_BUTTON_ISO2, "NDOF_BUTTON_ISO2", 0, "ISO 2", ""},
+       /* 90 degree rotations */
+       {NDOF_BUTTON_ROLL_CW, "NDOF_BUTTON_ROLL_CW", 0, "Roll CW", ""},
+       {NDOF_BUTTON_ROLL_CCW, "NDOF_BUTTON_ROLL_CCW", 0, "Roll CCW", ""},
+       {NDOF_BUTTON_SPIN_CW, "NDOF_BUTTON_SPIN_CW", 0, "Spin CW", ""},
+       {NDOF_BUTTON_SPIN_CCW, "NDOF_BUTTON_SPIN_CCW", 0, "Spin CCW", ""},
+       {NDOF_BUTTON_TILT_CW, "NDOF_BUTTON_TILT_CW", 0, "Tilt CW", ""},
+       {NDOF_BUTTON_TILT_CCW, "NDOF_BUTTON_TILT_CCW", 0, "Tilt CCW", ""},
+       /* device control */
+       {NDOF_BUTTON_ROTATE, "NDOF_BUTTON_ROTATE", 0, "Rotate", ""},
+       {NDOF_BUTTON_PANZOOM, "NDOF_BUTTON_PANZOOM", 0, "Pan/Zoom", ""},
+       {NDOF_BUTTON_DOMINANT, "NDOF_BUTTON_DOMINANT", 0, "Dominant", ""},
+       {NDOF_BUTTON_PLUS, "NDOF_BUTTON_PLUS", 0, "Plus", ""},
+       {NDOF_BUTTON_MINUS, "NDOF_BUTTON_MINUS", 0, "Minus", ""},
+       /* general-purpose buttons */
+       {NDOF_BUTTON_1, "NDOF_BUTTON_1", 0, "Button 1", ""},
+       {NDOF_BUTTON_2, "NDOF_BUTTON_2", 0, "Button 2", ""},
+       {NDOF_BUTTON_3, "NDOF_BUTTON_3", 0, "Button 3", ""},
+       {NDOF_BUTTON_4, "NDOF_BUTTON_4", 0, "Button 4", ""},
+       {NDOF_BUTTON_5, "NDOF_BUTTON_5", 0, "Button 5", ""},
+       {NDOF_BUTTON_6, "NDOF_BUTTON_6", 0, "Button 6", ""},
+       {NDOF_BUTTON_7, "NDOF_BUTTON_7", 0, "Button 7", ""},
+       {NDOF_BUTTON_8, "NDOF_BUTTON_8", 0, "Button 8", ""},
+       {NDOF_BUTTON_9, "NDOF_BUTTON_9", 0, "Button 9", ""},
+       {NDOF_BUTTON_10, "NDOF_BUTTON_10", 0, "Button 10", ""},
+       {0, NULL, 0, NULL, NULL}};
  /* not returned: CAPSLOCKKEY, UNKNOWNKEY */
  EnumPropertyItem event_type_items[] = {
  
        {F17KEY, "F17", 0, "F17", ""},
        {F18KEY, "F18", 0, "F18", ""},
        {F19KEY, "F19", 0, "F19", ""},
 -      {PAUSEKEY, "PAUSE", 0, "Pause", ""},
 -      {INSERTKEY, "INSERT", 0, "Insert", ""},
 +      {PAUSEKEY, "PAUSE", 0, N_("Pause"), ""},
 +      {INSERTKEY, "INSERT", 0, N_("Insert"), ""},
        {HOMEKEY, "HOME", 0, "Home", ""},
 -      {PAGEUPKEY, "PAGE_UP", 0, "Page Up", ""},
 -      {PAGEDOWNKEY, "PAGE_DOWN", 0, "Page Down", ""},
 +      {PAGEUPKEY, "PAGE_UP", 0, N_("Page Up"), ""},
 +      {PAGEDOWNKEY, "PAGE_DOWN", 0, N_("Page Down"), ""},
        {ENDKEY, "END", 0, "End", ""},
        {0, "", 0, NULL, NULL},
 -      {MEDIAPLAY, "MEDIA_PLAY", 0, "Media Play/Pause", ""},
 -      {MEDIASTOP, "MEDIA_STOP", 0, "Media Stop", ""},
 -      {MEDIAFIRST, "MEDIA_FIRST", 0, "Media First", ""},
 -      {MEDIALAST, "MEDIA_LAST", 0, "Media Last", ""},
 +      {MEDIAPLAY, "MEDIA_PLAY", 0, N_("Media Play/Pause"), ""},
 +      {MEDIASTOP, "MEDIA_STOP", 0, N_("Media Stop"), ""},
 +      {MEDIAFIRST, "MEDIA_FIRST", 0, N_("Media First"), ""},
 +      {MEDIALAST, "MEDIA_LAST", 0, N_("Media Last"), ""},
        {0, "", 0, NULL, NULL},
 -      {WINDEACTIVATE, "WINDOW_DEACTIVATE", 0, "Window Deactivate", ""},
 -      {TIMER, "TIMER", 0, "Timer", ""},
 -      {TIMER0, "TIMER0", 0, "Timer 0", ""},
 -      {TIMER1, "TIMER1", 0, "Timer 1", ""},
 -      {TIMER2, "TIMER2", 0, "Timer 2", ""},
 +      {WINDEACTIVATE, "WINDOW_DEACTIVATE", 0, N_("Window Deactivate"), ""},
 +      {TIMER, "TIMER", 0, N_("Timer"), ""},
 +      {TIMER0, "TIMER0", 0, N_("Timer 0"), ""},
 +      {TIMER1, "TIMER1", 0, N_("Timer 1"), ""},
 +      {TIMER2, "TIMER2", 0, N_("Timer 2"), ""},
+       {0, "", 0, NULL, NULL},
+       /* buttons on all 3dconnexion devices */
 -      {NDOF_BUTTON_MENU, "NDOF_BUTTON_MENU", 0, "Menu", ""},
 -      {NDOF_BUTTON_FIT, "NDOF_BUTTON_FIT", 0, "Fit", ""},
++      {NDOF_BUTTON_MENU, "NDOF_BUTTON_MENU", 0, N_("Menu"), ""},
++      {NDOF_BUTTON_FIT, "NDOF_BUTTON_FIT", 0, N_("Fit"), ""},
+       /* view buttons */
 -      {NDOF_BUTTON_TOP, "NDOF_BUTTON_TOP", 0, "Top", ""},
 -      {NDOF_BUTTON_BOTTOM, "NDOF_BUTTON_BOTTOM", 0, "Bottom", ""},
 -      {NDOF_BUTTON_LEFT, "NDOF_BUTTON_LEFT", 0, "Left", ""},
 -      {NDOF_BUTTON_RIGHT, "NDOF_BUTTON_RIGHT", 0, "Right", ""},
 -      {NDOF_BUTTON_FRONT, "NDOF_BUTTON_FRONT", 0, "Front", ""},
 -      {NDOF_BUTTON_BACK, "NDOF_BUTTON_BACK", 0, "Back", ""},
++      {NDOF_BUTTON_TOP, "NDOF_BUTTON_TOP", 0, N_("Top"), ""},
++      {NDOF_BUTTON_BOTTOM, "NDOF_BUTTON_BOTTOM", 0, N_("Bottom"), ""},
++      {NDOF_BUTTON_LEFT, "NDOF_BUTTON_LEFT", 0, N_("Left"), ""},
++      {NDOF_BUTTON_RIGHT, "NDOF_BUTTON_RIGHT", 0, N_("Right"), ""},
++      {NDOF_BUTTON_FRONT, "NDOF_BUTTON_FRONT", 0, N_("Front"), ""},
++      {NDOF_BUTTON_BACK, "NDOF_BUTTON_BACK", 0, N_("Back"), ""},
+       /* more views */
+       {NDOF_BUTTON_ISO1, "NDOF_BUTTON_ISO1", 0, "ISO 1", ""},
+       {NDOF_BUTTON_ISO2, "NDOF_BUTTON_ISO2", 0, "ISO 2", ""},
+       /* 90 degree rotations */
 -      {NDOF_BUTTON_ROLL_CW, "NDOF_BUTTON_ROLL_CW", 0, "Roll CW", ""},
 -      {NDOF_BUTTON_ROLL_CCW, "NDOF_BUTTON_ROLL_CCW", 0, "Roll CCW", ""},
 -      {NDOF_BUTTON_SPIN_CW, "NDOF_BUTTON_SPIN_CW", 0, "Spin CW", ""},
 -      {NDOF_BUTTON_SPIN_CCW, "NDOF_BUTTON_SPIN_CCW", 0, "Spin CCW", ""},
 -      {NDOF_BUTTON_TILT_CW, "NDOF_BUTTON_TILT_CW", 0, "Tilt CW", ""},
 -      {NDOF_BUTTON_TILT_CCW, "NDOF_BUTTON_TILT_CCW", 0, "Tilt CCW", ""},
++      {NDOF_BUTTON_ROLL_CW, "NDOF_BUTTON_ROLL_CW", 0, N_("Roll CW"), ""},
++      {NDOF_BUTTON_ROLL_CCW, "NDOF_BUTTON_ROLL_CCW", 0, N_("Roll CCW"), ""},
++      {NDOF_BUTTON_SPIN_CW, "NDOF_BUTTON_SPIN_CW", 0, N_("Spin CW"), ""},
++      {NDOF_BUTTON_SPIN_CCW, "NDOF_BUTTON_SPIN_CCW", 0, N_("Spin CCW"), ""},
++      {NDOF_BUTTON_TILT_CW, "NDOF_BUTTON_TILT_CW", 0, N_("Tilt CW"), ""},
++      {NDOF_BUTTON_TILT_CCW, "NDOF_BUTTON_TILT_CCW", 0, N_("Tilt CCW"), ""},
+       /* device control */
 -      {NDOF_BUTTON_ROTATE, "NDOF_BUTTON_ROTATE", 0, "Rotate", ""},
 -      {NDOF_BUTTON_PANZOOM, "NDOF_BUTTON_PANZOOM", 0, "Pan/Zoom", ""},
 -      {NDOF_BUTTON_DOMINANT, "NDOF_BUTTON_DOMINANT", 0, "Dominant", ""},
 -      {NDOF_BUTTON_PLUS, "NDOF_BUTTON_PLUS", 0, "Plus", ""},
 -      {NDOF_BUTTON_MINUS, "NDOF_BUTTON_MINUS", 0, "Minus", ""},
++      {NDOF_BUTTON_ROTATE, "NDOF_BUTTON_ROTATE", 0, N_("Rotate"), ""},
++      {NDOF_BUTTON_PANZOOM, "NDOF_BUTTON_PANZOOM", 0, N_("Pan/Zoom"), ""},
++      {NDOF_BUTTON_DOMINANT, "NDOF_BUTTON_DOMINANT", 0, N_("Dominant"), ""},
++      {NDOF_BUTTON_PLUS, "NDOF_BUTTON_PLUS", 0, N_("Plus"), ""},
++      {NDOF_BUTTON_MINUS, "NDOF_BUTTON_MINUS", 0, N_("Minus"), ""},
+       /* general-purpose buttons */
 -      {NDOF_BUTTON_1, "NDOF_BUTTON_1", 0, "Button 1", ""},
 -      {NDOF_BUTTON_2, "NDOF_BUTTON_2", 0, "Button 2", ""},
 -      {NDOF_BUTTON_3, "NDOF_BUTTON_3", 0, "Button 3", ""},
 -      {NDOF_BUTTON_4, "NDOF_BUTTON_4", 0, "Button 4", ""},
 -      {NDOF_BUTTON_5, "NDOF_BUTTON_5", 0, "Button 5", ""},
 -      {NDOF_BUTTON_6, "NDOF_BUTTON_6", 0, "Button 6", ""},
 -      {NDOF_BUTTON_7, "NDOF_BUTTON_7", 0, "Button 7", ""},
 -      {NDOF_BUTTON_8, "NDOF_BUTTON_8", 0, "Button 8", ""},
 -      {NDOF_BUTTON_9, "NDOF_BUTTON_9", 0, "Button 9", ""},
 -      {NDOF_BUTTON_10, "NDOF_BUTTON_10", 0, "Button 10", ""},
++      {NDOF_BUTTON_1, "NDOF_BUTTON_1", 0, N_("Button 1"), ""},
++      {NDOF_BUTTON_2, "NDOF_BUTTON_2", 0, N_("Button 2"), ""},
++      {NDOF_BUTTON_3, "NDOF_BUTTON_3", 0, N_("Button 3"), ""},
++      {NDOF_BUTTON_4, "NDOF_BUTTON_4", 0, N_("Button 4"), ""},
++      {NDOF_BUTTON_5, "NDOF_BUTTON_5", 0, N_("Button 5"), ""},
++      {NDOF_BUTTON_6, "NDOF_BUTTON_6", 0, N_("Button 6"), ""},
++      {NDOF_BUTTON_7, "NDOF_BUTTON_7", 0, N_("Button 7"), ""},
++      {NDOF_BUTTON_8, "NDOF_BUTTON_8", 0, N_("Button 8"), ""},
++      {NDOF_BUTTON_9, "NDOF_BUTTON_9", 0, N_("Button 9"), ""},
++      {NDOF_BUTTON_10, "NDOF_BUTTON_10", 0, N_("Button 10"), ""},
        {0, NULL, 0, NULL, NULL}};      
  
  EnumPropertyItem keymap_propvalue_items[] = {
@@@ -1650,13 -1560,12 +1562,12 @@@ static void rna_def_keyconfig(BlenderRN
        PropertyRNA *prop;
  
        static EnumPropertyItem map_type_items[] = {
 -              {KMI_TYPE_KEYBOARD, "KEYBOARD", 0, "Keyboard", ""},
 -              {KMI_TYPE_TWEAK, "TWEAK", 0, "Tweak", ""},
 -              {KMI_TYPE_MOUSE, "MOUSE", 0, "Mouse", ""},
 -              {KMI_TYPE_NDOF, "NDOF", 0, "NDOF", ""},
 -              {KMI_TYPE_TEXTINPUT, "TEXTINPUT", 0, "Text Input", ""},
 -              {KMI_TYPE_TIMER, "TIMER", 0, "Timer", ""},
 +              {KMI_TYPE_KEYBOARD, "KEYBOARD", 0, N_("Keyboard"), ""},
 +              {KMI_TYPE_TWEAK, "TWEAK", 0, N_("Tweak"), ""},
 +              {KMI_TYPE_MOUSE, "MOUSE", 0, N_("Mouse"), ""},
++              {KMI_TYPE_NDOF, "NDOF", 0, N_("NDOF"), ""},
 +              {KMI_TYPE_TEXTINPUT, "TEXTINPUT", 0, N_("Text Input"), ""},
 +              {KMI_TYPE_TIMER, "TIMER", 0, N_("Timer"), ""},
                {0, NULL, 0, NULL, NULL}};
  
        /* KeyConfig */
        prop= RNA_def_property(srna, "keymap_items", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "items", NULL);
        RNA_def_property_struct_type(prop, "KeyMapItem");
 -      RNA_def_property_ui_text(prop, "Items", "Items in the keymap, linking an operator to an input event");
 +      RNA_def_property_ui_text(prop, N_("Items"), N_("Items in the keymap, linking an operator to an input event"));
        rna_def_keymap_items(brna, prop);
  
-       prop= RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NEVER_NULL);
-       RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYMAP_USER);
+       prop= RNA_def_property(srna, "is_user_modified", PROP_BOOLEAN, PROP_NEVER_NULL);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYMAP_USER_MODIFIED);
 -      RNA_def_property_ui_text(prop, "User Defined", "Keymap is defined by the user");
 +      RNA_def_property_ui_text(prop, N_("User Defined"), N_("Keymap is defined by the user"));
  
        prop= RNA_def_property(srna, "is_modal", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYMAP_MODAL);
  
        prop= RNA_def_property(srna, "idname", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "idname");
 -      RNA_def_property_ui_text(prop, "Identifier", "Identifier of operator to call on input event");
 +      RNA_def_property_ui_text(prop, N_("Identifier"), N_("Identifier of operator to call on input event"));
        RNA_def_property_string_funcs(prop, "rna_wmKeyMapItem_idname_get", "rna_wmKeyMapItem_idname_length", "rna_wmKeyMapItem_idname_set");
        RNA_def_struct_name_property(srna, prop);
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
        
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        prop= RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "OperatorProperties");
        RNA_def_property_pointer_funcs(prop, "rna_KeyMapItem_properties_get", NULL, NULL, NULL);
 -      RNA_def_property_ui_text(prop, "Properties", "Properties to set when the operator is called");
 +      RNA_def_property_ui_text(prop, N_("Properties"), N_("Properties to set when the operator is called"));
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "map_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "maptype");
        RNA_def_property_enum_items(prop, map_type_items);
        RNA_def_property_enum_funcs(prop, "rna_wmKeyMapItem_map_type_get", "rna_wmKeyMapItem_map_type_set", NULL);
 -      RNA_def_property_ui_text(prop, "Map Type", "Type of event mapping");
 +      RNA_def_property_ui_text(prop, N_("Map Type"), N_("Type of event mapping"));
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "type");
        RNA_def_property_enum_items(prop, event_type_items);
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_KeyMapItem_type_itemf");
 -      RNA_def_property_ui_text(prop, "Type", "Type of event");
 +      RNA_def_property_ui_text(prop, N_("Type"), N_("Type of event"));
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "value", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "val");
        RNA_def_property_enum_items(prop, event_value_items);
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_KeyMapItem_value_itemf");
 -      RNA_def_property_ui_text(prop, "Value", "");
 +      RNA_def_property_ui_text(prop, N_("Value"), "");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "id", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "id");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_ui_text(prop, "id", "ID of the item");
 +      RNA_def_property_ui_text(prop, "id", N_("ID of the item"));
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "any", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_any_getf", "rna_KeyMapItem_any_setf");
 -      RNA_def_property_ui_text(prop, "Any", "Any modifier keys pressed");
 +      RNA_def_property_ui_text(prop, N_("Any"), N_("Any modifier keys pressed"));
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "shift", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "shift", 0);
  //    RNA_def_property_enum_sdna(prop, NULL, "shift");
  //    RNA_def_property_enum_items(prop, keymap_modifiers_items);
 -      RNA_def_property_ui_text(prop, "Shift", "Shift key pressed");
 +      RNA_def_property_ui_text(prop, "Shift", N_("Shift key pressed"));
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "ctrl", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ctrl", 0);
  //    RNA_def_property_enum_sdna(prop, NULL, "ctrl");
  //    RNA_def_property_enum_items(prop, keymap_modifiers_items);
 -      RNA_def_property_ui_text(prop, "Ctrl", "Control key pressed");
 +      RNA_def_property_ui_text(prop, "Ctrl", N_("Control key pressed"));
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "alt", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "alt", 0);
  //    RNA_def_property_enum_sdna(prop, NULL, "alt");
  //    RNA_def_property_enum_items(prop, keymap_modifiers_items);
 -      RNA_def_property_ui_text(prop, "Alt", "Alt key pressed");
 +      RNA_def_property_ui_text(prop, "Alt", N_("Alt key pressed"));
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "oskey", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "oskey", 0);
  //    RNA_def_property_enum_sdna(prop, NULL, "oskey");
  //    RNA_def_property_enum_items(prop, keymap_modifiers_items);
 -      RNA_def_property_ui_text(prop, "OS Key", "Operating system key pressed");
 +      RNA_def_property_ui_text(prop, N_("OS Key"), N_("Operating system key pressed"));
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "key_modifier", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "keymodifier");
        RNA_def_property_enum_items(prop, event_type_items);
 -      RNA_def_property_ui_text(prop, "Key Modifier", "Regular key pressed as a modifier");
 +      RNA_def_property_ui_text(prop, N_("Key Modifier"), N_("Regular key pressed as a modifier"));
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", KMI_EXPANDED);
        RNA_def_property_enum_sdna(prop, NULL, "propvalue");
        RNA_def_property_enum_items(prop, keymap_propvalue_items);
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_KeyMapItem_propvalue_itemf");
 -      RNA_def_property_ui_text(prop, "Property Value", "The value this event translates to in a modal keymap");
 +      RNA_def_property_ui_text(prop, N_("Property Value"), N_("The value this event translates to in a modal keymap"));
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
  
        prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", KMI_INACTIVE);
 -      RNA_def_property_ui_text(prop, "Active", "Activate or deactivate item");
 +      RNA_def_property_ui_text(prop, N_("Active"), N_("Activate or deactivate item"));
        RNA_def_property_ui_icon(prop, ICON_CHECKBOX_DEHLT, 1);
  
 -      RNA_def_property_ui_text(prop, "User Modified", "Is this keymap item modified by the user");
+       prop= RNA_def_property(srna, "is_user_modified", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", KMI_USER_MODIFIED);
+       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
++      RNA_def_property_ui_text(prop, N_("User Modified"), N_("Is this keymap item modified by the user"));
        prop= RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-       RNA_def_property_ui_text(prop, N_("User Defined"), N_("Is this keymap item user defined (doesn't just override a builtin item)"));
 -      RNA_def_property_ui_text(prop, "User Defined", "Is this keymap item user defined (doesn't just replace a builtin item)");
++      RNA_def_property_ui_text(prop, N_("User Defined"), N_("Is this keymap item user defined (doesn't just replace a builtin item)"));
        RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_userdefined_get", NULL);
  
        RNA_api_keymapitem(srna);
Simple merge
@@@ -1245,12 -1245,12 +1245,12 @@@ static uiBlock *wm_block_create_splash(
        
        split = uiLayoutSplit(layout, 0, 0);
        col = uiLayoutColumn(split, 0);
-       uiItemL(col, _("Links"), ICON_NONE);
+       uiItemL(col, "Links", ICON_NONE);
 -      uiItemStringO(col, "Donations", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/blenderorg/blender-foundation/donation-payment/");
 -      uiItemStringO(col, "Release Log", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-259/");
 -      uiItemStringO(col, "Manual", ICON_URL, "WM_OT_url_open", "url", "http://wiki.blender.org/index.php/Doc:2.5/Manual");
 -      uiItemStringO(col, "Blender Website", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/");
 -      uiItemStringO(col, "User Community", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/community/user-community/"); // 
 +      uiItemStringO(col, _("Donations"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/blenderorg/blender-foundation/donation-payment/");
-       uiItemStringO(col, _("Release Log"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-257/");
++      uiItemStringO(col, _("Release Log"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-259/");
 +      uiItemStringO(col, _("Manual"), ICON_URL, "WM_OT_url_open", "url", "http://wiki.blender.org/index.php/Doc:2.5/Manual");
 +      uiItemStringO(col, _("Blender Website"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/");
 +      uiItemStringO(col, _("User Community"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/community/user-community/"); // 
        if(strcmp(STRINGIFY(BLENDER_VERSION_CYCLE), "release")==0) {
                BLI_snprintf(url, sizeof(url), "http://www.blender.org/documentation/blender_python_api_%d_%d" STRINGIFY(BLENDER_VERSION_CHAR) "_release", BLENDER_VERSION/100, BLENDER_VERSION%100);
        }