Lock during refresh in order to manage concurrency, fixes #5
This commit is contained in:
parent
39b4157836
commit
597dd658f4
|
@ -4,7 +4,7 @@ from datetime import datetime
|
||||||
from random import randint
|
from random import randint
|
||||||
from typing import Any, Tuple
|
from typing import Any, Tuple
|
||||||
from ipaddress import IPv6Address
|
from ipaddress import IPv6Address
|
||||||
from threading import Thread
|
from threading import Thread, RLock
|
||||||
import curses
|
import curses
|
||||||
import re
|
import re
|
||||||
import socket
|
import socket
|
||||||
|
@ -55,6 +55,9 @@ class Squirrel(Hazelnut):
|
||||||
self.input_index = 0
|
self.input_index = 0
|
||||||
self.last_line = -1
|
self.last_line = -1
|
||||||
|
|
||||||
|
# Lock the refresh function in order to avoid concurrent refresh
|
||||||
|
self.refresh_lock = RLock()
|
||||||
|
|
||||||
self.history = []
|
self.history = []
|
||||||
self.received_messages = dict()
|
self.received_messages = dict()
|
||||||
self.history_pad = curses.newpad(curses.LINES - 2, curses.COLS)
|
self.history_pad = curses.newpad(curses.LINES - 2, curses.COLS)
|
||||||
|
@ -371,6 +374,8 @@ class Squirrel(Hazelnut):
|
||||||
"""
|
"""
|
||||||
Rewrite the history of the messages.
|
Rewrite the history of the messages.
|
||||||
"""
|
"""
|
||||||
|
self.refresh_lock.acquire()
|
||||||
|
|
||||||
y, x = self.squinnondation.screen.getmaxyx()
|
y, x = self.squinnondation.screen.getmaxyx()
|
||||||
if curses.is_term_resized(curses.LINES, curses.COLS):
|
if curses.is_term_resized(curses.LINES, curses.COLS):
|
||||||
curses.resizeterm(y, x)
|
curses.resizeterm(y, x)
|
||||||
|
@ -398,10 +403,14 @@ class Squirrel(Hazelnut):
|
||||||
y_offset += true_width // (curses.COLS - 1)
|
y_offset += true_width // (curses.COLS - 1)
|
||||||
self.history_pad.refresh(0, 0, 0, 0, curses.LINES - 2, curses.COLS)
|
self.history_pad.refresh(0, 0, 0, 0, curses.LINES - 2, curses.COLS)
|
||||||
|
|
||||||
|
self.refresh_lock.release()
|
||||||
|
|
||||||
def refresh_input(self) -> None:
|
def refresh_input(self) -> None:
|
||||||
"""
|
"""
|
||||||
Redraw input line. Must not be called while the message is not sent.
|
Redraw input line. Must not be called while the message is not sent.
|
||||||
"""
|
"""
|
||||||
|
self.refresh_lock.acquire()
|
||||||
|
|
||||||
self.input_pad.erase()
|
self.input_pad.erase()
|
||||||
color_id = sum(ord(c) for c in self.nickname) % 6 + 1
|
color_id = sum(ord(c) for c in self.nickname) % 6 + 1
|
||||||
self.input_pad.addstr(0, 0, "<")
|
self.input_pad.addstr(0, 0, "<")
|
||||||
|
@ -416,6 +425,8 @@ class Squirrel(Hazelnut):
|
||||||
self.input_pad.addstr(0, self.input_pad.getmaxyx()[1] - 3, "😀")
|
self.input_pad.addstr(0, self.input_pad.getmaxyx()[1] - 3, "😀")
|
||||||
self.input_pad.refresh(0, 0, curses.LINES - 1, 0, curses.LINES - 1, curses.COLS - 1)
|
self.input_pad.refresh(0, 0, curses.LINES - 1, 0, curses.LINES - 1, curses.COLS - 1)
|
||||||
|
|
||||||
|
self.refresh_lock.release()
|
||||||
|
|
||||||
def refresh_emoji_pad(self) -> None:
|
def refresh_emoji_pad(self) -> None:
|
||||||
"""
|
"""
|
||||||
Display the emoji pad if necessary.
|
Display the emoji pad if necessary.
|
||||||
|
@ -425,6 +436,8 @@ class Squirrel(Hazelnut):
|
||||||
|
|
||||||
from emoji import unicode_codes
|
from emoji import unicode_codes
|
||||||
|
|
||||||
|
self.refresh_lock.acquire()
|
||||||
|
|
||||||
self.emoji_pad.erase()
|
self.emoji_pad.erase()
|
||||||
|
|
||||||
if self.emoji_panel_page > 0:
|
if self.emoji_panel_page > 0:
|
||||||
|
@ -455,6 +468,8 @@ class Squirrel(Hazelnut):
|
||||||
self.emoji_pad.refresh(0, 0, curses.LINES - height - 2, curses.COLS - width - 2,
|
self.emoji_pad.refresh(0, 0, curses.LINES - height - 2, curses.COLS - width - 2,
|
||||||
curses.LINES - 2, curses.COLS - 2)
|
curses.LINES - 2, curses.COLS - 2)
|
||||||
|
|
||||||
|
self.refresh_lock.release()
|
||||||
|
|
||||||
|
|
||||||
class Worm(Thread):
|
class Worm(Thread):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue