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,