Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-01-01 16:15:35 +0300
committerTon Roosendaal <ton@blender.org>2009-01-01 16:15:35 +0300
commite9a3b4f85df2261cafea0bfc9f0a885708cdf9d6 (patch)
treed4ebc689eb2f61a1af93ccd13b882e55e635c455 /source/blender/editors
parenta1c4d1c735c59b5911dbd0d8557b8f2b32263fe5 (diff)
2.5
- Edit mode Mesh undo/redo back (undo for editmodes needed recode, todo for curve/lattice/etc) - Added border select for edit mesh - Added Akey (de)select all for edit mesh - Added notifiers for mode changes. This is also the first trial to dynamically add/remove keymap handlers, based on modes. For that reason the Object keymap was split in 2, modal and non-modal. On TABkey, the view3d listener removes and adds maps. The view3d keymap still handles generic mouse/border selection. Internally it will verify modes. The modes are not re-implemented still... have to move this to scene context.
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/include/ED_mesh.h40
-rw-r--r--source/blender/editors/include/ED_screen.h3
-rw-r--r--source/blender/editors/include/ED_util.h15
-rw-r--r--source/blender/editors/mesh/Makefile1
-rw-r--r--source/blender/editors/mesh/editface.c2
-rw-r--r--source/blender/editors/mesh/editmesh.c33
-rw-r--r--source/blender/editors/mesh/editmesh_add.c2
-rw-r--r--source/blender/editors/mesh/editmesh_lib.c2
-rw-r--r--source/blender/editors/mesh/editmesh_loop.c2
-rw-r--r--source/blender/editors/mesh/editmesh_mods.c44
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c2
-rw-r--r--source/blender/editors/mesh/mesh_intern.h (renamed from source/blender/editors/mesh/editmesh.h)10
-rw-r--r--source/blender/editors/mesh/mesh_ops.c78
-rw-r--r--source/blender/editors/mesh/meshtools.c2
-rw-r--r--source/blender/editors/object/object_edit.c19
-rw-r--r--source/blender/editors/object/object_ops.c8
-rw-r--r--source/blender/editors/screen/screen_ops.c23
-rw-r--r--source/blender/editors/space_api/spacetypes.c5
-rw-r--r--source/blender/editors/space_outliner/space_outliner.c2
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c57
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c23
-rw-r--r--source/blender/editors/util/ed_util.c3
-rw-r--r--source/blender/editors/util/editmode_undo.c80
-rw-r--r--source/blender/editors/util/undo.c83
-rw-r--r--source/blender/editors/util/util_intern.h38
25 files changed, 413 insertions, 164 deletions
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 7a042aa286d..5a093484461 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -31,7 +31,12 @@
struct View3D;
struct ARegion;
struct EditMesh;
+struct EditVert;
+struct EditEdge;
+struct EditFace;
struct bContext;
+struct wmWindowManager;
+struct EditSelection;
// edge and face flag both
#define EM_FGON 2
@@ -67,39 +72,48 @@ typedef struct ViewContext {
/* meshtools.c */
-intptr_t mesh_octree_table(Object *ob, EditMesh *em, float *co, char mode);
-EditVert *editmesh_get_x_mirror_vert(Object *ob, EditMesh *em, float *co);
+intptr_t mesh_octree_table(Object *ob, struct EditMesh *em, float *co, char mode);
+struct EditVert *editmesh_get_x_mirror_vert(Object *ob, struct EditMesh *em, float *co);
+
+/* mesh_ops.c */
+void ED_operatortypes_mesh(void);
+void ED_keymap_mesh(struct wmWindowManager *wm);
+
/* editmesh.c */
+void ED_spacetypes_init(void);
+void ED_keymap_mesh(struct wmWindowManager *wm);
+
void make_editMesh(Scene *scene, Object *ob);
void load_editMesh(Scene *scene, Object *ob);
void remake_editMesh(Scene *scene, Object *ob);
-void free_editMesh(EditMesh *em);
+void free_editMesh(struct EditMesh *em);
void EM_init_index_arrays(struct EditMesh *em, int forVert, int forEdge, int forFace);
void EM_free_index_arrays(void);
-EditVert *EM_get_vert_for_index(int index);
-EditEdge *EM_get_edge_for_index(int index);
-EditFace *EM_get_face_for_index(int index);
+struct EditVert *EM_get_vert_for_index(int index);
+struct EditEdge *EM_get_edge_for_index(int index);
+struct EditFace *EM_get_face_for_index(int index);
int EM_texFaceCheck(struct EditMesh *em);
int EM_vertColorCheck(struct EditMesh *em);
-void undo_push_mesh(char *name);
+
+void undo_push_mesh(struct bContext *C, char *name);
/* editmesh_lib.c */
-EditFace *EM_get_actFace(struct EditMesh *em, int sloppy);
+struct EditFace *EM_get_actFace(struct EditMesh *em, int sloppy);
-void EM_select_edge(EditEdge *eed, int sel);
-void EM_select_face_fgon(struct EditMesh *em, EditFace *efa, int val);
+void EM_select_edge(struct EditEdge *eed, int sel);
+void EM_select_face_fgon(struct EditMesh *em, struct EditFace *efa, int val);
void EM_selectmode_flush(struct EditMesh *em);
void EM_deselect_flush(struct EditMesh *em);
/* exported to transform */
-int EM_get_actSelection(EditMesh *em, EditSelection *ese);
-void EM_editselection_normal(float *normal, EditSelection *ese);
-void EM_editselection_plane(float *plane, EditSelection *ese);
+int EM_get_actSelection(struct EditMesh *em, struct EditSelection *ese);
+void EM_editselection_normal(float *normal, struct EditSelection *ese);
+void EM_editselection_plane(float *plane, struct EditSelection *ese);
/* editmesh_mods.c */
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 1f3d156d0b2..95ac858bb09 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -94,6 +94,9 @@ int ED_operator_node_active(struct bContext *C);
int ED_operator_ipo_active(struct bContext *C);
int ED_operator_sequencer_active(struct bContext *C);
+int ED_operator_object_active(struct bContext *C);
+int ED_operator_editmesh(struct bContext *C);
+int ED_operator_editcurve(struct bContext *C);
/* default keymaps, bitflags */
#define ED_KEYMAP_UI 1
diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h
index 411c3f250da..4fe7112bc26 100644
--- a/source/blender/editors/include/ED_util.h
+++ b/source/blender/editors/include/ED_util.h
@@ -46,14 +46,19 @@ void ED_OT_undo (struct wmOperatorType *ot);
void ED_OT_redo (struct wmOperatorType *ot);
/* undo_editmode.c */
-void undo_editmode_push (char *name, void (*freedata)(void *),
- void (*to_editmode)(void *), void *(*from_editmode)(void),
- int (*validate_undo)(void *));
+void undo_editmode_push(struct bContext *C, char *name,
+ void * (*getdata)(struct bContext *C),
+ void (*freedata)(void *),
+ void (*to_editmode)(void *, void *),
+ void *(*from_editmode)(void *),
+ int (*validate_undo)(void *, void *));
+
+
void *undo_editmode_get_prev (struct Object *ob);
struct uiBlock *editmode_undohistorymenu(struct bContext *C, struct uiMenuBlockHandle *handle, void *arg_unused);
-void undo_editmode_menu (void);
+void undo_editmode_menu (struct bContext *C);
void undo_editmode_clear (void);
-void undo_editmode_step (int step);
+void undo_editmode_step (struct bContext *C, int step);
/* ************** XXX OLD CRUFT WARNING ************* */
diff --git a/source/blender/editors/mesh/Makefile b/source/blender/editors/mesh/Makefile
index daa5702f1fd..60b1fa1c329 100644
--- a/source/blender/editors/mesh/Makefile
+++ b/source/blender/editors/mesh/Makefile
@@ -47,6 +47,7 @@ CPPFLAGS += -I../../blenkernel
CPPFLAGS += -I../../blenloader
CPPFLAGS += -I../../blenlib
CPPFLAGS += -I../../makesdna
+CPPFLAGS += -I../../makesrna
CPPFLAGS += -I../../imbuf
CPPFLAGS += -I../../gpu
CPPFLAGS += -I../../render/extern/include
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c
index 69d73846710..61bfc8b8a0f 100644
--- a/source/blender/editors/mesh/editface.c
+++ b/source/blender/editors/mesh/editface.c
@@ -79,7 +79,7 @@
#include "WM_types.h"
/* own include */
-#include "editmesh.h"
+#include "mesh_intern.h"
/* Pupmenu codes: */
diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c
index d3be73fed0c..80e5d0f910a 100644
--- a/source/blender/editors/mesh/editmesh.c
+++ b/source/blender/editors/mesh/editmesh.c
@@ -81,7 +81,7 @@
#include "ED_util.h"
/* own include */
-#include "editmesh.h"
+#include "mesh_intern.h"
/*
editmesh.c:
@@ -1877,10 +1877,10 @@ static void free_undoMesh(void *umv)
MEM_freeN(um);
}
-static void *editMesh_to_undoMesh(void)
+static void *editMesh_to_undoMesh(void *emv)
{
- EditMesh *em= NULL; // XXX
- Scene *scene= NULL;
+ EditMesh *em= (EditMesh *)emv;
+// Scene *scene= NULL;
UndoMesh *um;
EditVert *eve;
EditEdge *eed;
@@ -1891,7 +1891,7 @@ static void *editMesh_to_undoMesh(void)
EditFaceC *efac=NULL;
EditSelectionC *esec=NULL;
int a;
- return NULL; // XXX
+
um= MEM_callocN(sizeof(UndoMesh), "undomesh");
um->selectmode = em->selectmode;
@@ -1972,7 +1972,7 @@ static void *editMesh_to_undoMesh(void)
}
// XXX um->retopo_paint_data= retopo_paint_data_copy(em->retopo_paint_data);
- um->retopo_mode= scene->toolsettings->retopo_mode;
+// um->retopo_mode= scene->toolsettings->retopo_mode;
{
Multires *mr= get_mesh(G.obedit)->mr;
@@ -1996,10 +1996,10 @@ static void *editMesh_to_undoMesh(void)
return um;
}
-static void undoMesh_to_editMesh(void *umv)
+static void undoMesh_to_editMesh(void *umv, void *emv)
{
- EditMesh *em= NULL; // XXX
- UndoMesh *um= (UndoMesh*)umv;
+ EditMesh *em= (EditMesh *)emv;
+ UndoMesh *um= (UndoMesh *)umv;
EditVert *eve, **evar=NULL;
EditEdge *eed;
EditFace *efa;
@@ -2009,7 +2009,7 @@ static void undoMesh_to_editMesh(void *umv)
EditFaceC *efac;
EditSelectionC *esec;
int a=0;
- return; // XXX
+
em->selectmode = um->selectmode;
free_editMesh(em);
@@ -2110,11 +2110,20 @@ static void undoMesh_to_editMesh(void *umv)
}
}
+static void *getEditMesh(bContext *C)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ if(obedit) {
+ Mesh *me= obedit->data;
+ return me->edit_mesh;
+ }
+ return NULL;
+}
/* and this is all the undo system needs to know */
-void undo_push_mesh(char *name)
+void undo_push_mesh(bContext *C, char *name)
{
- undo_editmode_push(name, free_undoMesh, undoMesh_to_editMesh, editMesh_to_undoMesh, NULL);
+ undo_editmode_push(C, name, getEditMesh, free_undoMesh, undoMesh_to_editMesh, editMesh_to_undoMesh, NULL);
}
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c
index 241d992bdee..60d821b9801 100644
--- a/source/blender/editors/mesh/editmesh_add.c
+++ b/source/blender/editors/mesh/editmesh_add.c
@@ -61,7 +61,7 @@
#include "ED_multires.h"
#include "ED_view3d.h"
-#include "editmesh.h"
+#include "mesh_intern.h"
/* bpymenu removed XXX */
diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c
index 667c8d5ac45..115207736c9 100644
--- a/source/blender/editors/mesh/editmesh_lib.c
+++ b/source/blender/editors/mesh/editmesh_lib.c
@@ -56,7 +56,7 @@ editmesh_lib: generic (no UI, no menus) operations/evaluators for editmesh data
#include "ED_mesh.h"
-#include "editmesh.h"
+#include "mesh_intern.h"
/* this replaces the active flag used in uv/face mode */
void EM_set_actFace(EditMesh *em, EditFace *efa)
diff --git a/source/blender/editors/mesh/editmesh_loop.c b/source/blender/editors/mesh/editmesh_loop.c
index a3e02cdd1c1..d12c2845718 100644
--- a/source/blender/editors/mesh/editmesh_loop.c
+++ b/source/blender/editors/mesh/editmesh_loop.c
@@ -69,7 +69,7 @@ editmesh_loop: tools with own drawing subloops, select, knife, subdiv
#include "ED_mesh.h"
#include "ED_view3d.h"
-#include "editmesh.h"
+#include "mesh_intern.h"
/* **** XXX ******** */
static void BIF_undo_push() {}
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c
index 5dae6a686c0..c62c64564f4 100644
--- a/source/blender/editors/mesh/editmesh_mods.c
+++ b/source/blender/editors/mesh/editmesh_mods.c
@@ -76,14 +76,18 @@ editmesh_mods.c, UI level access, no geometry changes
#include "WM_api.h"
#include "WM_types.h"
+#include "RNA_access.h"
+#include "RNA_define.h"
+
#include "ED_multires.h"
#include "ED_mesh.h"
+#include "ED_screen.h"
#include "ED_view3d.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
-#include "editmesh.h"
+#include "mesh_intern.h"
#include "BLO_sys_types.h" // for intptr_t support
@@ -2174,6 +2178,7 @@ static void mouse_mesh_loop(ViewContext *vc)
/* here actual select happens */
+/* gets called via generic mouse select operator */
void mouse_mesh(bContext *C, short mval[2], short extend)
{
ViewContext vc;
@@ -3225,22 +3230,41 @@ void selectswap_mesh(EditMesh *em) /* UI level */
}
-void deselectall_mesh(EditMesh *em) /* this toggles!!!, UI level */
+/* ******************** (de)select all operator **************** */
+
+static int toggle_select_all_exec(bContext *C, wmOperator *op)
{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
- if( EM_nvertices_selected(em) ) {
- EM_clear_flag_all(em, SELECT);
- BIF_undo_push("Deselect All");
- }
- else {
- EM_set_flag_all(em, SELECT);
- BIF_undo_push("Select All");
- }
+ if( EM_nvertices_selected(em) ) {
+ EM_clear_flag_all(em, SELECT);
+ BIF_undo_push("Deselect All");
+ }
+ else {
+ EM_set_flag_all(em, SELECT);
+ BIF_undo_push("Select All");
+ }
// if (EM_texFaceCheck())
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, G.obedit);
+ return OPERATOR_FINISHED;
+}
+void MESH_OT_de_select_all(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select or Deselect All";
+ ot->idname= "MESH_OT_de_select_all";
+
+ /* api callbacks */
+ ot->exec= toggle_select_all_exec;
+ ot->poll= ED_operator_editmesh;
}
+/* ******************** **************** */
+
void EM_select_more(EditMesh *em)
{
EditVert *eve;
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 2374ef62bfc..663ed2ef2c1 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -82,7 +82,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
#include "ED_mesh.h"
#include "ED_view3d.h"
-#include "editmesh.h"
+#include "mesh_intern.h"
/* XXX */
static void BIF_undo_push() {}
diff --git a/source/blender/editors/mesh/editmesh.h b/source/blender/editors/mesh/mesh_intern.h
index 67badd3f462..02b139476b0 100644
--- a/source/blender/editors/mesh/editmesh.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -29,10 +29,11 @@
/* Internal for editmesh_xxxx.c functions */
-#ifndef EDITMESH_H
-#define EDITMESH_H
+#ifndef MESH_INTERN_H
+#define MESH_INTERN_H
struct bContext;
+struct wmOperatorType;
#define TEST_EDITMESH if(G.obedit==0) return; /* layer test XXX */
@@ -164,6 +165,9 @@ extern struct EditFace *EM_face_from_faces(EditMesh *em, struct EditFace *efa1,
/* ******************* editmesh_mods.c */
+
+void MESH_OT_de_select_all(struct wmOperatorType *ot);
+
extern EditEdge *findnearestedge(ViewContext *vc, int *dist);
extern void EM_automerge(int update);
void editmesh_select_by_material(EditMesh *em, int index);
@@ -195,5 +199,5 @@ void esubdivideflag(EditMesh *em, int flag, float rad, int beauty, int numcuts,
int EdgeSlide(EditMesh *em, short immediate, float imperc);
-#endif
+#endif // MESH_INTERN_H
diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c
new file mode 100644
index 00000000000..a1ee2475fd2
--- /dev/null
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -0,0 +1,78 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <math.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_utildefines.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_screen.h"
+#include "ED_mesh.h"
+
+#include "mesh_intern.h"
+
+
+/* ************************** registration **********************************/
+
+void ED_operatortypes_mesh(void)
+{
+ WM_operatortype_append(MESH_OT_de_select_all);
+}
+
+/* note mesh keymap also for other space? */
+void ED_keymap_mesh(wmWindowManager *wm)
+{
+ ListBase *keymap= WM_keymap_listbase(wm, "EditMesh", 0, 0);
+
+ WM_keymap_add_item(keymap, "MESH_OT_de_select_all", AKEY, KM_PRESS, 0, 0);
+
+// RNA_int_set(WM_keymap_add_item(keymap, "OBJECT_OT_viewzoom", PADPLUSKEY, KM_PRESS, 0, 0)->ptr, "delta", 1);
+}
+
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 00ff434978e..97ce1ec617a 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -84,7 +84,7 @@
#include "ED_object.h"
/* own include */
-#include "editmesh.h"
+#include "mesh_intern.h"
/* from rendercode.c */
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 4ef8cd43865..0c85d4c9eb5 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -2061,7 +2061,7 @@ static void exit_editmode(bContext *C, wmOperator *op, int flag) /* freedata==0
// if(flag & EM_WAITCURSOR) waitcursor(0);
- WM_event_add_notifier(C, NC_SCENE|ND_OB_EDIT, scene);
+ WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, ob);
}
@@ -2097,9 +2097,7 @@ static void enter_editmode(bContext *C, wmOperator *op)
make_editMesh(scene, ob);
- // XXX if (EM_texFaceCheck())
- // allqueue(REDRAWIMAGE, 0);
-
+ WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_MESH, ob);
}
if (ob->type==OB_ARMATURE){
bArmature *arm= base->object->data;
@@ -2122,7 +2120,7 @@ static void enter_editmode(bContext *C, wmOperator *op)
/* to ensure all goes in restposition and without striding */
DAG_object_flush_update(scene, G.obedit, OB_RECALC);
- allqueue (REDRAWVIEW3D,0);
+ WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_ARMATURE, ob);
}
else if(ob->type==OB_FONT) {
G.obedit= ob;
@@ -2144,19 +2142,16 @@ static void enter_editmode(bContext *C, wmOperator *op)
G.obedit= ob;
// XXX make_editNurb();
}
- allqueue(REDRAWBUTSEDIT, 0);
- allqueue(REDRAWOOPS, 0);
if(ok) {
- allqueue(REDRAWVIEW3D, 1);
DAG_object_flush_update(scene, G.obedit, OB_RECALC_DATA);
}
- else G.obedit= NULL;
-
-// if(wc) waitcursor(0);
- WM_event_add_notifier(C, NC_SCENE|ND_OB_EDIT, scene);
+ else {
+ G.obedit= NULL;
+ WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, ob);
+ }
}
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index 1084dac142b..af8818e58fd 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -75,12 +75,16 @@ void ED_operatortypes_object(void)
}
-/* note object keymap also for other space? */
void ED_keymap_object(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "View3D Object", SPACE_VIEW3D, 0);
+ ListBase *keymap= WM_keymap_listbase(wm, "Object Non-modal", 0, 0);
+ /* Note: this keymap works disregarding mode */
WM_keymap_add_item(keymap, "OBJECT_OT_toggle_editmode", TABKEY, KM_PRESS, 0, 0);
+
+ /* Note: this keymap gets disabled in non-objectmode, */
+ keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0);
+
WM_keymap_add_item(keymap, "OBJECT_OT_de_select_all", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "OBJECT_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "OBJECT_OT_select_random", PADASTERKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 94c003f2f3b..d65c4d0f504 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -35,6 +35,9 @@
#include "BKE_screen.h"
#include "BKE_utildefines.h"
+#include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_curve_types.h"
#include "DNA_scene_types.h"
#include "WM_api.h"
@@ -134,6 +137,26 @@ int ED_operator_sequencer_active(bContext *C)
return ed_spacetype_test(C, SPACE_SEQ);
}
+int ED_operator_object_active(bContext *C)
+{
+ return NULL != CTX_data_active_object(C);
+}
+
+int ED_operator_editmesh(bContext *C)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ if(obedit && obedit->type==OB_MESH)
+ return NULL != ((Mesh *)obedit->data)->edit_mesh;
+ return 0;
+}
+
+int ED_operator_editcurve(bContext *C)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ if(obedit && obedit->type==OB_CURVE)
+ return NULL != ((Mesh *)obedit->data)->edit_mesh;
+ return 0;
+}
/* *************************** action zone operator ************************** */
diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index a40659cfe1b..325227a2fc5 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -27,6 +27,8 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
#include "DNA_windowmanager_types.h"
#include "BKE_context.h"
@@ -39,6 +41,7 @@
#include "ED_screen.h"
#include "ED_object.h"
+#include "ED_mesh.h"
#include "ED_space_api.h"
#include "ED_anim_api.h"
@@ -85,6 +88,7 @@ void ED_spacetypes_init(void)
ED_operatortypes_anim();
ED_operatortypes_animchannels(); // XXX have this as part of anim() ones instead?
ED_operatortypes_object();
+ ED_operatortypes_mesh();
ui_view2d_operatortypes();
spacetypes = BKE_spacetypes_list();
@@ -105,6 +109,7 @@ void ED_spacetypes_keymap(wmWindowManager *wm)
ED_keymap_anim(wm);
ED_keymap_animchannels(wm);
ED_keymap_object(wm);
+ ED_keymap_mesh(wm);
UI_view2d_keymap(wm);
spacetypes = BKE_spacetypes_list();
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c
index fa1b53e45fb..6311b698419 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -117,8 +117,8 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
case NC_SCENE:
switch(wmn->data) {
case ND_OB_ACTIVE:
- case ND_OB_EDIT:
case ND_OB_SELECT:
+ case ND_MODE:
ED_region_tag_redraw(ar);
break;
}
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 450e7902218..232b9d9d974 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -197,10 +197,34 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar)
/* own keymap */
keymap= WM_keymap_listbase(wm, "View3D", SPACE_VIEW3D, 0);
- WM_event_add_keymap_handler_bb(&ar->handlers, keymap, NULL, NULL);
- /* object ops, modal later... */
- keymap= WM_keymap_listbase(wm, "View3D Object", SPACE_VIEW3D, 0);
- WM_event_add_keymap_handler_bb(&ar->handlers, keymap, NULL, NULL);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ /* object ops. */
+ keymap= WM_keymap_listbase(wm, "Object Non-modal", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ /* object modal ops default */
+ keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+}
+
+static void view3d_modal_keymaps(wmWindowManager *wm, ARegion *ar, int stype)
+{
+ ListBase *keymap;
+
+ keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0);
+ if(stype==NS_MODE_OBJECT)
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+ else
+ WM_event_remove_keymap_handler(&ar->handlers, keymap);
+
+
+ keymap= WM_keymap_listbase(wm, "EditMesh", 0, 0);
+ if(stype==NS_EDITMODE_MESH)
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+ else
+ WM_event_remove_keymap_handler(&ar->handlers, keymap);
}
@@ -212,10 +236,13 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
switch(wmn->data) {
case ND_FRAME:
case ND_OB_ACTIVE:
- case ND_OB_EDIT:
case ND_OB_SELECT:
ED_region_tag_redraw(ar);
break;
+ case ND_MODE:
+ view3d_modal_keymaps(wmn->wm, ar, wmn->subtype);
+ ED_region_tag_redraw(ar);
+ break;
}
break;
case NC_OBJECT:
@@ -258,6 +285,24 @@ static void view3d_header_area_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
}
+static void view3d_header_area_listener(ARegion *ar, wmNotifier *wmn)
+{
+ /* context changes */
+ switch(wmn->category) {
+ case NC_SCENE:
+ switch(wmn->data) {
+ case ND_FRAME:
+ case ND_OB_ACTIVE:
+ case ND_OB_SELECT:
+ case ND_MODE:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ }
+}
+
+
static int view3d_context(const bContext *C, const bContextDataMember *member, bContextDataResult *result)
{
View3D *v3d= (View3D*)CTX_wm_space_data(C);
@@ -343,7 +388,7 @@ void ED_spacetype_view3d(void)
art->regionid = RGN_TYPE_HEADER;
art->minsizey= HEADERY;
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
- art->listener= view3d_main_area_listener;
+ art->listener= view3d_header_area_listener;
art->init= view3d_header_area_init;
art->draw= view3d_header_area_draw;
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 1396ad2929b..32eb3dabfa5 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -1228,7 +1228,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
vc.scene= scene;
vc.v3d= v3d;
vc.obact= OBACT;
-
+ vc.obedit= G.obedit;
val= RNA_int_get(op->ptr, "event_type");
rect.xmin= RNA_int_get(op->ptr, "xmin");
@@ -1247,10 +1247,11 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
if(G.obedit) {
if(G.obedit->type==OB_MESH) {
+ Mesh *me= G.obedit->data;
+ vc.em= me->edit_mesh;
do_mesh_box_select(&vc, &rect, (val==LEFTMOUSE));
-// allqueue(REDRAWVIEW3D, 0);
// if (EM_texFaceCheck())
-// allqueue(REDRAWIMAGE, 0);
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, G.obedit);
}
else if(ELEM(G.obedit->type, OB_CURVE, OB_SURF)) {
@@ -1411,18 +1412,22 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
}
MEM_freeN(vbuffer);
}
-
- BIF_undo_push("Border select");
return OPERATOR_FINISHED;
}
/* *****************Selection Operators******************* */
+static EnumPropertyItem prop_select_types[] = {
+ {0, "EXCLUSIVE", "Exclusive", ""},
+ {1, "EXTEND", "Extend", ""},
+ {0, NULL, NULL, NULL}
+};
/* ****** Border Select ****** */
void VIEW3D_OT_borderselect(wmOperatorType *ot)
{
+ PropertyRNA *prop;
/* identifiers */
ot->name= "Border Select";
@@ -1441,15 +1446,13 @@ void VIEW3D_OT_borderselect(wmOperatorType *ot)
RNA_def_property(ot->srna, "xmax", PROP_INT, PROP_NONE);
RNA_def_property(ot->srna, "ymin", PROP_INT, PROP_NONE);
RNA_def_property(ot->srna, "ymax", PROP_INT, PROP_NONE);
+
+ prop = RNA_def_property(ot->srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, prop_select_types);
}
/* ****** Mouse Select ****** */
-static EnumPropertyItem prop_select_types[] = {
- {0, "EXCLUSIVE", "Exclusive", ""},
- {1, "EXTEND", "Extend", ""},
- {0, NULL, NULL, NULL}
-};
static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 034b8a1576b..6de980beff4 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -52,6 +52,9 @@
void ED_editors_exit(bContext *C)
{
+ /* frees all editmode undos */
+ undo_editmode_clear();
+
if(CTX_data_edit_object(C)) {
Object *ob= CTX_data_edit_object(C);
diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c
index 05813b72ad0..2237f403f01 100644
--- a/source/blender/editors/util/editmode_undo.c
+++ b/source/blender/editors/util/editmode_undo.c
@@ -61,16 +61,17 @@
Add this in your local code:
-void undo_editmode_push(char *name,
+void undo_editmode_push(bContext *C, char *name,
+ void * (*getdata)(bContext *C), // use context to retrieve current editdata
void (*freedata)(void *), // pointer to function freeing data
- void (*to_editmode)(void *), // data to editmode conversion
- void * (*from_editmode)(void)) // editmode to data conversion
- int (*validate_undo)(void *)) // check if undo data is still valid
+ void (*to_editmode)(void *, void *), // data to editmode conversion
+ void * (*from_editmode)(void *)) // editmode to data conversion
+ int (*validate_undo)(void *, void *)) // check if undo data is still valid
Further exported for UI is:
-void undo_editmode_step(int step); // undo and redo
+void undo_editmode_step(bContext *C, int step); // undo and redo
void undo_editmode_clear(void) // free & clear all data
void undo_editmode_menu(void) // history menu
@@ -92,10 +93,11 @@ typedef struct UndoElem {
void *undodata;
uintptr_t undosize;
char name[MAXUNDONAME];
+ void * (*getdata)(bContext *C);
void (*freedata)(void *);
- void (*to_editmode)(void *);
- void * (*from_editmode)(void);
- int (*validate_undo)(void *);
+ void (*to_editmode)(void *, void *);
+ void * (*from_editmode)(void *);
+ int (*validate_undo)(void *, void *);
} UndoElem;
static ListBase undobase={NULL, NULL};
@@ -104,19 +106,23 @@ static UndoElem *curundo= NULL;
/* ********************* xtern api calls ************* */
-static void undo_restore(UndoElem *undo)
+static void undo_restore(UndoElem *undo, void *editdata)
{
if(undo) {
- undo->to_editmode(undo->undodata);
+ undo->to_editmode(undo->undodata, editdata);
}
}
/* name can be a dynamic string */
-void undo_editmode_push(char *name, void (*freedata)(void *),
- void (*to_editmode)(void *), void *(*from_editmode)(void),
- int (*validate_undo)(void *))
+void undo_editmode_push(bContext *C, char *name,
+ void * (*getdata)(bContext *C),
+ void (*freedata)(void *),
+ void (*to_editmode)(void *, void *),
+ void *(*from_editmode)(void *),
+ int (*validate_undo)(void *, void *))
{
UndoElem *uel;
+ void *editdata;
int nr;
uintptr_t memused, totmem, maxmem;
@@ -131,10 +137,11 @@ void undo_editmode_push(char *name, void (*freedata)(void *),
}
/* make new */
- curundo= uel= MEM_callocN(sizeof(UndoElem), "undo file");
+ curundo= uel= MEM_callocN(sizeof(UndoElem), "undo editmode");
strncpy(uel->name, name, MAXUNDONAME-1);
BLI_addtail(&undobase, uel);
+ uel->getdata= getdata;
uel->freedata= freedata;
uel->to_editmode= to_editmode;
uel->from_editmode= from_editmode;
@@ -158,7 +165,8 @@ void undo_editmode_push(char *name, void (*freedata)(void *),
/* copy */
memused= MEM_get_memory_in_use();
- curundo->undodata= curundo->from_editmode();
+ editdata= getdata(C);
+ curundo->undodata= curundo->from_editmode(editdata);
curundo->undosize= MEM_get_memory_in_use() - memused;
curundo->ob= G.obedit;
curundo->id= G.obedit->id;
@@ -190,7 +198,7 @@ void undo_editmode_push(char *name, void (*freedata)(void *),
}
/* helper to remove clean other objects from undo stack */
-static void undo_clean_stack(void)
+static void undo_clean_stack(bContext *C)
{
UndoElem *uel, *next;
int mixed= 0;
@@ -200,19 +208,27 @@ static void undo_clean_stack(void)
uel= undobase.first;
while(uel) {
+ void *editdata= uel->getdata(C);
+ int isvalid= 0;
next= uel->next;
/* for when objects are converted, renamed, or global undo changes pointers... */
- if(uel->type==G.obedit->type && strcmp(uel->id.name, G.obedit->id.name)==0 &&
- (!uel->validate_undo || uel->validate_undo(uel->undodata))) {
- uel->ob= G.obedit;
+ if(uel->type==G.obedit->type) {
+ if(strcmp(uel->id.name, G.obedit->id.name)==0) {
+ if(uel->validate_undo==NULL)
+ isvalid= 1;
+ else if(uel->validate_undo(uel->undodata, editdata))
+ isvalid= 1;
+ }
}
+ if(isvalid)
+ uel->ob= G.obedit;
else {
mixed= 1;
uel->freedata(uel->undodata);
BLI_freelinkN(&undobase, uel);
}
-
+
uel= next;
}
@@ -220,14 +236,14 @@ static void undo_clean_stack(void)
}
/* 1= an undo, -1 is a redo. we have to make sure 'curundo' remains at current situation */
-void undo_editmode_step(int step)
+void undo_editmode_step(bContext *C, int step)
{
/* prevent undo to happen on wrong object, stack can be a mix */
- undo_clean_stack();
+ undo_clean_stack(C);
if(step==0) {
- undo_restore(curundo);
+ undo_restore(curundo, curundo->getdata(C));
}
else if(step==1) {
@@ -235,7 +251,7 @@ void undo_editmode_step(int step)
else {
if(G.f & G_DEBUG) printf("undo %s\n", curundo->name);
curundo= curundo->prev;
- undo_restore(curundo);
+ undo_restore(curundo, curundo->getdata(C));
}
}
else {
@@ -243,7 +259,7 @@ void undo_editmode_step(int step)
if(curundo==NULL || curundo->next==NULL) error("No more steps to redo");
else {
- undo_restore(curundo->next);
+ undo_restore(curundo->next, curundo->getdata(C));
curundo= curundo->next;
if(G.f & G_DEBUG) printf("redo %s\n", curundo->name);
}
@@ -267,7 +283,7 @@ void undo_editmode_clear(void)
}
/* based on index nr it does a restore */
-static void undo_number(int nr)
+static void undo_number(bContext *C, int nr)
{
UndoElem *uel;
int a=1;
@@ -276,19 +292,19 @@ static void undo_number(int nr)
if(a==nr) break;
}
curundo= uel;
- undo_editmode_step(0);
+ undo_editmode_step(C, 0);
}
/* ************** for interaction with menu/pullown */
-void undo_editmode_menu(void)
+void undo_editmode_menu(bContext *C)
{
UndoElem *uel;
DynStr *ds= BLI_dynstr_new();
short event;
char *menu;
- undo_clean_stack(); // removes other objects from it
+ undo_clean_stack(C); // removes other objects from it
BLI_dynstr_append(ds, "Editmode Undo History %t");
@@ -303,7 +319,7 @@ void undo_editmode_menu(void)
// XXX event= pupmenu_col(menu, 20);
MEM_freeN(menu);
- if(event>0) undo_number(event);
+ if(event>0) undo_number(C, event);
}
static void do_editmode_undohistorymenu(bContext *C, void *arg, int event)
@@ -311,7 +327,7 @@ static void do_editmode_undohistorymenu(bContext *C, void *arg, int event)
if(G.obedit==NULL || event<1) return;
- undo_number(event-1);
+ undo_number(C, event-1);
}
@@ -322,7 +338,7 @@ uiBlock *editmode_undohistorymenu(bContext *C, uiMenuBlockHandle *handle, void *
short yco = 20, menuwidth = 120;
short item= 1;
- undo_clean_stack(); // removes other objects from it
+ undo_clean_stack(C); // removes other objects from it
block= uiBeginBlock(C, handle->region, "view3d_edit_mesh_undohistorymenu", UI_EMBOSSP, UI_HELV);
uiBlockSetButmFunc(block, do_editmode_undohistorymenu, NULL);
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index 6773575ca84..b7923990101 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -86,7 +86,7 @@ void ED_undo_push(bContext *C, char *str)
if (U.undosteps == 0) return;
if(G.obedit->type==OB_MESH)
- undo_push_mesh(str);
+ undo_push_mesh(C, str);
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
undo_push_curve(str);
else if (G.obedit->type==OB_FONT)
@@ -109,40 +109,45 @@ void ED_undo_push(bContext *C, char *str)
}
}
-static void undo_do(bContext *C)
-{
- if(U.uiflag & USER_GLOBALUNDO) {
-#ifndef DISABLE_PYTHON
-// XXX BPY_scripts_clear_pyobjects();
-#endif
- BKE_undo_step(C, 1);
- sound_initialize_sounds();
- }
-
-}
-
-static int ed_undo_exec(bContext *C, wmOperator *op)
+static int ed_undo_step(bContext *C, wmOperator *op, int step)
{
ScrArea *sa= CTX_wm_area(C);
if(G.obedit) {
if ELEM7(G.obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE)
- undo_editmode_step(1);
+ undo_editmode_step(C, step);
}
else {
+ int do_glob_undo= 0;
+
if(G.f & G_TEXTUREPAINT)
- undo_imagepaint_step(1);
+ undo_imagepaint_step(step);
else if(sa->spacetype==SPACE_IMAGE) {
SpaceImage *sima= (SpaceImage *)sa->spacedata.first;
if(sima->flag & SI_DRAWTOOL)
- undo_imagepaint_step(1);
+ undo_imagepaint_step(step);
+ else
+ do_glob_undo= 1;
+ }
+ else if(G.f & G_PARTICLEEDIT) {
+ if(step==1)
+ PE_undo();
else
- undo_do(C);
+ PE_redo();
}
- else if(G.f & G_PARTICLEEDIT)
- PE_undo();
else {
- undo_do(C);
+ do_glob_undo= 1;
+ }
+
+ if(do_glob_undo) {
+ if(U.uiflag & USER_GLOBALUNDO) {
+#ifndef DISABLE_PYTHON
+ // XXX BPY_scripts_clear_pyobjects();
+#endif
+ BKE_undo_step(C, step);
+ sound_initialize_sounds();
+ }
+
}
}
@@ -151,39 +156,13 @@ static int ed_undo_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+static int ed_undo_exec(bContext *C, wmOperator *op)
+{
+ return ed_undo_step(C, op, 1);
+}
static int ed_redo_exec(bContext *C, wmOperator *op)
{
- ScrArea *sa= CTX_wm_area(C);
-
- if(G.obedit) {
- //if ELEM7(G.obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE)
- // undo_editmode_step(-1);
- }
- else {
- if(G.f & G_TEXTUREPAINT)
- undo_imagepaint_step(-1);
- else if(sa->spacetype==SPACE_IMAGE) {
- SpaceImage *sima= (SpaceImage *)sa->spacedata.first;
- if(sima->flag & SI_DRAWTOOL)
- undo_imagepaint_step(-1);
- else {
- BKE_undo_step(C, -1);
- sound_initialize_sounds();
- }
- }
- else if(G.f & G_PARTICLEEDIT)
- PE_redo();
- else {
- /* includes faceselect now */
- if(U.uiflag & USER_GLOBALUNDO) {
- BKE_undo_step(C, -1);
- sound_initialize_sounds();
- }
- }
- }
- WM_event_add_notifier(C, NC_WINDOW, NULL);
- return OPERATOR_FINISHED;
-
+ return ed_undo_step(C, op, -1);
}
void ED_undo_menu(bContext *C)
diff --git a/source/blender/editors/util/util_intern.h b/source/blender/editors/util/util_intern.h
new file mode 100644
index 00000000000..37e6c5c25e1
--- /dev/null
+++ b/source/blender/editors/util/util_intern.h
@@ -0,0 +1,38 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef ED_UTIL_INTERN_H
+#define ED_UTIL_INTERN_H
+
+/* internal exports only */
+
+/* editmode_undo.c */
+void undo_editmode_clear(void);
+
+#endif /* ED_UTIL_INTERN_H */
+