xpra icon
Bug tracker and wiki

Ticket #1232: scrolling-pixmap-v2.patch

File scrolling-pixmap-v2.patch, 2.6 KB (added by Antoine Martin, 3 years ago)

almost working pixmap implementation (needs XPRA_REPAINT_ALL=1), shows the same corruption

  • xpra/client/gtk2/pixmap_backing.py

     
    4444        self.paint_scaling = 1, 1
    4545        GTK2WindowBacking.__init__(self, *args)
    4646
     47    def get_encoding_properties(self):
     48        props = GTK2WindowBacking.get_encoding_properties(self)
     49        props["encoding.scrolling"] = True
     50        return props
     51
    4752    def __repr__(self):
    4853        return "PixmapBacking(%s)" % self._backing
    4954
     
    5156        #use window size as backing size:
    5257        self.render_size = ww, wh
    5358        self.size = bw, bh
    54         w, h = bw, bh
    5559        old_backing = self._backing
     60        self.do_init_new_backing_instance()
     61        self.copy_backing(old_backing)
     62
     63    def do_init_new_backing_instance(self):
     64        w, h = self.size
    5665        self._backing = None
    5766        assert w<32768 and h<32768, "dimensions too big: %sx%s" % (w, h)
    5867        if w==0 or h==0:
     
    7180                self._backing = gdk.Pixmap(gdk.get_default_root_window(), w, h)
    7281        else:
    7382            self._backing = gdk.Pixmap(gdk.get_default_root_window(), w, h)
     83
     84    def copy_backing(self, old_backing):
     85        w, h = self.size
    7486        cr = self._backing.cairo_create()
    7587        cr.set_source_rgb(1, 1, 1)
    7688        if old_backing is not None:
     
    98110            cr.rectangle(0, 0, w, h)
    99111            cr.fill()
    100112
     113    def paint_scroll(self, *args):
     114        self.idle_add(self.do_paint_scroll, *args)
     115
     116    def do_paint_scroll(self, x, y, w, h, scrolls, options, callbacks):
     117        log.warn("paint_scroll%s", (x, y, w, h, scrolls, options, callbacks))
     118        old_backing = self._backing
     119        assert old_backing
     120        self.do_init_new_backing_instance()
     121        assert old_backing.get_size()==self.size
     122        w, h = self.size
     123        cr = self._backing.cairo_create()
     124        #first copy everything:
     125        cr.rectangle(0, 0, w, h)
     126        cr.set_operator(cairo.OPERATOR_SOURCE)
     127        cr.set_source_pixmap(old_backing, 0, 0)
     128        cr.paint()
     129        #then the regions that moved:
     130        for x,y,w,h,ydelta in scrolls:
     131            #assert y+ydelta>=0 and y+h+ydelta<=h
     132            cr = self._backing.cairo_create()
     133            cr.translate(0, ydelta)
     134            cr.set_source_pixmap(old_backing, 0, 0)
     135            cr.rectangle(x, y+ydelta, w, h)
     136            cr.paint()
     137
     138
    101139    def bgr_to_rgb(self, img_data, width, height, rowstride, rgb_format, target_format):
    102140        if not rgb_format.startswith("BGR"):
    103141            return img_data, rowstride