Skip to content

Commit

Permalink
#1961: load xpm icons with gtk's pixbufloader before trying Pillow an…
Browse files Browse the repository at this point in the history
…d don't fail the whole desktop entry if we fail to load its icon

git-svn-id: https://xpra.org/svn/Xpra/trunk@20882 3bb7dfac-3a0b-4e04-842a-767bc560f471
  • Loading branch information
totaam committed Oct 30, 2018
1 parent 13e39eb commit f7ce21c
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 14 deletions.
11 changes: 11 additions & 0 deletions src/xpra/gtk_common/gtk_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
22 changes: 19 additions & 3 deletions src/xpra/platform/xposix/xdg_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
15 changes: 4 additions & 11 deletions src/xpra/server/shadow/gtk_root_window_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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):
Expand Down

0 comments on commit f7ce21c

Please sign in to comment.