Mercurial > ~mikael > mcabber > hg
comparison mcabber/mcabber/screen.c @ 2143:2f294c2b6778
Add a backward completion (Oleg)
When we skip some needed item with tab, we can back with shift+tab.
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Sun, 06 Jul 2014 14:51:17 +0200 |
parents | 54548cf8f646 |
children | 1b3add57c912 |
comparison
equal
deleted
inserted
replaced
2142:0e8a25503ee1 | 2143:2f294c2b6778 |
---|---|
82 | 82 |
83 static inline void check_offset(int); | 83 static inline void check_offset(int); |
84 static void scr_cancel_current_completion(void); | 84 static void scr_cancel_current_completion(void); |
85 static void scr_end_current_completion(void); | 85 static void scr_end_current_completion(void); |
86 static void scr_insert_text(const char*); | 86 static void scr_insert_text(const char*); |
87 static void scr_handle_tab(void); | 87 static void scr_handle_tab(gboolean fwd); |
88 | 88 |
89 #if defined XEP0022 || defined XEP0085 | 89 #if defined XEP0022 || defined XEP0085 |
90 static gboolean scr_chatstates_timeout(); | 90 static gboolean scr_chatstates_timeout(); |
91 #endif | 91 #endif |
92 | 92 |
3671 scr_cancel_current_completion(); | 3671 scr_cancel_current_completion(); |
3672 scr_end_current_completion(); | 3672 scr_end_current_completion(); |
3673 check_offset(-1); | 3673 check_offset(-1); |
3674 } | 3674 } |
3675 | 3675 |
3676 void readline_do_completion(void) | 3676 void readline_do_completion(gboolean fwd) |
3677 { | 3677 { |
3678 int i, n; | 3678 int i, n; |
3679 | 3679 |
3680 if (multimode != 2) { | 3680 if (multimode != 2) { |
3681 // Not in verbatim multi-line mode | 3681 // Not in verbatim multi-line mode |
3682 scr_handle_tab(); | 3682 scr_handle_tab(fwd); |
3683 } else { | 3683 } else { |
3684 // Verbatim multi-line mode: expand tab | 3684 // Verbatim multi-line mode: expand tab |
3685 char tabstr[9]; | 3685 char tabstr[9]; |
3686 n = 8 - (ptr_inputline - inputLine) % 8; | 3686 n = 8 - (ptr_inputline - inputLine) % 8; |
3687 for (i = 0; i < n; i++) | 3687 for (i = 0; i < n; i++) |
3886 static void scr_cancel_current_completion(void); | 3886 static void scr_cancel_current_completion(void); |
3887 | 3887 |
3888 // scr_handle_tab() | 3888 // scr_handle_tab() |
3889 // Function called when tab is pressed. | 3889 // Function called when tab is pressed. |
3890 // Initiate or continue a completion... | 3890 // Initiate or continue a completion... |
3891 static void scr_handle_tab(void) | 3891 // If fwd is false, a backward-completion is requested. |
3892 static void scr_handle_tab(gboolean fwd) | |
3892 { | 3893 { |
3893 int nrow; | 3894 int nrow; |
3894 const char *row; | 3895 const char *row; |
3895 const char *cchar; | 3896 const char *cchar; |
3896 guint compl_categ; | 3897 guint compl_categ; |
3971 for (slp = list; slp; slp = g_slist_next(slp)) | 3972 for (slp = list; slp; slp = g_slist_next(slp)) |
3972 g_free(slp->data); | 3973 g_free(slp->data); |
3973 g_slist_free(list); | 3974 g_slist_free(list); |
3974 } | 3975 } |
3975 // Now complete | 3976 // Now complete |
3976 cchar = complete(); | 3977 cchar = complete(fwd); |
3977 if (cchar) | 3978 if (cchar) |
3978 scr_insert_text(cchar); | 3979 scr_insert_text(cchar); |
3979 completion_started = TRUE; | 3980 completion_started = TRUE; |
3980 } | 3981 } |
3981 } else { // Completion already initialized | 3982 } else { // Completion already initialized |
3982 scr_cancel_current_completion(); | 3983 scr_cancel_current_completion(); |
3983 // Now complete again | 3984 // Now complete again |
3984 cchar = complete(); | 3985 cchar = complete(fwd); |
3985 if (cchar) | 3986 if (cchar) |
3986 scr_insert_text(cchar); | 3987 scr_insert_text(cchar); |
3987 } | 3988 } |
3988 } | 3989 } |
3989 | 3990 |
4360 switch (key) { | 4361 switch (key) { |
4361 case 0: | 4362 case 0: |
4362 case ERR: | 4363 case ERR: |
4363 break; | 4364 break; |
4364 case 9: // Tab | 4365 case 9: // Tab |
4365 readline_do_completion(); | 4366 readline_do_completion(TRUE); // Forward-completion |
4367 break; | |
4368 case 353: // Shift-Tab | |
4369 readline_do_completion(FALSE); // Backward-completion | |
4366 break; | 4370 break; |
4367 case 13: // Enter | 4371 case 13: // Enter |
4368 case 343: // Enter on Maemo | 4372 case 343: // Enter on Maemo |
4369 if (readline_accept_line(FALSE) == 255) { | 4373 if (readline_accept_line(FALSE) == 255) { |
4370 mcabber_set_terminate_ui(); | 4374 mcabber_set_terminate_ui(); |
4421 return; | 4425 return; |
4422 } | 4426 } |
4423 } | 4427 } |
4424 } | 4428 } |
4425 | 4429 |
4426 if (completion_started && key != 9 && key != KEY_RESIZE) | 4430 if (completion_started && key != 9 && key != 353 && key != KEY_RESIZE) |
4427 scr_end_current_completion(); | 4431 scr_end_current_completion(); |
4428 refresh_inputline(); | 4432 refresh_inputline(); |
4429 | 4433 |
4430 if (!lock_chatstate) { | 4434 if (!lock_chatstate) { |
4431 // Set chat state to composing (1) if the user is currently composing, | 4435 // Set chat state to composing (1) if the user is currently composing, |