mirror of
https://github.com/profanity-im/profanity.git
synced 2025-01-03 14:57:42 -05:00
Added ctrl-w support (with debug)
This commit is contained in:
parent
71ed9ac2d1
commit
fe021a226c
@ -72,6 +72,7 @@ static void _handle_backspace(int display_size, int inp_x, int *size, char *inpu
|
|||||||
static int _printable(const wint_t ch);
|
static int _printable(const wint_t ch);
|
||||||
static void _clear_input(void);
|
static void _clear_input(void);
|
||||||
static void _go_to_end(int display_size);
|
static void _go_to_end(int display_size);
|
||||||
|
static void _delete_previous_word(char *input, int *size);
|
||||||
|
|
||||||
void
|
void
|
||||||
create_input_window(void)
|
create_input_window(void)
|
||||||
@ -134,6 +135,14 @@ inp_get_char(char *input, int *size, int *result)
|
|||||||
noecho();
|
noecho();
|
||||||
*result = wget_wch(inp_win, &ch);
|
*result = wget_wch(inp_win, &ch);
|
||||||
|
|
||||||
|
if (*result != ERR) {
|
||||||
|
if (*result == KEY_CODE_YES) {
|
||||||
|
cons_debug("KEY %d, KEY_CODE_YES", ch);
|
||||||
|
} else {
|
||||||
|
cons_debug("KEY %d", ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gboolean in_command = FALSE;
|
gboolean in_command = FALSE;
|
||||||
if ((display_size > 0 && input[0] == '/') ||
|
if ((display_size > 0 && input[0] == '/') ||
|
||||||
(display_size == 0 && ch == '/')) {
|
(display_size == 0 && ch == '/')) {
|
||||||
@ -534,6 +543,10 @@ _handle_edit(int result, const wint_t ch, char *input, int *size)
|
|||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
case 23: // ctrl-w
|
||||||
|
_delete_previous_word(input, size);
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -597,8 +610,7 @@ _handle_backspace(int display_size, int inp_x, int *size, char *input)
|
|||||||
static int
|
static int
|
||||||
_handle_alt_key(char *input, int *size, int key)
|
_handle_alt_key(char *input, int *size, int key)
|
||||||
{
|
{
|
||||||
int end_del = getcurx(inp_win);
|
cons_debug("ALT %d", key);
|
||||||
int start_del = end_del;
|
|
||||||
|
|
||||||
switch (key)
|
switch (key)
|
||||||
{
|
{
|
||||||
@ -640,70 +652,7 @@ _handle_alt_key(char *input, int *size, int key)
|
|||||||
break;
|
break;
|
||||||
case 263:
|
case 263:
|
||||||
case 127:
|
case 127:
|
||||||
input[*size] = '\0';
|
_delete_previous_word(input, size);
|
||||||
gchar *curr_ch = g_utf8_offset_to_pointer(input, end_del);
|
|
||||||
curr_ch = g_utf8_find_prev_char(input, curr_ch);
|
|
||||||
gchar *prev_ch;
|
|
||||||
gunichar curr_uni;
|
|
||||||
gunichar prev_uni;
|
|
||||||
|
|
||||||
while (curr_ch != NULL) {
|
|
||||||
curr_uni = g_utf8_get_char(curr_ch);
|
|
||||||
|
|
||||||
if (g_unichar_isspace(curr_uni)) {
|
|
||||||
curr_ch = g_utf8_find_prev_char(input, curr_ch);
|
|
||||||
} else {
|
|
||||||
prev_ch = g_utf8_find_prev_char(input, curr_ch);
|
|
||||||
if (prev_ch == NULL) {
|
|
||||||
curr_ch = NULL;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
prev_uni = g_utf8_get_char(prev_ch);
|
|
||||||
if (g_unichar_isspace(prev_uni)) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
curr_ch = prev_ch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (curr_ch == NULL) {
|
|
||||||
start_del = 0;
|
|
||||||
} else {
|
|
||||||
start_del = g_utf8_pointer_to_offset(input, curr_ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
gint len = g_utf8_strlen(input, -1);
|
|
||||||
gchar *start_string = g_utf8_substring(input, 0, start_del);
|
|
||||||
gchar *end_string = g_utf8_substring(input, end_del, len);
|
|
||||||
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < strlen(start_string); i++) {
|
|
||||||
input[i] = start_string[i];
|
|
||||||
}
|
|
||||||
for (i = 0; i < strlen(end_string); i++) {
|
|
||||||
input[strlen(start_string)+i] = end_string[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
*size = strlen(start_string)+i;
|
|
||||||
input[*size] = '\0';
|
|
||||||
|
|
||||||
_clear_input();
|
|
||||||
waddstr(inp_win, input);
|
|
||||||
wmove(inp_win, 0, start_del);
|
|
||||||
|
|
||||||
// if gone off screen to left, jump left (half a screen worth)
|
|
||||||
if (start_del <= pad_start) {
|
|
||||||
pad_start = pad_start - (cols / 2);
|
|
||||||
if (pad_start < 0) {
|
|
||||||
pad_start = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
_inp_win_update_virtual();
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -711,6 +660,76 @@ _handle_alt_key(char *input, int *size, int key)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_delete_previous_word(char *input, int *size)
|
||||||
|
{
|
||||||
|
int end_del = getcurx(inp_win);
|
||||||
|
int start_del = end_del;
|
||||||
|
|
||||||
|
input[*size] = '\0';
|
||||||
|
gchar *curr_ch = g_utf8_offset_to_pointer(input, end_del);
|
||||||
|
curr_ch = g_utf8_find_prev_char(input, curr_ch);
|
||||||
|
gchar *prev_ch;
|
||||||
|
gunichar curr_uni;
|
||||||
|
gunichar prev_uni;
|
||||||
|
|
||||||
|
while (curr_ch != NULL) {
|
||||||
|
curr_uni = g_utf8_get_char(curr_ch);
|
||||||
|
|
||||||
|
if (g_unichar_isspace(curr_uni)) {
|
||||||
|
curr_ch = g_utf8_find_prev_char(input, curr_ch);
|
||||||
|
} else {
|
||||||
|
prev_ch = g_utf8_find_prev_char(input, curr_ch);
|
||||||
|
if (prev_ch == NULL) {
|
||||||
|
curr_ch = NULL;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
prev_uni = g_utf8_get_char(prev_ch);
|
||||||
|
if (g_unichar_isspace(prev_uni)) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
curr_ch = prev_ch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (curr_ch == NULL) {
|
||||||
|
start_del = 0;
|
||||||
|
} else {
|
||||||
|
start_del = g_utf8_pointer_to_offset(input, curr_ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
gint len = g_utf8_strlen(input, -1);
|
||||||
|
gchar *start_string = g_utf8_substring(input, 0, start_del);
|
||||||
|
gchar *end_string = g_utf8_substring(input, end_del, len);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < strlen(start_string); i++) {
|
||||||
|
input[i] = start_string[i];
|
||||||
|
}
|
||||||
|
for (i = 0; i < strlen(end_string); i++) {
|
||||||
|
input[strlen(start_string)+i] = end_string[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
*size = strlen(start_string)+i;
|
||||||
|
input[*size] = '\0';
|
||||||
|
|
||||||
|
_clear_input();
|
||||||
|
waddstr(inp_win, input);
|
||||||
|
wmove(inp_win, 0, start_del);
|
||||||
|
|
||||||
|
// if gone off screen to left, jump left (half a screen worth)
|
||||||
|
if (start_del <= pad_start) {
|
||||||
|
pad_start = pad_start - (cols / 2);
|
||||||
|
if (pad_start < 0) {
|
||||||
|
pad_start = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_inp_win_update_virtual();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_go_to_end(int display_size)
|
_go_to_end(int display_size)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user