tatami.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. void
  2. tatami(Monitor *m) {
  3. unsigned int i, n, nx, ny, nw, nh,
  4. mats, tc,
  5. tnx, tny, tnw, tnh;
  6. Client *c;
  7. for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), ++n);
  8. if(n == 0)
  9. return;
  10. nx = m->wx;
  11. ny = 0;
  12. nw = m->ww;
  13. nh = m->wh;
  14. c = nexttiled(m->clients);
  15. if(n != 1) nw = m->ww * m->mfact;
  16. ny = m->wy;
  17. resize(c, nx, ny, nw - 2 * c->bw, nh - 2 * c->bw, False);
  18. c = nexttiled(c->next);
  19. nx += nw;
  20. nw = m->ww - nw;
  21. if(n>1)
  22. {
  23. tc = n-1;
  24. mats = tc/5;
  25. nh/=(mats + (tc % 5 > 0));
  26. for(i = 0; c && (i < (tc % 5)); c = nexttiled(c->next))
  27. {
  28. tnw=nw;
  29. tnx=nx;
  30. tnh=nh;
  31. tny=ny;
  32. switch(tc - (mats*5))
  33. {
  34. case 1://fill
  35. break;
  36. case 2://up and down
  37. if((i % 5) == 0) //up
  38. tnh/=2;
  39. else if((i % 5) == 1) //down
  40. {
  41. tnh/=2;
  42. tny += nh/2;
  43. }
  44. break;
  45. case 3://bottom, up-left and up-right
  46. if((i % 5) == 0) //up-left
  47. {
  48. tnw = nw/2;
  49. tnh = (2*nh)/3;
  50. }
  51. else if((i % 5) == 1)//up-right
  52. {
  53. tnx += nw/2;
  54. tnw = nw/2;
  55. tnh = (2*nh)/3;
  56. }
  57. else if((i % 5) == 2)//bottom
  58. {
  59. tnh = nh/3;
  60. tny += (2*nh)/3;
  61. }
  62. break;
  63. case 4://bottom, left, right and top
  64. if((i % 5) == 0) //top
  65. {
  66. tnh = (nh)/4;
  67. }
  68. else if((i % 5) == 1)//left
  69. {
  70. tnw = nw/2;
  71. tny += nh/4;
  72. tnh = (nh)/2;
  73. }
  74. else if((i % 5) == 2)//right
  75. {
  76. tnx += nw/2;
  77. tnw = nw/2;
  78. tny += nh/4;
  79. tnh = (nh)/2;
  80. }
  81. else if((i % 5) == 3)//bottom
  82. {
  83. tny += (3*nh)/4;
  84. tnh = (nh)/4;
  85. }
  86. break;
  87. }
  88. ++i;
  89. resize(c, tnx, tny, tnw - 2 * c->bw, tnh - 2 * c->bw, False);
  90. }
  91. ++mats;
  92. for(i = 0; c && (mats>0); c = nexttiled(c->next)) {
  93. if((i%5)==0)
  94. {
  95. --mats;
  96. if(((tc % 5) > 0)||(i>=5))
  97. ny+=nh;
  98. }
  99. tnw=nw;
  100. tnx=nx;
  101. tnh=nh;
  102. tny=ny;
  103. switch(i % 5)
  104. {
  105. case 0: //top-left-vert
  106. tnw = (nw)/3;
  107. tnh = (nh*2)/3;
  108. break;
  109. case 1: //top-right-hor
  110. tnx += (nw)/3;
  111. tnw = (nw*2)/3;
  112. tnh = (nh)/3;
  113. break;
  114. case 2: //center
  115. tnx += (nw)/3;
  116. tnw = (nw)/3;
  117. tny += (nh)/3;
  118. tnh = (nh)/3;
  119. break;
  120. case 3: //bottom-right-vert
  121. tnx += (nw*2)/3;
  122. tnw = (nw)/3;
  123. tny += (nh)/3;
  124. tnh = (nh*2)/3;
  125. break;
  126. case 4: //(oldest) bottom-left-hor
  127. tnw = (2*nw)/3;
  128. tny += (2*nh)/3;
  129. tnh = (nh)/3;
  130. break;
  131. default:
  132. break;
  133. }
  134. ++i;
  135. //i%=5;
  136. resize(c, tnx, tny, tnw - 2 * c->bw, tnh - 2 * c->bw, False);
  137. }
  138. }
  139. }