xpra icon
Bug tracker and wiki

Ticket #1320: lossless-scrolling.patch

File lossless-scrolling.patch, 4.8 KB (added by Antoine Martin, 19 months ago)

work in progress patch

  • xpra/server/window/window_source.py

     
    18061806        if not self.can_refresh():
    18071807            self.cancel_refresh_timer()
    18081808            return
    1809         encoding = strtobytes(packet[6])
     1809        encoding = bytestostr(packet[6])
     1810        log.info("schedule_auto_refresh: %s", encoding)
     1811        data = packet[7]
    18101812        region = rectangle(*packet[2:6])    #x,y,w,h
    18111813        client_options = packet[10]     #info about this packet from the encoder
    1812         if (encoding.startswith(b"png") and (self.image_depth<=24 or self.image_depth==32)) or encoding.startswith(b"rgb"):
     1814        self.do_schedule_auto_refresh(encoding, data, region, client_options, options)
     1815
     1816    def do_schedule_auto_refresh(self, encoding, data, region, client_options, options):
     1817        if (encoding.startswith("png") and (self.image_depth<=24 or self.image_depth==32)) or encoding.startswith("rgb"):
    18131818            actual_quality = 100
    18141819            lossy = False
    18151820        else:
  • xpra/server/window/window_video_source.py

     
    1717    WindowSource, DelayedRegions,
    1818    STRICT_MODE, AUTO_REFRESH_SPEED, AUTO_REFRESH_QUALITY, MAX_RGB,
    1919    )
    20 from xpra.rectangle import merge_all          #@UnresolvedImport
     20from xpra.rectangle import rectangle, merge_all          #@UnresolvedImport
    2121from xpra.server.window.motion import ScrollData                    #@UnresolvedImport
    2222from xpra.server.window.video_subregion import VideoSubregion, VIDEO_SUBREGION
    2323from xpra.server.window.video_scoring import get_pipeline_score
     
    18351835        scrolllog("scroll encoding total time: %ims", (self.last_scroll_time-start)*1000)
    18361836        return None
    18371837
     1838    def do_schedule_auto_refresh(self, encoding, data, region, client_options, options):
     1839        #data is a LargeStructure
     1840        if encoding=="scroll" and hasattr(data, "data"):
     1841            if not self.refresh_regions:
     1842                return
     1843            #check if any pending refreshes intersect the area containing the scroll data:
     1844            if not any(region.intersects_rect(r) for r in self.refresh_regions):
     1845                return
     1846            #FIXME: this does not run in the UI thead,
     1847            #so we can lose some refresh regions here..
     1848            rr = self.refresh_regions
     1849            newr = list(rr)
     1850            scroll_data = data.data
     1851            for x, y, w, h, dx, dy in scroll_data:
     1852                #the region that moved
     1853                src_rect = rectangle(x, y, w, h)
     1854                for rect in rr:
     1855                    inter = src_rect.intersection_rect(rect)
     1856                    if not inter:
     1857                        #does not intersect
     1858                        continue
     1859                    dst_rect = rectangle(inter.x+dx, inter.y+dy, inter.width, inter.height)
     1860                    add = True
     1861                    for i, tmp in enumerate(newr):
     1862                        if tmp==src_rect or src_rect.contains_rect(tmp) and dx<tmp.width and dy<tmp.height:
     1863                            #the whole refresh region is moved by this scrolling
     1864                            #and its new position overlaps the old one, so we can just merge it:
     1865                            #(note: if we ever support diagonal scrolling, this may make it bigger)
     1866                            newr[i] = rectangle(tmp.x+dx, tmp.y+dy, tmp.width+abs(dx), tmp.height+abs(dy))
     1867                            add = False
     1868                            break
     1869                        if tmp==dst_rect or tmp.contains_rect(dst_rect):
     1870                            add = False
     1871                            break
     1872                        if dst_rect.contains_rect(tmp):
     1873                            add = False
     1874                            newr[i] = dst_rect
     1875                            break
     1876                    if add:
     1877                        newr.append(dst_rect)
     1878            refreshlog.info("auto-refresh for scroll regions changed using %s", scroll_data)
     1879            refreshlog.info(" from %s", self.refresh_regions)
     1880            refreshlog.info("   to %s", newr)
     1881            self.refresh_regions = newr
     1882            #we don't change any of the refresh scheduling
     1883            #if there are non-scroll packets following this one, they will
     1884            #and if not then we're OK anyway
     1885            return
     1886        WindowSource.do_schedule_auto_refresh(self, encoding, data, region, client_options, options)
     1887
     1888
    18381889    def get_fallback_encoding(self, encodings, order):
    18391890        if order is None:
    18401891            if self._current_speed>=50: