Почему X задыхается после того, как я рисую в корневом окне - PullRequest
5 голосов
/ 20 августа 2009

Для фона я бегу Debian Lenny, и попробовал это с GNOME и Fluxbox.

Во всяком случае, я смотрел на то, как рисовать на рабочем столе, и я нашел и попробовал этот код здесь: http://blog.prashanthellina.com/2007/08/24/drawing-on-your-desktop/

Это работало нормально, за исключением того, что после его завершения (нажатием клавиши C) X теряет способность создавать новые окна.

Я думал, что, возможно, проблема в том, что pygame не высвобождает какой-либо ресурс, поэтому я добавил блок кода для перехвата сигнала уничтожения, давая мне следующее:

"""
Run the following command in the shell before executing this script
export SDL_WINDOWID=`xwininfo -root|grep "id:"|sed 's/^.*id: //'|sed 's/ (.*$//'`
"""
import pygame
import sys
import random
import time
import signal





pygame.init()

window = pygame.display.set_mode((1280, 1024))
screen = pygame.display.get_surface()


def handle_sigint(signum, frame):
   """I want to ensure resources are released before bailing."""
   print("SIGINT received.");
   pygame.display.quit()
   pygame.quit()
   sys.exit(0)


# Set handler to catch C^C Interupts
signal.signal(signal.SIGINT, handle_sigint)


while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit(0)

    x = random.choice(range(640))
    y = random.choice(range(480))
    radius = random.choice(range(100))
    col_r = random.choice(range(255))
    col_g = random.choice(range(255))
    col_b = random.choice(range(255))

    time.sleep(.03)
    rect = pygame.draw.circle(screen, (col_r, col_g, col_b), (x,y), radius)
    pygame.display.update(rect)

И поэтому я попробовал еще раз. Оператор print в обработчике прерываний говорит мне, что этот обработчик запускается, когда я завершаю работу, но у меня все еще остается та же проблема. И что еще интереснее, у X нет проблем во время работы. Это только после его завершения.

Может ли кто-нибудь там иметь представление о том, что происходит, и что я могу сделать, чтобы исправить код, чтобы он не разрушил мою сессию X? Заранее спасибо.

1 Ответ

1 голос
/ 15 сентября 2009

Вопросы, идеи и вещи, которые стоит попробовать:

  1. Если у вас есть терминал до того, как вы попробуете -c, можете ли вы его ввести после? Если да, то, скорее всего, проблема в вашем менеджере сеансов или окон, а не на сервере x.
  2. Вы пробовали Ctrl-Alt-Backspace? Устраняет ли это вашу проблему?
  3. Работают ли gtk-window-decorator и x-session-manager?

pygame, как правило, запускается из окна и обычно пытается очистить после себя. Вы добавили явный вызов pygame.display.quit (), но я не думаю, что это что-то меняет - pygame пытается удалить окно, на которое ссылается переменная SDL_WINDOWID. На самом деле успешное удаление корневого окна, вероятно, плохо. Я собираюсь догадаться, что парень, у которого вы это получили, работает с Ubuntu, Pygame не может удалить окно, потому что у него нет разрешения. Вы можете на вашей ОС.

Поскольку уничтожение корневого окна - это плохо, как насчет восстановления контроля над корневым окном обратно в nautilus (gnome)? что-то вроде gconftool-2 --type bool --set /apps/nautilus/preferences/show_desktop true?

...