shithub: orca

Download patch

ref: 367d17bd26b096c0e918714b08ef82e88ade1f96
parent: 82eaa84506a3e1ee3569d53ba7786cfc8d352b25
author: cancel <cancel@cancel.fm>
date: Fri Jan 3 12:32:19 EST 2020

Add hack to avoid extra allocation at startup for auto grid size

Temporary measures to avoid extra allocation until we factor out the
resizing stuff -- probably for when we add "New file" support.

--- a/tui_main.c
+++ b/tui_main.c
@@ -2396,8 +2396,19 @@
     heapstr_init_cstr(&file_name, input_file);
   } else {
     heapstr_init_cstr(&file_name, "unnamed");
-    field_init_fill(&ged_state.field, (Usz)init_grid_dim_y,
-                    (Usz)init_grid_dim_x, '.');
+    // Temp hacky stuff: we've crammed two code paths into the KEY_RESIZE event
+    // case. One of them is for the initial setup for an automatic grid size.
+    // The other is for actual resize events. We will factor this out into
+    // procedures in the future, but until then, we've made a slight mess. In
+    // the case where the user has explicitly specified a size, we'll allocate
+    // the Field stuff here. If there's an automatic size, then we'll allocate
+    // the field in the KEY_RESIZE handler. The reason we don't just allocate
+    // it here and then again later is to avoid an extra allocation and memory
+    // manipulation.
+    if (!should_autosize_grid) {
+      field_init_fill(&ged_state.field, (Usz)init_grid_dim_y,
+                      (Usz)init_grid_dim_x, '.');
+    }
   }
   ged_state.filename = file_name.str;
   ged_set_midi_mode(&ged_state, &midi_mode);
@@ -2583,7 +2594,10 @@
         ged_state.is_draw_dirty = true;
       }
       // We might do this once soon after startup if the user specified neither
-      // a starting grid size or a file to open.
+      // a starting grid size or a file to open. See above (search KEY_RESIZE)
+      // for why this is kind of messy and hacky -- we'll be changing this
+      // again before too long, so we haven't made too much of an attempt to
+      // keep it non-messy.
       if (should_autosize_grid) {
         should_autosize_grid = false;
         Usz new_field_h, new_field_w;
@@ -2591,18 +2605,14 @@
                 content_h, content_w, softmargin_y, softmargin_x,
                 (int)ged_state.ruler_spacing_y, (int)ged_state.ruler_spacing_x,
                 &new_field_h, &new_field_w)) {
-          // Do this raw instead of with ged_resize_grid() since we don't need
-          // to save any undo history -- the user hasn't done anything in the
-          // file yet. Hopefully.
-          field_resize_raw(&ged_state.field, new_field_h, new_field_w);
-          memset(ged_state.field.buffer, '.',
-                 new_field_h * new_field_w * sizeof(Glyph));
+          field_init_fill(&ged_state.field, (Usz)new_field_h, (Usz)new_field_w,
+                          '.');
           mbuf_reusable_ensure_size(&ged_state.mbuf_r, new_field_h,
                                     new_field_w);
-          ged_cursor_confine(&ged_state.ged_cursor, new_field_h, new_field_w);
-          ged_state.needs_remarking = true;
-          ged_state.is_draw_dirty = true;
           ged_make_cursor_visible(&ged_state);
+        } else {
+          field_init_fill(&ged_state.field, (Usz)init_grid_dim_y,
+                          (Usz)init_grid_dim_x, '.');
         }
       }
       // OK to call this unconditionally -- deriving the sub-window areas is