old_contents: import curses
  import sys
  import threading
  from maps import Map
  from chunks import ChunkPool
  
  # import fron chunks, maps, clientchunkpool
  
  class Client():
  	def __init__(self, address):
  		self.address = address
  		self.pool = ChunkPool()
  		#self.map_ = Map(sizex, sizey, self.pool)
  		#self.chunkmap = Chunkmap(sizex, sizey, self.pool) # size changeable by +/-?
  		
  		#self.sock = socket.Socket(...)
  	
  	def launch(self, stdscr):
  		sizey, sizex = stdscr.getmaxyx()
  		self.map_ = Map(sizex, sizey, self.pool)
  		
  		stdscr.noutrefresh()
  		self.map_.draw()
  		curses.doupdate()
  		stdscr.getkey()
  		self.map_.worldx += 1
  		self.map_.cursorx += 2
  		self.map_.cursory += 1
  		stdscr.noutrefresh()
  		self.map_.draw()
  		curses.doupdate()
  		stdscr.getkey()
  	
  	def get_input(self, scr):
  		pass
  	
  	def stop(self):
  		pass
  
  def main(argv):
  	if len(argv) != 2:
  		print("Usage:")
  		print("  {} address".format(argv[0]))
  		return
  	
  	client = Client(argv[1])
  	curses.wrapper(client.launch)
  
  if __name__ == "__main__":
  	main(sys.argv)
  
new_contents: import curses
  import sys
  import threading
  from maps import Map
  from chunks import ChunkPool
  
  # import fron chunks, maps, clientchunkpool
  
  class Client():
  	def __init__(self, address):
  		self.stopping = False
  		
  		self.address = address
  		self.drawevent = threading.Event()
  		self.pool = ChunkPool()
  		#self.map_ = Map(sizex, sizey, self.pool)
  		#self.chunkmap = Chunkmap(sizex, sizey, self.pool) # size changeable by +/-?
  		
  		#self.sock = socket.Socket(...)
  	
  	def launch(self, stdscr):
  		sizey, sizex = stdscr.getmaxyx()
  		self.map_ = Map(sizex, sizey, self.pool, self.drawevent)
  		
  		# start input thread
  		self.inputthread = threading.Thread(
  			target=self.input_thread,
  			name="inputthread",
  			args=(stdscr,),
  			daemon=True
  		)
  		self.inputthread.start()
  		
  		while not self.stopping:
  			self.drawevent.wait()
  			stdscr.noutrefresh()
  			with self.map_ as m:
  				m.draw()
  			curses.doupdate()
  			self.drawevent.clear()
  	
  	def input_thread(self, scr):
  		while True:
  			i = scr.getkey()
  			
  			if i == "q": self.stop()
  			# normal cursor movement
  			elif i == "KEY_UP":     self.map_.move_cursor(0, -1)
  			elif i == "KEY_DOWN":   self.map_.move_cursor(0, 1)
  			elif i == "KEY_LEFT":   self.map_.move_cursor(-1, 0)
  			elif i == "KEY_RIGHT":  self.map_.move_cursor(1, 0)
  			# quick cursor movement (5 vertical, 10 horizontal)
  			elif i == "KEY_SR":     self.map_.move_cursor(0, -5)
  			elif i == "KEY_SF":     self.map_.move_cursor(0, 5)
  			elif i == "KEY_SLEFT":  self.map_.move_cursor(-10, 0)
  			elif i == "KEY_SRIGHT": self.map_.move_cursor(10, 0)
  			# scrolling the map (10 vertical, 20 horizontal)
  			elif i == "kUP5": self.map_.scroll(0, -10)
  			elif i == "kDN5": self.map_.scroll(0, 10)
  			elif i == "kLFT5": self.map_.scroll(-20, 0)
  			elif i == "kRIT5": self.map_.scroll(20, 0)
  			
  			else: sys.stdout.write(repr(i) + "\n")
  	
  	def stop(self):
  		self.stopping = True
  		self.drawevent.set()
  
  def main(argv):
  	if len(argv) != 2:
  		print("Usage:")
  		print("  {} address".format(argv[0]))
  		return
  	
  	client = Client(argv[1])
  	curses.wrapper(client.launch)
  
  if __name__ == "__main__":
  	main(sys.argv)
  
subject: Add input thread and some map keybindings