ltofront.c 1.3 KB

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