Explorar el Código

fixed padding issues

naelstrof hace 10 años
padre
commit
f0fd2e23b4
Se han modificado 3 ficheros con 38 adiciones y 32 borrados
  1. 1
    1
      main.cpp
  2. 34
    31
      x.cpp
  3. 3
    0
      x.hpp

+ 1
- 1
main.cpp Ver fichero

@@ -135,7 +135,7 @@ int main( int argc, char** argv ) {
135 135
             }
136 136
             case 1: {
137 137
                 selection = new is::Rectangle( xengine->m_mousex, xengine->m_mousey, 0, 0, borderSize, padding );
138
-                selection->setPos( xengine->m_mousex - padding, xengine->m_mousey - padding );
138
+                selection->setPos( xengine->m_mousex, xengine->m_mousey );
139 139
                 xengine->addRect( selection );
140 140
                 state++;
141 141
                 break;

+ 34
- 31
x.cpp Ver fichero

@@ -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
+}

+ 3
- 0
x.hpp Ver fichero

@@ -9,6 +9,7 @@
9 9
 #include <X11/cursorfont.h>
10 10
 #include <X11/extensions/shape.h>
11 11
 
12
+#include <cmath>
12 13
 #include <cstdio>
13 14
 #include <string>
14 15
 #include <vector>
@@ -51,6 +52,8 @@ public:
51 52
     int     m_padding;
52 53
     XColor  m_forground, m_forgroundExact;
53 54
     XColor  m_background, m_backgroundExact;
55
+private:
56
+    void    constrain( int w, int h );
54 57
 };
55 58
 
56 59
 class XEngine {