41 |
#include "../../common/fifo.h" |
#include "../../common/fifo.h" |
42 |
#include "../../irc/irc.h" |
#include "../../irc/irc.h" |
43 |
|
|
|
#define KEY_ESCAPE 27 |
|
44 |
|
|
45 |
/* |
/* |
46 |
* gui_read_keyb: read keyboard line |
* gui_input_default_key_bindings: create default key bindings |
47 |
*/ |
*/ |
48 |
|
|
49 |
void |
void |
50 |
gui_read_keyb () |
gui_input_default_key_bindings () |
51 |
{ |
{ |
52 |
int key, i; |
int i; |
53 |
t_gui_buffer *ptr_buffer; |
char key_str[32], command[32]; |
54 |
t_irc_server *ptr_server; |
|
55 |
t_irc_dcc *ptr_dcc, *ptr_dcc_next; |
/* keys binded with internal functions */ |
56 |
char new_char[3], *decoded_string; |
gui_key_bind ( /* RC */ "ctrl-M", "return"); |
57 |
t_irc_dcc *dcc_selected; |
gui_key_bind ( /* RC */ "ctrl-J", "return"); |
58 |
|
gui_key_bind ( /* tab */ "ctrl-I", "tab"); |
59 |
|
gui_key_bind ( /* basckp */ "ctrl-H", "backspace"); |
60 |
|
gui_key_bind ( /* basckp */ "ctrl-?", "backspace"); |
61 |
|
gui_key_bind ( /* del */ "meta2-3~", "delete"); |
62 |
|
gui_key_bind ( /* ^K */ "ctrl-K", "delete_end_line"); |
63 |
|
gui_key_bind ( /* ^U */ "ctrl-U", "delete_beginning_line"); |
64 |
|
gui_key_bind ( /* ^W */ "ctrl-W", "delete_previous_word"); |
65 |
|
gui_key_bind ( /* home */ "meta2-1~", "home"); |
66 |
|
gui_key_bind ( /* home */ "meta2-H", "home"); |
67 |
|
gui_key_bind ( /* home */ "meta2-7~", "home"); |
68 |
|
gui_key_bind ( /* ^A */ "ctrl-A", "home"); |
69 |
|
gui_key_bind ( /* end */ "meta2-4~", "end"); |
70 |
|
gui_key_bind ( /* end */ "meta2-F", "end"); |
71 |
|
gui_key_bind ( /* end */ "meta2-8~", "end"); |
72 |
|
gui_key_bind ( /* ^E */ "ctrl-E", "end"); |
73 |
|
gui_key_bind ( /* left */ "meta2-D", "left"); |
74 |
|
gui_key_bind ( /* right */ "meta2-C", "right"); |
75 |
|
gui_key_bind ( /* up */ "meta2-A", "up"); |
76 |
|
gui_key_bind ( /* down */ "meta2-B", "down"); |
77 |
|
gui_key_bind ( /* pgup */ "meta2-5~", "page_up"); |
78 |
|
gui_key_bind ( /* pgdn */ "meta2-6~", "page_down"); |
79 |
|
gui_key_bind ( /* F10 */ "meta2-21~", "infobar_clear"); |
80 |
|
gui_key_bind ( /* F11 */ "meta2-23~", "nick_page_up"); |
81 |
|
gui_key_bind ( /* F12 */ "meta2-24~", "nick_page_down"); |
82 |
|
gui_key_bind ( /* m-F11 */ "meta-meta2-1~", "nick_beginning"); |
83 |
|
gui_key_bind ( /* m-F12 */ "meta-meta2-4~", "nick_end"); |
84 |
|
gui_key_bind ( /* ^L */ "ctrl-L", "refresh"); |
85 |
|
gui_key_bind ( /* m-a */ "meta-a", "jump_smart"); |
86 |
|
gui_key_bind ( /* m-b */ "meta-b", "previous_word"); |
87 |
|
gui_key_bind ( /* ^left */ "meta-Od", "previous_word"); |
88 |
|
gui_key_bind ( /* m-d */ "meta-d", "delete_next_word"); |
89 |
|
gui_key_bind ( /* m-f */ "meta-f", "next_word"); |
90 |
|
gui_key_bind ( /* ^right */ "meta-Oc", "next_word"); |
91 |
|
gui_key_bind ( /* m-h */ "meta-h", "hotlist_clear"); |
92 |
|
gui_key_bind ( /* m-j,m-d */ "meta-jmeta-d", "jump_dcc"); |
93 |
|
gui_key_bind ( /* m-r */ "meta-r", "delete_line"); |
94 |
|
gui_key_bind ( /* m-s */ "meta-s", "jump_server"); |
95 |
|
gui_key_bind ( /* m-x */ "meta-x", "jump_next_server"); |
96 |
|
|
97 |
|
/* keys binded with commands */ |
98 |
|
gui_key_bind ( /* m-left */ "meta-meta2-D", "/buffer -1"); |
99 |
|
gui_key_bind ( /* F5 */ "meta2-15~", "/buffer -1"); |
100 |
|
gui_key_bind ( /* m-right */ "meta-meta2-C", "/buffer +1"); |
101 |
|
gui_key_bind ( /* F6 */ "meta2-17~", "/buffer +1"); |
102 |
|
gui_key_bind ( /* F7 */ "meta2-18~", "/window -1"); |
103 |
|
gui_key_bind ( /* F8 */ "meta2-19~", "/window +1"); |
104 |
|
gui_key_bind ( /* m-0 */ "meta-0", "/buffer 10"); |
105 |
|
gui_key_bind ( /* m-1 */ "meta-1", "/buffer 1"); |
106 |
|
gui_key_bind ( /* m-2 */ "meta-2", "/buffer 2"); |
107 |
|
gui_key_bind ( /* m-3 */ "meta-3", "/buffer 3"); |
108 |
|
gui_key_bind ( /* m-4 */ "meta-4", "/buffer 4"); |
109 |
|
gui_key_bind ( /* m-5 */ "meta-5", "/buffer 5"); |
110 |
|
gui_key_bind ( /* m-6 */ "meta-6", "/buffer 6"); |
111 |
|
gui_key_bind ( /* m-7 */ "meta-7", "/buffer 7"); |
112 |
|
gui_key_bind ( /* m-8 */ "meta-8", "/buffer 8"); |
113 |
|
gui_key_bind ( /* m-9 */ "meta-9", "/buffer 9"); |
114 |
|
|
115 |
|
/* bind meta-j + {01..99} to switch to buffers # > 10 */ |
116 |
|
for (i = 1; i < 100; i++) |
117 |
|
{ |
118 |
|
sprintf (key_str, "meta-j%02d", i); |
119 |
|
sprintf (command, "/buffer %d", i); |
120 |
|
gui_key_bind (key_str, command); |
121 |
|
} |
122 |
|
} |
123 |
|
|
124 |
|
/* |
125 |
|
* gui_input_read: read keyboard chars |
126 |
|
*/ |
127 |
|
|
128 |
key = getch (); |
void |
129 |
if (key != ERR) |
gui_input_read () |
130 |
|
{ |
131 |
|
int key, i; |
132 |
|
char key_str[32]; |
133 |
|
|
134 |
|
i = 0; |
135 |
|
/* do not loop too much here (for example when big paste was made), |
136 |
|
to read also socket & co */ |
137 |
|
while (i < 8) |
138 |
{ |
{ |
139 |
switch (key) |
key = getch (); |
140 |
|
|
141 |
|
if (key == ERR) |
142 |
|
break; |
143 |
|
|
144 |
|
if (key == KEY_RESIZE) |
145 |
{ |
{ |
146 |
/* resize event */ |
gui_curses_resize_handler (); |
147 |
case KEY_RESIZE: |
continue; |
148 |
gui_curses_resize_handler (); |
} |
149 |
break; |
|
150 |
/* inactive function keys */ |
if (key < 32) |
151 |
case KEY_F(1): |
{ |
152 |
case KEY_F(2): |
key_str[0] = '^'; |
153 |
case KEY_F(3): |
key_str[1] = (char) key + '@'; |
154 |
case KEY_F(4): |
key_str[2] = '\0'; |
155 |
case KEY_F(9): |
} |
156 |
break; |
else if (key == 127) |
157 |
/* previous buffer in window */ |
{ |
158 |
case KEY_F(5): |
key_str[0] = '^'; |
159 |
gui_switch_to_previous_buffer (gui_current_window); |
key_str[1] = '?'; |
160 |
break; |
key_str[2] = '\0'; |
161 |
/* next buffer in window */ |
} |
162 |
case KEY_F(6): |
else |
163 |
gui_switch_to_next_buffer (gui_current_window); |
{ |
164 |
break; |
if (key > 0xff) |
165 |
/* previous window */ |
{ |
166 |
case KEY_F(7): |
key_str[0] = (char) (key >> 8); |
167 |
gui_switch_to_previous_window (gui_current_window); |
key_str[1] = (char) (key & 0xff); |
168 |
break; |
key_str[2] = '\0'; |
169 |
/* next window */ |
} |
170 |
case KEY_F(8): |
else |
171 |
gui_switch_to_next_window (gui_current_window); |
{ |
172 |
break; |
key_str[0] = (char) key; |
173 |
/* remove last infobar message */ |
key_str[1] = '\0'; |
174 |
case KEY_F(10): |
} |
|
gui_infobar_remove (); |
|
|
gui_draw_buffer_infobar (gui_current_window->buffer, 1); |
|
|
break; |
|
|
case KEY_F(11): |
|
|
gui_nick_move_page_up (gui_current_window); |
|
|
break; |
|
|
case KEY_F(12): |
|
|
gui_nick_move_page_down (gui_current_window); |
|
|
break; |
|
|
/* cursor up */ |
|
|
case KEY_UP: |
|
|
if (gui_current_window->buffer->dcc) |
|
|
{ |
|
|
if (dcc_list) |
|
|
{ |
|
|
if (gui_current_window->dcc_selected |
|
|
&& ((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc) |
|
|
{ |
|
|
if (gui_current_window->dcc_selected == |
|
|
gui_current_window->dcc_first) |
|
|
gui_current_window->dcc_first = |
|
|
((t_irc_dcc *)(gui_current_window->dcc_first))->prev_dcc; |
|
|
gui_current_window->dcc_selected = |
|
|
((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc; |
|
|
gui_draw_buffer_chat (gui_current_window->buffer, 1); |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 1); |
|
|
} |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (gui_current_window->buffer->ptr_history) |
|
|
{ |
|
|
gui_current_window->buffer->ptr_history = |
|
|
gui_current_window->buffer->ptr_history->next_history; |
|
|
if (!gui_current_window->buffer->ptr_history) |
|
|
gui_current_window->buffer->ptr_history = |
|
|
gui_current_window->buffer->history; |
|
|
} |
|
|
else |
|
|
gui_current_window->buffer->ptr_history = |
|
|
gui_current_window->buffer->history; |
|
|
if (gui_current_window->buffer->ptr_history) |
|
|
{ |
|
|
gui_current_window->buffer->input_buffer_size = |
|
|
strlen (gui_current_window->buffer->ptr_history->text); |
|
|
gui_optimize_input_buffer_size (gui_current_window->buffer); |
|
|
gui_current_window->buffer->input_buffer_pos = |
|
|
gui_current_window->buffer->input_buffer_size; |
|
|
strcpy (gui_current_window->buffer->input_buffer, |
|
|
gui_current_window->buffer->ptr_history->text); |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 0); |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* cursor down */ |
|
|
case KEY_DOWN: |
|
|
if (gui_current_window->buffer->dcc) |
|
|
{ |
|
|
if (dcc_list) |
|
|
{ |
|
|
if (!gui_current_window->dcc_selected |
|
|
|| ((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc) |
|
|
{ |
|
|
if (gui_current_window->dcc_last_displayed |
|
|
&& (gui_current_window->dcc_selected == |
|
|
gui_current_window->dcc_last_displayed)) |
|
|
{ |
|
|
if (gui_current_window->dcc_first) |
|
|
gui_current_window->dcc_first = |
|
|
((t_irc_dcc *)(gui_current_window->dcc_first))->next_dcc; |
|
|
else |
|
|
gui_current_window->dcc_first = |
|
|
dcc_list->next_dcc; |
|
|
} |
|
|
if (gui_current_window->dcc_selected) |
|
|
gui_current_window->dcc_selected = |
|
|
((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc; |
|
|
else |
|
|
gui_current_window->dcc_selected = |
|
|
dcc_list->next_dcc; |
|
|
gui_draw_buffer_chat (gui_current_window->buffer, 1); |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 1); |
|
|
} |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (gui_current_window->buffer->ptr_history) |
|
|
{ |
|
|
gui_current_window->buffer->ptr_history = |
|
|
gui_current_window->buffer->ptr_history->prev_history; |
|
|
if (gui_current_window->buffer->ptr_history) |
|
|
gui_current_window->buffer->input_buffer_size = |
|
|
strlen (gui_current_window->buffer->ptr_history->text); |
|
|
else |
|
|
gui_current_window->buffer->input_buffer_size = 0; |
|
|
gui_optimize_input_buffer_size (gui_current_window->buffer); |
|
|
gui_current_window->buffer->input_buffer_pos = |
|
|
gui_current_window->buffer->input_buffer_size; |
|
|
if (gui_current_window->buffer->ptr_history) |
|
|
strcpy (gui_current_window->buffer->input_buffer, |
|
|
gui_current_window->buffer->ptr_history->text); |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 0); |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* cursor left */ |
|
|
case KEY_LEFT: |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
{ |
|
|
if (gui_current_window->buffer->input_buffer_pos > 0) |
|
|
{ |
|
|
gui_current_window->buffer->input_buffer_pos--; |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 0); |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* cursor right */ |
|
|
case KEY_RIGHT: |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
{ |
|
|
if (gui_current_window->buffer->input_buffer_pos < |
|
|
gui_current_window->buffer->input_buffer_size) |
|
|
{ |
|
|
gui_current_window->buffer->input_buffer_pos++; |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 0); |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* home key or Control + A */ |
|
|
case KEY_HOME: |
|
|
case 0x01: |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
{ |
|
|
if (gui_current_window->buffer->input_buffer_pos > 0) |
|
|
{ |
|
|
gui_current_window->buffer->input_buffer_pos = 0; |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 0); |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* end key or Control + E */ |
|
|
case KEY_END: |
|
|
case 0x05: |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
{ |
|
|
if (gui_current_window->buffer->input_buffer_pos < |
|
|
gui_current_window->buffer->input_buffer_size) |
|
|
{ |
|
|
gui_current_window->buffer->input_buffer_pos = |
|
|
gui_current_window->buffer->input_buffer_size; |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 0); |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* page up */ |
|
|
case KEY_PPAGE: |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
gui_move_page_up (gui_current_window); |
|
|
break; |
|
|
/* page down */ |
|
|
case KEY_NPAGE: |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
gui_move_page_down (gui_current_window); |
|
|
break; |
|
|
/* erase before cursor and move cursor to the left */ |
|
|
case 127: |
|
|
case KEY_BACKSPACE: |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
{ |
|
|
if (gui_current_window->buffer->input_buffer_pos > 0) |
|
|
{ |
|
|
i = gui_current_window->buffer->input_buffer_pos-1; |
|
|
while (gui_current_window->buffer->input_buffer[i]) |
|
|
{ |
|
|
gui_current_window->buffer->input_buffer[i] = |
|
|
gui_current_window->buffer->input_buffer[i+1]; |
|
|
i++; |
|
|
} |
|
|
gui_current_window->buffer->input_buffer_size--; |
|
|
gui_current_window->buffer->input_buffer_pos--; |
|
|
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 0); |
|
|
gui_optimize_input_buffer_size (gui_current_window->buffer); |
|
|
gui_current_window->buffer->completion.position = -1; |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* Control + Backspace or Control + W */ |
|
|
case 0x08: |
|
|
case 0x17: |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
gui_delete_previous_word (gui_current_window->buffer); |
|
|
break; |
|
|
/* Control + L */ |
|
|
case 0x0C: |
|
|
gui_curses_resize_handler (); |
|
|
break; |
|
|
/* erase char under cursor */ |
|
|
case KEY_DC: |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
{ |
|
|
if (gui_current_window->buffer->input_buffer_pos < |
|
|
gui_current_window->buffer->input_buffer_size) |
|
|
{ |
|
|
i = gui_current_window->buffer->input_buffer_pos; |
|
|
while (gui_current_window->buffer->input_buffer[i]) |
|
|
{ |
|
|
gui_current_window->buffer->input_buffer[i] = |
|
|
gui_current_window->buffer->input_buffer[i+1]; |
|
|
i++; |
|
|
} |
|
|
gui_current_window->buffer->input_buffer_size--; |
|
|
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 0); |
|
|
gui_optimize_input_buffer_size (gui_current_window->buffer); |
|
|
gui_current_window->buffer->completion.position = -1; |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* Tab : completion */ |
|
|
case '\t': |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
{ |
|
|
completion_search (&(gui_current_window->buffer->completion), |
|
|
CHANNEL(gui_current_window->buffer), |
|
|
gui_current_window->buffer->input_buffer, |
|
|
gui_current_window->buffer->input_buffer_size, |
|
|
gui_current_window->buffer->input_buffer_pos); |
|
|
|
|
|
if (gui_current_window->buffer->completion.word_found) |
|
|
{ |
|
|
/* replace word with new completed word into input buffer */ |
|
|
if (gui_current_window->buffer->completion.diff_size > 0) |
|
|
{ |
|
|
gui_current_window->buffer->input_buffer_size += |
|
|
gui_current_window->buffer->completion.diff_size; |
|
|
gui_optimize_input_buffer_size (gui_current_window->buffer); |
|
|
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; |
|
|
for (i = gui_current_window->buffer->input_buffer_size - 1; |
|
|
i >= gui_current_window->buffer->completion.position_replace + |
|
|
(int)strlen (gui_current_window->buffer->completion.word_found); i--) |
|
|
gui_current_window->buffer->input_buffer[i] = |
|
|
gui_current_window->buffer->input_buffer[i - |
|
|
gui_current_window->buffer->completion.diff_size]; |
|
|
} |
|
|
else |
|
|
{ |
|
|
for (i = gui_current_window->buffer->completion.position_replace + |
|
|
strlen (gui_current_window->buffer->completion.word_found); |
|
|
i < gui_current_window->buffer->input_buffer_size; i++) |
|
|
gui_current_window->buffer->input_buffer[i] = |
|
|
gui_current_window->buffer->input_buffer[i - |
|
|
gui_current_window->buffer->completion.diff_size]; |
|
|
gui_current_window->buffer->input_buffer_size += |
|
|
gui_current_window->buffer->completion.diff_size; |
|
|
gui_optimize_input_buffer_size (gui_current_window->buffer); |
|
|
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; |
|
|
} |
|
|
|
|
|
strncpy (gui_current_window->buffer->input_buffer + gui_current_window->buffer->completion.position_replace, |
|
|
gui_current_window->buffer->completion.word_found, |
|
|
strlen (gui_current_window->buffer->completion.word_found)); |
|
|
gui_current_window->buffer->input_buffer_pos = |
|
|
gui_current_window->buffer->completion.position_replace + |
|
|
strlen (gui_current_window->buffer->completion.word_found); |
|
|
|
|
|
/* position is < 0 this means only one word was found to complete, |
|
|
so reinit to stop completion */ |
|
|
if (gui_current_window->buffer->completion.position >= 0) |
|
|
gui_current_window->buffer->completion.position = |
|
|
gui_current_window->buffer->input_buffer_pos; |
|
|
|
|
|
/* add space or completor to the end of completion, if needed */ |
|
|
if ((gui_current_window->buffer->completion.context == COMPLETION_COMMAND) |
|
|
|| (gui_current_window->buffer->completion.context == COMPLETION_COMMAND_ARG)) |
|
|
{ |
|
|
if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ') |
|
|
gui_buffer_insert_string (gui_current_window->buffer, |
|
|
" ", |
|
|
gui_current_window->buffer->input_buffer_pos); |
|
|
if (gui_current_window->buffer->completion.position >= 0) |
|
|
gui_current_window->buffer->completion.position++; |
|
|
gui_current_window->buffer->input_buffer_pos++; |
|
|
} |
|
|
else |
|
|
{ |
|
|
/* add nick completor if position 0 and completing nick */ |
|
|
if ((gui_current_window->buffer->completion.base_word_pos == 0) |
|
|
&& (gui_current_window->buffer->completion.context == COMPLETION_NICK)) |
|
|
{ |
|
|
if (strncmp (gui_current_window->buffer->input_buffer + gui_current_window->buffer->input_buffer_pos, |
|
|
cfg_look_completor, strlen (cfg_look_completor)) != 0) |
|
|
gui_buffer_insert_string (gui_current_window->buffer, |
|
|
cfg_look_completor, |
|
|
gui_current_window->buffer->input_buffer_pos); |
|
|
if (gui_current_window->buffer->completion.position >= 0) |
|
|
gui_current_window->buffer->completion.position += strlen (cfg_look_completor); |
|
|
gui_current_window->buffer->input_buffer_pos += strlen (cfg_look_completor); |
|
|
if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ') |
|
|
gui_buffer_insert_string (gui_current_window->buffer, |
|
|
" ", |
|
|
gui_current_window->buffer->input_buffer_pos); |
|
|
if (gui_current_window->buffer->completion.position >= 0) |
|
|
gui_current_window->buffer->completion.position++; |
|
|
gui_current_window->buffer->input_buffer_pos++; |
|
|
} |
|
|
} |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 0); |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* escape code (for control-key) */ |
|
|
case KEY_ESCAPE: |
|
|
if ((key = getch()) != ERR) |
|
|
{ |
|
|
/*gui_printf (gui_current_window->buffer, |
|
|
"[Debug] key pressed = %d, hex = %02X, octal = %o\n", key, key, key);*/ |
|
|
switch (key) |
|
|
{ |
|
|
/* Alt + left arrow */ |
|
|
case KEY_LEFT: |
|
|
gui_switch_to_previous_buffer (gui_current_window); |
|
|
break; |
|
|
/* Alt + right arrow */ |
|
|
case KEY_RIGHT: |
|
|
gui_switch_to_next_buffer (gui_current_window); |
|
|
break; |
|
|
/* Alt + home */ |
|
|
case KEY_HOME: |
|
|
gui_nick_move_beginning (gui_current_window); |
|
|
break; |
|
|
/* Alt + end */ |
|
|
case KEY_END: |
|
|
gui_nick_move_end (gui_current_window); |
|
|
break; |
|
|
/* Alt + page up */ |
|
|
case KEY_PPAGE: |
|
|
gui_nick_move_page_up (gui_current_window); |
|
|
break; |
|
|
/* Alt + page down */ |
|
|
case KEY_NPAGE: |
|
|
gui_nick_move_page_down (gui_current_window); |
|
|
break; |
|
|
case 79: |
|
|
/* TODO: replace 79 by constant name! */ |
|
|
if ((key = getch()) != ERR) |
|
|
{ |
|
|
switch (key) |
|
|
{ |
|
|
/* Control + Right */ |
|
|
case 99: |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
gui_move_next_word (gui_current_window->buffer); |
|
|
break; |
|
|
/* Control + Left */ |
|
|
case 100: |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
gui_move_previous_word (gui_current_window->buffer); |
|
|
break; |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* Alt-number: jump to window by number */ |
|
|
case 48: /* Alt-0 */ |
|
|
case 49: /* Alt-1 */ |
|
|
case 50: /* Alt-2 */ |
|
|
case 51: /* Alt-3 */ |
|
|
case 52: /* Alt-4 */ |
|
|
case 53: /* Alt-5 */ |
|
|
case 54: /* Alt-6 */ |
|
|
case 55: /* Alt-7 */ |
|
|
case 56: /* Alt-8 */ |
|
|
case 57: /* Alt-9 */ |
|
|
gui_switch_to_buffer_by_number (gui_current_window, (key == 48) ? 10 : key - 48); |
|
|
break; |
|
|
/* Alt-A: jump to buffer with activity */ |
|
|
case 'a': |
|
|
case 'A': |
|
|
if (hotlist) |
|
|
{ |
|
|
if (!hotlist_initial_buffer) |
|
|
hotlist_initial_buffer = gui_current_window->buffer; |
|
|
gui_switch_to_buffer (gui_current_window, hotlist->buffer); |
|
|
gui_redraw_buffer (gui_current_window->buffer); |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (hotlist_initial_buffer) |
|
|
{ |
|
|
gui_switch_to_buffer (gui_current_window, hotlist_initial_buffer); |
|
|
gui_redraw_buffer (gui_current_window->buffer); |
|
|
hotlist_initial_buffer = NULL; |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* Alt-D: jump to DCC buffer */ |
|
|
case 'd': |
|
|
case 'D': |
|
|
if (gui_current_window->buffer->dcc) |
|
|
{ |
|
|
if (buffer_before_dcc) |
|
|
{ |
|
|
gui_switch_to_buffer (gui_current_window, |
|
|
buffer_before_dcc); |
|
|
gui_redraw_buffer (gui_current_window->buffer); |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
buffer_before_dcc = gui_current_window->buffer; |
|
|
gui_switch_to_dcc_buffer (); |
|
|
} |
|
|
break; |
|
|
/* Alt-R: clear hotlist */ |
|
|
case 'r': |
|
|
case 'R': |
|
|
if (hotlist) |
|
|
{ |
|
|
hotlist_free_all (); |
|
|
gui_redraw_buffer (gui_current_window->buffer); |
|
|
} |
|
|
hotlist_initial_buffer = gui_current_window->buffer; |
|
|
break; |
|
|
/* Alt-S: jump to server buffer */ |
|
|
case 's': |
|
|
case 'S': |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
{ |
|
|
if (SERVER(gui_current_window->buffer)->buffer != |
|
|
gui_current_window->buffer) |
|
|
{ |
|
|
gui_switch_to_buffer (gui_current_window, |
|
|
SERVER(gui_current_window->buffer)->buffer); |
|
|
gui_redraw_buffer (gui_current_window->buffer); |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* Alt-X: jump to first channel/private of next server */ |
|
|
case 'x': |
|
|
case 'X': |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
{ |
|
|
ptr_server = SERVER(gui_current_window->buffer)->next_server; |
|
|
if (!ptr_server) |
|
|
ptr_server = irc_servers; |
|
|
while (ptr_server != SERVER(gui_current_window->buffer)) |
|
|
{ |
|
|
if (ptr_server->buffer) |
|
|
break; |
|
|
ptr_server = (ptr_server->next_server) ? |
|
|
ptr_server->next_server : irc_servers; |
|
|
} |
|
|
if (ptr_server != SERVER(gui_current_window->buffer)) |
|
|
{ |
|
|
ptr_buffer = (ptr_server->channels) ? |
|
|
ptr_server->channels->buffer : ptr_server->buffer; |
|
|
gui_switch_to_buffer (gui_current_window, ptr_buffer); |
|
|
gui_redraw_buffer (gui_current_window->buffer); |
|
|
} |
|
|
} |
|
|
break; |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* send command/message */ |
|
|
case '\n': |
|
|
if (!gui_current_window->buffer->dcc) |
|
|
{ |
|
|
if (gui_current_window->buffer->input_buffer_size > 0) |
|
|
{ |
|
|
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; |
|
|
history_add (gui_current_window->buffer, gui_current_window->buffer->input_buffer); |
|
|
gui_current_window->buffer->input_buffer_size = 0; |
|
|
gui_current_window->buffer->input_buffer_pos = 0; |
|
|
gui_current_window->buffer->input_buffer_1st_display = 0; |
|
|
gui_current_window->buffer->completion.position = -1; |
|
|
gui_current_window->buffer->ptr_history = NULL; |
|
|
ptr_buffer = gui_current_window->buffer; |
|
|
user_command (SERVER(gui_current_window->buffer), |
|
|
gui_current_window->buffer, |
|
|
gui_current_window->buffer->input_buffer); |
|
|
if (ptr_buffer == gui_current_window->buffer) |
|
|
{ |
|
|
ptr_buffer->input_buffer[0] = '\0'; |
|
|
gui_draw_buffer_input (ptr_buffer, 0); |
|
|
} |
|
|
} |
|
|
} |
|
|
break; |
|
|
/* other key => add to input buffer */ |
|
|
default: |
|
|
if (gui_current_window->buffer->dcc) |
|
|
{ |
|
|
dcc_selected = (gui_current_window->dcc_selected) ? |
|
|
(t_irc_dcc *) gui_current_window->dcc_selected : dcc_list; |
|
|
switch (key) |
|
|
{ |
|
|
/* accept DCC */ |
|
|
case 'a': |
|
|
case 'A': |
|
|
if (dcc_selected |
|
|
&& (DCC_IS_RECV(dcc_selected->status)) |
|
|
&& (dcc_selected->status == DCC_WAITING)) |
|
|
{ |
|
|
dcc_accept (dcc_selected); |
|
|
} |
|
|
break; |
|
|
/* cancel DCC */ |
|
|
case 'c': |
|
|
case 'C': |
|
|
if (dcc_selected |
|
|
&& (!DCC_ENDED(dcc_selected->status))) |
|
|
{ |
|
|
dcc_close (dcc_selected, DCC_ABORTED); |
|
|
gui_redraw_buffer (gui_current_window->buffer); |
|
|
} |
|
|
break; |
|
|
/* purge old DCC */ |
|
|
case 'p': |
|
|
case 'P': |
|
|
gui_current_window->dcc_selected = NULL; |
|
|
ptr_dcc = dcc_list; |
|
|
while (ptr_dcc) |
|
|
{ |
|
|
ptr_dcc_next = ptr_dcc->next_dcc; |
|
|
if (DCC_ENDED(ptr_dcc->status)) |
|
|
dcc_free (ptr_dcc); |
|
|
ptr_dcc = ptr_dcc_next; |
|
|
} |
|
|
gui_redraw_buffer (gui_current_window->buffer); |
|
|
break; |
|
|
/* close DCC window */ |
|
|
case 'q': |
|
|
case 'Q': |
|
|
if (buffer_before_dcc) |
|
|
{ |
|
|
gui_buffer_free (gui_current_window->buffer, 1); |
|
|
gui_switch_to_buffer (gui_current_window, |
|
|
buffer_before_dcc); |
|
|
} |
|
|
else |
|
|
gui_buffer_free (gui_current_window->buffer, 1); |
|
|
gui_redraw_buffer (gui_current_window->buffer); |
|
|
break; |
|
|
/* remove from DCC list */ |
|
|
case 'r': |
|
|
case 'R': |
|
|
if (dcc_selected |
|
|
&& (DCC_ENDED(dcc_selected->status))) |
|
|
{ |
|
|
if (dcc_selected->next_dcc) |
|
|
gui_current_window->dcc_selected = dcc_selected->next_dcc; |
|
|
else |
|
|
gui_current_window->dcc_selected = NULL; |
|
|
dcc_free (dcc_selected); |
|
|
gui_redraw_buffer (gui_current_window->buffer); |
|
|
} |
|
|
break; |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
/*gui_printf (gui_current_window->buffer, |
|
|
"[Debug] key pressed = %d, hex = %02X, octal = %o\n", key, key, key);*/ |
|
|
new_char[0] = key; |
|
|
new_char[1] = '\0'; |
|
|
decoded_string = NULL; |
|
|
|
|
|
/* UTF-8 input */ |
|
|
if (key == 0xC3) |
|
|
{ |
|
|
if ((key = getch()) != ERR) |
|
|
{ |
|
|
new_char[1] = key; |
|
|
new_char[2] = '\0'; |
|
|
decoded_string = weechat_convert_encoding (local_charset, cfg_look_charset_internal, new_char); |
|
|
} |
|
|
} |
|
|
|
|
|
gui_buffer_insert_string (gui_current_window->buffer, |
|
|
(decoded_string) ? decoded_string : new_char, |
|
|
gui_current_window->buffer->input_buffer_pos); |
|
|
gui_current_window->buffer->input_buffer_pos++; |
|
|
gui_draw_buffer_input (gui_current_window->buffer, 0); |
|
|
gui_current_window->buffer->completion.position = -1; |
|
|
|
|
|
if (decoded_string) |
|
|
free (decoded_string); |
|
|
} |
|
|
break; |
|
175 |
} |
} |
176 |
|
|
177 |
|
if (strcmp (key_str, "^") == 0) |
178 |
|
{ |
179 |
|
key_str[1] = '^'; |
180 |
|
key_str[2] = '\0'; |
181 |
|
} |
182 |
|
|
183 |
|
/*gui_printf (gui_current_window->buffer, "gui_input_read: key = %s (%d)\n", key_str, key);*/ |
184 |
|
|
185 |
|
if (gui_key_pressed (key_str) != 0) |
186 |
|
gui_input_insert_char (key); |
187 |
|
|
188 |
|
i++; |
189 |
} |
} |
190 |
} |
} |
191 |
|
|
225 |
{ |
{ |
226 |
old_sec = local_time->tm_sec; |
old_sec = local_time->tm_sec; |
227 |
|
|
228 |
|
if (cfg_look_infobar_seconds) |
229 |
|
{ |
230 |
|
gui_draw_buffer_infobar_time (gui_current_window->buffer); |
231 |
|
wmove (gui_current_window->win_input, |
232 |
|
0, gui_current_window->win_input_x); |
233 |
|
wrefresh (gui_current_window->win_input); |
234 |
|
} |
235 |
|
|
236 |
/* infobar count down */ |
/* infobar count down */ |
237 |
if (gui_infobar && gui_infobar->remaining_time > 0) |
if (gui_infobar && gui_infobar->remaining_time > 0) |
238 |
{ |
{ |
317 |
{ |
{ |
318 |
if (FD_ISSET (STDIN_FILENO, &read_fd)) |
if (FD_ISSET (STDIN_FILENO, &read_fd)) |
319 |
{ |
{ |
320 |
gui_read_keyb (); |
gui_input_read (); |
321 |
} |
} |
322 |
if ((weechat_fifo != -1) && (FD_ISSET (weechat_fifo, &read_fd))) |
if ((weechat_fifo != -1) && (FD_ISSET (weechat_fifo, &read_fd))) |
323 |
{ |
{ |