Skip to content

Commit

Permalink
fix shadow server and bug report tool with python3: screen capture works
Browse files Browse the repository at this point in the history
git-svn-id: https://xpra.org/svn/Xpra/trunk@17509 3bb7dfac-3a0b-4e04-842a-767bc560f471
  • Loading branch information
totaam committed Nov 26, 2017
1 parent b5855c5 commit 49df5dd
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 63 deletions.
12 changes: 7 additions & 5 deletions src/xpra/client/gtk_base/bug_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
gdk = import_gdk()
pango = import_pango()

from xpra.gtk_common.gtk_util import gtk_main, add_close_accel, scaled_image, pixbuf_new_from_file, get_display_info, \
from xpra.gtk_common.gtk_util import gtk_main, add_close_accel, scaled_image, pixbuf_new_from_file, get_display_info, get_default_root_window, \
JUSTIFY_LEFT, WIN_POS_CENTER, STATE_NORMAL, FILE_CHOOSER_ACTION_SAVE, choose_file, get_gtk_version_info
from xpra.util import nonl, envint
from xpra.util import nonl, envint, repr_ellipsized
from xpra.os_util import strtobytes
from xpra.log import Logger
log = Logger("util")
Expand Down Expand Up @@ -163,10 +163,10 @@ def pillow_imagegrab_screenshot():
#default: gtk screen capture
try:
from xpra.server.shadow.gtk_root_window_model import GTKRootWindowModel
rwm = GTKRootWindowModel(gtk.gdk.get_default_root_window())
rwm = GTKRootWindowModel(get_default_root_window())
take_screenshot_fn = rwm.take_screenshot
except:
log("failed to load gtk screenshot code", exc_info=True)
log.warn("Warning: failed to load gtk screenshot code", exc_info=True)
log("take_screenshot_fn=%s", take_screenshot_fn)
if take_screenshot_fn:
def get_screenshot():
Expand Down Expand Up @@ -281,10 +281,11 @@ def get_text_data(self):
try:
value = value_cb()
except TypeError:
log.error("error on %s", value_cb, exc_info=True)
log.error("Error collecting %s bug report data using %s", name, value_cb, exc_info=True)
value = str(value_cb)
dtype = "txt"
except Exception as e:
log.error("Error collecting %s bug report data using %s", name, value_cb, exc_info=True)
value = e
dtype = "txt"
if value is None:
Expand All @@ -295,6 +296,7 @@ def get_text_data(self):
s = os.linesep.join(str(x) for x in value)
else:
s = str(value)
log("%s (%s) %s: %s", title, tooltip, dtype, repr_ellipsized(s))
data.append((title, tooltip, dtype, s))
time.sleep(STEP_DELAY)
return data
Expand Down
8 changes: 8 additions & 0 deletions src/xpra/gtk_common/gtk_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ def get_pixbuf_from_data(rgb_data, has_alpha, w, h, rowstride):
has_alpha, 8, w, h, rowstride,
None, None)


get_pixbuf_from_window = gdk.pixbuf_get_from_window

def get_preferred_size(widget):
#ignore "min", we only care about "natural":
_, w = widget.get_preferred_width()
Expand Down Expand Up @@ -306,6 +309,11 @@ def gtk_main():
def get_pixbuf_from_data(rgb_data, has_alpha, w, h, rowstride):
return gdk.pixbuf_new_from_data(rgb_data, gdk.COLORSPACE_RGB, has_alpha, 8, w, h, rowstride)

def get_pixbuf_from_window(window, x, y, w, h):
pixbuf = gdk.Pixbuf(gdk.COLORSPACE_RGB, False, 8, w, h)
pixbuf = pixbuf.get_from_drawable(window, window.get_colormap(), x, y, 0, 0, w, h)
return pixbuf

def get_preferred_size(widget):
return widget.size_request()

Expand Down
45 changes: 0 additions & 45 deletions src/xpra/gtk_common/pixbuf_to_rgb.py

This file was deleted.

57 changes: 44 additions & 13 deletions src/xpra/server/shadow/gtk_root_window_model.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,59 @@
# -*- coding: utf-8 -*-
# This file is part of Xpra.
# Copyright (C) 2012-2015 Antoine Martin <[email protected]>
# Copyright (C) 2012-2017 Antoine Martin <[email protected]>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import gtk.gdk

from xpra.log import Logger
log = Logger("shadow")

from xpra.os_util import monotonic_time, strtobytes
from xpra.codecs.image_wrapper import ImageWrapper
from xpra.gtk_common.pixbuf_to_rgb import get_rgb_rawdata
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):
"""
Extracts pixels from the given pixmap
"""
start = monotonic_time()
pixmap_w, pixmap_h = window.get_geometry()[2:4]
# Just in case we somehow end up with damage larger than the pixmap,
# we don't want to start requesting random chunks of memory (this
# could happen if a window is resized but we don't throw away our
# existing damage map):
assert x >= 0
assert y >= 0
if x + width > pixmap_w:
width = pixmap_w - x
if y + height > pixmap_h:
height = pixmap_h - y
if width <= 0 or height <= 0:
return None
pixbuf = get_pixbuf_from_window(window, x, y, width, height)
log("get_rgb_rawdata(..) pixbuf.get_from_drawable took %s ms", int(1000*(monotonic_time()-start)))
raw_data = pixbuf.get_pixels()
rowstride = pixbuf.get_rowstride()
return (x, y, width, height, raw_data, "RGB", 24, rowstride, 3)

def take_png_screenshot(window):
log("grabbing screenshot")
w,h = window.get_geometry()[2:4]
pixbuf = get_pixbuf_from_window(window, 0, 0, w, h)
buf = []
def save_to_memory(data, *_args, **_kwargs):
buf.append(strtobytes(data))
return True
if is_gtk3():
pixbuf.save_to_callbackv(save_to_memory, None, "png", [], [])
else:
pixbuf.save_to_callback(save_to_memory, "png", {}, buf)
rowstride = w*3
return w, h, "png", rowstride, b"".join(buf)


class GTKRootWindowModel(RootWindowModel):

def __repr__(self):
Expand All @@ -26,13 +66,4 @@ def get_image(self, x, y, width, height):
return ImageWrapper(*v)

def take_screenshot(self):
log("grabbing screenshot")
w,h = self.window.get_size()
pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, w, h)
pixbuf = pixbuf.get_from_drawable(self.window, self.window.get_colormap(), 0, 0, 0, 0, w, h)
def save_to_memory(data, buf):
buf.append(data)
buf = []
pixbuf.save_to_callback(save_to_memory, "png", {}, buf)
rowstride = w*3
return w, h, "png", rowstride, "".join(buf)
return take_png_screenshot(self.window)

0 comments on commit 49df5dd

Please sign in to comment.