Sfoglia il codice sorgente

fixed padding issues

naelstrof 11 anni fa
parent
commit
f0fd2e23b4
3 ha cambiato i file con 38 aggiunte e 32 eliminazioni
  1. 1
    1
      main.cpp
  2. 34
    31
      x.cpp
  3. 3
    0
      x.hpp

+ 1
- 1
main.cpp Vedi File

135
             }
135
             }
136
             case 1: {
136
             case 1: {
137
                 selection = new is::Rectangle( xengine->m_mousex, xengine->m_mousey, 0, 0, borderSize, padding );
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
                 xengine->addRect( selection );
139
                 xengine->addRect( selection );
140
                 state++;
140
                 state++;
141
                 break;
141
                 break;

+ 34
- 31
x.cpp Vedi File

192
     m_padding = padding;
192
     m_padding = padding;
193
     m_window = None;
193
     m_window = None;
194
 
194
 
195
+    constrain( width, height );
195
     if ( m_border == 0 ) {
196
     if ( m_border == 0 ) {
196
         return;
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
     XAllocNamedColor( xengine->m_display, xengine->m_colormap, "black", &m_forground, &m_forgroundExact );
200
     XAllocNamedColor( xengine->m_display, xengine->m_colormap, "black", &m_forground, &m_forgroundExact );
209
     XAllocNamedColor( xengine->m_display, xengine->m_colormap, "white", &m_background, &m_backgroundExact );
201
     XAllocNamedColor( xengine->m_display, xengine->m_colormap, "white", &m_background, &m_backgroundExact );
210
     XSetWindowAttributes attributes;
202
     XSetWindowAttributes attributes;
217
                               CWSaveUnder | CWOverrideRedirect |
209
                               CWSaveUnder | CWOverrideRedirect |
218
                               CWColormap;
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
                               0, CopyFromParent, InputOutput,
213
                               0, CopyFromParent, InputOutput,
222
                               CopyFromParent, valueMask, &attributes );
214
                               CopyFromParent, valueMask, &attributes );
223
     XRectangle rect;
215
     XRectangle rect;
224
     rect.x = rect.y = m_border;
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
     XShapeCombineRectangles( xengine->m_display, m_window, ShapeBounding, 0, 0, &rect, 1, ShapeSubtract, 0);
220
     XShapeCombineRectangles( xengine->m_display, m_window, ShapeBounding, 0, 0, &rect, 1, ShapeSubtract, 0);
229
     XMapWindow( xengine->m_display, m_window );
221
     XMapWindow( xengine->m_display, m_window );
238
     if ( m_border == 0 ) {
230
     if ( m_border == 0 ) {
239
         return;
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
 void is::Rectangle::setDim( int w, int h ) {
236
 void is::Rectangle::setDim( int w, int h ) {
245
     if ( m_width == w && m_height == h ) {
237
     if ( m_width == w && m_height == h ) {
246
         return;
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
     XResizeWindow( xengine->m_display, m_window, m_width+m_border*2, m_height+m_border*2 );
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
     // Now punch another hole in it.
245
     // Now punch another hole in it.
270
     XRectangle rect;
246
     XRectangle rect;
271
     rect.x = rect.y = 0;
247
     rect.x = rect.y = 0;
324
                   &(m_hoverWindow.m_width), &(m_hoverWindow.m_height),
300
                   &(m_hoverWindow.m_width), &(m_hoverWindow.m_height),
325
                   &(m_hoverWindow.m_border), &depth );
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 Vedi File

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