- Enforce redraw() only being called from main thread

- Added a bunch of INFO messages on redraw
- Don't request an image that has already been requested (consider passing fails over!)
This commit is contained in:
trigg 2021-10-18 19:34:19 +01:00
parent e29980577c
commit 5d5a2e0e9c
4 changed files with 91 additions and 30 deletions

View file

@ -604,6 +604,12 @@ class DiscordConnector:
if self.authed:
self.set_text_channel(self.text_settings.get_channel())
if self.voice_overlay.needsredraw:
self.voice_overlay.redraw()
if self.text_overlay.needsredraw:
self.text_overlay.redraw()
if len(self.rate_limited_channels) > 0:
guild = self.rate_limited_channels.pop()
cmd = {

View file

@ -61,6 +61,7 @@ class OverlayWindow(Gtk.Window):
self.pos_y = None
self.width = None
self.height = None
self.needsredraw = False
self.set_size_request(50, 50)
self.connect('draw', self.overlay_draw)
@ -101,7 +102,7 @@ class OverlayWindow(Gtk.Window):
Xatom.CARDINAL,32,
[0xffffffff], X.PropModeReplace)
print("Setting STEAM_EXTERNAL_OVERLAY")
logging.info("Setting STEAM_EXTERNAL_OVERLAY")
display.sync()
self.monitor = 0
self.align_right = True
@ -138,7 +139,8 @@ class OverlayWindow(Gtk.Window):
Set the font used by the overlay
"""
self.text_font = font
self.redraw()
self.needsredraw=True
logging.info("set_font redraw")
def set_floating(self, floating, pos_x, pos_y, width, height):
"""
@ -203,7 +205,7 @@ class OverlayWindow(Gtk.Window):
(width, height) = self.get_size()
self.width = width
self.height = height
self.redraw()
self.needsredraw = True
def redraw(self):
"""
@ -211,6 +213,7 @@ class OverlayWindow(Gtk.Window):
If we're using XShape (optionally or forcibly) then render the image into the shape
so that we only cut out clear sections
"""
self.needsredraw = False
gdkwin = self.get_window()
if not self.floating:
(width, height) = self.get_size()
@ -239,7 +242,9 @@ class OverlayWindow(Gtk.Window):
if mon:
GtkLayerShell.set_monitor(self, mon)
self.force_location()
self.redraw()
self.needsredraw = True
logging.info("set_monitor redraw")
def set_align_x(self, align_right):
"""
@ -247,7 +252,9 @@ class OverlayWindow(Gtk.Window):
"""
self.align_right = align_right
self.force_location()
self.redraw()
self.needsredraw = True
logging.info("set_align_x redraw")
def set_align_y(self, align_vert):
"""
@ -255,7 +262,9 @@ class OverlayWindow(Gtk.Window):
"""
self.align_vert = align_vert
self.force_location()
self.redraw()
self.needsredraw = True
logging.info("set_align_y redraw")
def col(self, col, alpha=1.0):
"""

View file

@ -63,28 +63,36 @@ class TextOverlayWindow(OverlayWindow):
"""
self.content = tlist
if altered:
self.redraw()
self.needsredraw = True
logging.info("set_text_list redraw")
def set_fg(self, fg_col):
"""
Set default text colour
"""
self.fg_col = fg_col
self.redraw()
self.needsredraw = True
logging.info("set_fg redraw")
def set_bg(self, bg_col):
"""
Set background colour
"""
self.bg_col = bg_col
self.redraw()
self.needsredraw = True
logging.info("set_bg redraw")
def set_show_attach(self, attachment):
"""
Set if attachments should be shown inline
"""
self.show_attach = attachment
self.redraw()
self.needsredraw = True
logging.info("set_show_attach redraw")
def set_popup_style(self, boolean):
"""
@ -102,7 +110,9 @@ class TextOverlayWindow(OverlayWindow):
font = Pango.FontDescription(self.text_font)
self.pango_rect.width = font.get_size() * Pango.SCALE
self.pango_rect.height = font.get_size() * Pango.SCALE
self.redraw()
self.needsredraw = True
logging.info("set_font redraw")
def make_line(self, message):
"""
@ -159,7 +169,9 @@ class TextOverlayWindow(OverlayWindow):
Called when an image has been downloaded by image_getter
"""
self.attachment[identifier] = pix
self.redraw()
self.needsredraw = True
logging.info("recv_attach redraw")
def overlay_draw(self, _w, context, data=None):
"""
@ -210,6 +222,7 @@ class TextOverlayWindow(OverlayWindow):
get_surface(self.recv_attach,
url,
url, None)
self.attachment[url] = None # Avoid asking repeatedly
else:
logging.warning("Unknown file extension '%s'", extension)
# cy = self.draw_text(cy, "%s" % (line['attach']))

View file

@ -70,91 +70,117 @@ class VoiceOverlayWindow(OverlayWindow):
Set the background colour
"""
self.norm_col = background_colour
self.redraw()
self.needsredraw = True
logging.info("set_bg redraw")
def set_fg(self, foreground_colour):
"""
Set the text colour
"""
self.text_col = foreground_colour
self.redraw()
self.needsredraw = True
logging.info("set_fg redraw")
def set_tk(self, talking_colour):
"""
Set the border colour for users who are talking
"""
self.talk_col = talking_colour
self.redraw()
self.needsredraw = True
logging.info("set_tk redraw")
def set_mt(self, mute_colour):
"""
Set the colour of mute and deafen logos
"""
self.mute_col = mute_colour
self.redraw()
self.needsredraw = True
logging.info("set_mt redraw")
def set_hi(self, highlight_colour):
"""
Set the colour of background for speaking users
"""
self.hili_col = highlight_colour
self.redraw()
self.needsredraw = True
logging.info("set_hi redraw")
def set_fg_hi(self, highlight_colour):
"""
Set the colour of background for speaking users
"""
self.text_hili_col = highlight_colour
self.redraw()
self.needsredraw = True
logging.info("set_fg_hi redraw")
def set_avatar_size(self, size):
"""
Set the size of the avatar icons
"""
self.avatar_size = size
self.redraw()
self.needsredraw = True
logging.info("set_avatar_size redraw")
def set_icon_spacing(self, i):
"""
Set the spacing between avatar icons
"""
self.icon_spacing = i
self.redraw()
self.needsredraw = True
logging.info("set_icon_spacing redraw")
def set_text_padding(self, i):
"""
Set padding between text and border
"""
self.text_pad = i
self.redraw()
self.needsredraw = True
logging.info("set_text_padding redraw")
def set_text_baseline_adj(self, i):
"""
Set padding between text and border
"""
self.text_baseline_adj = i
self.redraw()
self.needsredraw = True
logging.info("set_text_baseline_adj redraw")
def set_vert_edge_padding(self, i):
"""
Set padding between top/bottom of screen and overlay contents
"""
self.vert_edge_padding = i
self.redraw()
self.needsredraw = True
logging.info("set_text_vert_edge_padding redraw")
def set_horz_edge_padding(self, i):
"""
Set padding between left/right of screen and overlay contents
"""
self.horz_edge_padding = i
self.redraw()
self.needsredraw = True
logging.info("set_horz_edge_padding redraw")
def set_square_avatar(self, i):
"""
Set if the overlay should crop avatars to a circle or show full square image
"""
self.round_avatar = not i
self.redraw()
self.needsredraw = True
logging.info("set_square_avatar redraw")
def set_only_speaking(self, only_speaking):
"""
@ -179,11 +205,12 @@ class VoiceOverlayWindow(OverlayWindow):
Set if the overlay should draw only the icon
"""
self.icon_only = i
self.redraw()
self.needsredraw = True
logging.info("set_icon_only redraw")
def set_horizontal(self, horizontal=False):
self.horizontal = horizontal
self.redraw()
self.needsredraw = True
def set_guild_ids(self, guild_ids=tuple()):
try:
@ -242,7 +269,9 @@ class VoiceOverlayWindow(OverlayWindow):
alt = True
self.compositing = screen.is_composited()
if alt:
self.redraw()
self.needsredraw = True
logging.info("set_user_list redraw")
def set_connection(self, connection):
"""
@ -251,7 +280,9 @@ class VoiceOverlayWindow(OverlayWindow):
is_connected = connection == "VOICE_CONNECTED"
if self.connected != is_connected:
self.connected = is_connected
self.redraw()
self.needsredraw = True
logging.info("set_connection redraw")
def overlay_draw(self, _w, context, _data=None):
"""
@ -363,7 +394,9 @@ class VoiceOverlayWindow(OverlayWindow):
else:
self.avatars[identifier] = pix
if self.context:
self.redraw()
self.needsredraw = True
logging.info("recv_avatar redraw")
def draw_avatar(self, context, user, pos_y):
"""