Skip to content

Commit

Permalink
#3317 opaque-region is actually a list of rectangles
Browse files Browse the repository at this point in the history
handle this wherever we can - not in the client yet because GTK only supports a single rectangle..
  • Loading branch information
totaam committed Nov 26, 2021
1 parent 96a9a05 commit 76410f3
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 16 deletions.
2 changes: 1 addition & 1 deletion xpra/client/client_window_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@ def set_metadata(self, metadata):
self.set_skip_pager_hint(skip_pager)

if "opaque-region" in metadata:
opaque_region = metadata.inttupleget("opaque-region", None, 0, 4)
opaque_region = metadata.inttupleget("opaque-region", None, 0)
if self._opaque_region!=opaque_region:
self._opaque_region = opaque_region
self.set_opaque_region(opaque_region)
Expand Down
28 changes: 17 additions & 11 deletions xpra/server/window/window_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -848,11 +848,14 @@ def update_encoding_options(self, force_reload=False):
self._want_alpha = self.is_tray or (self.has_alpha and self.supports_transparency)
ww, wh = self.window_dimensions
opr = self._opaque_region
if opr and len(opr)==4:
r = rectangle(*opr)
if r.contains(0, 0, ww, wh):
#window is fully opaque
self._want_alpha = False
if opr and len(opr)%4==0:
while opr:
r = rectangle(*(opr[:4]))
if r.contains(0, 0, ww, wh):
#window is fully opaque
self._want_alpha = False
break
opr = opr[4:]
self._lossless_threshold_base = min(90, 60+self._current_speed//5 + int(cv*100))
if self.content_type.find("text")>=0 or self.is_shadow:
self._lossless_threshold_base -= 20
Expand Down Expand Up @@ -1938,12 +1941,15 @@ def nodata(msg, *args):
image_depth = image.get_depth()
opr = self._opaque_region
if image_depth==32 and pixel_format.find("A")>=0 and opr:
r = rectangle(*opr)
if r.contains(x, y, w, h):
pixel_format = pixel_format.replace("A", "X") #ie: BGRA -> BGRX
image.set_pixel_format(pixel_format)
image_depth = 24
log("removed alpha from image metadata: %s", pixel_format)
while opr:
r = rectangle(*(opr[:4]))
if r.contains(x, y, w, h):
pixel_format = pixel_format.replace("A", "X") #ie: BGRA -> BGRX
image.set_pixel_format(pixel_format)
image_depth = 24
log("removed alpha from image metadata: %s", pixel_format)
break
opr = opr[4:]
self.image_depth = image_depth
self.pixel_format = pixel_format
return image
Expand Down
10 changes: 6 additions & 4 deletions xpra/x11/models/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -615,10 +615,12 @@ def _handle_class_change(self):
self._updateprop("class-instance", class_instance)

def _handle_opaque_region_change(self):
region = ()
if OPAQUE_REGION:
region = tuple(self.prop_get("_NET_WM_OPAQUE_REGION", ["u32"]) or [])
metalog("_NET_WM_OPAQUE_REGION=%s", region)
v = tuple(self.prop_get("_NET_WM_OPAQUE_REGION", ["u32"]) or [])
if OPAQUE_REGION and len(v)%4==0:
region = v
else:
region = ()
metalog("_NET_WM_OPAQUE_REGION(%s)=%s (OPAQUE_REGION=%s)", v, region, OPAQUE_REGION)
self._updateprop("opaque-region", region)

#these handlers must not generate X11 errors (must use XSync)
Expand Down

0 comments on commit 76410f3

Please sign in to comment.