# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1659425233 0 # Node ID b6ae5b017b2863efcf0007860569c463e4ec13f1 # Parent a2fc275fa9bb3b7897cc03502ee73a04dce73fb5 iOS: Fix a crash in HandyFTP, an additional check I put in for dw_window_get_text() made it return NULL on 0 length strings. Also fix main thread API check warnings for calling updateMenu: by creating a safeCall: method to do it from any thread. Add code to cleanup after splitbar and notebook controls. diff -r a2fc275fa9bb -r b6ae5b017b28 ios/dw.m --- a/ios/dw.m Tue Aug 02 06:17:09 2022 +0000 +++ b/ios/dw.m Tue Aug 02 07:27:13 2022 +0000 @@ -1392,6 +1392,11 @@ [self performSelectorOnMainThread:sel withObject:param waitUntilDone:YES]; } } +-(void)updateMenu:(id)param +{ + for(id obj in _dw_toplevel_windows) + [obj updateMenu]; +} -(void)doBitBlt:(id)param { NSValue *bi = (NSValue *)param; @@ -2156,6 +2161,7 @@ UserData *root = userdata; _dw_remove_userdata(&root, NULL, TRUE); dw_signal_disconnect_by_window(self); + [tabs removeFromSuperview]; [tabs release]; [views release]; [super dealloc]; @@ -2260,7 +2266,22 @@ _dw_handle_resize_events(box); } } --(void)dealloc { UserData *root = userdata; _dw_remove_userdata(&root, NULL, TRUE); dw_signal_disconnect_by_window(self); [super dealloc]; } +-(void)dealloc +{ + UserData *root = userdata; _dw_remove_userdata(&root, NULL, TRUE); + dw_signal_disconnect_by_window(self); + if(topleft) + { + [topleft removeFromSuperview]; + [topleft release]; + } + if(bottomright) + { + [bottomright removeFromSuperview]; + [bottomright release]; + } + [super dealloc]; +} @end /* Subclass for a slider type */ @@ -8661,10 +8682,7 @@ } [DWObj menuHandler:item]; if(check) - { - for(id obj in _dw_toplevel_windows) - [obj updateMenu]; - } + [DWObj safeCall:@selector(updateMenu:) withObject:nil]; }]; /* Don't set the tag if the ID is 0 or -1 */ if(itemid != DW_MENU_AUTO && itemid != DW_MENU_POPUP) @@ -8712,8 +8730,7 @@ if(newstate != [menuitem state]) { [menuitem setState:newstate]; - for(id obj in _dw_toplevel_windows) - [obj updateMenu]; + [DWObj safeCall:@selector(updateMenu:) withObject:nil]; } } } @@ -8768,10 +8785,7 @@ /* Only force the menus to repopulate if something changed */ if(oldstate != [menuitem state] || oldenabled != [menuitem enabled]) - { - for(id obj in _dw_toplevel_windows) - [obj updateMenu]; - } + [DWObj safeCall:@selector(updateMenu:) withObject:nil]; } } @@ -9293,10 +9307,7 @@ } /* Only force the menus to repopulate if something changed */ if(oldstate != [menuitem state] || oldenabled != [menuitem enabled]) - { - for(id obj in _dw_toplevel_windows) - [obj updateMenu]; - } + [DWObj safeCall:@selector(updateMenu:) withObject:nil]; } DW_FUNCTION_RETURN_NOTHING; } @@ -9518,6 +9529,11 @@ DWWindow *window = handle; [window setHidden:YES]; [_dw_toplevel_windows removeObject:window]; + for(id object in [[[window rootViewController] view] subviews]) + { + [object removeFromSuperview]; + [object release]; + } [[[window rootViewController] view] removeFromSuperview]; [window setRootViewController:nil]; } @@ -9630,7 +9646,7 @@ } } } - if(nsstr && [nsstr length] > 0) + if(nsstr) retval = strdup([nsstr UTF8String]); DW_FUNCTION_RETURN_THIS(retval); }