I want to create a fullscreen panel that visually blocks access to everything on the screen (desktop, menu, Unity Panel, etc in Ubuntu (11.10)), but stays below other applications' opened windows.
This is mainly to make the laptop child proof. I want the kid (4 years old) to have access to some selected apps ie. gcompris, childs play, tux math, etc. but not really to other apps and settings. Something like custom desktop + launcher panel without anything to break, no access to files, etc.
I want the panel to contain some buttons that would start other applications (using subprocess.call) but the panel itself needs to stay under anything that's launched from it or to make things easier just so it stays under any opened fullscreen games and every opened window (even when the panel takes focus).
Python tkinter's fullscreen overrideredirect(True) would be perfect (with a password protected close button) if not the fact that it does not allow other applications to appear over it and I'm not sure if it is possible to make it stay at the bottom of everything.
Any idea how to change this behavior if possible, or any other tools that would enable me to do this in python or otherwise?
Edit: additional info:
I have got it nearly working but another strange behaviour with overrideredirect(True). I could lower() the app at the start and its ok, but when I do it with the overrideredirect(True) the app disappears completely. Non-fullscreen testing code below:
from tkinter import *
def btn1_click():app.quit();app.destroy()
def btn2_click():app.lower()
def handler():
if tkinter.messagebox.askyesno("Quit?", "Are you sure you want to quit?"):
app.quit();app.destroy()
app = Tk()
app.title("Testing...")
app.geometry('300x100+200+100')
#app.overrideredirect(True)
#app.lower()
b1 = Button(app, text = "Exit!", width = 10, command = btn1_click);b1.pack()
b2 = Button(app, text = "Lower", width = 10, command = btn2_click);b2.pack()
app.protocol("WM_DELETE_WINDOW", handler)
app.mainloop()
when you run it as it is it will open new window and pressing the 'Lower' button will send it to the back, but if you uncomment the app.overrideredirect(True) line and press the button the app will still run but will no longer be visible.
Edit... Ok, I think I get it:
>>>help(tkinter)
...
| overrideredirect = wm_overrideredirect(self, boolean=None)
| Instruct the window manager to ignore this widget
| if BOOLEAN is given with 1. Return the current value if None
| is given.
...
So, first I am asking the window manager to ignore my window, but later I still want the wm to do something to my window... hypcracy :)
Any other ways to strip window decoration without asking the wm to ignore the window?
Edit. Another look at the problem with a different tool - wxPython
This time I'm trying it the easy way - using the Boa Constructor. While app.lower() on a windowed Frame worked fine with Tkinter, for some reason I have a problem with wxPython now. In the code below - pressing the button opens a gedit window over the Frame, than 2 seconds later frame is brought to the top and another 2 seconds later it should fall to the bottom of the window stack, but that does not happen, at least not on my Ubuntu.
def OnButton3Button(self, event):
subprocess.call("gedit") #opens gedit above the Frame
time.sleep(2) #waits for 2 seconds
self.Raise() #brings the Frame to the top
time.sleep(2) #waits for another 2 seconds
self.Lower() #should Lower the Frame to the bottom, but it doesn't
if I could make the Lower() work somehow it would be easily done by ie.:
def OnFrame1Activate(self, event):
self.ShowFullScreen(True)
def OnFrame1EnterWindow(self, event):
self.Lower()
Now I run out of ideas, probably I will just stick to the Guest Account as suggested.
This is how I set the window position in pygame on windows. With this, it will cover all other windows, if you change the -1 to a 1 it will be behind other windows, I only know it works in windows.
Making a window FULLSCREEN is done with: