def _on_frame(self, _listener, _data): wlr_output = self.wlr_output with PixmanRegion32() as damage: if not self.damage.attach_render(damage): # no new frame needed wlr_output.rollback() return with wlr_output: if not damage.not_empty(): # No damage, only buffer swap needed return now = Timespec.get_monotonic_time() renderer = self.renderer renderer.begin(*wlr_output.effective_resolution()) if self.wallpaper: renderer.render_texture(self.wallpaper, self.transform_matrix, 0, 0, 1) else: renderer.clear([0, 0, 0, 1]) mapped = self.layers[LayerShellV1Layer.BACKGROUND] \ + self.layers[LayerShellV1Layer.BOTTOM] \ + self.core.mapped_windows \ + self.layers[LayerShellV1Layer.TOP] \ + self.layers[LayerShellV1Layer.OVERLAY] for window in mapped: if isinstance(window, Internal): renderer.render_texture( window.texture, self.transform_matrix, window.x - self.x, # layout coordinates -> output coordinates window.y - self.y, window.opacity, ) else: rdata = ( now, window, window.x - self.x, # layout coordinates -> output coordinates window.y - self.y, window.opacity, wlr_output.scale, ) window.surface.for_each_surface( self._render_surface, rdata) wlr_output.render_software_cursors(damage=damage) renderer.end()
def _on_frame(self, _listener, _data): wlr_output = self.wlr_output with PixmanRegion32() as damage: if not self.damage.attach_render(damage): # no new frame needed wlr_output.rollback() return with wlr_output: if not damage.not_empty(): # No damage, only buffer swap needed return now = Timespec.get_monotonic_time() renderer = self.renderer renderer.begin(*wlr_output.effective_resolution()) if self.wallpaper: renderer.render_texture(self.wallpaper, self.transform_matrix, 0, 0, 1) else: renderer.clear([0, 0, 0, 1]) for window in self._mapped_windows: rdata = ( now, window, self.x + window.x, self.y + window.y, window.opacity, wlr_output.scale, ) window.surface.for_each_surface(self._render_surface, rdata) wlr_output.render_software_cursors(damage=damage) renderer.end()
def _on_frame(self, _listener, _data): wlr_output = self.wlr_output with PixmanRegion32() as damage: if not self._damage.attach_render(damage): # no new frame needed wlr_output.rollback() return with wlr_output: if not damage.not_empty(): # No damage, only buffer swap needed return now = Timespec.get_monotonic_time() renderer = self.renderer renderer.begin(wlr_output._ptr.width, wlr_output._ptr.height) scale = wlr_output.scale if self.wallpaper: width, height = wlr_output.effective_resolution() box = Box(0, 0, int(width * scale), int(height * scale)) matrix = Matrix.project_box(box, wlr_output.transform, 0, wlr_output.transform_matrix) renderer.render_texture_with_matrix( self.wallpaper, matrix, 1) else: renderer.clear([0, 0, 0, 1]) mapped = (self.layers[LayerShellV1Layer.BACKGROUND] + self.layers[LayerShellV1Layer.BOTTOM] + self.core.mapped_windows + self.layers[LayerShellV1Layer.TOP] + self.layers[LayerShellV1Layer.OVERLAY]) for window in mapped: if isinstance(window, Internal): box = Box( int((window.x - self.x) * scale), int((window.y - self.y) * scale), int(window.width * scale), int(window.height * scale), ) matrix = Matrix.project_box( box, wlr_output.transform, 0, wlr_output.transform_matrix) renderer.render_texture_with_matrix( window.texture, matrix, window.opacity) else: rdata = ( now, window, window.x - self.x, # layout coordinates -> output coordinates window.y - self.y, window.opacity, wlr_output.scale, ) window.surface.for_each_surface( self._render_surface, rdata) if self.core.live_dnd: self._render_dnd_icon(now) wlr_output.render_software_cursors(damage=damage) renderer.end()
def _on_frame(self, _listener: Listener, _data: Any) -> None: with PixmanRegion32() as damage: try: if not self._damage.attach_render(damage): # No new frame needed. self.wlr_output.rollback() return except RuntimeError: # Failed to attach render; skip. return with self.wlr_output as wlr_output: if not damage.not_empty(): # No damage, only buffer swap needed. return now = Timespec.get_monotonic_time() scale = wlr_output.scale transform_matrix = wlr_output.transform_matrix with self.renderer.render( wlr_output._ptr.width, wlr_output._ptr.height ) as renderer: if self.wallpaper: width, height = wlr_output.effective_resolution() box = Box(0, 0, int(width * scale), int(height * scale)) matrix = Matrix.project_box(box, no_transform, 0, transform_matrix) renderer.render_texture_with_matrix(self.wallpaper, matrix, 1) else: renderer.clear([0, 0, 0, 1]) mapped: Sequence[WindowType] = ( self.layers[LayerShellV1Layer.BACKGROUND] + self.layers[LayerShellV1Layer.BOTTOM] + self.core.mapped_windows # type: ignore + self.layers[LayerShellV1Layer.TOP] + self.layers[LayerShellV1Layer.OVERLAY] ) for window in mapped: if isinstance(window, Internal): box = Box( int((window.x - self.x) * scale), int((window.y - self.y) * scale), int(window.width * scale), int(window.height * scale), ) matrix = Matrix.project_box(box, no_transform, 0, transform_matrix) renderer.render_texture_with_matrix( window.texture, matrix, window.opacity ) else: rdata = ( now, window, window.x - self.x, # layout coordinates -> output coordinates window.y - self.y, window.opacity, scale, transform_matrix, ) window.surface.for_each_surface(self._render_surface, rdata) if self.core.live_dnd: self._render_dnd_icon(self.core.live_dnd, now, scale, transform_matrix) wlr_output.render_software_cursors(damage=damage)
def current(self) -> PixmanRegion32: return PixmanRegion32(ffi.addressof(self._ptr.current))
def region(self) -> PixmanRegion32: return PixmanRegion32(self._ptr.region)
def region(self) -> PixmanRegion32: region_ptr = ffi.addressof(self._ptr, "region") return PixmanRegion32(region_ptr)