import sys
import pygame  # pylint: disable=import-error
import cv2  # pylint: disable=import-error

class Window():
  def __init__(self, w, h, caption="window", double=False, halve=False):
    self.w = w
    self.h = h
    pygame.display.init()
    pygame.display.set_caption(caption)
    self.double = double
    self.halve = halve
    if self.double:
      self.screen = pygame.display.set_mode((w*2, h*2))
    elif self.halve:
      self.screen = pygame.display.set_mode((w//2, h//2))
    else:
      self.screen = pygame.display.set_mode((w, h))

  def draw(self, out):
    pygame.event.pump()
    if self.double:
      out2 = cv2.resize(out, (self.w*2, self.h*2))
      pygame.surfarray.blit_array(self.screen, out2.swapaxes(0, 1))
    elif self.halve:
      out2 = cv2.resize(out, (self.w//2, self.h//2))
      pygame.surfarray.blit_array(self.screen, out2.swapaxes(0, 1))
    else:
      pygame.surfarray.blit_array(self.screen, out.swapaxes(0, 1))
    pygame.display.flip()

  def getkey(self):
    while 1:
      event = pygame.event.wait()
      if event.type == pygame.QUIT:
        pygame.quit()
        sys.exit()
      if event.type == pygame.KEYDOWN:
        return event.key

  def getclick(self):
    for event in pygame.event.get():
      if event.type == pygame.MOUSEBUTTONDOWN:
        mx, my = pygame.mouse.get_pos()
        return mx, my

if __name__ == "__main__":
  import numpy as np
  win = Window(200, 200, double=True)
  img = np.zeros((200, 200, 3), np.uint8)
  while 1:
    print("draw")
    img += 1
    win.draw(img)

import sys
import pygame  # pylint: disable=import-error
import cv2  # pylint: disable=import-error

class Window():
  def __init__(self, w, h, caption="window", double=False, halve=False):
    self.w = w
    self.h = h
    pygame.display.init()
    pygame.display.set_caption(caption)
    self.double = double
    self.halve = halve
    if self.double:
      self.rw, self.rh = w*2, h*2
    elif self.halve:
      self.rw, self.rh = w//2, h//2
    else:
      self.rw, self.rh = w, h
    self.screen = pygame.display.set_mode((self.rw, self.rh))
    pygame.display.flip()

    # hack for xmonad, it shrinks the window by 6 pixels after the display.flip
    if self.screen.get_width() != self.rw:
      self.screen = pygame.display.set_mode((self.rw+(self.rw-self.screen.get_width()), self.rh+(self.rh-self.screen.get_height())))
      pygame.display.flip()

  def draw(self, out):
    pygame.event.pump()
    if self.double:
      out2 = cv2.resize(out, (self.w*2, self.h*2))
      pygame.surfarray.blit_array(self.screen, out2.swapaxes(0, 1))
    elif self.halve:
      out2 = cv2.resize(out, (self.w//2, self.h//2))
      pygame.surfarray.blit_array(self.screen, out2.swapaxes(0, 1))
    else:
      pygame.surfarray.blit_array(self.screen, out.swapaxes(0, 1))
    pygame.display.flip()

  def getkey(self):
    while 1:
      event = pygame.event.wait()
      if event.type == pygame.QUIT:
        pygame.quit()
        sys.exit()
      if event.type == pygame.KEYDOWN:
        return event.key

  def getclick(self):
    for event in pygame.event.get():
      if event.type == pygame.MOUSEBUTTONDOWN:
        mx, my = pygame.mouse.get_pos()
        return mx, my

if __name__ == "__main__":
  import numpy as np
  win = Window(200, 200, double=True)
  img = np.zeros((200, 200, 3), np.uint8)
  while 1:
    print("draw")
    img += 1
    win.draw(img)

fix in window for xmonad with SDL2 (#23786)