rename operators TFM_OT_* --> TRANSFORM_OT_*
[blender.git] / source / blender / editors / mesh / mesh_ops.c
index 96f5e7452d166ad6836612b9049e16eeb453463b..5f54aa041e3c58f463fe1a590cb679b385411969 100644 (file)
@@ -39,7 +39,7 @@
 #include "DNA_view3d_types.h"
 #include "DNA_windowmanager_types.h"
 
-#include "BLI_arithb.h"
+#include "BLI_math.h"
 #include "BLI_blenlib.h"
 #include "BLI_editVert.h"
 
@@ -55,6 +55,7 @@
 #include "WM_types.h"
 
 #include "ED_mesh.h"
+#include "ED_object.h"
 #include "ED_screen.h"
 #include "ED_transform.h"
 #include "ED_view3d.h"
 
 #include "mesh_intern.h"
 
-/******************************** menus *************************************/
-
-static int vertex_specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
-       uiPopupMenu *pup;
-       uiLayout *layout;
-
-       pup= uiPupMenuBegin(C, "Vertex Specials", 0);
-       layout= uiPupMenuLayout(pup);
-       uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
-
-       uiItemO(layout, "Remove Doubles", 0, "MESH_OT_remove_doubles");
-       uiItemO(layout, "Merge...", 0, "MESH_OT_merge");
-       uiItemO(layout, "Smooth", 0, "MESH_OT_vertices_smooth");
-       uiItemO(layout, "Select Vertex Path", 0, "MESH_OT_select_vertex_path"); 
-       //uiItemO(layout, "Blend From Shape", 0, "MESH_OT_blend_from_shape");
-       //uiItemO(layout, "Propagate to All Shapes", 0, "MESH_OT_shape_propagate_to_all");
-
-       uiPupMenuEnd(C, pup);
-       
-       return OPERATOR_CANCELLED;
-}
-
-static void MESH_OT_vertex_specials(wmOperatorType *ot)
-{
-       /* identifiers */
-       ot->name= "Vertex Specials";
-       //ot->description= "Perform special vertex operations.";
-       ot->idname= "MESH_OT_vertex_specials";
-       
-       /* api callbacks */
-       ot->invoke= vertex_specials_invoke;
-       ot->poll= ED_operator_editmesh;
-}
-
-static int edge_specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
-       uiPopupMenu *pup;
-       uiLayout *layout;
-
-       pup= uiPupMenuBegin(C, "Edge Specials", 0);
-       layout= uiPupMenuLayout(pup);
-       uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
-
-       uiItemO(layout, "Mark Seam", 0, "MESH_OT_mark_seam");
-       uiItemBooleanO(layout, "Clear Seam", 0, "MESH_OT_mark_seam", "clear", 1);
-       uiItemEnumO(layout, "Rotate Edge CW", 0, "MESH_OT_edge_rotate", "direction", 1);
-       uiItemEnumO(layout, "Rotate Edge CCW", 0, "MESH_OT_edge_rotate", "direction", 2);
-       //uiItemO(layout, "Loopcut", 0, "MESH_OT_loop_cut"); // CutEdgeloop(em, 1);
-       //uiItemO(layout, "Edge Slide", 0, "MESH_OT_edge_slide"); // EdgeSlide(em, 0,0.0);
-       uiItemO(layout, "Edge Slide", 0, "TFM_OT_edge_slide");
-       uiItemO(layout, "Edge Loop", 0, "MESH_OT_loop_multi_select");
-       uiItemBooleanO(layout, "Edge Ring", 0, "MESH_OT_loop_multi_select", "ring", 1);
-       uiItemO(layout, NULL, 0, "MESH_OT_loop_to_region");
-       uiItemO(layout, NULL, 0, "MESH_OT_region_to_loop");
-       uiItemO(layout, "Mark Sharp", 0, "MESH_OT_mark_sharp");
-       uiItemBooleanO(layout, "Clear Sharp", 0, "MESH_OT_mark_sharp", "clear", 1);
-
-       uiPupMenuEnd(C, pup);
-
-       return OPERATOR_CANCELLED;
-}
-
-static void MESH_OT_edge_specials(wmOperatorType *ot)
-{
-       /* identifiers */
-       ot->name= "Edge Specials";
-       //ot->description= "Perform special edge operations.";
-       ot->idname= "MESH_OT_edge_specials";
-       
-       /* api callbacks */
-       ot->invoke= edge_specials_invoke;
-       ot->poll= ED_operator_editmesh;
-}
-
-static int face_specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
-       uiPopupMenu *pup;
-       uiLayout *layout;
-
-       pup= uiPupMenuBegin(C, "Face Specials", 0);
-       layout= uiPupMenuLayout(pup);
-       uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
-
-       uiItemO(layout, NULL, 0, "MESH_OT_flip_normals");
-       // uiItemO(layout, "Bevel", 0, "MESH_OT_bevel"); // bevelmenu(em)
-       uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_smooth");
-       uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_flat");
-       uiItemO(layout, NULL, 0, "MESH_OT_quads_convert_to_tris");
-       uiItemO(layout, NULL, 0, "MESH_OT_tris_convert_to_quads");
-       uiItemO(layout, NULL, 0, "MESH_OT_edge_flip");
-
-       uiItemS(layout);
-
-       uiItemO(layout, NULL, 0, "MESH_OT_fill");
-       uiItemO(layout, NULL, 0, "MESH_OT_beauty_fill");
-
-       uiItemS(layout);
-
-       // uiItemO(layout, NULL, 0, "MESH_OT_face_mode"); // mesh_set_face_flags(em, 1);
-       // uiItemBooleanO(layout, NULL, 0, "MESH_OT_face_mode", "clear", 1); // mesh_set_face_flags(em, 0);
-       //
-       // uiItemS(layout);
-
-       uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_uvs_rotate", "direction");
-       uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_uvs_mirror", "axis");
-       uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_colors_rotate", "direction");
-       uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_colors_mirror", "axis");
-
-       uiPupMenuEnd(C, pup);
-       
-       return OPERATOR_CANCELLED;
-}
-
-static void MESH_OT_face_specials(wmOperatorType *ot)
-{
-       /* identifiers */
-       ot->name= "Face Specials";
-       //ot->description= "Perform special face operations.";
-       ot->idname= "MESH_OT_face_specials";
-       
-       /* api callbacks */
-       ot->invoke= face_specials_invoke;
-       ot->poll= ED_operator_editmesh;
-}
-
-static int specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
-       uiPopupMenu *pup;
-       uiLayout *layout;
-
-       pup= uiPupMenuBegin(C, "Specials", 0);
-       layout= uiPupMenuLayout(pup);
-       uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
-
-       uiItemO(layout, "Subdivide", 0, "MESH_OT_subdivide");
-       uiItemFloatO(layout, "Subdivide Smooth", 0, "MESH_OT_subdivide", "smoothness", 1.0f);
-       uiItemO(layout, "Merge...", 0, "MESH_OT_merge");
-       uiItemO(layout, "Remove Doubles", 0, "MESH_OT_remove_doubles");
-       uiItemO(layout, "Hide", 0, "MESH_OT_hide");
-       uiItemO(layout, "Reveal", 0, "MESH_OT_reveal");
-       uiItemO(layout, "Select Inverse", 0, "MESH_OT_select_inverse");
-       uiItemO(layout, NULL, 0, "MESH_OT_flip_normals");
-       uiItemO(layout, "Smooth", 0, "MESH_OT_vertices_smooth");
-       // uiItemO(layout, "Bevel", 0, "MESH_OT_bevel"); // bevelmenu(em)
-       uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_smooth");
-       uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_flat");
-       //uiItemO(layout, "Blend From Shape", 0, "MESH_OT_blend_from_shape");
-       //uiItemO(layout, "Propagate to All Shapes", 0, "MESH_OT_shape_propagate_to_all");
-       uiItemO(layout, "Select Vertex Path", 0, "MESH_OT_select_vertex_path"); 
-       
-       uiPupMenuEnd(C, pup);
-       
-       return OPERATOR_CANCELLED;
-}
-
-static void MESH_OT_specials(wmOperatorType *ot)
-{
-       /* identifiers */
-       ot->name= "Specials";
-       //ot->description= "Perform special vertice, edge or face operations.";
-       ot->idname= "MESH_OT_specials";
-       
-       /* api callbacks */
-       ot->invoke= specials_invoke;
-       ot->poll= ED_operator_editmesh;
-}
-
 /**************************** registration **********************************/
 
 void ED_operatortypes_mesh(void)
 {
-       wmOperatorType *ot;
-       
-       WM_operatortype_append(MESH_OT_select_all_toggle);
+       WM_operatortype_append(MESH_OT_select_all);
        WM_operatortype_append(MESH_OT_select_more);
        WM_operatortype_append(MESH_OT_select_less);
        WM_operatortype_append(MESH_OT_select_inverse);
@@ -249,6 +80,7 @@ void ED_operatortypes_mesh(void)
        WM_operatortype_append(MESH_OT_hide);
        WM_operatortype_append(MESH_OT_reveal);
        WM_operatortype_append(MESH_OT_select_by_number_vertices);
+       WM_operatortype_append(MESH_OT_select_mirror);
        WM_operatortype_append(MESH_OT_normals_make_consistent);
        WM_operatortype_append(MESH_OT_merge);
        WM_operatortype_append(MESH_OT_subdivide);
@@ -257,7 +89,6 @@ void ED_operatortypes_mesh(void)
        WM_operatortype_append(MESH_OT_primitive_plane_add);
        WM_operatortype_append(MESH_OT_primitive_cube_add);
        WM_operatortype_append(MESH_OT_primitive_circle_add);
-       WM_operatortype_append(MESH_OT_primitive_cylinder_add);
        WM_operatortype_append(MESH_OT_primitive_tube_add);
        WM_operatortype_append(MESH_OT_primitive_cone_add);
        WM_operatortype_append(MESH_OT_primitive_grid_add);
@@ -272,13 +103,13 @@ void ED_operatortypes_mesh(void)
        WM_operatortype_append(MESH_OT_spin);
        WM_operatortype_append(MESH_OT_screw);
        
-       WM_operatortype_append(MESH_OT_vertices_transform_to_sphere);
        WM_operatortype_append(MESH_OT_split);
        WM_operatortype_append(MESH_OT_extrude_repeat);
        WM_operatortype_append(MESH_OT_edge_rotate);
        WM_operatortype_append(MESH_OT_select_vertex_path);
        WM_operatortype_append(MESH_OT_loop_to_region);
        WM_operatortype_append(MESH_OT_region_to_loop);
+       WM_operatortype_append(MESH_OT_select_axis);
        
        WM_operatortype_append(MESH_OT_uvs_rotate);
        WM_operatortype_append(MESH_OT_uvs_mirror);
@@ -308,6 +139,8 @@ void ED_operatortypes_mesh(void)
        WM_operatortype_append(MESH_OT_flip_normals);
        WM_operatortype_append(MESH_OT_knife_cut);
        WM_operatortype_append(MESH_OT_rip);
+       WM_operatortype_append(MESH_OT_blend_from_shape);
+       WM_operatortype_append(MESH_OT_shape_propagate_to_all);
        
        WM_operatortype_append(MESH_OT_uv_texture_add);
        WM_operatortype_append(MESH_OT_uv_texture_remove);
@@ -315,48 +148,67 @@ void ED_operatortypes_mesh(void)
        WM_operatortype_append(MESH_OT_vertex_color_remove);
        WM_operatortype_append(MESH_OT_sticky_add);
        WM_operatortype_append(MESH_OT_sticky_remove);
-
-       WM_operatortype_append(MESH_OT_vertex_specials);
-       WM_operatortype_append(MESH_OT_edge_specials);
-       WM_operatortype_append(MESH_OT_face_specials);
-       WM_operatortype_append(MESH_OT_specials);
        
        WM_operatortype_append(MESH_OT_edgering_select);
        WM_operatortype_append(MESH_OT_loopcut);
+}
 
-       /* macros */
+int ED_operator_editmesh_face_select(bContext *C)
+{
+       Object *obedit= CTX_data_edit_object(C);
+       if(obedit && obedit->type==OB_MESH) {
+               EditMesh *em = ((Mesh *)obedit->data)->edit_mesh;
+               if (em && em->selectmode & SCE_SELECT_FACE) {
+                       return 1;
+               }
+       }
+       return 0;
+}
 
-       /*combining operators with invoke and exec portions doesn't work yet.
+void ED_operatormacros_mesh(void)
+{
+       wmOperatorType *ot;
+       wmOperatorTypeMacro *otmacro;
+       int constraint_axis[3] = {0, 0, 1};
        
-       ot= WM_operatortype_append_macro("MESH_OT_loopcut", "Loopcut", OPTYPE_UNDO|OPTYPE_REGISTER);
-       WM_operatortype_macro_define(ot, "MESH_OT_edgering_select");
-       WM_operatortype_macro_define(ot, "MESH_OT_subdivide");
-       */
+       ot= WM_operatortype_append_macro("MESH_OT_loopcut_slide", "Loop Cut and Slide", OPTYPE_UNDO|OPTYPE_REGISTER);
+       WM_operatortype_macro_define(ot, "MESH_OT_loopcut");
+       WM_operatortype_macro_define(ot, "TRANSFORM_OT_edge_slide");
 
        ot= WM_operatortype_append_macro("MESH_OT_duplicate_move", "Add Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER);
        WM_operatortype_macro_define(ot, "MESH_OT_duplicate");
-       WM_operatortype_macro_define(ot, "TFM_OT_translate");
+       otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
+       RNA_enum_set(otmacro->ptr, "proportional", 0);
 
        ot= WM_operatortype_append_macro("MESH_OT_rip_move", "Rip", OPTYPE_UNDO|OPTYPE_REGISTER);
        WM_operatortype_macro_define(ot, "MESH_OT_rip");
-       WM_operatortype_macro_define(ot, "TFM_OT_translate");
+       otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
+       RNA_enum_set(otmacro->ptr, "proportional", 0);
 
-       ot= WM_operatortype_append_macro("MESH_OT_extrude_move", "Extrude", OPTYPE_UNDO|OPTYPE_REGISTER);
+       ot= WM_operatortype_append_macro("MESH_OT_extrude_move_along_normals", "Extrude Along Normals", OPTYPE_UNDO|OPTYPE_REGISTER);
+       ot->poll = ED_operator_editmesh_face_select; /* restrict extrude along normals to face select */
        WM_operatortype_macro_define(ot, "MESH_OT_extrude");
-       WM_operatortype_macro_define(ot, "TFM_OT_translate");
+       otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
+       RNA_enum_set(otmacro->ptr, "proportional", 0);
+       RNA_enum_set(otmacro->ptr, "constraint_orientation", V3D_MANIP_NORMAL);
+       RNA_boolean_set_array(otmacro->ptr, "constraint_axis", constraint_axis);
 
+       ot= WM_operatortype_append_macro("MESH_OT_extrude_move", "Extrude", OPTYPE_UNDO|OPTYPE_REGISTER);
+       WM_operatortype_macro_define(ot, "MESH_OT_extrude");
+       otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
+       RNA_enum_set(otmacro->ptr, "proportional", 0);
 }
 
 /* note mesh keymap also for other space? */
-void ED_keymap_mesh(wmWindowManager *wm)
+void ED_keymap_mesh(wmKeyConfig *keyconf)
 {      
        wmKeyMap *keymap;
-       wmKeymapItem *kmi;
+       wmKeyMapItem *kmi;
        
-       keymap= WM_keymap_find(wm, "EditMesh", 0, 0);
+       keymap= WM_keymap_find(keyconf, "EditMesh", 0, 0);
        keymap->poll= ED_operator_editmesh;
        
-       WM_keymap_add_item(keymap, "MESH_OT_loopcut", ACTIONMOUSE, KM_PRESS, KM_CTRL, RKEY);
+       WM_keymap_add_item(keymap, "MESH_OT_loopcut_slide", RKEY, KM_PRESS, KM_CTRL, 0);
 
        /* selecting */
        /* standard mouse selection goes via space_view3d */
@@ -370,7 +222,7 @@ void ED_keymap_mesh(wmWindowManager *wm)
 
        WM_keymap_add_item(keymap, "MESH_OT_select_shortest_path", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
 
-       WM_keymap_add_item(keymap, "MESH_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
+       WM_keymap_add_item(keymap, "MESH_OT_select_all", AKEY, KM_PRESS, 0, 0);
        WM_keymap_add_item(keymap, "MESH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
        WM_keymap_add_item(keymap, "MESH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
        WM_keymap_add_item(keymap, "MESH_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
@@ -382,8 +234,6 @@ void ED_keymap_mesh(wmWindowManager *wm)
        
        RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_faces_select_linked_flat", FKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0);
        RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_edges_select_sharp", SKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0);
-       
-       WM_keymap_add_item(keymap, "MESH_OT_vertices_transform_to_sphere", SKEY, KM_PRESS, KM_CTRL|KM_SHIFT , 0);
 
        WM_keymap_add_item(keymap, "MESH_OT_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0);
        
@@ -394,11 +244,12 @@ void ED_keymap_mesh(wmWindowManager *wm)
        WM_keymap_add_item(keymap, "MESH_OT_hide", HKEY, KM_PRESS, 0, 0);
        RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
        WM_keymap_add_item(keymap, "MESH_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
-       
+
        /* tools */
        WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0);
        RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "inside", 1);
        
+       WM_keymap_add_item(keymap, "MESH_OT_extrude_move_along_normals", EKEY, KM_PRESS, 0, 0); /* this first so it's selected if possible */
        WM_keymap_add_item(keymap, "MESH_OT_extrude_move", EKEY, KM_PRESS, 0, 0);
        
        WM_keymap_add_item(keymap, "MESH_OT_spin", RKEY, KM_PRESS, KM_ALT, 0);
@@ -409,8 +260,7 @@ void ED_keymap_mesh(wmWindowManager *wm)
        WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL, 0);
        WM_keymap_add_item(keymap, "MESH_OT_tris_convert_to_quads", JKEY, KM_PRESS, KM_ALT, 0);
        WM_keymap_add_item(keymap, "MESH_OT_edge_flip", FKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
-       
-       WM_keymap_add_item(keymap, "MESH_OT_split", FOURKEY, KM_PRESS, KM_CTRL, 0);
+
        WM_keymap_add_item(keymap, "MESH_OT_extrude_repeat", FOURKEY, KM_PRESS, KM_ALT, 0);
        WM_keymap_add_item(keymap, "MESH_OT_edge_rotate", FIVEKEY, KM_PRESS, KM_CTRL, 0);
        
@@ -427,26 +277,34 @@ void ED_keymap_mesh(wmWindowManager *wm)
 
        /* add/remove */
        WM_keymap_add_item(keymap, "MESH_OT_edge_face_add", FKEY, KM_PRESS, 0, 0);
+       WM_keymap_add_item(keymap, "MESH_OT_skin", FKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); /* python */
        WM_keymap_add_item(keymap, "MESH_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
-       WM_keymap_add_item(keymap, "OBJECT_OT_mesh_add", AKEY, KM_PRESS, KM_SHIFT, 0);
+       
+       WM_keymap_add_menu(keymap, "INFO_MT_mesh_add", AKEY, KM_PRESS, KM_SHIFT, 0);
+       
        WM_keymap_add_item(keymap, "MESH_OT_separate", PKEY, KM_PRESS, 0, 0);
-                                               /* use KM_RELEASE because same key is used for tweaks */
-       WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", LEFTMOUSE, KM_RELEASE, KM_CTRL, 0);
+       WM_keymap_add_item(keymap, "MESH_OT_split", YKEY, KM_PRESS, 0, 0);
+
+       /* use KM_CLICK because same key is used for tweaks */
+       WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", LEFTMOUSE, KM_CLICK, KM_CTRL, 0);
        
        WM_keymap_add_item(keymap, "MESH_OT_delete", XKEY, KM_PRESS, 0, 0);
+       WM_keymap_add_item(keymap, "MESH_OT_delete", DELKEY, KM_PRESS, 0, 0);
        
        WM_keymap_add_item(keymap, "MESH_OT_fgon_make", FKEY, KM_PRESS, KM_ALT, 0);
        WM_keymap_add_item(keymap, "MESH_OT_fgon_clear", FKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0);
        
-       WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, KM_CTRL, XKEY);
+       WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, 0, KKEY);
 
        /* menus */
-       WM_keymap_add_item(keymap, "MESH_OT_vertex_specials", VKEY, KM_PRESS, KM_CTRL, 0);
-       WM_keymap_add_item(keymap, "MESH_OT_edge_specials", EKEY, KM_PRESS, KM_CTRL, 0);
-       WM_keymap_add_item(keymap, "MESH_OT_face_specials", FKEY, KM_PRESS, KM_CTRL, 0);
-       WM_keymap_add_item(keymap, "MESH_OT_specials", WKEY, KM_PRESS, 0, 0);
-       
-       /* UV's */
-       WM_keymap_add_item(keymap, "UV_OT_mapping_menu", UKEY, KM_PRESS, 0, 0);
+       WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_specials", WKEY, KM_PRESS, 0, 0);
+       WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_faces", FKEY, KM_PRESS, KM_CTRL, 0);
+       WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_edges", EKEY, KM_PRESS, KM_CTRL, 0);
+       WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_vertices", VKEY, KM_PRESS, KM_CTRL, 0);
+       WM_keymap_add_menu(keymap, "VIEW3D_MT_hook", HKEY, KM_PRESS, KM_CTRL, 0);
+       WM_keymap_add_menu(keymap, "VIEW3D_MT_uv_map", UKEY, KM_PRESS, 0, 0);
+       WM_keymap_add_menu(keymap, "VIEW3D_MT_vertex_group", GKEY, KM_PRESS, KM_CTRL, 0);
+       
+       ED_object_generic_keymap(keyconf, keymap, TRUE);
 }