58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
import gi
|
|
gi.require_version("Gtk", "3.0")
|
|
from gi.repository import Gtk, Gdk, GdkPixbuf, cairo
|
|
|
|
|
|
class VPetWindow(Gtk.Window):
|
|
def __init__(self):
|
|
super().__init__()
|
|
|
|
# Fensterkonfiguration
|
|
self.set_title("vPet")
|
|
self.set_default_size(48, 48)
|
|
self.set_app_paintable(True)
|
|
self.set_decorated(False)
|
|
self.set_keep_above(True)
|
|
self.set_accept_focus(False)
|
|
|
|
# Entferne den Fensterschatten und wende RGBA-Visual an
|
|
screen = self.get_screen()
|
|
visual = screen.get_rgba_visual()
|
|
if visual:
|
|
self.set_visual(visual)
|
|
|
|
# Mausereignisse ignorieren
|
|
self.connect("screen-changed", self.on_screen_changed)
|
|
self.set_app_paintable(True)
|
|
self.on_screen_changed(None)
|
|
|
|
# Lade und zeige das Sprite (virtuelles Haustier)
|
|
self.image = Gtk.Image()
|
|
pixbuf = GdkPixbuf.Pixbuf.new_from_file("vpet_sprite.png") # Ersetze mit deinem Sprite
|
|
self.image.set_from_pixbuf(pixbuf)
|
|
self.add(self.image)
|
|
|
|
self.show_all()
|
|
|
|
def on_screen_changed(self, screen):
|
|
gdk_window = self.get_window()
|
|
if gdk_window:
|
|
# Eingabeform auf das Sprite beschränken
|
|
region = Gdk.cairo_region_create_from_surface(self.get_mask())
|
|
gdk_window.input_shape_combine_region(region)
|
|
|
|
def get_mask(self):
|
|
# Maske für die Eingabe basierend auf der Sprite-Form erstellen
|
|
pixbuf = self.image.get_pixbuf()
|
|
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, pixbuf.get_width(), pixbuf.get_height())
|
|
cr = cairo.Context(surface)
|
|
Gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0)
|
|
cr.paint()
|
|
return surface
|
|
|
|
|
|
if __name__ == "__main__":
|
|
win = VPetWindow()
|
|
win.connect("destroy", Gtk.main_quit)
|
|
Gtk.main()
|