ltofront.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "lib9.h"
  2. #include "draw.h"
  3. #include "memdraw.h"
  4. #include "memlayer.h"
  5. #include "pool.h"
  6. /*
  7. * Pull i towards top of screen, just behind front
  8. */
  9. static
  10. void
  11. _memltofront(Memimage *i, Memimage *front, int fill)
  12. {
  13. Memlayer *l;
  14. Memscreen *s;
  15. Memimage *f, *ff, *rr;
  16. Rectangle x;
  17. int overlap;
  18. l = i->layer;
  19. s = l->screen;
  20. while(l->front != front){
  21. f = l->front;
  22. x = l->screenr;
  23. overlap = rectclip(&x, f->layer->screenr);
  24. if(overlap){
  25. memlhide(f, x);
  26. f->layer->clear = 0;
  27. }
  28. /* swap l and f in screen's list */
  29. ff = f->layer->front;
  30. rr = l->rear;
  31. if(ff == nil)
  32. s->frontmost = i;
  33. else
  34. ff->layer->rear = i;
  35. if(rr == nil)
  36. s->rearmost = f;
  37. else
  38. rr->layer->front = f;
  39. l->front = ff;
  40. l->rear = f;
  41. f->layer->front = i;
  42. f->layer->rear = rr;
  43. if(overlap && fill)
  44. memlexpose(i, x);
  45. }
  46. }
  47. void
  48. _memltofrontfill(Memimage *i, int fill)
  49. {
  50. _memltofront(i, nil, fill);
  51. _memlsetclear(i->layer->screen);
  52. }
  53. void
  54. memltofront(Memimage *i)
  55. {
  56. _memltofront(i, nil, 1);
  57. _memlsetclear(i->layer->screen);
  58. }
  59. void
  60. memltofrontn(Memimage **ip, int n)
  61. {
  62. Memimage *i, *front;
  63. Memscreen *s;
  64. if(n == 0)
  65. return;
  66. front = nil;
  67. while(--n >= 0){
  68. i = *ip++;
  69. _memltofront(i, front, 1);
  70. front = i;
  71. }
  72. s = front->layer->screen;
  73. _memlsetclear(s);
  74. }