|
@@ -192,19 +192,11 @@ is::Rectangle::Rectangle( int x, int y, int width, int height, int border, int p
|
192
|
192
|
m_padding = padding;
|
193
|
193
|
m_window = None;
|
194
|
194
|
|
|
195
|
+ constrain( width, height );
|
195
|
196
|
if ( m_border == 0 ) {
|
196
|
197
|
return;
|
197
|
198
|
}
|
198
|
199
|
|
199
|
|
- if ( m_width < 0 ) {
|
200
|
|
- m_xoffset += m_width;
|
201
|
|
- m_width = -m_width;
|
202
|
|
- }
|
203
|
|
- if ( m_height < 0 ) {
|
204
|
|
- m_yoffset += m_height;
|
205
|
|
- m_height = -m_height;
|
206
|
|
- }
|
207
|
|
-
|
208
|
200
|
XAllocNamedColor( xengine->m_display, xengine->m_colormap, "black", &m_forground, &m_forgroundExact );
|
209
|
201
|
XAllocNamedColor( xengine->m_display, xengine->m_colormap, "white", &m_background, &m_backgroundExact );
|
210
|
202
|
XSetWindowAttributes attributes;
|
|
@@ -217,13 +209,13 @@ is::Rectangle::Rectangle( int x, int y, int width, int height, int border, int p
|
217
|
209
|
CWSaveUnder | CWOverrideRedirect |
|
218
|
210
|
CWColormap;
|
219
|
211
|
|
220
|
|
- m_window = XCreateWindow( xengine->m_display, xengine->m_root, m_x-m_border+m_xoffset-m_padding, m_y-m_border+m_yoffset-m_padding, m_width+m_border*2+m_padding*2, m_height+m_border*2+m_padding*2,
|
|
212
|
+ m_window = XCreateWindow( xengine->m_display, xengine->m_root, m_x+m_xoffset, m_y+m_yoffset, m_width+m_border*2, m_height+m_border*2,
|
221
|
213
|
0, CopyFromParent, InputOutput,
|
222
|
214
|
CopyFromParent, valueMask, &attributes );
|
223
|
215
|
XRectangle rect;
|
224
|
216
|
rect.x = rect.y = m_border;
|
225
|
|
- rect.width = m_width+m_padding*2;
|
226
|
|
- rect.height = m_height+m_padding*2;
|
|
217
|
+ rect.width = m_width;
|
|
218
|
+ rect.height = m_height;
|
227
|
219
|
|
228
|
220
|
XShapeCombineRectangles( xengine->m_display, m_window, ShapeBounding, 0, 0, &rect, 1, ShapeSubtract, 0);
|
229
|
221
|
XMapWindow( xengine->m_display, m_window );
|
|
@@ -238,34 +230,18 @@ void is::Rectangle::setPos( int x, int y ) {
|
238
|
230
|
if ( m_border == 0 ) {
|
239
|
231
|
return;
|
240
|
232
|
}
|
241
|
|
- XMoveWindow( xengine->m_display, m_window, m_x-m_border+m_xoffset, m_y-m_border+m_yoffset );
|
|
233
|
+ XMoveWindow( xengine->m_display, m_window, m_x+m_xoffset, m_y+m_yoffset );
|
242
|
234
|
}
|
243
|
235
|
|
244
|
236
|
void is::Rectangle::setDim( int w, int h ) {
|
245
|
237
|
if ( m_width == w && m_height == h ) {
|
246
|
238
|
return;
|
247
|
239
|
}
|
248
|
|
- w += m_padding;
|
249
|
|
- h += m_padding;
|
250
|
240
|
|
251
|
|
- m_xoffset = 0;
|
252
|
|
- m_yoffset = 0;
|
253
|
|
- m_width = w;
|
254
|
|
- m_height = h;
|
255
|
|
- if ( w < 0 ) {
|
256
|
|
- m_xoffset += w;
|
257
|
|
- m_width = -w;
|
258
|
|
- }
|
259
|
|
- if ( h < 0 ) {
|
260
|
|
- m_yoffset += h;
|
261
|
|
- m_height = -h;
|
262
|
|
- }
|
263
|
|
- if ( m_border == 0 ) {
|
264
|
|
- return;
|
265
|
|
- }
|
|
241
|
+ constrain( w, h );
|
266
|
242
|
|
267
|
243
|
XResizeWindow( xengine->m_display, m_window, m_width+m_border*2, m_height+m_border*2 );
|
268
|
|
- XMoveWindow( xengine->m_display, m_window, m_x-m_border+m_xoffset, m_y-m_border+m_yoffset );
|
|
244
|
+ XMoveWindow( xengine->m_display, m_window, m_x+m_xoffset, m_y+m_yoffset );
|
269
|
245
|
// Now punch another hole in it.
|
270
|
246
|
XRectangle rect;
|
271
|
247
|
rect.x = rect.y = 0;
|
|
@@ -324,3 +300,30 @@ void is::XEngine::updateHoverWindow( Window child ) {
|
324
|
300
|
&(m_hoverWindow.m_width), &(m_hoverWindow.m_height),
|
325
|
301
|
&(m_hoverWindow.m_border), &depth );
|
326
|
302
|
}
|
|
303
|
+
|
|
304
|
+// Keeps our rectangle's sizes all positive, so Xlib doesn't throw an exception.
|
|
305
|
+void is::Rectangle::constrain( int w, int h ) {
|
|
306
|
+ int pad = m_padding;
|
|
307
|
+ if ( pad < 0 && std::abs( w ) < std::abs( pad )*2 ) {
|
|
308
|
+ pad = 0;
|
|
309
|
+ }
|
|
310
|
+ if ( w < 0 ) {
|
|
311
|
+ m_xoffset = w - pad - m_border;
|
|
312
|
+ m_width = -w + pad*2;
|
|
313
|
+ } else {
|
|
314
|
+ m_xoffset = -pad - m_border;
|
|
315
|
+ m_width = w + pad*2;
|
|
316
|
+ }
|
|
317
|
+
|
|
318
|
+ pad = m_padding;
|
|
319
|
+ if ( pad < 0 && std::abs( h ) < std::abs( pad )*2 ) {
|
|
320
|
+ pad = 0;
|
|
321
|
+ }
|
|
322
|
+ if ( h < 0 ) {
|
|
323
|
+ m_yoffset = h - pad - m_border;
|
|
324
|
+ m_height = -h + pad*2;
|
|
325
|
+ } else {
|
|
326
|
+ m_yoffset = -pad - m_border;
|
|
327
|
+ m_height = h + pad*2;
|
|
328
|
+ }
|
|
329
|
+}
|