sl_screen.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /* ************************************************************************** */
  2. /* */
  3. /* ::: :::::::: */
  4. /* sl_screen.c :+: :+: :+: */
  5. /* +:+ +:+ +:+ */
  6. /* By: bchanot <bchanot@students.42.fr> +#+ +:+ +#+ */
  7. /* +#+#+#+#+#+ +#+ */
  8. /* Created: 2016/11/02 19:41:12 by bchanot #+# #+# */
  9. /* Updated: 2016/11/17 02:41:24 by bchanot ### ########.fr */
  10. /* */
  11. /* ************************************************************************** */
  12. #include "ft_select.h"
  13. #include <term.h>
  14. #include <sys/ioctl.h>
  15. static int sl_take_max(t_inf *inf)
  16. {
  17. int len;
  18. int cpt;
  19. len = ft_strlen(inf->args[0]);
  20. cpt = 1;
  21. while (inf->args[cpt])
  22. {
  23. if (len < (int)ft_strlen(inf->args[cpt]))
  24. len = ft_strlen(inf->args[cpt]);
  25. cpt++;
  26. }
  27. return (len);
  28. }
  29. static void sl_turn_on_off(t_inf *inf, int disp, int bool)
  30. {
  31. if (bool)
  32. {
  33. if (inf->selected[disp])
  34. ft_putstr_fd(tgetstr("so", NULL), 0);
  35. if (disp == inf->cur)
  36. ft_putstr_fd(tgetstr("us", NULL), 0);
  37. return ;
  38. }
  39. if (inf->selected[disp])
  40. ft_putstr_fd(tgetstr("se", NULL), 0);
  41. if (disp == inf->cur)
  42. ft_putstr_fd(tgetstr("ue", NULL), 0);
  43. }
  44. void sl_display_screen(t_inf *inf)
  45. {
  46. int cpt;
  47. int disp;
  48. int cpt2;
  49. int len;
  50. struct winsize w;
  51. ioctl(0, TIOCGWINSZ, &w);
  52. ft_putstr_fd(tgetstr("cl", NULL), 0);
  53. if (((inf->nb / (w.ws_row - 1)) + (inf->nb % (w.ws_row - 1) ? 1 : 0)) *
  54. (sl_take_max(inf) + 1) >= w.ws_col || (cpt = -1) == 0)
  55. return (ft_putstr_fd("/!\\\n", 0));
  56. while (++cpt < inf->nb && cpt < w.ws_row - 1)
  57. {
  58. cpt2 = -1;
  59. while (((disp = ((w.ws_row - 1) * ++cpt2) + cpt)) < inf->nb)
  60. {
  61. sl_turn_on_off(inf, disp, 1);
  62. ft_putstr_fd(inf->args[disp], 0);
  63. sl_turn_on_off(inf, disp, 0);
  64. len = ft_strlen(inf->args[disp]);
  65. while (++len <= sl_take_max(inf) + 1)
  66. ft_putchar_fd(' ', 0);
  67. }
  68. ft_putchar_fd('\n', 0);
  69. }
  70. }