ltofront.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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)
  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)
  45. memlexpose(i, x);
  46. }
  47. }
  48. void
  49. memltofront(Memimage *i)
  50. {
  51. _memltofront(i, nil);
  52. _memlsetclear(i->layer->screen);
  53. }
  54. void
  55. memltofrontn(Memimage **ip, int n)
  56. {
  57. Memimage *i, *front;
  58. Memscreen *s;
  59. if(n == 0)
  60. return;
  61. front = nil;
  62. while(--n >= 0){
  63. i = *ip++;
  64. _memltofront(i, front);
  65. front = i;
  66. }
  67. s = front->layer->screen;
  68. _memlsetclear(s);
  69. }