static guint bastile_secure_buffer_real_delete_text (GtkEntryBuffer *buffer, guint position, guint n_chars) { BastileSecureBuffer *self = BASTILE_SECURE_BUFFER (buffer); BastileSecureBufferPrivate *pv = self->priv; gsize start, end; if (position > pv->text_chars) position = pv->text_chars; if (position + n_chars > pv->text_chars) n_chars = pv->text_chars - position; if (n_chars > 0) { start = g_utf8_offset_to_pointer (pv->text, position) - pv->text; end = g_utf8_offset_to_pointer (pv->text, position + n_chars) - pv->text; g_memmove (pv->text + start, pv->text + end, pv->text_bytes + 1 - end); pv->text_chars -= n_chars; pv->text_bytes -= (end - start); gtk_entry_buffer_emit_deleted_text (buffer, position, n_chars); } return n_chars; }
static guint gtk_entry_buffer_normal_delete_text (GtkEntryBuffer *buffer, guint position, guint n_chars) { GtkEntryBufferPrivate *pv = buffer->priv; gsize start, end; if (position > pv->normal_text_chars) position = pv->normal_text_chars; if (position + n_chars > pv->normal_text_chars) n_chars = pv->normal_text_chars - position; if (n_chars > 0) { start = g_utf8_offset_to_pointer (pv->normal_text, position) - pv->normal_text; end = g_utf8_offset_to_pointer (pv->normal_text, position + n_chars) - pv->normal_text; g_memmove (pv->normal_text + start, pv->normal_text + end, pv->normal_text_bytes + 1 - end); pv->normal_text_chars -= n_chars; pv->normal_text_bytes -= (end - start); /* * Could be a password, make sure we don't leave anything sensitive after * the terminating zero. Note, that the terminating zero already trashed * one byte. */ trash_area (pv->normal_text + pv->normal_text_bytes + 1, end - start - 1); gtk_entry_buffer_emit_deleted_text (buffer, position, n_chars); } return n_chars; }