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