LINUX.ORG.RU

Закрыть окно gtk, если оно потеряло фокус

 ,


0

3

Пишу программу на pygobject, и не понимаю, как мне реализовать это, вот исходники(AdwApplicationWindow):

import gi
import sys
gi.require_version("Gtk", "4.0")
gi.require_version('Adw', '1')
gi.require_version('Playerctl', '2.0')
from gi.repository import Playerctl, GLib, Gtk, Adw, Gdk

class MyApp(Adw.Application):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.connect('activate', self.on_activate)
        
    def on_activate(self, app):
        self.player = Playerctl.Player()
        self.player.connect('metadata', self.on_metadata)
        self.player.connect('playback-status::paused', self.on_pause)
        self.player.connect('playback-status::playing', self.on_play)
        # Create a Builder
        builder = Gtk.Builder()
        builder.add_from_file("nasos-gnotify.ui")
        

        # Obtain the button widget and connect it to a function
        # button = builder.get_object("button1")
        # button.connect("clicked", self.hello)
        self.tracklabel = builder.get_object("Tracklabel")
        self.setTitleText(self.player.get_title())
        self.playbtn = builder.get_object("playbtn")
        self.playbtn.connect("clicked", self.playcontol)
        self.backbtn = builder.get_object("backbtn")
        self.backbtn.connect("clicked", self.backbtnclick)
        self.nextbtn = builder.get_object("nextbtn")
        self.nextbtn.connect("clicked", self.nextbtnclick)
        # Obtain and show the main window
        self.win = builder.get_object("mainwindow")
        self.win.set_application(self)  # Application will close once it no longer has active windows attached to it
        self.win.present()
        
    def on_metadata(self, player, metadata):
        if 'xesam:artist' in metadata.keys() and 'xesam:title' in metadata.keys():
            self.setTitleText(metadata['xesam:title'])
            # self.tracklabel.set_markup(f"<b>{metadata['xesam:title']}</b>")
            # self.tracklabel.use_markup = True

            print('Now playing:')
            print('{artist} - {title}'.format(
            artist=metadata['xesam:artist'][0], title=metadata['xesam:title']))
    def on_pause(self, player, status):
        self.playbtn.set_icon_name("media-playback-start-symbolic")
    def on_play(self, player, status):
        self.playbtn.set_icon_name("media-playback-pause-symbolic")
    
    def nextbtnclick(self, player):
        self.player.next()
    
    def backbtnclick(self, player):
        self.player.previous()
        
    def playcontol(self, player):
        self.player.play_pause()
    
    def setTitleText(self, text):
        if len(text) > 30:
            self.tracklabel.set_markup(f"<b>{text[:30] + '...'}</b>")
        else:
            self.tracklabel.set_markup(f"<b>{text}</b>")
    def on_focus_out(self, win, event):
        self.win.close()
            
app = MyApp(application_id="com.example.GtkApplication")
app.run(sys.argv)

А никак. В том же Wayland, например, ты можешь не знать есть ли у тебя фокус или нет. GTK проектировался наверняка с этой же шизой в голове.

В иксах тебе надо дёргать иксы напрямую для этого, а в Wayland я вот сейчас полуркал протоколы и ничего про уведомление о фокусе там вообще нету.

Но мой совет: выкинь GovnoTK и возьми Qt. Он гораздо адекватнее в плане API.

hateyoufeel ★★★★★
()
Ответ на: комментарий от enot_obrmot

не приму ваш совет, и еще, а ничего что есть mutter, gdk которые вроде бы могут сообщать как-то

Mutter точно не может. Ещё раз, в Wayland специально нет возможности программе узнать, есть ли у её окон фокус.

Можешь сам посмотреть описание протоколов: https://wayland.app/protocols/

hateyoufeel ★★★★★
()
Ответ на: комментарий от enot_obrmot

А как тогда в гноме скрывается при потере фокуса окно с уведомлениями?

Наверное, потому что сам Mutter это окно и показывает.

И к тому же в mutter есть куча апи для работы с фокусами окон

Ну, если ты очень хочешь завязаться на один композитор, то ты, конечно, можешь. Но тогда твой софт не будет больше нигде кроме гнома работать.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

кстати лол, кажется я понял как можно сделать это, в гноме по факту окно на весь экран прозрачное создается похоже, и при нажатии на прозрачную область, окно закрывается

enot_obrmot
() автор топика
Ответ на: комментарий от enot_obrmot

И в качестве оконного менеджера будет mutter

Ну вот с этого и надо было начать.

В GTK такой фичи нет, тебе надо напрямую Mutter дёргать через DBus.

В теории, можешь потыкать через вот это: https://docs.gtk.org/gtk4/method.Window.get_focus.html

https://docs.gtk.org/gtk4/method.Widget.has_focus.html

Но, опять же, в Wayland оно нормально скорее всего работать не будет, если мы говорим про фокус на окнах.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Вообще я нагнал, в вялянде есть уведомление о получение курсора или клавиатурного ввода, что можно расценивать как фокус. Так что подёргай вон те вызовы по ссылкам, может и сработает.

hateyoufeel ★★★★★
()