/[weechat]/weechat/src/gui/curses/gui-input.c
ViewVC logotype

Diff of /weechat/src/gui/curses/gui-input.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.44 by flashcode, Tue May 31 07:55:17 2005 UTC revision 1.45 by flashcode, Sat Jul 9 15:30:51 2005 UTC
# Line 41  Line 41 
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    
# Line 723  gui_main_loop () Line 225  gui_main_loop ()
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              {              {
# Line 807  gui_main_loop () Line 317  gui_main_loop ()
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              {              {

Legend:
Removed from v.1.44  
changed lines
  Added in v.1.45

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26