diff --git a/editor.py b/editor.py index b76e2fb..1c7909b 100644 --- a/editor.py +++ b/editor.py @@ -1,4 +1,12 @@ +import network import tkinter as tk +import sys + +listen_addr = ("0.0.0.0", int(sys.argv[1])) +send_addr = ("192.168.0.255", int(sys.argv[2])) + +sock = network.Sock() +waiting_for_text = True root = tk.Tk() @@ -14,9 +22,31 @@ def diff(old, new): def area_input(event): #print(area.get("1.0", "end")) print(event) - if event.keycode == 25: - area.mark_set("insert", "1.0") + sock.send({"type":"insert", "start":"1.0", "text":area.get("1.0", "end")}, send_addr) + + #if event.keycode == 25: + # area.mark_set("insert", "1.0") + +def on_request(r): + global waiting_for_text + print(r) + c, a = r + if c["type"] == "set": + if waiting_for_text: + area.replace("1.0", "end", c["text"]) + waiting_for_text = False + elif c["type"] == "insert": + area.insert(c["start"], c["text"]) + elif c["type"] == "replace": + area.replace(c["start"], c["end"], c["text"]) + elif c["type"] == "get": + sock.send({"type":"set", "text":area.get("1.0", "end")}, send_addr) + area.insert("1.0", r[1]) area.bind("", area_input) +sock.listen(listen_addr, on_request) + +sock.send({"type":"get"}, send_addr) + root.mainloop() diff --git a/network.py b/network.py new file mode 100644 index 0000000..91b1c7e --- /dev/null +++ b/network.py @@ -0,0 +1,76 @@ +import socket, os, sys, json +from threading import Thread, Lock + +NETTRACE = str(os.environ.get("NETTRACE", "0")) == "1" + +class Sock: + def __init__(self): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) + self.queue = [] + self.queue_lock = Lock() + self.sock_thread = None + + def send_raw(self, message, address): + if type(message) == str: + message = message.encode() + if NETTRACE: + print("Send to", tuple(address), ":", message, file=sys.stderr) + self.sock.sendto(message, tuple(address)) + + # Envoie une requete + def send(self, message, address): + message = json.dumps(message) + if NETTRACE: + print("Send to", tuple(address), ":", message, file=sys.stderr) + self.sock.sendto(message.encode(), tuple(address)) + + # Ecoute sur une adresse + # Si la fonction callback est donnee, elle sera appelee avec les requetes recues. + # La methode get ne fonctionnera pas si un callback est defini. + def listen(self, address, callback=None, length=65535): + self.sock_thread = SockThread(self, tuple(address), length, callback) + self.sock_thread.setDaemon(True) + self.sock_thread.start() + + def get_raw(self): + if len(self.queue) == 0: + return [] + with self.queue_lock: + queue = self.queue + self.queue = [] + return queue + + # Retourne la liste des requetes recues depuis le dernier appel a get + def get(self): + if len(self.queue) == 0: + return [] + queue = [] + with self.queue_lock: + for r in self.queue: + try: + queue.append([json.loads(r[0].decode()), r[1]]) + except: + pass + self.queue.clear() + return queue + +class SockThread(Thread): + def __init__(self, sock, address, length, callback=None): + Thread.__init__(self) + self.sock = sock + self.length = length + self.sock.sock.bind(tuple(address)) + self.callback = callback + + def run(self): + while True: + r = self.sock.sock.recvfrom(self.length) + if NETTRACE: + print("Rec from", r[1], ":", r[0], file=sys.stderr) + if self.callback: + self.callback([json.loads(r[0].decode()), r[1]]) + else: + with self.sock.queue_lock: + self.sock.queue.append(r)