ldelete.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "lib9.h"
  2. #include "draw.h"
  3. #include "memdraw.h"
  4. #include "memlayer.h"
  5. void
  6. memldelete(Memimage *i)
  7. {
  8. Memscreen *s;
  9. Memlayer *l;
  10. l = i->layer;
  11. /* free backing store and disconnect refresh, to make pushback fast */
  12. freememimage(l->save);
  13. l->save = nil;
  14. l->refreshptr = nil;
  15. memltorear(i);
  16. /* window is now the rearmost; clean up screen structures and deallocate */
  17. s = i->layer->screen;
  18. if(s->fill){
  19. i->clipr = i->r;
  20. memdraw(i, i->r, s->fill, i->r.min, nil, i->r.min, S);
  21. }
  22. if(l->front){
  23. l->front->layer->rear = nil;
  24. s->rearmost = l->front;
  25. }else{
  26. s->frontmost = nil;
  27. s->rearmost = nil;
  28. }
  29. free(l);
  30. freememimage(i);
  31. }
  32. /*
  33. * Just free the data structures, don't do graphics
  34. */
  35. void
  36. memlfree(Memimage *i)
  37. {
  38. Memlayer *l;
  39. l = i->layer;
  40. freememimage(l->save);
  41. free(l);
  42. freememimage(i);
  43. }
  44. void
  45. _memlsetclear(Memscreen *s)
  46. {
  47. Memimage *i, *j;
  48. Memlayer *l;
  49. for(i=s->rearmost; i; i=i->layer->front){
  50. l = i->layer;
  51. l->clear = rectinrect(l->screenr, l->screen->image->clipr);
  52. if(l->clear)
  53. for(j=l->front; j; j=j->layer->front)
  54. if(rectXrect(l->screenr, j->layer->screenr)){
  55. l->clear = 0;
  56. break;
  57. }
  58. }
  59. }