diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index ad7fd78..467f2ba 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -3276,6 +3276,14 @@ e_day_view_on_main_canvas_scroll (GtkWidget *widget,
 	case GDK_SCROLL_DOWN:
 		e_day_view_scroll (day_view, -E_DAY_VIEW_WHEEL_MOUSE_STEP_SIZE);
 		return TRUE;
+	#if GTK_CHECK_VERSION(3,3,18)
+	case GDK_SCROLL_SMOOTH:
+		if (scroll->delta_y < -0.001 || scroll->delta_y > 0.001) {
+			e_day_view_scroll (day_view, scroll->delta_y);
+			return TRUE;
+		}
+		break;
+	#endif
 	default:
 		break;
 	}
@@ -3295,9 +3303,19 @@ e_day_view_on_top_canvas_scroll (GtkWidget *widget,
 	case GDK_SCROLL_DOWN:
 		e_day_view_top_scroll (day_view, -E_DAY_VIEW_WHEEL_MOUSE_STEP_SIZE);
 		return TRUE;
+	#if GTK_CHECK_VERSION(3,3,18)
+	case GDK_SCROLL_SMOOTH:
+		if (scroll->delta_y < -0.001 || scroll->delta_y > 0.001) {
+			e_day_view_top_scroll (day_view, scroll->delta_y);
+			return TRUE;
+		}
+		break;
+	#endif
 	default:
-		return FALSE;
+		break;
 	}
+
+	return FALSE;
 }
 
 static gboolean
@@ -3319,9 +3337,19 @@ e_day_view_on_time_canvas_scroll (GtkWidget *widget,
 	case GDK_SCROLL_DOWN:
 		e_day_view_scroll (day_view, -E_DAY_VIEW_WHEEL_MOUSE_STEP_SIZE);
 		return TRUE;
+	#if GTK_CHECK_VERSION(3,3,18)
+	case GDK_SCROLL_SMOOTH:
+		if (scroll->delta_y < -0.001 || scroll->delta_y > 0.001) {
+			e_day_view_scroll (day_view, scroll->delta_y);
+			return TRUE;
+		}
+		break;
+	#endif
 	default:
-		return FALSE;
+		break;
 	}
+
+	return FALSE;
 }
 
 static gboolean
diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c
index 3feaccc..dd419d2 100644
--- a/calendar/gui/e-week-view.c
+++ b/calendar/gui/e-week-view.c
@@ -2532,6 +2532,14 @@ e_week_view_on_scroll (GtkWidget *widget,
 		case GDK_SCROLL_DOWN:
 			new_value = value + page_increment;
 			break;
+		#if GTK_CHECK_VERSION(3,3,18)
+		case GDK_SCROLL_SMOOTH:
+			if (scroll->delta_y < -0.001 || scroll->delta_y > 0.001) {
+				new_value = value + scroll->delta_y;
+				break;
+			}
+			return FALSE;
+		#endif
 		default:
 			return FALSE;
 	}
diff --git a/libgnomecanvas/gnome-canvas.c b/libgnomecanvas/gnome-canvas.c
index 1b4019b..ba49c09 100644
--- a/libgnomecanvas/gnome-canvas.c
+++ b/libgnomecanvas/gnome-canvas.c
@@ -2027,6 +2027,7 @@ gnome_canvas_realize (GtkWidget *widget)
 	gdk_window_set_events (bin_window,
 			       (gdk_window_get_events (bin_window)
 				 | GDK_EXPOSURE_MASK
+				 | GDK_SCROLL_MASK
 				 | GDK_BUTTON_PRESS_MASK
 				 | GDK_BUTTON_RELEASE_MASK
 				 | GDK_POINTER_MOTION_MASK

diff --git a/modules/calendar/e-cal-shell-view-private.c b/modules/calendar/e-cal-shell-view-private.c
index fc94a83..c751e88 100644
--- a/modules/calendar/e-cal-shell-view-private.c
+++ b/modules/calendar/e-cal-shell-view-private.c
@@ -209,12 +209,24 @@ cal_shell_view_date_navigator_scroll_event_cb (ECalShellView *cal_shell_view,
 {
 	ECalendarItem *calitem;
 	GDate start_date, end_date;
+	GdkScrollDirection direction;
 
 	calitem = date_navigator->calitem;
 	if (!e_calendar_item_get_selection (calitem, &start_date, &end_date))
 		return;
 
-	switch (event->direction) {
+	direction = event->direction;
+
+	#if GTK_CHECK_VERSION(3,3,18)
+	if (direction == GDK_SCROLL_SMOOTH) {
+		if (event->delta_y > 0.001)
+			direction = GDK_SCROLL_UP;
+		else if (event->delta_y < -0.001)
+			direction = GDK_SCROLL_DOWN;
+	}
+	#endif
+
+	switch (direction) {
 		case GDK_SCROLL_UP:
 			g_date_subtract_months (&start_date, 1);
 			g_date_subtract_months (&end_date, 1);
diff --git a/widgets/misc/e-web-view-gtkhtml.c b/widgets/misc/e-web-view-gtkhtml.c
index be8b1c5..89f4410 100644
--- a/widgets/misc/e-web-view-gtkhtml.c
+++ b/widgets/misc/e-web-view-gtkhtml.c
@@ -852,7 +852,18 @@ web_view_gtkhtml_scroll_event (GtkWidget *widget,
                        GdkEventScroll *event)
 {
 	if (event->state & GDK_CONTROL_MASK) {
-		switch (event->direction) {
+		GdkScrollDirection direction = event->direction;
+
+		#if GTK_CHECK_VERSION(3,3,18)
+		if (direction == GDK_SCROLL_SMOOTH) {
+			if (event->delta_y > 0.001)
+				direction = GDK_SCROLL_UP;
+			else if (event->delta_y < -0.001)
+				direction = GDK_SCROLL_DOWN;
+		}
+		#endif
+
+		switch (direction) {
 			case GDK_SCROLL_UP:
 				gtk_html_zoom_in (GTK_HTML (widget));
 				return TRUE;
diff --git a/widgets/misc/e-web-view.c b/widgets/misc/e-web-view.c
index e9288cd..e99ea4c 100644
--- a/widgets/misc/e-web-view.c
+++ b/widgets/misc/e-web-view.c
@@ -969,7 +969,18 @@ web_view_scroll_event (GtkWidget *widget,
                        GdkEventScroll *event)
 {
 	if (event->state & GDK_CONTROL_MASK) {
-		switch (event->direction) {
+		GdkScrollDirection direction = event->direction;
+
+		#if GTK_CHECK_VERSION(3,3,18)
+		if (direction == GDK_SCROLL_SMOOTH) {
+			if (event->delta_y > 0.001)
+				direction = GDK_SCROLL_UP;
+			else if (event->delta_y < -0.001)
+				direction = GDK_SCROLL_DOWN;
+		}
+		#endif
+
+		switch (direction) {
 			case GDK_SCROLL_UP:
 				e_web_view_zoom_in (E_WEB_VIEW (widget));
 				return TRUE;
