/[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.39 by flashcode, Sun Jun 19 14:22:11 2005 UTC revision 1.40 by flashcode, Sat Jul 9 15:30:51 2005 UTC
# Line 34  Line 34 
34    
35  #include "../common/weechat.h"  #include "../common/weechat.h"
36  #include "gui.h"  #include "gui.h"
37    #include "../common/command.h"
38  #include "../common/weeconfig.h"  #include "../common/weeconfig.h"
39  #include "../common/hotlist.h"  #include "../common/hotlist.h"
40  #include "../common/log.h"  #include "../common/log.h"
# Line 89  gui_window_new (int x, int y, int width, Line 90  gui_window_new (int x, int y, int width,
90          new_window->win_nick_height = 0;          new_window->win_nick_height = 0;
91          new_window->win_nick_start = 0;          new_window->win_nick_start = 0;
92                    
93            new_window->win_input_x = 0;
94            
95          new_window->win_title = NULL;          new_window->win_title = NULL;
96          new_window->win_chat = NULL;          new_window->win_chat = NULL;
97          new_window->win_nick = NULL;          new_window->win_nick = NULL;
# Line 552  gui_new_message (t_gui_buffer *buffer) Line 555  gui_new_message (t_gui_buffer *buffer)
555  }  }
556    
557  /*  /*
558   * gui_optimize_input_buffer_size: optimize input buffer size by adding   * gui_input_optimize_buffer_size: optimize input buffer size by adding
559   *                                 or deleting data block (predefined size)   *                                 or deleting data block (predefined size)
560   */   */
561    
562  void  void
563  gui_optimize_input_buffer_size (t_gui_buffer *buffer)  gui_input_optimize_buffer_size (t_gui_buffer *buffer)
564  {  {
565      int optimal_size;      int optimal_size;
566            
# Line 571  gui_optimize_input_buffer_size (t_gui_bu Line 574  gui_optimize_input_buffer_size (t_gui_bu
574  }  }
575    
576  /*  /*
577   * gui_delete_previous_word: delete previous word   * gui_input_insert_string: insert a string into the input buffer
578     */
579    
580    void
581    gui_input_insert_string (char *string, int pos)
582    {
583        int i, start, end, length;
584        
585        length = strlen (string);
586        
587        /* increase buffer size */
588        gui_current_window->buffer->input_buffer_size += length;
589        gui_input_optimize_buffer_size (gui_current_window->buffer);
590        gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
591        
592        /* move end of string to the right */
593        start = pos + length;
594        end = gui_current_window->buffer->input_buffer_size - 1;
595        for (i = end; i >= start; i--)
596            gui_current_window->buffer->input_buffer[i] =
597                gui_current_window->buffer->input_buffer[i - length];
598        
599        /* insert new string */
600        strncpy (gui_current_window->buffer->input_buffer + pos, string, length);
601    }
602    
603    /*
604     * gui_input_insert_char: insert a char into input buffer
605     */
606    
607    void
608    gui_input_insert_char (int key)
609    {
610        char new_char[3];
611        t_irc_dcc *dcc_selected, *ptr_dcc, *ptr_dcc_next;
612        
613        if (key < 32)
614            return;
615        
616        if (gui_current_window->buffer->dcc)
617        {
618            dcc_selected = (gui_current_window->dcc_selected) ?
619                (t_irc_dcc *) gui_current_window->dcc_selected : dcc_list;
620            switch (key)
621            {
622                /* accept DCC */
623                case 'a':
624                case 'A':
625                    if (dcc_selected
626                        && (DCC_IS_RECV(dcc_selected->status))
627                        && (dcc_selected->status == DCC_WAITING))
628                    {
629                        dcc_accept (dcc_selected);
630                    }
631                    break;
632                /* cancel DCC */
633                case 'c':
634                case 'C':
635                    if (dcc_selected
636                        && (!DCC_ENDED(dcc_selected->status)))
637                    {
638                        dcc_close (dcc_selected, DCC_ABORTED);
639                        gui_redraw_buffer (gui_current_window->buffer);
640                    }
641                    break;
642                /* purge old DCC */
643                case 'p':
644                case 'P':
645                    gui_current_window->dcc_selected = NULL;
646                    ptr_dcc = dcc_list;
647                    while (ptr_dcc)
648                    {
649                        ptr_dcc_next = ptr_dcc->next_dcc;
650                        if (DCC_ENDED(ptr_dcc->status))
651                            dcc_free (ptr_dcc);
652                        ptr_dcc = ptr_dcc_next;
653                    }
654                    gui_redraw_buffer (gui_current_window->buffer);
655                    break;
656                /* close DCC window */
657                case 'q':
658                case 'Q':
659                    if (buffer_before_dcc)
660                    {
661                        gui_buffer_free (gui_current_window->buffer, 1);
662                        gui_switch_to_buffer (gui_current_window,
663                                              buffer_before_dcc);
664                    }
665                    else
666                        gui_buffer_free (gui_current_window->buffer, 1);
667                    gui_redraw_buffer (gui_current_window->buffer);
668                    break;
669                /* remove from DCC list */
670                case 'r':
671                case 'R':
672                    if (dcc_selected
673                        && (DCC_ENDED(dcc_selected->status)))
674                    {
675                        if (dcc_selected->next_dcc)
676                            gui_current_window->dcc_selected = dcc_selected->next_dcc;
677                        else
678                            gui_current_window->dcc_selected = NULL;
679                        dcc_free (dcc_selected);
680                        gui_redraw_buffer (gui_current_window->buffer);
681                    }
682                    break;
683            }
684        }
685        else
686        {
687            /*gui_printf (gui_current_window->buffer,
688              "[Debug] key pressed = %d, hex = %02X, octal = %o\n", key, key, key);*/
689            new_char[0] = key;
690            new_char[1] = '\0';
691            
692            gui_input_insert_string (new_char,
693                                     gui_current_window->buffer->input_buffer_pos);
694            gui_current_window->buffer->input_buffer_pos++;
695            gui_draw_buffer_input (gui_current_window->buffer, 0);
696            gui_current_window->buffer->completion.position = -1;
697        }
698    }
699    
700    /*
701     * gui_input_return: terminate line (return pressed)
702   */   */
703    
704  void  void
705  gui_delete_previous_word (t_gui_buffer *buffer)  gui_input_return ()
706    {
707        t_gui_buffer *ptr_buffer;
708        
709        if (!gui_current_window->buffer->dcc)    
710        {
711            if (gui_current_window->buffer->input_buffer_size > 0)
712            {
713                gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
714                history_add (gui_current_window->buffer, gui_current_window->buffer->input_buffer);
715                gui_current_window->buffer->input_buffer_size = 0;
716                gui_current_window->buffer->input_buffer_pos = 0;
717                gui_current_window->buffer->input_buffer_1st_display = 0;
718                gui_current_window->buffer->completion.position = -1;
719                gui_current_window->buffer->ptr_history = NULL;
720                ptr_buffer = gui_current_window->buffer;
721                user_command (SERVER(gui_current_window->buffer),
722                              gui_current_window->buffer,
723                              gui_current_window->buffer->input_buffer);
724                if (ptr_buffer == gui_current_window->buffer)
725                {
726                    ptr_buffer->input_buffer[0] = '\0';
727                    gui_draw_buffer_input (ptr_buffer, 0);
728                }
729            }
730        }
731    }
732    
733    /*
734     * gui_input_tab: tab key => completion
735     */
736    
737    void
738    gui_input_tab ()
739    {
740        int i;
741    
742        if (!gui_current_window->buffer->dcc)
743        {
744            completion_search (&(gui_current_window->buffer->completion),
745                               CHANNEL(gui_current_window->buffer),
746                               gui_current_window->buffer->input_buffer,
747                               gui_current_window->buffer->input_buffer_size,
748                               gui_current_window->buffer->input_buffer_pos);
749                        
750            if (gui_current_window->buffer->completion.word_found)
751            {
752                /* replace word with new completed word into input buffer */
753                if (gui_current_window->buffer->completion.diff_size > 0)
754                {
755                    gui_current_window->buffer->input_buffer_size +=
756                        gui_current_window->buffer->completion.diff_size;
757                    gui_input_optimize_buffer_size (gui_current_window->buffer);
758                    gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
759                    for (i = gui_current_window->buffer->input_buffer_size - 1;
760                         i >=  gui_current_window->buffer->completion.position_replace +
761                             (int)strlen (gui_current_window->buffer->completion.word_found); i--)
762                        gui_current_window->buffer->input_buffer[i] =
763                            gui_current_window->buffer->input_buffer[i -
764                                                                     gui_current_window->buffer->completion.diff_size];
765                }
766                else
767                {
768                    for (i = gui_current_window->buffer->completion.position_replace +
769                             strlen (gui_current_window->buffer->completion.word_found);
770                         i < gui_current_window->buffer->input_buffer_size; i++)
771                        gui_current_window->buffer->input_buffer[i] =
772                            gui_current_window->buffer->input_buffer[i -
773                                                                     gui_current_window->buffer->completion.diff_size];
774                    gui_current_window->buffer->input_buffer_size +=
775                        gui_current_window->buffer->completion.diff_size;
776                    gui_input_optimize_buffer_size (gui_current_window->buffer);
777                    gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
778                }
779                            
780                strncpy (gui_current_window->buffer->input_buffer + gui_current_window->buffer->completion.position_replace,
781                         gui_current_window->buffer->completion.word_found,
782                         strlen (gui_current_window->buffer->completion.word_found));
783                gui_current_window->buffer->input_buffer_pos =
784                    gui_current_window->buffer->completion.position_replace +
785                    strlen (gui_current_window->buffer->completion.word_found);
786                            
787                /* position is < 0 this means only one word was found to complete,
788                   so reinit to stop completion */
789                if (gui_current_window->buffer->completion.position >= 0)
790                    gui_current_window->buffer->completion.position =
791                        gui_current_window->buffer->input_buffer_pos;
792                            
793                /* add space or completor to the end of completion, if needed */
794                if ((gui_current_window->buffer->completion.context == COMPLETION_COMMAND)
795                    || (gui_current_window->buffer->completion.context == COMPLETION_COMMAND_ARG))
796                {
797                    if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ')
798                        gui_input_insert_string (" ",
799                                                 gui_current_window->buffer->input_buffer_pos);
800                    if (gui_current_window->buffer->completion.position >= 0)
801                        gui_current_window->buffer->completion.position++;
802                    gui_current_window->buffer->input_buffer_pos++;
803                }
804                else
805                {
806                    /* add nick completor if position 0 and completing nick */
807                    if ((gui_current_window->buffer->completion.base_word_pos == 0)
808                        && (gui_current_window->buffer->completion.context == COMPLETION_NICK))
809                    {
810                        if (strncmp (gui_current_window->buffer->input_buffer + gui_current_window->buffer->input_buffer_pos,
811                                     cfg_look_completor, strlen (cfg_look_completor)) != 0)
812                            gui_input_insert_string (cfg_look_completor,
813                                                     gui_current_window->buffer->input_buffer_pos);
814                        if (gui_current_window->buffer->completion.position >= 0)
815                            gui_current_window->buffer->completion.position += strlen (cfg_look_completor);
816                        gui_current_window->buffer->input_buffer_pos += strlen (cfg_look_completor);
817                        if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ')
818                            gui_input_insert_string (" ",
819                                                     gui_current_window->buffer->input_buffer_pos);
820                        if (gui_current_window->buffer->completion.position >= 0)
821                            gui_current_window->buffer->completion.position++;
822                        gui_current_window->buffer->input_buffer_pos++;
823                    }
824                }
825                gui_draw_buffer_input (gui_current_window->buffer, 0);
826            }
827        }
828    }
829    
830    /*
831     * gui_input_backspace: backspace key
832     */
833    
834    void
835    gui_input_backspace ()
836    {
837        int i;
838    
839        if (!gui_current_window->buffer->dcc)
840        {
841            if (gui_current_window->buffer->input_buffer_pos > 0)
842            {
843                i = gui_current_window->buffer->input_buffer_pos-1;
844                while (gui_current_window->buffer->input_buffer[i])
845                {
846                    gui_current_window->buffer->input_buffer[i] =
847                        gui_current_window->buffer->input_buffer[i+1];
848                    i++;
849                }
850                gui_current_window->buffer->input_buffer_size--;
851                gui_current_window->buffer->input_buffer_pos--;
852                gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
853                gui_draw_buffer_input (gui_current_window->buffer, 0);
854                gui_input_optimize_buffer_size (gui_current_window->buffer);
855                gui_current_window->buffer->completion.position = -1;
856            }
857        }
858    }
859    
860    /*
861     * gui_input_delete: delete key
862     */
863    
864    void
865    gui_input_delete ()
866    {
867        int i;
868    
869        if (!gui_current_window->buffer->dcc)
870        {
871            if (gui_current_window->buffer->input_buffer_pos <
872                gui_current_window->buffer->input_buffer_size)
873            {
874                i = gui_current_window->buffer->input_buffer_pos;
875                while (gui_current_window->buffer->input_buffer[i])
876                {
877                    gui_current_window->buffer->input_buffer[i] =
878                        gui_current_window->buffer->input_buffer[i+1];
879                    i++;
880                }
881                gui_current_window->buffer->input_buffer_size--;
882                gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
883                gui_draw_buffer_input (gui_current_window->buffer, 0);
884                gui_input_optimize_buffer_size (gui_current_window->buffer);
885                gui_current_window->buffer->completion.position = -1;
886            }
887        }
888    }
889    
890    /*
891     * gui_input_delete_previous_word: delete previous word
892     */
893    
894    void
895    gui_input_delete_previous_word ()
896  {  {
897      int i, j, num_char_deleted, num_char_end;      int i, j, num_char_deleted, num_char_end;
898            
899      if (buffer->input_buffer_pos > 0)      if (gui_current_window->buffer->input_buffer_pos > 0)
900      {      {
901          i = buffer->input_buffer_pos - 1;          i = gui_current_window->buffer->input_buffer_pos - 1;
902          while ((i >= 0) &&          while ((i >= 0) &&
903              (buffer->input_buffer[i] == ' '))              (gui_current_window->buffer->input_buffer[i] == ' '))
904              i--;              i--;
905          if (i >= 0)          if (i >= 0)
906          {          {
907              while ((i >= 0) &&              while ((i >= 0) &&
908                  (buffer->input_buffer[i] != ' '))                  (gui_current_window->buffer->input_buffer[i] != ' '))
909                  i--;                  i--;
910              if (i >= 0)              if (i >= 0)
911              {              {
912                  while ((i >= 0) &&                  while ((i >= 0) &&
913                      (buffer->input_buffer[i] == ' '))                      (gui_current_window->buffer->input_buffer[i] == ' '))
914                      i--;                      i--;
915              }              }
916          }          }
# Line 601  gui_delete_previous_word (t_gui_buffer * Line 918  gui_delete_previous_word (t_gui_buffer *
918          if (i >= 0)          if (i >= 0)
919              i++;              i++;
920          i++;          i++;
921          num_char_deleted = buffer->input_buffer_pos - i;          num_char_deleted = gui_current_window->buffer->input_buffer_pos - i;
922          num_char_end = buffer->input_buffer_size -          num_char_end = gui_current_window->buffer->input_buffer_size -
923              buffer->input_buffer_pos;              gui_current_window->buffer->input_buffer_pos;
924                    
925          for (j = 0; j < num_char_end; j++)          for (j = 0; j < num_char_end; j++)
926              buffer->input_buffer[i + j] =              gui_current_window->buffer->input_buffer[i + j] =
927                  buffer->input_buffer[buffer->input_buffer_pos + j];                  gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos + j];
928                    
929          buffer->input_buffer_size -= num_char_deleted;          gui_current_window->buffer->input_buffer_size -= num_char_deleted;
930          buffer->input_buffer[buffer->input_buffer_size] = '\0';          gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
931          buffer->input_buffer_pos = i;          gui_current_window->buffer->input_buffer_pos = i;
932          gui_draw_buffer_input (buffer, 0);          gui_draw_buffer_input (gui_current_window->buffer, 0);
933          gui_optimize_input_buffer_size (buffer);          gui_input_optimize_buffer_size (gui_current_window->buffer);
934          buffer->completion.position = -1;          gui_current_window->buffer->completion.position = -1;
935        }
936    }
937    
938    /*
939     * gui_input_delete_next_word: delete next word
940     */
941    
942    void
943    gui_input_delete_next_word ()
944    {
945        int i, j, num_char_deleted;
946        
947        i = gui_current_window->buffer->input_buffer_pos;
948        while (i < gui_current_window->buffer->input_buffer_size)
949        {
950            if ((gui_current_window->buffer->input_buffer[i] == ' ')
951                && i != gui_current_window->buffer->input_buffer_pos)
952                break;
953            i++;
954        }
955        num_char_deleted = i - gui_current_window->buffer->input_buffer_pos;
956        
957        for (j = i; j < gui_current_window->buffer->input_buffer_size; j++)
958            gui_current_window->buffer->input_buffer[j - num_char_deleted] =
959                gui_current_window->buffer->input_buffer[j];
960        
961        gui_current_window->buffer->input_buffer_size -= num_char_deleted;
962        gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
963        gui_draw_buffer_input (gui_current_window->buffer, 0);
964        gui_input_optimize_buffer_size (gui_current_window->buffer);
965        gui_current_window->buffer->completion.position = -1;
966    }
967    
968    /*
969     * gui_input_delete_begin_of_line: delete all from cursor pos to beginning of line
970     */
971    
972    void
973    gui_input_delete_begin_of_line ()
974    {
975        int i;
976        
977        for (i = gui_current_window->buffer->input_buffer_pos;
978             i < gui_current_window->buffer->input_buffer_size; i++)
979            gui_current_window->buffer->input_buffer[i - gui_current_window->buffer->input_buffer_pos] =
980                gui_current_window->buffer->input_buffer[i];
981        
982        gui_current_window->buffer->input_buffer_size -=
983            gui_current_window->buffer->input_buffer_pos;
984        gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
985        gui_current_window->buffer->input_buffer_pos = 0;
986        gui_draw_buffer_input (gui_current_window->buffer, 0);
987        gui_input_optimize_buffer_size (gui_current_window->buffer);
988        gui_current_window->buffer->completion.position = -1;
989    }
990    
991    /*
992     * gui_input_delete_end_of_line: delete all from cursor pos to end of line
993     */
994    
995    void
996    gui_input_delete_end_of_line ()
997    {
998        gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] = ' ';
999        gui_current_window->buffer->input_buffer_size = gui_current_window->buffer->input_buffer_pos ;
1000        gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
1001        gui_draw_buffer_input (gui_current_window->buffer, 0);
1002        gui_input_optimize_buffer_size (gui_current_window->buffer);
1003        gui_current_window->buffer->completion.position = -1;
1004    }
1005    
1006    /*
1007     * gui_input_delete_line: delete entire line
1008     */
1009    
1010    void
1011    gui_input_delete_line ()
1012    {
1013        gui_current_window->buffer->input_buffer[0] = '\0';
1014        gui_current_window->buffer->input_buffer_size = 0;
1015        gui_current_window->buffer->input_buffer_pos = 0;
1016        gui_draw_buffer_input (gui_current_window->buffer, 0);
1017        gui_input_optimize_buffer_size (gui_current_window->buffer);
1018        gui_current_window->buffer->completion.position = -1;
1019    }
1020    
1021    /*
1022     * gui_input_home: home key
1023     */
1024    
1025    void
1026    gui_input_home ()
1027    {
1028        if (!gui_current_window->buffer->dcc)
1029        {
1030            if (gui_current_window->buffer->input_buffer_pos > 0)
1031            {
1032                gui_current_window->buffer->input_buffer_pos = 0;
1033                gui_draw_buffer_input (gui_current_window->buffer, 0);
1034            }
1035        }
1036    }
1037    
1038    /*
1039     * gui_input_end: end key
1040     */
1041    
1042    void
1043    gui_input_end ()
1044    {
1045        if (!gui_current_window->buffer->dcc)
1046        {
1047            if (gui_current_window->buffer->input_buffer_pos <
1048                gui_current_window->buffer->input_buffer_size)
1049            {
1050                gui_current_window->buffer->input_buffer_pos =
1051                    gui_current_window->buffer->input_buffer_size;
1052                gui_draw_buffer_input (gui_current_window->buffer, 0);
1053            }
1054        }
1055    }
1056    
1057    /*
1058     * gui_input_left: move to previous char
1059     */
1060    
1061    void
1062    gui_input_left ()
1063    {
1064        if (!gui_current_window->buffer->dcc)
1065        {
1066            if (gui_current_window->buffer->input_buffer_pos > 0)
1067            {
1068                gui_current_window->buffer->input_buffer_pos--;
1069                gui_draw_buffer_input (gui_current_window->buffer, 0);
1070            }
1071      }      }
1072  }  }
1073    
1074  /*  /*
1075   * gui_move_previous_word: move to beginning of previous word   * gui_input_previous_word: move to beginning of previous word
1076   */   */
1077    
1078  void  void
1079  gui_move_previous_word (t_gui_buffer *buffer)  gui_input_previous_word ()
1080  {  {
1081      int i;      int i;
1082            
1083      if (buffer->input_buffer_pos > 0)      if (gui_current_window->buffer->input_buffer_pos > 0)
1084      {      {
1085          i = buffer->input_buffer_pos - 1;          i = gui_current_window->buffer->input_buffer_pos - 1;
1086          while ((i >= 0) &&          while ((i >= 0) &&
1087              (buffer->input_buffer[i] == ' '))              (gui_current_window->buffer->input_buffer[i] == ' '))
1088              i--;              i--;
1089          if (i < 0)          if (i < 0)
1090              buffer->input_buffer_pos = 0;              gui_current_window->buffer->input_buffer_pos = 0;
1091          else          else
1092          {          {
1093              while ((i >= 0) &&              while ((i >= 0) &&
1094                  (buffer->input_buffer[i] != ' '))                  (gui_current_window->buffer->input_buffer[i] != ' '))
1095                  i--;                  i--;
1096              buffer->input_buffer_pos = i + 1;              gui_current_window->buffer->input_buffer_pos = i + 1;
1097          }          }
1098          gui_draw_buffer_input (buffer, 0);          gui_draw_buffer_input (gui_current_window->buffer, 0);
1099      }      }
1100  }  }
1101    
1102  /*  /*
1103   * gui_move_next_word: move to the end of next   * gui_input_right: move to previous char
1104   */   */
1105    
1106  void  void
1107  gui_move_next_word (t_gui_buffer *buffer)  gui_input_right ()
1108    {
1109        if (!gui_current_window->buffer->dcc)
1110        {
1111            if (gui_current_window->buffer->input_buffer_pos <
1112                gui_current_window->buffer->input_buffer_size)
1113            {
1114                gui_current_window->buffer->input_buffer_pos++;
1115                gui_draw_buffer_input (gui_current_window->buffer, 0);
1116            }
1117        }
1118    }
1119    
1120    /*
1121     * gui_input_next_word: move to the end of next
1122     */
1123    
1124    void
1125    gui_input_next_word ()
1126  {  {
1127      int i;      int i;
1128            
1129      if (buffer->input_buffer_pos <      if (gui_current_window->buffer->input_buffer_pos <
1130          buffer->input_buffer_size + 1)          gui_current_window->buffer->input_buffer_size + 1)
1131      {      {
1132          i = buffer->input_buffer_pos;          i = gui_current_window->buffer->input_buffer_pos;
1133          while ((i <= buffer->input_buffer_size) &&          while ((i <= gui_current_window->buffer->input_buffer_size) &&
1134              (buffer->input_buffer[i] == ' '))              (gui_current_window->buffer->input_buffer[i] == ' '))
1135              i++;              i++;
1136          if (i > buffer->input_buffer_size)          if (i > gui_current_window->buffer->input_buffer_size)
1137              buffer->input_buffer_pos = i - 1;              gui_current_window->buffer->input_buffer_pos = i - 1;
1138          else          else
1139          {          {
1140              while ((i <= buffer->input_buffer_size) &&              while ((i <= gui_current_window->buffer->input_buffer_size) &&
1141                  (buffer->input_buffer[i] != ' '))                  (gui_current_window->buffer->input_buffer[i] != ' '))
1142                  i++;                  i++;
1143              if (i > buffer->input_buffer_size)              if (i > gui_current_window->buffer->input_buffer_size)
1144                  buffer->input_buffer_pos =                  gui_current_window->buffer->input_buffer_pos =
1145                      buffer->input_buffer_size;                      gui_current_window->buffer->input_buffer_size;
1146              else              else
1147                  buffer->input_buffer_pos = i;                  gui_current_window->buffer->input_buffer_pos = i;
1148                            
1149          }          }
1150          gui_draw_buffer_input (buffer, 0);          gui_draw_buffer_input (gui_current_window->buffer, 0);
1151      }      }
1152  }  }
1153    
1154  /*  /*
1155   * gui_buffer_insert_string: insert a string into the input buffer   * gui_input_up: recall last command or move to previous DCC in list
1156   */   */
1157    
1158  void  void
1159  gui_buffer_insert_string (t_gui_buffer *buffer, char *string, int pos)  gui_input_up ()
1160  {  {
1161      int i, start, end, length;      if (gui_current_window->buffer->dcc)
1162        {
1163            if (dcc_list)
1164            {
1165                if (gui_current_window->dcc_selected
1166                    && ((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc)
1167                {
1168                    if (gui_current_window->dcc_selected ==
1169                        gui_current_window->dcc_first)
1170                        gui_current_window->dcc_first =
1171                            ((t_irc_dcc *)(gui_current_window->dcc_first))->prev_dcc;
1172                    gui_current_window->dcc_selected =
1173                        ((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc;
1174                    gui_draw_buffer_chat (gui_current_window->buffer, 1);
1175                    gui_draw_buffer_input (gui_current_window->buffer, 1);
1176                }
1177            }
1178        }
1179        else
1180        {
1181            if (gui_current_window->buffer->ptr_history)
1182            {
1183                gui_current_window->buffer->ptr_history =
1184                    gui_current_window->buffer->ptr_history->next_history;
1185                if (!gui_current_window->buffer->ptr_history)
1186                    gui_current_window->buffer->ptr_history =
1187                        gui_current_window->buffer->history;
1188            }
1189            else
1190                gui_current_window->buffer->ptr_history =
1191                    gui_current_window->buffer->history;
1192            if (gui_current_window->buffer->ptr_history)
1193            {
1194                gui_current_window->buffer->input_buffer_size =
1195                    strlen (gui_current_window->buffer->ptr_history->text);
1196                gui_input_optimize_buffer_size (gui_current_window->buffer);
1197                gui_current_window->buffer->input_buffer_pos =
1198                    gui_current_window->buffer->input_buffer_size;
1199                strcpy (gui_current_window->buffer->input_buffer,
1200                        gui_current_window->buffer->ptr_history->text);
1201                gui_draw_buffer_input (gui_current_window->buffer, 0);
1202            }
1203        }
1204    }
1205    
1206    /*
1207     * gui_input_down: recall next command or move to next DCC in list
1208     */
1209    
1210    void
1211    gui_input_down ()
1212    {
1213        if (gui_current_window->buffer->dcc)
1214        {
1215            if (dcc_list)
1216            {
1217                if (!gui_current_window->dcc_selected
1218                    || ((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc)
1219                {
1220                    if (gui_current_window->dcc_last_displayed
1221                        && (gui_current_window->dcc_selected ==
1222                            gui_current_window->dcc_last_displayed))
1223                    {
1224                        if (gui_current_window->dcc_first)
1225                            gui_current_window->dcc_first =
1226                                ((t_irc_dcc *)(gui_current_window->dcc_first))->next_dcc;
1227                        else
1228                            gui_current_window->dcc_first =
1229                                dcc_list->next_dcc;
1230                    }
1231                    if (gui_current_window->dcc_selected)
1232                        gui_current_window->dcc_selected =
1233                            ((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc;
1234                    else
1235                        gui_current_window->dcc_selected =
1236                            dcc_list->next_dcc;
1237                    gui_draw_buffer_chat (gui_current_window->buffer, 1);
1238                    gui_draw_buffer_input (gui_current_window->buffer, 1);
1239                }
1240            }
1241        }
1242        else
1243        {
1244            if (gui_current_window->buffer->ptr_history)
1245            {
1246                gui_current_window->buffer->ptr_history =
1247                    gui_current_window->buffer->ptr_history->prev_history;
1248                if (gui_current_window->buffer->ptr_history)
1249                    gui_current_window->buffer->input_buffer_size =
1250                        strlen (gui_current_window->buffer->ptr_history->text);
1251                else
1252                    gui_current_window->buffer->input_buffer_size = 0;
1253                gui_input_optimize_buffer_size (gui_current_window->buffer);
1254                gui_current_window->buffer->input_buffer_pos =
1255                    gui_current_window->buffer->input_buffer_size;
1256                if (gui_current_window->buffer->ptr_history)
1257                    strcpy (gui_current_window->buffer->input_buffer,
1258                            gui_current_window->buffer->ptr_history->text);
1259                gui_draw_buffer_input (gui_current_window->buffer, 0);
1260            }
1261        }
1262    }
1263    
1264    /*
1265     * gui_input_jump_smart: jump to buffer with activity (alt-A by default)
1266     */
1267    
1268    void
1269    gui_input_jump_smart ()
1270    {
1271        if (hotlist)
1272        {
1273            if (!hotlist_initial_buffer)
1274                hotlist_initial_buffer = gui_current_window->buffer;
1275            gui_switch_to_buffer (gui_current_window, hotlist->buffer);
1276            gui_redraw_buffer (gui_current_window->buffer);
1277        }
1278        else
1279        {
1280            if (hotlist_initial_buffer)
1281            {
1282                gui_switch_to_buffer (gui_current_window, hotlist_initial_buffer);
1283                gui_redraw_buffer (gui_current_window->buffer);
1284                hotlist_initial_buffer = NULL;
1285            }
1286        }
1287    }
1288    
1289    /*
1290     * gui_input_jump_dcc: jump to DCC buffer
1291     */
1292    
1293    void
1294    gui_input_jump_dcc ()
1295    {
1296        if (gui_current_window->buffer->dcc)
1297        {
1298            if (buffer_before_dcc)
1299            {
1300                gui_switch_to_buffer (gui_current_window,
1301                                      buffer_before_dcc);
1302                gui_redraw_buffer (gui_current_window->buffer);
1303            }
1304        }
1305        else
1306        {
1307            buffer_before_dcc = gui_current_window->buffer;
1308            gui_switch_to_dcc_buffer ();
1309        }
1310    }
1311    
1312    /*
1313     * gui_input_jump_server: jump to server buffer
1314     */
1315    
1316    void
1317    gui_input_jump_server ()
1318    {
1319        if (!gui_current_window->buffer->dcc)
1320        {
1321            if (SERVER(gui_current_window->buffer)->buffer !=
1322                gui_current_window->buffer)
1323            {
1324                gui_switch_to_buffer (gui_current_window,
1325                                      SERVER(gui_current_window->buffer)->buffer);
1326                gui_redraw_buffer (gui_current_window->buffer);
1327            }
1328        }
1329    }
1330    
1331    /*
1332     * gui_input_jump_next_server: jump to next server
1333     */
1334    
1335    void
1336    gui_input_jump_next_server ()
1337    {
1338        t_irc_server *ptr_server;
1339        t_gui_buffer *ptr_buffer;
1340            
1341      length = strlen (string);      if (!gui_current_window->buffer->dcc)
1342        {
1343            ptr_server = SERVER(gui_current_window->buffer)->next_server;
1344            if (!ptr_server)
1345                ptr_server = irc_servers;
1346            while (ptr_server != SERVER(gui_current_window->buffer))
1347            {
1348                if (ptr_server->buffer)
1349                    break;
1350                ptr_server = (ptr_server->next_server) ?
1351                    ptr_server->next_server : irc_servers;
1352            }
1353            if (ptr_server != SERVER(gui_current_window->buffer))
1354            {
1355                ptr_buffer = (ptr_server->channels) ?
1356                    ptr_server->channels->buffer : ptr_server->buffer;
1357                gui_switch_to_buffer (gui_current_window, ptr_buffer);
1358                gui_redraw_buffer (gui_current_window->buffer);
1359            }
1360        }
1361    }
1362    
1363    /*
1364     * gui_input_hotlist_clear: clear hotlist
1365     */
1366    
1367    void
1368    gui_input_hotlist_clear ()
1369    {
1370        if (hotlist)
1371        {
1372            hotlist_free_all ();
1373            gui_redraw_buffer (gui_current_window->buffer);
1374        }
1375        hotlist_initial_buffer = gui_current_window->buffer;
1376    }
1377    
1378    /*
1379     * gui_input_infobar_clear: clear infobar
1380     */
1381    
1382    void
1383    gui_input_infobar_clear ()
1384    {
1385        gui_infobar_remove ();
1386        gui_draw_buffer_infobar (gui_current_window->buffer, 1);
1387    }
1388    
1389    /*
1390     * gui_switch_to_previous_buffer: switch to previous buffer
1391     */
1392    
1393    void
1394    gui_switch_to_previous_buffer ()
1395    {
1396        if (!gui_ok)
1397            return;
1398            
1399      /* increase buffer size */      /* if only one buffer then return */
1400      buffer->input_buffer_size += length;      if (gui_buffers == last_gui_buffer)
1401      gui_optimize_input_buffer_size (buffer);          return;
     buffer->input_buffer[buffer->input_buffer_size] = '\0';  
1402            
1403      /* move end of string to the right */      if (gui_current_window->buffer->prev_buffer)
1404      start = pos + length;          gui_switch_to_buffer (gui_current_window, gui_current_window->buffer->prev_buffer);
1405      end = buffer->input_buffer_size - 1;      else
1406      for (i = end; i >= start; i--)          gui_switch_to_buffer (gui_current_window, last_gui_buffer);
          buffer->input_buffer[i] =  
          buffer->input_buffer[i - length];  
1407            
1408      /* insert new string */      gui_redraw_buffer (gui_current_window->buffer);
1409      strncpy (buffer->input_buffer + pos, string, length);  }
1410    
1411    /*
1412     * gui_switch_to_next_buffer: switch to next buffer
1413     */
1414    
1415    void
1416    gui_switch_to_next_buffer ()
1417    {
1418        if (!gui_ok)
1419            return;
1420        
1421        /* if only one buffer then return */
1422        if (gui_buffers == last_gui_buffer)
1423            return;
1424        
1425        if (gui_current_window->buffer->next_buffer)
1426            gui_switch_to_buffer (gui_current_window, gui_current_window->buffer->next_buffer);
1427        else
1428            gui_switch_to_buffer (gui_current_window, gui_buffers);
1429        
1430        gui_redraw_buffer (gui_current_window->buffer);
1431    }
1432    
1433    /*
1434     * gui_switch_to_previous_window: switch to previous window
1435     */
1436    
1437    void
1438    gui_switch_to_previous_window ()
1439    {
1440        if (!gui_ok)
1441            return;
1442        
1443        /* if only one window then return */
1444        if (gui_windows == last_gui_window)
1445            return;
1446        
1447        gui_current_window = (gui_current_window->prev_window) ? gui_current_window->prev_window : last_gui_window;
1448        gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
1449        gui_redraw_buffer (gui_current_window->buffer);
1450    }
1451    
1452    /*
1453     * gui_switch_to_next_window: switch to next window
1454     */
1455    
1456    void
1457    gui_switch_to_next_window ()
1458    {
1459        if (!gui_ok)
1460            return;
1461        
1462        /* if only one window then return */
1463        if (gui_windows == last_gui_window)
1464            return;
1465        
1466        gui_current_window = (gui_current_window->next_window) ? gui_current_window->next_window : gui_windows;
1467        gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
1468        gui_redraw_buffer (gui_current_window->buffer);
1469  }  }
1470    
1471  /*  /*
# Line 716  gui_switch_to_buffer_by_number (t_gui_wi Line 1477  gui_switch_to_buffer_by_number (t_gui_wi
1477  {  {
1478      t_gui_buffer *ptr_buffer;      t_gui_buffer *ptr_buffer;
1479            
1480        /* invalid buffer */
1481        if (number < 0)
1482            return NULL;
1483        
1484      /* buffer is currently displayed ? */      /* buffer is currently displayed ? */
1485      if (number == window->buffer->number)      if (number == window->buffer->number)
1486          return window->buffer;          return window->buffer;

Legend:
Removed from v.1.39  
changed lines
  Added in v.1.40

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