77 XSendEvent(dpy, c->win, True, NoEventMask, &synev); |
77 XSendEvent(dpy, c->win, True, NoEventMask, &synev); |
78 } |
78 } |
79 |
79 |
80 void |
80 void |
81 focus(Client *c) { |
81 focus(Client *c) { |
82 Client *old; |
82 Client *old = sel; |
83 |
83 |
84 if(!issel || (c && !isvisible(c))) |
84 if(!issel || (c && !isvisible(c))) |
85 return; |
85 return; |
86 if(!sel) |
86 |
87 sel = c; |
87 if(old && old != c) { |
88 else if(sel != c) { |
88 grabbuttons(old, False); |
89 old = sel; |
89 XSetWindowBorder(dpy, old->win, dc.norm[ColBorder]); |
90 sel = c; |
|
91 if(old) { |
|
92 grabbuttons(old, False); |
|
93 XSetWindowBorder(dpy, old->win, dc.norm[ColBorder]); |
|
94 } |
|
95 } |
90 } |
96 if(c) { |
91 if(c) { |
97 detachstack(c); |
92 detachstack(c); |
98 c->snext = stack; |
93 c->snext = stack; |
99 stack = c; |
94 stack = c; |
101 XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]); |
96 XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]); |
102 XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); |
97 XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); |
103 } |
98 } |
104 else |
99 else |
105 XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); |
100 XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); |
|
101 sel = c; |
106 drawstatus(); |
102 drawstatus(); |
107 } |
103 } |
108 |
104 |
109 Client * |
105 Client * |
110 getclient(Window w) { |
106 getclient(Window w) { |
132 Window trans; |
128 Window trans; |
133 |
129 |
134 c = emallocz(sizeof(Client)); |
130 c = emallocz(sizeof(Client)); |
135 c->tags = emallocz(ntags * sizeof(Bool)); |
131 c->tags = emallocz(ntags * sizeof(Bool)); |
136 c->win = w; |
132 c->win = w; |
137 c->border = 0; |
|
138 c->x = wa->x; |
133 c->x = wa->x; |
139 c->y = wa->y; |
134 c->y = wa->y; |
140 c->w = wa->width; |
135 c->w = wa->width; |
141 c->h = wa->height; |
136 c->h = wa->height; |
|
137 if(c->w == sw && c->h == sh) { |
|
138 c->border = 0; |
|
139 c->x = sx; |
|
140 c->y = sy; |
|
141 } |
|
142 else { |
|
143 c->border = BORDERPX; |
|
144 if(c->x < wax) |
|
145 c->x = wax; |
|
146 if(c->y < way) |
|
147 c->y = way; |
|
148 if(c->x + c->w + 2 * c->border > wax + waw) |
|
149 c->x = wax + waw - c->w - 2 * c->border; |
|
150 if(c->y + c->h + 2 * c->border > way + wah) |
|
151 c->y = way + wah - c->h - 2 * c->border; |
|
152 } |
142 updatesizehints(c); |
153 updatesizehints(c); |
143 if(c->x + c->w + 2 * BORDERPX > sw) |
|
144 c->x = sw - c->w - 2 * BORDERPX; |
|
145 if(c->x < sx) |
|
146 c->x = sx; |
|
147 if(c->y + c->h + 2 * BORDERPX > sh) |
|
148 c->y = sh - c->h - 2 * BORDERPX; |
|
149 if(c->h != sh && c->y < bh) |
|
150 c->y = bh; |
|
151 c->proto = getproto(c->win); |
154 c->proto = getproto(c->win); |
152 XSelectInput(dpy, c->win, |
155 XSelectInput(dpy, c->win, |
153 StructureNotifyMask | PropertyChangeMask | EnterWindowMask); |
156 StructureNotifyMask | PropertyChangeMask | EnterWindowMask); |
154 XGetTransientForHint(dpy, c->win, &trans); |
157 XGetTransientForHint(dpy, c->win, &trans); |
155 grabbuttons(c, False); |
158 grabbuttons(c, False); |
187 if(c->maxw && c->w > c->maxw) |
188 if(c->maxw && c->w > c->maxw) |
188 c->w = c->maxw; |
189 c->w = c->maxw; |
189 if(c->maxh && c->h > c->maxh) |
190 if(c->maxh && c->h > c->maxh) |
190 c->h = c->maxh; |
191 c->h = c->maxh; |
191 } |
192 } |
192 if(sticky == TopRight || sticky == BotRight) |
193 if(c->w == sw && c->h == sh) |
193 c->x = right - c->w; |
194 c->border = 0; |
194 if(sticky == BotLeft || sticky == BotRight) |
195 else |
195 c->y = bottom - c->h; |
196 c->border = BORDERPX; |
196 /* offscreen appearance fixes */ |
197 /* offscreen appearance fixes */ |
197 if(c->x + c->w < sx) |
198 if(c->x + c->w + 2 * c->border < sx) |
198 c->x = sx; |
199 c->x = sx; |
199 if(c->y + c->h < bh) |
200 if(c->y + c->h + 2 * c->border < sy) |
200 c->y = bh; |
201 c->y = sy; |
201 if(c->x > sw) |
202 if(c->x > sw) |
202 c->x = sw - c->w; |
203 c->x = sw - c->w - 2 * c->border; |
203 if(c->y > sh) |
204 if(c->y > sh) |
204 c->y = sh - c->h; |
205 c->y = sh - c->h - 2 * c->border; |
205 wc.x = c->x; |
206 wc.x = c->x; |
206 wc.y = c->y; |
207 wc.y = c->y; |
207 wc.width = c->w; |
208 wc.width = c->w; |
208 wc.height = c->h; |
209 wc.height = c->h; |
209 if(c->w == sw && c->h == sh) |
210 wc.border_width = c->border; |
210 wc.border_width = 0; |
|
211 else |
|
212 wc.border_width = BORDERPX; |
|
213 XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc); |
211 XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc); |
214 configure(c); |
212 configure(c); |
215 XSync(dpy, False); |
213 XSync(dpy, False); |
216 } |
214 } |
217 |
215 |