Показать AboutDialog из расширения оболочки GNOME - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь отобразить Gtk.AboutDialog из моего расширения оболочки GNOME.Я написал следующую функцию:

_showAbout: function() {
    var authors = ["Ralf"];
    // Create the About dialog
    let aboutDialog = new Gtk.AboutDialog({ title: "About AboutDialogTest",
        program_name: "MyExtension Version " + MySelf.metadata.version,
        copyright: "AboutDialogTest \xa9 2018",
        authors: authors,
        website: "https://...",
        website_label: "MyExtension Homepage",
        comments: "GNOME Shell extension to test AboutDialog"
    });
    // Connect the Close button to the destroy signal for the dialog
    aboutDialog.connect("response", function() {
        aboutDialog.destroy();
    });
    aboutDialog.show();
}

Ну, диалог о отображается, но не правильно.Я могу вывести диалоговое окно на передний план, щелкнув, но нажатие на [x] не закрывает диалоговое окно.Диалог можно закрыть, нажав ESC.

В системном журнале я вижу следующие сообщения:

org.gnome.Shell.desktop[4033]: Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
org.gnome.Shell.desktop[4033]: Window manager warning: Buggy client sent a _NET_ACTIVE_WINDOW message with a timestamp of 0 for 0xe0022c (About Abou)

Я в расширении, поэтому у меня нет «временного родителя».По крайней мере, я не знаю, как его получить.

Есть идеи, что мне нужно сделать, чтобы отобразить его правильно?

1 Ответ

0 голосов
/ 28 сентября 2018

Хорошо, я отвечу на свой вопрос.Насколько я понимаю, невозможно использовать диалог GTK в расширении GNOME Shell.Если необходимо «О диалоге», сверните свое собственное использование modaldialog.js.Это не так круто, как в GTK, но, по крайней мере, кое-что.

const St = imports.gi.St;
const Lang = imports.lang;
const Gio = imports.gi.Gio;
const ModalDialog = imports.ui.modalDialog;
const Clutter = imports.gi.Clutter;

const ExtensionUtils = imports.misc.extensionUtils;
const MySelf = ExtensionUtils.getCurrentExtension();

const MyAboutDialog = new Lang.Class({
    Name: 'MyAboutDialog',
    Extends: ModalDialog.ModalDialog,

    _init: function() {
        this.parent({ styleClass: 'extension-dialog' });

        this.setButtons([{ label: "OK",
                           action: Lang.bind(this, this._onClose),
                           key:    Clutter.Escape
                         }]);

        let box = new St.BoxLayout({ vertical: true});
        this.contentLayout.add(box);

        let gicon = new Gio.FileIcon({ file: Gio.file_new_for_path(MySelf.path + "/icons/icon.png") });
        let icon = new St.Icon({ gicon: gicon });
        box.add(icon);

        box.add(new St.Label({ text: "AboutDialogTest Version " + MySelf.metadata.version, x_align: Clutter.ActorAlign.CENTER, style_class: "title-label" }));
        box.add(new St.Label({ text: "GNOME Shell extension to display an About Dialog.", x_align: Clutter.ActorAlign.CENTER }));
        box.add(new St.Label({ text: "This program comes with absolutely no warranty.", x_align: Clutter.ActorAlign.CENTER, style_class: "warn-label" }));
        box.add(new St.Label({ text: "Copyright © 2017-2018 BlahBlahBlah", x_align: Clutter.ActorAlign.CENTER, style_class: "copyright-label" }));
    },

    _onClose: function(button, event) {
        this.close(global.get_current_time());
    },

});

И назвать это так:

_showAbout2: function() {
    let dialog = new MyAboutDialog();
    dialog.open(global.get_current_time());
},
...