diff --git a/src/fe-text/gui-entry.c b/src/fe-text/gui-entry.c index 25965495..5050c800 100644 --- a/src/fe-text/gui-entry.c +++ b/src/fe-text/gui-entry.c @@ -20,6 +20,7 @@ #include "module.h" #include +#include #include #include @@ -772,11 +773,13 @@ static GUI_ENTRY_CUTBUFFER_REC *get_cutbuffer_rec(GUI_ENTRY_REC *entry, CUTBUFFE void gui_entry_erase(GUI_ENTRY_REC *entry, int size, CUTBUFFER_UPDATE_OP update_cutbuffer) { + gboolean clear_enabled; size_t i, w = 0; g_return_if_fail(entry != NULL); + clear_enabled = settings_get_bool("empty_kill_clears_cutbuffer"); - if (size == 0 || entry->pos < size) + if (entry->pos < size || (size == 0 && !clear_enabled)) return; if (update_cutbuffer != CUTBUFFER_UPDATE_NOOP) { @@ -792,48 +795,53 @@ void gui_entry_erase(GUI_ENTRY_REC *entry, int size, CUTBUFFER_UPDATE_OP update_ tmpcutbuffer = tmp->cutbuffer; entry->append_next_kill = TRUE; switch (update_cutbuffer) { - case CUTBUFFER_UPDATE_APPEND: - tmp->cutbuffer = g_new(unichar, cutbuffer_new_size+1); - memcpy(tmp->cutbuffer, tmpcutbuffer, - tmp->cutbuffer_len * sizeof(unichar)); - memcpy(tmp->cutbuffer + tmp->cutbuffer_len, - entry->text + entry->pos - size, size * sizeof(unichar)); + case CUTBUFFER_UPDATE_APPEND: + tmp->cutbuffer = g_new(unichar, cutbuffer_new_size + 1); + memcpy(tmp->cutbuffer, tmpcutbuffer, tmp->cutbuffer_len * sizeof(unichar)); + memcpy(tmp->cutbuffer + tmp->cutbuffer_len, entry->text + entry->pos - size, + size * sizeof(unichar)); - tmp->cutbuffer_len = cutbuffer_new_size; - tmp->cutbuffer[cutbuffer_new_size] = '\0'; - g_free(tmpcutbuffer); - break; + tmp->cutbuffer_len = cutbuffer_new_size; + tmp->cutbuffer[cutbuffer_new_size] = '\0'; + g_free(tmpcutbuffer); + break; - case CUTBUFFER_UPDATE_PREPEND: - tmp->cutbuffer = g_new(unichar, cutbuffer_new_size+1); - memcpy(tmp->cutbuffer, entry->text + entry->pos - size, - size * sizeof(unichar)); - memcpy(tmp->cutbuffer + size, tmpcutbuffer, - tmp->cutbuffer_len * sizeof(unichar)); + case CUTBUFFER_UPDATE_PREPEND: + tmp->cutbuffer = g_new(unichar, cutbuffer_new_size + 1); + memcpy(tmp->cutbuffer, entry->text + entry->pos - size, + size * sizeof(unichar)); + memcpy(tmp->cutbuffer + size, tmpcutbuffer, + tmp->cutbuffer_len * sizeof(unichar)); - tmp->cutbuffer_len = cutbuffer_new_size; - tmp->cutbuffer[cutbuffer_new_size] = '\0'; - g_free(tmpcutbuffer); - break; + tmp->cutbuffer_len = cutbuffer_new_size; + tmp->cutbuffer[cutbuffer_new_size] = '\0'; + g_free(tmpcutbuffer); + break; - case CUTBUFFER_UPDATE_REPLACE: - /* put erased text to cutbuffer */ - if (tmp->cutbuffer_len < size) { - g_free(tmp->cutbuffer); - tmp->cutbuffer = g_new(unichar, size+1); - } + case CUTBUFFER_UPDATE_REPLACE: + /* put erased text to cutbuffer */ + if (tmp->cutbuffer_len < size || tmp->cutbuffer == NULL) { + g_free(tmp->cutbuffer); + tmp->cutbuffer = g_new(unichar, size + 1); + } - tmp->cutbuffer_len = size; - tmp->cutbuffer[size] = '\0'; - memcpy(tmp->cutbuffer, entry->text + entry->pos - size, size * sizeof(unichar)); - break; + tmp->cutbuffer_len = size; + tmp->cutbuffer[size] = '\0'; + memcpy(tmp->cutbuffer, entry->text + entry->pos - size, + size * sizeof(unichar)); + break; - case CUTBUFFER_UPDATE_NOOP: - /* cannot happen, handled in "if" */ - break; + case CUTBUFFER_UPDATE_NOOP: + /* cannot happen, handled in "if" */ + break; } } + if (size == 0) { + /* we just wanted to clear the cutbuffer */ + return; + } + if (entry->utf8) while (entry->pos > size + w && i_wcwidth(entry->text[entry->pos - size - w]) == 0) w++; @@ -1498,6 +1506,7 @@ void gui_entry_set_text_and_extents(GUI_ENTRY_REC *entry, GSList *list) void gui_entry_init(void) { + settings_add_bool("lookandfeel", "empty_kill_clears_cutbuffer", FALSE); } void gui_entry_deinit(void)