/[weechat]/weechat/src/gui/gui-common.c
ViewVC logotype

Diff of /weechat/src/gui/gui-common.c

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

revision 1.55 by flashcode, Thu Sep 15 13:07:52 2005 UTC revision 1.56 by flashcode, Fri Oct 21 13:59:55 2005 UTC
# Line 39  Line 39 
39  #include "../common/history.h"  #include "../common/history.h"
40  #include "../common/hotlist.h"  #include "../common/hotlist.h"
41  #include "../common/log.h"  #include "../common/log.h"
42    #include "../common/utf8.h"
43  #include "../irc/irc.h"  #include "../irc/irc.h"
44    
45    
# Line 214  gui_buffer_new (t_gui_window *window, vo Line 215  gui_buffer_new (t_gui_window *window, vo
215          else          else
216              new_buffer->input_buffer = NULL;              new_buffer->input_buffer = NULL;
217          new_buffer->input_buffer_size = 0;          new_buffer->input_buffer_size = 0;
218            new_buffer->input_buffer_length = 0;
219          new_buffer->input_buffer_pos = 0;          new_buffer->input_buffer_pos = 0;
220          new_buffer->input_buffer_1st_display = 0;          new_buffer->input_buffer_1st_display = 0;
221                    
# Line 324  gui_infobar_printf (int time_displayed, Line 326  gui_infobar_printf (int time_displayed,
326      vsnprintf (buffer, sizeof (buffer) - 1, message, argptr);      vsnprintf (buffer, sizeof (buffer) - 1, message, argptr);
327      va_end (argptr);      va_end (argptr);
328            
329      buf2 = weechat_convert_encoding (cfg_look_charset_decode,      buf2 = weechat_convert_encoding ((local_utf8) ?
330                                         cfg_look_charset_decode_iso : cfg_look_charset_decode_utf,
331                                       (cfg_look_charset_internal && cfg_look_charset_internal[0]) ?                                       (cfg_look_charset_internal && cfg_look_charset_internal[0]) ?
332                                       cfg_look_charset_internal : local_charset,                                       cfg_look_charset_internal : local_charset,
333                                       buffer);                                       buffer);
# Line 605  gui_input_optimize_buffer_size (t_gui_bu Line 608  gui_input_optimize_buffer_size (t_gui_bu
608  }  }
609    
610  /*  /*
611   * gui_input_clipboard_copy: copy string into clipboard   * gui_input_action_dcc: execute an action on a DCC after a user input
612   */   */
613    
614  void  void
615  gui_input_clipboard_copy (char *buffer, int size)  gui_input_action_dcc (t_gui_window *window, char action)
616  {  {
617      if (size <= 0)      t_irc_dcc *dcc_selected, *ptr_dcc, *ptr_dcc_next;
         return;  
       
     if (gui_input_clipboard != NULL)  
         free(gui_input_clipboard);  
618            
619      gui_input_clipboard = (char *) malloc( (size + 1) * sizeof(*gui_input_clipboard));      dcc_selected = (window->dcc_selected) ?
620            (t_irc_dcc *) window->dcc_selected : dcc_list;
621            
622      if (gui_input_clipboard)      switch (action)
623      {      {
624          memcpy(gui_input_clipboard, buffer, size);          /* accept DCC */
625          gui_input_clipboard[size] = '\0';          case 'a':
626      }          case 'A':
627  }              if (dcc_selected
628                    && (DCC_IS_RECV(dcc_selected->status))
629  /*                  && (dcc_selected->status == DCC_WAITING))
630   * gui_input_clipboard_paste: paste clipboard at cursor pos in input line              {
631   */                  dcc_accept (dcc_selected);
632                }
633  void              break;
634  gui_input_clipboard_paste (t_gui_window *window)          /* cancel DCC */
635  {          case 'c':
636      if (window->buffer->has_input && gui_input_clipboard)          case 'C':
637      {              if (dcc_selected
638          gui_input_insert_string (window, gui_input_clipboard, window->buffer->input_buffer_pos);                  && (!DCC_ENDED(dcc_selected->status)))
639          window->buffer->input_buffer_pos += strlen (gui_input_clipboard);              {
640          gui_draw_buffer_input (window->buffer, 0);                  dcc_close (dcc_selected, DCC_ABORTED);
641          window->buffer->completion.position = -1;                  gui_redraw_buffer (window->buffer);
642                }
643                break;
644            /* purge old DCC */
645            case 'p':
646            case 'P':
647                window->dcc_selected = NULL;
648                ptr_dcc = dcc_list;
649                while (ptr_dcc)
650                {
651                    ptr_dcc_next = ptr_dcc->next_dcc;
652                    if (DCC_ENDED(ptr_dcc->status))
653                        dcc_free (ptr_dcc);
654                    ptr_dcc = ptr_dcc_next;
655                }
656                gui_redraw_buffer (window->buffer);
657                break;
658            /* close DCC window */
659            case 'q':
660            case 'Q':
661                if (buffer_before_dcc)
662                {
663                    gui_buffer_free (window->buffer, 1);
664                    gui_switch_to_buffer (window, buffer_before_dcc);
665                }
666                else
667                    gui_buffer_free (window->buffer, 1);
668                gui_redraw_buffer (window->buffer);
669                break;
670            /* remove from DCC list */
671            case 'r':
672            case 'R':
673                if (dcc_selected
674                    && (DCC_ENDED(dcc_selected->status)))
675                {
676                    if (dcc_selected->next_dcc)
677                        window->dcc_selected = dcc_selected->next_dcc;
678                    else
679                        window->dcc_selected = NULL;
680                    dcc_free (dcc_selected);
681                    gui_redraw_buffer (window->buffer);
682                }
683                break;
684      }      }
685  }  }
686    
687  /*  /*
688   * gui_input_insert_string: insert a string into the input buffer   * gui_input_insert_string: insert a string into the input buffer
689   *                          if pos == -1, string is inserted at cursor position   *                          if pos == -1, string is inserted at cursor position
690     *                          return: number of chars inserted
691     *                          (may be different of strlen if UTF-8 string)
692   */   */
693    
694  void  int
695  gui_input_insert_string (t_gui_window *window, char *string, int pos)  gui_input_insert_string (t_gui_window *window, char *string, int pos)
696  {  {
697      int i, start, end, length;      int size, length;
698        char *ptr_start;
699            
700      if (window->buffer->has_input)      if (window->buffer->dcc)
701        {
702            while (string[0])
703            {
704                if (string[0] >= 32)
705                    gui_input_action_dcc (window, string[0]);
706                string = utf8_next_char (string);
707            }
708        }
709        else if (window->buffer->has_input)
710      {      {
711          if (pos == -1)          if (pos == -1)
712              pos = window->buffer->input_buffer_pos;              pos = window->buffer->input_buffer_pos;
713                    
714          length = strlen (string);          size = strlen (string);
715            length = utf8_strlen (string);
716                    
717          /* increase buffer size */          /* increase buffer size */
718          window->buffer->input_buffer_size += length;          window->buffer->input_buffer_size += size;
719            window->buffer->input_buffer_length += length;
720          gui_input_optimize_buffer_size (window->buffer);          gui_input_optimize_buffer_size (window->buffer);
721          window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';          window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
722                    
723          /* move end of string to the right */          /* move end of string to the right */
724          start = pos + length;          ptr_start = utf8_add_offset (window->buffer->input_buffer, pos);
725          end = window->buffer->input_buffer_size - 1;          memmove (ptr_start + size, ptr_start, strlen (ptr_start));
         for (i = end; i >= start; i--)  
             window->buffer->input_buffer[i] =  
                 window->buffer->input_buffer[i - length];  
726                    
727          /* insert new string */          /* insert new string */
728          strncpy (window->buffer->input_buffer + pos, string, length);          strncpy (utf8_add_offset (window->buffer->input_buffer, pos), string, size);
729            return length;
730      }      }
731        return 0;
732  }  }
733    
734  /*  /*
735   * gui_input_insert_char: insert a char into input buffer   * gui_input_clipboard_copy: copy string into clipboard
736   */   */
737    
738  void  void
739  gui_input_insert_char (t_gui_window *window, int key)  gui_input_clipboard_copy (char *buffer, int size)
740  {  {
741      char new_char[3];      if (size <= 0)
     t_irc_dcc *dcc_selected, *ptr_dcc, *ptr_dcc_next;  
       
     if (key < 32)  
742          return;          return;
743            
744      if (window->buffer->dcc)      if (gui_input_clipboard != NULL)
745            free (gui_input_clipboard);
746        
747        gui_input_clipboard = (char *) malloc( (size + 1) * sizeof(*gui_input_clipboard));
748        
749        if (gui_input_clipboard)
750      {      {
751          dcc_selected = (window->dcc_selected) ?          memcpy (gui_input_clipboard, buffer, size);
752              (t_irc_dcc *) window->dcc_selected : dcc_list;          gui_input_clipboard[size] = '\0';
         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 (window->buffer);  
                 }  
                 break;  
             /* purge old DCC */  
             case 'p':  
             case 'P':  
                 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 (window->buffer);  
                 break;  
             /* close DCC window */  
             case 'q':  
             case 'Q':  
                 if (buffer_before_dcc)  
                 {  
                     gui_buffer_free (window->buffer, 1);  
                     gui_switch_to_buffer (window, buffer_before_dcc);  
                 }  
                 else  
                     gui_buffer_free (window->buffer, 1);  
                 gui_redraw_buffer (window->buffer);  
                 break;  
             /* remove from DCC list */  
             case 'r':  
             case 'R':  
                 if (dcc_selected  
                     && (DCC_ENDED(dcc_selected->status)))  
                 {  
                     if (dcc_selected->next_dcc)  
                         window->dcc_selected = dcc_selected->next_dcc;  
                     else  
                         window->dcc_selected = NULL;  
                     dcc_free (dcc_selected);  
                     gui_redraw_buffer (window->buffer);  
                 }  
                 break;  
         }  
753      }      }
754      else if (window->buffer->has_input)  }
755    
756    /*
757     * gui_input_clipboard_paste: paste clipboard at cursor pos in input line
758     */
759    
760    void
761    gui_input_clipboard_paste (t_gui_window *window)
762    {
763        if (window->buffer->has_input && gui_input_clipboard)
764      {      {
765          /*gui_printf (window->buffer,          gui_input_insert_string (window, gui_input_clipboard, -1);
766            "[Debug] key pressed = %d, hex = %02X, octal = %o\n", key, key, key);*/          window->buffer->input_buffer_pos += utf8_strlen (gui_input_clipboard);
         new_char[0] = key;  
         new_char[1] = '\0';  
           
         gui_input_insert_string (window, new_char,  
                                  window->buffer->input_buffer_pos);  
         window->buffer->input_buffer_pos++;  
767          gui_draw_buffer_input (window->buffer, 0);          gui_draw_buffer_input (window->buffer, 0);
768          window->buffer->completion.position = -1;          window->buffer->completion.position = -1;
769      }      }
# Line 788  gui_input_return (t_gui_window *window) Line 785  gui_input_return (t_gui_window *window)
785              window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';              window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
786              history_add (window->buffer, window->buffer->input_buffer);              history_add (window->buffer, window->buffer->input_buffer);
787              window->buffer->input_buffer_size = 0;              window->buffer->input_buffer_size = 0;
788                window->buffer->input_buffer_length = 0;
789              window->buffer->input_buffer_pos = 0;              window->buffer->input_buffer_pos = 0;
790              window->buffer->input_buffer_1st_display = 0;              window->buffer->input_buffer_1st_display = 0;
791              window->buffer->completion.position = -1;              window->buffer->completion.position = -1;
# Line 820  gui_input_tab (t_gui_window *window) Line 818  gui_input_tab (t_gui_window *window)
818                             CHANNEL(window->buffer),                             CHANNEL(window->buffer),
819                             window->buffer->input_buffer,                             window->buffer->input_buffer,
820                             window->buffer->input_buffer_size,                             window->buffer->input_buffer_size,
821                             window->buffer->input_buffer_pos);                             utf8_real_pos (window->buffer->input_buffer,
822                                              window->buffer->input_buffer_pos));
823                    
824          if (window->buffer->completion.word_found)          if (window->buffer->completion.word_found)
825          {          {
# Line 829  gui_input_tab (t_gui_window *window) Line 828  gui_input_tab (t_gui_window *window)
828              {              {
829                  window->buffer->input_buffer_size +=                  window->buffer->input_buffer_size +=
830                      window->buffer->completion.diff_size;                      window->buffer->completion.diff_size;
831                    window->buffer->input_buffer_length +=
832                        window->buffer->completion.diff_length;
833                  gui_input_optimize_buffer_size (window->buffer);                  gui_input_optimize_buffer_size (window->buffer);
834                  window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';                  window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
835                  for (i = window->buffer->input_buffer_size - 1;                  for (i = window->buffer->input_buffer_size - 1;
# Line 846  gui_input_tab (t_gui_window *window) Line 847  gui_input_tab (t_gui_window *window)
847                          window->buffer->input_buffer[i - window->buffer->completion.diff_size];                          window->buffer->input_buffer[i - window->buffer->completion.diff_size];
848                  window->buffer->input_buffer_size +=                  window->buffer->input_buffer_size +=
849                      window->buffer->completion.diff_size;                      window->buffer->completion.diff_size;
850                    window->buffer->input_buffer_length +=
851                        window->buffer->completion.diff_length;
852                  gui_input_optimize_buffer_size (window->buffer);                  gui_input_optimize_buffer_size (window->buffer);
853                  window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';                  window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
854              }              }
855                                        
856              strncpy (window->buffer->input_buffer + window->buffer->completion.position_replace,              strncpy (window->buffer->input_buffer + window->buffer->completion.position_replace,
857                       window->buffer->completion.word_found,                       window->buffer->completion.word_found,
858                       strlen (window->buffer->completion.word_found));                       strlen (window->buffer->completion.word_found));
859              window->buffer->input_buffer_pos =              window->buffer->input_buffer_pos =
860                  window->buffer->completion.position_replace +                  utf8_pos (window->buffer->input_buffer,
861                  strlen (window->buffer->completion.word_found);                            window->buffer->completion.position_replace) +
862                    utf8_strlen (window->buffer->completion.word_found);
863                                                    
864              /* position is < 0 this means only one word was found to complete,              /* position is < 0 this means only one word was found to complete,
865                 so reinit to stop completion */                 so reinit to stop completion */
866              if (window->buffer->completion.position >= 0)              if (window->buffer->completion.position >= 0)
867                  window->buffer->completion.position =                  window->buffer->completion.position =
868                      window->buffer->input_buffer_pos;                      utf8_real_pos (window->buffer->input_buffer,
869                                       window->buffer->input_buffer_pos);
870                                                    
871              /* add space or completor to the end of completion, if needed */              /* add space or completor to the end of completion, if needed */
872              if ((window->buffer->completion.context == COMPLETION_COMMAND)              if ((window->buffer->completion.context == COMPLETION_COMMAND)
873                  || (window->buffer->completion.context == COMPLETION_COMMAND_ARG))                  || (window->buffer->completion.context == COMPLETION_COMMAND_ARG))
874              {              {
875                  if (window->buffer->input_buffer[window->buffer->input_buffer_pos] != ' ')                  if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer,
876                                                                    window->buffer->input_buffer_pos)] != ' ')
877                      gui_input_insert_string (window, " ",                      gui_input_insert_string (window, " ",
878                                               window->buffer->input_buffer_pos);                                               window->buffer->input_buffer_pos);
879                  if (window->buffer->completion.position >= 0)                  if (window->buffer->completion.position >= 0)
# Line 880  gui_input_tab (t_gui_window *window) Line 886  gui_input_tab (t_gui_window *window)
886                  if ((window->buffer->completion.base_word_pos == 0)                  if ((window->buffer->completion.base_word_pos == 0)
887                      && (window->buffer->completion.context == COMPLETION_NICK))                      && (window->buffer->completion.context == COMPLETION_NICK))
888                  {                  {
889                      if (strncmp (window->buffer->input_buffer + window->buffer->input_buffer_pos,                      if (strncmp (utf8_add_offset (window->buffer->input_buffer,
890                                                      window->buffer->input_buffer_pos),
891                                   cfg_look_completor, strlen (cfg_look_completor)) != 0)                                   cfg_look_completor, strlen (cfg_look_completor)) != 0)
892                          gui_input_insert_string (window, cfg_look_completor,                          gui_input_insert_string (window, cfg_look_completor,
893                                                   window->buffer->input_buffer_pos);                                                   window->buffer->input_buffer_pos);
894                      if (window->buffer->completion.position >= 0)                      if (window->buffer->completion.position >= 0)
895                          window->buffer->completion.position += strlen (cfg_look_completor);                          window->buffer->completion.position += strlen (cfg_look_completor);
896                      window->buffer->input_buffer_pos += strlen (cfg_look_completor);                      window->buffer->input_buffer_pos += utf8_strlen (cfg_look_completor);
897                      if (window->buffer->input_buffer[window->buffer->input_buffer_pos] != ' ')                      if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer,
898                                                                        window->buffer->input_buffer_pos)] != ' ')
899                          gui_input_insert_string (window, " ",                          gui_input_insert_string (window, " ",
900                                                   window->buffer->input_buffer_pos);                                                   window->buffer->input_buffer_pos);
901                      if (window->buffer->completion.position >= 0)                      if (window->buffer->completion.position >= 0)
# Line 907  gui_input_tab (t_gui_window *window) Line 915  gui_input_tab (t_gui_window *window)
915  void  void
916  gui_input_backspace (t_gui_window *window)  gui_input_backspace (t_gui_window *window)
917  {  {
918      int i;      char *pos, *pos_last;
919        int char_size, size_to_move;
920    
921      if (window->buffer->has_input)      if (window->buffer->has_input)
922      {      {
923          if (window->buffer->input_buffer_pos > 0)          if (window->buffer->input_buffer_pos > 0)
924          {          {
925              i = window->buffer->input_buffer_pos-1;              pos = utf8_add_offset (window->buffer->input_buffer,
926              while (window->buffer->input_buffer[i])                                     window->buffer->input_buffer_pos);
927              {              pos_last = utf8_prev_char (window->buffer->input_buffer, pos);
928                  window->buffer->input_buffer[i] =              char_size = pos - pos_last;
929                      window->buffer->input_buffer[i+1];              size_to_move = strlen (pos);
930                  i++;              memmove (pos_last, pos, size_to_move);
931              }              window->buffer->input_buffer_size -= char_size;
932              window->buffer->input_buffer_size--;              window->buffer->input_buffer_length--;
933              window->buffer->input_buffer_pos--;              window->buffer->input_buffer_pos--;
934              window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';              window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
             gui_draw_buffer_input (window->buffer, 0);  
935              gui_input_optimize_buffer_size (window->buffer);              gui_input_optimize_buffer_size (window->buffer);
936                gui_draw_buffer_input (window->buffer, 0);
937              window->buffer->completion.position = -1;              window->buffer->completion.position = -1;
938          }          }
939      }      }
# Line 937  gui_input_backspace (t_gui_window *windo Line 946  gui_input_backspace (t_gui_window *windo
946  void  void
947  gui_input_delete (t_gui_window *window)  gui_input_delete (t_gui_window *window)
948  {  {
949      int i;      char *pos, *pos_next;
950        int char_size, size_to_move;
951        
952      if (window->buffer->has_input)      if (window->buffer->has_input)
953      {      {
954          if (window->buffer->input_buffer_pos <          if (window->buffer->input_buffer_pos <
955              window->buffer->input_buffer_size)              window->buffer->input_buffer_length)
956          {          {
957              i = window->buffer->input_buffer_pos;              pos = utf8_add_offset (window->buffer->input_buffer,
958              while (window->buffer->input_buffer[i])                                     window->buffer->input_buffer_pos);
959              {              pos_next = utf8_next_char (pos);
960                  window->buffer->input_buffer[i] =              char_size = pos_next - pos;
961                      window->buffer->input_buffer[i+1];              size_to_move = strlen (pos_next);
962                  i++;              memmove (pos, pos_next, size_to_move);
963              }              window->buffer->input_buffer_size -= char_size;
964              window->buffer->input_buffer_size--;              window->buffer->input_buffer_length--;
965              window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';              window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
             gui_draw_buffer_input (window->buffer, 0);  
966              gui_input_optimize_buffer_size (window->buffer);              gui_input_optimize_buffer_size (window->buffer);
967                gui_draw_buffer_input (window->buffer, 0);
968              window->buffer->completion.position = -1;              window->buffer->completion.position = -1;
969          }          }
970      }      }
# Line 967  gui_input_delete (t_gui_window *window) Line 977  gui_input_delete (t_gui_window *window)
977  void  void
978  gui_input_delete_previous_word (t_gui_window *window)  gui_input_delete_previous_word (t_gui_window *window)
979  {  {
980      int i, j, num_char_deleted, num_char_end;      int length_deleted, size_deleted;
981        char *start, *string;
982            
983      if (window->buffer->has_input)      if (window->buffer->has_input)
984      {      {
985          if (window->buffer->input_buffer_pos > 0)          if (window->buffer->input_buffer_pos > 0)
986          {          {
987              i = window->buffer->input_buffer_pos - 1;              start = utf8_add_offset (window->buffer->input_buffer,
988              while ((i >= 0) &&                                        window->buffer->input_buffer_pos - 1);
989                     (window->buffer->input_buffer[i] == ' '))              string = start;
990                  i--;              while (string && (string[0] == ' '))
991              if (i >= 0)              {
992              {                  string = utf8_prev_char (window->buffer->input_buffer, string);
993                  while ((i >= 0) &&              }
994                         (window->buffer->input_buffer[i] != ' '))              if (string)
995                      i--;              {
996                  if (i >= 0)                  while (string && (string[0] != ' '))
997                  {                  {
998                      while ((i >= 0) &&                      string = utf8_prev_char (window->buffer->input_buffer, string);
999                             (window->buffer->input_buffer[i] == ' '))                  }
1000                          i--;                  if (string)
1001                    {
1002                        while (string && (string[0] == ' '))
1003                        {
1004                            string = utf8_prev_char (window->buffer->input_buffer, string);
1005                        }
1006                  }                  }
1007              }              }
1008                            
1009              if (i >= 0)              if (string)
1010                  i++;                  string = utf8_next_char (utf8_next_char (string));
1011              i++;              else
1012              num_char_deleted = window->buffer->input_buffer_pos - i;                  string = window->buffer->input_buffer;
1013              num_char_end = window->buffer->input_buffer_size -              
1014                  window->buffer->input_buffer_pos;              size_deleted = utf8_next_char (start) - string;
1015                length_deleted = utf8_strnlen (string, size_deleted);
1016                            
1017              gui_input_clipboard_copy(window->buffer->input_buffer +              gui_input_clipboard_copy (string, size_deleted);
                                      window->buffer->input_buffer_pos - num_char_deleted,  
                                      num_char_deleted);  
1018                            
1019              for (j = 0; j < num_char_end; j++)              memmove (string, string + size_deleted, size_deleted);
                 window->buffer->input_buffer[i + j] =  
                     window->buffer->input_buffer[window->buffer->input_buffer_pos + j];  
1020                            
1021              window->buffer->input_buffer_size -= num_char_deleted;              window->buffer->input_buffer_size -= size_deleted;
1022                window->buffer->input_buffer_length -= length_deleted;
1023              window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';              window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
1024              window->buffer->input_buffer_pos = i;              window->buffer->input_buffer_pos -= length_deleted;
             gui_draw_buffer_input (window->buffer, 0);  
1025              gui_input_optimize_buffer_size (window->buffer);              gui_input_optimize_buffer_size (window->buffer);
1026                gui_draw_buffer_input (window->buffer, 0);
1027              window->buffer->completion.position = -1;              window->buffer->completion.position = -1;
1028          }          }
1029      }      }
# Line 1022  gui_input_delete_previous_word (t_gui_wi Line 1036  gui_input_delete_previous_word (t_gui_wi
1036  void  void
1037  gui_input_delete_next_word (t_gui_window *window)  gui_input_delete_next_word (t_gui_window *window)
1038  {  {
1039      int i, j, num_char_deleted;      int size_deleted, length_deleted;
1040        char *start, *string;
1041            
1042      if (window->buffer->has_input)      if (window->buffer->has_input)
1043      {      {
1044          i = window->buffer->input_buffer_pos;          start = utf8_add_offset (window->buffer->input_buffer,
1045          while (i < window->buffer->input_buffer_size)                                   window->buffer->input_buffer_pos);
1046            string = start;
1047            length_deleted = 0;
1048            while (string[0])
1049          {          {
1050              if ((window->buffer->input_buffer[i] == ' ')              if ((string[0] == ' ') && (string > start))
                 && i != window->buffer->input_buffer_pos)  
1051                  break;                  break;
1052              i++;              string = utf8_next_char (string);
1053                length_deleted++;
1054          }          }
1055          num_char_deleted = i - window->buffer->input_buffer_pos;          size_deleted = string - start;
1056                    
1057          gui_input_clipboard_copy(window->buffer->input_buffer +          gui_input_clipboard_copy(start, size_deleted);
                                  window->buffer->input_buffer_pos, num_char_deleted);  
1058                    
1059          for (j = i; j < window->buffer->input_buffer_size; j++)          memmove (start, string, strlen (string));
             window->buffer->input_buffer[j - num_char_deleted] =  
                 window->buffer->input_buffer[j];  
1060                    
1061          window->buffer->input_buffer_size -= num_char_deleted;          window->buffer->input_buffer_size -= size_deleted;
1062            window->buffer->input_buffer_length -= length_deleted;
1063          window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';          window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
         gui_draw_buffer_input (window->buffer, 0);  
1064          gui_input_optimize_buffer_size (window->buffer);          gui_input_optimize_buffer_size (window->buffer);
1065            gui_draw_buffer_input (window->buffer, 0);
1066          window->buffer->completion.position = -1;          window->buffer->completion.position = -1;
1067      }      }
1068  }  }
# Line 1058  gui_input_delete_next_word (t_gui_window Line 1074  gui_input_delete_next_word (t_gui_window
1074  void  void
1075  gui_input_delete_begin_of_line (t_gui_window *window)  gui_input_delete_begin_of_line (t_gui_window *window)
1076  {  {
1077      int i;      int length_deleted, size_deleted;
1078        char *start;
1079            
1080      if (window->buffer->has_input)      if (window->buffer->has_input)
1081      {      {
1082          if (window->buffer->input_buffer_pos > 0)          if (window->buffer->input_buffer_pos > 0)
1083          {          {
1084                start = utf8_add_offset (window->buffer->input_buffer,
1085                                         window->buffer->input_buffer_pos);
1086                size_deleted = start - window->buffer->input_buffer;
1087                length_deleted = utf8_strnlen (window->buffer->input_buffer, size_deleted);
1088              gui_input_clipboard_copy (window->buffer->input_buffer,              gui_input_clipboard_copy (window->buffer->input_buffer,
1089                                        window->buffer->input_buffer_pos);                                        start - window->buffer->input_buffer);
1090                            
1091              for (i = window->buffer->input_buffer_pos;              memmove (window->buffer->input_buffer, start, strlen (start));
                  i < window->buffer->input_buffer_size; i++)  
                 window->buffer->input_buffer[i - window->buffer->input_buffer_pos] =  
                     window->buffer->input_buffer[i];  
1092                            
1093              window->buffer->input_buffer_size -=              window->buffer->input_buffer_size -= size_deleted;
1094                  window->buffer->input_buffer_pos;              window->buffer->input_buffer_length -= length_deleted;
1095              window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';              window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
1096              window->buffer->input_buffer_pos = 0;              window->buffer->input_buffer_pos = 0;
             gui_draw_buffer_input (window->buffer, 0);  
1097              gui_input_optimize_buffer_size (window->buffer);              gui_input_optimize_buffer_size (window->buffer);
1098                gui_draw_buffer_input (window->buffer, 0);
1099              window->buffer->completion.position = -1;              window->buffer->completion.position = -1;
1100          }          }
1101      }      }
# Line 1090  gui_input_delete_begin_of_line (t_gui_wi Line 1108  gui_input_delete_begin_of_line (t_gui_wi
1108  void  void
1109  gui_input_delete_end_of_line (t_gui_window *window)  gui_input_delete_end_of_line (t_gui_window *window)
1110  {  {
1111        char *start;
1112        int size_deleted, length_deleted;
1113        
1114      if (window->buffer->has_input)      if (window->buffer->has_input)
1115      {      {
1116          gui_input_clipboard_copy(window->buffer->input_buffer +          start = utf8_add_offset (window->buffer->input_buffer,
                                  window->buffer->input_buffer_pos,  
                                  window->buffer->input_buffer_size -  
1117                                   window->buffer->input_buffer_pos);                                   window->buffer->input_buffer_pos);
1118          window->buffer->input_buffer[window->buffer->input_buffer_pos] = ' ';          size_deleted = strlen (start);
1119          window->buffer->input_buffer_size = window->buffer->input_buffer_pos ;          length_deleted = utf8_strlen (start);
1120          window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';          gui_input_clipboard_copy(start, size_deleted);
1121          gui_draw_buffer_input (window->buffer, 0);          start[0] = '\0';
1122            window->buffer->input_buffer_size = strlen (window->buffer->input_buffer);
1123            window->buffer->input_buffer_length = utf8_strlen (window->buffer->input_buffer);
1124          gui_input_optimize_buffer_size (window->buffer);          gui_input_optimize_buffer_size (window->buffer);
1125            gui_draw_buffer_input (window->buffer, 0);
1126          window->buffer->completion.position = -1;          window->buffer->completion.position = -1;
1127      }      }
1128  }  }
# Line 1116  gui_input_delete_line (t_gui_window *win Line 1138  gui_input_delete_line (t_gui_window *win
1138      {      {
1139          window->buffer->input_buffer[0] = '\0';          window->buffer->input_buffer[0] = '\0';
1140          window->buffer->input_buffer_size = 0;          window->buffer->input_buffer_size = 0;
1141            window->buffer->input_buffer_length = 0;
1142          window->buffer->input_buffer_pos = 0;          window->buffer->input_buffer_pos = 0;
         gui_draw_buffer_input (window->buffer, 0);  
1143          gui_input_optimize_buffer_size (window->buffer);          gui_input_optimize_buffer_size (window->buffer);
1144            gui_draw_buffer_input (window->buffer, 0);
1145          window->buffer->completion.position = -1;          window->buffer->completion.position = -1;
1146      }      }
1147  }  }
# Line 1130  gui_input_delete_line (t_gui_window *win Line 1153  gui_input_delete_line (t_gui_window *win
1153  void  void
1154  gui_input_transpose_chars (t_gui_window *window)  gui_input_transpose_chars (t_gui_window *window)
1155  {  {
1156      char buf;      char *start, *prev_char, saved_char[4];
1157      int curpos;      int size_current_char;
1158            
1159      if (window->buffer->has_input)      if (window->buffer->has_input)
1160      {      {
1161          if (window->buffer->input_buffer_pos > 0)          if (window->buffer->input_buffer_pos > 0)
1162          {          {
1163              curpos = window->buffer->input_buffer_pos;              if (window->buffer->input_buffer_pos == window->buffer->input_buffer_length)
1164              if (curpos == window->buffer->input_buffer_size)                  window->buffer->input_buffer_pos--;
1165                  curpos--;              
1166              else              start = utf8_add_offset (window->buffer->input_buffer,
1167                  window->buffer->input_buffer_pos++;                                       window->buffer->input_buffer_pos);
1168                prev_char = utf8_prev_char (window->buffer->input_buffer,
1169                                            start);
1170                size_current_char = start - prev_char;
1171                memcpy (saved_char, prev_char, size_current_char);
1172                memcpy (prev_char, start, utf8_char_size (start));
1173                start = utf8_next_char (prev_char);
1174                memcpy (start, saved_char, size_current_char);
1175                            
1176              buf = window->buffer->input_buffer[curpos];              window->buffer->input_buffer_pos++;
             window->buffer->input_buffer[curpos] =  
                 window->buffer->input_buffer[curpos-1];  
             window->buffer->input_buffer[curpos-1] = buf;  
1177                            
1178              gui_draw_buffer_input (window->buffer, 0);                gui_draw_buffer_input (window->buffer, 0);  
1179              window->buffer->completion.position = -1;              window->buffer->completion.position = -1;
# Line 1181  gui_input_end (t_gui_window *window) Line 1208  gui_input_end (t_gui_window *window)
1208      if (window->buffer->has_input)      if (window->buffer->has_input)
1209      {      {
1210          if (window->buffer->input_buffer_pos <          if (window->buffer->input_buffer_pos <
1211              window->buffer->input_buffer_size)              window->buffer->input_buffer_length)
1212          {          {
1213              window->buffer->input_buffer_pos =              window->buffer->input_buffer_pos =
1214                  window->buffer->input_buffer_size;                  window->buffer->input_buffer_length;
1215              gui_draw_buffer_input (window->buffer, 0);              gui_draw_buffer_input (window->buffer, 0);
1216          }          }
1217      }      }
# Line 1214  gui_input_left (t_gui_window *window) Line 1241  gui_input_left (t_gui_window *window)
1241  void  void
1242  gui_input_previous_word (t_gui_window *window)  gui_input_previous_word (t_gui_window *window)
1243  {  {
1244      int i;      char *pos;
1245            
1246      if (window->buffer->has_input)      if (window->buffer->has_input)
1247      {      {
1248          if (window->buffer->input_buffer_pos > 0)          if (window->buffer->input_buffer_pos > 0)
1249          {          {
1250              i = window->buffer->input_buffer_pos - 1;              pos = utf8_add_offset (window->buffer->input_buffer,
1251              while ((i >= 0) &&                                     window->buffer->input_buffer_pos - 1);
1252                     (window->buffer->input_buffer[i] == ' '))              while (pos && (pos[0] == ' '))
                 i--;  
             if (i < 0)  
                 window->buffer->input_buffer_pos = 0;  
             else  
1253              {              {
1254                  while ((i >= 0) &&                  pos = utf8_prev_char (window->buffer->input_buffer, pos);
                        (window->buffer->input_buffer[i] != ' '))  
                     i--;  
                 window->buffer->input_buffer_pos = i + 1;  
1255              }              }
1256                if (pos)
1257                {
1258                    while (pos && (pos[0] != ' '))
1259                    {
1260                        pos = utf8_prev_char (window->buffer->input_buffer, pos);
1261                    }
1262                    if (pos)
1263                        pos = utf8_next_char (pos);
1264                    else
1265                        pos = window->buffer->input_buffer;
1266                    window->buffer->input_buffer_pos = utf8_pos (window->buffer->input_buffer,
1267                                                                 pos - window->buffer->input_buffer);
1268                }
1269                else
1270                    window->buffer->input_buffer_pos = 0;
1271                
1272              gui_draw_buffer_input (window->buffer, 0);              gui_draw_buffer_input (window->buffer, 0);
1273          }          }
1274      }      }
# Line 1248  gui_input_right (t_gui_window *window) Line 1284  gui_input_right (t_gui_window *window)
1284      if (window->buffer->has_input)      if (window->buffer->has_input)
1285      {      {
1286          if (window->buffer->input_buffer_pos <          if (window->buffer->input_buffer_pos <
1287              window->buffer->input_buffer_size)              window->buffer->input_buffer_length)
1288          {          {
1289              window->buffer->input_buffer_pos++;              window->buffer->input_buffer_pos++;
1290              gui_draw_buffer_input (window->buffer, 0);              gui_draw_buffer_input (window->buffer, 0);
# Line 1263  gui_input_right (t_gui_window *window) Line 1299  gui_input_right (t_gui_window *window)
1299  void  void
1300  gui_input_next_word (t_gui_window *window)  gui_input_next_word (t_gui_window *window)
1301  {  {
1302      int i;      char *pos;
1303            
1304      if (window->buffer->has_input)      if (window->buffer->has_input)
1305      {      {
1306          if (window->buffer->input_buffer_pos <          if (window->buffer->input_buffer_pos <
1307              window->buffer->input_buffer_size + 1)              window->buffer->input_buffer_length)
1308          {          {
1309              i = window->buffer->input_buffer_pos;              pos = utf8_add_offset (window->buffer->input_buffer,
1310              while ((i <= window->buffer->input_buffer_size) &&                                     window->buffer->input_buffer_pos);
1311                     (window->buffer->input_buffer[i] == ' '))              while (pos[0] && (pos[0] == ' '))
1312                  i++;              {
1313              if (i > window->buffer->input_buffer_size)                  pos = utf8_next_char (pos);
1314                  window->buffer->input_buffer_pos = i - 1;              }
1315              else              if (pos[0])
1316              {              {
1317                  while ((i <= window->buffer->input_buffer_size) &&                  while (pos[0] && (pos[0] != ' '))
1318                         (window->buffer->input_buffer[i] != ' '))                  {
1319                      i++;                      pos = utf8_next_char (pos);
1320                  if (i > window->buffer->input_buffer_size)                  }
1321                    if (pos[0])
1322                      window->buffer->input_buffer_pos =                      window->buffer->input_buffer_pos =
1323                          window->buffer->input_buffer_size;                          utf8_pos (window->buffer->input_buffer,
1324                                      pos - window->buffer->input_buffer);
1325                  else                  else
1326                      window->buffer->input_buffer_pos = i;                      window->buffer->input_buffer_pos =
1327                                            window->buffer->input_buffer_length;
1328              }              }
1329                else
1330                    window->buffer->input_buffer_pos =
1331                        utf8_pos (window->buffer->input_buffer,
1332                                  utf8_prev_char (window->buffer->input_buffer, pos) - window->buffer->input_buffer);
1333                
1334              gui_draw_buffer_input (window->buffer, 0);              gui_draw_buffer_input (window->buffer, 0);
1335          }          }
1336      }      }
# Line 1335  gui_input_up (t_gui_window *window) Line 1378  gui_input_up (t_gui_window *window)
1378          {          {
1379              window->buffer->input_buffer_size =              window->buffer->input_buffer_size =
1380                  strlen (window->buffer->ptr_history->text);                  strlen (window->buffer->ptr_history->text);
1381                window->buffer->input_buffer_length =
1382                    utf8_strlen (window->buffer->ptr_history->text);
1383              gui_input_optimize_buffer_size (window->buffer);              gui_input_optimize_buffer_size (window->buffer);
1384              window->buffer->input_buffer_pos =              window->buffer->input_buffer_pos =
1385                  window->buffer->input_buffer_size;                  window->buffer->input_buffer_length;
1386              strcpy (window->buffer->input_buffer,              strcpy (window->buffer->input_buffer,
1387                      window->buffer->ptr_history->text);                      window->buffer->ptr_history->text);
1388              gui_draw_buffer_input (window->buffer, 0);              gui_draw_buffer_input (window->buffer, 0);
# Line 1366  gui_input_up_global (t_gui_window *windo Line 1411  gui_input_up_global (t_gui_window *windo
1411          {          {
1412              window->buffer->input_buffer_size =              window->buffer->input_buffer_size =
1413                  strlen (history_global_ptr->text);                  strlen (history_global_ptr->text);
1414                window->buffer->input_buffer_length =
1415                    utf8_strlen (history_global_ptr->text);
1416              gui_input_optimize_buffer_size (window->buffer);              gui_input_optimize_buffer_size (window->buffer);
1417              window->buffer->input_buffer_pos =              window->buffer->input_buffer_pos =
1418                  window->buffer->input_buffer_size;                  window->buffer->input_buffer_length;
1419              strcpy (window->buffer->input_buffer,              strcpy (window->buffer->input_buffer,
1420                      history_global_ptr->text);                      history_global_ptr->text);
1421              gui_draw_buffer_input (window->buffer, 0);              gui_draw_buffer_input (window->buffer, 0);
# Line 1419  gui_input_down (t_gui_window *window) Line 1466  gui_input_down (t_gui_window *window)
1466              window->buffer->ptr_history =              window->buffer->ptr_history =
1467                  window->buffer->ptr_history->prev_history;                  window->buffer->ptr_history->prev_history;
1468              if (window->buffer->ptr_history)              if (window->buffer->ptr_history)
1469                {
1470                  window->buffer->input_buffer_size =                  window->buffer->input_buffer_size =
1471                      strlen (window->buffer->ptr_history->text);                      strlen (window->buffer->ptr_history->text);
1472                    window->buffer->input_buffer_length =
1473                        utf8_strlen (window->buffer->ptr_history->text);
1474                }
1475              else              else
1476                {
1477                  window->buffer->input_buffer_size = 0;                  window->buffer->input_buffer_size = 0;
1478                    window->buffer->input_buffer_length = 0;
1479                }
1480              gui_input_optimize_buffer_size (window->buffer);              gui_input_optimize_buffer_size (window->buffer);
1481              window->buffer->input_buffer_pos =              window->buffer->input_buffer_pos =
1482                  window->buffer->input_buffer_size;                  window->buffer->input_buffer_length;
1483              if (window->buffer->ptr_history)              if (window->buffer->ptr_history)
1484                  strcpy (window->buffer->input_buffer,                  strcpy (window->buffer->input_buffer,
1485                          window->buffer->ptr_history->text);                          window->buffer->ptr_history->text);
# Line 1447  gui_input_down_global (t_gui_window *win Line 1501  gui_input_down_global (t_gui_window *win
1501          {          {
1502              history_global_ptr = history_global_ptr->prev_history;              history_global_ptr = history_global_ptr->prev_history;
1503              if (history_global_ptr)              if (history_global_ptr)
1504                {
1505                  window->buffer->input_buffer_size =                  window->buffer->input_buffer_size =
1506                      strlen (history_global_ptr->text);                      strlen (history_global_ptr->text);
1507                    window->buffer->input_buffer_length =
1508                        utf8_strlen (history_global_ptr->text);
1509                }
1510              else              else
1511                {
1512                  window->buffer->input_buffer_size = 0;                  window->buffer->input_buffer_size = 0;
1513                    window->buffer->input_buffer_length = 0;
1514                }
1515              gui_input_optimize_buffer_size (window->buffer);              gui_input_optimize_buffer_size (window->buffer);
1516              window->buffer->input_buffer_pos =              window->buffer->input_buffer_pos =
1517                  window->buffer->input_buffer_size;                  window->buffer->input_buffer_length;
1518              if (history_global_ptr)              if (history_global_ptr)
1519                  strcpy (window->buffer->input_buffer,                  strcpy (window->buffer->input_buffer,
1520                          history_global_ptr->text);                          history_global_ptr->text);
# Line 1916  gui_buffer_print_log (t_gui_buffer *buff Line 1977  gui_buffer_print_log (t_gui_buffer *buff
1977      wee_log_printf ("  input_buffer . . . . : '%s'\n", buffer->input_buffer);      wee_log_printf ("  input_buffer . . . . : '%s'\n", buffer->input_buffer);
1978      wee_log_printf ("  input_buffer_alloc . : %d\n",   buffer->input_buffer_alloc);      wee_log_printf ("  input_buffer_alloc . : %d\n",   buffer->input_buffer_alloc);
1979      wee_log_printf ("  input_buffer_size. . : %d\n",   buffer->input_buffer_size);      wee_log_printf ("  input_buffer_size. . : %d\n",   buffer->input_buffer_size);
1980        wee_log_printf ("  input_buffer_length. : %d\n",   buffer->input_buffer_length);
1981      wee_log_printf ("  input_buffer_pos . . : %d\n",   buffer->input_buffer_pos);      wee_log_printf ("  input_buffer_pos . . : %d\n",   buffer->input_buffer_pos);
1982      wee_log_printf ("  input_buffer_1st_disp: %d\n",   buffer->input_buffer_1st_display);      wee_log_printf ("  input_buffer_1st_disp: %d\n",   buffer->input_buffer_1st_display);
1983      wee_log_printf ("  history. . . . . . . : 0x%X\n", buffer->history);      wee_log_printf ("  history. . . . . . . : 0x%X\n", buffer->history);

Legend:
Removed from v.1.55  
changed lines
  Added in v.1.56

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