Blame js/ui/shellEntry.js

Packit Service ed5168
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
Packit Service ed5168
Packit Service eca014
const { Clutter, Shell, St } = imports.gi;
Packit Service ed5168
Packit Service ed5168
const BoxPointer = imports.ui.boxpointer;
Packit Service ed5168
const Main = imports.ui.main;
Packit Service ed5168
const Params = imports.misc.params;
Packit Service ed5168
const PopupMenu = imports.ui.popupMenu;
Packit Service ed5168
Packit Service ed5168
var EntryMenu = class extends PopupMenu.PopupMenu {
Packit Service ed5168
    constructor(entry) {
Packit Service ed5168
        super(entry, 0, St.Side.TOP);
Packit Service ed5168
Packit Service ed5168
        this._entry = entry;
Packit Service ed5168
        this._clipboard = St.Clipboard.get_default();
Packit Service ed5168
Packit Service ed5168
        // Populate menu
Packit Service ed5168
        let item;
Packit Service ed5168
        item = new PopupMenu.PopupMenuItem(_("Copy"));
Packit Service ed5168
        item.connect('activate', this._onCopyActivated.bind(this));
Packit Service ed5168
        this.addMenuItem(item);
Packit Service ed5168
        this._copyItem = item;
Packit Service ed5168
Packit Service ed5168
        item = new PopupMenu.PopupMenuItem(_("Paste"));
Packit Service ed5168
        item.connect('activate', this._onPasteActivated.bind(this));
Packit Service ed5168
        this.addMenuItem(item);
Packit Service ed5168
        this._pasteItem = item;
Packit Service ed5168
Packit Service ed5168
        this._passwordItem = null;
Packit Service ed5168
Packit Service ed5168
        Main.uiGroup.add_actor(this.actor);
Packit Service ed5168
        this.actor.hide();
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _makePasswordItem() {
Packit Service ed5168
        let item = new PopupMenu.PopupMenuItem('');
Packit Service ed5168
        item.connect('activate', this._onPasswordActivated.bind(this));
Packit Service ed5168
        this.addMenuItem(item);
Packit Service ed5168
        this._passwordItem = item;
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    get isPassword() {
Packit Service ed5168
        return this._passwordItem != null;
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    set isPassword(v) {
Packit Service ed5168
        if (v == this.isPassword)
Packit Service ed5168
            return;
Packit Service ed5168
Packit Service ed5168
        if (v) {
Packit Service ed5168
            this._makePasswordItem();
Packit Service ed5168
            this._entry.input_purpose = Clutter.InputContentPurpose.PASSWORD;
Packit Service ed5168
        } else {
Packit Service ed5168
            this._passwordItem.destroy();
Packit Service ed5168
            this._passwordItem = null;
Packit Service ed5168
            this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL;
Packit Service ed5168
        }
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    open(animate) {
Packit Service ed5168
        this._updatePasteItem();
Packit Service ed5168
        this._updateCopyItem();
Packit Service ed5168
        if (this._passwordItem)
Packit Service ed5168
            this._updatePasswordItem();
Packit Service ed5168
Packit Service ed5168
        super.open(animate);
Packit Service ed5168
        this._entry.add_style_pseudo_class('focus');
Packit Service ed5168
Packit Service ed5168
        let direction = St.DirectionType.TAB_FORWARD;
Packit Service ed5168
        if (!this.actor.navigate_focus(null, direction, false))
Packit Service ed5168
            this.actor.grab_key_focus();
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _updateCopyItem() {
Packit Service ed5168
        let selection = this._entry.clutter_text.get_selection();
Packit Service ed5168
        this._copyItem.setSensitive(!this._entry.clutter_text.password_char &&
Packit Service ed5168
                                    selection && selection != '');
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _updatePasteItem() {
Packit Service ed5168
        this._clipboard.get_text(St.ClipboardType.CLIPBOARD,
Packit Service ed5168
            (clipboard, text) => {
Packit Service ed5168
                this._pasteItem.setSensitive(text && text != '');
Packit Service ed5168
            });
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _updatePasswordItem() {
Packit Service ed5168
        let textHidden = (this._entry.clutter_text.password_char);
Packit Service ed5168
        if (textHidden)
Packit Service ed5168
            this._passwordItem.label.set_text(_("Show Text"));
Packit Service ed5168
        else
Packit Service ed5168
            this._passwordItem.label.set_text(_("Hide Text"));
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _onCopyActivated() {
Packit Service ed5168
        let selection = this._entry.clutter_text.get_selection();
Packit Service ed5168
        this._clipboard.set_text(St.ClipboardType.CLIPBOARD, selection);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _onPasteActivated() {
Packit Service ed5168
        this._clipboard.get_text(St.ClipboardType.CLIPBOARD,
Packit Service ed5168
            (clipboard, text) => {
Packit Service ed5168
                if (!text)
Packit Service ed5168
                    return;
Packit Service ed5168
                this._entry.clutter_text.delete_selection();
Packit Service ed5168
                let pos = this._entry.clutter_text.get_cursor_position();
Packit Service ed5168
                this._entry.clutter_text.insert_text(text, pos);
Packit Service ed5168
            });
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _onPasswordActivated() {
Packit Service ed5168
        let visible = !!(this._entry.clutter_text.password_char);
Packit Service ed5168
        this._entry.clutter_text.set_password_char(visible ? '' : '\u25cf');
Packit Service ed5168
    }
Packit Service ed5168
};
Packit Service ed5168
Packit Service ed5168
function _setMenuAlignment(entry, stageX) {
Packit Service ed5168
    let [success, entryX, entryY] = entry.transform_stage_point(stageX, 0);
Packit Service ed5168
    if (success)
Packit Service ed5168
        entry.menu.setSourceAlignment(entryX / entry.width);
Packit Service ed5168
};
Packit Service ed5168
Packit Service ed5168
function _onButtonPressEvent(actor, event, entry) {
Packit Service ed5168
    if (entry.menu.isOpen) {
Packit Service ed5168
        entry.menu.close(BoxPointer.PopupAnimation.FULL);
Packit Service ed5168
        return Clutter.EVENT_STOP;
Packit Service ed5168
    } else if (event.get_button() == 3) {
Packit Service ed5168
        let [stageX, stageY] = event.get_coords();
Packit Service ed5168
        _setMenuAlignment(entry, stageX);
Packit Service ed5168
        entry.menu.open(BoxPointer.PopupAnimation.FULL);
Packit Service ed5168
        return Clutter.EVENT_STOP;
Packit Service ed5168
    }
Packit Service ed5168
    return Clutter.EVENT_PROPAGATE;
Packit Service ed5168
};
Packit Service ed5168
Packit Service ed5168
function _onPopup(actor, entry) {
Packit Service ed5168
    let [success, textX, textY, lineHeight] = entry.clutter_text.position_to_coords(-1);
Packit Service ed5168
    if (success)
Packit Service ed5168
        entry.menu.setSourceAlignment(textX / entry.width);
Packit Service ed5168
    entry.menu.open(BoxPointer.PopupAnimation.FULL);
Packit Service ed5168
};
Packit Service ed5168
Packit Service ed5168
function addContextMenu(entry, params) {
Packit Service ed5168
    if (entry.menu)
Packit Service ed5168
        return;
Packit Service ed5168
Packit Service ed5168
    params = Params.parse (params, { isPassword: false, actionMode: Shell.ActionMode.POPUP });
Packit Service ed5168
Packit Service ed5168
    entry.menu = new EntryMenu(entry);
Packit Service ed5168
    entry.menu.isPassword = params.isPassword;
Packit Service ed5168
    entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry },
Packit Service ed5168
                                                        { actionMode: params.actionMode });
Packit Service ed5168
    entry._menuManager.addMenu(entry.menu);
Packit Service ed5168
Packit Service ed5168
    // Add an event handler to both the entry and its clutter_text; the former
Packit Service ed5168
    // so padding is included in the clickable area, the latter because the
Packit Service ed5168
    // event processing of ClutterText prevents event-bubbling.
Packit Service ed5168
    entry.clutter_text.connect('button-press-event', (actor, event) => {
Packit Service ed5168
        _onButtonPressEvent(actor, event, entry);
Packit Service ed5168
    });
Packit Service ed5168
    entry.connect('button-press-event', (actor, event) => {
Packit Service ed5168
        _onButtonPressEvent(actor, event, entry);
Packit Service ed5168
    });
Packit Service ed5168
Packit Service ed5168
    entry.connect('popup-menu', actor => { _onPopup(actor, entry); });
Packit Service ed5168
Packit Service ed5168
    entry.connect('destroy', () => {
Packit Service ed5168
        entry.menu.destroy();
Packit Service ed5168
        entry.menu = null;
Packit Service ed5168
        entry._menuManager = null;
Packit Service ed5168
    });
Packit Service ed5168
}