UI:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 16 Dec 2008 20:03:28 +0000 (20:03 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 16 Dec 2008 20:03:28 +0000 (20:03 +0000)
* Added support for defining properties for operator buttons, with
  uiButGetOperatorPtrRNA. Needed to cleanup a hack that was there
  for operator properties in RNA, now a separate OperatorProperties
  type is used for storing operator properties, instead of being part
  of the Operator type itself.
* Allow selecting menu items with mouse release instead of press again.
* Fix some cases with hanging tooltips in the UI.

13 files changed:
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface.h
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_regions.c
source/blender/makesdna/DNA_windowmanager_types.h
source/blender/makesrna/RNA_access.h
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_wm.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_event_system.c
source/blender/windowmanager/intern/wm_keymap.c
source/blender/windowmanager/intern/wm_operators.c

index 77cb36055e6af128ed7b3d4e4ca6f353be5a3f23..0540c0b2a25a8baf978bb055fef9482e866d17a6 100644 (file)
@@ -334,6 +334,8 @@ int         uiButGetRetVal          (uiBut *but);
 void   uiButSetFlag            (uiBut *but, int flag);
 void   uiButClearFlag          (uiBut *but, int flag);
 
+struct PointerRNA *uiButGetOperatorPtrRNA(uiBut *but);
+
 void   uiBlockSetHandleFunc(uiBlock *block,    void (*func)(struct bContext *C, void *arg, int event), void *arg);
 void   uiBlockSetButmFunc      (uiBlock *block,        void (*func)(struct bContext *C, void *arg, int but_a2), void *arg);
 
index afb10a1bb26d59872f8e0f71dba2fd11baccd2b9..398a526fbd84009103a2038aa84553c6aa34e0e2 100644 (file)
@@ -42,6 +42,7 @@
 #include "BLI_dynstr.h"
 
 #include "BKE_global.h"
+#include "BKE_idprop.h"
 #include "BKE_library.h"
 #include "BKE_screen.h"
 #include "BKE_texture.h"
@@ -1343,6 +1344,11 @@ static void ui_free_link(uiLink *link)
 
 static void ui_free_but(const bContext *C, uiBut *but)
 {
+       if(but->opproperties) {
+               IDP_FreeProperty(but->opproperties);
+               MEM_freeN(but->opproperties);
+       }
+       if(but->opptr) MEM_freeN(but->opptr);
        if(but->active) ui_button_active_cancel(C, but);
        if(but->str && but->str != but->strdata) MEM_freeN(but->str);
        ui_free_link(but->link);
@@ -2553,6 +2559,22 @@ int uiButGetRetVal(uiBut *but)
        return but->retval;
 }
 
+PointerRNA *uiButGetOperatorPtrRNA(uiBut *but)
+{
+       wmOperatorType *ot;
+       
+       if(but->opname && !but->opptr) {
+               ot= WM_operatortype_find(but->opname);
+
+               if(ot) {
+                       but->opptr= MEM_callocN(sizeof(PointerRNA), "uiButOpPtr");
+                       RNA_pointer_create(NULL, NULL, ot->srna, &but->opproperties, but->opptr);
+               }
+       }
+
+       return but->opptr;
+}
+
 void uiBlockSetHandleFunc(uiBlock *block, void (*func)(struct bContext *C, void *arg, int event), void *arg)
 {
        block->handle_func= func;
index 24e99b36e09c8f2bd4a99e77a3864b26bb9c8858..577a374c47db2a59e383b717ef27e5935762bc81 100644 (file)
@@ -35,6 +35,7 @@
 
 struct ARegion;
 struct bContext;
+struct IDProperty;
 struct uiHandleButtonData;
 struct wmWindow;
 
@@ -162,6 +163,8 @@ struct uiBut {
                /* Operator */
        const char *opname;
        int opcontext;
+       struct IDProperty *opproperties;
+       struct PointerRNA *opptr;
 
                /* active button data */
        struct uiHandleButtonData *active;
index 761e0ff071264df64b4d1f27c320c3cb6a4a39b2..057f9863278da9714572d0841c7e1992c4b33185 100644 (file)
@@ -41,6 +41,7 @@
 #include "PIL_time.h"
 
 #include "BKE_colortools.h"
+#include "BKE_idprop.h"
 #include "BKE_global.h"
 #include "BKE_texture.h"
 #include "BKE_utildefines.h"
@@ -143,6 +144,7 @@ typedef struct uiAfterFunc {
 
        const char *opname;
        int opcontext;
+       IDProperty *opproperties;
 } uiAfterFunc;
 
 static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState state);
@@ -182,6 +184,11 @@ static void ui_apply_but_func(bContext *C, uiBut *but)
 
                after->opname= but->opname;
                after->opcontext= but->opcontext;
+               after->opproperties= but->opproperties;
+
+               but->opname= NULL;
+               but->opcontext= 0;
+               but->opproperties= NULL;
 
                BLI_addtail(&UIAfterFuncs, after);
        }
@@ -205,8 +212,12 @@ static void ui_apply_but_funcs_after(bContext *C)
                if(after->butm_func)
                        after->butm_func(C, after->butm_func_arg, after->a2);
 
-               if(after->opname) /* make WM_operatora_call option? */
-                       WM_operator_call(C, after->opname, after->opcontext);
+               if(after->opname)
+                       WM_operator_call(C, after->opname, after->opcontext, after->opproperties);
+               if(after->opproperties) {
+                       IDP_FreeProperty(after->opproperties);
+                       MEM_freeN(after->opproperties);
+               }
        }
 
        BLI_freelistN(&funcs);
@@ -1430,6 +1441,10 @@ static int ui_do_but_BUT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEv
                        button_activate_state(C, but, BUTTON_STATE_WAIT_RELEASE);
                        return WM_UI_HANDLER_BREAK;
                }
+               else if(event->type == LEFTMOUSE && but->block->handle) {
+                       button_activate_state(C, but, BUTTON_STATE_EXIT);
+                       return WM_UI_HANDLER_BREAK;
+               }
                else if(ELEM(event->type, PADENTER, RETKEY) && event->val) {
                        button_activate_state(C, but, BUTTON_STATE_WAIT_FLASH);
                        return WM_UI_HANDLER_BREAK;
@@ -2659,10 +2674,9 @@ static void ui_blocks_set_tooltips(ARegion *ar, int enable)
                block->tooltipdisabled= !enable;
 }
 
-static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
+static int ui_mouse_inside_region(ARegion *ar, int x, int y)
 {
        uiBlock *block;
-       uiBut *but, *butover= NULL;
        int mx, my;
 
        /* check if the mouse is in the region, and in case of a view2d also check
@@ -2671,7 +2685,7 @@ static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
                for(block=ar->uiblocks.first; block; block=block->next)
                        block->auto_open= 0;
 
-               return NULL;
+               return 0;
        }
 
        if(ar->v2d.mask.xmin!=ar->v2d.mask.xmax) {
@@ -2680,9 +2694,34 @@ static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
                ui_window_to_region(ar, &mx, &my);
 
                if(!BLI_in_rcti(&ar->v2d.mask, mx, my))
-                       return NULL;
+                       return 0;
        }
 
+       return 1;
+}
+
+static int ui_mouse_inside_button(ARegion *ar, uiBut *but, int x, int y)
+{
+       if(!ui_mouse_inside_region(ar, x, y))
+               return 0;
+
+       ui_window_to_block(ar, but->block, &x, &y);
+
+       if(!ui_but_contains_pt(but, x, y))
+               return 0;
+       
+       return 1;
+}
+
+static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
+{
+       uiBlock *block;
+       uiBut *but, *butover= NULL;
+       int mx, my;
+
+       if(!ui_mouse_inside_region(ar, x, y))
+               return NULL;
+
        for(block=ar->uiblocks.first; block; block=block->next) {
                mx= x;
                my= y;
@@ -2949,7 +2988,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
        ARegion *ar;
        uiBut *postbut;
        uiButtonActivateType posttype;
-       int retval, mx, my;
+       int retval;
 
        data= but->active;
        block= but->block;
@@ -2961,11 +3000,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
                switch(event->type) {
                        case MOUSEMOVE:
                                /* verify if we are still over the button, if not exit */
-                               mx= event->x;
-                               my= event->y;
-                               ui_window_to_block(ar, block, &mx, &my);
-
-                               if(!ui_but_contains_pt(but, mx, my)) {
+                               if(!ui_mouse_inside_button(ar, but, event->x, event->y)) {
                                        data->cancel= 1;
                                        button_activate_state(C, but, BUTTON_STATE_EXIT);
                                }
@@ -2990,11 +3025,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
                                        WM_event_remove_window_timer(data->window, data->autoopentimer);
                                        data->autoopentimer= NULL;
 
-                                       mx= event->x;
-                                       my= event->y;
-                                       ui_window_to_block(ar, block, &mx, &my);
-
-                                       if(ui_but_contains_pt(but, mx, my))
+                                       if(ui_mouse_inside_button(ar, but, event->x, event->y))
                                                button_activate_state(C, but, BUTTON_STATE_MENU_OPEN);
                                }
 
@@ -3010,11 +3041,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
                switch(event->type) {
                        case MOUSEMOVE:
                                /* deselect the button when moving the mouse away */
-                               mx= event->x;
-                               my= event->y;
-                               ui_window_to_block(ar, block, &mx, &my);
-
-                               if(ui_but_contains_pt(but, mx, my)) {
+                               if(ui_mouse_inside_button(ar, but, event->x, event->y)) {
                                        if(!(but->flag & UI_SELECT)) {
                                                but->flag |= UI_SELECT;
                                                data->cancel= 0;
@@ -3082,7 +3109,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
        return retval;
 }
 
-static void ui_handle_button_closed_submenu(bContext *C, uiBut *but)
+static void ui_handle_button_closed_submenu(bContext *C, wmEvent *event, uiBut *but)
 {
        uiHandleButtonData *data;
        uiMenuBlockHandle *menu;
@@ -3105,8 +3132,15 @@ static void ui_handle_button_closed_submenu(bContext *C, uiBut *but)
 
                button_activate_exit(C, data, but, 1);
        }
-       else if(menu->menuretval == UI_RETURN_OUT)
-               button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT);
+       else if(menu->menuretval == UI_RETURN_OUT) {
+               if(ui_mouse_inside_button(data->region, but, event->x, event->y)) {
+                       button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT);
+               }
+               else {
+                       data->cancel= 1;
+                       button_activate_exit(C, data, but, 1);
+               }
+       }
 }
 
 /* ******************** menu navigation helpers ************** */
@@ -3451,7 +3485,7 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiMenuBlockHandle *menu, i
                return retval;
 }
 
-static int ui_handle_menu_closed_submenu(bContext *C, uiMenuBlockHandle *menu)
+static int ui_handle_menu_closed_submenu(bContext *C, wmEvent *event, uiMenuBlockHandle *menu)
 {
        ARegion *ar;
        uiBut *but;
@@ -3477,7 +3511,7 @@ static int ui_handle_menu_closed_submenu(bContext *C, uiMenuBlockHandle *menu)
 
                /* now let activated button in this menu exit, which
                 * will actually close the submenu too */
-               ui_handle_button_closed_submenu(C, but);
+               ui_handle_button_closed_submenu(C, event, but);
        }
 
        if(menu->menuretval)
@@ -3504,7 +3538,7 @@ static int ui_handle_menus_recursive(bContext *C, wmEvent *event, uiMenuBlockHan
        /* now handle events for our own menu */
        if(retval == WM_UI_HANDLER_CONTINUE || event->type == TIMER) {
                if(submenu && submenu->menuretval)
-                       retval= ui_handle_menu_closed_submenu(C, menu);
+                       retval= ui_handle_menu_closed_submenu(C, event, menu);
                else
                        retval= ui_handle_menu_event(C, event, menu, (submenu == NULL));
        }
@@ -3589,7 +3623,7 @@ static int ui_handler_region_menu(bContext *C, wmEvent *event, void *userdata)
                        /* handle events for the activated button */
                        if(retval == WM_UI_HANDLER_CONTINUE || event->type == TIMER) {
                                if(data->menu->menuretval)
-                                       ui_handle_button_closed_submenu(C, but);
+                                       ui_handle_button_closed_submenu(C, event, but);
                                else
                                        ui_handle_button_event(C, event, but);
                        }
index 0c298b62070cae5c43fc66a46122bcbafb0846f6..e4b3157c6a1dcddcc8b04a8d83468cea935b548e 100644 (file)
@@ -1679,7 +1679,7 @@ static void operator_callback(bContext *C, void *arg, int retval)
        const char *opname= arg;
 
        if(retval > 0)
-               WM_operator_call(C, opname, WM_OP_DEFAULT);
+               WM_operator_call(C, opname, WM_OP_DEFAULT, NULL);
 }
 
 void okee_operator(bContext *C, char *opname, char *str, ...)
index e50aaee3c0ea70bbdea8625b37f0db4d6f3550d2..7144710ae47c7814a946fc7308f76ac0568665be 100644 (file)
@@ -142,7 +142,6 @@ typedef struct wmOperatorType {
 typedef struct wmKeymapItem {
        struct wmKeymapItem *next, *prev;
        
-       /* these are same order as wmOperator because RNA depends on it, fixme XXX */
        char idname[64];                                /* used to retrieve operator type pointer */
        IDProperty *properties;                 /* default operator properties */
        struct PointerRNA *ptr;                 /* rna pointer to access properties */
index cfcc3eb3e750d35f35a2f58b032afd7f5b00912f..28359f7ccbec01b20e5a2c52a9745092418806b1 100644 (file)
@@ -119,6 +119,7 @@ extern StructRNA RNA_NodeTree;
 extern StructRNA RNA_NorController;
 extern StructRNA RNA_Object;
 extern StructRNA RNA_Operator;
+extern StructRNA RNA_OperatorProperties;
 extern StructRNA RNA_OrController;
 extern StructRNA RNA_PackedFile;
 extern StructRNA RNA_Panel;
index 0b15d4fa996bc18ba1433908b378023be5acfb70..df67e85640257021b472229320ce5099c85a9e43 100644 (file)
@@ -75,11 +75,11 @@ void RNA_pointer_create(StructRNA *idtype, ID *id, StructRNA *type, void *data,
        r_ptr->data= data;
 }
 
-static void rna_pointer_inherit_id(PointerRNA *parent, PointerRNA *ptr)
+static void rna_pointer_inherit_id(StructRNA *type, PointerRNA *parent, PointerRNA *ptr)
 {
-       if(ptr->type && ptr->type->flag & STRUCT_ID) {
+       if(type && type->flag & STRUCT_ID) {
                ptr->id.data= ptr->data;
-               ptr->id.type= ptr->type;
+               ptr->id.type= type;
        }
        else {
                ptr->id.data= parent->id.data;
@@ -103,16 +103,16 @@ IDProperty *rna_idproperties_get(StructRNA *type, void *data, int create)
                return IDP_GetProperties(data, create);
        else if(type == &RNA_IDPropertyGroup)
                return data;
-       else if(type->from == &RNA_Operator) {
-               wmOperator *op= (wmOperator*)data;
+       else if(type->from == &RNA_OperatorProperties) {
+               IDProperty **properties= (IDProperty**)data;
 
-               if(create && !op->properties) {
+               if(create && !*properties) {
                        IDPropertyTemplate val;
                        val.i = 0; /* silence MSVC warning about uninitialized var when debugging */
-                       op->properties= IDP_New(IDP_GROUP, val, "property");
+                       *properties= IDP_New(IDP_GROUP, val, "property");
                }
 
-               return op->properties;
+               return *properties;
        }
        else
                return NULL;
@@ -839,8 +839,12 @@ static StructRNA *rna_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop,
        else
                type= pprop->structtype;
        
-       if(type && type->refine)
-               type= type->refine(r_ptr);
+       if(type) {
+               rna_pointer_inherit_id(type, ptr, r_ptr);
+
+               if(type->refine)
+                       type= type->refine(r_ptr);
+       }
        
        r_ptr->type= type;
        return type;
@@ -858,9 +862,7 @@ void RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_
        else
                r_ptr->data= NULL;
 
-       if(r_ptr->data && rna_property_pointer_type(ptr, prop, r_ptr))
-               rna_pointer_inherit_id(ptr, r_ptr);
-       else
+       if(!(r_ptr->data && rna_property_pointer_type(ptr, prop, r_ptr)))
                memset(r_ptr, 0, sizeof(*r_ptr));
 }
 
@@ -882,9 +884,13 @@ static StructRNA *rna_property_collection_type(CollectionPropertyIterator *iter)
        else
                type= cprop->structtype;
        
-       if(type->refine)
-               type= type->refine(&iter->ptr);
+       if(type) {
+               rna_pointer_inherit_id(type, &iter->parent, &iter->ptr);
 
+               if(type->refine)
+                       type= type->refine(&iter->ptr);
+       }
+       
        iter->ptr.type= type;
        return type;
 }
@@ -895,9 +901,7 @@ static void rna_property_collection_get(CollectionPropertyIterator *iter)
 
        iter->ptr.data= cprop->get(iter);
 
-       if(iter->ptr.data && rna_property_collection_type(iter))
-               rna_pointer_inherit_id(&iter->parent, &iter->ptr);
-       else
+       if(!(iter->ptr.data && rna_property_collection_type(iter)))
                memset(&iter->ptr, 0, sizeof(iter->ptr));
 }
 
@@ -970,7 +974,7 @@ int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int k
                if(r_ptr->data) {
                        if(!r_ptr->type)
                                r_ptr->type= cprop->structtype;
-                       rna_pointer_inherit_id(ptr, r_ptr);
+                       rna_pointer_inherit_id(r_ptr->type, ptr, r_ptr);
 
                        return 1;
                }
@@ -1011,7 +1015,7 @@ int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, co
                if(r_ptr->data) {
                        if(!r_ptr->type)
                                r_ptr->type= cprop->structtype;
-                       rna_pointer_inherit_id(ptr, r_ptr);
+                       rna_pointer_inherit_id(r_ptr->type, ptr, r_ptr);
 
                        return 1;
                }
index 0ec62cd5666701f7b3fc50d6721ebfbb8573a94c..c039bd79ac4d0b37521a58fba33cded74d8c0296 100644 (file)
 
 #ifdef RNA_RUNTIME
 
-static StructRNA *rna_Operator_refine(PointerRNA *ptr)
+static wmOperator *rna_OperatorProperties_find_operator(PointerRNA *ptr)
 {
-       wmOperator *op= (wmOperator*)ptr->data;
-       return op->type->srna;
+       wmWindowManager *wm= ptr->id.data;
+       wmOperator *op;
+
+       if(wm)
+               for(op=wm->operators.first; op; op=op->next)
+                       if(op->properties == ptr->data)
+                               return op;
+       
+       return NULL;
+}
+
+static StructRNA *rna_OperatorProperties_refine(PointerRNA *ptr)
+{
+       wmOperator *op= rna_OperatorProperties_find_operator(ptr);
+
+       if(op)
+               return op->type->srna;
+       else
+               return &RNA_OperatorProperties;
 }
 
-/*static void rna_Operator_name_get(PointerRNA *ptr, char *value)
+static void rna_Operator_name_get(PointerRNA *ptr, char *value)
 {
        wmOperator *op= (wmOperator*)ptr->data;
        strcpy(value, op->type->name);
@@ -49,17 +66,30 @@ static int rna_Operator_name_length(PointerRNA *ptr)
 {
        wmOperator *op= (wmOperator*)ptr->data;
        return strlen(op->type->name);
-}*/
+}
 
 #else
 
 static void rna_def_operator(BlenderRNA *brna)
 {
        StructRNA *srna;
+       PropertyRNA *prop;
 
        srna= RNA_def_struct(brna, "Operator", NULL, "Operator");
        RNA_def_struct_sdna(srna, "wmOperator");
-       RNA_def_struct_funcs(srna, NULL, "rna_Operator_refine");
+
+       prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+       RNA_def_property_flag(prop, PROP_NOT_EDITABLE);
+       RNA_def_property_string_funcs(prop, "rna_Operator_name_get", "rna_Operator_name_length", NULL);
+       RNA_def_property_ui_text(prop, "Name", "");
+       RNA_def_struct_name_property(srna, prop);
+
+       prop= RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
+       RNA_def_property_struct_type(prop, "OperatorProperties");
+       RNA_def_property_ui_text(prop, "Properties", "");
+
+       srna= RNA_def_struct(brna, "OperatorProperties", NULL, "Operator Properties");
+       RNA_def_struct_funcs(srna, NULL, "rna_OperatorProperties_refine");
 }
 
 static void rna_def_windowmanager(BlenderRNA *brna)
index a2b5049b8b59b2144e1a21f90524095ec8d752b1..ded0cb854b993172b858b21823a98c6877453304 100644 (file)
@@ -32,6 +32,7 @@
 #include "DNA_windowmanager_types.h"
 
 struct bContext;
+struct IDProperty;
 struct wmEvent;
 struct wmEventHandler;
 struct wmGesture;
@@ -112,7 +113,7 @@ int                 WM_operator_winactive   (struct bContext *C);
 wmOperatorType *WM_operatortype_find(const char *idname);
 void           WM_operatortype_append  (void (*opfunc)(wmOperatorType*));
 
-int         WM_operator_call           (struct bContext *C, const char *opstring, int context);
+int         WM_operator_call           (struct bContext *C, const char *opstring, int context, struct IDProperty *properties);
 
                        /* default operator callbacks for border/lasso */
 int                    WM_border_select_invoke (struct bContext *C, wmOperator *op, struct wmEvent *event);
index 7bfda3437a9a3ba7cfe9424e5c577d878ec2c41f..74f3fd33f29327c29880b6925678718f90c400bf 100644 (file)
@@ -295,7 +295,7 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, I
                BLI_strncpy(op->idname, ot->idname, OP_MAX_TYPENAME);
                
                op->ptr= MEM_callocN(sizeof(PointerRNA), "wmOperatorPtrRNA");
-               RNA_pointer_create(&RNA_WindowManager, &C->wm->id, ot->srna, op, op->ptr);
+               RNA_pointer_create(&RNA_WindowManager, &C->wm->id, ot->srna, &op->properties, op->ptr);
 
                if(op->type->invoke)
                        retval= (*op->type->invoke)(C, op, event);
@@ -314,7 +314,7 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, I
 }
 
 /* invokes operator in context */
-int WM_operator_call(bContext *C, const char *opstring, int context)
+int WM_operator_call(bContext *C, const char *opstring, int context, IDProperty *properties)
 {
        wmOperatorType *ot= WM_operatortype_find(opstring);
        int retval;
@@ -334,7 +334,7 @@ int WM_operator_call(bContext *C, const char *opstring, int context)
                                        C->region= ar1;
                        }
                        
-                       retval= wm_operator_invoke(C, ot, C->window->eventstate, NULL);
+                       retval= wm_operator_invoke(C, ot, C->window->eventstate, properties);
                        
                        /* set region back */
                        C->region= ar;
@@ -346,7 +346,7 @@ int WM_operator_call(bContext *C, const char *opstring, int context)
                        ARegion *ar= C->region;
 
                        C->region= NULL;
-                       retval= wm_operator_invoke(C, ot, C->window->eventstate, NULL);
+                       retval= wm_operator_invoke(C, ot, C->window->eventstate, properties);
                        C->region= ar;
 
                        return retval;
@@ -358,14 +358,14 @@ int WM_operator_call(bContext *C, const char *opstring, int context)
 
                        C->region= NULL;
                        C->area= NULL;
-                       retval= wm_operator_invoke(C, ot, C->window->eventstate, NULL);
+                       retval= wm_operator_invoke(C, ot, C->window->eventstate, properties);
                        C->region= ar;
                        C->area= area;
 
                        return retval;
                }
                else
-                       return wm_operator_invoke(C, ot, C->window->eventstate, NULL);
+                       return wm_operator_invoke(C, ot, C->window->eventstate, properties);
        }
        
        return 0;
index 9a231148c36013e482cec720ca011856b4f51932..139fff45b483ecfcde521f04e3567eb9a71b202f 100644 (file)
@@ -84,7 +84,7 @@ static void keymap_properties_set(wmKeymapItem *kmi)
 
                if(ot) {
                        kmi->ptr= MEM_callocN(sizeof(PointerRNA), "wmKeymapItemPtr");
-                       RNA_pointer_create(NULL, NULL, ot->srna, kmi, kmi->ptr);
+                       RNA_pointer_create(NULL, NULL, ot->srna, &kmi->properties, kmi->ptr);
                }
        }
 }
index a7b542896161ca61df0e1a8117888cd9a15a6d53..e87451c2a8e4ca8d937803e803a559e4ba6cd354 100644 (file)
@@ -80,7 +80,7 @@ void WM_operatortype_append(void (*opfunc)(wmOperatorType*))
        wmOperatorType *ot;
        
        ot= MEM_callocN(sizeof(wmOperatorType), "operatortype");
-       ot->srna= RNA_def_struct(&BLENDER_RNA, "", "Operator", "");
+       ot->srna= RNA_def_struct(&BLENDER_RNA, "", "OperatorProperties", "");
        opfunc(ot);
        RNA_def_struct_identifier(ot->srna, ot->idname, ot->name);
        BLI_addtail(&global_ops, ot);