diff --git a/src/xpra/gtk_common/gtk_util.py b/src/xpra/gtk_common/gtk_util.py index d1d8b93384..74ee361650 100644 --- a/src/xpra/gtk_common/gtk_util.py +++ b/src/xpra/gtk_common/gtk_util.py @@ -88,6 +88,17 @@ def popup_menu_workaround(*args): #only implemented with GTK2 on win32 below pass +def pixbuf_save_to_memory(pixbuf, fmt="png"): + 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, fmt, [], []) + else: + pixbuf.save_to_callback(save_to_memory, fmt, {}, buf) + return b"".join(buf) + if is_gtk3(): def is_realized(widget): diff --git a/src/xpra/platform/xposix/xdg_helper.py b/src/xpra/platform/xposix/xdg_helper.py index 2ecedb40f6..9d6ad3e297 100644 --- a/src/xpra/platform/xposix/xdg_helper.py +++ b/src/xpra/platform/xposix/xdg_helper.py @@ -65,13 +65,29 @@ def export(entry, properties=[]): def load_icon_from_file(filename): if filename.endswith("xpm"): + try: + from xpra.gtk_common.gobject_compat import import_pixbufloader + from xpra.gtk_common.gtk_util import pixbuf_save_to_memory + data = load_binary_file(filename) + loader = import_pixbufloader()() + loader.write(data) + loader.close() + pixbuf = loader.get_pixbuf() + pngicondata = pixbuf_save_to_memory(pixbuf, "png") + return pngicondata, "png" + except Exception as e: + log("pixbuf error loading %s", filename, exc_info=True) + log.error("Error loading '%s':", filename) + log.error(" %s", e) + #try PIL: from PIL import Image try: img = Image.open(filename) - except Exception: + except Exception as e: log("Image.open(%s)", filename, exc_info=True) - log.error("Error loading '%s'", filename) - raise + log.error("Error loading '%s':", filename) + log.error(" %s", e) + return None buf = BytesIOClass() img.save(buf, "PNG") pngicondata = buf.getvalue() diff --git a/src/xpra/server/shadow/gtk_root_window_model.py b/src/xpra/server/shadow/gtk_root_window_model.py index 32cd292919..0e2409af87 100644 --- a/src/xpra/server/shadow/gtk_root_window_model.py +++ b/src/xpra/server/shadow/gtk_root_window_model.py @@ -8,9 +8,9 @@ from xpra.log import Logger log = Logger("shadow") -from xpra.os_util import monotonic_time, strtobytes +from xpra.os_util import monotonic_time from xpra.codecs.image_wrapper import ImageWrapper -from xpra.gtk_common.gtk_util import get_pixbuf_from_window, is_gtk3 +from xpra.gtk_common.gtk_util import get_pixbuf_from_window, pixbuf_save_to_memory def get_rgb_rawdata(window, x, y, width, height): @@ -41,16 +41,9 @@ 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) + data = pixbuf_save_to_memory(pixbuf, "png") rowstride = w*3 - return w, h, "png", rowstride, b"".join(buf) + return w, h, "png", rowstride, data class GTKImageCapture(object):