roundabout,
created on Saturday, 23 August 2025, 15:04:32 (1755961472),
received on Saturday, 23 August 2025, 19:06:24 (1755975984)
Author identity: Scott Moreau <oreaus@gmail.com>
8e2182d63d80af5f8c394e31191280ee45116ef6
applets/wf-window-list/__init__.py
@@ -334,74 +334,23 @@ class WindowButton(Gtk.ToggleButton):
# Due to a bug, the constructor may sometimes return C NULL
pass
class TooltipMedia(Gtk.GLArea):
class TooltipMedia(Gtk.Picture):
def __init__(self, window_list):
super().__init__()
self.frame: ZwlrScreencopyFrameV1 = None
self.screencopy_manager = window_list.screencopy_manager
self.wl_shm = window_list.wl_shm
self.window_list = window_list
self.set_auto_render(False)
self.connect("render", self.on_render)
self.buffer_width = 200
self.buffer_height = 200
self.buffer_stride = 200 * 4
self.screencopy_data = None
self.wl_buffer = None
self.size = 0
self.add_tick_callback(self.on_tick)
self.vertices = [
1.0, 1.0,
-1.0, 1.0,
-1.0, -1.0,
1.0, -1.0,
]
self.uv_coords = [
1.0, 0.0,
0.0, 0.0,
0.0, 1.0,
1.0, 1.0,
]
vertex_shader_source = """
precision highp float;
attribute vec2 in_position;
attribute vec2 uvpos;
varying vec2 uv;
void main() {
uv = uvpos;
gl_Position = vec4(in_position, 0.0, 1.0);
}
"""
fragment_shader_source = """
precision highp float;
uniform sampler2D texture;
varying vec2 uv;
void main() {
gl_FragColor = texture2D(texture, uv);
}
"""
vertex_shader = GL.glCreateShader(GL.GL_VERTEX_SHADER)
fragment_shader = GL.glCreateShader(GL.GL_FRAGMENT_SHADER)
GL.glShaderSource(vertex_shader, vertex_shader_source)
GL.glShaderSource(fragment_shader, fragment_shader_source)
GL.glCompileShader(vertex_shader)
GL.glCompileShader(fragment_shader)
self.shader_program = GL.glCreateProgram()
GL.glAttachShader(self.shader_program, vertex_shader)
GL.glAttachShader(self.shader_program, fragment_shader)
GL.glLinkProgram(self.shader_program)
self.texture_id = GL.glGenTextures(1)
GL.glBindTexture(GL.GL_TEXTURE_2D, self.texture_id)
GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR)
GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR)
self.request_next_frame()
@@ -420,20 +369,24 @@ class TooltipMedia(Gtk.GLArea):
anon_file.close()
self.buffer_width = width
self.buffer_height = height
self.buffer_stride = stride
self.frame.copy(self.wl_buffer)
def frame_ready(self, frame, tv_sec_hi, tv_sec_low, tv_nsec):
self.screencopy_data.seek(0)
GL.glBindTexture(GL.GL_TEXTURE_2D, self.texture_id)
GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, self.buffer_width, self.buffer_height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, self.screencopy_data.read(self.size))
self.request_next_frame()
texture = Gdk.MemoryTexture.new(
width=self.buffer_width,
height=self.buffer_height,
format=Gdk.MemoryFormat.R8G8B8A8,
bytes=GLib.Bytes(self.screencopy_data.read(self.size)),
stride=self.buffer_stride
)
self.set_paintable(texture)
def request_next_frame(self):
if self.frame:
self.frame.destroy()
self.queue_render()
wl_output = self.window_list.get_live_preview_output()
if not wl_output:
@@ -443,22 +396,7 @@ class TooltipMedia(Gtk.GLArea):
self.frame.dispatcher["buffer"] = self.frame_handle_buffer
self.frame.dispatcher["ready"] = self.frame_ready
def on_render(self, gl_area, gl_context):
Gdk.GLContext.make_current(gl_context)
GL.glClear(GL.GL_COLOR_BUFFER_BIT)
GL.glUseProgram(self.shader_program)
GL.glBindTexture(GL.GL_TEXTURE_2D, self.texture_id)
GL.glEnableVertexAttribArray(0);
GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, self.vertices);
GL.glEnableVertexAttribArray(1);
GL.glVertexAttribPointer(1, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, self.uv_coords);
GL.glDrawArrays(GL.GL_TRIANGLE_FAN, 0, 4);
GL.glDisableVertexAttribArray(0);
GL.glDisableVertexAttribArray(1);
GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
gl_area.queue_draw()
def on_tick(self, widget, frame_clock):
def on_tick(self, widget, clock):
self.request_next_frame()
return GLib.SOURCE_CONTINUE
@@ -525,6 +463,10 @@ class WFWindowList(panorama_panel.Applet):
self.get_msg_template = get_msg_template
if "live_previews/request_stream" in self.wf_socket.list_methods():
self.live_preview_tooltips = True
print("WFWindowList: Live Preview Tooltips: enabled")
else:
print("WFWindowList: Live Preview Tooltips: disabled")
print("- Live preview tooltips requires wayfire wf-live-previews plugin. Is it enabled?")
self.wf_socket.watch(["view-workspace-changed", "wset-workspace-changed"])
fd = self.wf_socket.client.fileno()
GLib.io_add_watch(GLib.IOChannel.unix_new(fd), GLib.IO_IN, self.on_wf_event, priority=GLib.PRIORITY_HIGH)