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 as e: log("Image.open(%s)", filename, exc_info=True) log.error("Error loading '%s':", filename) log.error(" %s", e) return None buf = BytesIOClass() img.save(buf, "PNG") pngicondata = buf.getvalue() buf.close() return pngicondata, "png" icondata = load_binary_file(filename) if not icondata: return None log("got icon data from '%s': %i bytes", filename, len(icondata)) return icondata, os.path.splitext(filename)[1].rstrip(".")
def load_icon_from_file(filename): log("load_icon_from_file(%s)", 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 as e: log("Image.open(%s)", filename, exc_info=True) log.error("Error loading '%s':", filename) log.error(" %s", e) return None buf = BytesIO() img.save(buf, "PNG") pngicondata = buf.getvalue() buf.close() return pngicondata, "png" icondata = load_binary_file(filename) if not icondata: return None log("got icon data from '%s': %i bytes", filename, len(icondata)) if len(icondata) > MAX_ICON_SIZE and first_time( "icon-size-warning-%s" % filename): log.warn("Warning: icon is quite large (%i KB):", len(icondata) // 1024) log.warn(" '%s'", filename) return icondata, os.path.splitext(filename)[1].lstrip(".")
# This file is part of Xpra. # Copyright (C) 2008 Nathaniel Smith <*****@*****.**> # Copyright (C) 2012-2015 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. from xpra.gtk_common.gobject_compat import import_gdk, import_gobject, import_pixbufloader, import_cairo gdk = import_gdk() gobject = import_gobject() cairo = import_cairo() PixbufLoader = import_pixbufloader() from xpra.gtk_common.gtk_util import cairo_set_source_pixbuf, gdk_cairo_context from xpra.client.gtk_base.gtk_window_backing_base import GTKWindowBacking from xpra.codecs.loader import get_codec from xpra.os_util import BytesIOClass, memoryview_to_bytes, strtobytes from xpra.log import Logger log = Logger("paint", "cairo") FORMATS = {-1: "INVALID"} for x in (f for f in dir(cairo) if f.startswith("FORMAT_")): FORMATS[getattr(cairo, x)] = x.replace("FORMAT_", "") """ Superclass for gtk2 and gtk3 cairo implementations. """ class CairoBackingBase(GTKWindowBacking):
def load_icon_from_file(filename): log("load_icon_from_file(%s)", 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 as e: log("Image.open(%s)", filename, exc_info=True) log.error("Error loading '%s':", filename) log.error(" %s", e) return None buf = BytesIO() img.save(buf, "PNG") pngicondata = buf.getvalue() buf.close() return pngicondata, "png" icondata = load_binary_file(filename) if not icondata: return None if filename.endswith("svg") and len(icondata) > MAX_ICON_SIZE // 2: #try to resize it try: size = len(icondata) import cairo import gi try: gi.require_version('Rsvg', '2.0') except ValueError as e: if first_time("no-rsvg"): log.warn( "Warning: cannot resize svg icons, Rsvg bindings not found:" ) log.warn(" %s", e) else: from gi.repository import Rsvg img = cairo.ImageSurface(cairo.FORMAT_ARGB32, 128, 128) ctx = cairo.Context(img) handle = Rsvg.Handle.new_from_data(icondata) handle.render_cairo(ctx) buf = BytesIO() img.write_to_png(buf) icondata = buf.getvalue() buf.close() log( "reduced size of SVG icon %s, from %i bytes to %i bytes as PNG", filename, size, len(icondata)) filename = filename[:-3] + "png" except ImportError: log("cannot convert svg", exc_info=True) except Exception: log.error("Error: failed to convert svg icon", exc_info=True) log("got icon data from '%s': %i bytes", filename, len(icondata)) if len(icondata) > MAX_ICON_SIZE and first_time( "icon-size-warning-%s" % filename): log.warn("Warning: icon is quite large (%i KB):", len(icondata) // 1024) log.warn(" '%s'", filename) return icondata, os.path.splitext(filename)[1].lstrip(".")
from xpra.os_util import memoryview_to_bytes from xpra.util import AdHocStruct, bytestostr, typedict, WORKSPACE_UNSET, WORKSPACE_ALL, WORKSPACE_NAMES from xpra.gtk_common.gobject_compat import import_gtk, import_gdk, import_cairo, import_pixbufloader, get_xid from xpra.gtk_common.gobject_util import no_arg_signal from xpra.gtk_common.gtk_util import get_pixbuf_from_data, get_default_root_window, is_realized, WINDOW_POPUP, WINDOW_TOPLEVEL from xpra.gtk_common.keymap import KEY_TRANSLATIONS from xpra.client.client_window_base import ClientWindowBase from xpra.platform.gui import set_fullscreen_monitors, set_shaded from xpra.codecs.argb.argb import unpremultiply_argb, bgra_to_rgba #@UnresolvedImport from xpra.platform.gui import add_window_hooks, remove_window_hooks gtk = import_gtk() gdk = import_gdk() cairo = import_cairo() PixbufLoader = import_pixbufloader() CAN_SET_WORKSPACE = False HAS_X11_BINDINGS = False if os.name=="posix" and os.environ.get("XPRA_SET_WORKSPACE", "1")!="0": try: from xpra.x11.gtk_x11.prop import prop_get, prop_set from xpra.x11.bindings.window_bindings import constants, X11WindowBindings, SHAPE_KIND #@UnresolvedImport from xpra.x11.bindings.core_bindings import X11CoreBindings from xpra.gtk_common.error import xsync from xpra.x11.gtk_x11.send_wm import send_wm_workspace X11Window = X11WindowBindings() X11Core = X11CoreBindings() HAS_X11_BINDINGS = True SubstructureNotifyMask = constants["SubstructureNotifyMask"]
from xpra.gtk_common.gtk_util import ( add_close_accel, display_get_default, color_parse, get_preferred_size, pixbuf_new_from_file, STATE_NORMAL, RELIEF_NORMAL, ) from xpra.notifications.notifier_base import NotifierBase, log from xpra.gtk_common.gobject_compat import import_gtk, import_glib, import_gdk, import_pixbufloader gtk = import_gtk() gdk = import_gdk() glib = import_glib() pixbuf_loader = import_pixbufloader() DEFAULT_FG_COLOUR = None DEFAULT_BG_COLOUR = None if OSX: #black on white fits better with osx DEFAULT_FG_COLOUR = color_parse("black") DEFAULT_BG_COLOUR = color_parse("#f2f2f2") DEFAULT_WIDTH = 340 DEFAULT_HEIGHT = 100 def get_pixbuf(icon_name): from xpra.platform.paths import get_icon_dir icon_filename = os.path.join(get_icon_dir(), icon_name) if os.path.exists(icon_filename):