Как я могу обнаружить клики в GNOME AppMenu? - PullRequest
0 голосов
/ 30 апреля 2018

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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 30 апреля 2018

Соответствующими событиями являются 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;

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

...