sl_loop.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /* ************************************************************************** */
  2. /* */
  3. /* ::: :::::::: */
  4. /* sl_loop.c :+: :+: :+: */
  5. /* +:+ +:+ +:+ */
  6. /* By: bchanot <bchanot@students.42.fr> +#+ +:+ +#+ */
  7. /* +#+#+#+#+#+ +#+ */
  8. /* Created: 2016/11/02 19:11:21 by bchanot #+# #+# */
  9. /* Updated: 2016/11/15 19:20:46 by bchanot ### ########.fr */
  10. /* */
  11. /* ************************************************************************** */
  12. #include "ft_select.h"
  13. #include <term.h>
  14. #include <unistd.h>
  15. #include <sys/ioctl.h>
  16. static void sl_unset_arg(t_inf *inf)
  17. {
  18. char **tmp;
  19. int *ta;
  20. int cpt;
  21. int cpt2;
  22. tmp = (char **)ft_memalloc(sizeof(char *) * (inf->nb));
  23. tmp[inf->nb - 1] = 0;
  24. ta = (int *)ft_memalloc(sizeof(int) * (inf->nb - 1));
  25. cpt = 0;
  26. cpt2 = 0;
  27. while (inf->args[cpt2])
  28. {
  29. if (cpt2 != inf->cur)
  30. {
  31. tmp[cpt] = ft_strdup(inf->args[cpt2]);
  32. ta[cpt] = inf->selected[cpt2];
  33. cpt++;
  34. }
  35. cpt2++;
  36. }
  37. ft_memdel2((void ***)&inf->args);
  38. ft_memdel((void **)&inf->selected);
  39. inf->selected = ta;
  40. inf->args = tmp;
  41. inf->nb--;
  42. }
  43. static void sl_move_cursor(unsigned long buff, t_inf *inf)
  44. {
  45. struct winsize w;
  46. int col;
  47. ioctl(0, TIOCGWINSZ, &w);
  48. col = inf->nb / (w.ws_row - 1) - (!(inf->nb % (w.ws_row - 1)) ? 1 : 0);
  49. if (buff == UP || (buff == LEFT && !col))
  50. inf->cur = inf->cur > 0 ? inf->cur - 1 : inf->nb - 1;
  51. else if (buff == DOWN || (buff == RIGHT && !col))
  52. inf->cur = inf->cur < inf->nb - 1 ? inf->cur + 1 : 0;
  53. else if (buff == RIGHT && inf->cur + (w.ws_row - 1) < inf->nb)
  54. inf->cur += w.ws_row - 1;
  55. else if (buff == RIGHT && inf->cur - (w.ws_row - 1) * col - 1 < inf->nb &&
  56. inf->cur - (((w.ws_row - 1) * col) - 1) >= 0)
  57. inf->cur -= ((w.ws_row - 1) * col) - 1;
  58. else if (buff == RIGHT)
  59. inf->cur -= (w.ws_row - 1) * (col - 1) - 1;
  60. else if (buff == LEFT && inf->cur - (w.ws_row - 1) >= 0)
  61. inf->cur -= w.ws_row - 1;
  62. else if (buff == LEFT && inf->cur + (w.ws_row - 1) * col - 1 < inf->nb &&
  63. inf->cur + ((w.ws_row - 1) * col) - 1 >= 0)
  64. inf->cur += (w.ws_row - 1) * col - 1;
  65. else if (buff == LEFT)
  66. inf->cur += (w.ws_row - 1) * (col - 1) - 1;
  67. }
  68. static void sl_check_input(unsigned long buff, t_inf *inf, int *disp)
  69. {
  70. if (buff == UP || buff == DOWN || buff == RIGHT || buff == LEFT)
  71. sl_move_cursor(buff, inf);
  72. else if (buff == SPACE)
  73. {
  74. inf->selected[inf->cur] = inf->selected[inf->cur] ? 0 : 1;
  75. if (inf->selected[inf->cur])
  76. inf->cur = inf->cur + 1 == inf->nb ? 0 : inf->cur + 1;
  77. }
  78. else if (buff == DELETE || buff == BACKSPACE)
  79. {
  80. sl_unset_arg(inf);
  81. inf->cur = inf->cur == inf->nb ? inf->cur - 1 : inf->cur;
  82. }
  83. else if (buff != ESCAPE && buff != ENTER)
  84. *disp = 0;
  85. }
  86. int sl_launch_loop(t_inf *inf)
  87. {
  88. unsigned long buff;
  89. int disp;
  90. buff = 0;
  91. sl_display_screen(inf);
  92. while (read(0, &buff, 6) != 0)
  93. {
  94. disp = 1;
  95. sl_check_input(buff, inf, &disp);
  96. if (buff == ESCAPE || buff == ENTER || !inf->nb)
  97. break ;
  98. if (disp)
  99. sl_display_screen(inf);
  100. buff = 0;
  101. }
  102. ft_putstr_fd(tgetstr("cl", NULL), 0);
  103. inf->term.c_lflag |= (ICANON | ECHO);
  104. tcsetattr(0, 0, &inf->term);
  105. ft_putstr_fd(tgetstr("te", NULL), 0);
  106. ft_putstr_fd(tgetstr("ve", NULL), 0);
  107. return (buff == ESCAPE || !inf->nb ? 0 : 1);
  108. }