def get_pixbuf(self, icon_name): try: if not icon_name: log("get_pixbuf(%s)=None", icon_name) return None icon_filename = get_icon_filename(icon_name) log("get_pixbuf(%s) icon_filename=%s", icon_name, icon_filename) if icon_filename: return self.do_get_pixbuf(icon_filename) except: log.error("get_pixbuf(%s)", icon_name, exc_info=True) return None
def get_pixbuf(self, icon_name): from xpra.platform.paths import get_icon_filename from xpra.gtk_common.gtk_util import pixbuf_new_from_file try: if not icon_name: traylog("get_pixbuf(%s)=None", icon_name) return None icon_filename = get_icon_filename(icon_name) traylog("get_pixbuf(%s) icon_filename=%s", icon_name, icon_filename) if icon_filename: return pixbuf_new_from_file(icon_filename) except: traylog.error("get_pixbuf(%s)", icon_name, exc_info=True) return None
def test_gl_client_window(gl_client_window_class, max_window_size=(1024, 1024), pixel_depth=24, show=False): #try to render using a temporary window: draw_result = {} window = None try: x, y = -100, -100 if show: x, y = 100, 100 w, h = 250, 250 from xpra.codecs.loader import load_codec load_codec("dec_pillow") from xpra.client.window_border import WindowBorder border = WindowBorder() default_cursor_data = None noclient = FakeClient() #test with alpha, but not on win32 #because we can't do alpha on win32 with opengl metadata = typedict({b"has-alpha": not WIN32}) class NoHeaderGLClientWindow(gl_client_window_class): def add_header_bar(self): pass def schedule_recheck_focus(self): pass window = NoHeaderGLClientWindow(noclient, None, None, 2**32 - 1, x, y, w, h, w, h, metadata, False, typedict({}), border, max_window_size, default_cursor_data, pixel_depth) window_backing = window._backing window_backing.idle_add = no_idle_add window_backing.timeout_add = no_timeout_add window_backing.source_remove = no_source_remove window.realize() window_backing.paint_screen = True pixel_format = "BGRX" bpp = len(pixel_format) options = typedict({"pixel_format": pixel_format}) stride = bpp * w coding = "rgb32" widget = window_backing._backing widget.realize() def paint_callback(success, message=""): log("paint_callback(%s, %s)", success, message) draw_result["success"] = success if message: draw_result["message"] = message.replace("\n", " ") log("OpenGL: testing draw on %s widget %s with %s : %s", window, widget, coding, pixel_format) pix = AtomicInteger(0x7f) REPAINT_DELAY = envint("XPRA_REPAINT_DELAY", int(show) * 16) gl_icon = get_icon_filename("opengl", ext="png") icon_data = None if os.path.exists(gl_icon): from PIL import Image img = Image.open(gl_icon) img.load() icon_w, icon_h = img.size icon_stride = icon_w * 4 noalpha = Image.new("RGB", img.size, (255, 255, 255)) noalpha.paste(img, mask=img.split()[3]) # 3 is the alpha channel buf = BytesIO() noalpha.save(buf, format="JPEG") icon_data = buf.getvalue() buf.close() icon_format = "jpeg" if not icon_data: icon_w = 32 icon_h = 32 icon_stride = icon_w * 4 icon_data = bytes([0]) * icon_stride * icon_h icon_format = "rgb32" def draw(): v = pix.increase() img_data = bytes([v % 256] * stride * h) options["flush"] = 1 window.draw_region(0, 0, w, h, coding, img_data, stride, v, options, [paint_callback]) options["flush"] = 0 mx = w // 2 - icon_w // 2 my = h // 2 - icon_h // 2 x = iround(mx * (1 + sin(v / 100))) y = iround(my * (1 + cos(v / 100))) window.draw_region(x, y, icon_w, icon_h, icon_format, icon_data, icon_stride, v, options, [paint_callback]) return REPAINT_DELAY > 0 #the paint code is actually synchronous here, #so we can check the present_fbo() result: if show: widget.show() window.show() from gi.repository import Gtk, GLib def window_close_event(*_args): Gtk.main_quit() noclient.window_close_event = window_close_event GLib.timeout_add(REPAINT_DELAY, draw) Gtk.main() else: draw() if window_backing.last_present_fbo_error: return { "success": False, "message": "failed to present FBO on screen: %s" % window_backing.last_present_fbo_error } finally: if window: window.destroy() log("test_gl_client_window(..) draw_result=%s", draw_result) return draw_result
def main(): from xpra.platform import program_context with program_context("Xpra-Sound-Source"): import os.path if "-v" in sys.argv: log.enable_debug() sys.argv.remove("-v") if len(sys.argv) not in (2, 3): log.error("usage: %s filename [codec] [--encoder=rencode]", sys.argv[0]) return 1 filename = sys.argv[1] if filename=="-": from xpra.os_util import disable_stdout_buffering disable_stdout_buffering() elif os.path.exists(filename): log.error("file %s already exists", filename) return 1 codec = None codecs = get_codecs() if len(sys.argv)==3: codec = sys.argv[2] if codec not in codecs: log.error("invalid codec: %s, codecs supported: %s", codec, codecs) return 1 else: parts = filename.split(".") if len(parts)>1: extension = parts[-1] if extension.lower() in codecs: codec = extension.lower() log.info("guessed codec %s from file extension %s", codec, extension) if codec is None: codec = MP3 log.info("using default codec: %s", codec) #in case we're running against pulseaudio, #try to setup the env: try: from xpra.platform.paths import get_icon_filename f = get_icon_filename("xpra.png") from xpra.sound.pulseaudio.pulseaudio_util import add_audio_tagging_env add_audio_tagging_env(icon_path=f) except Exception as e: log.warn("failed to setup pulseaudio tagging: %s", e) from threading import Lock if filename=="-": f = sys.stdout else: f = open(filename, "wb") ss = SoundSource(codecs=[codec]) lock = Lock() def new_buffer(ss, data, metadata): log.info("new buffer: %s bytes (%s), metadata=%s", len(data), type(data), metadata) with lock: if f: f.write(data) f.flush() from xpra.gtk_common.gobject_compat import import_glib glib = import_glib() glib_mainloop = glib.MainLoop() ss.connect("new-buffer", new_buffer) ss.start() import signal def deadly_signal(sig, frame): log.warn("got deadly signal %s", SIGNAMES.get(sig, sig)) glib.idle_add(ss.stop) glib.idle_add(glib_mainloop.quit) def force_quit(sig, frame): sys.exit() signal.signal(signal.SIGINT, force_quit) signal.signal(signal.SIGTERM, force_quit) from xpra.gtk_common.gobject_compat import is_gtk3 if not is_gtk3(): signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) try: glib_mainloop.run() except Exception as e: log.error("main loop error: %s", e) ss.stop() f.flush() if f!=sys.stdout: log.info("wrote %s bytes to %s", f.tell(), filename) with lock: f.close() f = None return 0
def get_icon_filename(self, basename=None): return get_icon_filename(basename or self.default_icon_filename, self.default_icon_extension)
def get_icon_filename(self, basename=None): name = basename or self.default_icon_filename f = get_icon_filename(name, self.default_icon_extension) if not f: log.error("Error: cannot find icon '%s'", name) return f
def main(): from xpra.platform import program_context with program_context("Xpra-Sound-Source"): import os.path if "-v" in sys.argv: log.enable_debug() sys.argv.remove("-v") if len(sys.argv) not in (2, 3): log.error("usage: %s filename [codec] [--encoder=rencode]", sys.argv[0]) return 1 filename = sys.argv[1] if filename == "-": from xpra.os_util import disable_stdout_buffering disable_stdout_buffering() elif os.path.exists(filename): log.error("file %s already exists", filename) return 1 codec = None encoders = get_encoders() if len(sys.argv) == 3: codec = sys.argv[2] if codec not in encoders: log.error("invalid codec: %s, codecs supported: %s", codec, encoders) return 1 else: parts = filename.split(".") if len(parts) > 1: extension = parts[-1] if extension.lower() in encoders: codec = extension.lower() log.info("guessed codec %s from file extension %s", codec, extension) if codec is None: codec = MP3 log.info("using default codec: %s", codec) #in case we're running against pulseaudio, #try to setup the env: try: from xpra.platform.paths import get_icon_filename f = get_icon_filename("xpra.png") from xpra.sound.pulseaudio.pulseaudio_util import add_audio_tagging_env add_audio_tagging_env(icon_path=f) except Exception as e: log.warn("failed to setup pulseaudio tagging: %s", e) from threading import Lock if filename == "-": f = sys.stdout else: f = open(filename, "wb") ss = SoundSource(codecs=[codec]) lock = Lock() def new_buffer(ss, data, metadata, packet_metadata): log.info("new buffer: %s bytes (%s), metadata=%s", len(data), type(data), metadata) with lock: if f: for x in packet_metadata: f.write(x) f.write(data) f.flush() from xpra.gtk_common.gobject_compat import import_glib glib = import_glib() glib_mainloop = glib.MainLoop() ss.connect("new-buffer", new_buffer) ss.start() import signal def deadly_signal(sig, frame): log.warn("got deadly signal %s", SIGNAMES.get(sig, sig)) glib.idle_add(ss.stop) glib.idle_add(glib_mainloop.quit) def force_quit(sig, frame): sys.exit() signal.signal(signal.SIGINT, force_quit) signal.signal(signal.SIGTERM, force_quit) from xpra.gtk_common.gobject_compat import is_gtk3 if not is_gtk3(): signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) try: glib_mainloop.run() except Exception as e: log.error("main loop error: %s", e) ss.stop() f.flush() if f != sys.stdout: log.info("wrote %s bytes to %s", f.tell(), filename) with lock: f.close() f = None return 0