]> git.lizzy.rs Git - nothing.git/commitdiff
use insert_char for insert_string, free console log, move actions to edit field
authorisidentical <batuhanosmantaskaya@gmail.com>
Wed, 18 Dec 2019 14:22:36 +0000 (17:22 +0300)
committerisidentical <batuhanosmantaskaya@gmail.com>
Wed, 18 Dec 2019 14:22:36 +0000 (17:22 +0300)
src/ui/console.c
src/ui/console_log.c
src/ui/edit_field.c
src/ui/edit_field.h

index 8338936aa164217a6b9cbc3eb6f7796f6e1b4898..157dec9f0e5f27c515e8adbfc1f74859f59c3021 100644 (file)
@@ -213,24 +213,6 @@ int console_handle_event(Console *console,
             }
         } break;
 
-        case SDLK_w: {
-            if (event->key.keysym.mod & (KMOD_CTRL | KMOD_ALT)) {
-                SDL_SetClipboardText(edit_field_as_text(console->edit_field));
-                if (event->key.keysym.mod & KMOD_CTRL) {
-                    edit_field_clean(console->edit_field);
-                }
-                return 0;
-            }
-        } break;
-
-       case SDLK_y: {
-            if (event->key.keysym.mod & KMOD_CTRL) {
-                char *text = SDL_GetClipboardText();
-                edit_field_append(console->edit_field, text);
-                return 0;
-            }
-        } break;
-
         case SDLK_DOWN:
             edit_field_replace(
                 console->edit_field,
index 87d872bc882bf655696bf0b8a6b9e4622cf9edc7..d4dc7d998d30883bc7429fa120e4b2145b7f5e16 100644 (file)
@@ -114,6 +114,7 @@ void console_log_clear(Console_Log *console_log)
     console_log->cursor = 0;
     for (size_t i = 0; i < console_log->capacity; ++i) {
         if (console_log->buffer[i]) {
+            free(console_log->buffer[i]);
             console_log->buffer[i] = 0;
         }
     }
index c055283e4a523272ab8fb3f1f3da3ef36af60fc2..1793da30733338e917b03ac40d41316759e0d023 100644 (file)
@@ -38,6 +38,9 @@ static void delete_backward_char(Edit_field *edit_field);
 static void kill_word(Edit_field *edit_field);
 static void backward_kill_word(Edit_field *edit_field);
 static void kill_to_end_of_line(Edit_field *edit_field);
+static void field_buffer_cut(Edit_field *edit_field);
+static void field_buffer_copy(Edit_field *edit_field);
+static void field_buffer_paste(Edit_field *edit_field);
 
 static void handle_keydown(Edit_field *edit_field, const SDL_Event *event);
 static void handle_keydown_alt(Edit_field *edit_field, const SDL_Event *event);
@@ -56,6 +59,15 @@ static void edit_field_insert_char(Edit_field *edit_field, char c)
     edit_field->buffer[++edit_field->buffer_size] = 0;
 }
 
+static inline
+void edit_field_insert_string(Edit_field *edit_field, const char *text)
+{
+    size_t n = strlen(text);
+    for (size_t i = 0; i < n; ++i) {
+        edit_field_insert_char(edit_field, text[i]);
+    }
+}
+
 // See: https://www.gnu.org/software/emacs/manual/html_node/emacs/Moving-Point.html
 // For an explanation of the naming terminology for these helper methods
 
@@ -201,6 +213,23 @@ static void kill_to_end_of_line(Edit_field *edit_field) {
                                 edit_field->buffer_size);
 }
 
+static void field_buffer_cut(Edit_field *edit_field) {
+    // "C-w"
+    SDL_SetClipboardText(edit_field_as_text(edit_field));
+    edit_field_clean(edit_field);
+}
+
+static void field_buffer_copy(Edit_field *edit_field) {
+    // "M-w"
+    SDL_SetClipboardText(edit_field_as_text(edit_field));
+}
+
+static void field_buffer_paste(Edit_field *edit_field) {
+    // "C-y"
+    char *text = SDL_GetClipboardText();
+    edit_field_insert_string(edit_field, text);
+}
+
 static void handle_keydown(Edit_field *edit_field, const SDL_Event *event)
 {
     switch (event->key.keysym.sym) {
@@ -251,6 +280,10 @@ static void handle_keydown_alt(Edit_field *edit_field, const SDL_Event *event)
     case SDLK_d: {
         kill_word(edit_field);
     } break;
+
+    case SDLK_w: {
+        field_buffer_copy(edit_field);
+    } break;
     }
 }
 
@@ -296,6 +329,14 @@ static void handle_keydown_ctrl(Edit_field *edit_field, const SDL_Event *event)
     case SDLK_k: {
         kill_to_end_of_line(edit_field);
     } break;
+
+    case SDLK_w: {
+        field_buffer_cut(edit_field);
+    } break;
+
+    case SDLK_y: {
+        field_buffer_paste(edit_field);
+    } break;
     }
 }
 
@@ -449,13 +490,6 @@ void edit_field_replace(Edit_field *edit_field, const char *text)
     }
 }
 
-void edit_field_append(Edit_field *edit_field, const char *text)
-{
-    size_t n = strlen(text);
-    edit_field->buffer = strcat(edit_field->buffer, text);
-    edit_field->cursor += n;
-}
-
 void edit_field_clean(Edit_field *edit_field)
 {
     trace_assert(edit_field);
index 59cb5079a2ed25ac211b743519ceea54f190fc0a..a896876c020085a7687fa6ff49aaeff8b74e8fea 100644 (file)
@@ -26,7 +26,6 @@ int edit_field_event(Edit_field *edit_field, const SDL_Event *event);
 const char *edit_field_as_text(const Edit_field *edit_field);
 
 void edit_field_replace(Edit_field *edit_field, const char *text);
-void edit_field_append(Edit_field *edit_field, const char *text);
 void edit_field_clean(Edit_field *edit_field);
 void edit_field_restyle(Edit_field *edit_field,
                         Vec2f font_size,