Blame


1 ed7c8e8d 2003-09-30 devnull #include <u.h>
2 ed7c8e8d 2003-09-30 devnull #include <libc.h>
3 ed7c8e8d 2003-09-30 devnull #include <draw.h>
4 ed7c8e8d 2003-09-30 devnull
5 ed7c8e8d 2003-09-30 devnull typedef struct Memimage Memimage;
6 ed7c8e8d 2003-09-30 devnull
7 ed7c8e8d 2003-09-30 devnull static int screenid;
8 ed7c8e8d 2003-09-30 devnull
9 ed7c8e8d 2003-09-30 devnull Screen*
10 ed7c8e8d 2003-09-30 devnull allocscreen(Image *image, Image *fill, int public)
11 ed7c8e8d 2003-09-30 devnull {
12 ed7c8e8d 2003-09-30 devnull uchar *a;
13 ed7c8e8d 2003-09-30 devnull Screen *s;
14 ed7c8e8d 2003-09-30 devnull int id, try;
15 ed7c8e8d 2003-09-30 devnull Display *d;
16 ed7c8e8d 2003-09-30 devnull
17 ed7c8e8d 2003-09-30 devnull d = image->display;
18 ed7c8e8d 2003-09-30 devnull if(d != fill->display){
19 ed7c8e8d 2003-09-30 devnull werrstr("allocscreen: image and fill on different displays");
20 ed7c8e8d 2003-09-30 devnull return 0;
21 ed7c8e8d 2003-09-30 devnull }
22 ed7c8e8d 2003-09-30 devnull s = malloc(sizeof(Screen));
23 ed7c8e8d 2003-09-30 devnull if(s == 0)
24 ed7c8e8d 2003-09-30 devnull return 0;
25 ed7c8e8d 2003-09-30 devnull SET(id);
26 ed7c8e8d 2003-09-30 devnull for(try=0; try<25; try++){
27 ed7c8e8d 2003-09-30 devnull /* loop until find a free id */
28 ed7c8e8d 2003-09-30 devnull a = bufimage(d, 1+4+4+4+1);
29 ed7c8e8d 2003-09-30 devnull if(a == 0){
30 ed7c8e8d 2003-09-30 devnull free(s);
31 ed7c8e8d 2003-09-30 devnull return 0;
32 ed7c8e8d 2003-09-30 devnull }
33 ed7c8e8d 2003-09-30 devnull id = ++screenid;
34 ed7c8e8d 2003-09-30 devnull a[0] = 'A';
35 ed7c8e8d 2003-09-30 devnull BPLONG(a+1, id);
36 ed7c8e8d 2003-09-30 devnull BPLONG(a+5, image->id);
37 ed7c8e8d 2003-09-30 devnull BPLONG(a+9, fill->id);
38 ed7c8e8d 2003-09-30 devnull a[13] = public;
39 ed7c8e8d 2003-09-30 devnull if(flushimage(d, 0) != -1)
40 ed7c8e8d 2003-09-30 devnull break;
41 ed7c8e8d 2003-09-30 devnull }
42 ed7c8e8d 2003-09-30 devnull s->display = d;
43 ed7c8e8d 2003-09-30 devnull s->id = id;
44 ed7c8e8d 2003-09-30 devnull s->image = image;
45 ed7c8e8d 2003-09-30 devnull assert(s->image && s->image->chan != 0);
46 ed7c8e8d 2003-09-30 devnull
47 ed7c8e8d 2003-09-30 devnull s->fill = fill;
48 ed7c8e8d 2003-09-30 devnull return s;
49 ed7c8e8d 2003-09-30 devnull }
50 ed7c8e8d 2003-09-30 devnull
51 ed7c8e8d 2003-09-30 devnull Screen*
52 ed7c8e8d 2003-09-30 devnull publicscreen(Display *d, int id, u32int chan)
53 ed7c8e8d 2003-09-30 devnull {
54 ed7c8e8d 2003-09-30 devnull uchar *a;
55 ed7c8e8d 2003-09-30 devnull Screen *s;
56 ed7c8e8d 2003-09-30 devnull
57 ed7c8e8d 2003-09-30 devnull s = malloc(sizeof(Screen));
58 ed7c8e8d 2003-09-30 devnull if(s == 0)
59 ed7c8e8d 2003-09-30 devnull return 0;
60 ed7c8e8d 2003-09-30 devnull a = bufimage(d, 1+4+4);
61 ed7c8e8d 2003-09-30 devnull if(a == 0){
62 ed7c8e8d 2003-09-30 devnull Error:
63 ed7c8e8d 2003-09-30 devnull free(s);
64 ed7c8e8d 2003-09-30 devnull return 0;
65 ed7c8e8d 2003-09-30 devnull }
66 ed7c8e8d 2003-09-30 devnull a[0] = 'S';
67 ed7c8e8d 2003-09-30 devnull BPLONG(a+1, id);
68 ed7c8e8d 2003-09-30 devnull BPLONG(a+5, chan);
69 ed7c8e8d 2003-09-30 devnull if(flushimage(d, 0) < 0)
70 ed7c8e8d 2003-09-30 devnull goto Error;
71 ed7c8e8d 2003-09-30 devnull
72 ed7c8e8d 2003-09-30 devnull s->display = d;
73 ed7c8e8d 2003-09-30 devnull s->id = id;
74 ed7c8e8d 2003-09-30 devnull s->image = 0;
75 ed7c8e8d 2003-09-30 devnull s->fill = 0;
76 ed7c8e8d 2003-09-30 devnull return s;
77 ed7c8e8d 2003-09-30 devnull }
78 ed7c8e8d 2003-09-30 devnull
79 ed7c8e8d 2003-09-30 devnull int
80 ed7c8e8d 2003-09-30 devnull freescreen(Screen *s)
81 ed7c8e8d 2003-09-30 devnull {
82 ed7c8e8d 2003-09-30 devnull uchar *a;
83 ed7c8e8d 2003-09-30 devnull Display *d;
84 ed7c8e8d 2003-09-30 devnull
85 ed7c8e8d 2003-09-30 devnull if(s == 0)
86 ed7c8e8d 2003-09-30 devnull return 0;
87 ed7c8e8d 2003-09-30 devnull d = s->display;
88 ed7c8e8d 2003-09-30 devnull a = bufimage(d, 1+4);
89 ed7c8e8d 2003-09-30 devnull if(a == 0)
90 ed7c8e8d 2003-09-30 devnull return -1;
91 ed7c8e8d 2003-09-30 devnull a[0] = 'F';
92 ed7c8e8d 2003-09-30 devnull BPLONG(a+1, s->id);
93 ed7c8e8d 2003-09-30 devnull /*
94 ed7c8e8d 2003-09-30 devnull * flush(1) because screen is likely holding last reference to
95 ed7c8e8d 2003-09-30 devnull * window, and want it to disappear visually.
96 ed7c8e8d 2003-09-30 devnull */
97 ed7c8e8d 2003-09-30 devnull if(flushimage(d, 1) < 0)
98 ed7c8e8d 2003-09-30 devnull return -1;
99 ed7c8e8d 2003-09-30 devnull free(s);
100 ed7c8e8d 2003-09-30 devnull return 1;
101 ed7c8e8d 2003-09-30 devnull }
102 ed7c8e8d 2003-09-30 devnull
103 ed7c8e8d 2003-09-30 devnull Image*
104 ed7c8e8d 2003-09-30 devnull allocwindow(Screen *s, Rectangle r, int ref, u32int val)
105 ed7c8e8d 2003-09-30 devnull {
106 ed7c8e8d 2003-09-30 devnull return _allocwindow(nil, s, r, ref, val);
107 ed7c8e8d 2003-09-30 devnull }
108 ed7c8e8d 2003-09-30 devnull
109 ed7c8e8d 2003-09-30 devnull Image*
110 ed7c8e8d 2003-09-30 devnull _allocwindow(Image *i, Screen *s, Rectangle r, int ref, u32int val)
111 ed7c8e8d 2003-09-30 devnull {
112 ed7c8e8d 2003-09-30 devnull Display *d;
113 ed7c8e8d 2003-09-30 devnull
114 ed7c8e8d 2003-09-30 devnull d = s->display;
115 ed7c8e8d 2003-09-30 devnull i = _allocimage(i, d, r, d->screenimage->chan, 0, val, s->id, ref);
116 ed7c8e8d 2003-09-30 devnull if(i == 0)
117 ed7c8e8d 2003-09-30 devnull return 0;
118 ed7c8e8d 2003-09-30 devnull i->screen = s;
119 ed7c8e8d 2003-09-30 devnull i->next = s->display->windows;
120 ed7c8e8d 2003-09-30 devnull s->display->windows = i;
121 ed7c8e8d 2003-09-30 devnull return i;
122 ed7c8e8d 2003-09-30 devnull }
123 ed7c8e8d 2003-09-30 devnull
124 ed7c8e8d 2003-09-30 devnull static
125 ed7c8e8d 2003-09-30 devnull void
126 ed7c8e8d 2003-09-30 devnull topbottom(Image **w, int n, int top)
127 ed7c8e8d 2003-09-30 devnull {
128 ed7c8e8d 2003-09-30 devnull int i;
129 ed7c8e8d 2003-09-30 devnull uchar *b;
130 ed7c8e8d 2003-09-30 devnull Display *d;
131 ed7c8e8d 2003-09-30 devnull
132 ed7c8e8d 2003-09-30 devnull if(n < 0){
133 ed7c8e8d 2003-09-30 devnull Ridiculous:
134 ed7c8e8d 2003-09-30 devnull fprint(2, "top/bottom: ridiculous number of windows\n");
135 ed7c8e8d 2003-09-30 devnull return;
136 ed7c8e8d 2003-09-30 devnull }
137 ed7c8e8d 2003-09-30 devnull if(n == 0)
138 ed7c8e8d 2003-09-30 devnull return;
139 ed7c8e8d 2003-09-30 devnull if(n > (w[0]->display->bufsize-100)/4)
140 ed7c8e8d 2003-09-30 devnull goto Ridiculous;
141 ed7c8e8d 2003-09-30 devnull /*
142 ed7c8e8d 2003-09-30 devnull * this used to check that all images were on the same screen.
143 ed7c8e8d 2003-09-30 devnull * we don't know the screen associated with images we acquired
144 ed7c8e8d 2003-09-30 devnull * by name. instead, check that all images are on the same display.
145 ed7c8e8d 2003-09-30 devnull * the display will check that they are all on the same screen.
146 ed7c8e8d 2003-09-30 devnull */
147 ed7c8e8d 2003-09-30 devnull d = w[0]->display;
148 ed7c8e8d 2003-09-30 devnull for(i=1; i<n; i++)
149 ed7c8e8d 2003-09-30 devnull if(w[i]->display != d){
150 ed7c8e8d 2003-09-30 devnull fprint(2, "top/bottom: windows not on same screen\n");
151 ed7c8e8d 2003-09-30 devnull return;
152 ed7c8e8d 2003-09-30 devnull }
153 ed7c8e8d 2003-09-30 devnull
154 ed7c8e8d 2003-09-30 devnull if(n==0)
155 ed7c8e8d 2003-09-30 devnull return;
156 ed7c8e8d 2003-09-30 devnull b = bufimage(d, 1+1+2+4*n);
157 ed7c8e8d 2003-09-30 devnull b[0] = 't';
158 ed7c8e8d 2003-09-30 devnull b[1] = top;
159 ed7c8e8d 2003-09-30 devnull BPSHORT(b+2, n);
160 ed7c8e8d 2003-09-30 devnull for(i=0; i<n; i++)
161 ed7c8e8d 2003-09-30 devnull BPLONG(b+4+4*i, w[i]->id);
162 ed7c8e8d 2003-09-30 devnull }
163 ed7c8e8d 2003-09-30 devnull
164 ed7c8e8d 2003-09-30 devnull void
165 ed7c8e8d 2003-09-30 devnull bottomwindow(Image *w)
166 ed7c8e8d 2003-09-30 devnull {
167 ed7c8e8d 2003-09-30 devnull if(w->screen == 0)
168 ed7c8e8d 2003-09-30 devnull return;
169 ed7c8e8d 2003-09-30 devnull topbottom(&w, 1, 0);
170 ed7c8e8d 2003-09-30 devnull }
171 ed7c8e8d 2003-09-30 devnull
172 ed7c8e8d 2003-09-30 devnull void
173 ed7c8e8d 2003-09-30 devnull topwindow(Image *w)
174 ed7c8e8d 2003-09-30 devnull {
175 ed7c8e8d 2003-09-30 devnull if(w->screen == 0)
176 ed7c8e8d 2003-09-30 devnull return;
177 ed7c8e8d 2003-09-30 devnull topbottom(&w, 1, 1);
178 ed7c8e8d 2003-09-30 devnull }
179 ed7c8e8d 2003-09-30 devnull
180 ed7c8e8d 2003-09-30 devnull void
181 ed7c8e8d 2003-09-30 devnull bottomnwindows(Image **w, int n)
182 ed7c8e8d 2003-09-30 devnull {
183 ed7c8e8d 2003-09-30 devnull topbottom(w, n, 0);
184 ed7c8e8d 2003-09-30 devnull }
185 ed7c8e8d 2003-09-30 devnull
186 ed7c8e8d 2003-09-30 devnull void
187 ed7c8e8d 2003-09-30 devnull topnwindows(Image **w, int n)
188 ed7c8e8d 2003-09-30 devnull {
189 ed7c8e8d 2003-09-30 devnull topbottom(w, n, 1);
190 ed7c8e8d 2003-09-30 devnull }
191 ed7c8e8d 2003-09-30 devnull
192 ed7c8e8d 2003-09-30 devnull int
193 ed7c8e8d 2003-09-30 devnull originwindow(Image *w, Point log, Point scr)
194 ed7c8e8d 2003-09-30 devnull {
195 ed7c8e8d 2003-09-30 devnull uchar *b;
196 ed7c8e8d 2003-09-30 devnull Point delta;
197 ed7c8e8d 2003-09-30 devnull
198 ed7c8e8d 2003-09-30 devnull flushimage(w->display, 0);
199 ed7c8e8d 2003-09-30 devnull b = bufimage(w->display, 1+4+2*4+2*4);
200 ed7c8e8d 2003-09-30 devnull if(b == nil)
201 ed7c8e8d 2003-09-30 devnull return 0;
202 ed7c8e8d 2003-09-30 devnull b[0] = 'o';
203 ed7c8e8d 2003-09-30 devnull BPLONG(b+1, w->id);
204 ed7c8e8d 2003-09-30 devnull BPLONG(b+5, log.x);
205 ed7c8e8d 2003-09-30 devnull BPLONG(b+9, log.y);
206 ed7c8e8d 2003-09-30 devnull BPLONG(b+13, scr.x);
207 ed7c8e8d 2003-09-30 devnull BPLONG(b+17, scr.y);
208 ed7c8e8d 2003-09-30 devnull if(flushimage(w->display, 1) < 0)
209 ed7c8e8d 2003-09-30 devnull return -1;
210 ed7c8e8d 2003-09-30 devnull delta = subpt(log, w->r.min);
211 ed7c8e8d 2003-09-30 devnull w->r = rectaddpt(w->r, delta);
212 ed7c8e8d 2003-09-30 devnull w->clipr = rectaddpt(w->clipr, delta);
213 ed7c8e8d 2003-09-30 devnull return 1;
214 ed7c8e8d 2003-09-30 devnull }