diff --git a/src/drivers/Cairo/Fl_X11_Cairo_Graphics_Driver.cxx b/src/drivers/Cairo/Fl_X11_Cairo_Graphics_Driver.cxx
index 3ad9a0d8807faba1f8b8ce79cbb26a8c837d7ca6..926121bdb7b8983b1524e7df44f66280b0b93ea4 100644
--- a/src/drivers/Cairo/Fl_X11_Cairo_Graphics_Driver.cxx
+++ b/src/drivers/Cairo/Fl_X11_Cairo_Graphics_Driver.cxx
@@ -48,8 +48,13 @@ void Fl_X11_Cairo_Graphics_Driver::scale(float f) {
 }
 
 
-void Fl_X11_Cairo_Graphics_Driver::copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy) {
-  XCopyArea(fl_display, pixmap, fl_window, (GC)Fl_Graphics_Driver::default_driver().gc(), int(srcx*scale()), int(srcy*scale()), int(w*scale()), int(h*scale()), int(x*scale()), int(y*scale()));
+void Fl_X11_Cairo_Graphics_Driver::copy_offscreen(int x, int y, int w, int h,
+                                                  Fl_Offscreen pixmap, int srcx, int srcy) {
+  cairo_matrix_t mat;
+  if (cairo_) cairo_get_matrix(cairo_, &mat);
+  else cairo_matrix_init_identity(&mat);
+  XCopyArea(fl_display, pixmap, fl_window, (GC)Fl_Graphics_Driver::default_driver().gc(), int(srcx*scale()), int(srcy*scale()), int(w*scale()), int(h*scale()),
+            int(x*scale()) + mat.x0, int(y*scale()) + mat.y0);
 }
 
 
diff --git a/src/drivers/Wayland/Fl_Wayland_Copy_Surface_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Copy_Surface_Driver.cxx
index 90ca9ac27c9c208b5e8b9841ac528ef760c3e773..0b84a037bb9aeab3f4d35e50495c32a92d929d06 100644
--- a/src/drivers/Wayland/Fl_Wayland_Copy_Surface_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Copy_Surface_Driver.cxx
@@ -22,15 +22,14 @@
 
 
 Fl_Wayland_Copy_Surface_Driver::Fl_Wayland_Copy_Surface_Driver(int w, int h) : Fl_Copy_Surface_Driver(w, h) {
-  struct Fl_Wayland_Window_Driver::surface_output *s_output = NULL;
-  if (Fl_Wayland_Window_Driver::wld_window &&
-      !wl_list_empty(&Fl_Wayland_Window_Driver::wld_window->outputs)) {
-    s_output = wl_container_of(Fl_Wayland_Window_Driver::wld_window->outputs.next, s_output, link);
+  float os_scale = Fl_Graphics_Driver::default_driver().scale();
+  int d = 1;
+  if (Fl::first_window()) {
+    d = Fl_Wayland_Window_Driver::driver(Fl::first_window())->wld_scale();
   }
-  int os_scale = (s_output ? s_output->output->wld_scale : 1);
-  img_surf = new Fl_Image_Surface(w * os_scale, h * os_scale);
+  img_surf = new Fl_Image_Surface(int(w * os_scale) * d, int(h * os_scale) * d);
   driver(img_surf->driver());
-  driver()->scale(os_scale);
+  driver()->scale(d * os_scale);
 }
 
 
diff --git a/src/drivers/Wayland/Fl_Wayland_Image_Surface_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Image_Surface_Driver.cxx
index de72e175a68cdd82dfd0153f23eee63e0bed6a72..a3850f6da774a3c737816c0ddb9c1182573bbf61 100644
--- a/src/drivers/Wayland/Fl_Wayland_Image_Surface_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Image_Surface_Driver.cxx
@@ -27,12 +27,10 @@ Fl_Wayland_Image_Surface_Driver::Fl_Wayland_Image_Surface_Driver(int w, int h,
   int d = 1;
   if (!off) {
     fl_open_display();
-    if (Fl_Wayland_Window_Driver::wld_window) {
-      d = Fl_Wayland_Window_Driver::driver(
-            Fl_Wayland_Window_Driver::wld_window->fl_win
-                                           )->wld_scale();
+    if (Fl::first_window()) {
+      d = Fl_Wayland_Window_Driver::driver(Fl::first_window())->wld_scale();
     }
-    s = fl_graphics_driver->scale();
+    s =  Fl_Graphics_Driver::default_driver().scale();
     if (d*s != 1 && high_res) {
       w = int(w * s) * d;
       h = int(h * s) * d;
diff --git a/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.cxx b/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.cxx
index 8fab122fe0069c4be31123126025f84ee38e40ec..c905dbbad90f1922ccc2e5758385b8e4228444d7 100644
--- a/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.cxx
+++ b/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.cxx
@@ -45,7 +45,6 @@ Fl_Xlib_Copy_Surface_Driver::Fl_Xlib_Copy_Surface_Driver(int w, int h) : Fl_Copy
   cairo_surface_t *surf = cairo_xlib_surface_create(fl_display, xid->offscreen(), fl_visual->visual, w * s, h * s);
   cairo_ = cairo_create(surf);
   cairo_surface_destroy(surf);
-  cairo_scale(cairo_, 1/s, 1/s);
   cairo_save(cairo_);
   ((Fl_X11_Cairo_Graphics_Driver*)driver())->set_cairo(cairo_);
 #endif
@@ -62,8 +61,10 @@ Fl_Xlib_Copy_Surface_Driver::~Fl_Xlib_Copy_Surface_Driver() {
   Fl_RGB_Image *rgb = Fl::screen_driver()->read_win_rectangle(0, 0, width, height, 0);
   fl_window = old_win;
   if (is_current()) end_current();
-  Fl_X11_Screen_Driver::copy_image(rgb->array, rgb->w(), rgb->h(), 1);
-  delete rgb;
+  if (rgb) {
+    Fl_X11_Screen_Driver::copy_image(rgb->array, rgb->w(), rgb->h(), 1);
+    delete rgb;
+  }
   delete xid;
 #if FLTK_USE_CAIRO
   cairo_destroy(cairo_);