commit 9dcfd9956218cfe827b3833fc1b0cfe615320580
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Fri Jan 18 18:06:52 2019 +0100

    Make mouse wheel scroll windows when they are off-screen
    
    This is actually a very logical shortcut for people used to scrolling
    documents within firefox and libreoffice.

diff --git a/metadata/move.xml.in b/metadata/move.xml.in
index 1fb8d615..eeceb1eb 100644
--- a/metadata/move.xml.in
+++ b/metadata/move.xml.in
@@ -37,6 +37,38 @@
 		<_long>Do not update the server-side position of windows until finished moving</_long>
 		<default>true</default>
 	    </option>
+	    <option name="offscreen_scroll" type="bool">
+		<_short>Off-Screen window scrolling</_short>
+		<_long>Make mouse wheel scroll window if part of it is off-screen</_long>
+		<default>false</default>
+	    </option>
+	    <option name="offscreen_scroll_down" type="button">
+		<_short>Scroll off-screen window down</_short>
+		<_long>Scroll window down if part of it is off-screen</_long>
+		<default>Button4</default>
+	    </option>
+	    <option name="offscreen_scroll_up" type="button">
+		<_short>Scroll off-screen window up</_short>
+		<_long>Scroll window up if part of it is off-screen</_long>
+		<default>Button5</default>
+	    </option>
+	    <option name="offscreen_scroll_right" type="button">
+		<_short>Scroll off-screen window right</_short>
+		<_long>Scroll window right if part of it is off-screen</_long>
+		<default>&lt;Shift&gt;Button4</default>
+	    </option>
+	    <option name="offscreen_scroll_left" type="button">
+		<_short>Scroll off-screen window left</_short>
+		<_long>Scroll window left if part of it is off-screen</_long>
+		<default>&lt;Shift&gt;Button5</default>
+	    </option>
+	    <option name="offscreen_scroll_speed" type="int">
+		<_short>Off-Screen window scrolling speed</_short>
+		<_long>Speed of off-screen window scrolling</_long>
+		<default>10</default>
+		<min>1</min>
+		<max>100</max>
+	    </option>
 	</display>
     </plugin>
 </compiz>
diff --git a/plugins/move.c b/plugins/move.c
index 8c0bbe5f..128f9d93 100644
--- a/plugins/move.c
+++ b/plugins/move.c
@@ -53,13 +53,19 @@ struct _MoveKeys {
 
 static int displayPrivateIndex;
 
-#define MOVE_DISPLAY_OPTION_INITIATE_BUTTON   0
-#define MOVE_DISPLAY_OPTION_INITIATE_KEY      1
-#define MOVE_DISPLAY_OPTION_OPACITY	      2
-#define MOVE_DISPLAY_OPTION_CONSTRAIN_Y	      3
-#define MOVE_DISPLAY_OPTION_SNAPOFF_MAXIMIZED 4
-#define MOVE_DISPLAY_OPTION_LAZY_POSITIONING  5
-#define MOVE_DISPLAY_OPTION_NUM		      6
+#define MOVE_DISPLAY_OPTION_INITIATE_BUTTON           0
+#define MOVE_DISPLAY_OPTION_INITIATE_KEY              1
+#define MOVE_DISPLAY_OPTION_OPACITY	              2
+#define MOVE_DISPLAY_OPTION_CONSTRAIN_Y	              3
+#define MOVE_DISPLAY_OPTION_SNAPOFF_MAXIMIZED         4
+#define MOVE_DISPLAY_OPTION_LAZY_POSITIONING          5
+#define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL          6
+#define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_SPEED    7
+#define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_DOWN     8
+#define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_UP       9
+#define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_RIGHT    10
+#define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_LEFT     11
+#define MOVE_DISPLAY_OPTION_NUM		              12
 
 typedef struct _MoveDisplay {
     int		    screenPrivateIndex;
@@ -675,6 +681,92 @@ moveHandleEvent (CompDisplay *d,
 				   NULL, 0);
 		}
 	    }
+
+#define BUTTON_IS(direction) \
+	((event->xbutton.state & (ShiftMask|ControlMask|Mod1Mask)) == \
+	    md->opt[MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_##direction] \
+	      .value.action.button.modifiers && \
+	  event->xbutton.button == \
+	    md->opt[MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_##direction] \
+	      .value.action.button.button)
+
+	    /* Scrolling wheel immediately moves the window */
+	    if (md->opt[MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL].value.b &&
+		(BUTTON_IS(DOWN) || BUTTON_IS(UP) ||
+		 BUTTON_IS(LEFT) || BUTTON_IS(RIGHT)))
+	    {
+		CompWindow *w;
+		w = findWindowAtDisplay (d, event->xbutton.window);
+		if (w && (w->actions & CompWindowActionMoveMask))
+		{
+		    int left, right, top, bottom;
+		    XRectangle workArea;
+
+		    int amount =
+			md->opt[MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_SPEED]
+			  .value.i;
+		    int dx = 0, dy = 0;
+
+		    left   = (w->serverX - w->input.left) + w->clientFrame.left;
+		    top    = (w->serverY - w->input.top) + w->clientFrame.top;
+		    right  = left + w->serverWidth + w->serverBorderWidth * 2
+			       + w->input.left + w->input.right;
+		    bottom = top + w->serverHeight + w->serverBorderWidth * 2
+			       + w->input.top + w->input.bottom;
+
+		    getWorkareaForOutput (s,
+					  outputDeviceForWindow (w),
+					  &workArea);
+
+		    if (BUTTON_IS(DOWN))
+		    {
+			int screen_bottom = workArea.y + workArea.height;
+
+			if (bottom > screen_bottom)
+			{
+			    dy = -amount;
+			    if (bottom + dy < screen_bottom)
+				dy = screen_bottom - bottom;
+			}
+		    }
+		    else if (BUTTON_IS(UP))
+		    {
+			if (top < workArea.y)
+			{
+			    dy = amount;
+			    if (top + dy > workArea.y)
+				dy = workArea.y - top;
+			}
+		    }
+		    else if (BUTTON_IS(RIGHT))
+		    {
+			int screen_right = workArea.x + workArea.width;
+
+			if (right > screen_right)
+			{
+			    dx = -amount;
+			    if (right + dx < screen_right)
+				dx = screen_right - right;
+			}
+		    }
+		    else if (BUTTON_IS(LEFT))
+		    {
+			if (left < workArea.x)
+			{
+			    dx = amount;
+			    if (left + dx > workArea.x)
+				dx = workArea.x - left;
+			}
+		    }
+#undef BUTTON_IS
+
+		    if (dx != 0 || dy != 0)
+		    {
+			moveWindow(w, dx, dy, TRUE, TRUE);
+			syncWindowPosition (w);
+		    }
+		}
+	    }
 	}
 	break;
     case KeyPress:
@@ -921,7 +1013,13 @@ static const CompMetadataOptionInfo moveDisplayOptionInfo[] = {
     { "opacity", "int", "<min>0</min><max>100</max>", 0, 0 },
     { "constrain_y", "bool", 0, 0, 0 },
     { "snapoff_maximized", "bool", 0, 0, 0 },
-    { "lazy_positioning", "bool", 0, 0, 0 }
+    { "lazy_positioning", "bool", 0, 0, 0 },
+    { "offscreen_scroll", "bool", 0, 0, 0 },
+    { "offscreen_scroll_speed", "int", "<min>1</min><max>100</max>", 0, 0 },
+    { "offscreen_scroll_down", "button", 0, 0, 0 },
+    { "offscreen_scroll_up", "button", 0, 0, 0 },
+    { "offscreen_scroll_right", "button", 0, 0, 0 },
+    { "offscreen_scroll_left", "button", 0, 0, 0 },
 };
 
 static Bool
commit fc505966009d14cae95175834e6c73236d84edd6
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Wed Jan 23 18:16:06 2019 +0100

    Fix move's wheel scroll direction according to documentation
    
    When we get the "up" scroll shortcut, we want to move the window up if
    it's too low, and similarly for other directions.

diff --git a/plugins/move.c b/plugins/move.c
index 128f9d93..8ec27306 100644
--- a/plugins/move.c
+++ b/plugins/move.c
@@ -718,7 +718,7 @@ moveHandleEvent (CompDisplay *d,
 					  outputDeviceForWindow (w),
 					  &workArea);
 
-		    if (BUTTON_IS(DOWN))
+		    if (BUTTON_IS(UP))
 		    {
 			int screen_bottom = workArea.y + workArea.height;
 
@@ -729,7 +729,7 @@ moveHandleEvent (CompDisplay *d,
 				dy = screen_bottom - bottom;
 			}
 		    }
-		    else if (BUTTON_IS(UP))
+		    else if (BUTTON_IS(DOWN))
 		    {
 			if (top < workArea.y)
 			{
@@ -738,7 +738,7 @@ moveHandleEvent (CompDisplay *d,
 				dy = workArea.y - top;
 			}
 		    }
-		    else if (BUTTON_IS(RIGHT))
+		    else if (BUTTON_IS(LEFT))
 		    {
 			int screen_right = workArea.x + workArea.width;
 
@@ -749,7 +749,7 @@ moveHandleEvent (CompDisplay *d,
 				dx = screen_right - right;
 			}
 		    }
-		    else if (BUTTON_IS(LEFT))
+		    else if (BUTTON_IS(RIGHT))
 		    {
 			if (left < workArea.x)
 			{
commit faf51bb9d8fb03f800cb0ef9249199727eccf4c5
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Wed Jan 23 19:09:46 2019 +0100

    move: shadow window edge where it gets off-screen
    
    So that users get a hint that there is more of the window that is off-screen
    and they can use the wheel to scroll the window, this shadows the edge of
    the window where it gets off-screen.

diff --git a/metadata/move.xml.in b/metadata/move.xml.in
index eeceb1eb..c8118c89 100644
--- a/metadata/move.xml.in
+++ b/metadata/move.xml.in
@@ -69,6 +69,28 @@
 		<min>1</min>
 		<max>100</max>
 	    </option>
+	    <option name="offscreen_scroll_color" type="color">
+		<_short>Off-Screen window scrolling color</_short>
+		<_long>Color of the rectangle showing when one can scroll a window</_long>
+		<default>
+		    <red>0x0000</red>
+		    <green>0x0000</green>
+		    <blue>0x0000</blue>
+		    <alpha>0x8080</alpha>
+		</default>
+	    </option>
+	    <option name="offscreen_scroll_width" type="int">
+		<_short>Off-Screen window scrolling width</_short>
+		<_long>Width of the rectangle showing when one can scroll a window</_long>
+		<default>20</default>
+		<min>0</min>
+		<max>100</max>
+	    </option>
+	    <option name="offscreen_scroll_gradient" type="bool">
+		<_short>Off-screen window scrolling gradient</_short>
+		<_long>Enable gradient of rectangle showing when one can scroll a window</_long>
+		<default>true</default>
+	    </option>
 	</display>
     </plugin>
 </compiz>
diff --git a/plugins/move.c b/plugins/move.c
index 8ec27306..27cb062a 100644
--- a/plugins/move.c
+++ b/plugins/move.c
@@ -65,7 +65,10 @@ static int displayPrivateIndex;
 #define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_UP       9
 #define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_RIGHT    10
 #define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_LEFT     11
-#define MOVE_DISPLAY_OPTION_NUM		              12
+#define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_COLOR    12
+#define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_WIDTH    13
+#define MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_GRADIENT 14
+#define MOVE_DISPLAY_OPTION_NUM		              15
 
 typedef struct _MoveDisplay {
     int		    screenPrivateIndex;
@@ -932,6 +935,23 @@ moveHandleEvent (CompDisplay *d,
     WRAP (md, d, handleEvent, moveHandleEvent);
 }
 
+static void
+drawRect (double x1, double y1, double x2, double y2,
+	  unsigned short *colorTL, unsigned short *colorTR,
+	  unsigned short *colorBL, unsigned short *colorBR)
+{
+    glBegin(GL_QUADS);
+    glColor4usv(colorTL);
+    glVertex3f(x1, y1, 0);
+    glColor4usv(colorBL);
+    glVertex3f(x1, y2, 0);
+    glColor4usv(colorBR);
+    glVertex3f(x2, y2, 0);
+    glColor4usv(colorTR);
+    glVertex3f(x2, y1, 0);
+    glEnd();
+}
+
 static Bool
 movePaintWindow (CompWindow		 *w,
 		 const WindowPaintAttrib *attrib,
@@ -942,13 +962,13 @@ movePaintWindow (CompWindow		 *w,
     WindowPaintAttrib sAttrib;
     CompScreen	      *s = w->screen;
     Bool	      status;
+    CompTransform     sTransform = *transform;
 
     MOVE_SCREEN (s);
+    MOVE_DISPLAY (s->display);
 
     if (ms->grabIndex)
     {
-	MOVE_DISPLAY (s->display);
-
 	if (md->w == w && md->moveOpacity != OPAQUE)
 	{
 	    /* modify opacity of windows that are not active */
@@ -963,6 +983,62 @@ movePaintWindow (CompWindow		 *w,
     status = (*s->paintWindow) (w, attrib, transform, region, mask);
     WRAP (ms, s, paintWindow, movePaintWindow);
 
+    if (md->opt[MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL].value.b &&
+        w->actions & CompWindowActionMoveMask)
+    {
+	int left, right, top, bottom;
+	XRectangle workArea;
+
+	left   = (w->serverX - w->input.left) + w->clientFrame.left;
+	top    = (w->serverY - w->input.top) + w->clientFrame.top;
+	right  = left + w->serverWidth + w->serverBorderWidth * 2
+		      + w->input.left + w->input.right;
+	bottom = top + w->serverHeight + w->serverBorderWidth * 2
+		     + w->input.top + w->input.bottom;
+
+	getWorkareaForOutput (s, outputDeviceForWindow (w), &workArea);
+
+	int screen_top = workArea.y;
+	int screen_bottom = screen_top + workArea.height;
+	int screen_left = workArea.x;
+	int screen_right = screen_left + workArea.width;
+
+	if ( top < screen_top || bottom > screen_bottom ||
+	    left < screen_left || right > screen_right)
+	{
+	    glPushMatrix ();
+	    glLoadMatrixf (sTransform.m);
+
+	    Bool gradient =
+	      md->opt[MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_GRADIENT].value.b;
+	    unsigned short *color =
+	      md->opt[MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_COLOR].value.c;
+	    unsigned short colorT[4] = { color[0], color[1], color[2],
+					 gradient ? 0 : color[3] };
+	    unsigned width =
+	      md->opt[MOVE_DISPLAY_OPTION_OFFSCREEN_SCROLL_WIDTH].value.i;
+
+	    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+	    glEnable (GL_BLEND);
+	    if (top < screen_top)
+		drawRect (left, screen_top, right, screen_top + width,
+			  color, color, colorT, colorT);
+	    if (bottom > screen_bottom)
+		drawRect (left, screen_bottom - width, right, screen_bottom,
+			  colorT, colorT, color, color);
+	    if (left < screen_left)
+		drawRect (screen_left, top, screen_left + width, bottom,
+			  color, colorT, color, colorT);
+	    if (right > screen_right)
+		drawRect (screen_right - width, top, screen_right, bottom,
+			  colorT, color, colorT, color);
+	    glDisable (GL_BLEND);
+
+	    glPopMatrix ();
+	    glColor4usv (defaultColor);
+	}
+    }
+
     return status;
 }
 
@@ -1020,6 +1096,9 @@ static const CompMetadataOptionInfo moveDisplayOptionInfo[] = {
     { "offscreen_scroll_up", "button", 0, 0, 0 },
     { "offscreen_scroll_right", "button", 0, 0, 0 },
     { "offscreen_scroll_left", "button", 0, 0, 0 },
+    { "offscreen_scroll_color", "color", 0, 0, 0 },
+    { "offscreen_scroll_width", "int", "<min>0</min><max>100</max>", 0, 0 },
+    { "offscreen_scroll_gradient", "bool", 0, 0, 0 },
 };
 
 static Bool
commit 526266fb1cf59b53b01b0bd29fdc89c21d6275f6
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Sat Jan 26 10:21:45 2019 +0100

    Move off-screen window management options to a separate tab

diff --git a/metadata/move.xml.in b/metadata/move.xml.in
index c8118c89..0294cace 100644
--- a/metadata/move.xml.in
+++ b/metadata/move.xml.in
@@ -5,92 +5,98 @@
 	<_long>Move window</_long>
 	<category>Window Management</category>
 	<display>
-	    <option name="initiate_button" type="button">
-		<_short>Initiate Window Move</_short>
-		<_long>Start moving window</_long>
-		<default>&lt;Alt&gt;Button1</default>
-	    </option>
-	    <option name="initiate_key" type="key">
-		<_short>Initiate Window Move</_short>
-		<_long>Start moving window</_long>
-		<default>&lt;Alt&gt;F7</default>
-	    </option>
-	    <option name="opacity" type="int">
-		<_short>Opacity</_short>
-		<_long>Opacity level of moving windows</_long>
-		<default>100</default>
-		<min>1</min>
-		<max>100</max>
-	    </option>
-	    <option name="constrain_y" type="bool">
-		<_short>Constrain Y</_short>
-		<_long>Constrain Y coordinate to workspace area</_long>
-		<default>true</default>
-	    </option>
-	    <option name="snapoff_maximized" type="bool">
-		<_short>Snapoff maximized windows</_short>
-		<_long>Snapoff and auto unmaximized maximized windows when dragging</_long>
-		<default>true</default>
-	    </option>
-	    <option name="lazy_positioning" type="bool">
-		<_short>Lazy Positioning</_short>
-		<_long>Do not update the server-side position of windows until finished moving</_long>
-		<default>true</default>
-	    </option>
-	    <option name="offscreen_scroll" type="bool">
-		<_short>Off-Screen window scrolling</_short>
-		<_long>Make mouse wheel scroll window if part of it is off-screen</_long>
-		<default>false</default>
-	    </option>
-	    <option name="offscreen_scroll_down" type="button">
-		<_short>Scroll off-screen window down</_short>
-		<_long>Scroll window down if part of it is off-screen</_long>
-		<default>Button4</default>
-	    </option>
-	    <option name="offscreen_scroll_up" type="button">
-		<_short>Scroll off-screen window up</_short>
-		<_long>Scroll window up if part of it is off-screen</_long>
-		<default>Button5</default>
-	    </option>
-	    <option name="offscreen_scroll_right" type="button">
-		<_short>Scroll off-screen window right</_short>
-		<_long>Scroll window right if part of it is off-screen</_long>
-		<default>&lt;Shift&gt;Button4</default>
-	    </option>
-	    <option name="offscreen_scroll_left" type="button">
-		<_short>Scroll off-screen window left</_short>
-		<_long>Scroll window left if part of it is off-screen</_long>
-		<default>&lt;Shift&gt;Button5</default>
-	    </option>
-	    <option name="offscreen_scroll_speed" type="int">
-		<_short>Off-Screen window scrolling speed</_short>
-		<_long>Speed of off-screen window scrolling</_long>
-		<default>10</default>
-		<min>1</min>
-		<max>100</max>
-	    </option>
-	    <option name="offscreen_scroll_color" type="color">
-		<_short>Off-Screen window scrolling color</_short>
-		<_long>Color of the rectangle showing when one can scroll a window</_long>
-		<default>
-		    <red>0x0000</red>
-		    <green>0x0000</green>
-		    <blue>0x0000</blue>
-		    <alpha>0x8080</alpha>
-		</default>
-	    </option>
-	    <option name="offscreen_scroll_width" type="int">
-		<_short>Off-Screen window scrolling width</_short>
-		<_long>Width of the rectangle showing when one can scroll a window</_long>
-		<default>20</default>
-		<min>0</min>
-		<max>100</max>
-	    </option>
-	    <option name="offscreen_scroll_gradient" type="bool">
-		<_short>Off-screen window scrolling gradient</_short>
-		<_long>Enable gradient of rectangle showing when one can scroll a window</_long>
-		<default>true</default>
-	    </option>
+	    <group>
+		<_short>General</_short>
+		<option name="initiate_button" type="button">
+		    <_short>Initiate Window Move</_short>
+		    <_long>Start moving window</_long>
+		    <default>&lt;Alt&gt;Button1</default>
+		</option>
+		<option name="initiate_key" type="key">
+		    <_short>Initiate Window Move</_short>
+		    <_long>Start moving window</_long>
+		    <default>&lt;Alt&gt;F7</default>
+		</option>
+		<option name="opacity" type="int">
+		    <_short>Opacity</_short>
+		    <_long>Opacity level of moving windows</_long>
+		    <default>100</default>
+		    <min>1</min>
+		    <max>100</max>
+		</option>
+		<option name="constrain_y" type="bool">
+		    <_short>Constrain Y</_short>
+		    <_long>Constrain Y coordinate to workspace area</_long>
+		    <default>true</default>
+		</option>
+		<option name="snapoff_maximized" type="bool">
+		    <_short>Snapoff maximized windows</_short>
+		    <_long>Snapoff and auto unmaximized maximized windows when dragging</_long>
+		    <default>true</default>
+		</option>
+		<option name="lazy_positioning" type="bool">
+		    <_short>Lazy Positioning</_short>
+		    <_long>Do not update the server-side position of windows until finished moving</_long>
+		    <default>true</default>
+		</option>
+	    </group>
+	    <group>
+		<_short>Off-screen windows</_short>
+		<option name="offscreen_scroll" type="bool">
+		    <_short>Enable off-Screen window scrolling</_short>
+		    <_long>Make mouse wheel scroll window if part of it is off-screen</_long>
+		    <default>false</default>
+		</option>
+		<option name="offscreen_scroll_down" type="button">
+		    <_short>Scroll down</_short>
+		    <_long>Scroll window down if part of it is off-screen</_long>
+		    <default>Button4</default>
+		</option>
+		<option name="offscreen_scroll_up" type="button">
+		    <_short>Scroll up</_short>
+		    <_long>Scroll window up if part of it is off-screen</_long>
+		    <default>Button5</default>
+		</option>
+		<option name="offscreen_scroll_right" type="button">
+		    <_short>Scroll right</_short>
+		    <_long>Scroll window right if part of it is off-screen</_long>
+		    <default>&lt;Shift&gt;Button4</default>
+		</option>
+		<option name="offscreen_scroll_left" type="button">
+		    <_short>Scroll left</_short>
+		    <_long>Scroll window left if part of it is off-screen</_long>
+		    <default>&lt;Shift&gt;Button5</default>
+		</option>
+		<option name="offscreen_scroll_speed" type="int">
+		    <_short>Scrolling speed</_short>
+		    <_long>Speed of off-screen window scrolling</_long>
+		    <default>10</default>
+		    <min>1</min>
+		    <max>100</max>
+		</option>
+		<option name="offscreen_scroll_color" type="color">
+		    <_short>Shadow color</_short>
+		    <_long>Color of the rectangle showing when one can scroll a window</_long>
+		    <default>
+			<red>0x0000</red>
+			<green>0x0000</green>
+			<blue>0x0000</blue>
+			<alpha>0x8080</alpha>
+		    </default>
+		</option>
+		<option name="offscreen_scroll_width" type="int">
+		    <_short>Shadow width</_short>
+		    <_long>Width of the rectangle showing when one can scroll a window</_long>
+		    <default>20</default>
+		    <min>0</min>
+		    <max>100</max>
+		</option>
+		<option name="offscreen_scroll_gradient" type="bool">
+		    <_short>Enable shadow gradient</_short>
+		    <_long>Enable gradient of rectangle showing when one can scroll a window</_long>
+		    <default>true</default>
+		</option>
+	    </group>
 	</display>
     </plugin>
 </compiz>
commit 5dff06a5348440bacbe532d9c215f434f4a6e46c
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Tue Jan 29 13:13:14 2019 +0100

    move: Avoid drawing shadows on completely off-screen windows

diff --git a/plugins/move.c b/plugins/move.c
index 27cb062a..5f94b48f 100644
--- a/plugins/move.c
+++ b/plugins/move.c
@@ -1003,8 +1003,10 @@ movePaintWindow (CompWindow		 *w,
 	int screen_left = workArea.x;
 	int screen_right = screen_left + workArea.width;
 
-	if ( top < screen_top || bottom > screen_bottom ||
-	    left < screen_left || right > screen_right)
+	if (!(bottom < screen_top || top > screen_bottom ||
+	      right < screen_left || left > screen_right) &&
+	     (top < screen_top || bottom > screen_bottom ||
+	      left < screen_left || right > screen_right))
 	{
 	    glPushMatrix ();
 	    glLoadMatrixf (sTransform.m);
