diff --git a/src/xpra/platform/darwin/shadow_server.py b/src/xpra/platform/darwin/shadow_server.py index 549f9cddbe..a9f996c163 100644 --- a/src/xpra/platform/darwin/shadow_server.py +++ b/src/xpra/platform/darwin/shadow_server.py @@ -43,12 +43,21 @@ def pixels_to_bytes(v): picture_encode.pixels_to_bytes = pixels_to_bytes -class OSXRootWindowModel(RootWindowModel): +class OSXRootCapture(object): def get_image(self, x, y, width, height): rect = (x, y, width, height) return get_CG_imagewrapper(rect) + def get_info(self): + return {} + + +class OSXRootWindowModel(RootWindowModel): + + def __init__(self, root_window): + RootWindowModel.__init__(root_window, OSXRootCapture()) + def take_screenshot(self): log("grabbing screenshot") return take_screenshot() diff --git a/src/xpra/platform/win32/gdi_screen_capture.py b/src/xpra/platform/win32/gdi_screen_capture.py index 413c6e359e..113ce93194 100644 --- a/src/xpra/platform/win32/gdi_screen_capture.py +++ b/src/xpra/platform/win32/gdi_screen_capture.py @@ -219,6 +219,7 @@ def take_screenshot(self): out.close() return screenshot + def main(): import sys import os.path @@ -234,5 +235,6 @@ def main(): with open(filename, 'wb') as f: f.write(image[4]) + if __name__ == "__main__": main() diff --git a/src/xpra/platform/win32/shadow_server.py b/src/xpra/platform/win32/shadow_server.py index 958d8fea30..9cb1dfe571 100644 --- a/src/xpra/platform/win32/shadow_server.py +++ b/src/xpra/platform/win32/shadow_server.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # This file is part of Xpra. -# Copyright (C) 2012-2017 Antoine Martin +# Copyright (C) 2012-2018 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. @@ -19,7 +19,6 @@ from collections import namedtuple from xpra.util import XPRA_APP_ID, XPRA_IDLE_NOTIFICATION_ID from xpra.scripts.config import InitException -from xpra.codecs.codec_constants import CodecStateException, TransientCodecException from xpra.server.gtk_server_base import GTKServerBase from xpra.server.shadow.gtk_shadow_server_base import GTKShadowServerBase from xpra.server.shadow.root_window_model import RootWindowModel @@ -227,24 +226,6 @@ def get_root_window_size(self): h = GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN) return w, h - def get_image(self, x, y, width, height): - try: - return self.capture.get_image(x, y, width, height) - except CodecStateException as e: - log("%s.get_image%s", self.capture, (x, y, width, height), exc_info=True) - #maybe we should exit here? - log.warn("Warning: %s", e) - del e - except TransientCodecException as e: - log("%s.get_image%s", self.capture, (x, y, width, height), exc_info=True) - log.warn("Warning: %s", e) - del e - self.cleanup_capture() - return None - - def take_screenshot(self): - return self.capture.take_screenshot() - class ShadowServer(GTKShadowServerBase): diff --git a/src/xpra/server/shadow/gtk_root_window_model.py b/src/xpra/server/shadow/gtk_root_window_model.py index 3aabcce687..5f8dde9f4c 100644 --- a/src/xpra/server/shadow/gtk_root_window_model.py +++ b/src/xpra/server/shadow/gtk_root_window_model.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # This file is part of Xpra. -# Copyright (C) 2012-2017 Antoine Martin +# Copyright (C) 2012-2018 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. @@ -11,7 +11,6 @@ from xpra.os_util import monotonic_time, strtobytes from xpra.codecs.image_wrapper import ImageWrapper from xpra.gtk_common.gtk_util import get_pixbuf_from_window, is_gtk3 -from xpra.server.shadow.root_window_model import RootWindowModel def get_rgb_rawdata(window, x, y, width, height): @@ -54,10 +53,18 @@ def save_to_memory(data, *_args, **_kwargs): return w, h, "png", rowstride, b"".join(buf) -class GTKRootWindowModel(RootWindowModel): +class GTKImageCapture(object): + def __init__(self, window): + self.window = window def __repr__(self): - return "GTKRootWindowModel(%s)" % self.window + return "GTKImageCapture(%s)" % self.window + + def clean(self): + pass + + def refresh(self): + return True def get_image(self, x, y, width, height): v = get_rgb_rawdata(self.window, x, y, width, height) diff --git a/src/xpra/server/shadow/root_window_model.py b/src/xpra/server/shadow/root_window_model.py index c752bc15d9..7c1a48cff1 100644 --- a/src/xpra/server/shadow/root_window_model.py +++ b/src/xpra/server/shadow/root_window_model.py @@ -29,6 +29,12 @@ def get_info(self): info["capture"] = c.get_info() return info + def take_screenshot(self): + return self.capture.take_screenshot() + + def get_image(self, *args): + return self.capture.get_image(*args) + def cleanup(self): pass @@ -66,8 +72,6 @@ def get_geometry(self): w, h = self.get_dimensions() return (0, 0, w, h) - def get_image(self, x, y, width, height): - raise NotImplementedError() def get_property_names(self): return self.property_names diff --git a/src/xpra/x11/shadow_x11_server.py b/src/xpra/x11/shadow_x11_server.py index 94c1c50965..ade8cd61b2 100644 --- a/src/xpra/x11/shadow_x11_server.py +++ b/src/xpra/x11/shadow_x11_server.py @@ -11,9 +11,9 @@ from xpra.os_util import monotonic_time from xpra.util import envbool, envint, XPRA_APP_ID from xpra.gtk_common.gtk_util import get_xwindow, is_gtk3 -from xpra.codecs.image_wrapper import ImageWrapper +from xpra.server.shadow.root_window_model import RootWindowModel from xpra.server.shadow.gtk_shadow_server_base import GTKShadowServerBase -from xpra.server.shadow.gtk_root_window_model import GTKRootWindowModel, get_rgb_rawdata, take_png_screenshot +from xpra.server.shadow.gtk_root_window_model import GTKImageCapture from xpra.x11.bindings.ximage import XImageBindings #@UnresolvedImport from xpra.gtk_common.error import xsync XImage = XImageBindings() @@ -98,29 +98,6 @@ def get_image(self, x, y, width, height): log("X11 shadow captured %s pixels at %i MPixels/s using %s", width*height, (width*height/(end-start))//1024//1024, ["GTK", "XSHM"][USE_XSHM]) -class GTKImageCapture(object): - def __init__(self, window): - self.window = window - - def __repr__(self): - return "GTKImageCapture(%s)" % self.window - - def clean(self): - pass - - def refresh(self): - return True - - def get_image(self, x, y, width, height): - v = get_rgb_rawdata(self.window, x, y, width, height) - if v is None: - return None - return ImageWrapper(*v) - - def take_screenshot(self): - return take_png_screenshot(self.window) - - def setup_capture(window): ww, wh = window.get_geometry()[2:4] capture = None @@ -147,12 +124,11 @@ def setup_capture(window): return capture -class GTKX11RootWindowModel(GTKRootWindowModel): +class GTKX11RootWindowModel(RootWindowModel): def __init__(self, root_window, capture=None): - GTKRootWindowModel.__init__(self, root_window) + RootWindowModel.__init__(self, root_window, capture) self.geometry = root_window.get_geometry()[:4] - self.capture = capture def __repr__(self): return "GTKX11RootWindowModel(%#x - %s - %s)" % (get_xwindow(self.window), self.geometry, self.capture)