Clip client rect to monitor bounds while picking a corner for resizing
authorMikael Magnusson <mikachu@gmail.com>
Mon, 27 Oct 2014 22:33:12 +0000 (23:33 +0100)
committerMikael Magnusson <mikachu@gmail.com>
Tue, 28 Oct 2014 03:14:23 +0000 (04:14 +0100)
This way you can actually do everything to it when it's offscreen,
not just resize the one edge that's poking out

openbox/actions/resize.c

index f6858d2..fc85c0b 100644 (file)
@@ -2,6 +2,7 @@
 #include "openbox/moveresize.h"
 #include "openbox/client.h"
 #include "openbox/frame.h"
 #include "openbox/moveresize.h"
 #include "openbox/client.h"
 #include "openbox/frame.h"
+#include "openbox/screen.h"
 #include "obt/prop.h"
 
 typedef struct {
 #include "obt/prop.h"
 
 typedef struct {
@@ -95,6 +96,12 @@ static gboolean run_func(ObActionsData *data, gpointer options)
 static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch,
                            gboolean shaded)
 {
 static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch,
                            gboolean shaded)
 {
+    const Rect *full = screen_physical_area_all_monitors();
+    if (cx < full->x) { cw = cw + cx - full->x; cx = full->x; }
+    if (cy < full->y) { ch = ch + cy - full->y; cy = full->y; }
+    if (cx + cw > full->x + full->width) cw = full->x + full->width - cx;
+    if (cy + ch > full->y + full->height) ch = full->y + full->height - cy;
+
     /* let's make x and y client relative instead of screen relative */
     x = x - cx;
     y = ch - (y - cy); /* y is inverted, 0 is at the bottom of the window */
     /* let's make x and y client relative instead of screen relative */
     x = x - cx;
     y = ch - (y - cy); /* y is inverted, 0 is at the bottom of the window */