Revision: 43586
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43586
Author:   campbellbarton
Date:     2012-01-21 22:42:09 +0000 (Sat, 21 Jan 2012)
Log Message:
-----------
fix for memory leak displaying shortcuts to buttons which use allocated string, 
also de-duplocate this code which had this error in 2 places.

noticed while testing 1023 length paths.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/editors/interface/interface_intern.h

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c  2012-01-21 
22:00:40 UTC (rev 43585)
+++ trunk/blender/source/blender/editors/interface/interface.c  2012-01-21 
22:42:09 UTC (rev 43586)
@@ -800,11 +800,43 @@
        }
 }
 
+/* XXX, this code will shorten any allocated string to 'UI_MAX_NAME_STR'
+ * since this is really long its unlikely to be an issue,
+ * but this could be supported */
+void ui_but_add_shortcut(uiBut *but, const char *shortcut_str, const short 
do_strip)
+{
 
+       if (do_strip) {
+               char *cpoin= strchr(but->str, '|');
+               if(cpoin) {
+                       *cpoin= '\0';
+               }
+       }
+
+       /* without this, just allow stripping of the shortcut */
+       if (shortcut_str) {
+               char *butstr_orig;
+
+               if (but->str != but->strdata) {
+                       butstr_orig = but->str; /* free after using as source 
buffer */
+               }
+               else {
+                       butstr_orig = BLI_strdup(but->str);
+               }
+               BLI_snprintf(but->strdata,
+                            sizeof(but->strdata),
+                            "%s|%s",
+                            butstr_orig, shortcut_str);
+               MEM_freeN(butstr_orig);
+               but->str = but->strdata;
+               ui_check_but(but);
+       }
+}
+
 static void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
 {
        uiBut *but;
-       char buf[512];
+       char buf[128];
 
        /* for menu's */
        MenuType *mt;
@@ -815,18 +847,6 @@
        if(block->minx != block->maxx)
                return;
 
-
-#define UI_MENU_KEY_STR_CAT                                                   \
-       char *butstr_orig= BLI_strdup(but->str);                                
  \
-       BLI_snprintf(but->strdata,                                              
  \
-                                sizeof(but->strdata),                          
              \
-                                "%s|%s",                                       
              \
-                                butstr_orig, buf);                             
              \
-       MEM_freeN(butstr_orig);                                                 
  \
-       but->str= but->strdata;                                                 
  \
-       ui_check_but(but);                                                      
  \
-
-
        for(but=block->buttons.first; but; but=but->next) {
                if(but->optype) {
                        IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
@@ -834,7 +854,7 @@
                        if(WM_key_event_operator_string(C, but->optype->idname, 
but->opcontext, prop, TRUE,
                                                        buf, sizeof(buf)))
                        {
-                               UI_MENU_KEY_STR_CAT
+                               ui_but_add_shortcut(but, buf, FALSE);
                        }
                }
                else if ((mt= uiButGetMenuType(but))) {
@@ -851,7 +871,7 @@
                        if(WM_key_event_operator_string(C, "WM_OT_call_menu", 
WM_OP_INVOKE_REGION_WIN, prop_menu, FALSE,
                                                        buf, sizeof(buf)))
                        {
-                               UI_MENU_KEY_STR_CAT
+                               ui_but_add_shortcut(but, buf, FALSE);
                        }
                }
        }

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c 
2012-01-21 22:00:40 UTC (rev 43585)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c 
2012-01-21 22:42:09 UTC (rev 43586)
@@ -4382,31 +4382,19 @@
        uiBut *but = (uiBut *)arg1;
 
        if (but->optype) {
-               char buf[512], *cpoin;
+               char shortcut_str[128];
 
                IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
                
                /* complex code to change name of button */
                if(WM_key_event_operator_string(C, but->optype->idname, 
but->opcontext, prop, TRUE,
-                                               buf, sizeof(buf)))
+                                               shortcut_str, 
sizeof(shortcut_str)))
                {
-                       char *butstr_orig;
-
-                       // XXX but->str changed... should not, remove the 
hotkey from it
-                       cpoin= strchr(but->str, '|');
-                       if(cpoin) *cpoin= 0;            
-
-                       butstr_orig= BLI_strdup(but->str);
-                       BLI_snprintf(but->strdata, sizeof(but->strdata), 
"%s|%s", butstr_orig, buf);
-                       MEM_freeN(butstr_orig);
-                       but->str= but->strdata;
-
-                       ui_check_but(but);
+                       ui_but_add_shortcut(but, shortcut_str, TRUE);
                }
                else {
-                       /* shortcut was removed */
-                       cpoin= strchr(but->str, '|');
-                       if(cpoin) *cpoin= 0;
+                       /* simply strip the shortcut */
+                       ui_but_add_shortcut(but, NULL, TRUE);
                }
        }
 }

Modified: trunk/blender/source/blender/editors/interface/interface_intern.h
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_intern.h   
2012-01-21 22:00:40 UTC (rev 43585)
+++ trunk/blender/source/blender/editors/interface/interface_intern.h   
2012-01-21 22:42:09 UTC (rev 43586)
@@ -498,6 +498,7 @@
 void ui_layout_add_but(uiLayout *layout, uiBut *but);
 int ui_but_can_align(uiBut *but);
 void ui_but_add_search(uiBut *but, PointerRNA *ptr, PropertyRNA *prop, 
PointerRNA *searchptr, PropertyRNA *searchprop);
+void ui_but_add_shortcut(uiBut *but, const char *key_str, const short 
do_strip);
 
 /* interface_anim.c */
 void ui_but_anim_flag(uiBut *but, float cfra);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to