summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buffer.c28
-rw-r--r--command.c2
-rw-r--r--main.c60
3 files changed, 70 insertions, 20 deletions
diff --git a/buffer.c b/buffer.c
index e45abeb..7489d04 100644
--- a/buffer.c
+++ b/buffer.c
@@ -1066,15 +1066,34 @@ void buffer_cursor_move_to_pos(TextBuffer *buffer, BufferPos pos) {
i64 buffer_cursor_move_left(TextBuffer *buffer, i64 by) {
BufferPos cur_pos = buffer->cursor_pos;
- i64 ret = buffer_pos_move_left(buffer, &cur_pos, by);
- buffer_cursor_move_to_pos(buffer, cur_pos);
+ i64 ret = 0;
+ // if use is selecting something, then moves left, the cursor should move to the left of the selection
+ if (buffer->selection) {
+ if (buffer_pos_cmp(buffer->selection_pos, buffer->cursor_pos) < 0) {
+ ret = buffer_pos_diff(buffer, buffer->selection_pos, buffer->cursor_pos);
+ buffer_cursor_move_to_pos(buffer, buffer->selection_pos);
+ }
+ buffer->selection = false;
+ } else {
+ ret = buffer_pos_move_left(buffer, &cur_pos, by);
+ buffer_cursor_move_to_pos(buffer, cur_pos);
+ }
return ret;
}
i64 buffer_cursor_move_right(TextBuffer *buffer, i64 by) {
BufferPos cur_pos = buffer->cursor_pos;
- i64 ret = buffer_pos_move_right(buffer, &cur_pos, by);
- buffer_cursor_move_to_pos(buffer, cur_pos);
+ i64 ret = 0;
+ if (buffer->selection) {
+ if (buffer_pos_cmp(buffer->selection_pos, buffer->cursor_pos) > 0) {
+ ret = buffer_pos_diff(buffer, buffer->cursor_pos, buffer->selection_pos);
+ buffer_cursor_move_to_pos(buffer, buffer->selection_pos);
+ }
+ buffer->selection = false;
+ } else {
+ ret = buffer_pos_move_right(buffer, &cur_pos, by);
+ buffer_cursor_move_to_pos(buffer, cur_pos);
+ }
return ret;
}
@@ -1785,7 +1804,6 @@ static void buffer_cursor_to_edit(TextBuffer *buffer, BufferEdit *edit) {
buffer->selection = false;
buffer_cursor_move_to_pos(buffer,
buffer_pos_advance(buffer, edit->pos, edit->prev_len));
- buffer_center_cursor(buffer); // whenever we undo an edit, put the cursor in the center, to make it clear where the undo happened
}
// a <-b <-c
diff --git a/command.c b/command.c
index b0b9df3..9470dc0 100644
--- a/command.c
+++ b/command.c
@@ -125,6 +125,8 @@ void command_execute(Ted *ted, Command c, i64 argument) {
find_next(ted);
else
find_prev(ted);
+ } else if (buffer) {
+ buffer_newline(buffer);
}
} else if (buffer) {
buffer_newline(buffer);
diff --git a/main.c b/main.c
index 3ffd7c8..923009f 100644
--- a/main.c
+++ b/main.c
@@ -268,7 +268,8 @@ INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
int main(int argc, char **argv) {
#endif
PROFILE_TIME(init_start)
-
+ PROFILE_TIME(basic_init_start)
+
#if __unix__
{
struct sigaction act = {0};
@@ -287,6 +288,7 @@ int main(int argc, char **argv) {
#endif
setlocale(LC_ALL, ""); // allow unicode
+
// read command-line arguments
@@ -305,11 +307,15 @@ int main(int argc, char **argv) {
return EXIT_FAILURE;
}
+ PROFILE_TIME(basic_init_end)
-
+ PROFILE_TIME(sdl_start)
SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1"); // if this program is sent a SIGTERM/SIGINT, don't turn it into a quit event
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0)
die("%s", SDL_GetError());
+ PROFILE_TIME(sdl_end)
+
+ PROFILE_TIME(misc_start)
Ted *ted = calloc(1, sizeof *ted);
if (!ted) {
@@ -393,9 +399,12 @@ int main(int argc, char **argv) {
ted->search_cwd = true;
#endif
+
Settings *settings = &ted->settings;
char config_err[sizeof ted->error] = {0};
+ PROFILE_TIME(misc_end)
+ PROFILE_TIME(configs_start)
{
// copy global config to local config
char local_config_filename[TED_PATH_MAX];
@@ -423,8 +432,9 @@ int main(int argc, char **argv) {
config_read(ted, TED_CFG);
}
}
+ PROFILE_TIME(configs_end)
-
+ PROFILE_TIME(window_start)
SDL_Window *window = SDL_CreateWindow("ted", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, 1280, 720, SDL_WINDOW_SHOWN|SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
if (!window)
@@ -440,7 +450,10 @@ int main(int argc, char **argv) {
SDL_FreeSurface(icon);
} // if we can't find the icon file, it's no big deal
}
-
+
+ PROFILE_TIME(window_end)
+ PROFILE_TIME(gl_start)
+
gl_version_major = 4;
gl_version_minor = 3;
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, gl_version_major);
@@ -475,19 +488,17 @@ int main(int argc, char **argv) {
}
}
#endif
-
+
gl_geometry_init();
text_init();
+ PROFILE_TIME(gl_end)
+
- SDL_GL_SetSwapInterval(1); // vsync
PROFILE_TIME(fonts_start)
ted_load_fonts(ted);
PROFILE_TIME(fonts_end)
-#if PROFILE
-
-#endif
-
+ PROFILE_TIME(create_start)
if (ted_haserr(ted))
die("Error loading font: %s", ted_geterr(ted));
{
@@ -524,15 +535,33 @@ int main(int argc, char **argv) {
ted->cursor_resize_v = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS);
ted->cursor_hand = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND);
ted->cursor_move = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL);
+
+ PROFILE_TIME(create_end)
-
+ PROFILE_TIME(get_ready_start)
Uint32 time_at_last_frame = SDL_GetTicks();
strbuf_cpy(ted->error, config_err);
- SDL_DisplayMode display_mode = {0};
- SDL_GetDisplayMode(0, 0, &display_mode);
+ SDL_GL_SetSwapInterval(1); // vsync
+
+ PROFILE_TIME(get_ready_end)
+
+ PROFILE_TIME(init_end)
+
+#if PROFILE
+ print("Initialization: %.1fms\n", 1000 * (init_end - init_start));
+ print(" - Basic init: %.1fms\n", 1000 * (basic_init_end - basic_init_start));
+ print(" - SDL: %.1fms\n", 1000 * (sdl_end - sdl_start));
+ print(" - SDL window: %.1fms\n", 1000 * (window_end - window_start));
+ print(" - Create: %.1fms\n", 1000 * (create_end - create_start));
+ print(" - OpenGL: %.1fms\n", 1000 * (gl_end - gl_start));
+ print(" - misc: %.1fms\n", 1000 * (misc_end - misc_start));
+ print(" - Loading fonts: %.1fms\n", 1000 * (fonts_end - fonts_start));
+ print(" - Read configs: %.1fms\n", 1000 * (configs_end - configs_start));
+ print(" - Get ready: %.1fms\n", 1000 * (get_ready_end - get_ready_start));
+#endif
while (!ted->quit) {
#if DEBUG
@@ -871,7 +900,8 @@ int main(int argc, char **argv) {
SDL_SetCursor(ted->cursor);
// annoyingly, SDL_GL_SwapWindow seems to be a busy loop on my laptop for some reason...
- int refresh_rate = display_mode.refresh_rate;
+ // enforce a framerate of 60. this isn't ideal but SDL_GetDisplayMode is *extremely slow* (250ms), so we don't really have a choice.
+ int refresh_rate = 60;
if (refresh_rate) {
i32 ms_wait = 1000 / refresh_rate - (i32)((frame_end_noswap - frame_start) * 1000);
if (ms_wait > 0) {
@@ -880,7 +910,7 @@ int main(int argc, char **argv) {
}
}
SDL_GL_SwapWindow(window);
- PROFILE_TIME(frame_end);
+ PROFILE_TIME(frame_end)
assert(glGetError() == 0);