changeset 2820:b6ae5b017b28

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.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Tue, 02 Aug 2022 07:27:13 +0000
parents a2fc275fa9bb
children 3731f21dd678
files ios/dw.m
diffstat 1 files changed, 32 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- 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);
 }