Example #1
0
 def _process_desktop_size(self, proto, packet):
     width, height = packet[1:3]
     ss = self._server_sources.get(proto)
     if ss is None:
         return
     ss.desktop_size = (width, height)
     if len(packet) >= 10:
         #added in 0.16 for scaled client displays:
         xdpi, ydpi = packet[8:10]
         if xdpi != self.xdpi or ydpi != self.ydpi:
             self.xdpi, self.ydpi = xdpi, ydpi
             log("new dpi: %ix%i", self.xdpi, self.ydpi)
             self.dpi = iround((self.xdpi + self.ydpi) / 2.0)
             self.dpi_changed()
     if len(packet) >= 8:
         #added in 0.16 for scaled client displays:
         ss.desktop_size_unscaled = packet[6:8]
     if len(packet) >= 6:
         desktops, desktop_names = packet[4:6]
         ss.set_desktops(desktops, desktop_names)
         self.calculate_desktops()
     if len(packet) >= 4:
         ss.set_screen_sizes(packet[3])
     log("client requesting new size: %sx%s", width, height)
     self.set_screen_size(width, height)
     if len(packet) >= 4:
         log.info("received updated display dimensions")
         log.info("client display size is %sx%s with %s screen%s:", width,
                  height, len(ss.screen_sizes), engs(ss.screen_sizes))
         log_screen_sizes(width, height, ss.screen_sizes)
         self.calculate_workarea(width, height)
     #ensures that DPI and antialias information gets reset:
     self.update_all_server_settings()
Example #2
0
 def do_parse_screen_info(self, ss, desktop_size):
     log("do_parse_screen_info%s", (ss, desktop_size))
     dw, dh = None, None
     if desktop_size:
         try:
             dw, dh = desktop_size
             if not ss.screen_sizes:
                 log.info(" client root window size is %sx%s", dw, dh)
             else:
                 log.info(
                     " client root window size is %sx%s with %s display%s:",
                     dw, dh, len(ss.screen_sizes), engs(ss.screen_sizes))
                 log_screen_sizes(dw, dh, ss.screen_sizes)
         except Exception:
             dw, dh = None, None
     sw, sh = self.configure_best_screen_size()
     log("configure_best_screen_size()=%s", (sw, sh))
     #we will tell the client about the size chosen in the hello we send back,
     #so record this size as the current server desktop size to avoid change notifications:
     ss.desktop_size_server = sw, sh
     #prefer desktop size, fallback to screen size:
     w = dw or sw
     h = dh or sh
     #clamp to max supported:
     maxw, maxh = self.get_max_screen_size()
     w = min(w, maxw)
     h = min(h, maxh)
     self.set_desktop_geometry_attributes(w, h)
     self.set_icc_profile()
     return w, h
Example #3
0
    def get_caps(self):
        caps = {
            "randr_notify": True,
            "show-desktop": True,
        }
        wm_name = get_wm_name()
        if wm_name:
            caps["wm_name"] = wm_name

        self._last_screen_settings = self.get_screen_settings()
        root_w, root_h, sss, ndesktops, desktop_names, u_root_w, u_root_h, _, _ = self._last_screen_settings
        if u_root_w and u_root_h:
            caps["desktop_size"] = self.cp(u_root_w, u_root_h)
        if ndesktops:
            caps["desktops"] = ndesktops
            caps["desktop.names"] = desktop_names

        ss = self.get_screen_sizes()
        self._current_screen_sizes = ss

        log.info(" desktop size is %sx%s with %s screen%s:", u_root_w,
                 u_root_h, len(ss), engs(ss))
        log_screen_sizes(u_root_w, u_root_h, ss)
        if self.xscale != 1 or self.yscale != 1:
            caps["screen_sizes.unscaled"] = ss
            caps["desktop_size.unscaled"] = u_root_w, u_root_h
            root_w, root_h = self.cp(u_root_w, u_root_h)
            if fequ(self.xscale, self.yscale):
                sinfo = "%i%%" % iround(self.xscale * 100)
            else:
                sinfo = "%i%% x %i%%" % (iround(
                    self.xscale * 100), iround(self.yscale * 100))
            log.info(" %sscaled by %s, virtual screen size: %ix%i",
                     ["down",
                      "up"][int(u_root_w > root_w
                                or u_root_h > root_h)], sinfo, root_w, root_h)
            log_screen_sizes(root_w, root_h, sss)
        else:
            root_w, root_h = u_root_w, u_root_h
            sss = ss
        caps["screen_sizes"] = sss

        caps.update(self.get_screen_caps())
        caps.update(
            flatten_dict({
                "dpi": self.get_dpi_caps(),
                "screen-scaling": self.get_scaling_caps(),
            }))
        return caps
Example #4
0
    def get_caps(self) -> dict:
        caps = {
            "randr_notify": True,
            "show-desktop": True,
            "vrefresh": self.get_vrefresh(),
        }
        wm_name = get_wm_name()
        if wm_name:
            caps["wm_name"] = wm_name

        self._last_screen_settings = self.get_screen_settings()
        root_w, root_h, sss, ndesktops, desktop_names, u_root_w, u_root_h = self._last_screen_settings[:
                                                                                                       7]
        if u_root_w and u_root_h:
            caps["desktop_size"] = self.cp(u_root_w, u_root_h)
        if ndesktops:
            caps["desktops"] = ndesktops
            caps["desktop.names"] = tuple(desktop_names)

        ss = self.get_screen_sizes()
        self._current_screen_sizes = ss

        log.info(" desktop size is %sx%s:", u_root_w, u_root_h)
        log_screen_sizes(u_root_w, u_root_h, ss)
        if self.xscale != 1 or self.yscale != 1:
            caps["screen_sizes.unscaled"] = ss
            caps["desktop_size.unscaled"] = u_root_w, u_root_h
            root_w, root_h = self.cp(u_root_w, u_root_h)
            if fequ(self.xscale, self.yscale):
                sinfo = "%i%%" % iround(self.xscale * 100)
            else:
                sinfo = "%i%% x %i%%" % (iround(
                    self.xscale * 100), iround(self.yscale * 100))
            scaled_up = u_root_w > root_w or u_root_h > root_h
            log.info(" %sscaled to %s, virtual screen size: %ix%i",
                     "up" if scaled_up else "down", sinfo, root_w, root_h)
            log_screen_sizes(root_w, root_h, sss)
        else:
            root_w, root_h = u_root_w, u_root_h
            sss = ss
        caps["screen_sizes"] = sss

        caps.update(self.get_screen_caps())
        caps.update(
            flatten_dict({
                "dpi": self.get_dpi_caps(),
                "screen-scaling": self.get_scaling_caps(),
            }))
        return caps
Example #5
0
 def update_screen_size(self):
     self.screen_size_change_timer = None
     screen_settings = self.get_screen_settings()
     log("update_screen_size()     new settings=%s", screen_settings)
     log("update_screen_size() current settings=%s", self._last_screen_settings)
     if self._last_screen_settings==screen_settings:
         log("screen size unchanged")
         return
     root_w, root_h, sss = screen_settings[:3]
     log.info("sending updated screen size to server: %sx%s", root_w, root_h)
     log_screen_sizes(root_w, root_h, sss)
     if self.server_desktop_size:
         self.send("desktop_size", *screen_settings)
     self._last_screen_settings = screen_settings
     #update the max packet size (may have gone up):
     self.set_max_packet_size()
Example #6
0
 def _process_desktop_size(self, proto, packet):
     log("new desktop size from %s: %s", proto, packet)
     width, height = packet[1:3]
     ss = self.get_server_source(proto)
     if ss is None:
         return
     ss.desktop_size = (width, height)
     if len(packet)>=11:
         vrefresh = packet[10]
         log("new vrefresh=%s", vrefresh)
         #update clientdisplay mixin:
         if hasattr(ss, "vrefresh") and getattr(ss, "refresh")!=vrefresh:
             ss.vrefresh = vrefresh
             #update all batch configs:
             if hasattr(ss, "all_window_sources"):
                 for window_source in ss.all_window_sources():
                     bc = window_source.batch_config
                     if bc:
                         bc.match_vrefresh(vrefresh)
     if len(packet)>=10:
         #added in 0.16 for scaled client displays:
         xdpi, ydpi = packet[8:10]
         if xdpi!=self.xdpi or ydpi!=self.ydpi:
             self.xdpi, self.ydpi = xdpi, ydpi
             log("new dpi: %ix%i", self.xdpi, self.ydpi)
             self.dpi = round((self.xdpi + self.ydpi)/2)
             self.dpi_changed()
     if len(packet)>=8:
         #added in 0.16 for scaled client displays:
         ss.desktop_size_unscaled = packet[6:8]
     if len(packet)>=6:
         desktops, desktop_names = packet[4:6]
         ss.set_desktops(desktops, desktop_names)
         self.calculate_desktops()
     if len(packet)>=4:
         ss.set_screen_sizes(packet[3])
     bigger = ss.screen_resize_bigger
     log("client requesting new size: %sx%s (bigger=%s)", width, height, bigger)
     self.set_screen_size(width, height, bigger)
     if len(packet)>=4:
         log.info("received updated display dimensions")
         log.info("client display size is %sx%s",
                  width, height)
         log_screen_sizes(width, height, ss.screen_sizes)
         self.calculate_workarea(width, height)
     #ensures that DPI and antialias information gets reset:
     self.update_all_server_settings()
Example #7
0
 def test_log_screen_sizes(self):
     #whatever you throw at it, it should continue:
     log_screen_sizes(0, 0, None)
     log_screen_sizes(None, object(), ["invalid"])
Example #8
0
 def print_screen_info(self):
     X11ServerBase.print_screen_info(self)
     root_w, root_h = get_root_size()
     sss = get_screen_sizes()
     log_screen_sizes(root_w, root_h, sss)
Example #9
0
 def print_screen_info(self):
     super().print_screen_info()
     root_w, root_h = get_root_size()
     log.info(" initial resolution: %ix%i", root_w, root_h)
     sss = get_screen_sizes()
     log_screen_sizes(root_w, root_h, sss)
Example #10
0
    def parse_server_capabilities(self):
        for c in CLIENT_BASES:
            if not c.parse_server_capabilities(self):
                log.info("failed to parse server capabilities in %s", c)
                return  False
        c = self.server_capabilities
        self.server_session_name = strtobytes(c.rawget("session_name", b"")).decode("utf-8")
        set_name("Xpra", self.session_name or self.server_session_name or "Xpra")
        self.server_platform = c.strget("platform")
        self.server_sharing = c.boolget("sharing")
        self.server_sharing_toggle = c.boolget("sharing-toggle")
        self.server_lock = c.boolget("lock")
        self.server_lock_toggle = c.boolget("lock-toggle")
        self.server_keyboard = c.boolget("keyboard", True)
        self.server_toggle_keyboard_sync = self.server_keyboard and c.boolget("toggle_keyboard_sync", True)
        self.server_pointer = c.boolget("pointer", True)
        self.server_start_new_commands = c.boolget("start-new-commands")
        if self.server_start_new_commands:
            self.server_xdg_menu = c.dictget("xdg-menu", None)
        if self.start_new_commands or self.start_child_new_commands:
            if self.server_start_new_commands:
                self.after_handshake(self.send_start_new_commands)
            else:
                log.warn("Warning: cannot start new commands")
                log.warn(" the feature is currently disabled on the server")
        self.server_commands_info = c.boolget("server-commands-info")
        self.server_commands_signals = c.strlistget("server-commands-signals")
        self.server_readonly = c.boolget("readonly")
        if self.server_readonly and not self.readonly:
            log.info("server is read only")
            self.readonly = True
        if not self.server_keyboard and self.keyboard_helper:
            #swallow packets:
            def nosend(*_args):
                pass
            self.keyboard_helper.send = nosend

        i = platform_name(self._remote_platform,
                          c.strlistget("platform.linux_distribution") or c.strget("platform.release", ""))
        r = self._remote_version
        if self._remote_revision:
            r += "-r%s" % self._remote_revision
        mode = c.strget("server.mode", "server")
        bits = c.intget("python.bits", 32)
        log.info("Xpra %s server version %s %i-bit", mode, std(r), bits)
        if i:
            log.info(" running on %s", std(i))
        if c.boolget("desktop") or c.boolget("shadow"):
            v = c.intpair("actual_desktop_size")
            if v:
                w, h = v
                ss = c.listget("screen_sizes")
                if ss:
                    log.info(" remote desktop size is %sx%s with %s screen%s:", w, h, len(ss), engs(ss))
                    log_screen_sizes(w, h, ss)
                else:
                    log.info(" remote desktop size is %sx%s", w, h)
        if c.boolget("proxy"):
            proxy_hostname = c.strget("proxy.hostname")
            proxy_platform = c.strget("proxy.platform")
            proxy_release = c.strget("proxy.platform.release")
            proxy_version = c.strget("proxy.version")
            proxy_version = c.strget("proxy.build.version", proxy_version)
            proxy_distro = c.strget("proxy.linux_distribution")
            msg = "via: %s proxy version %s" % (
                platform_name(proxy_platform, proxy_distro or proxy_release),
                std(proxy_version or "unknown")
                )
            if proxy_hostname:
                msg += " on '%s'" % std(proxy_hostname)
            log.info(msg)
        return True
Example #11
0
 def print_screen_info(self):
     super(XpraDesktopServer, self).print_screen_info()
     root_w, root_h = get_root_size()
     sss = get_screen_sizes()
     log_screen_sizes(root_w, root_h, sss)
Example #12
0
 def print_screen_info(self):
     X11ServerBase.print_screen_info(self)
     root_w, root_h = get_root_size()
     sss = get_screen_sizes()
     log_screen_sizes(root_w, root_h, sss)