ltorear.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. #include <memdraw.h>
  5. #include <memlayer.h>
  6. void
  7. _memltorear(Memimage *i, Memimage *rear)
  8. {
  9. Memlayer *l;
  10. Memscreen *s;
  11. Memimage *f, *r, *rr;
  12. Rectangle x;
  13. int overlap;
  14. l = i->layer;
  15. s = l->screen;
  16. while(l->rear != rear){
  17. r = l->rear;
  18. x = l->screenr;
  19. overlap = rectclip(&x, r->layer->screenr);
  20. if(overlap){
  21. memlhide(i, x);
  22. l->clear = 0;
  23. }
  24. /* swap l and r in screen's list */
  25. rr = r->layer->rear;
  26. f = l->front;
  27. if(rr == nil)
  28. s->rearmost = i;
  29. else
  30. rr->layer->front = i;
  31. if(f == nil)
  32. s->frontmost = r;
  33. else
  34. f->layer->rear = r;
  35. l->rear = rr;
  36. l->front = r;
  37. r->layer->rear = i;
  38. r->layer->front = f;
  39. if(overlap)
  40. memlexpose(r, x);
  41. }
  42. }
  43. void
  44. memltorear(Memimage *i)
  45. {
  46. _memltorear(i, nil);
  47. _memlsetclear(i->layer->screen);
  48. }
  49. void
  50. memltorearn(Memimage **ip, int n)
  51. {
  52. Memimage *i, *rear;
  53. Memscreen *s;
  54. if(n == 0)
  55. return;
  56. rear = nil;
  57. while(--n >= 0){
  58. i = *ip++;
  59. _memltorear(i, rear);
  60. rear = i;
  61. }
  62. s = rear->layer->screen;
  63. _memlsetclear(s);
  64. }