2009-08-19 16 views
5

Per lo sfondo, sto usando Debian Lenny e ho provato questo con GNOME e Fluxbox.Perché X soffoca dopo che disegno nella finestra radice

In ogni caso, ho cercato a come disegnare sul desktop, e ho trovato e provato questo codice qui: http://blog.prashanthellina.com/2007/08/24/drawing-on-your-desktop/

Ha funzionato bene, se non dietro terminarlo (colpendo di controllo C), X perde la sua capacità di creare nuove finestre.

Avevo pensato che forse il problema è stato Pygame non rilasciando alcune risorse, così ho aggiunto in un blocco di codice per intrappolare il segnale kill, dandomi il seguente:

""" 
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) 

E così ho provato di nuovo. L'istruzione print nel gestore di interrupt mi ​​dice che il gestore viene eseguito quando esco, ma ho ancora lo stesso problema. E ancora più interessante, X non ha problemi mentre è in esecuzione. È solo dopo averlo chiuso.

Qualcuno là fuori ha idea di cosa sta succedendo e cosa posso fare per correggere il codice in modo da non rovinare la mia sessione X? Grazie in anticipo.

risposta

1

domande, idee & cose da provare:

  1. Se si dispone di un terminale prima di provare un -c, si può ancora inserire dopo? Se sì, è probabile che ci sia un problema nella sessione o nel gestore di finestre, non nel server x.
  2. Hai provato Ctrl-Alt-Backspace? Questo risolve il tuo problema?
  3. gtk-window-decorator e x-session-manager sono ancora in esecuzione?

pygame è in genere a corto di una finestra e normalmente cercherà di ripulire se stesso. Hai aggiunto una chiamata esplicita a pygame.display.quit(), ma non penso che questo cambi nulla - pygame prova ad eliminare la finestra a cui fa riferimento la variabile SDL_WINDOWID. In realtà riuscire a cancellare la tua finestra di root è probabilmente una brutta cosa. Ho intenzione di indovinare che il tipo da cui hai preso questo, eseguendo Ubuntu, Pygame non riesce a eliminare la finestra perché non ha il permesso. Potresti sul tuo sistema operativo.

Poiché l'eliminazione della finestra di root non è buona, che dire del ripristino del controllo della finestra di root su Nautilus (gnome)? qualcosa come gconftool-2 --type bool --set /apps/nautilus/preferences/show_desktop true?

+0

In risposta alle domande: 1.) Posso ancora digitare il terminale, anche se cominciano a succedere cose strane. Ad esempio, mentre digito questo commento in Firefox, non ho un cursore. 2.) Sì, questo risolve il problema. 3.) Non sono sicuro di come dirlo. Ho provato ps ax | grep gtk e ps ax | sessione grep, ma non vedo nessuno dei due processi. E in realtà, in esecuzione in fluxbox, non sto usando nautilus, quindi le cose relative a gconftool sembrano irrilevanti. Ma in ogni caso, grazie per il consiglio. – BigBeagle

+0

Bene, hai citato sia gnome che fluxbox. Avrei dovuto dire che tutti i miei commenti erano diretti verso gnome. Mi dispiace per quello Se stai eseguendo gnome, * sicuramente * dovresti vedere quei processi in esecuzione. Inoltre, nautilus gestisce il tuo desktop (gnome), oltre a funzionare come un browser di file. – DaveParillo

Problemi correlati