Как определить клики в GNOME AppMenu?

Я пытаюсь отключить меню приложения GNOME (виджет слева, справа от кнопки «Действия» на верхней панели), чтобы щелчки по нему проходили через него на основную панель, чтобы можно было перетащите окно из развернутого состояния, даже нажав эту кнопку. Является ли это возможным?

В качестве альтернативы, лучшим подходом было бы передать левый щелчок по нему на основную панель. я думаю, что это тоже должно быть возможно, но я не знаком с API и с тем, как мне это сделать, хотя я бы предпочел этот вариант.

Я попытался для начала установить Main.panel.statusArea.appMenu.container.enabled = false и подобные вещи, но я не мог угадать фактическое имя. Ссылка на документацию по этому вопросу была бы отличной.

После этого я понял, что могу перечислить все элементы различных элементов, например:

for(var propertyName in this._appMenu.container) {
    log(propertyName);
}

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

Я хочу добавить код в расширение, поэтому код JavaScript предпочтительнее.

Большое тебе спасибо.


person Valentin Radu    schedule 30.04.2018    source источник


Ответы (1)


Соответствующие события — это button-press-event и button-release-event, которые я нашел в этой документации: https://people.gnome.org/~gcampagna/docs/Clutter-1.0/Clutter.Actor.html и https://developer.gnome.org/clutter/stable/clutter-Events.html

Однажды я подписался на них, используя:

this._wmHandlerIDs.push(Main.panel.statusArea.appMenu.actor.connect(
  'button-press-event', Lang.bind(this, this._click)
));

this._wmHandlerIDs.push(Main.panel.statusArea.appMenu.actor.connect(
  'button-release-event', Lang.bind(this, this._clicked)
));

Main._handledClick = 1; // ignore first click on the panel
Main._cancelClick = 0; // indicates if the button is still held

Затем я мог бы взломать свой путь и заставить кнопку приложения вести себя так, как если бы она была строкой заголовка:

_click: function (actor, event) {
    if (event.get_button() == 1) {
        Main._cancelClick = 0;
        if (event.get_click_count() == 1 && global.display.focus_window.get_maximized()) {
            Mainloop.timeout_add(100, function () {
                if (Main._handledClick == 1) {
                    Main._handledClick = 0;
                } else {
                    if (Main._cancelClick == 0) {
                        /* disable the following mice temporarly so
                        that this hack works; a better way would be 
                        nice; maybe that would also fix the mouse
                        button remaining stuck when dragging the
                        window */
                        Util.spawn(['xinput', '--disable', '12']);
                        Util.spawn(['xinput', '--disable', '15']);
                        Util.spawn(['xinput', '--disable', '16']);
                        Main.panel.statusArea.appMenu.hide();
                        Util.spawn(['xinput', '--enable', '12']);
                        Util.spawn(['xinput', '--enable', '15']);
                        Util.spawn(['xinput', '--enable', '16']);
                        Util.spawn(['xdotool', 'mousedown', '1']);
                        Mainloop.timeout_add(100, function () {
                            Main.panel.statusArea.appMenu.show();
                        });
                    }
                }
            });
        }
    } else if (event.get_button() == 2) {
        global.display.focus_window.delete(global.get_current_time());
        Mainloop.timeout_add(10, function () {
            Util.spawn(['xdotool', 'key', 'Escape']);
        });
    }
},

_clicked: function (actor, event) {
    if (event.get_button() == 1) {
        Main._cancelClick = 1;
        if (event.get_click_count() == 2) {
            if (global.display.focus_window.get_maximized()) {
                global.display.focus_window.unmaximize(MAXIMIZED);
            } else {
                global.display.focus_window.maximize(MAXIMIZED);
            }
        }
    }
},

Я считаю, что этот импорт необходим:

const Main           = imports.ui.main;
const Mainloop       = imports.mainloop;
const Meta           = imports.gi.Meta;
const MAXIMIZED      = Meta.MaximizeFlags.BOTH;

Может быть, это поможет кому-то сократить их тяжелую борьбу с поиском документации.

person Valentin Radu    schedule 30.04.2018
comment
К вашему сведению, цитируемая вами документация устарела, в наши дни вам следует предпочесть devdocs.baznga.org - person andy.holmes; 05.05.2018
comment
Трудно найти документацию вообще, не говоря уже о самой последней. Но да, спасибо, что поделились. - person Valentin Radu; 13.05.2018