#!/usr/bin/python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2022/08/05 10:04:00 +0900> """ xscreensaver by pygame sample. * Ubuntu Linux 20.04 LTS + Python 2.7.18 + pygame 1.9.3 * xwininfo 1.1.5 (sudo apt install x11-utils) """ import os import sys import math import platform import random import subprocess import re IMG_FILE = "ball_64x64.png" FPS = 60 class Ball: def __init__(self, img, scrw, scrh, t): self.img = img self.img_w = img.get_width() self.img_h = img.get_height() self.scrw = scrw self.scrh = scrh self.x = random.randint(16, scrw - self.img_w - 16) self.y = random.randint(16, scrh - self.img_h - 16) ang = random.randint(0, 360) spd = float(scrw) / t self.dx = spd * math.cos(math.radians(ang)) self.dy = spd * math.sin(math.radians(ang)) def update(self): self.x += self.dx self.y += self.dy if self.x <= 0 or self.x >= self.scrw - self.img_w: self.dx *= -1 if self.y <= 0 or self.y >= self.scrh - self.img_h: self.dy *= -1 def draw(self, screen): screen.blit(self.img, (self.x, self.y)) def main(): if platform.system() == "Windows": os.environ["SDL_VIDEODRIVER"] = "windib" print("$SDL_VIDEODRIVER = %s" % os.environ["SDL_VIDEODRIVER"]) else: # Linux or Darwin # os.environ["SDL_VIDEODRIVER"] = "x11" pass if "XSCREENSAVER_WINDOW" in os.environ: # xscreensaver hwnd = os.environ["XSCREENSAVER_WINDOW"] os.environ["SDL_WINDOWID"] = str(int(hwnd, 16)) # print("$XSCREENSAVER_WINDOW = %s" % os.environ["XSCREENSAVER_WINDOW"]) # print("$SDL_WINDOWID = %s" % os.environ["SDL_WINDOWID"]) # get window size using xwininfo cmd = ["xwininfo", "-id", os.environ["XSCREENSAVER_WINDOW"]] p = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) ret = str(p.communicate()) size_info = re.search('Width:\s+(\d+)[^H]+Height:\s+(\d+)', ret) w, h = size_info.groups() scrw = int(w) scrh = int(h) else: # not xscreensaver hwnd = None scrw, scrh = 512, 256 import pygame # pygame.init() pygame.display.init() # print("driver = %s" % pygame.display.get_driver()) # print("pygame.display.get_wm_info()") # print(pygame.display.get_wm_info()) # print("pygame.display.Info()") # print(pygame.display.Info()) screen = pygame.display.set_mode((scrw, scrh)) # pygame.display.set_caption('xscreensaver by pygame') # load image base_dir = os.path.realpath(os.path.dirname(__file__)) file_path = os.path.join(base_dir, IMG_FILE) img = pygame.image.load(file_path).convert() img.set_colorkey(img.get_at((0, 0)), pygame.RLEACCEL) # create balls balls = [] for i in range(16): balls.append(Ball(img, scrw, scrh, 60.0 * 3.0)) clock = pygame.time.Clock() looping = True while looping: # main loop # event check for event in pygame.event.get(): if event.type == pygame.QUIT: looping = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE or event.key == pygame.K_q: looping = False if not looping: break # move balls for obj in balls: obj.update() # fill bg screen.fill((0, 0, 0)) # draw balls for obj in balls: obj.draw(screen) pygame.display.flip() clock.tick(FPS) pygame.quit() sys.exit() if __name__ == '__main__': main()