ref: 99df9af89434f955c5dcf13911ad26208a8b7f24
parent: 69044c8e50303da4ad4481c66a5749d98af053a8
author: cancel <cancel@cancel.fm>
date: Sun Dec 30 08:15:13 EST 2018
Add --undo-limit option
--- a/tui_main.c
+++ b/tui_main.c
@@ -23,9 +23,13 @@
fprintf(stderr,
"Usage: orca [options] [file]\n\n"
"General options:\n"
- " --margins <number> Set cosmetic margins.\n"
- " Default: 2\n"
- " -h or --help Print this message and exit.\n"
+ " --margins <number> Set cosmetic margins.\n"
+ " Default: 2\n"
+ " --undo-limit <number> Set the maximum number of undo steps.\n"
+ " If you plan to work with large files,\n"
+ " set this to a low number.\n"
+ " Default: 100\n"
+ " -h or --help Print this message and exit.\n"
"\n"
"OSC/MIDI options:\n"
" --osc-server <address>\n"
@@ -319,12 +323,14 @@
Undo_node* first;
Undo_node* last;
Usz count;
+ Usz limit;
} Undo_history;
-void undo_history_init(Undo_history* hist) {+void undo_history_init(Undo_history* hist, Usz limit) {hist->first = NULL;
hist->last = NULL;
hist->count = 0;
+ hist->limit = limit;
}
void undo_history_deinit(Undo_history* hist) {Undo_node* a = hist->first;
@@ -336,11 +342,11 @@
}
}
-enum { Undo_history_max = 500 };-
void undo_history_push(Undo_history* hist, Field* field, Usz tick_num) {+ if (hist->limit == 0)
+ return;
Undo_node* new_node;
- if (hist->count == Undo_history_max) {+ if (hist->count == hist->limit) {new_node = hist->first;
if (new_node == hist->last) {hist->first = NULL;
@@ -687,12 +693,12 @@
bool is_hud_visible : 1;
} Ged;
-void ged_init(Ged* a) {+void ged_init(Ged* a, Usz undo_limit) {gfield_init(&a->field);
gfield_init(&a->scratch_field);
gfield_init(&a->clipboard_field);
markmap_reusable_init(&a->markmap_r);
- undo_history_init(&a->undo_hist);
+ undo_history_init(&a->undo_hist, undo_limit);
ged_cursor_init(&a->ged_cursor);
oevent_list_init(&a->oevent_list);
oevent_list_init(&a->scratch_oevent_list);
@@ -1709,6 +1715,7 @@
enum {Argopt_margins = UCHAR_MAX + 1,
+ Argopt_undo_limit,
Argopt_osc_server,
Argopt_osc_port,
Argopt_osc_midi_bidule,
@@ -1718,6 +1725,7 @@
int main(int argc, char** argv) { static struct option tui_options[] = { {"margins", required_argument, 0, Argopt_margins},+ {"undo-limit", required_argument, 0, Argopt_undo_limit}, {"help", no_argument, 0, 'h'}, {"osc-server", required_argument, 0, Argopt_osc_server}, {"osc-port", required_argument, 0, Argopt_osc_port},@@ -1726,6 +1734,7 @@
{NULL, 0, NULL, 0}};char* input_file = NULL;
int margin_thickness = 2;
+ int undo_history_limit = 100;
char const* osc_hostname = NULL;
char const* osc_port = NULL;
bool strict_timing = false;
@@ -1741,7 +1750,8 @@
return 0;
case Argopt_margins: {margin_thickness = atoi(optarg);
- if (margin_thickness == 0 && strcmp(optarg, "0")) {+ if (margin_thickness < 0 ||
+ (margin_thickness == 0 && strcmp(optarg, "0"))) {fprintf(stderr,
"Bad margins argument %s.\n"
"Must be 0 or positive integer.\n",
@@ -1749,6 +1759,17 @@
return 1;
}
} break;
+ case Argopt_undo_limit: {+ undo_history_limit = atoi(optarg);
+ if (undo_history_limit < 0 ||
+ (undo_history_limit == 0 && strcmp(optarg, "0"))) {+ fprintf(stderr,
+ "Bad undo-limit argument %s.\n"
+ "Must be 0 or positive integer.\n",
+ optarg);
+ return 1;
+ }
+ } break;
case Argopt_osc_server: {osc_hostname = optarg;
} break;
@@ -1767,12 +1788,6 @@
}
}
- if (margin_thickness < 0) {- fprintf(stderr, "Margins must be >= 0.\n");
- usage();
- return 1;
- }
-
if (optind == argc - 1) {input_file = argv[optind];
} else if (optind < argc - 1) {@@ -1782,7 +1797,7 @@
qnav_init();
Ged ged_state;
- ged_init(&ged_state);
+ ged_init(&ged_state, (Usz)undo_history_limit);
if (osc_hostname != NULL && osc_port == NULL) {fprintf(stderr,
--
⑨